Koder Design: intentional shape of the Stack (5 facets) + kds.koder.dev landing
Koder Design — foundations RFC
Status
*ccepted*— ratificada pelo owner 20260509 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.
*evised 20260510*— escopo expandido pelo owner: "Koder Design" deixa de ser apenas o design system de UI/UX e passa a ser o *mbrella 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 *oder 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 *utomaticamente*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 safearea com windowinsetskind=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 `uistyle.kmd`(default
material3; query param?preset=gnomepermuta)
Stack
Per policies/web-server.kmd (sempre Koder Jet) + reuse-first:
- *ackend*
templ(Go templating, integrado ao Koder Jet) - *rontend* HTMX pra interações dinâmicas (preset switcher, dark
toggle, language switcher per
i18n/contract.kmd) - *osting* Koder Jet em
s.khost1(alinha com infra atual) - *uild*
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 *howcases 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 |
|---|---|
| *adastro Pessoa Física* | inputs textemailteldatepassword, validação inline, password meter (já existe em ~/temp/) |
| *adastro Pessoa Jurídica* | inputs com máscara CNPJ/IE, autocomplete CEP, address composto |
| *ogin / Sign-in* | KoderSignInButton + Koder ID OIDC redirect (cobre koder-app/behaviors §1) |
| *rofile edit* | avatar upload, theme picker, language picker, accessibility toggles |
| *ettings page* | KoderSettingsTile / KoderSettingsGroup / KoderSettingsPage (per specs/settings/patterns.kmd) |
| *ulti-step wizard* | progress bar, back/next, validation per step |
| *earch / filter* | Ctrl+K command palette, fuzzy match, filter chips |
| *ata 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)
- *oggle live*— clique alterna light/dark, persiste em
localStorage; mostra anti-flash
- *reset switcher live*— query param
?preset=gnomeou dropdownHTMX, troca CSS variables sem reload
- *ombinações color × style*— matriz visual mostrando como
material3 + draculadifere degnome + dracula
Flows (cobre navigation, back-behavior, auth, voice, errors)
| Flow | Cobre |
|---|---|
| *irst-launch onboarding* | splash → setup → KoderSignIn → home |
| *ogin flow completo* | guest → KoderSignInButton → OIDC redirect → callback → home (cobre identity/login-resolution.kmd) |
| *uto-update flow* | banner → user clica → download silent → restart prompt (koder-app/behaviors §4) |
| *rror → report* | error banner → "Reportar" → confirm → telemetry sent (cobre errors/reporting.kmd) |
| *ack button per surface* | mobiledesktop ESCback behavior telanavigation/back-behavior) |
| *oice activation* | mic permission → wake |
| *anguage switch* | switcher → reload locale → strings atualizam (cobre i18n/contract §R3) |
| *indow resize / multi-monitor* | mostrar safeapp-layout + desktop-apps/title-bar*) |
Icons (cobre icons/products, icons/generation-targets)
- *aster SVG showcase*— render do master SVG por produto Koder
- *eneration matrix*— mostrar mesmo ícone em todos targets:
Android adaptive, iOS, Linux 16223248512px, Windows ico, Hub thumb, favicon, social-card
- *con do you =
kicon generate*demo
Patterns (cobre as policies que afetam UX)
| Pattern | Spec |
|---|---|
| *rror message format* | errors/user-facing-messages — humanizado pt<PRODUCT>-<CAT>-<CODE>-<SEQ>, "Ver detalhes" expandible |
| *uth flow* | koder-app/behaviors §1 |
| *pdate flow* | koder-app/behaviors §4 |
| *18n* | i18n/contract — autodetect, switcher, fallback |
| *PC* | ipc/protocol.kmd |
| *ogin resolution* | identity/login-resolution.kmd — bare username vs email, fallback handle |
| *aming* | binaries-and-cli/naming.kmd — k<slug> em CLI |
| *euse-first* | meta-pattern: showcase de "esses 3 apps usam o mesmo widget" |
Voice (cobre voice/wake-word)
- *oggle matrix*— 6 toggles (
enabled/talkMode/hotWord/backend/bargeIn/debugRecord) com defaults visualizados - *ake
word demo*(readonly audio sim) — mostra ring bufferpré-wake estritamente local
- *rror map*
<APP>-VOICE-…exemplos
Acessibilidade (cobre high_contrast preset + a11y future)
- *ocus ring demo*(Tab through inputs)
- *igh contrast preset*— diff vs default
- *eader mode*simulation (font size scaling)
- *eyboard-only navigation flow*
Variants (cobre variants/taxonomy)
- *esmo produto em surface × target × form factor*— kall em
mobile-androidvsdesktop-linuxvsweb-pwaladoalado - Demonstra que mesmo preset Koder se adapta às variantes
Stackwide reuse (cobre `policies/reusefirst`)
- *omponent 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
*otal 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