Skip to content

Experiment: Chat in the design system's clean look (not for release) - #180

Draft
immakermatty wants to merge 1 commit into
mainfrom
lazurio/experiment-ds-skin
Draft

immakermatty wants to merge 1 commit into
mainfrom
lazurio/experiment-ds-skin

Conversation

@immakermatty

@immakermatty immakermatty commented Nov 5, 2026 •

Copy link
Copy Markdown

Experiment, není k Publikaci. Parkováno (Matěj, 2026-11-05): změny jsou zatím malé, přednost má levý sloupec shellu. Draft zůstává otevřený jako podklad. Nemergovat, nevydávat, nenasazovat. Poznatky a cesty dál drží #181.

Proč

Na Prostředí Lazuria má Chat (T3 Code) od #66 a #82 barvy design systému, ale tvary, písmo a hloubku pořád z T3. Proto vedle Apps pořád „vypadá jako T3“. Experiment zkouší, jestli jde Chat obléknout do vzhledu design systému tak, aby se UX ani mechanika nezměnily a aby se kabátek dal levně udržet proti upstreamu.

Co se mění

Na Prostředí, ve standardním vzhledu T3 (téma Prostředí, rozhodnutí 0200 a 0208) a jen tam, platí Čistý vzhled design systému (HumanAndMachine-ai/design-system-lazurio, 2026-10-21):

  • Tlačítka, jednořádková pole, selecty, skupiny polí, odznaky a segmenty jsou pilulky. Ikonová tlačítka jsou čtverce 6 px.
  • Composer, dialogy, ⌘K a karty mají rohy 10 px. Stupnice zaoblení T3 jde z jednoho tokenu (--radius), takže sm je 6 px a lg 10 px jako v design systému.
  • Composer má vlasovou linku design systému bez stínu. Jediný stín (--lz-shadow-float) mají plovoucí vrstvy: menu, popover, select, tooltip, dialog a toast.
  • Nadpisy (markdown v odpovědích, dialogy, prázdné stavy) jsou Inter Tight 600 se sledováním --lz-track-title. Text se řídí --lz-font-sans shellu: s tokeny z main design systému je to Inter.
  • Vybrané vlákno v postranním panelu je tichá plocha o stupeň tmavší, ne vyvýšená karta.

Co se záměrně nemění

Chování, pořadí, texty, velikosti a hustota zůstávají T3. Nic se neskrývá. Značka T3 Code se štítkem Lazurio zůstává. Bez shellu Lazuria vypadá T3 přesně jako upstream a s osobním tématem T3 jako to téma. Obojí je ověřené v prohlížeči: s tématem Grove má composer upstreamových 16 px a systémové písmo, bez /.lazurio/shell.js platí hodnoty upstreamu. Tmavý režim tématu Lazurio zůstává paletou T3.

Mechanismus

  • Jeden soubor apps/web/src/lazurio/skin.css se stejnou podmínkou jako theme.css (značka shellu, žádné vybrané téma T3), importovaný hned po něm v main.tsx. Má 14 pravidel. Míří jen na háčky, které T3 sám renderuje (data-slot, data-*, ARIA, [data-sidebar-row], třída .chat-markdown), nikdy na utility třídy Tailwindu. Hodnoty jsou tokeny --lz-*.
  • Jeden šev v upstream TSX: components/ui/button.tsx (+3 řádky) dává každému Buttonu data-size a data-variant. Zjištění z experimentu: data-slot="button" většině tlačítek přepíše obalující trigger (tooltip-trigger, menu-trigger, popover-trigger), takže na něj skin cílit nemůže. Size a variant přežijí, a tím se odliší pilulka od ikonového čtverce. Upstreamové input.tsx už data-size takhle nese, takže šev jde navrhnout i upstreamu.
  • Guard forku: button.tsx přibyl do allowed_upstream_changes v lazurio-fork-ci.yml s důvodem.
  • Kontrakt: nový test v scripts/lazurio-release-contract.test.mjs hlídá import, šev, podmínku na každém selektoru, háčky bez utility tříd, které tokeny T3 smí skin nastavit a číst, zákaz barevných literálů a !important, a výslovný seznam tokenů s fallbackem (níž).

Co by musel slíbit shell

Skin čte tokeny, které shell dnes deklaruje, ale neslibuje (declares.tokens, LazurioPlatform src/shell/interface.ts), nebo je vůbec nemá. Experiment je proto nese s lokálním fallbackem:

Token Dnes ve shellu Fallback ve skinu
--lz-radius-md deklarovaný, neslíbený 10px
--lz-radius-pill deklarovaný, neslíbený 999px
--lz-shadow-float deklarovaný, neslíbený none
--lz-font-heading chybí (vendored tokeny jsou z doby před Čistým vzhledem) --lz-font-sans
--lz-track-body, --lz-track-title deklarované se staršími hodnotami -0.011em, -0.015em
--lz-weight-akce, --lz-weight-title deklarované (title 700, DS dnes 600) 600

Dokud Platforma nepřevezme tokeny Čistého vzhledu, bude Chat s tímto skinem psaný v Inter Tight (dnešní --lz-font-sans shellu) s nadpisy 700.

Rizika pro rebuildy

  • Šev v button.tsx je jeden blok ve defaultProps. Konflikt hrozí, jen když upstream přepíše právě tyto řádky.
  • Skin závisí na jménech data-slot a na tom, že T3 bere zaoblení z --radius a --control-radius. Přejmenování slotu nebo pevný poloměr v upstreamu skin tiše minou: vzhled se vrátí k T3, nic se nerozbije. Při rebuildu proto stačí projít screenshoty hlavních obrazovek.
  • Pravidla bez !important vyhrávají jen proto, že overlay CSS je mimo @layer Tailwindu. Kdyby se theme.css/skin.css někdy importovaly do vrstvy, přestanou platit.

Ověřeno

  • 2026-11-05 večer přeneseno na nový main po rebuildu na upstream v0.1.7 (Rebuild the Lazurio overlay on upstream T3 Code v0.1.7 #174) jediným commitem bez konfliktu; kontrakt 52 z 52 a vp run check:changed (format, lint, knip, typecheck, react compiler) na novém základu znovu prošly. Screenshoty níž jsou ze základu před rebuildem.
  • Vlastní instance T3 z této větve (produkční build webu, vlastní --base-dir, loopback, syntetický projekt „Demo shop“ a vlákna z vývojového provideru Replay) se skutečným /.lazurio/shell.js z Platformy main (scripts/preview-launchpad.ts se syntetickou složkou). Varianta „tokeny DS main“ má v lokální kopii Platformy vendored tokens.css nahrazené tokens.css z main design systému. Do Platformy ani do design systému se nic nezapisovalo.
  • Screenshoty 1440×900, světlý režim, headless Playwright: nové vlákno a výběr modelu, vlákno s kódem, tabulkou a tool calls, diff, postranní panel, kontextové menu, dialog, ⌘K a Nastavení, před a po. Pravý panel prohlížeče Prostředí v sadě chybí: potřebuje sdílený Chromium Prostředí s agent-browser, který na loopbacku synteticky nejde. Skin v něm mění jen tlačítka panelu, stejně jako jinde.
  • node --test scripts/lazurio-release-contract.test.mjs: 52 z 52. vp run check:changed: format, lint, knip, typecheck a react compiler projdou. Test apps/server/src/provider/AgentContextBudget.test.ts lokálně padá stejně i na čistém origin/main, takže s touto změnou nesouvisí.

Screenshoty jsou ve vlákně, které experiment připravilo. Na GitHub je nenahrávám, protože by to znamenalo commitnout soubory jen pro PR.

Navazující issues


Agent: environment a480495c-25e0-4e51-828b-1dbf1b77d62f · T3 thread b2ba4875-1104-4818-a273-d3ea899738dc

🤖 Generated with Claude Code

…de's components

On a Lazurio Environment, Chat takes the design system's colours (theme.css) but keeps T3's
shapes, type and depth, so it still reads as T3 beside Apps. As an experiment, not for release,
one more overlay stylesheet (apps/web/src/lazurio/skin.css) dresses T3's own components in the
design system's clean look behind theme.css's gate: pill buttons and fields, square icon
buttons, 10 px cards, composer and dialogs, Inter Tight 600 headings, hairlines and one floating
shadow. Behaviour, order, text and sizes stay T3's; without the shell, or with a picked T3
theme, nothing changes.

The one upstream seam: components/ui/button.tsx marks each Button with its size and variant,
because a trigger that renders a Button takes over its data-slot. The release contract keeps the
skin to T3's own hooks and the design system's tokens, and lists the tokens the shell would have
to promise.

Claude Opus 5.5 in Claude Code (T3 Code).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@immakermatty
immakermatty force-pushed the lazurio/experiment-ds-skin branch from 0de6258 to 3a344a4 Compare November 5, 2026 23:56

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant