oficina / slides Public

Merge branch 'codex/oficina-icons' into main

paul@keymail.dev 2ebd8f6d9b43e56b5e078a900452d75d512f8de7 parent 0e7ed90parent 739db30
7 files changed, +71 −2
  • internal/slides/static/brand/LICENSE.lucide +43 −0
  • internal/slides/static/brand/apple-touch-icon.png binary
  • internal/slides/static/brand/brand.css +19 −0
  • internal/slides/static/brand/icon-32.png binary
  • internal/slides/static/brand/icon.svg +3 −0
  • internal/slides/templates/layout.html +5 −1
  • internal/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