Koder Design: intentional shape of the Stack (5 facets) + kds.koder.dev landing
Status
accepted — ratificada pelo owner 2026-05-09 com escopo máximo ("todo tempo do mundo, sempre a melhor e mais completa solução"). Todas as 16 decisões em § Decisões ratificadas foram aprovadas.
revised 2026-05-10 — escopo expandido pelo owner: "Koder Design" deixa de ser apenas o design system de UI/UX e passa a ser o umbrella programme do Projeto intencional da Stack (sentido amplo de design = designare), cobrindo 5 facets — Visual, Code, Data, Interface, System (ver § Facets). Nenhuma spec existente se move; ganham mapping conceitual pras facets. Trade-off resolvido a favor do umbrella amplo: alinha com o ethos "first" da Stack (self-hosted-first, reuse-first, hyperscale-first, multi-tenant-by-default), aproveita investimento Sprint 9, evita fragmentação de 3 governances paralelas (CodeArchitectureetc.).
Summary
Estabelecer Koder Design como o programme guarda-chuva que descreve a forma intencional da Koder Stack em 5 facets — Visual, Code, Data, Interface, System — e expor isso publicamente em kds.koder.dev, renderizado automaticamente a partir das specs canônicas (meta/docs/stack/specs
*.kmd
- Parse frontmatter (
name,type,audit,triggers,references) - Para cada spec, identifica
kind:kind=ui-style→ showcase com 19→31 presets (HTML preview jáexiste —
~/temp/koder-ui-style-previews.htmlvira template)kind=theme→ light/dark toggle showcasekind=icon→ grid de ícones por presetkind=app-layout→ demo de safe-area com window-insetskind=pattern(back-behavior, errors, i18n) → docs + ASCII flowkind=spec-doc→ render markdown + frontmatter table
- Output: estrutura estática
dist/com 1 HTML per spec - Dog-food: a própria landing usa preset selecionado de
ui-style.kmd(default
material3; query param?preset=gnomepermuta)
Stack
Per policies/web-server.kmd (sempre Koder Jet) + reuse-first:
- Backend:
templ(Go templating, integrado ao Koder Jet) - Frontend: HTMX pra interações dinâmicas (preset switcher, dark
toggle, language switcher per
i18n/contract.kmd) - Hosting: Koder Jet em
s.khost1(alinha com infra atual) - Build:
make design-gen && rsync dist/ s.khost1:/var/www/kds.koder.dev/(ou via CI no
koder-flowpush)
Estrutura de URLs
kds.koder.dev/ visão geral + manifesto
kds.koder.dev/style 19→31 presets do ui-style.kmd
kds.koder.dev/style/<preset> showcase individual (form, navbar, dialog, …)
kds.koder.dev/themes light/dark spec
kds.koder.dev/icons icons/products.kmd + generation-targets
kds.koder.dev/components widgets do koder_kit (KoderSignInButton, KoderTitleBar, …)
kds.koder.dev/components/<name> doc + live preview por widget
kds.koder.dev/patterns UX patterns
kds.koder.dev/patterns/back navigation/back-behavior
kds.koder.dev/patterns/errors errors/user-facing-messages
kds.koder.dev/patterns/i18n i18n/contract
kds.koder.dev/voice voice/wake-word
kds.koder.dev/a11y (futuro — quando high_contrast preset entrar)
kds.koder.dev/spec-source link pra cada `.kmd` no FlowCada path corresponde 1:1 a 1 spec em meta/docs/stack/. Pra adicionar nova doc na landing → adicionar nova spec — generator pega automaticamente.
Drift detection
CI gate em .gitea/workflows/design-gate.yml:
on: pull_request
jobs:
drift:
steps:
- run: make design-gen
- run: |
if git diff --quiet dist/; then
echo "Landing ainda em sync"
else
echo "❌ Spec mudou; rerun 'make design-gen' e commite o resultado"
exit 1
fiAlternativa mais elegante: NÃO commitar dist/ no monorepo; gerar no deploy. CI só valida que make design-gen compila e produz output sem erro.
Catálogo de showcases (playground content)
Pra cada categoria de spec, a landing precisa renderizar showcases canônicos que cubram o vocabulário visual + comportamental. Esta seção enumera o catálogo mínimo — fonte do "playground" que o generator vai produzir.
Forms (cobre ui-style, light-dark, errors/messages, i18n)
| Showcase | Cobre |
|---|---|
| Cadastro Pessoa Física | inputs textemailteldatepassword, validação inline, password meter (já existe em ~/temp/) |
| Cadastro Pessoa Jurídica | inputs com máscara CNPJ/IE, autocomplete CEP, address composto |
| Login / Sign-in | KoderSignInButton + Koder ID OIDC redirect (cobre koder-app/behaviors §1) |
| Profile edit | avatar upload, theme picker, language picker, accessibility toggles |
| Settings page | KoderSettingsTile / KoderSettingsGroup / KoderSettingsPage (per specs/settings/patterns.kmd) |
| Multi-step wizard | progress bar, back/next, validation per step |
| Search / filter | Ctrl+K command palette, fuzzy match, filter chips |
| Data table | sortable columns, pagination, row selection, bulk actions |
Components (widgets do koder_kit que merecem demo individual)
| Componente | Spec source |
|---|---|
KoderSignInButton |
specs/koder-app/behaviors.kmd §1 |
KoderUserBadge |
idem |
KoderAuthGate |
idem |
KoderTitleBar + KoderTitleBarFreeArea |
specs/desktop-apps/title-bar-double-click.kmd |
KoderSafeScaffold / KoderApp(safeArea: true) |
specs/app-layout/safe-area.kmd |
KoderBackScope |
specs/navigation/back-behavior.kmd |
KoderErrorBanner / KoderErrorBoundary |
specs/errors/user-facing-messages.kmd |
KoderErrorReporter / KoderReportButton |
specs/errors/reporting.kmd |
KoderUpdateBanner |
specs/koder-app/behaviors.kmd §4 |
KoderL10n switcher |
specs/i18n/contract.kmd §R3 |
KoderUIStylePicker |
specs/themes/ui-style.kmd |
KoderThemeToggle |
specs/themes/light-dark.kmd |
KoderCommandPalette (após koder_kit#029) |
proposta |
KoderCachePurge |
specs/cache-purge/contract.kmd |
KoderDownloadButton |
specs/landing-pages/download-button.kmd |
KodeVoiceSettingsTile |
specs/voice/wake-word.kmd |
Themes (cobre light-dark, ui-style)
- Toggle live — clique alterna light/dark, persiste em
localStorage; mostra anti-flash
- Preset switcher live — query param
?preset=gnomeou dropdownHTMX, troca CSS variables sem reload
- Combinações color × style — matriz visual mostrando como
material3 + draculadifere degnome + dracula
Flows (cobre navigation, back-behavior, auth, voice, errors)
| Flow | Cobre |
|---|---|
| First-launch onboarding | splash → setup → KoderSignIn → home |
| Login flow completo | guest → KoderSignInButton → OIDC redirect → callback → home (cobre identity/login-resolution.kmd) |
| Auto-update flow | banner → user clica → download silent → restart prompt (koder-app/behaviors §4) |
| Error → report | error banner → "Reportar" → confirm → telemetry sent (cobre errors/reporting.kmd) |
| Back button per surface | mobiledesktop ESCback behavior tela-por-tela (cobre navigation/back-behavior) |
| Voice activation | mic permission → wake-word → talk mode (cobre voice/wake-word.kmd) |
| Language switch | switcher → reload locale → strings atualizam (cobre i18n/contract §R3) |
| Window resize / multi-monitor | mostrar safe-area + title-bar drag (cobre app-layout + desktop-apps/title-bar*) |
Icons (cobre icons/products, icons/generation-targets)
- Master SVG showcase — render do master SVG por produto Koder
- Generation matrix — mostrar mesmo ícone em todos targets:
Android adaptive, iOS, Linux 16223248512px, Windows ico, Hub thumb, favicon, social-card
- Icon do you =
kicon generatedemo
Patterns (cobre as policies que afetam UX)
| Pattern | Spec |
|---|---|
| Error message format | errors/user-facing-messages — humanizado pt-BR/en-US, ID <PRODUCT>-<CAT>-<CODE>-<SEQ>, "Ver detalhes" expandible |
| Auth flow | koder-app/behaviors §1 |
| Update flow | koder-app/behaviors §4 |
| i18n | i18n/contract — autodetect, switcher, fallback |
| IPC | ipc/protocol.kmd |
| Login resolution | identity/login-resolution.kmd — bare username vs email, fallback handle |
| Naming | binaries-and-cli/naming.kmd — k<slug> em CLI |
| Reuse-first | meta-pattern: showcase de "esses 3 apps usam o mesmo widget" |
Voice (cobre voice/wake-word)
- Toggle matrix — 6 toggles (
enabled/talkMode/hotWord/backend/bargeIn/debugRecord) com defaults visualizados - Wake-word demo (read-only audio sim) — mostra ring buffer
pré-wake estritamente local
- Error map
<APP>-VOICE-…exemplos
Acessibilidade (cobre high_contrast preset + a11y future)
- Focus ring demo (Tab through inputs)
- High contrast preset — diff vs default
- Reader mode simulation (font size scaling)
- Keyboard-only navigation flow
Variants (cobre variants/taxonomy)
- Mesmo produto em surface × target × form factor — kall em
mobile-androidvsdesktop-linuxvsweb-pwalado-a-lado - Demonstra que mesmo preset Koder se adapta às variantes
Stack-wide reuse (cobre policies/reuse-first)
- Component usage map — mostrar quais Koder products usam cada
widget de
koder_kit(kall, koru, eye, hub, jet admin, …) - Reforça SDK-first como princípio
Total estimado: ~50 showcases distintos cobrindo ~20 specs + ~16 widgets koder_kit + ~8 flows + showcases de íconesvoicea11y. Phase 1 entrega ~10 showcases (forms PF + 3 widgets + 2 flows + style matrix); Phase 2 expande pra cobertura completa.
Phase plan
Phase 1 — MVP (~1-2 semanas)
tools/design-gen/main.go(Go templ-based generator)- Cobertura inicial:
themes/ui-style.kmdapenas (19 presets, páginapor preset com showcase do form PF + componentes básicos)
- Reusar
~/temp/koder-ui-style-previews.htmlcomo base inicial - Deploy em stg.kds.koder.dev pra preview
- 1 idioma só (en-US)
Phase 2 — Coverage (~2 semanas)
- Adicionar paths
/themes,/icons,/components, `/patterns