oficina / estilo Public

Merge branch 'theme-calma' into main

Calma: the suite's theme, marks and sky (decisions-table row 8)

Estilo's theme is no longer day. Paul chose Calma after six rounds of
design directions (2026-09-28/29): "Grain and filaments. No cores, no
rim lights. Then go."

- theme: Calma tokens; one colour ring for every app (apps.go) with
  theme.ForApp(slug); Onest via theme.FontHandler (/fonts/v1/). The day
  byte gate is replaced by day's token names, rastrillo's contrast pairs
  for the suite and every app in both schemes, and accent goldens.
- brand: Calma marks for web, iPhone and Mac from icons.json (hues must
  equal the ring). Calls is calls.svg (meet kept as an alias); Fichas,
  Mail and Files have icons. distribute.py knows Calls and native paths.
- sky: seeded nebula (haze, grained clouds, filaments) for sign-in, team
  home and front page, never inside an app; goldens guard its version.
- credits: Onest's OFL with provenance, behind -onest.
- CI: verify the module cache first and re-fetch damaged modules; the
  compile check builds without VCS stamping.

Reviewed by Claude Fable 5.1: request changes (10 findings, none
blocking), all addressed; follow-up review approved (discussion 12).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 5b2ce835e773a092b0f1687b613891b6ddb1b1d2 parent 894afdcparent f03a13f
189 files changed, +1792 −885
  • .amadan/ci.d/05-modcache +8 −0
  • AGENTS.md +70 −51
  • Makefile +32 −7
  • README.md +8 −4
  • brand/README.md +41 −62
  • brand/brand.css +2 −2
  • brand/brand.go +8 −5
  • brand/brand_test.go +45 −4
  • brand/distribute.py +21 −7
  • brand/generate-native.mjs +0 −89
  • brand/generate.mjs +185 −37
  • brand/icons.json +61 −8
  • brand/mac/calendar.svg +1 −0
  • brand/mac/calls.svg +1 −0
  • brand/mac/docs.svg +1 −0
  • brand/mac/fichas.svg +1 −0
  • brand/mac/files.svg +1 −0
  • brand/mac/mail.svg +1 −0
  • brand/mac/memoria.svg +1 −0
  • brand/mac/oficina.svg +1 −0
  • brand/mac/sheets.svg +1 −0
  • brand/mac/slides.svg +1 −0
  • brand/native/calendar/AppIcon.icns binary
  • brand/native/calendar/ios-1024.png binary
  • brand/native/calendar/macos-1024.png binary
  • brand/native/calls/AppIcon.icns binary
  • brand/native/calls/ios-1024.png binary
  • brand/native/calls/macos-1024.png binary
  • brand/native/docs/AppIcon.icns binary
  • brand/native/docs/ios-1024.png binary
  • brand/native/docs/macos-1024.png binary
  • brand/native/meet/ios-1024.png binary
  • brand/native/meet/ios.svg +0 −24
  • brand/native/meet/macos-1024.png binary
  • brand/native/meet/macos-128.png binary
  • brand/native/meet/macos-16.png binary
  • brand/native/meet/macos-256.png binary
  • brand/native/meet/macos-32.png binary
  • brand/native/meet/macos-512.png binary
  • brand/native/meet/macos-64.png binary
  • brand/native/meet/macos.svg +0 −24
  • brand/native/memoria/AppIcon.icns binary
  • brand/native/memoria/ios-1024.png binary
  • brand/native/memoria/macos-1024.png binary
  • brand/native/sheets/AppIcon.icns binary
  • brand/native/sheets/ios-1024.png binary
  • brand/native/sheets/macos-1024.png binary
  • brand/png/calendar-1024.png binary
  • brand/png/calendar-16.png binary
  • brand/png/calendar-180.png binary
  • brand/png/calendar-192.png binary
  • brand/png/calendar-32.png binary
  • brand/png/calendar-48.png binary
  • brand/png/calendar-512.png binary
  • brand/png/calls-1024.png binary
  • brand/png/calls-16.png binary
  • brand/png/calls-180.png binary
  • brand/png/calls-192.png binary
  • brand/png/calls-32.png binary
  • brand/png/calls-48.png binary
  • brand/png/calls-512.png binary
  • brand/png/docs-1024.png binary
  • brand/png/docs-16.png binary
  • brand/png/docs-180.png binary
  • brand/png/docs-192.png binary
  • brand/png/docs-32.png binary
  • brand/png/docs-48.png binary
  • brand/png/docs-512.png binary
  • brand/png/fichas-1024.png binary
  • brand/png/fichas-16.png binary
  • brand/png/fichas-180.png binary
  • brand/png/fichas-192.png binary
  • brand/png/fichas-32.png binary
  • brand/png/fichas-48.png binary
  • brand/png/fichas-512.png binary
  • brand/png/files-1024.png binary
  • brand/png/files-16.png binary
  • brand/png/files-180.png binary
  • brand/png/files-192.png binary
  • brand/png/files-32.png binary
  • brand/png/files-48.png binary
  • brand/png/files-512.png binary
  • brand/png/mail-1024.png binary
  • brand/png/mail-16.png binary
  • brand/png/mail-180.png binary
  • brand/png/mail-192.png binary
  • brand/png/mail-32.png binary
  • brand/png/mail-48.png binary
  • brand/png/mail-512.png binary
  • brand/png/meet-1024.png binary
  • brand/png/meet-16.png binary
  • brand/png/meet-180.png binary
  • brand/png/meet-192.png binary
  • brand/png/meet-32.png binary
  • brand/png/meet-48.png binary
  • brand/png/meet-512.png binary
  • brand/png/memoria-1024.png binary
  • brand/png/memoria-16.png binary
  • brand/png/memoria-180.png binary
  • brand/png/memoria-192.png binary
  • brand/png/memoria-32.png binary
  • brand/png/memoria-48.png binary
  • brand/png/memoria-512.png binary
  • brand/png/oficina-1024.png binary
  • brand/png/oficina-16.png binary
  • brand/png/oficina-180.png binary
  • brand/png/oficina-192.png binary
  • brand/png/oficina-32.png binary
  • brand/png/oficina-48.png binary
  • brand/png/oficina-512.png binary
  • brand/png/sheets-1024.png binary
  • brand/png/sheets-16.png binary
  • brand/png/sheets-180.png binary
  • brand/png/sheets-192.png binary
  • brand/png/sheets-32.png binary
  • brand/png/sheets-48.png binary
  • brand/png/sheets-512.png binary
  • brand/png/slides-1024.png binary
  • brand/png/slides-16.png binary
  • brand/png/slides-180.png binary
  • brand/png/slides-192.png binary
  • brand/png/slides-32.png binary
  • brand/png/slides-48.png binary
  • brand/png/slides-512.png binary
  • brand/preview.png binary
  • brand/preview.svg +1 −97
  • brand/square/calendar.svg +1 −0
  • brand/square/calls.svg +1 −0
  • brand/square/docs.svg +1 −0
  • brand/square/fichas.svg +1 −0
  • brand/square/files.svg +1 −0
  • brand/square/mail.svg +1 −0
  • brand/square/memoria.svg +1 −0
  • brand/square/oficina.svg +1 −0
  • brand/square/sheets.svg +1 −0
  • brand/square/slides.svg +1 −0
  • brand/svg/calendar.svg +1 −10
  • brand/svg/calls.svg +1 −0
  • brand/svg/docs.svg +1 −5
  • brand/svg/fichas.svg +1 −0
  • brand/svg/files.svg +1 −0
  • brand/svg/mail.svg +1 −0
  • brand/svg/meet.svg +0 −2
  • brand/svg/memoria.svg +1 −4
  • brand/svg/oficina.svg +1 −3
  • brand/svg/sheets.svg +1 −4
  • brand/svg/slides.svg +1 −3
  • brand/upstream/book-search.svg +0 −16
  • brand/upstream/calendar-days.svg +0 −22
  • brand/upstream/file-text.svg +0 −17
  • brand/upstream/panels-top-left.svg +0 −15
  • brand/upstream/presentation.svg +0 −15
  • brand/upstream/table.svg +0 −16
  • brand/upstream/video.svg +0 −14
  • chrome/chrome.css +1 −1
  • chrome/chrome.go +1 −1
  • cmd/oficina-notices/main.go +4 −0
  • credits/fonts.go +15 −0
  • credits/fonts_test.go +28 −0
  • credits/notices/onest-OFL.txt +93 −0
  • credits/notices/onest-provenance.json +11 −0
  • homeconnect/README.md +1 −1
  • sky/generate.go +178 −0
  • sky/sky.css +63 −0
  • sky/sky.go +117 −0
  • sky/sky_test.go +144 −0
  • sky/templates/sky.html +9 −0
  • sky/testdata/v1-clouds-dark.svg +1 −0
  • sky/testdata/v1-clouds-light.svg +1 −0
  • sky/testdata/v1-filaments.svg +1 −0
  • sky/testdata/v1-haze-dark.svg +1 −0
  • sky/testdata/v1-haze-light.svg +1 −0
  • theme/apps.go +136 −0
  • theme/estilo.css +61 −174
  • theme/fonts.go +74 −0
  • theme/fonts/onest-latin.woff2 binary
  • theme/fonts_test.go +44 −0
  • theme/testdata/calendar.css +7 −0
  • theme/testdata/calls.css +7 −0
  • theme/testdata/docs.css +7 −0
  • theme/testdata/fichas.css +7 −0
  • theme/testdata/files.css +7 −0
  • theme/testdata/mail.css +7 −0
  • theme/testdata/memoria.css +7 −0
  • theme/testdata/oficina.css +7 −0
  • theme/testdata/sheets.css +7 −0
  • theme/testdata/slides.css +7 −0
  • theme/theme.go +8 −15
  • theme/theme_test.go +217 −126

CI passed — run details

CI log
=== modcache ===
all modules verified
=== vet ===
CGO_ENABLED=0 go vet ./...
=== fmt ===
=== build ===
CGO_ENABLED=0 go build -buildvcs=false ./...
=== go-test ===
CGO_ENABLED=0 go test -count=1 ./...
ok  	amadan.net/oficina/estilo.git/base	0.004s
ok  	amadan.net/oficina/estilo.git/brand	0.002s
ok  	amadan.net/oficina/estilo.git/callui	0.003s
ok  	amadan.net/oficina/estilo.git/chrome	0.156s
?   	amadan.net/oficina/estilo.git/cmd/oficina-notices	[no test files]
ok  	amadan.net/oficina/estilo.git/credits	0.006s
ok  	amadan.net/oficina/estilo.git/credits/catalog	0.006s
ok  	amadan.net/oficina/estilo.git/homeconnect	0.006s
ok  	amadan.net/oficina/estilo.git/internal/lint	0.005s
?   	amadan.net/oficina/estilo.git/internal/tokencheck	[no test files]
ok  	amadan.net/oficina/estilo.git/menu	0.008s
ok  	amadan.net/oficina/estilo.git/savestatus	0.076s
ok  	amadan.net/oficina/estilo.git/sky	0.008s
ok  	amadan.net/oficina/estilo.git/theme	0.007s
.amadan/ci.d/05-modcache

Loading diff…

AGENTS.md

Loading diff…

Makefile

Loading diff…

README.md

Loading diff…

brand/README.md

Loading diff…

brand/brand.css

Loading diff…

brand/brand.go

Loading diff…

brand/brand_test.go

Loading diff…

brand/distribute.py

Loading diff…

brand/generate-native.mjs

Loading diff…

brand/generate.mjs

Loading diff…

brand/icons.json

Loading diff…

brand/mac/calendar.svg

Loading diff…

brand/mac/calls.svg

Loading diff…

brand/mac/docs.svg

Loading diff…

brand/mac/fichas.svg

Loading diff…

brand/mac/files.svg

Loading diff…

brand/mac/mail.svg

Loading diff…

brand/mac/memoria.svg

Loading diff…

brand/mac/oficina.svg

Loading diff…

brand/mac/sheets.svg

Loading diff…

brand/mac/slides.svg

Loading diff…

brand/native/calendar/AppIcon.icns

Loading diff…

brand/native/calendar/ios-1024.png

Loading diff…

brand/native/calendar/macos-1024.png

Loading diff…

brand/native/calls/AppIcon.icns

Loading diff…

brand/native/calls/ios-1024.png

Loading diff…

brand/native/calls/macos-1024.png

Loading diff…

brand/native/docs/AppIcon.icns

Loading diff…

brand/native/docs/ios-1024.png

Loading diff…

brand/native/docs/macos-1024.png

Loading diff…

brand/native/meet/ios-1024.png

Loading diff…

brand/native/meet/ios.svg

Loading diff…

brand/native/meet/macos-1024.png

Loading diff…

brand/native/meet/macos-128.png

Loading diff…

brand/native/meet/macos-16.png

Loading diff…

brand/native/meet/macos-256.png

Loading diff…

brand/native/meet/macos-32.png

Loading diff…

brand/native/meet/macos-512.png

Loading diff…

brand/native/meet/macos-64.png

Loading diff…

brand/native/meet/macos.svg

Loading diff…

brand/native/memoria/AppIcon.icns

Loading diff…

brand/native/memoria/ios-1024.png

Loading diff…

brand/native/memoria/macos-1024.png

Loading diff…

brand/native/sheets/AppIcon.icns

Loading diff…

brand/native/sheets/ios-1024.png

Loading diff…

brand/native/sheets/macos-1024.png

Loading diff…

brand/png/calendar-1024.png

Loading diff…

brand/png/calendar-16.png

Loading diff…

brand/png/calendar-180.png

Loading diff…

brand/png/calendar-192.png

Loading diff…

brand/png/calendar-32.png

Loading diff…

brand/png/calendar-48.png

Loading diff…

brand/png/calendar-512.png

Loading diff…

brand/png/calls-1024.png

Loading diff…

brand/png/calls-16.png

Loading diff…

brand/png/calls-180.png

Loading diff…

brand/png/calls-192.png

Loading diff…

brand/png/calls-32.png

Loading diff…

brand/png/calls-48.png

Loading diff…

brand/png/calls-512.png

Loading diff…

brand/png/docs-1024.png

Loading diff…

brand/png/docs-16.png

Loading diff…

brand/png/docs-180.png

Loading diff…

brand/png/docs-192.png

Loading diff…

brand/png/docs-32.png

Loading diff…

brand/png/docs-48.png

Loading diff…

brand/png/docs-512.png

Loading diff…

brand/png/fichas-1024.png

Loading diff…

brand/png/fichas-16.png

Loading diff…

brand/png/fichas-180.png

Loading diff…

brand/png/fichas-192.png

Loading diff…

brand/png/fichas-32.png

Loading diff…

brand/png/fichas-48.png

Loading diff…

brand/png/fichas-512.png

Loading diff…

brand/png/files-1024.png

Loading diff…

brand/png/files-16.png

Loading diff…

brand/png/files-180.png

Loading diff…

brand/png/files-192.png

Loading diff…

brand/png/files-32.png

Loading diff…

brand/png/files-48.png

Loading diff…

brand/png/files-512.png

Loading diff…

brand/png/mail-1024.png

Loading diff…

brand/png/mail-16.png

Loading diff…

brand/png/mail-180.png

Loading diff…

brand/png/mail-192.png

Loading diff…

brand/png/mail-32.png

Loading diff…

brand/png/mail-48.png

Loading diff…

brand/png/mail-512.png

Loading diff…

brand/png/meet-1024.png

Loading diff…

brand/png/meet-16.png

Loading diff…

brand/png/meet-180.png

Loading diff…

brand/png/meet-192.png

Loading diff…

brand/png/meet-32.png

Loading diff…

brand/png/meet-48.png

Loading diff…

brand/png/meet-512.png

Loading diff…

brand/png/memoria-1024.png

Loading diff…

brand/png/memoria-16.png

Loading diff…

brand/png/memoria-180.png

Loading diff…

brand/png/memoria-192.png

Loading diff…

brand/png/memoria-32.png

Loading diff…

brand/png/memoria-48.png

Loading diff…

brand/png/memoria-512.png

Loading diff…

brand/png/oficina-1024.png

Loading diff…

brand/png/oficina-16.png

Loading diff…

brand/png/oficina-180.png

Loading diff…

brand/png/oficina-192.png

Loading diff…

brand/png/oficina-32.png

Loading diff…

brand/png/oficina-48.png

Loading diff…

brand/png/oficina-512.png

Loading diff…

brand/png/sheets-1024.png

Loading diff…

brand/png/sheets-16.png

Loading diff…

brand/png/sheets-180.png

Loading diff…

brand/png/sheets-192.png

Loading diff…

brand/png/sheets-32.png

Loading diff…

brand/png/sheets-48.png

Loading diff…

brand/png/sheets-512.png

Loading diff…

brand/png/slides-1024.png

Loading diff…

brand/png/slides-16.png

Loading diff…

brand/png/slides-180.png

Loading diff…

brand/png/slides-192.png

Loading diff…

brand/png/slides-32.png

Loading diff…

brand/png/slides-48.png

Loading diff…

brand/png/slides-512.png

Loading diff…

brand/preview.png

Loading diff…

brand/preview.svg

Loading diff…

brand/square/calendar.svg

Loading diff…

brand/square/calls.svg

Loading diff…

brand/square/docs.svg

Loading diff…

brand/square/fichas.svg

Loading diff…

brand/square/files.svg

Loading diff…

brand/square/mail.svg

Loading diff…

brand/square/memoria.svg

Loading diff…

brand/square/oficina.svg

Loading diff…

brand/square/sheets.svg

Loading diff…

brand/square/slides.svg

Loading diff…

brand/svg/calendar.svg

Loading diff…

brand/svg/calls.svg

Loading diff…

brand/svg/docs.svg

Loading diff…

brand/svg/fichas.svg

Loading diff…

brand/svg/files.svg

Loading diff…

brand/svg/mail.svg

Loading diff…

brand/svg/meet.svg

Loading diff…

brand/svg/memoria.svg

Loading diff…

brand/svg/oficina.svg

Loading diff…

brand/svg/sheets.svg

Loading diff…

brand/svg/slides.svg

Loading diff…

brand/upstream/book-search.svg

Loading diff…

brand/upstream/calendar-days.svg

Loading diff…

brand/upstream/file-text.svg

Loading diff…

brand/upstream/panels-top-left.svg

Loading diff…

brand/upstream/presentation.svg

Loading diff…

brand/upstream/table.svg

Loading diff…

brand/upstream/video.svg

Loading diff…

chrome/chrome.css

Loading diff…

chrome/chrome.go

Loading diff…

cmd/oficina-notices/main.go

Loading diff…

credits/fonts.go

Loading diff…

credits/fonts_test.go

Loading diff…

credits/notices/onest-OFL.txt

Loading diff…

credits/notices/onest-provenance.json

Loading diff…

homeconnect/README.md

Loading diff…

sky/generate.go

Loading diff…

sky/sky.css

Loading diff…

sky/sky.go

Loading diff…

sky/sky_test.go

Loading diff…

sky/templates/sky.html

Loading diff…

sky/testdata/v1-clouds-dark.svg

Loading diff…

sky/testdata/v1-clouds-light.svg

Loading diff…

sky/testdata/v1-filaments.svg

Loading diff…

sky/testdata/v1-haze-dark.svg

Loading diff…

sky/testdata/v1-haze-light.svg

Loading diff…

theme/apps.go

Loading diff…

theme/estilo.css

Loading diff…

theme/fonts.go

Loading diff…

theme/fonts/onest-latin.woff2

Loading diff…

theme/fonts_test.go

Loading diff…

theme/testdata/calendar.css

Loading diff…

theme/testdata/calls.css

Loading diff…

theme/testdata/docs.css

Loading diff…

theme/testdata/fichas.css

Loading diff…

theme/testdata/files.css

Loading diff…

theme/testdata/mail.css

Loading diff…

theme/testdata/memoria.css

Loading diff…

theme/testdata/oficina.css

Loading diff…

theme/testdata/sheets.css

Loading diff…

theme/testdata/slides.css

Loading diff…

theme/theme.go

Loading diff…

theme/theme_test.go

Loading diff…