@usetheo/ui 0.1.0-next.0 → 0.1.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +116 -9
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/plugin-Atb0VKtr.d.ts +172 -0
  6. package/dist/slide/index.d.ts +212 -0
  7. package/dist/slide/index.js +714 -0
  8. package/dist/slide/index.js.map +1 -0
  9. package/dist/slide/plugins/emoji/index.d.ts +29 -0
  10. package/dist/slide/plugins/emoji/index.js +157 -0
  11. package/dist/slide/plugins/emoji/index.js.map +1 -0
  12. package/dist/slide/plugins/math/index.d.ts +13 -0
  13. package/dist/slide/plugins/math/index.js +145 -0
  14. package/dist/slide/plugins/math/index.js.map +1 -0
  15. package/dist/slide/plugins/mermaid/index.d.ts +55 -0
  16. package/dist/slide/plugins/mermaid/index.js +218 -0
  17. package/dist/slide/plugins/mermaid/index.js.map +1 -0
  18. package/dist/slide/plugins/shiki/index.d.ts +18 -0
  19. package/dist/slide/plugins/shiki/index.js +87 -0
  20. package/dist/slide/plugins/shiki/index.js.map +1 -0
  21. package/dist/slide/themes/default.css +256 -0
  22. package/dist/slide/themes/layouts.css +143 -0
  23. package/dist/slide/themes/violet-forge.css +256 -0
  24. package/dist/slide-deck/index.css +52 -0
  25. package/dist/slide-deck/index.css.map +1 -0
  26. package/dist/slide-deck/index.d.ts +377 -0
  27. package/dist/slide-deck/index.js +1797 -0
  28. package/dist/slide-deck/index.js.map +1 -0
  29. package/dist/whiteboard/index.d.ts +258 -0
  30. package/dist/whiteboard/index.js +738 -0
  31. package/dist/whiteboard/index.js.map +1 -0
  32. package/package.json +141 -9
  33. package/registry/r/agent-composer.json +4 -4
  34. package/registry/r/agent-editor.json +9 -9
  35. package/registry/r/agent-error-card.json +2 -2
  36. package/registry/r/agent-event.json +4 -4
  37. package/registry/r/agent-handoff.json +2 -2
  38. package/registry/r/agent-profile.json +2 -2
  39. package/registry/r/agent-starting-state.json +2 -2
  40. package/registry/r/agent-stream.json +9 -9
  41. package/registry/r/agent-streaming.json +2 -2
  42. package/registry/r/agent-timeline.json +4 -4
  43. package/registry/r/approval-card.json +4 -4
  44. package/registry/r/artifact-preview.json +2 -2
  45. package/registry/r/attachment-chip.json +4 -4
  46. package/registry/r/audit-log-entry.json +3 -3
  47. package/registry/r/auto-compact-notice.json +2 -2
  48. package/registry/r/avatar.json +2 -2
  49. package/registry/r/badge.json +2 -2
  50. package/registry/r/browser-controls.json +2 -2
  51. package/registry/r/build-log-stream.json +2 -2
  52. package/registry/r/button.json +2 -2
  53. package/registry/r/capability-indicator.json +3 -3
  54. package/registry/r/card.json +2 -2
  55. package/registry/r/chat-composer.json +3 -3
  56. package/registry/r/chat-message.json +3 -3
  57. package/registry/r/chat-thread.json +2 -2
  58. package/registry/r/checkbox.json +2 -2
  59. package/registry/r/command-palette.json +4 -4
  60. package/registry/r/context-card.json +3 -3
  61. package/registry/r/context-window-bar.json +2 -2
  62. package/registry/r/cost-meter.json +2 -2
  63. package/registry/r/created-files-card.json +3 -3
  64. package/registry/r/cron-job-card.json +2 -2
  65. package/registry/r/cron-jobs-list.json +3 -3
  66. package/registry/r/deployment-row.json +3 -3
  67. package/registry/r/dialog.json +2 -2
  68. package/registry/r/diff-viewer.json +2 -2
  69. package/registry/r/domain-config.json +6 -6
  70. package/registry/r/empty-state.json +3 -3
  71. package/registry/r/env-var-editor.json +5 -5
  72. package/registry/r/folder-context-card.json +3 -3
  73. package/registry/r/folder-selector.json +2 -2
  74. package/registry/r/form-field.json +2 -2
  75. package/registry/r/hook-config.json +2 -2
  76. package/registry/r/hook-event-log.json +2 -2
  77. package/registry/r/input.json +2 -2
  78. package/registry/r/intent-selector.json +3 -3
  79. package/registry/r/label.json +2 -2
  80. package/registry/r/lane-board.json +2 -2
  81. package/registry/r/login-split.json +2 -2
  82. package/registry/r/mcp-server-card.json +2 -2
  83. package/registry/r/mcp-server-list.json +3 -3
  84. package/registry/r/memory-editor.json +3 -3
  85. package/registry/r/mention-menu.json +3 -3
  86. package/registry/r/metrics-panel.json +2 -2
  87. package/registry/r/model-card.json +3 -3
  88. package/registry/r/model-selector.json +2 -2
  89. package/registry/r/permission-matrix.json +2 -2
  90. package/registry/r/permission-modal.json +4 -4
  91. package/registry/r/preview-env-card.json +5 -5
  92. package/registry/r/preview-panel.json +3 -3
  93. package/registry/r/progress-checklist.json +3 -3
  94. package/registry/r/project-card.json +5 -5
  95. package/registry/r/project-switcher.json +2 -2
  96. package/registry/r/quick-action-chips.json +3 -3
  97. package/registry/r/radio-group.json +2 -2
  98. package/registry/r/recent-folders-list.json +2 -2
  99. package/registry/r/rollback-ui.json +4 -4
  100. package/registry/r/rule-card.json +3 -3
  101. package/registry/r/rule-editor.json +10 -10
  102. package/registry/r/rule-types.json +1 -1
  103. package/registry/r/run-stats.json +2 -2
  104. package/registry/r/running-tasks-panel.json +2 -2
  105. package/registry/r/scroll-area.json +2 -2
  106. package/registry/r/select.json +2 -2
  107. package/registry/r/session-list-item.json +2 -2
  108. package/registry/r/session-timeline.json +2 -2
  109. package/registry/r/sheet.json +2 -2
  110. package/registry/r/sidebar.json +2 -2
  111. package/registry/r/skeleton.json +2 -2
  112. package/registry/r/skill-card.json +4 -4
  113. package/registry/r/skill-editor.json +10 -10
  114. package/registry/r/skills-list.json +3 -3
  115. package/registry/r/social-auth-row.json +3 -3
  116. package/registry/r/steps-rail.json +2 -2
  117. package/registry/r/sub-agent-dispatch.json +2 -2
  118. package/registry/r/switch.json +2 -2
  119. package/registry/r/system-prompt-editor.json +2 -2
  120. package/registry/r/tabs.json +2 -2
  121. package/registry/r/task-header.json +4 -4
  122. package/registry/r/task-plan.json +2 -2
  123. package/registry/r/terminal-panel.json +2 -2
  124. package/registry/r/textarea.json +2 -2
  125. package/registry/r/theme-provider.json +2 -2
  126. package/registry/r/theme-script.json +1 -1
  127. package/registry/r/theo-ui-provider.json +2 -2
  128. package/registry/r/toast.json +2 -2
  129. package/registry/r/token-usage-chart.json +2 -2
  130. package/registry/r/tool-call-card.json +3 -3
  131. package/registry/r/tool-call.json +2 -2
  132. package/registry/r/tool-result.json +2 -2
  133. package/registry/r/tools-list.json +3 -3
  134. package/registry/r/tooltip.json +2 -2
  135. package/registry/r/topnav.json +2 -2
package/CHANGELOG.md CHANGED
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.1.0-next.1] - 2026-05-19
11
+
12
+ ### Added
13
+ - **Slide rich content — Tier 1 baked-in + Tier 2 plugin system (2026-05-19, RFC 0004)** — Estende `<Slide>` (RFC 0002) e `<SlideDeck>` (RFC 0003) com conteúdo rico nível PowerPoint sem reinventar parsers. **Tier 1 (zero peer-deps novas):** (a) GFM alerts `> [!NOTE/TIP/IMPORTANT/WARNING/CAUTION]` detectados em mdast post-process (alerts.ts) → `<aside class="theo-slide-alert" data-theo-slide-alert-type>` temado em ambos os themes (default + violet-forge); (b) 7 layouts via frontmatter `layout` (`default`, `title`, `two-column`, `image-right`, `image-left`, `code-output`, `section`) em CSS grid templates (themes/layouts.css importado pelos dois themes); (c) backgroundImage + backgroundGradient com `sanitizeBgUrl` rejeitando `javascript:`/`vbscript:`/TODO data: URLs (EC-7), cap 500_000 chars; (d) Marpit `![bg](url)` syntax extraído em mdast walker → `ParsedSlide.extractedBackground = { url, modifier }` (D18/EC-5), sanitizado antes de armazenar com fallback `MARPIT_BG_UNSAFE_URL`, modifier-aware (`cover`/`fit`/`left`/`right`); (e) header/footer/paginate overlays via frontmatter (plain text ≤200 chars cada), CSS absolute positioned. **Tier 2 (opt-in plugin system):** plugin architecture com `<Slide plugins={SlidePlugin[]}>` e relay `<SlideDeck plugins>` para cada slide interno. `SlidePlugin` shape: `{ name, mdastTransform?, hastTransform?, components?, sanitizeSchemaExtension? }` com error isolation D16 (cada chamada em try/catch, throws agregadas em `errors[]` com `code: "PLUGIN_ERROR"`; pipeline **nunca** propaga exception) e sanitize-schema merge D17 (extensions unionadas com defaultSchema + Tier 1 baseline). Quatro plugins shipados em sub-subpaths `@usetheo/ui/slide/plugins/{shiki,math,mermaid,emoji}`: **shikiPlugin** (peer-dep `shiki`; lazy + singleton highlighter; pre-renderiza `<pre><code class="language-XXX">` em HTML temado dual-theme com sanitize ext `<span> style/className`); **mathPlugin** (peer-deps `katex` + `hast-util-from-html`; substitui `$inline$` + `$$block$$` por KaTeX displayMode/inline; skip em `<code>`/`<pre>`; sanitize ext com lista completa de ≥30 tags MathML — `math`, `mfrac`, `msqrt`, `msup`, `msub`, `msubsup`, `munder`, `mover`, `mtable`, `mtr`, `mtd`, `mphantom`, `mstyle`, `annotation`, etc. — EC-4); **mermaidPlugin** (peer-dep `mermaid`; converte `<pre><code class="language-mermaid">` em `<theo-mermaid source>` com React `<MermaidDiagram>` que lazy-importa mermaid e injeta SVG via innerHTML; SSR placeholder distinguível de erro com `role="img"` + source code preservado, EC-10; sanitize ext com ≥30 tags SVG — `svg`, `g`, `path`, `rect`, `circle`, `text`, `marker`, `foreignObject`, etc. — EC-4); **emojiPlugin** (zero peer-deps de runtime, usa `unist-util-visit-parents` já no stack; 100 shortcodes Unicode embedded; **EC-6: ancestor check** via `isInsideCodeOrPre` skipa replace dentro de `<code>`/`<pre>` para preservar type hints Python / YAML keys / Ruby symbols). Pipeline order: `validateSlide → parseBody → detectAlerts (Tier 1) → extractMarpitBackgrounds (Tier 1) → plugin.mdastTransform[] → mdastToHast → plugin.hastTransform[] → sanitize(defaultSchema + extensions) → hastToReact (consumer + plugin components)`. Bundle isolation invariant preservada: barrel `dist/index.js` **inalterado**; cada plugin é entry tsup próprio com peer-deps externalizados. `scripts/sync-exports.ts` ganha 4 entries em `ISOLATED_SUBPATHS`. `package.json` ganha 9 peer-deps opcionais (`shiki`, `katex`, `mermaid`, `micromark-extension-math`, `mdast-util-math`, `hast-util-from-html`, `unist-util-visit`, `unist-util-visit-parents`). RFC `docs/rfcs/0004-slide-rich-content.md` status `Implemented`. **128 testes novos** distribuídos em 13 phases (T0.1 plugin contract: 13 testes; T0.2 parseSlide integration: 11 testes; T1.1 alerts: 8 testes; T2/T3/T5 schema: 25 testes; T4.1 Marpit bg: 9 testes; T6.1 Shiki: 6 testes; T7.1 Math: 7 testes; T8.1 Mermaid: 7 testes; T9.1 Emoji: 10 testes; Slide component: 32 testes). Suite total: 1174 testes verdes. Codes de erro novos: `PLUGIN_ERROR`, `PLUGIN_PEER_DEP_MISSING`, `MARPIT_BG_UNSAFE_URL`. (#TBD)
14
+ - **SlideDeck composite engine — multi-slide deck w/ navigation, presenter, fullscreen, PDF (2026-05-19)** — `@usetheo/ui/slide-deck` agora orquestra N `<Slide>` primitives com navegação completa: keyboard (←/→/Space/Home/End/Esc/F/N/Ctrl+P, com guard contra inputs/contentEditable), touch swipe (Pointer Events nativos, multi-touch filtrado, pointercancel limpo — EC-6/EC-7), hash routing bidirectional (`#/N` 1-based, via `history.replaceState` para evitar loop — EC-10), lazy initializer SSR-safe (D17/EC-5). Sub-componentes em namespace dot: `<SlideDeck.Slides>` `<SlideDeck.Controls>` `<SlideDeck.ProgressBar>` `<SlideDeck.SlideNumber>` `<SlideDeck.Thumbnails>` (IntersectionObserver lazy + EC-13 fallback) `<SlideDeck.PresenterView>` (inline panel com timer + speaker notes) `<SlideDeck.FullscreenButton>` (cross-browser API + EC-8 iOS guard) `<SlideDeck.PrintButton>` (window.print + `@page` CSS, afterprint cleanup). Transitions CSS-only (`none`/`fade`/`slide`) com timeout fallback 300ms (D16/EC-3) e respeito a `prefers-reduced-motion`. Progressive fragments via Marpit-style `*` lists (D12, contagem por regex anti-falsos-positivos em `**bold**` ou fenced code). Speaker notes via `<!-- notes: ... -->` HTML comments (D11). Aceita `slides: string | SlideDeckSlide[]` (D4); split string via mdast `thematicBreak` reusando algoritmo do Slide D12 + strip global frontmatter primeiro (D15/EC-1 — evita phantom empty slide). `useReducer` state machine com `UPDATE_TOTAL_SLIDES` que clampa `currentIndex` (EC-4). Zero peer-deps novas — reusa as 7 do Slide. Bundle isolado em `dist/slide-deck/index.js` (~48 KB com Slide vendored); barrel principal `dist/index.js` **inalterado**. RFC `docs/rfcs/0003-slide-deck.md` status `Implemented`. 160 testes específicos do SlideDeck verdes. Stories Ladle: `DefaultDeck`, `WithGfmTable`, `WithSpeakerNotes`, `WithFragments`, `WithFadeTransition`, `WithSlideTransition`, `HashRouting`, `HeadlessLayout`, `WithThumbnails`, `PresenterModeOn`, `LargeDeck` (50 slides), `EmptyDeck`, `SingleSlideDeck`, `ControlledNavigation`. (#TBD)
15
+ - **Slide engine — view-only primitive funcional (2026-05-19)** — `@usetheo/ui/slide` agora renderiza markdown + frontmatter YAML como surface temada com canvas lógico fixo (default 16:9 → 1280×720), espelhando o padrão de bundle isolado entregue pelo Whiteboard. Pipeline: `validateSlide` (async — D11) → `parseBody` (micromark + GFM) → `mdastToHast` (`allowDangerousHtml: false`) → `sanitizeHast` (`defaultSchema` sem extensões — D8, com diff de tag-count que emite `BANNED_TAG` — D13) → `hastToReact` (real React VDOM via `hast-util-to-jsx-runtime` — D9, **sem `dangerouslySetInnerHTML`**). Frontmatter YAML único (sem HTML comment syntax do Marpit — D4), validado com Zod `.strict()` (4 keys aceitos: `theme`, `lang`, `color`, `backgroundColor`). Multi-slide input (top-level `---` detectado via mdast `thematicBreak` — D12, sem false-positive em fenced code blocks) emite `MULTIPLE_SLIDES` e renderiza somente o primeiro slide. Input guards (D14): BOM strip, `aspectRatio` inválido → fallback 16:9 + `INVALID_ASPECT_RATIO`, raw frontmatter > 10 KB → `FRONTMATTER_TOO_LARGE`. Container fit (D7) via `useSlideFit` hook (algoritmo Reveal.js: `scale = clamp(min(W/cw, H/ch), minScale, maxScale)` em `ResizeObserver` callback). Dois temas built-in (`default`, `violet-forge`) via CSS variables `--theo-slide-*` layered sobre Violet Forge tokens, com `light-dark()` para dark mode automático. A11y: `<section role="region" aria-roledescription="slide" aria-label>`. Race-resistant re-parse via `versionRef` counter (EC-7). 7 markdown peer-deps são **opcionais**: `mdast-util-from-markdown`, `mdast-util-gfm`, `micromark-extension-gfm`, `mdast-util-to-hast`, `hast-util-sanitize`, `hast-util-to-jsx-runtime`, `yaml`. Bundle isolado em `dist/slide/index.js`; barrel principal `dist/index.js` **inalterado**. RFC `docs/rfcs/0002-slide.md` status `Implemented`. 12 Ladle stories: `HappyPath`, `GfmTable`, `WithFrontmatter`, `VioletForgeTheme`, `AspectFourByThree`, `MultiSlideTruncated`, `MalformedFrontmatter`, `BannedScript`, `LongContent`, `CustomComponents`, `SmallContainer`, `LargeContainer`. (#TBD)
16
+ - **Whiteboard engine — view-only primitive funcional (2026-05-18)** — `@usetheo/ui/whiteboard` agora renderiza JSON declarativo (`WhiteboardData`) como SVG com estética hand-drawn estilo Excalidraw. **Sete tipos** de elemento suportados: `rect`, `ellipse`, `diamond`, `line`, `arrow`, `text`, `freedraw`. **Pan + zoom built-in** via `viewBox` (wheel = zoom-to-cursor, mouse drag = pan, Space = hand mode, pinch touch supported). **Prop `fitOnLoad`** centra automaticamente os elementos na viewport. Schema Zod com clamps de sanidade (EC-3 `.finite()` rejeita NaN/Infinity; EC-4 `.max(20000)` em dimensões; `.max(500)` em labels; `.max(5000)` em text e points/elements). `<Whiteboard>` valida JSON em `useMemo`, dispara `onValidationError` em `useEffect` (EC-6 — nunca durante render), e cai em SVG vazio com `data-whiteboard-state="invalid"` quando o JSON falha. SSR-safe (`renderToString` produz markup estático correto). `roughjs` + `perfect-freehand` são peer-deps **opcionais**; `zod` entra em `dependencies` regulares (EC-5 opção A). Bundle isolado em `dist/whiteboard/index.js` (21.53KB ESM); barrel principal `dist/index.js` **inalterado** (320.41KB). RFC `docs/rfcs/0001-whiteboard.md` status `Implemented`. 86 testes específicos do Whiteboard verdes + 776 testes totais do projeto. Stories Ladle: `Empty`, `Flowchart`, `Architecture`, `FreedrawSketch`, `MixedAll`, `InvalidJSON`. (#TBD)
17
+ - **`scripts/validate-bundle-size.ts` ganha gate EC-1 anti-leak** — Após o check de tamanho, faz `grep` em `dist/index.js` por strings `roughjs` e `perfect-freehand`; falha o build se qualquer engine peer-dep aparecer no barrel. Previne regressões silenciosas onde uma engine vaze para o barrel principal e arraste KBs extras para todos os consumers, mesmo os que só usam shadcn primitives. Runtime-metric proof: `grep -c "roughjs\\|perfect-freehand" dist/index.js → 0` confirmado em 2026-05-18. (#TBD)
18
+ - **`scripts/sync-exports.ts` ganha `ISOLATED_SUBPATHS`** — novo array de overrides para subpaths que devem apontar para `dist/<engine>/index.js` próprio, não re-export do barrel. Detecta colisão com auto-scanned subpaths e lança Error explícito. Suporta a regra de bundle isolation por engine declarada em `CLAUDE.md > Roadmap`. Cobertura via novo `scripts/sync-exports.test.ts` (6 testes). (#TBD)
19
+ - **`tsup.config.ts` ganha multi-entry** — `entry` agora é objeto com `index` (barrel) + `whiteboard/index` (engine). External list inclui `roughjs`, `/^roughjs\//` e `perfect-freehand` para garantir que o engine bundle não vendoriza essas libs e o barrel não vaza. Build produz `dist/whiteboard/index.{js,d.ts}` ao lado de `dist/index.{js,d.ts}` sem afetar tamanho do barrel. (#TBD)
20
+ - **`zod@4.4.3` em `dependencies`** + `roughjs ^4.6.0` / `perfect-freehand ^1.2.0` em `peerDependencies` com `peerDependenciesMeta.optional=true` — engine peer-deps são opt-in para o consumer que não importa o subpath; Zod é runtime dep regular para garantir que validação não crashe (decisão EC-5 opção A documentada em `.claude/knowledge-base/reviews/edge-cases/whiteboard-view-primitive-edge-cases-2026-05-18.md`). (#TBD)
21
+
22
+ - **Roadmap formalized (2026-05-18)** — 4 future engines / composites explicitly in scope: `Whiteboard` (Excalidraw-like primitive), `Slide` (Marp-like primitive), `SlideDeck` (composite that orchestrates `Slide` primitives), `Diagram` (Mermaid-like primitive). Each is Explorer (RFC) status, multi-quarter effort, will land via individual RFCs running the full quality-gate chain. Documented in `README.md` (`## Roadmap`) and `CLAUDE.md` (`## Roadmap (formalized 2026-05-18)`) with rules in force per engine: don't reinvent algorithmic cores (markdown / DSL parsing, graph layout, freedraw rendering use mature OSS deps), bundle isolation via subpath import (not main barrel), YAGNI gate (no engine ships without a documented consumer), Apache-2.0 compatible deps only. No version commitment — not on the 0.1 / 1.0 line.
23
+
10
24
  ## [0.1.0-next.0] - 2026-05-16
11
25
 
12
26
  First public pre-release on npm under the `next` dist-tag. Install with
package/README.md CHANGED
@@ -2,18 +2,18 @@
2
2
 
3
3
  <img src="https://usetheo.dev/logo-128.webp" alt="Theo" width="96" height="96" />
4
4
 
5
- **`@usetheo/ui`**
5
+ **`@usetheo/ui`** · the **Build** (UI) auxiliary of the [Theo ecosystem](https://usetheo.dev)
6
6
 
7
7
  # The UI your agent already needs.
8
8
 
9
- A React component library built for AI agent surfaces and PaaS dashboards. **102 components** designed for what you'd otherwise build from scratch.
9
+ A React component library built for AI agent surfaces and cloud dashboards. **102 components** designed for what you'd otherwise build from scratch. The visual surface verb of **Chat. Build. Deploy.**
10
10
 
11
11
  *Editorial typography. Three runtime-swappable themes. shadcn-compatible registry. Apache-2.0.*
12
12
 
13
13
  <!-- BEGIN:counts -->
14
14
  [![license](https://img.shields.io/badge/license-Apache--2.0-7C3AED?style=flat-square)](./LICENSE)
15
15
  [![react](https://img.shields.io/badge/react-18+-7C3AED?style=flat-square&logo=react&logoColor=white)](https://react.dev)
16
- [![tests](https://img.shields.io/badge/tests-514%20passing-success?style=flat-square)](#quality-gates)
16
+ [![tests](https://img.shields.io/badge/tests-517%20passing-success?style=flat-square)](#quality-gates)
17
17
  [![components](https://img.shields.io/badge/components-101-7C3AED?style=flat-square)](#component-catalog)
18
18
  [![shadcn](https://img.shields.io/badge/shadcn-compatible-000?style=flat-square)](https://ui.shadcn.com/docs/registry)
19
19
  <!-- END:counts -->
@@ -32,7 +32,7 @@ The chat thread, the tool calls, the streaming assistant message, the model sele
32
32
 
33
33
  ## Why `@usetheo/ui`
34
34
 
35
- Most component libraries optimize for marketing pages. `@usetheo/ui` is built for the surfaces that AI agents and PaaS dashboards actually need — surfaces where transparency, density of information, and developer trust matter more than hero sections.
35
+ Most component libraries optimize for marketing pages. `@usetheo/ui` is built for the surfaces that AI agents and cloud dashboards actually need — surfaces where transparency, density of information, and developer trust matter more than hero sections.
36
36
 
37
37
  - **Built for AI agents.** Primitives for skills, cron jobs, permission matrices, MCP servers, memory editing, hook config, audit logs, model cards, token usage charts, sub-agent dispatch — the components a transparent agent UI actually needs.
38
38
  - **Built for PaaS.** Composites for project cards, deployment rows, build log streams, env var editors, domain config, preview environments, rollback flows, metrics panels.
@@ -46,7 +46,7 @@ The agent UI gap is real — most teams reach for shadcn for the primitives and
46
46
  |---|---|---|---|---|
47
47
  | Generic primitives (Button, Card, Dialog) | **Yes** (same Radix foundation) | Yes | Limited | Slow |
48
48
  | Agent-specific primitives (`AgentEvent`, `ToolCall`, `MCPServerCard`) | **Yes — 81 of them** | None | None | Weeks |
49
- | PaaS-specific composites (`DeploymentRow`, `BuildLogStream`, `RollbackUI`) | **Yes — 21 of them** | None | None | Weeks |
49
+ | cloud-specific composites (`DeploymentRow`, `BuildLogStream`, `RollbackUI`) | **Yes — 21 of them** | None | None | Weeks |
50
50
  | Three runtime-swappable themes | **Built-in** | DIY | DIY | DIY |
51
51
  | shadcn-compatible registry | **Yes** | Original | No | N/A |
52
52
  | ESM-only, tree-shake via barrel | **Yes** | Yes | Yes | DIY |
@@ -58,7 +58,7 @@ Same Radix UI underneath as shadcn — no philosophy fight. We just shipped the
58
58
 
59
59
  - **Coding assistant interface.** Chat thread, streaming assistant, tool-call timeline, file diff viewer, permission matrix, sub-agent dispatch.
60
60
  - **Agent dashboard.** Run stats, session timeline, MCP server admin, cron job scheduler, memory editor, audit log, model card, cost meter.
61
- - **PaaS dashboard.** Project switcher, deployment row, build log stream, env var editor, domain config, preview environments, rollback flows, metrics panels.
61
+ - **cloud dashboard.** Project switcher, deployment row, build log stream, env var editor, domain config, preview environments, rollback flows, metrics panels.
62
62
  - **Internal AI tools.** Quick-action chips, intent selector, system-prompt editor, skill manager, rule editor, lane board.
63
63
  - **Onboarding & auth surfaces.** Login split, social auth row, folder selector, recent folders list, project card.
64
64
 
@@ -99,10 +99,12 @@ export default function App() {
99
99
  ### Option B — copy individual components (shadcn-style)
100
100
 
101
101
  ```bash
102
- npx shadcn@latest add https://ui.usetheo.dev/r/button.json
103
- npx shadcn@latest add https://ui.usetheo.dev/r/deployment-row.json
102
+ npx shadcn@latest add https://usetheodev.github.io/theo-ui/r/button.json
103
+ npx shadcn@latest add https://usetheodev.github.io/theo-ui/r/deployment-row.json
104
104
  ```
105
105
 
106
+ > Branded `https://ui.usetheo.dev/r/*` URL will follow once the DNS CNAME is configured (single record at the registrar). Both URLs serve identical content.
107
+
106
108
  Every item under [`registry/r/`](./registry/r) is a standalone copy-paste unit with its dependencies declared.
107
109
 
108
110
  **Precondition.** Copy-paste install requires `@/` configured as a path alias in your `tsconfig.json` (`{ "paths": { "@/*": ["./src/*"] } }`) — the shadcn-ui 2.0 convention. Inlined source uses `@/lib/cn` and similar `@/components/ui/...` imports. If your project uses a different alias (Vite default `~/`, etc.), either add the `@/` mapping or rewrite the imports after copy-paste. The shipped `registry/index.json` declares this requirement under `metadata.requires.tsconfigPathAlias`.
@@ -332,10 +334,115 @@ tests/ fixture-shadcn-app/ (registry install integration test)
332
334
  Honest claims only.
333
335
 
334
336
  - **Production.** 102 components, 453 tests passing, zero a11y violations on 126 Ladle stories, bundle size enforced. Quality gates run on every PR.
335
- - **Registry distribution.** Artifacts shipped at `registry/r/*.json` in this repo; canonical `ui.usetheo.dev/r/*.json` URL is the planned distribution target.
337
+ - **Registry distribution.** Served at [`https://usetheodev.github.io/theo-ui/r/`](https://usetheodev.github.io/theo-ui/r/) (GitHub Pages, auto-deploy on every push to `main`). The branded `https://ui.usetheo.dev/r/` URL is a single DNS CNAME away — point `ui.usetheo.dev` at `usetheodev.github.io` and add it as a custom domain in Pages settings.
336
338
  - **ESM-only.** Modern bundlers only. Consumers on CommonJS Node need to transpile or use a bundler.
337
339
  - **Component count is the floor, not the ceiling.** New agent and PaaS surfaces ship through PRs; every addition runs the same quality gates.
338
340
 
341
+ ## Engines (isolated subpaths)
342
+
343
+ Engines ship as bundle-isolated subpaths — they are NOT in the main barrel (`@usetheo/ui`). Each one has its own dist file, its own optional peer-deps, and its own RFC.
344
+
345
+ ```bash
346
+ # Whiteboard — view-only renderer for JSON in Excalidraw style.
347
+ pnpm add @usetheo/ui roughjs perfect-freehand
348
+ ```
349
+
350
+ ```tsx
351
+ import { Whiteboard, type WhiteboardData } from "@usetheo/ui/whiteboard";
352
+
353
+ const scene: WhiteboardData = {
354
+ version: 1,
355
+ width: 600,
356
+ height: 400,
357
+ elements: [
358
+ { type: "rect", x: 50, y: 50, w: 120, h: 60, label: "User" },
359
+ { type: "ellipse", x: 350, y: 50, w: 120, h: 60, label: "DB" },
360
+ { type: "arrow", x: 170, y: 80, to: [350, 80], label: "query" },
361
+ ],
362
+ };
363
+
364
+ <Whiteboard data={scene} fitOnLoad />
365
+ ```
366
+
367
+ ```bash
368
+ # Slide — view-only renderer for markdown + YAML frontmatter, Marp-inspired.
369
+ pnpm add @usetheo/ui mdast-util-from-markdown mdast-util-gfm \
370
+ micromark-extension-gfm mdast-util-to-hast hast-util-sanitize \
371
+ hast-util-to-jsx-runtime yaml
372
+ ```
373
+
374
+ ```tsx
375
+ import { Slide } from "@usetheo/ui/slide";
376
+ import "@usetheo/ui/slide/themes/default.css";
377
+
378
+ const md = `---
379
+ theme: default
380
+ lang: en-US
381
+ ---
382
+
383
+ # Pull Request #142
384
+
385
+ Adds rate limiting to the public API.
386
+
387
+ - Refill rate: 100 req/sec
388
+ - Burst capacity: 200 tokens`;
389
+
390
+ <Slide markdown={md} aspectRatio="16:9" />
391
+ ```
392
+
393
+ Note: IDs generated from markdown headings are prefixed with `user-content-` by the default sanitize schema (`hast-util-sanitize` clobber protection). Consumers wanting raw anchors override via the `components` prop.
394
+
395
+ ```bash
396
+ # SlideDeck — multi-slide deck w/ navigation, presenter, fullscreen, PDF.
397
+ pnpm add @usetheo/ui mdast-util-from-markdown mdast-util-gfm \
398
+ micromark-extension-gfm mdast-util-to-hast hast-util-sanitize \
399
+ hast-util-to-jsx-runtime yaml
400
+ ```
401
+
402
+ ```tsx
403
+ import { SlideDeck } from "@usetheo/ui/slide-deck";
404
+ import "@usetheo/ui/slide/themes/default.css";
405
+
406
+ const deck = `# Welcome
407
+
408
+ A multi-slide deck.
409
+
410
+ <!-- notes: lembre da agenda -->
411
+
412
+ ---
413
+
414
+ # Navigation
415
+
416
+ Use ← / → / Space, swipe on mobile, or click thumbnails.
417
+
418
+ ---
419
+
420
+ # Done`;
421
+
422
+ <SlideDeck slides={deck} transition="fade" />
423
+ ```
424
+
425
+ | Engine | Subpath | Status | RFC |
426
+ |---|---|---|---|
427
+ | Whiteboard (view-only, JSON → SVG, Excalidraw aesthetic) | `@usetheo/ui/whiteboard` | Available | [RFC 0001](./docs/rfcs/0001-whiteboard.md) |
428
+ | Slide (view-only, markdown → themed surface, Marp-inspired) | `@usetheo/ui/slide` | Available | [RFC 0002](./docs/rfcs/0002-slide.md) |
429
+ | SlideDeck (multi-slide deck w/ navigation + presenter + fullscreen + PDF) | `@usetheo/ui/slide-deck` | Available | [RFC 0003](./docs/rfcs/0003-slide-deck.md) |
430
+ | Diagram | TBD | Roadmap | TBD |
431
+
432
+ Each engine ships behind the same gate chain (test + story + a11y + registry + bundle isolation). No version commitment for the Roadmap items — these are not on the 0.1 / 1.0 line.
433
+
434
+ ## Roadmap
435
+
436
+ The component count is the floor, not the ceiling. The next surfaces on the roadmap are creative and authoring tools — built in-house under the same quality gates, not third-party wrappers.
437
+
438
+ | Item | Type | Inspiration | Status |
439
+ |---|---|---|---|
440
+ | Slide engine | Primitive | Marp | Explorer (RFC) |
441
+ | Slide deck composite | Composite | Marp / Reveal.js | Explorer (RFC) |
442
+ | Diagram engine | Primitive | Mermaid | Explorer (RFC) |
443
+
444
+ Each engine is a multi-quarter effort and lands through an individual RFC. No version commitment yet — these are not on the 0.1 / 1.0 line. Each engine ships behind the same gate chain (test + story + a11y + registry + bundle). Names will be locked at RFC time, not before.
445
+
339
446
  ## License
340
447
 
341
448
  [Apache-2.0](./LICENSE) © [usetheo.dev](https://usetheo.dev)
package/dist/index.d.ts CHANGED
@@ -2986,7 +2986,7 @@ interface DomainConfigProps extends HTMLAttributes<HTMLDivElement> {
2986
2986
  * DomainConfig — manage custom domains for a project.
2987
2987
  *
2988
2988
  * Shows: hostname, status, TLS, primary flag, and verification DNS record when pending.
2989
- * Common in every PaaS dashboard (Vercel, Railway, Render).
2989
+ * Common in every cloud dashboard (Vercel, Railway, Render).
2990
2990
  */
2991
2991
  declare const DomainConfig: react.ForwardRefExoticComponent<DomainConfigProps & react.RefAttributes<HTMLDivElement>>;
2992
2992