Add approved Oficina app icons
Wire the shared white Lucide artwork into product branding. Source review: GPT-6 Astra (independent agent).
Co-Authored-By: Codex <noreply@openai.com>
7 files changed,
+71
−2
internal/slides/static/brand/LICENSE.lucide+43 −0internal/slides/static/brand/apple-touch-icon.pngbinaryinternal/slides/static/brand/brand.css+19 −0internal/slides/static/brand/icon-32.pngbinaryinternal/slides/static/brand/icon.svg+3 −0internal/slides/templates/layout.html+5 −1internal/slides/templates/signin.html+1 −1
CI passed — run details
diff --git a/internal/slides/static/brand/LICENSE.lucide b/internal/slides/static/brand/LICENSE.lucide| new file mode 100644 |
| index 0000000..718bb3f |
| --- /dev/null |
| +++ b/internal/slides/static/brand/LICENSE.lucide |
| @@ -0,0 +1,43 @@ |
| +ISC License |
| + |
| +Copyright (c) 2026 Lucide Icons and Contributors |
| + |
| +Permission to use, copy, modify, and/or distribute this software for any |
| +purpose with or without fee is hereby granted, provided that the above |
| +copyright notice and this permission notice appear in all copies. |
| + |
| +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| + |
| +--- |
| + |
| +The following Lucide icons are derived from the Feather project: |
| + |
| +airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out |
| + |
| +The MIT License (MIT) (for the icons listed above) |
| + |
| +Copyright (c) 2013-present Cole Bemis |
| + |
| +Permission is hereby granted, free of charge, to any person obtaining a copy |
| +of this software and associated documentation files (the "Software"), to deal |
| +in the Software without restriction, including without limitation the rights |
| +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| +copies of the Software, and to permit persons to whom the Software is |
| +furnished to do so, subject to the following conditions: |
| + |
| +The above copyright notice and this permission notice shall be included in all |
| +copies or substantial portions of the Software. |
| + |
| +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| +SOFTWARE. |
diff --git a/internal/slides/static/brand/apple-touch-icon.png b/internal/slides/static/brand/apple-touch-icon.png| new file mode 100644 |
| index 0000000..eed92dd |
| Binary files /dev/null and b/internal/slides/static/brand/apple-touch-icon.png differ |
diff --git a/internal/slides/static/brand/brand.css b/internal/slides/static/brand/brand.css| new file mode 100644 |
| index 0000000..2e194c6 |
| --- /dev/null |
| +++ b/internal/slides/static/brand/brand.css |
| @@ -0,0 +1,19 @@ |
| +/* Oficina brand artwork. Source: oficina/estilo brand/. */ |
| +[estilo-brand] { |
| + display: inline-flex; |
| + align-items: center; |
| + gap: .5rem; |
| + min-block-size: 24px; |
| +} |
| +[estilo-brand-icon] { |
| + display: inline-block; |
| + flex-shrink: 0; |
| + inline-size: 1.75rem; |
| + block-size: 1.75rem; |
| + border-radius: 21%; |
| + vertical-align: middle; |
| +} |
| +[estilo-brand-icon="listing"] { |
| + inline-size: 2.5rem; |
| + block-size: 2.5rem; |
| +} |
diff --git a/internal/slides/static/brand/icon-32.png b/internal/slides/static/brand/icon-32.png| new file mode 100644 |
| index 0000000..58f126e |
| Binary files /dev/null and b/internal/slides/static/brand/icon-32.png differ |
diff --git a/internal/slides/static/brand/icon.svg b/internal/slides/static/brand/icon.svg| new file mode 100644 |
| index 0000000..ea6ead1 |
| --- /dev/null |
| +++ b/internal/slides/static/brand/icon.svg |
| @@ -0,0 +1,3 @@ |
| +<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024" role="img" aria-label="Slides"><title>Slides</title><rect x="0" y="0" width="1024" height="1024" rx="0" fill="#C45B16"/><g transform="translate(153.6 153.6) scale(29.866666666666664)" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h20" /> |
| + <path d="M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3" /> |
| + <path d="m7 21 5-5 5 5" /></g></svg> |
diff --git a/internal/slides/templates/layout.html b/internal/slides/templates/layout.html| index 3d95522..5da7e09 100644 |
| --- a/internal/slides/templates/layout.html |
| +++ b/internal/slides/templates/layout.html |
| @@ -1,6 +1,10 @@ |
| {{define "layout"}}<!doctype html> |
| <html lang="{{block "lang" .}}en{{end}}" dir="{{block "dir" .}}ltr{{end}}"> |
| <head> |
| +<link rel="icon" type="image/png" sizes="32x32" href="{{asset "static/brand/icon-32.png"}}"> |
| +<link rel="icon" type="image/svg+xml" href="{{asset "static/brand/icon.svg"}}"> |
| +<link rel="apple-touch-icon" sizes="180x180" href="{{asset "static/brand/apple-touch-icon.png"}}"> |
| +<link rel="stylesheet" href="{{asset "static/brand/brand.css"}}"> |
| <meta charset="utf-8"> |
| <meta name="viewport" content="width=device-width"> |
| {{/* Slides, not a catalog key: the app's name is a proper noun and |
| @@ -36,7 +40,7 @@ |
| {{/* The app's own name rather than the framework default "Home": a |
| bar that says "Home" tells a person nothing about which of their |
| tabs they are looking at. A proper noun, so not a catalog key. */}} |
| -{{block "brand" .}}<a rst-shell-brand href="/">Slides</a>{{end}} |
| +{{block "brand" .}}<a rst-shell-brand estilo-brand href="/"><img estilo-brand-icon src="{{asset "static/brand/icon.svg"}}" alt="" width="28" height="28">Slides</a>{{end}} |
| {{/* The narrow layout. Below 800px the bar's tail — nav, account, |
| locale — hides behind this disclosure; above it, tokens.css hides |
| the summary and gives [rst-shell-tail] display: contents, so the |
diff --git a/internal/slides/templates/signin.html b/internal/slides/templates/signin.html| index d84859c..4052f5e 100644 |
| --- a/internal/slides/templates/signin.html |
| +++ b/internal/slides/templates/signin.html |
| @@ -25,7 +25,7 @@ |
| (tokens.css hides [rst-shell-account] when its menu is empty, and |
| this page defines no "account" block), which leaves only the |
| narrow-viewport hamburger, hidden below. */}} |
| -{{define "brand"}}<span rst-shell-brand>Slides</span>{{end}} |
| +{{define "brand"}}<span rst-shell-brand estilo-brand><img estilo-brand-icon src="{{asset "static/brand/icon.svg"}}" alt="" width="28" height="28">Slides</span>{{end}} |
| {{define "head"}}<style> |
| /* The hamburger opens the bar's tail — nav, account, locale — and on |
| this page every one of those is empty. A control that visibly does |