@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
@@ -8,8 +8,8 @@
8
8
  "class-variance-authority"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -5,8 +5,8 @@
5
5
  "title": "BuildLogStream",
6
6
  "description": "Terminal-like log viewer with timestamps + level coloring.",
7
7
  "registryDependencies": [
8
- "cn",
9
- "tailwind-preset"
8
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
9
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
10
10
  ],
11
11
  "files": [
12
12
  {
@@ -9,8 +9,8 @@
9
9
  "class-variance-authority"
10
10
  ],
11
11
  "registryDependencies": [
12
- "cn",
13
- "tailwind-preset"
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -8,9 +8,9 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset",
13
- "types"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
13
+ "https://usetheodev.github.io/theo-ui/r/types.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -8,8 +8,8 @@
8
8
  "@radix-ui/react-slot"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -8,9 +8,9 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "button",
12
- "cn",
13
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/button.json",
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -6,9 +6,9 @@
6
6
  "description": "Single chat turn rendered as user bubble, assistant card, or system callout with accent border.",
7
7
  "dependencies": [],
8
8
  "registryDependencies": [
9
- "chat-types",
10
- "cn",
11
- "tailwind-preset"
9
+ "https://usetheodev.github.io/theo-ui/r/chat-types.json",
10
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
11
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
12
12
  ],
13
13
  "files": [
14
14
  {
@@ -6,8 +6,8 @@
6
6
  "description": "Simple vertical container that applies spacing + scroll.",
7
7
  "dependencies": [],
8
8
  "registryDependencies": [
9
- "cn",
10
- "tailwind-preset"
9
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
10
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
11
11
  ],
12
12
  "files": [
13
13
  {
@@ -9,8 +9,8 @@
9
9
  "lucide-react"
10
10
  ],
11
11
  "registryDependencies": [
12
- "cn",
13
- "tailwind-preset"
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -9,10 +9,10 @@
9
9
  "lucide-react"
10
10
  ],
11
11
  "registryDependencies": [
12
- "cn",
13
- "dialog",
14
- "tailwind-preset",
15
- "types"
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/dialog.json",
14
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
15
+ "https://usetheodev.github.io/theo-ui/r/types.json"
16
16
  ],
17
17
  "files": [
18
18
  {
@@ -8,9 +8,9 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset",
13
- "types"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
13
+ "https://usetheodev.github.io/theo-ui/r/types.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -6,8 +6,8 @@
6
6
  "description": "Shows how much of the model's context window has been",
7
7
  "dependencies": [],
8
8
  "registryDependencies": [
9
- "cn",
10
- "tailwind-preset"
9
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
10
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
11
11
  ],
12
12
  "files": [
13
13
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -8,9 +8,9 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset",
13
- "types"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
13
+ "https://usetheodev.github.io/theo-ui/r/types.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -8,9 +8,9 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "cron-job-card",
13
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/cron-job-card.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -8,9 +8,9 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "badge",
12
- "cn",
13
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/badge.json",
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -9,8 +9,8 @@
9
9
  "lucide-react"
10
10
  ],
11
11
  "registryDependencies": [
12
- "cn",
13
- "tailwind-preset"
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -6,8 +6,8 @@
6
6
  "description": "Unified diff rendering, no external dep.",
7
7
  "dependencies": [],
8
8
  "registryDependencies": [
9
- "cn",
10
- "tailwind-preset"
9
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
10
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
11
11
  ],
12
12
  "files": [
13
13
  {
@@ -8,18 +8,18 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "badge",
12
- "button",
13
- "cn",
14
- "input",
15
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/badge.json",
12
+ "https://usetheodev.github.io/theo-ui/r/button.json",
13
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
14
+ "https://usetheodev.github.io/theo-ui/r/input.json",
15
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
16
16
  ],
17
17
  "files": [
18
18
  {
19
19
  "path": "components/composites/domain-config/domain-config.tsx",
20
20
  "type": "registry:block",
21
21
  "target": "components/blocks/domain-config.tsx",
22
- "content": "import { Check, Globe, Plus, ShieldCheck, ShieldX, Trash2 } from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\n\nexport type DomainStatus = \"verified\" | \"pending\" | \"invalid\";\n\nexport interface Domain {\n id: string;\n hostname: string;\n status: DomainStatus;\n primary?: boolean;\n /**\n * TLS state. If true, certificate is provisioned & valid.\n */\n tls?: boolean;\n /**\n * DNS record the user must add to verify ownership.\n */\n verificationRecord?: {\n type: \"TXT\" | \"CNAME\" | \"A\";\n name: string;\n value: string;\n };\n}\n\nconst statusVariant: Record<DomainStatus, \"success\" | \"warning\" | \"destructive\"> = {\n verified: \"success\",\n pending: \"warning\",\n invalid: \"destructive\",\n};\nconst statusDot: Record<DomainStatus, \"success\" | \"warning\" | \"destructive\"> = {\n verified: \"success\",\n pending: \"warning\",\n invalid: \"destructive\",\n};\nconst statusLabel: Record<DomainStatus, string> = {\n verified: \"Verified\",\n pending: \"Pending DNS\",\n invalid: \"Invalid\",\n};\n\ninterface DomainConfigProps extends HTMLAttributes<HTMLDivElement> {\n domains: Domain[];\n onAdd?: (hostname: string) => void;\n onRemove?: (id: string) => void;\n onSetPrimary?: (id: string) => void;\n}\n\n/**\n * DomainConfig — manage custom domains for a project.\n *\n * Shows: hostname, status, TLS, primary flag, and verification DNS record when pending.\n * Common in every PaaS dashboard (Vercel, Railway, Render).\n */\nconst DomainConfig = forwardRef<HTMLDivElement, DomainConfigProps>(\n ({ className, domains, onAdd, onRemove, onSetPrimary, ...props }, ref) => {\n const [hostname, setHostname] = useState(\"\");\n\n return (\n <div\n ref={ref}\n className={cn(\"rounded-xl border bg-card p-5 shadow-sm\", className)}\n {...props}\n >\n <header className=\"mb-4 flex items-baseline justify-between gap-3\">\n <div>\n <h3 className=\"font-display text-title-md tracking-tight\">Domains</h3>\n <p className=\"text-body-sm text-muted-foreground\">{domains.length} configured</p>\n </div>\n </header>\n\n {onAdd ? (\n <form\n className=\"mb-4 grid grid-cols-[1fr_auto] gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n const v = hostname.trim();\n if (!v) return;\n onAdd(v);\n setHostname(\"\");\n }}\n >\n <Input\n placeholder=\"api.acme.com\"\n value={hostname}\n onChange={(e) => setHostname(e.target.value)}\n aria-label=\"Hostname\"\n className=\"font-mono\"\n />\n <Button type=\"submit\">\n <Plus /> Add domain\n </Button>\n </form>\n ) : null}\n\n <ul className=\"grid gap-3\">\n {domains.map((d) => (\n <li key={d.id} className=\"grid gap-3 rounded-lg border border-border/40 p-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Globe className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"font-mono text-code-md text-foreground\">{d.hostname}</span>\n <Badge variant={statusVariant[d.status]}>\n <Badge.Dot tone={statusDot[d.status]} pulse={d.status === \"pending\"} />\n {statusLabel[d.status]}\n </Badge>\n {d.tls === true ? (\n <Badge variant=\"primary\">\n <ShieldCheck className=\"size-3\" /> TLS\n </Badge>\n ) : d.tls === false ? (\n <Badge variant=\"destructive\">\n <ShieldX className=\"size-3\" /> No TLS\n </Badge>\n ) : null}\n {d.primary ? (\n <Badge variant=\"accent\">\n <Check className=\"size-3\" /> Primary\n </Badge>\n ) : null}\n <div className=\"ml-auto flex items-center gap-1\">\n {!d.primary && onSetPrimary ? (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => onSetPrimary(d.id)}>\n Set primary\n </Button>\n ) : null}\n {onRemove ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => onRemove(d.id)}\n aria-label={`Remove ${d.hostname}`}\n >\n <Trash2 />\n </Button>\n ) : null}\n </div>\n </div>\n {d.status === \"pending\" && d.verificationRecord ? (\n <div className=\"rounded-md border border-border/60 border-dashed bg-muted/30 p-3 font-mono text-code-sm\">\n <p className=\"mb-2 font-sans text-label-caps text-muted-foreground uppercase\">\n Add this DNS record to verify\n </p>\n <div className=\"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1\">\n <span className=\"text-muted-foreground\">type</span>\n <span>{d.verificationRecord.type}</span>\n <span className=\"text-muted-foreground\">name</span>\n <span>{d.verificationRecord.name}</span>\n <span className=\"text-muted-foreground\">value</span>\n <span className=\"break-all\">{d.verificationRecord.value}</span>\n </div>\n </div>\n ) : null}\n </li>\n ))}\n {domains.length === 0 ? (\n <li className=\"rounded-lg border border-border/40 border-dashed p-8 text-center text-body-sm text-muted-foreground\">\n No domains yet. Add one to route traffic to this project.\n </li>\n ) : null}\n </ul>\n </div>\n );\n },\n);\nDomainConfig.displayName = \"DomainConfig\";\n\nexport { DomainConfig };\n"
22
+ "content": "import { Check, Globe, Plus, ShieldCheck, ShieldX, Trash2 } from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\n\nexport type DomainStatus = \"verified\" | \"pending\" | \"invalid\";\n\nexport interface Domain {\n id: string;\n hostname: string;\n status: DomainStatus;\n primary?: boolean;\n /**\n * TLS state. If true, certificate is provisioned & valid.\n */\n tls?: boolean;\n /**\n * DNS record the user must add to verify ownership.\n */\n verificationRecord?: {\n type: \"TXT\" | \"CNAME\" | \"A\";\n name: string;\n value: string;\n };\n}\n\nconst statusVariant: Record<DomainStatus, \"success\" | \"warning\" | \"destructive\"> = {\n verified: \"success\",\n pending: \"warning\",\n invalid: \"destructive\",\n};\nconst statusDot: Record<DomainStatus, \"success\" | \"warning\" | \"destructive\"> = {\n verified: \"success\",\n pending: \"warning\",\n invalid: \"destructive\",\n};\nconst statusLabel: Record<DomainStatus, string> = {\n verified: \"Verified\",\n pending: \"Pending DNS\",\n invalid: \"Invalid\",\n};\n\ninterface DomainConfigProps extends HTMLAttributes<HTMLDivElement> {\n domains: Domain[];\n onAdd?: (hostname: string) => void;\n onRemove?: (id: string) => void;\n onSetPrimary?: (id: string) => void;\n}\n\n/**\n * DomainConfig — manage custom domains for a project.\n *\n * Shows: hostname, status, TLS, primary flag, and verification DNS record when pending.\n * Common in every cloud dashboard (Vercel, Railway, Render).\n */\nconst DomainConfig = forwardRef<HTMLDivElement, DomainConfigProps>(\n ({ className, domains, onAdd, onRemove, onSetPrimary, ...props }, ref) => {\n const [hostname, setHostname] = useState(\"\");\n\n return (\n <div\n ref={ref}\n className={cn(\"rounded-xl border bg-card p-5 shadow-sm\", className)}\n {...props}\n >\n <header className=\"mb-4 flex items-baseline justify-between gap-3\">\n <div>\n <h3 className=\"font-display text-title-md tracking-tight\">Domains</h3>\n <p className=\"text-body-sm text-muted-foreground\">{domains.length} configured</p>\n </div>\n </header>\n\n {onAdd ? (\n <form\n className=\"mb-4 grid grid-cols-[1fr_auto] gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n const v = hostname.trim();\n if (!v) return;\n onAdd(v);\n setHostname(\"\");\n }}\n >\n <Input\n placeholder=\"api.acme.com\"\n value={hostname}\n onChange={(e) => setHostname(e.target.value)}\n aria-label=\"Hostname\"\n className=\"font-mono\"\n />\n <Button type=\"submit\">\n <Plus /> Add domain\n </Button>\n </form>\n ) : null}\n\n <ul className=\"grid gap-3\">\n {domains.map((d) => (\n <li key={d.id} className=\"grid gap-3 rounded-lg border border-border/40 p-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Globe className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"font-mono text-code-md text-foreground\">{d.hostname}</span>\n <Badge variant={statusVariant[d.status]}>\n <Badge.Dot tone={statusDot[d.status]} pulse={d.status === \"pending\"} />\n {statusLabel[d.status]}\n </Badge>\n {d.tls === true ? (\n <Badge variant=\"primary\">\n <ShieldCheck className=\"size-3\" /> TLS\n </Badge>\n ) : d.tls === false ? (\n <Badge variant=\"destructive\">\n <ShieldX className=\"size-3\" /> No TLS\n </Badge>\n ) : null}\n {d.primary ? (\n <Badge variant=\"accent\">\n <Check className=\"size-3\" /> Primary\n </Badge>\n ) : null}\n <div className=\"ml-auto flex items-center gap-1\">\n {!d.primary && onSetPrimary ? (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => onSetPrimary(d.id)}>\n Set primary\n </Button>\n ) : null}\n {onRemove ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => onRemove(d.id)}\n aria-label={`Remove ${d.hostname}`}\n >\n <Trash2 />\n </Button>\n ) : null}\n </div>\n </div>\n {d.status === \"pending\" && d.verificationRecord ? (\n <div className=\"rounded-md border border-border/60 border-dashed bg-muted/30 p-3 font-mono text-code-sm\">\n <p className=\"mb-2 font-sans text-label-caps text-muted-foreground uppercase\">\n Add this DNS record to verify\n </p>\n <div className=\"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1\">\n <span className=\"text-muted-foreground\">type</span>\n <span>{d.verificationRecord.type}</span>\n <span className=\"text-muted-foreground\">name</span>\n <span>{d.verificationRecord.name}</span>\n <span className=\"text-muted-foreground\">value</span>\n <span className=\"break-all\">{d.verificationRecord.value}</span>\n </div>\n </div>\n ) : null}\n </li>\n ))}\n {domains.length === 0 ? (\n <li className=\"rounded-lg border border-border/40 border-dashed p-8 text-center text-body-sm text-muted-foreground\">\n No domains yet. Add one to route traffic to this project.\n </li>\n ) : null}\n </ul>\n </div>\n );\n },\n);\nDomainConfig.displayName = \"DomainConfig\";\n\nexport { DomainConfig };\n"
23
23
  }
24
24
  ]
25
25
  }
@@ -5,9 +5,9 @@
5
5
  "title": "EmptyState",
6
6
  "description": "Visual placeholder for empty lists / first-run screens.",
7
7
  "registryDependencies": [
8
- "cn",
9
- "tailwind-preset",
10
- "types"
8
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
9
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
10
+ "https://usetheodev.github.io/theo-ui/r/types.json"
11
11
  ],
12
12
  "files": [
13
13
  {
@@ -8,11 +8,11 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "badge",
12
- "button",
13
- "cn",
14
- "input",
15
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/badge.json",
12
+ "https://usetheodev.github.io/theo-ui/r/button.json",
13
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
14
+ "https://usetheodev.github.io/theo-ui/r/input.json",
15
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
16
16
  ],
17
17
  "files": [
18
18
  {
@@ -8,9 +8,9 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset",
13
- "types"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
13
+ "https://usetheodev.github.io/theo-ui/r/types.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -9,8 +9,8 @@
9
9
  "lucide-react"
10
10
  ],
11
11
  "registryDependencies": [
12
- "cn",
13
- "tailwind-preset"
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -5,8 +5,8 @@
5
5
  "title": "Input",
6
6
  "description": "Text input primitive with focus ring, error state, and form-field composition support.",
7
7
  "registryDependencies": [
8
- "cn",
9
- "tailwind-preset"
8
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
9
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
10
10
  ],
11
11
  "files": [
12
12
  {
@@ -9,9 +9,9 @@
9
9
  "lucide-react"
10
10
  ],
11
11
  "registryDependencies": [
12
- "cn",
13
- "tailwind-preset",
14
- "types"
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
14
+ "https://usetheodev.github.io/theo-ui/r/types.json"
15
15
  ],
16
16
  "files": [
17
17
  {
@@ -8,8 +8,8 @@
8
8
  "@radix-ui/react-label"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -6,8 +6,8 @@
6
6
  "description": "Kanban-style task board with 4 lanes matching the claw-code",
7
7
  "dependencies": [],
8
8
  "registryDependencies": [
9
- "cn",
10
- "tailwind-preset"
9
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
10
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
11
11
  ],
12
12
  "files": [
13
13
  {
@@ -6,8 +6,8 @@
6
6
  "description": "50/50 split shell for authentication screens — form pane on the left, illustration on the right.",
7
7
  "dependencies": [],
8
8
  "registryDependencies": [
9
- "cn",
10
- "tailwind-preset"
9
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
10
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
11
11
  ],
12
12
  "files": [
13
13
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -8,9 +8,9 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "mcp-server-card",
13
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/mcp-server-card.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -8,9 +8,9 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset",
13
- "types"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
13
+ "https://usetheodev.github.io/theo-ui/r/types.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -8,9 +8,9 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset",
13
- "types"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
13
+ "https://usetheodev.github.io/theo-ui/r/types.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -8,9 +8,9 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset",
13
- "types"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
13
+ "https://usetheodev.github.io/theo-ui/r/types.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -9,8 +9,8 @@
9
9
  "lucide-react"
10
10
  ],
11
11
  "registryDependencies": [
12
- "cn",
13
- "tailwind-preset"
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -8,10 +8,10 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "button",
12
- "dialog",
13
- "permission-types",
14
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/button.json",
12
+ "https://usetheodev.github.io/theo-ui/r/dialog.json",
13
+ "https://usetheodev.github.io/theo-ui/r/permission-types.json",
14
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
15
15
  ],
16
16
  "files": [
17
17
  {
@@ -8,11 +8,11 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "badge",
12
- "cn",
13
- "deployment-row",
14
- "safe-href",
15
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/badge.json",
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/deployment-row.json",
14
+ "https://usetheodev.github.io/theo-ui/r/safe-href.json",
15
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
16
16
  ],
17
17
  "files": [
18
18
  {
@@ -6,9 +6,9 @@
6
6
  "description": "Browser preview with controls + integrated logs slot.",
7
7
  "dependencies": [],
8
8
  "registryDependencies": [
9
- "browser-controls",
10
- "cn",
11
- "tailwind-preset"
9
+ "https://usetheodev.github.io/theo-ui/r/browser-controls.json",
10
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
11
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
12
12
  ],
13
13
  "files": [
14
14
  {