@utopia-studio-design/design-system-cli 0.1.0 → 0.3.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 (52) hide show
  1. package/README.md +12 -41
  2. package/bin/utopia-ds-mcp.mjs +55 -0
  3. package/bin/utopia-ds.mjs +233 -318
  4. package/data/docs/ai-platform-plan.md +53 -0
  5. package/data/docs/arabic-friendly.md +72 -0
  6. package/data/docs/foundations.md +154 -0
  7. package/data/docs/guide.md +37 -0
  8. package/data/docs/quick-start-ai.md +122 -0
  9. package/data/docs/shadcn-conversion.md +35 -0
  10. package/data/docs/theme-authoring.md +46 -0
  11. package/data/manifests/catalog.json +547 -0
  12. package/data/manifests/components.json +4780 -0
  13. package/data/manifests/patterns.json +12 -0
  14. package/data/manifests/templates.json +96 -0
  15. package/data/manifests/theme-barrier-intelligence.json +123 -0
  16. package/data/manifests/theme-dextrum.json +255 -0
  17. package/data/manifests/theme-utopia-default.json +163 -0
  18. package/data/manifests/themes.json +417 -0
  19. package/data/templates/saas-solution-homepage/README.md +52 -0
  20. package/data/templates/saas-solution-homepage/agents/index.html +1 -0
  21. package/data/templates/saas-solution-homepage/changelog/index.html +1 -0
  22. package/data/templates/saas-solution-homepage/contact-sales/index.html +1 -0
  23. package/data/templates/saas-solution-homepage/customers/aster-labs/index.html +1 -0
  24. package/data/templates/saas-solution-homepage/customers/index.html +1 -0
  25. package/data/templates/saas-solution-homepage/index.html +17 -0
  26. package/data/templates/saas-solution-homepage/integrations/index.html +1 -0
  27. package/data/templates/saas-solution-homepage/integrations/slack/index.html +1 -0
  28. package/data/templates/saas-solution-homepage/main.tsx +642 -0
  29. package/data/templates/saas-solution-homepage/pricing/index.html +1 -0
  30. package/data/templates/saas-solution-homepage/product/index.html +1 -0
  31. package/data/templates/saas-solution-homepage/styles.css +863 -0
  32. package/data/templates/saas-solution-homepage/template.manifest.json +36 -0
  33. package/lib/api.mjs +152 -0
  34. package/package.json +17 -15
  35. package/LICENSE +0 -21
  36. package/templates/agent-docs/examples.md +0 -33
  37. package/templates/agent-docs/index.md +0 -78
  38. package/templates/agent-docs/llms.txt +0 -33
  39. package/templates/components/badge.tsx +0 -12
  40. package/templates/components/brand-action.tsx +0 -32
  41. package/templates/components/button-group.tsx +0 -30
  42. package/templates/components/button.tsx +0 -44
  43. package/templates/components/card.tsx +0 -23
  44. package/templates/components/cta-section.tsx +0 -34
  45. package/templates/components/icon-button.tsx +0 -44
  46. package/templates/components/page-hero.tsx +0 -47
  47. package/templates/components/tooltip.tsx +0 -48
  48. package/templates/components/topbar.tsx +0 -59
  49. package/templates/lib/utils.ts +0 -6
  50. package/templates/styles/styles.css +0 -271
  51. package/templates/styles/tokens.css +0 -21
  52. package/templates/tokens.json +0 -41
@@ -1,47 +0,0 @@
1
- import type { ReactNode } from 'react'
2
-
3
- import { cn } from '../../lib/utils'
4
- import { BrandAction } from './brand-action'
5
-
6
- type PageHeroAction = {
7
- href: string
8
- label: string
9
- variant?: 'primary' | 'secondary' | 'ghost'
10
- }
11
-
12
- export function PageHero({
13
- actions = [],
14
- body,
15
- className,
16
- eyebrow,
17
- panelClassName,
18
- title,
19
- variant = 'split',
20
- }: {
21
- actions?: PageHeroAction[]
22
- body?: ReactNode
23
- className?: string
24
- eyebrow: string
25
- panelClassName?: string
26
- title: string
27
- variant?: 'split' | 'stacked'
28
- }) {
29
- return (
30
- <section className={cn('brand-page-hero', `brand-page-hero--${variant}`, className)}>
31
- <div className="brand-page-hero__copy">
32
- <p className="brand-page-hero__eyebrow">{eyebrow}</p>
33
- <h1 className="m-0 text-[length:var(--type-hero-title)] font-bold leading-none tracking-0">{title}</h1>
34
- </div>
35
- <div className={cn('brand-page-hero__panel', panelClassName)}>
36
- {body ? <p className="text-lg leading-7">{body}</p> : null}
37
- {actions.length ? (
38
- <div className="brand-page-hero__actions">
39
- {actions.map((action) => (
40
- <BrandAction key={action.label} {...action} />
41
- ))}
42
- </div>
43
- ) : null}
44
- </div>
45
- </section>
46
- )
47
- }
@@ -1,48 +0,0 @@
1
- import * as React from 'react'
2
- import { Tooltip as TooltipPrimitive } from 'radix-ui'
3
-
4
- import { cn } from '../../lib/utils'
5
-
6
- export function TooltipProvider({
7
- delayDuration = 0,
8
- ...props
9
- }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
10
- return (
11
- <TooltipPrimitive.Provider
12
- delayDuration={delayDuration}
13
- {...props}
14
- />
15
- )
16
- }
17
-
18
- export function Tooltip({
19
- ...props
20
- }: React.ComponentProps<typeof TooltipPrimitive.Root>) {
21
- return <TooltipPrimitive.Root {...props} />
22
- }
23
-
24
- export function TooltipTrigger({
25
- ...props
26
- }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
27
- return <TooltipPrimitive.Trigger {...props} />
28
- }
29
-
30
- export function TooltipContent({
31
- children,
32
- className,
33
- sideOffset = 0,
34
- ...props
35
- }: React.ComponentProps<typeof TooltipPrimitive.Content>) {
36
- return (
37
- <TooltipPrimitive.Portal>
38
- <TooltipPrimitive.Content
39
- className={cn('utopia-tooltip-content', className)}
40
- sideOffset={sideOffset}
41
- {...props}
42
- >
43
- {children}
44
- <TooltipPrimitive.Arrow className="utopia-tooltip-arrow" />
45
- </TooltipPrimitive.Content>
46
- </TooltipPrimitive.Portal>
47
- )
48
- }
@@ -1,59 +0,0 @@
1
- import { Button } from './button'
2
-
3
- export type TopbarNavItem = {
4
- href: string
5
- label: string
6
- }
7
-
8
- export interface TopbarProps {
9
- applyHref?: string
10
- applyLabel?: string
11
- brandHref?: string
12
- brandLabel?: string
13
- navItems?: TopbarNavItem[]
14
- partnerHref?: string
15
- partnerLabel?: string
16
- }
17
-
18
- const defaultNavItems: TopbarNavItem[] = [
19
- { label: 'Fellows', href: '/fellows' },
20
- { label: 'Startups', href: '/portfolio' },
21
- { label: 'How We Build', href: '/how-we-build' },
22
- { label: 'Team', href: '/team' },
23
- { label: 'Resources', href: '/resources' },
24
- ]
25
-
26
- export function Topbar({
27
- applyHref,
28
- applyLabel = 'Apply',
29
- brandHref = '/',
30
- brandLabel = 'The Utopia Studio',
31
- navItems = defaultNavItems,
32
- partnerHref,
33
- partnerLabel = 'Partner with us',
34
- }: TopbarProps) {
35
- return (
36
- <header className="utopia-topbar">
37
- <a className="utopia-topbar__brand" href={brandHref}>
38
- {brandLabel}
39
- </a>
40
- <nav aria-label="Primary navigation" className="utopia-topbar__nav">
41
- {navItems.map((item) => (
42
- <a className="utopia-topbar__link" href={item.href} key={item.href}>
43
- {item.label}
44
- </a>
45
- ))}
46
- {partnerHref ? (
47
- <Button asChild variant="outline">
48
- <a href={partnerHref}>{partnerLabel}</a>
49
- </Button>
50
- ) : null}
51
- {applyHref ? (
52
- <Button asChild>
53
- <a href={applyHref}>{applyLabel}</a>
54
- </Button>
55
- ) : null}
56
- </nav>
57
- </header>
58
- )
59
- }
@@ -1,6 +0,0 @@
1
- import { clsx, type ClassValue } from 'clsx'
2
- import { twMerge } from 'tailwind-merge'
3
-
4
- export function cn(...inputs: ClassValue[]) {
5
- return twMerge(clsx(inputs))
6
- }
@@ -1,271 +0,0 @@
1
- @import './utopia-tokens.css';
2
-
3
- * {
4
- box-sizing: border-box;
5
- }
6
-
7
- body {
8
- margin: 0;
9
- min-width: 320px;
10
- background: hsl(var(--background));
11
- color: hsl(var(--foreground));
12
- font-family: var(--font-sans);
13
- font-weight: var(--font-weight-regular);
14
- font-synthesis: none;
15
- text-rendering: geometricPrecision;
16
- -webkit-font-smoothing: antialiased;
17
- -moz-osx-font-smoothing: grayscale;
18
- }
19
-
20
- a {
21
- color: inherit;
22
- text-decoration: none;
23
- }
24
-
25
- button,
26
- a {
27
- font: inherit;
28
- }
29
-
30
- .utopia-button {
31
- align-items: center;
32
- border-radius: 0;
33
- display: inline-flex;
34
- font-size: var(--button-font-size);
35
- font-weight: var(--button-font-weight);
36
- gap: var(--button-gap);
37
- height: var(--button-height);
38
- justify-content: center;
39
- letter-spacing: var(--button-tracking);
40
- padding-inline: var(--button-padding-x);
41
- text-transform: uppercase;
42
- transition: background 200ms ease, border-color 200ms ease, color 200ms ease;
43
- white-space: nowrap;
44
- }
45
-
46
- .utopia-button:focus-visible,
47
- .brand-action:focus-visible {
48
- outline: 2px solid hsl(var(--ring));
49
- outline-offset: 2px;
50
- }
51
-
52
- .utopia-button--primary {
53
- background: hsl(var(--primary));
54
- border: 1px solid hsl(var(--primary));
55
- color: hsl(var(--primary-foreground));
56
- }
57
-
58
- .utopia-button--primary:hover {
59
- background: var(--brand-brick-hover);
60
- border-color: var(--brand-brick-hover);
61
- }
62
-
63
- .utopia-button--destructive {
64
- background: hsl(var(--destructive));
65
- border: 1px solid hsl(var(--destructive));
66
- color: hsl(var(--destructive-foreground));
67
- }
68
-
69
- .utopia-button--destructive:hover {
70
- background: var(--brand-brick-hover);
71
- border-color: var(--brand-brick-hover);
72
- }
73
-
74
- .utopia-button--secondary {
75
- background: hsl(var(--secondary));
76
- border: 1px solid hsl(var(--secondary));
77
- color: hsl(var(--secondary-foreground));
78
- }
79
-
80
- .utopia-button--outline,
81
- .utopia-button--ghost {
82
- background: transparent;
83
- border: 1px solid hsl(var(--input));
84
- color: hsl(var(--foreground));
85
- }
86
-
87
- .utopia-button--outline:hover,
88
- .utopia-button--ghost:hover {
89
- border-color: hsl(var(--primary));
90
- color: hsl(var(--primary));
91
- }
92
-
93
- .utopia-card {
94
- background: hsl(var(--card));
95
- border: 1px solid var(--tint-black-20);
96
- border-radius: 0;
97
- box-shadow: none;
98
- color: hsl(var(--card-foreground));
99
- }
100
-
101
- .utopia-icon-button {
102
- padding: 0;
103
- }
104
-
105
- .utopia-tooltip-content {
106
- background: hsl(var(--foreground));
107
- color: hsl(var(--background));
108
- font-size: 12px;
109
- line-height: 1;
110
- padding: 8px 10px;
111
- z-index: 50;
112
- }
113
-
114
- .utopia-tooltip-arrow {
115
- fill: hsl(var(--foreground));
116
- }
117
-
118
- .utopia-button-group {
119
- align-items: center;
120
- display: inline-flex;
121
- }
122
-
123
- .utopia-button-group__button {
124
- border-right-width: 0;
125
- }
126
-
127
- .utopia-button-group__button:last-child {
128
- border-right-width: 1px;
129
- }
130
-
131
- .brand-action {
132
- align-items: center;
133
- border: 1px solid hsl(var(--input));
134
- border-radius: 0;
135
- display: inline-flex;
136
- font-size: var(--button-font-size);
137
- font-weight: var(--button-font-weight);
138
- gap: var(--button-gap);
139
- min-height: var(--button-height);
140
- padding-inline: var(--button-padding-x);
141
- text-transform: uppercase;
142
- letter-spacing: var(--button-tracking);
143
- transition: background 200ms ease, border-color 200ms ease, color 200ms ease;
144
- }
145
-
146
- .brand-action--primary {
147
- background: hsl(var(--primary));
148
- border-color: hsl(var(--primary));
149
- color: hsl(var(--primary-foreground));
150
- }
151
-
152
- .brand-action--secondary,
153
- .brand-action--ghost {
154
- background: transparent;
155
- color: hsl(var(--foreground));
156
- }
157
-
158
- .brand-action--secondary:hover,
159
- .brand-action--ghost:hover {
160
- border-color: hsl(var(--primary));
161
- color: hsl(var(--primary));
162
- }
163
-
164
- .brand-page-hero {
165
- display: grid;
166
- gap: clamp(28px, 5vw, 72px);
167
- grid-template-columns: minmax(0, 1.15fr) minmax(280px, 0.85fr);
168
- padding: var(--section-padding-y) var(--section-padding-x);
169
- }
170
-
171
- .brand-page-hero--stacked {
172
- grid-template-columns: 1fr;
173
- }
174
-
175
- .brand-page-hero__eyebrow,
176
- .brand-cta-section__eyebrow,
177
- .utopia-topbar__link {
178
- font-size: var(--fs-eyebrow);
179
- font-weight: var(--font-weight-medium);
180
- letter-spacing: var(--tracking-eyebrow);
181
- text-transform: uppercase;
182
- }
183
-
184
- .brand-page-hero h1,
185
- .brand-cta-section h2 {
186
- font-family: var(--font-display);
187
- font-size: var(--type-hero-title);
188
- font-weight: var(--font-weight-strong);
189
- letter-spacing: 0;
190
- line-height: var(--lh-tight);
191
- margin: 0;
192
- }
193
-
194
- .brand-page-hero__panel {
195
- border-left: 1px solid hsl(var(--foreground) / 0.18);
196
- padding-left: clamp(20px, 3vw, 40px);
197
- }
198
-
199
- .brand-page-hero__panel p {
200
- font-size: var(--type-hero-description);
201
- line-height: var(--lh-body);
202
- margin: 0;
203
- }
204
-
205
- .brand-page-hero__actions,
206
- .brand-cta-section__actions {
207
- display: flex;
208
- flex-wrap: wrap;
209
- gap: 12px;
210
- margin-top: 28px;
211
- }
212
-
213
- .brand-cta-section {
214
- padding: var(--section-padding-y) var(--section-padding-x);
215
- }
216
-
217
- .brand-cta-section__inner {
218
- border-top: 1px solid hsl(var(--foreground) / 0.18);
219
- padding-top: clamp(24px, 4vw, 44px);
220
- }
221
-
222
- .utopia-topbar {
223
- align-items: center;
224
- border-bottom: 1px solid hsl(var(--foreground) / 0.14);
225
- display: flex;
226
- gap: 24px;
227
- min-height: var(--topbar-height);
228
- padding-inline: var(--section-padding-x);
229
- }
230
-
231
- .utopia-topbar__brand {
232
- font-size: 14px;
233
- font-weight: var(--font-weight-strong);
234
- letter-spacing: 0.08em;
235
- text-transform: uppercase;
236
- }
237
-
238
- .utopia-topbar__nav {
239
- align-items: center;
240
- display: flex;
241
- gap: 18px;
242
- margin-left: auto;
243
- }
244
-
245
- .utopia-topbar__link:hover {
246
- color: hsl(var(--primary));
247
- }
248
-
249
- @media (max-width: 760px) {
250
- .brand-page-hero {
251
- grid-template-columns: 1fr;
252
- }
253
-
254
- .brand-page-hero__panel {
255
- border-left: 0;
256
- border-top: 1px solid hsl(var(--foreground) / 0.18);
257
- padding-left: 0;
258
- padding-top: 20px;
259
- }
260
-
261
- .utopia-topbar {
262
- align-items: flex-start;
263
- flex-direction: column;
264
- padding-block: 18px;
265
- }
266
-
267
- .utopia-topbar__nav {
268
- flex-wrap: wrap;
269
- margin-left: 0;
270
- }
271
- }
@@ -1,21 +0,0 @@
1
- :root {
2
- --background: 342 9.1% 21.6%;
3
- --foreground: 0 0% 100%;
4
- --card: 0 0% 100%;
5
- --card-foreground: 342 9.1% 21.6%;
6
- --primary: 12 59.5% 50.6%;
7
- --primary-foreground: 0 0% 100%;
8
- --secondary: 0 0% 93.3%;
9
- --secondary-foreground: 342 9.1% 21.6%;
10
- --border: 0 0% 100% / 0.18;
11
- --ring: 12 59.5% 50.6%;
12
- --font-sans: 'TWK Lausanne';
13
- --font-weight-regular: 350;
14
- --font-weight-medium: 500;
15
- --font-weight-strong: 700;
16
- --radius: 0px;
17
- --type-hero-title: clamp(54px, 6.1vw, 112px);
18
- --button-height: 44px;
19
- --button-font-size: 14px;
20
- --button-tracking: 0.06em;
21
- }
@@ -1,41 +0,0 @@
1
- {
2
- "name": "Utopia Studio Design System",
3
- "version": "0.1.0",
4
- "defaultTheme": "utopia",
5
- "themeArchitecture": "Utopia is the default/reference theme. Components must consume semantic roles so other themes can be added without changing component APIs.",
6
- "semanticRoles": [
7
- "--background",
8
- "--foreground",
9
- "--card",
10
- "--card-foreground",
11
- "--primary",
12
- "--primary-foreground",
13
- "--secondary",
14
- "--secondary-foreground",
15
- "--muted",
16
- "--muted-foreground",
17
- "--border",
18
- "--input",
19
- "--ring",
20
- "--radius"
21
- ],
22
- "color": {
23
- "specialBlack": "hsl(342 9.1% 21.6%)",
24
- "white": "hsl(0 0% 100%)",
25
- "brickRed": "hsl(12 59.5% 50.6%)",
26
- "brickHover": "hsl(12 61.4% 44.7%)",
27
- "brickPress": "hsl(12 62.1% 38.2%)",
28
- "lightGrey": "hsl(0 0% 93.3%)"
29
- },
30
- "radius": {
31
- "base": "0px",
32
- "max": "0px",
33
- "button": "0px"
34
- },
35
- "font": {
36
- "family": "TWK Lausanne",
37
- "regular": 350,
38
- "medium": 500,
39
- "strong": 700
40
- }
41
- }