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>
.amadan/ci.d/05-modcache+8 −0AGENTS.md+70 −51Makefile+32 −7README.md+8 −4brand/README.md+41 −62brand/brand.css+2 −2brand/brand.go+8 −5brand/brand_test.go+45 −4brand/distribute.py+21 −7brand/generate-native.mjs+0 −89brand/generate.mjs+185 −37brand/icons.json+61 −8brand/mac/calendar.svg+1 −0brand/mac/calls.svg+1 −0brand/mac/docs.svg+1 −0brand/mac/fichas.svg+1 −0brand/mac/files.svg+1 −0brand/mac/mail.svg+1 −0brand/mac/memoria.svg+1 −0brand/mac/oficina.svg+1 −0brand/mac/sheets.svg+1 −0brand/mac/slides.svg+1 −0brand/native/calendar/AppIcon.icnsbinarybrand/native/calendar/ios-1024.pngbinarybrand/native/calendar/macos-1024.pngbinarybrand/native/calls/AppIcon.icnsbinarybrand/native/calls/ios-1024.pngbinarybrand/native/calls/macos-1024.pngbinarybrand/native/docs/AppIcon.icnsbinarybrand/native/docs/ios-1024.pngbinarybrand/native/docs/macos-1024.pngbinarybrand/native/meet/ios-1024.pngbinarybrand/native/meet/ios.svg+0 −24brand/native/meet/macos-1024.pngbinarybrand/native/meet/macos-128.pngbinarybrand/native/meet/macos-16.pngbinarybrand/native/meet/macos-256.pngbinarybrand/native/meet/macos-32.pngbinarybrand/native/meet/macos-512.pngbinarybrand/native/meet/macos-64.pngbinarybrand/native/meet/macos.svg+0 −24brand/native/memoria/AppIcon.icnsbinarybrand/native/memoria/ios-1024.pngbinarybrand/native/memoria/macos-1024.pngbinarybrand/native/sheets/AppIcon.icnsbinarybrand/native/sheets/ios-1024.pngbinarybrand/native/sheets/macos-1024.pngbinarybrand/png/calendar-1024.pngbinarybrand/png/calendar-16.pngbinarybrand/png/calendar-180.pngbinarybrand/png/calendar-192.pngbinarybrand/png/calendar-32.pngbinarybrand/png/calendar-48.pngbinarybrand/png/calendar-512.pngbinarybrand/png/calls-1024.pngbinarybrand/png/calls-16.pngbinarybrand/png/calls-180.pngbinarybrand/png/calls-192.pngbinarybrand/png/calls-32.pngbinarybrand/png/calls-48.pngbinarybrand/png/calls-512.pngbinarybrand/png/docs-1024.pngbinarybrand/png/docs-16.pngbinarybrand/png/docs-180.pngbinarybrand/png/docs-192.pngbinarybrand/png/docs-32.pngbinarybrand/png/docs-48.pngbinarybrand/png/docs-512.pngbinarybrand/png/fichas-1024.pngbinarybrand/png/fichas-16.pngbinarybrand/png/fichas-180.pngbinarybrand/png/fichas-192.pngbinarybrand/png/fichas-32.pngbinarybrand/png/fichas-48.pngbinarybrand/png/fichas-512.pngbinarybrand/png/files-1024.pngbinarybrand/png/files-16.pngbinarybrand/png/files-180.pngbinarybrand/png/files-192.pngbinarybrand/png/files-32.pngbinarybrand/png/files-48.pngbinarybrand/png/files-512.pngbinarybrand/png/mail-1024.pngbinarybrand/png/mail-16.pngbinarybrand/png/mail-180.pngbinarybrand/png/mail-192.pngbinarybrand/png/mail-32.pngbinarybrand/png/mail-48.pngbinarybrand/png/mail-512.pngbinarybrand/png/meet-1024.pngbinarybrand/png/meet-16.pngbinarybrand/png/meet-180.pngbinarybrand/png/meet-192.pngbinarybrand/png/meet-32.pngbinarybrand/png/meet-48.pngbinarybrand/png/meet-512.pngbinarybrand/png/memoria-1024.pngbinarybrand/png/memoria-16.pngbinarybrand/png/memoria-180.pngbinarybrand/png/memoria-192.pngbinarybrand/png/memoria-32.pngbinarybrand/png/memoria-48.pngbinarybrand/png/memoria-512.pngbinarybrand/png/oficina-1024.pngbinarybrand/png/oficina-16.pngbinarybrand/png/oficina-180.pngbinarybrand/png/oficina-192.pngbinarybrand/png/oficina-32.pngbinarybrand/png/oficina-48.pngbinarybrand/png/oficina-512.pngbinarybrand/png/sheets-1024.pngbinarybrand/png/sheets-16.pngbinarybrand/png/sheets-180.pngbinarybrand/png/sheets-192.pngbinarybrand/png/sheets-32.pngbinarybrand/png/sheets-48.pngbinarybrand/png/sheets-512.pngbinarybrand/png/slides-1024.pngbinarybrand/png/slides-16.pngbinarybrand/png/slides-180.pngbinarybrand/png/slides-192.pngbinarybrand/png/slides-32.pngbinarybrand/png/slides-48.pngbinarybrand/png/slides-512.pngbinarybrand/preview.pngbinarybrand/preview.svg+1 −97brand/square/calendar.svg+1 −0brand/square/calls.svg+1 −0brand/square/docs.svg+1 −0brand/square/fichas.svg+1 −0brand/square/files.svg+1 −0brand/square/mail.svg+1 −0brand/square/memoria.svg+1 −0brand/square/oficina.svg+1 −0brand/square/sheets.svg+1 −0brand/square/slides.svg+1 −0brand/svg/calendar.svg+1 −10brand/svg/calls.svg+1 −0brand/svg/docs.svg+1 −5brand/svg/fichas.svg+1 −0brand/svg/files.svg+1 −0brand/svg/mail.svg+1 −0brand/svg/meet.svg+0 −2brand/svg/memoria.svg+1 −4brand/svg/oficina.svg+1 −3brand/svg/sheets.svg+1 −4brand/svg/slides.svg+1 −3brand/upstream/book-search.svg+0 −16brand/upstream/calendar-days.svg+0 −22brand/upstream/file-text.svg+0 −17brand/upstream/panels-top-left.svg+0 −15brand/upstream/presentation.svg+0 −15brand/upstream/table.svg+0 −16brand/upstream/video.svg+0 −14chrome/chrome.css+1 −1chrome/chrome.go+1 −1cmd/oficina-notices/main.go+4 −0credits/fonts.go+15 −0credits/fonts_test.go+28 −0credits/notices/onest-OFL.txt+93 −0credits/notices/onest-provenance.json+11 −0homeconnect/README.md+1 −1sky/generate.go+178 −0sky/sky.css+63 −0sky/sky.go+117 −0sky/sky_test.go+144 −0sky/templates/sky.html+9 −0sky/testdata/v1-clouds-dark.svg+1 −0sky/testdata/v1-clouds-light.svg+1 −0sky/testdata/v1-filaments.svg+1 −0sky/testdata/v1-haze-dark.svg+1 −0sky/testdata/v1-haze-light.svg+1 −0theme/apps.go+136 −0theme/estilo.css+61 −174theme/fonts.go+74 −0theme/fonts/onest-latin.woff2binarytheme/fonts_test.go+44 −0theme/testdata/calendar.css+7 −0theme/testdata/calls.css+7 −0theme/testdata/docs.css+7 −0theme/testdata/fichas.css+7 −0theme/testdata/files.css+7 −0theme/testdata/mail.css+7 −0theme/testdata/memoria.css+7 −0theme/testdata/oficina.css+7 −0theme/testdata/sheets.css+7 −0theme/testdata/slides.css+7 −0theme/theme.go+8 −15theme/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-modcacheLoading diff…
AGENTS.mdLoading diff…
MakefileLoading diff…
README.mdLoading diff…
brand/README.mdLoading diff…
brand/brand.cssLoading diff…
brand/brand.goLoading diff…
brand/brand_test.goLoading diff…
brand/distribute.pyLoading diff…
brand/generate-native.mjsLoading diff…
brand/generate.mjsLoading diff…
brand/icons.jsonLoading diff…
brand/mac/calendar.svgLoading diff…
brand/mac/calls.svgLoading diff…
brand/mac/docs.svgLoading diff…
brand/mac/fichas.svgLoading diff…
brand/mac/files.svgLoading diff…
brand/mac/mail.svgLoading diff…
brand/mac/memoria.svgLoading diff…
brand/mac/oficina.svgLoading diff…
brand/mac/sheets.svgLoading diff…
brand/mac/slides.svgLoading diff…
brand/native/calendar/AppIcon.icnsLoading diff…
brand/native/calendar/ios-1024.pngLoading diff…
brand/native/calendar/macos-1024.pngLoading diff…
brand/native/calls/AppIcon.icnsLoading diff…
brand/native/calls/ios-1024.pngLoading diff…
brand/native/calls/macos-1024.pngLoading diff…
brand/native/docs/AppIcon.icnsLoading diff…
brand/native/docs/ios-1024.pngLoading diff…
brand/native/docs/macos-1024.pngLoading diff…
brand/native/meet/ios-1024.pngLoading diff…
brand/native/meet/ios.svgLoading diff…
brand/native/meet/macos-1024.pngLoading diff…
brand/native/meet/macos-128.pngLoading diff…
brand/native/meet/macos-16.pngLoading diff…
brand/native/meet/macos-256.pngLoading diff…
brand/native/meet/macos-32.pngLoading diff…
brand/native/meet/macos-512.pngLoading diff…
brand/native/meet/macos-64.pngLoading diff…
brand/native/meet/macos.svgLoading diff…
brand/native/memoria/AppIcon.icnsLoading diff…
brand/native/memoria/ios-1024.pngLoading diff…
brand/native/memoria/macos-1024.pngLoading diff…
brand/native/sheets/AppIcon.icnsLoading diff…
brand/native/sheets/ios-1024.pngLoading diff…
brand/native/sheets/macos-1024.pngLoading diff…
brand/png/calendar-1024.pngLoading diff…
brand/png/calendar-16.pngLoading diff…
brand/png/calendar-180.pngLoading diff…
brand/png/calendar-192.pngLoading diff…
brand/png/calendar-32.pngLoading diff…
brand/png/calendar-48.pngLoading diff…
brand/png/calendar-512.pngLoading diff…
brand/png/calls-1024.pngLoading diff…
brand/png/calls-16.pngLoading diff…
brand/png/calls-180.pngLoading diff…
brand/png/calls-192.pngLoading diff…
brand/png/calls-32.pngLoading diff…
brand/png/calls-48.pngLoading diff…
brand/png/calls-512.pngLoading diff…
brand/png/docs-1024.pngLoading diff…
brand/png/docs-16.pngLoading diff…
brand/png/docs-180.pngLoading diff…
brand/png/docs-192.pngLoading diff…
brand/png/docs-32.pngLoading diff…
brand/png/docs-48.pngLoading diff…
brand/png/docs-512.pngLoading diff…
brand/png/fichas-1024.pngLoading diff…
brand/png/fichas-16.pngLoading diff…
brand/png/fichas-180.pngLoading diff…
brand/png/fichas-192.pngLoading diff…
brand/png/fichas-32.pngLoading diff…
brand/png/fichas-48.pngLoading diff…
brand/png/fichas-512.pngLoading diff…
brand/png/files-1024.pngLoading diff…
brand/png/files-16.pngLoading diff…
brand/png/files-180.pngLoading diff…
brand/png/files-192.pngLoading diff…
brand/png/files-32.pngLoading diff…
brand/png/files-48.pngLoading diff…
brand/png/files-512.pngLoading diff…
brand/png/mail-1024.pngLoading diff…
brand/png/mail-16.pngLoading diff…
brand/png/mail-180.pngLoading diff…
brand/png/mail-192.pngLoading diff…
brand/png/mail-32.pngLoading diff…
brand/png/mail-48.pngLoading diff…
brand/png/mail-512.pngLoading diff…
brand/png/meet-1024.pngLoading diff…
brand/png/meet-16.pngLoading diff…
brand/png/meet-180.pngLoading diff…
brand/png/meet-192.pngLoading diff…
brand/png/meet-32.pngLoading diff…
brand/png/meet-48.pngLoading diff…
brand/png/meet-512.pngLoading diff…
brand/png/memoria-1024.pngLoading diff…
brand/png/memoria-16.pngLoading diff…
brand/png/memoria-180.pngLoading diff…
brand/png/memoria-192.pngLoading diff…
brand/png/memoria-32.pngLoading diff…
brand/png/memoria-48.pngLoading diff…
brand/png/memoria-512.pngLoading diff…
brand/png/oficina-1024.pngLoading diff…
brand/png/oficina-16.pngLoading diff…
brand/png/oficina-180.pngLoading diff…
brand/png/oficina-192.pngLoading diff…
brand/png/oficina-32.pngLoading diff…
brand/png/oficina-48.pngLoading diff…
brand/png/oficina-512.pngLoading diff…
brand/png/sheets-1024.pngLoading diff…
brand/png/sheets-16.pngLoading diff…
brand/png/sheets-180.pngLoading diff…
brand/png/sheets-192.pngLoading diff…
brand/png/sheets-32.pngLoading diff…
brand/png/sheets-48.pngLoading diff…
brand/png/sheets-512.pngLoading diff…
brand/png/slides-1024.pngLoading diff…
brand/png/slides-16.pngLoading diff…
brand/png/slides-180.pngLoading diff…
brand/png/slides-192.pngLoading diff…
brand/png/slides-32.pngLoading diff…
brand/png/slides-48.pngLoading diff…
brand/png/slides-512.pngLoading diff…
brand/preview.pngLoading diff…
brand/preview.svgLoading diff…
brand/square/calendar.svgLoading diff…
brand/square/calls.svgLoading diff…
brand/square/docs.svgLoading diff…
brand/square/fichas.svgLoading diff…
brand/square/files.svgLoading diff…
brand/square/mail.svgLoading diff…
brand/square/memoria.svgLoading diff…
brand/square/oficina.svgLoading diff…
brand/square/sheets.svgLoading diff…
brand/square/slides.svgLoading diff…
brand/svg/calendar.svgLoading diff…
brand/svg/calls.svgLoading diff…
brand/svg/docs.svgLoading diff…
brand/svg/fichas.svgLoading diff…
brand/svg/files.svgLoading diff…
brand/svg/mail.svgLoading diff…
brand/svg/meet.svgLoading diff…
brand/svg/memoria.svgLoading diff…
brand/svg/oficina.svgLoading diff…
brand/svg/sheets.svgLoading diff…
brand/svg/slides.svgLoading diff…
brand/upstream/book-search.svgLoading diff…
brand/upstream/calendar-days.svgLoading diff…
brand/upstream/file-text.svgLoading diff…
brand/upstream/panels-top-left.svgLoading diff…
brand/upstream/presentation.svgLoading diff…
brand/upstream/table.svgLoading diff…
brand/upstream/video.svgLoading diff…
chrome/chrome.cssLoading diff…
chrome/chrome.goLoading diff…
cmd/oficina-notices/main.goLoading diff…
credits/fonts.goLoading diff…
credits/fonts_test.goLoading diff…
credits/notices/onest-OFL.txtLoading diff…
credits/notices/onest-provenance.jsonLoading diff…
homeconnect/README.mdLoading diff…
sky/generate.goLoading diff…
sky/sky.cssLoading diff…
sky/sky.goLoading diff…
sky/sky_test.goLoading diff…
sky/templates/sky.htmlLoading diff…
sky/testdata/v1-clouds-dark.svgLoading diff…
sky/testdata/v1-clouds-light.svgLoading diff…
sky/testdata/v1-filaments.svgLoading diff…
sky/testdata/v1-haze-dark.svgLoading diff…
sky/testdata/v1-haze-light.svgLoading diff…
theme/apps.goLoading diff…
theme/estilo.cssLoading diff…
theme/fonts.goLoading diff…
theme/fonts/onest-latin.woff2Loading diff…
theme/fonts_test.goLoading diff…
theme/testdata/calendar.cssLoading diff…
theme/testdata/calls.cssLoading diff…
theme/testdata/docs.cssLoading diff…
theme/testdata/fichas.cssLoading diff…
theme/testdata/files.cssLoading diff…
theme/testdata/mail.cssLoading diff…
theme/testdata/memoria.cssLoading diff…
theme/testdata/oficina.cssLoading diff…
theme/testdata/sheets.cssLoading diff…
theme/testdata/slides.cssLoading diff…
theme/theme.goLoading diff…
theme/theme_test.goLoading diff…