@utopia-studio-design/design-system-cli 0.6.2 → 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.
- package/README.md +28 -14
- package/bin/utopia-ds-mcp.mjs +6 -2
- package/bin/utopia-ds.mjs +94 -21
- package/data/docs/arabic-friendly.md +19 -2
- package/data/docs/billing-setup.md +80 -0
- package/data/docs/cer-003-032-033-round-8-repair.md +41 -0
- package/data/docs/cer-007-checkout.md +51 -0
- package/data/docs/cer-008-011-qa-repair.md +64 -0
- package/data/docs/cer-016-023-round-6-repair.md +92 -0
- package/data/docs/cer-024-031-round-7-repair.md +51 -0
- package/data/docs/cer-033-035-036-round-12-repair.md +37 -0
- package/data/docs/cer-035-037-round-10-repair.md +34 -0
- package/data/docs/charts.md +34 -3
- package/data/docs/chat-service-methodology.md +181 -0
- package/data/docs/code-block.md +20 -0
- package/data/docs/creative-production.md +149 -0
- package/data/docs/designer-agent-backend-contract.md +552 -0
- package/data/docs/email-resend.md +29 -0
- package/data/docs/foundations.md +46 -8
- package/data/docs/guide.md +9 -9
- package/data/docs/handover-billing-aiden.md +132 -0
- package/data/docs/logo-maker-methodology.md +109 -0
- package/data/docs/presentation-asset-repository.md +53 -0
- package/data/docs/product-architecture.md +42 -0
- package/data/docs/quick-start-ai.md +4 -4
- package/data/docs/shadcn-conversion.md +1 -1
- package/data/docs/sidebar-placement.md +56 -0
- package/data/docs/theme-authoring.md +6 -3
- package/data/manifests/catalog.json +42 -46
- package/data/manifests/components.json +317 -66
- package/data/manifests/logo-skills.json +174 -0
- package/data/manifests/motion-profiles.json +2 -2
- package/data/manifests/patterns.json +201 -7
- package/data/manifests/presentation-assets.schema.json +44 -0
- package/data/manifests/templates.json +87 -1
- package/data/manifests/theme-dextrum.json +7 -7
- package/data/manifests/theme-prism-mono.json +19 -0
- package/data/manifests/theme-utopia-cloudblur.json +135 -0
- package/data/manifests/theme-utopia-default.json +31 -31
- package/data/manifests/theme-vyapti.json +17 -1
- package/data/manifests/theme-y2k-pop.json +18 -0
- package/data/manifests/themes.json +285 -57
- package/data/templates/analytics-dashboard/main.tsx +14 -1
- package/data/templates/calendar-application/main.tsx +14 -1
- package/data/templates/chat-workspace/README.md +12 -0
- package/data/templates/chat-workspace/index.html +11 -0
- package/data/templates/chat-workspace/main.tsx +97 -0
- package/data/templates/chat-workspace/styles.css +19 -0
- package/data/templates/chat-workspace/template.manifest.json +13 -0
- package/data/templates/composition-registry-lab/main.tsx +12 -1
- package/data/templates/dashboard-composer/main.tsx +14 -1
- package/data/templates/database-workspace/main.tsx +14 -1
- package/data/templates/interaction-lab/main.tsx +12 -1
- package/data/templates/quantum-verification-story/README.md +12 -0
- package/data/templates/quantum-verification-story/components.json +21 -0
- package/data/templates/quantum-verification-story/eslint.config.mjs +13 -0
- package/data/templates/quantum-verification-story/next-env.d.ts +7 -0
- package/data/templates/quantum-verification-story/next.config.mjs +11 -0
- package/data/templates/quantum-verification-story/package-lock.json +7535 -0
- package/data/templates/quantum-verification-story/package.json +46 -0
- package/data/templates/quantum-verification-story/postcss.config.js +6 -0
- package/data/templates/quantum-verification-story/src/app/assessment/page.tsx +138 -0
- package/data/templates/quantum-verification-story/src/app/ceramic-theme.css +48 -0
- package/data/templates/quantum-verification-story/src/app/deployment/page.tsx +178 -0
- package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Bold.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Medium.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Regular.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/ReadexPro-Variable.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-350.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-500.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-700.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/globals.css +175 -0
- package/data/templates/quantum-verification-story/src/app/layout.tsx +45 -0
- package/data/templates/quantum-verification-story/src/app/not-found.tsx +39 -0
- package/data/templates/quantum-verification-story/src/app/page.tsx +24 -0
- package/data/templates/quantum-verification-story/src/app/products/page.tsx +132 -0
- package/data/templates/quantum-verification-story/src/app/utopia-default.css +312 -0
- package/data/templates/quantum-verification-story/src/components/RotatingText.css +36 -0
- package/data/templates/quantum-verification-story/src/components/RotatingText.tsx +189 -0
- package/data/templates/quantum-verification-story/src/components/brand-mark.tsx +14 -0
- package/data/templates/quantum-verification-story/src/components/console-preview-section.tsx +57 -0
- package/data/templates/quantum-verification-story/src/components/console-preview.tsx +72 -0
- package/data/templates/quantum-verification-story/src/components/fade-up.tsx +54 -0
- package/data/templates/quantum-verification-story/src/components/floating-network.tsx +125 -0
- package/data/templates/quantum-verification-story/src/components/footer.tsx +83 -0
- package/data/templates/quantum-verification-story/src/components/harvest-timeline.tsx +70 -0
- package/data/templates/quantum-verification-story/src/components/lattice-diagram.tsx +73 -0
- package/data/templates/quantum-verification-story/src/components/lattice-field.tsx +129 -0
- package/data/templates/quantum-verification-story/src/components/nav.tsx +104 -0
- package/data/templates/quantum-verification-story/src/components/presentation-layout.tsx +91 -0
- package/data/templates/quantum-verification-story/src/components/readiness-estimator.tsx +135 -0
- package/data/templates/quantum-verification-story/src/components/scramble-text.tsx +60 -0
- package/data/templates/quantum-verification-story/src/components/section-backdrop.tsx +38 -0
- package/data/templates/quantum-verification-story/src/components/sections/clients.tsx +140 -0
- package/data/templates/quantum-verification-story/src/components/sections/contact.tsx +125 -0
- package/data/templates/quantum-verification-story/src/components/sections/hero.tsx +92 -0
- package/data/templates/quantum-verification-story/src/components/sections/moat.tsx +73 -0
- package/data/templates/quantum-verification-story/src/components/sections/offer.tsx +113 -0
- package/data/templates/quantum-verification-story/src/components/sections/pilot.tsx +63 -0
- package/data/templates/quantum-verification-story/src/components/sections/problem.tsx +53 -0
- package/data/templates/quantum-verification-story/src/components/text-particle.tsx +204 -0
- package/data/templates/quantum-verification-story/src/components/ticker.tsx +27 -0
- package/data/templates/quantum-verification-story/src/components/ui/badge.tsx +29 -0
- package/data/templates/quantum-verification-story/src/components/ui/button.tsx +55 -0
- package/data/templates/quantum-verification-story/src/components/ui/card.tsx +46 -0
- package/data/templates/quantum-verification-story/src/components/ui/cursor-driven-particle-typography.tsx +288 -0
- package/data/templates/quantum-verification-story/src/components/ui/input.tsx +20 -0
- package/data/templates/quantum-verification-story/src/components/ui/label.tsx +21 -0
- package/data/templates/quantum-verification-story/src/components/ui/separator.tsx +25 -0
- package/data/templates/quantum-verification-story/src/components/ui/textarea.tsx +19 -0
- package/data/templates/quantum-verification-story/src/lib/utils.ts +6 -0
- package/data/templates/quantum-verification-story/tailwind.config.js +95 -0
- package/data/templates/quantum-verification-story/template.manifest.json +23 -0
- package/data/templates/quantum-verification-story/tsconfig.json +42 -0
- package/data/templates/saas-solution-homepage/main.tsx +91 -14
- package/data/templates/saas-solution-homepage/privacy/index.html +1 -0
- package/data/templates/saas-solution-homepage/styles.css +47 -2
- package/data/templates/saas-solution-homepage/team/index.html +1 -0
- package/data/templates/saas-solution-homepage/template.manifest.json +41 -0
- package/data/templates/saas-solution-homepage/terms/index.html +1 -0
- package/lib/api.mjs +52 -3
- package/lib/template-runtime.mjs +1 -0
- 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
|
|
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=
|
|
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=
|
|
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
|
|
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
|