@utopia-studio-design/design-system-cli 0.6.1 → 0.7.0

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 (123) hide show
  1. package/README.md +28 -10
  2. package/bin/utopia-ds-mcp.mjs +6 -2
  3. package/bin/utopia-ds.mjs +94 -21
  4. package/data/docs/arabic-friendly.md +19 -2
  5. package/data/docs/billing-setup.md +80 -0
  6. package/data/docs/cer-003-032-033-round-8-repair.md +41 -0
  7. package/data/docs/cer-007-checkout.md +51 -0
  8. package/data/docs/cer-008-011-qa-repair.md +64 -0
  9. package/data/docs/cer-016-023-round-6-repair.md +92 -0
  10. package/data/docs/cer-024-031-round-7-repair.md +51 -0
  11. package/data/docs/cer-033-035-036-round-12-repair.md +37 -0
  12. package/data/docs/cer-035-037-round-10-repair.md +34 -0
  13. package/data/docs/charts.md +34 -3
  14. package/data/docs/chat-service-methodology.md +181 -0
  15. package/data/docs/code-block.md +20 -0
  16. package/data/docs/creative-production.md +149 -0
  17. package/data/docs/designer-agent-backend-contract.md +552 -0
  18. package/data/docs/email-resend.md +29 -0
  19. package/data/docs/foundations.md +46 -8
  20. package/data/docs/guide.md +9 -9
  21. package/data/docs/handover-billing-aiden.md +132 -0
  22. package/data/docs/logo-maker-methodology.md +109 -0
  23. package/data/docs/presentation-asset-repository.md +53 -0
  24. package/data/docs/product-architecture.md +42 -0
  25. package/data/docs/quick-start-ai.md +4 -4
  26. package/data/docs/shadcn-conversion.md +1 -1
  27. package/data/docs/sidebar-placement.md +56 -0
  28. package/data/docs/theme-authoring.md +6 -3
  29. package/data/manifests/catalog.json +42 -46
  30. package/data/manifests/components.json +317 -66
  31. package/data/manifests/logo-skills.json +174 -0
  32. package/data/manifests/motion-profiles.json +2 -2
  33. package/data/manifests/patterns.json +201 -7
  34. package/data/manifests/presentation-assets.schema.json +44 -0
  35. package/data/manifests/templates.json +87 -1
  36. package/data/manifests/theme-dextrum.json +7 -7
  37. package/data/manifests/theme-prism-mono.json +19 -0
  38. package/data/manifests/theme-utopia-cloudblur.json +135 -0
  39. package/data/manifests/theme-utopia-default.json +31 -31
  40. package/data/manifests/theme-vyapti.json +17 -1
  41. package/data/manifests/theme-y2k-pop.json +18 -0
  42. package/data/manifests/themes.json +285 -57
  43. package/data/templates/analytics-dashboard/main.tsx +14 -1
  44. package/data/templates/calendar-application/main.tsx +14 -1
  45. package/data/templates/chat-workspace/README.md +12 -0
  46. package/data/templates/chat-workspace/index.html +11 -0
  47. package/data/templates/chat-workspace/main.tsx +97 -0
  48. package/data/templates/chat-workspace/styles.css +19 -0
  49. package/data/templates/chat-workspace/template.manifest.json +13 -0
  50. package/data/templates/composition-registry-lab/main.tsx +12 -1
  51. package/data/templates/dashboard-composer/main.tsx +14 -1
  52. package/data/templates/database-workspace/main.tsx +14 -1
  53. package/data/templates/interaction-lab/main.tsx +12 -1
  54. package/data/templates/quantum-verification-story/README.md +12 -0
  55. package/data/templates/quantum-verification-story/components.json +21 -0
  56. package/data/templates/quantum-verification-story/eslint.config.mjs +13 -0
  57. package/data/templates/quantum-verification-story/next-env.d.ts +7 -0
  58. package/data/templates/quantum-verification-story/next.config.mjs +11 -0
  59. package/data/templates/quantum-verification-story/package-lock.json +7535 -0
  60. package/data/templates/quantum-verification-story/package.json +46 -0
  61. package/data/templates/quantum-verification-story/postcss.config.js +6 -0
  62. package/data/templates/quantum-verification-story/src/app/assessment/page.tsx +138 -0
  63. package/data/templates/quantum-verification-story/src/app/ceramic-theme.css +48 -0
  64. package/data/templates/quantum-verification-story/src/app/deployment/page.tsx +178 -0
  65. package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Bold.ttf +0 -0
  66. package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Medium.ttf +0 -0
  67. package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Regular.ttf +0 -0
  68. package/data/templates/quantum-verification-story/src/app/fonts/ReadexPro-Variable.ttf +0 -0
  69. package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-350.ttf +0 -0
  70. package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-500.ttf +0 -0
  71. package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-700.ttf +0 -0
  72. package/data/templates/quantum-verification-story/src/app/globals.css +175 -0
  73. package/data/templates/quantum-verification-story/src/app/layout.tsx +45 -0
  74. package/data/templates/quantum-verification-story/src/app/not-found.tsx +39 -0
  75. package/data/templates/quantum-verification-story/src/app/page.tsx +24 -0
  76. package/data/templates/quantum-verification-story/src/app/products/page.tsx +132 -0
  77. package/data/templates/quantum-verification-story/src/app/utopia-default.css +312 -0
  78. package/data/templates/quantum-verification-story/src/components/RotatingText.css +36 -0
  79. package/data/templates/quantum-verification-story/src/components/RotatingText.tsx +189 -0
  80. package/data/templates/quantum-verification-story/src/components/brand-mark.tsx +14 -0
  81. package/data/templates/quantum-verification-story/src/components/console-preview-section.tsx +57 -0
  82. package/data/templates/quantum-verification-story/src/components/console-preview.tsx +72 -0
  83. package/data/templates/quantum-verification-story/src/components/fade-up.tsx +54 -0
  84. package/data/templates/quantum-verification-story/src/components/floating-network.tsx +125 -0
  85. package/data/templates/quantum-verification-story/src/components/footer.tsx +83 -0
  86. package/data/templates/quantum-verification-story/src/components/harvest-timeline.tsx +70 -0
  87. package/data/templates/quantum-verification-story/src/components/lattice-diagram.tsx +73 -0
  88. package/data/templates/quantum-verification-story/src/components/lattice-field.tsx +129 -0
  89. package/data/templates/quantum-verification-story/src/components/nav.tsx +104 -0
  90. package/data/templates/quantum-verification-story/src/components/presentation-layout.tsx +91 -0
  91. package/data/templates/quantum-verification-story/src/components/readiness-estimator.tsx +135 -0
  92. package/data/templates/quantum-verification-story/src/components/scramble-text.tsx +60 -0
  93. package/data/templates/quantum-verification-story/src/components/section-backdrop.tsx +38 -0
  94. package/data/templates/quantum-verification-story/src/components/sections/clients.tsx +140 -0
  95. package/data/templates/quantum-verification-story/src/components/sections/contact.tsx +125 -0
  96. package/data/templates/quantum-verification-story/src/components/sections/hero.tsx +92 -0
  97. package/data/templates/quantum-verification-story/src/components/sections/moat.tsx +73 -0
  98. package/data/templates/quantum-verification-story/src/components/sections/offer.tsx +113 -0
  99. package/data/templates/quantum-verification-story/src/components/sections/pilot.tsx +63 -0
  100. package/data/templates/quantum-verification-story/src/components/sections/problem.tsx +53 -0
  101. package/data/templates/quantum-verification-story/src/components/text-particle.tsx +204 -0
  102. package/data/templates/quantum-verification-story/src/components/ticker.tsx +27 -0
  103. package/data/templates/quantum-verification-story/src/components/ui/badge.tsx +29 -0
  104. package/data/templates/quantum-verification-story/src/components/ui/button.tsx +55 -0
  105. package/data/templates/quantum-verification-story/src/components/ui/card.tsx +46 -0
  106. package/data/templates/quantum-verification-story/src/components/ui/cursor-driven-particle-typography.tsx +288 -0
  107. package/data/templates/quantum-verification-story/src/components/ui/input.tsx +20 -0
  108. package/data/templates/quantum-verification-story/src/components/ui/label.tsx +21 -0
  109. package/data/templates/quantum-verification-story/src/components/ui/separator.tsx +25 -0
  110. package/data/templates/quantum-verification-story/src/components/ui/textarea.tsx +19 -0
  111. package/data/templates/quantum-verification-story/src/lib/utils.ts +6 -0
  112. package/data/templates/quantum-verification-story/tailwind.config.js +95 -0
  113. package/data/templates/quantum-verification-story/template.manifest.json +23 -0
  114. package/data/templates/quantum-verification-story/tsconfig.json +42 -0
  115. package/data/templates/saas-solution-homepage/main.tsx +91 -14
  116. package/data/templates/saas-solution-homepage/privacy/index.html +1 -0
  117. package/data/templates/saas-solution-homepage/styles.css +47 -2
  118. package/data/templates/saas-solution-homepage/team/index.html +1 -0
  119. package/data/templates/saas-solution-homepage/template.manifest.json +41 -0
  120. package/data/templates/saas-solution-homepage/terms/index.html +1 -0
  121. package/lib/api.mjs +52 -3
  122. package/lib/template-runtime.mjs +1 -0
  123. package/package.json +2 -2
@@ -0,0 +1,97 @@
1
+ import { StrictMode, useState, type FormEvent } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@utopia-studio-design/design-system/Card'
4
+ import { Button } from '@utopia-studio-design/design-system/Button'
5
+ import {
6
+ ChatComposer,
7
+ ChatComposerInput,
8
+ ChatLayout,
9
+ ChatMessage,
10
+ ChatMessageBubble,
11
+ ChatMessageList,
12
+ ChatMessageMetadata,
13
+ ChatSendButton,
14
+ ChatToolPanel,
15
+ } from '@utopia-studio-design/design-system/Chat'
16
+ import '@utopia-studio-design/design-system/core.css'
17
+ import '@utopia-studio-design/design-system/themes/utopia-default.css'
18
+ import './styles.css'
19
+
20
+ type Message = { id: string; role: 'assistant' | 'user'; text: string }
21
+
22
+ const initialMessages: Message[] = [
23
+ { id: 'opening', role: 'assistant', text: 'What are you trying to accomplish, and what evidence should I use?' },
24
+ ]
25
+
26
+ function App() {
27
+ const [messages, setMessages] = useState(initialMessages)
28
+ const [draft, setDraft] = useState('')
29
+ const [direction, setDirection] = useState<'ltr' | 'rtl'>('ltr')
30
+
31
+ const send = (event: FormEvent) => {
32
+ event.preventDefault()
33
+ const text = draft.trim()
34
+ if (!text) return
35
+ const id = `message-${Date.now()}`
36
+ setMessages((current) => [
37
+ ...current,
38
+ { id, role: 'user', text },
39
+ { id: `${id}-reply`, role: 'assistant', text: 'I added that context. The generated result would update in the output rail.' },
40
+ ])
41
+ setDraft('')
42
+ }
43
+
44
+ return (
45
+ <main className="chat-workspace-template" dir={direction} id="main-content">
46
+ <header className="chat-workspace-template__header">
47
+ <div><strong>Ceramic chat workspace</strong><span>Managed conversation template</span></div>
48
+ <Button onClick={() => setDirection((current) => current === 'ltr' ? 'rtl' : 'ltr')} size="sm" type="button" variant="outline">
49
+ {direction === 'ltr' ? 'Test RTL' : 'Test LTR'}
50
+ </Button>
51
+ </header>
52
+ <section className="chat-workspace-template__layout">
53
+ <Card className="chat-workspace-template__conversation">
54
+ <CardHeader><div><CardTitle>Working session</CardTitle><CardDescription>Input and governed tools stay in conversation.</CardDescription></div></CardHeader>
55
+ <CardContent>
56
+ <ChatLayout
57
+ density="compact"
58
+ jumpToLatestLabel="Jump to latest message"
59
+ messagesLabel="Example conversation"
60
+ scrollMode="managed"
61
+ messages={
62
+ <ChatMessageList>
63
+ {messages.map((message) => (
64
+ <ChatMessage anchor={message.role === 'user'} key={message.id} messageId={message.id} role={message.role}>
65
+ <ChatMessageBubble role={message.role}>{message.text}</ChatMessageBubble>
66
+ <ChatMessageMetadata>{message.role === 'assistant' ? 'Assistant' : 'You'}</ChatMessageMetadata>
67
+ </ChatMessage>
68
+ ))}
69
+ <ChatMessage role="assistant">
70
+ <ChatToolPanel count="15K" description="Search and add evidence without leaving the conversation." title="Reference library">
71
+ <p>This area accepts product-owned search, selection, connection, or approval controls.</p>
72
+ </ChatToolPanel>
73
+ </ChatMessage>
74
+ </ChatMessageList>
75
+ }
76
+ composer={
77
+ <ChatComposer
78
+ actions={<ChatSendButton disabled={!draft.trim()} label="Send message" />}
79
+ onSubmit={send}
80
+ toolbarStart={<Button aria-label="Add attachment" isIconOnly size="sm" type="button" variant="ghost"><span aria-hidden="true">+</span></Button>}
81
+ >
82
+ <ChatComposerInput aria-label="Message" onChange={(event) => setDraft(event.target.value)} placeholder="Message Ceramic…" value={draft} />
83
+ </ChatComposer>
84
+ }
85
+ />
86
+ </CardContent>
87
+ </Card>
88
+ <aside className="chat-workspace-template__output" aria-labelledby="output-title">
89
+ <h2 id="output-title">Output</h2>
90
+ <p>Generated previews and durable artifacts appear here after a real run.</p>
91
+ </aside>
92
+ </section>
93
+ </main>
94
+ )
95
+ }
96
+
97
+ createRoot(document.getElementById('root')!).render(<StrictMode><App /></StrictMode>)
@@ -0,0 +1,19 @@
1
+ * { box-sizing: border-box; }
2
+ html, body, #root { min-block-size: 100%; margin: 0; }
3
+ body { background: var(--background); color: var(--foreground); font-family: var(--font-sans); }
4
+ .chat-workspace-template { display: grid; grid-template-rows: auto minmax(0, 1fr); min-block-size: 100dvh; padding: var(--space-4); }
5
+ .chat-workspace-template__header { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); border-block-end: var(--border-width-hairline) solid var(--border); padding: var(--space-3); }
6
+ .chat-workspace-template__header > div { display: grid; gap: var(--space-1); }
7
+ .chat-workspace-template__header span, .chat-workspace-template__output p { color: var(--foreground-subtle); font-size: var(--font-size-workspace-label); }
8
+ .chat-workspace-template__layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(var(--sidebar-width), .34fr); min-block-size: 0; overflow: hidden; }
9
+ .chat-workspace-template__conversation.uds-card { display: grid; grid-template-rows: auto minmax(0, 1fr); min-block-size: 0; border: 0; border-radius: 0; box-shadow: none; padding: 0; overflow: hidden; }
10
+ .chat-workspace-template__conversation > .uds-card-header { border-block-end: var(--border-width-hairline) solid var(--border); padding: var(--workspace-panel-padding); }
11
+ .chat-workspace-template__conversation > .uds-card-content { min-block-size: 0; padding: 0; overflow: hidden; }
12
+ .chat-workspace-template__output { border-inline-start: var(--border-width-hairline) solid var(--border); background: var(--surface-elevated); padding: var(--workspace-panel-padding); }
13
+ .chat-workspace-template__output :is(h2, p), .uds-chat-tool-panel-content p { margin: 0; }
14
+ .chat-workspace-template__output { display: grid; align-content: start; gap: var(--space-2); }
15
+ @media (max-width: 48rem) {
16
+ .chat-workspace-template { padding: 0; }
17
+ .chat-workspace-template__layout { grid-template-columns: 1fr; grid-template-rows: minmax(calc(var(--space-24) * 5), 1fr) auto; overflow: visible; }
18
+ .chat-workspace-template__output { border-block-start: var(--border-width-hairline) solid var(--border); border-inline-start: 0; }
19
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "chat-workspace",
3
+ "title": "Chat Workspace",
4
+ "status": "available",
5
+ "route": "/templates/chat-workspace/",
6
+ "entry": "templates/chat-workspace/main.tsx",
7
+ "components": ["ChatLayout", "ChatMessageScroller", "ChatMessage", "ChatMessageBubble", "ChatToolPanel", "ChatComposer"],
8
+ "states": ["empty", "ready", "streaming", "offscreen-update", "error"],
9
+ "themes": ["utopia-default"],
10
+ "directions": ["ltr", "rtl"],
11
+ "responsiveMinimum": "320px"
12
+ }
13
+
@@ -9,10 +9,21 @@ import {
9
9
  } from '@utopia-studio-design/design-system/Composition'
10
10
  import '@utopia-studio-design/design-system/core.css'
11
11
  import '@utopia-studio-design/design-system/themes/utopia-default.css'
12
+ import '@utopia-studio-design/design-system/themes/dextrum.css'
13
+ import '@utopia-studio-design/design-system/themes/barrier-intelligence.css'
14
+ import '@utopia-studio-design/design-system/themes/renacore.css'
15
+ import '@utopia-studio-design/design-system/themes/vyapti.css'
16
+ import '@utopia-studio-design/design-system/themes/utopia-cloudblur.css'
12
17
  import sampleLayout from './sample-layout.json'
13
18
  import './styles.css'
14
19
 
15
- const activeTheme = 'utopia-default'
20
+ const supportedThemes = ['utopia-default', 'dextrum', 'barrier-intelligence', 'renacore', 'vyapti', 'utopia-cloudblur'] as const
21
+ type TemplateTheme = (typeof supportedThemes)[number]
22
+ const defaultTheme: TemplateTheme = 'utopia-default'
23
+ const requestedTheme = new URLSearchParams(window.location.search).get('theme') as TemplateTheme | null
24
+ const activeTheme: TemplateTheme = requestedTheme && supportedThemes.includes(requestedTheme) ? requestedTheme : defaultTheme
25
+ document.documentElement.dataset.theme = activeTheme
26
+ document.documentElement.dataset.brand = activeTheme
16
27
  const layout = sampleLayout as CeramicLayoutDocument
17
28
  type LayoutBlockStyle = CSSProperties & {
18
29
  '--layout-column': number
@@ -47,6 +47,11 @@ import {
47
47
  } from './RegistryDataBlocks'
48
48
  import '@utopia-studio-design/design-system/core.css'
49
49
  import '@utopia-studio-design/design-system/themes/utopia-default.css'
50
+ import '@utopia-studio-design/design-system/themes/dextrum.css'
51
+ import '@utopia-studio-design/design-system/themes/barrier-intelligence.css'
52
+ import '@utopia-studio-design/design-system/themes/renacore.css'
53
+ import '@utopia-studio-design/design-system/themes/vyapti.css'
54
+ import '@utopia-studio-design/design-system/themes/utopia-cloudblur.css'
50
55
  import './agent-status.css'
51
56
  import './activity-feed.css'
52
57
  import './analytics-dashboard.css'
@@ -55,6 +60,14 @@ import './dashboard-composer.css'
55
60
  import initialLayoutDocument from './sample-layout.json'
56
61
  import './styles.css'
57
62
 
63
+ const supportedThemes = ['utopia-default', 'dextrum', 'barrier-intelligence', 'renacore', 'vyapti', 'utopia-cloudblur'] as const
64
+ type TemplateTheme = (typeof supportedThemes)[number]
65
+ const defaultTheme: TemplateTheme = 'utopia-default'
66
+ const requestedTheme = new URLSearchParams(window.location.search).get('theme') as TemplateTheme | null
67
+ const activeTheme: TemplateTheme = requestedTheme && supportedThemes.includes(requestedTheme) ? requestedTheme : defaultTheme
68
+ document.documentElement.dataset.theme = activeTheme
69
+ document.documentElement.dataset.brand = activeTheme
70
+
58
71
  const initialLayout = initialLayoutDocument as CeramicLayoutDocument
59
72
  const anchorDate = new Date(2026, 2, 9, 12)
60
73
 
@@ -450,7 +463,7 @@ function App() {
450
463
  <main
451
464
  className="dashboard-composer-template"
452
465
  data-color-mode={dark ? 'dark' : 'light'}
453
- data-theme="utopia-default"
466
+ data-theme={activeTheme}
454
467
  dir={direction}
455
468
  id="main-content"
456
469
  >
@@ -17,9 +17,22 @@ import {
17
17
  } from './DatabaseWorkspaceBlocks'
18
18
  import '@utopia-studio-design/design-system/core.css'
19
19
  import '@utopia-studio-design/design-system/themes/utopia-default.css'
20
+ import '@utopia-studio-design/design-system/themes/dextrum.css'
21
+ import '@utopia-studio-design/design-system/themes/barrier-intelligence.css'
22
+ import '@utopia-studio-design/design-system/themes/renacore.css'
23
+ import '@utopia-studio-design/design-system/themes/vyapti.css'
24
+ import '@utopia-studio-design/design-system/themes/utopia-cloudblur.css'
20
25
  import './database-workspace.css'
21
26
  import './styles.css'
22
27
 
28
+ const supportedThemes = ['utopia-default', 'dextrum', 'barrier-intelligence', 'renacore', 'vyapti', 'utopia-cloudblur'] as const
29
+ type TemplateTheme = (typeof supportedThemes)[number]
30
+ const defaultTheme: TemplateTheme = 'utopia-default'
31
+ const requestedTheme = new URLSearchParams(window.location.search).get('theme') as TemplateTheme | null
32
+ const activeTheme: TemplateTheme = requestedTheme && supportedThemes.includes(requestedTheme) ? requestedTheme : defaultTheme
33
+ document.documentElement.dataset.theme = activeTheme
34
+ document.documentElement.dataset.brand = activeTheme
35
+
23
36
  const schema: DatabaseSchema = {
24
37
  id: 'product-work',
25
38
  title: 'Product work',
@@ -143,7 +156,7 @@ function App() {
143
156
  <main
144
157
  className="database-template"
145
158
  data-color-mode={dark ? 'dark' : 'light'}
146
- data-theme="utopia-default"
159
+ data-theme={activeTheme}
147
160
  dir="ltr"
148
161
  id="main-content"
149
162
  >
@@ -5,9 +5,20 @@ import { useControllableState } from '@utopia-studio-design/design-system/Intera
5
5
  import { InteractionWorkbench } from './InteractionWorkbench'
6
6
  import '@utopia-studio-design/design-system/core.css'
7
7
  import '@utopia-studio-design/design-system/themes/utopia-default.css'
8
+ import '@utopia-studio-design/design-system/themes/dextrum.css'
9
+ import '@utopia-studio-design/design-system/themes/barrier-intelligence.css'
10
+ import '@utopia-studio-design/design-system/themes/renacore.css'
11
+ import '@utopia-studio-design/design-system/themes/vyapti.css'
12
+ import '@utopia-studio-design/design-system/themes/utopia-cloudblur.css'
8
13
  import './styles.css'
9
14
 
10
- const activeTheme = 'utopia-default'
15
+ const supportedThemes = ['utopia-default', 'dextrum', 'barrier-intelligence', 'renacore', 'vyapti', 'utopia-cloudblur'] as const
16
+ type TemplateTheme = (typeof supportedThemes)[number]
17
+ const defaultTheme: TemplateTheme = 'utopia-default'
18
+ const requestedTheme = new URLSearchParams(window.location.search).get('theme') as TemplateTheme | null
19
+ const activeTheme: TemplateTheme = requestedTheme && supportedThemes.includes(requestedTheme) ? requestedTheme : defaultTheme
20
+ document.documentElement.dataset.theme = activeTheme
21
+ document.documentElement.dataset.brand = activeTheme
11
22
 
12
23
  function StateContractProbe() {
13
24
  const [ownedValue, setOwnedValue] = useState('idle')
@@ -0,0 +1,12 @@
1
+ # Quantum Verification Story
2
+
3
+ Code-level Next.js + shadcn template adapted from the local `vy3` Vercel project.
4
+
5
+ It preserves the full-height presentation rhythm of the deployed site while replacing the original identity with `Your Company` and a theme-driven neutral mark. `src/app/ceramic-theme.css` maps the selected Ceramic theme into the shadcn and presentation variables.
6
+
7
+ ```sh
8
+ npm install
9
+ npm run dev
10
+ ```
11
+
12
+ Set `NEXT_PUBLIC_CONSOLE_URL` only when a reviewed product console is available. Replace brand placeholders and review seeded claims before production use.
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "new-york",
4
+ "rsc": true,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "tailwind.config.ts",
8
+ "css": "src/app/globals.css",
9
+ "baseColor": "zinc",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "iconLibrary": "radix",
14
+ "aliases": {
15
+ "components": "@/components",
16
+ "utils": "@/lib/utils"
17
+ },
18
+ "registries": {
19
+ "@componentry": "https://componentry.fun/r/{name}.json"
20
+ }
21
+ }
@@ -0,0 +1,13 @@
1
+ import { defineConfig, globalIgnores } from 'eslint/config'
2
+ import nextVitals from 'eslint-config-next/core-web-vitals'
3
+ import nextTypeScript from 'eslint-config-next/typescript'
4
+
5
+ export default defineConfig([
6
+ ...nextVitals,
7
+ ...nextTypeScript,
8
+ {
9
+ files: ['tailwind.config.js'],
10
+ rules: { '@typescript-eslint/no-require-imports': 'off' },
11
+ },
12
+ globalIgnores(['.next/**', 'out/**', 'next-env.d.ts']),
13
+ ])
@@ -0,0 +1,7 @@
1
+ /// <reference types="next" />
2
+ /// <reference types="next/image-types/global" />
3
+ import "./.next/types/routes.d.ts";
4
+ import "./.next/types/root-params.d.ts";
5
+
6
+ // NOTE: This file should not be edited
7
+ // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
@@ -0,0 +1,11 @@
1
+ const previewBasePath = process.env.CERAMIC_PREVIEW_BASE_PATH ?? ''
2
+
3
+ /** @type {import('next').NextConfig} */
4
+ const nextConfig = {
5
+ output: 'export',
6
+ trailingSlash: true,
7
+ basePath: previewBasePath,
8
+ assetPrefix: previewBasePath || undefined,
9
+ }
10
+
11
+ export default nextConfig