base-themes 0.1.2 → 0.1.3

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 (262) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/CODE_OF_CONDUCT.md +22 -0
  3. package/CONTRIBUTING.md +98 -0
  4. package/LICENSE +21 -0
  5. package/README.md +316 -3
  6. package/RELEASE.md +80 -0
  7. package/SECURITY.md +49 -0
  8. package/bin/base-themes.mjs +143 -0
  9. package/dist/base-themes.css +1 -1
  10. package/dist/base-themes.js +857 -302
  11. package/dist/llms-full.txt +288 -0
  12. package/dist/llms.txt +79 -0
  13. package/dist/types/blocks/AuthCard.d.ts +2 -0
  14. package/dist/types/blocks/CommandPaletteBlock.d.ts +2 -0
  15. package/dist/types/blocks/DashboardShell.d.ts +2 -0
  16. package/dist/types/blocks/DataTableBlock.d.ts +2 -0
  17. package/dist/types/blocks/PricingPanel.d.ts +2 -0
  18. package/dist/types/blocks/SettingsForm.d.ts +2 -0
  19. package/dist/types/blocks/TeamActivityFeed.d.ts +2 -0
  20. package/dist/types/blocks/ThemeShowcaseCard.d.ts +2 -0
  21. package/dist/types/blocks/index.d.ts +8 -0
  22. package/dist/types/components/ui/Input.d.ts +3 -0
  23. package/dist/types/components/ui/index.d.ts +1 -1
  24. package/dist/types/lib.d.ts +1 -0
  25. package/docs/adoption-dashboard.md +149 -0
  26. package/docs/analytics-setup.md +145 -0
  27. package/docs/community-gallery-proposal.md +64 -0
  28. package/docs/community-proof-telemetry.md +47 -0
  29. package/docs/contributor-issue-seeds.md +240 -0
  30. package/docs/registry-access-telemetry.md +87 -0
  31. package/docs/release-announcement-kit.md +229 -0
  32. package/docs/search-console-setup.md +111 -0
  33. package/docs/theme-token-contract.md +113 -0
  34. package/examples/dashboard/README.md +24 -0
  35. package/examples/dashboard/index.html +12 -0
  36. package/examples/dashboard/package-lock.json +1212 -0
  37. package/examples/dashboard/package.json +24 -0
  38. package/examples/dashboard/src/App.tsx +115 -0
  39. package/examples/dashboard/src/main.tsx +11 -0
  40. package/examples/dashboard/src/styles.css +129 -0
  41. package/examples/dashboard/src/vite-env.d.ts +4 -0
  42. package/examples/dashboard/tsconfig.app.json +23 -0
  43. package/examples/dashboard/tsconfig.json +7 -0
  44. package/examples/dashboard/tsconfig.node.json +15 -0
  45. package/examples/dashboard/vite.config.ts +6 -0
  46. package/examples/next/README.md +29 -0
  47. package/examples/next/app/base-themes-demo.tsx +70 -0
  48. package/examples/next/app/layout.tsx +16 -0
  49. package/examples/next/app/page.tsx +9 -0
  50. package/examples/next/app/styles.css +106 -0
  51. package/examples/next/next-env.d.ts +6 -0
  52. package/examples/next/next.config.ts +5 -0
  53. package/examples/next/package-lock.json +1199 -0
  54. package/examples/next/package.json +27 -0
  55. package/examples/next/tsconfig.json +36 -0
  56. package/examples/registry-copy/README.md +73 -0
  57. package/examples/registry-copy/plan-copy.mjs +130 -0
  58. package/examples/theme-customization/README.md +26 -0
  59. package/examples/theme-customization/index.html +12 -0
  60. package/examples/theme-customization/package-lock.json +1212 -0
  61. package/examples/theme-customization/package.json +24 -0
  62. package/examples/theme-customization/src/App.tsx +138 -0
  63. package/examples/theme-customization/src/main.tsx +11 -0
  64. package/examples/theme-customization/src/styles.css +138 -0
  65. package/examples/theme-customization/src/vite-env.d.ts +4 -0
  66. package/examples/theme-customization/tsconfig.app.json +23 -0
  67. package/examples/theme-customization/tsconfig.json +7 -0
  68. package/examples/theme-customization/tsconfig.node.json +15 -0
  69. package/examples/theme-customization/vite.config.ts +6 -0
  70. package/examples/vite/README.md +32 -0
  71. package/examples/vite/index.html +12 -0
  72. package/examples/vite/package-lock.json +1200 -0
  73. package/examples/vite/package.json +24 -0
  74. package/examples/vite/src/App.tsx +101 -0
  75. package/examples/vite/src/main.tsx +11 -0
  76. package/examples/vite/src/styles.css +125 -0
  77. package/examples/vite/src/vite-env.d.ts +4 -0
  78. package/examples/vite/tsconfig.app.json +23 -0
  79. package/examples/vite/tsconfig.json +7 -0
  80. package/examples/vite/tsconfig.node.json +15 -0
  81. package/examples/vite/vite.config.ts +6 -0
  82. package/llms-full.txt +288 -0
  83. package/llms.txt +79 -0
  84. package/package.json +157 -14
  85. package/registry/items/accordion.json +101 -0
  86. package/registry/items/alert-dialog.json +107 -0
  87. package/registry/items/autocomplete.json +106 -0
  88. package/registry/items/avatar.json +101 -0
  89. package/registry/items/block-auth-card.json +105 -0
  90. package/registry/items/block-command-palette.json +99 -0
  91. package/registry/items/block-dashboard-shell.json +101 -0
  92. package/registry/items/block-data-table.json +99 -0
  93. package/registry/items/block-pricing-panel.json +99 -0
  94. package/registry/items/block-settings-form.json +107 -0
  95. package/registry/items/block-team-activity-feed.json +99 -0
  96. package/registry/items/block-theme-showcase-card.json +99 -0
  97. package/registry/items/button.json +102 -0
  98. package/registry/items/checkbox-group.json +106 -0
  99. package/registry/items/checkbox.json +102 -0
  100. package/registry/items/collapsible.json +101 -0
  101. package/registry/items/combobox.json +101 -0
  102. package/registry/items/context-menu.json +106 -0
  103. package/registry/items/csp-provider.json +96 -0
  104. package/registry/items/dialog.json +102 -0
  105. package/registry/items/direction-provider.json +101 -0
  106. package/registry/items/drawer.json +101 -0
  107. package/registry/items/field.json +101 -0
  108. package/registry/items/fieldset.json +101 -0
  109. package/registry/items/form.json +101 -0
  110. package/registry/items/input.json +102 -0
  111. package/registry/items/menu.json +101 -0
  112. package/registry/items/menubar.json +106 -0
  113. package/registry/items/meter.json +101 -0
  114. package/registry/items/navigation-menu.json +101 -0
  115. package/registry/items/number-field.json +101 -0
  116. package/registry/items/otp-field.json +101 -0
  117. package/registry/items/popover.json +102 -0
  118. package/registry/items/preview-card.json +101 -0
  119. package/registry/items/progress.json +101 -0
  120. package/registry/items/radio-group.json +102 -0
  121. package/registry/items/radio.json +101 -0
  122. package/registry/items/scroll-area.json +101 -0
  123. package/registry/items/select.json +102 -0
  124. package/registry/items/separator.json +101 -0
  125. package/registry/items/slider.json +102 -0
  126. package/registry/items/switch.json +102 -0
  127. package/registry/items/tabs.json +101 -0
  128. package/registry/items/theme-bauhaus.json +107 -0
  129. package/registry/items/theme-bento.json +107 -0
  130. package/registry/items/theme-calm.json +107 -0
  131. package/registry/items/theme-cyberpunk.json +108 -0
  132. package/registry/items/theme-data-dense.json +107 -0
  133. package/registry/items/theme-editorial.json +107 -0
  134. package/registry/items/theme-enterprise.json +108 -0
  135. package/registry/items/theme-fluent.json +107 -0
  136. package/registry/items/theme-glass.json +107 -0
  137. package/registry/items/theme-linear.json +107 -0
  138. package/registry/items/theme-luxury.json +107 -0
  139. package/registry/items/theme-material.json +107 -0
  140. package/registry/items/theme-minimal.json +107 -0
  141. package/registry/items/theme-mono.json +107 -0
  142. package/registry/items/theme-neo-brutalism.json +107 -0
  143. package/registry/items/theme-playful.json +107 -0
  144. package/registry/items/theme-retro.json +107 -0
  145. package/registry/items/theme-shadcn.json +107 -0
  146. package/registry/items/theme-soft-ui.json +107 -0
  147. package/registry/items/theme-terminal.json +107 -0
  148. package/registry/items/toast.json +106 -0
  149. package/registry/items/toggle-group.json +101 -0
  150. package/registry/items/toggle.json +101 -0
  151. package/registry/items/toolbar.json +101 -0
  152. package/registry/items/tooltip.json +102 -0
  153. package/registry/registry.json +564 -49
  154. package/registry/shadcn-registry.json +415 -0
  155. package/research/telemetry-fixtures/analytics-events.jsonl +9 -0
  156. package/research/telemetry-fixtures/bundle-report.json +44 -0
  157. package/research/telemetry-fixtures/community-proof.csv +5 -0
  158. package/research/telemetry-fixtures/registry-access.jsonl +10 -0
  159. package/research/telemetry-fixtures/search-console-export.csv +4 -0
  160. package/scripts/registry-plan.mjs +434 -0
  161. package/scripts/render-launch-actions.mjs +405 -0
  162. package/scripts/render-launch-status.mjs +373 -0
  163. package/scripts/render-release-announcement.mjs +329 -0
  164. package/scripts/verify-launch-readiness.mjs +415 -0
  165. package/scripts/verify-telemetry-fixtures.mjs +85 -0
  166. package/scripts/verify-telemetry-report.mjs +89 -0
  167. package/skills/base-themes/SKILL.md +151 -47
  168. package/src/blocks/AuthCard.tsx +29 -0
  169. package/src/blocks/Blocks.css +182 -0
  170. package/src/blocks/CommandPaletteBlock.tsx +32 -0
  171. package/src/blocks/DashboardShell.tsx +36 -0
  172. package/src/blocks/DataTableBlock.tsx +44 -0
  173. package/src/blocks/PricingPanel.tsx +28 -0
  174. package/src/blocks/SettingsForm.tsx +37 -0
  175. package/src/blocks/TeamActivityFeed.tsx +38 -0
  176. package/src/blocks/ThemeShowcaseCard.tsx +32 -0
  177. package/src/blocks/index.ts +8 -0
  178. package/src/components/ui/Accordion.css +42 -0
  179. package/src/components/ui/Accordion.tsx +41 -0
  180. package/src/components/ui/AlertDialog.css +40 -0
  181. package/src/components/ui/AlertDialog.tsx +52 -0
  182. package/src/components/ui/Autocomplete.css +3 -0
  183. package/src/components/ui/Autocomplete.tsx +50 -0
  184. package/src/components/ui/Avatar.css +45 -0
  185. package/src/components/ui/Avatar.tsx +36 -0
  186. package/src/components/ui/Button.css +79 -0
  187. package/src/components/ui/Button.tsx +20 -0
  188. package/src/components/ui/Checkbox.css +37 -0
  189. package/src/components/ui/Checkbox.tsx +32 -0
  190. package/src/components/ui/CheckboxGroup.tsx +21 -0
  191. package/src/components/ui/Collapsible.css +34 -0
  192. package/src/components/ui/Collapsible.tsx +29 -0
  193. package/src/components/ui/Combobox.css +75 -0
  194. package/src/components/ui/Combobox.tsx +53 -0
  195. package/src/components/ui/ContextMenu.css +9 -0
  196. package/src/components/ui/ContextMenu.tsx +47 -0
  197. package/src/components/ui/CspProvider.tsx +10 -0
  198. package/src/components/ui/Dialog.css +41 -0
  199. package/src/components/ui/Dialog.tsx +45 -0
  200. package/src/components/ui/DirectionProvider.tsx +17 -0
  201. package/src/components/ui/Drawer.css +77 -0
  202. package/src/components/ui/Drawer.tsx +56 -0
  203. package/src/components/ui/Field.css +19 -0
  204. package/src/components/ui/Field.tsx +24 -0
  205. package/src/components/ui/Fieldset.css +16 -0
  206. package/src/components/ui/Fieldset.tsx +19 -0
  207. package/src/components/ui/Form.css +5 -0
  208. package/src/components/ui/Form.tsx +12 -0
  209. package/src/components/ui/Input.css +50 -0
  210. package/src/components/ui/Input.tsx +62 -0
  211. package/src/components/ui/Menu.css +59 -0
  212. package/src/components/ui/Menu.tsx +50 -0
  213. package/src/components/ui/Menubar.css +26 -0
  214. package/src/components/ui/Menubar.tsx +42 -0
  215. package/src/components/ui/Meter.css +45 -0
  216. package/src/components/ui/Meter.tsx +37 -0
  217. package/src/components/ui/NavigationMenu.css +103 -0
  218. package/src/components/ui/NavigationMenu.tsx +64 -0
  219. package/src/components/ui/NumberField.css +38 -0
  220. package/src/components/ui/NumberField.tsx +28 -0
  221. package/src/components/ui/OtpField.css +28 -0
  222. package/src/components/ui/OtpField.tsx +24 -0
  223. package/src/components/ui/Popover.css +25 -0
  224. package/src/components/ui/Popover.tsx +37 -0
  225. package/src/components/ui/PreviewCard.css +33 -0
  226. package/src/components/ui/PreviewCard.tsx +43 -0
  227. package/src/components/ui/Progress.css +33 -0
  228. package/src/components/ui/Progress.tsx +28 -0
  229. package/src/components/ui/Radio.tsx +22 -0
  230. package/src/components/ui/RadioGroup.css +42 -0
  231. package/src/components/ui/RadioGroup.tsx +29 -0
  232. package/src/components/ui/ScrollArea.css +42 -0
  233. package/src/components/ui/ScrollArea.tsx +22 -0
  234. package/src/components/ui/Select.css +86 -0
  235. package/src/components/ui/Select.tsx +39 -0
  236. package/src/components/ui/Separator.css +14 -0
  237. package/src/components/ui/Separator.tsx +12 -0
  238. package/src/components/ui/Slider.css +39 -0
  239. package/src/components/ui/Slider.tsx +21 -0
  240. package/src/components/ui/Switch.css +45 -0
  241. package/src/components/ui/Switch.tsx +29 -0
  242. package/src/components/ui/Tabs.css +72 -0
  243. package/src/components/ui/Tabs.tsx +44 -0
  244. package/src/components/ui/Toast.css +75 -0
  245. package/src/components/ui/Toast.tsx +48 -0
  246. package/src/components/ui/Toggle.tsx +12 -0
  247. package/src/components/ui/ToggleGroup.css +35 -0
  248. package/src/components/ui/ToggleGroup.tsx +30 -0
  249. package/src/components/ui/Toolbar.css +60 -0
  250. package/src/components/ui/Toolbar.tsx +36 -0
  251. package/src/components/ui/Tooltip.css +14 -0
  252. package/src/components/ui/Tooltip.tsx +31 -0
  253. package/src/components/ui/index.ts +83 -0
  254. package/src/components/ui/useDirection.ts +1 -0
  255. package/src/components/ui/useToastManager.ts +11 -0
  256. package/src/docs/blockMeta.json +66 -0
  257. package/src/docs/componentMeta.json +322 -0
  258. package/src/docs/staticPageMeta.json +143 -0
  259. package/src/docs/themeMeta.json +22 -0
  260. package/src/styles/tokenContract.json +61 -0
  261. package/workers/analytics-receiver.mjs +170 -0
  262. package/wrangler.analytics.jsonc +12 -0
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "base-themes-theme-customization-example",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite --host 0.0.0.0 --port 5178",
8
+ "build": "tsc -b && vite build",
9
+ "preview": "vite preview --host 0.0.0.0 --port 4178"
10
+ },
11
+ "dependencies": {
12
+ "@base-ui/react": "^1.5.0",
13
+ "base-themes": "file:../..",
14
+ "react": "^18.2.0",
15
+ "react-dom": "^18.2.0"
16
+ },
17
+ "devDependencies": {
18
+ "@types/react": "^18.3.27",
19
+ "@types/react-dom": "^18.3.7",
20
+ "@vitejs/plugin-react": "^6.0.1",
21
+ "typescript": "~6.0.2",
22
+ "vite": "^8.0.12"
23
+ }
24
+ }
@@ -0,0 +1,138 @@
1
+ import { useMemo, useState, type CSSProperties } from 'react'
2
+ import {
3
+ Button,
4
+ Field,
5
+ Fieldset,
6
+ Input,
7
+ Progress,
8
+ Select,
9
+ Switch,
10
+ Tabs,
11
+ type ThemeStyle,
12
+ useTheme,
13
+ } from 'base-themes'
14
+ import registry from 'base-themes/registry.json'
15
+
16
+ const styleChoices = {
17
+ bento: 'Bento',
18
+ enterprise: 'Enterprise',
19
+ glass: 'Glass',
20
+ terminal: 'Terminal',
21
+ 'data-dense': 'Data dense',
22
+ }
23
+
24
+ const accentChoices = {
25
+ '#2563eb': 'Blue',
26
+ '#0f766e': 'Teal',
27
+ '#f97316': 'Orange',
28
+ '#dc2626': 'Red',
29
+ '#7c3aed': 'Violet',
30
+ }
31
+
32
+ const radiusChoices = {
33
+ '4px': 'Tight',
34
+ '8px': 'Default',
35
+ '14px': 'Rounded',
36
+ '22px': 'Pill',
37
+ }
38
+
39
+ const fontChoices = {
40
+ 'Inter, ui-sans-serif, system-ui, sans-serif': 'System',
41
+ 'Georgia, serif': 'Editorial',
42
+ 'SFMono-Regular, Consolas, monospace': 'Mono',
43
+ }
44
+
45
+ export function App() {
46
+ const { style, setStyle, resolved, setTheme } = useTheme()
47
+ const [accent, setAccent] = useState('#2563eb')
48
+ const [radius, setRadius] = useState('8px')
49
+ const [font, setFont] = useState('Inter, ui-sans-serif, system-ui, sans-serif')
50
+ const [compact, setCompact] = useState(false)
51
+
52
+ const cssVariables = useMemo(() => `:root {
53
+ --accent: ${accent};
54
+ --teal: ${accent};
55
+ --radius: ${radius};
56
+ --radius-sm: ${radius === '4px' ? '3px' : radius === '8px' ? '6px' : radius === '14px' ? '10px' : '999px'};
57
+ --font-sans: ${font};
58
+ --theme-control-height: ${compact ? '34px' : '42px'};
59
+ }`, [accent, compact, font, radius])
60
+
61
+ const setString = (setter: (value: string) => void) => (value: unknown) => {
62
+ if (typeof value === 'string') setter(value)
63
+ }
64
+
65
+ const copyVariables = () => {
66
+ void navigator.clipboard?.writeText(cssVariables)
67
+ }
68
+
69
+ return (
70
+ <main className="customization-shell">
71
+ <section className="hero-panel">
72
+ <div>
73
+ <p className="eyebrow">Theme customization example</p>
74
+ <h1>Customize Base Themes tokens from the package surface.</h1>
75
+ <p className="hero-copy">
76
+ This React 18 Vite app imports package CSS once, then overrides semantic tokens for brand color, radius, font, and density.
77
+ </p>
78
+ </div>
79
+ <div className="hero-actions" aria-label="Theme controls">
80
+ <Select id="base-style" label="Starting style" value={style} onValueChange={(value) => setStyle(value as ThemeStyle)} items={styleChoices} />
81
+ <Switch id="color-mode" label="Dark mode" checked={resolved === 'dark'} onCheckedChange={(checked) => setTheme(checked ? 'dark' : 'light')} />
82
+ </div>
83
+ </section>
84
+
85
+ <section className="customization-grid">
86
+ <Fieldset legend="Token controls">
87
+ <Select id="accent" label="Primary color" value={accent} onValueChange={setString(setAccent)} items={accentChoices} />
88
+ <Select id="radius" label="Radius" value={radius} onValueChange={setString(setRadius)} items={radiusChoices} />
89
+ <Select id="font" label="Font" value={font} onValueChange={setString(setFont)} items={fontChoices} />
90
+ <Switch id="density" label="Compact controls" checked={compact} onCheckedChange={setCompact} />
91
+ <Button type="button" onClick={copyVariables}>Copy CSS variables</Button>
92
+ </Fieldset>
93
+
94
+ <section className="preview-panel" style={{ '--accent': accent, '--teal': accent, '--radius': radius, '--radius-sm': radius, '--font-sans': font, '--theme-control-height': compact ? '34px' : '42px' } as CSSProperties}>
95
+ <div className="preview-header">
96
+ <div>
97
+ <p className="eyebrow">Live preview</p>
98
+ <h2>Brand workspace</h2>
99
+ </div>
100
+ <Button variant="accent">Publish</Button>
101
+ </div>
102
+ <div className="form-grid">
103
+ <Field label="Workspace" description="This input uses the overridden theme tokens.">
104
+ <Input id="workspace" defaultValue="Launch Studio" />
105
+ </Field>
106
+ <Select id="status" label="Release track" defaultValue="beta" items={{ alpha: 'Alpha', beta: 'Beta', stable: 'Stable' }} />
107
+ </div>
108
+ <Tabs
109
+ defaultValue="tokens"
110
+ panels={[
111
+ {
112
+ value: 'tokens',
113
+ label: 'Tokens',
114
+ title: 'Semantic overrides',
115
+ content: `Accent ${accent}, radius ${radius}, and ${compact ? 'compact' : 'comfortable'} control density are active.`,
116
+ },
117
+ {
118
+ value: 'registry',
119
+ label: 'Registry',
120
+ title: `${registry.style.variants.length} shipped visual styles`,
121
+ content: `Current registry default is ${registry.style.default}; this example still uses public registry metadata.`,
122
+ },
123
+ ]}
124
+ />
125
+ <Progress value={compact ? 84 : 68} showValue aria-label="Customization coverage" />
126
+ </section>
127
+ </section>
128
+
129
+ <section className="code-panel" aria-label="Generated CSS variables">
130
+ <div>
131
+ <p className="eyebrow">Copy into your app</p>
132
+ <h2>Generated token override</h2>
133
+ </div>
134
+ <pre><code>{cssVariables}</code></pre>
135
+ </section>
136
+ </main>
137
+ )
138
+ }
@@ -0,0 +1,11 @@
1
+ import { StrictMode } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import { App } from './App'
4
+ import 'base-themes/styles.css'
5
+ import './styles.css'
6
+
7
+ createRoot(document.getElementById('root')!).render(
8
+ <StrictMode>
9
+ <App />
10
+ </StrictMode>,
11
+ )
@@ -0,0 +1,138 @@
1
+ :root {
2
+ color: var(--theme-fg);
3
+ background: var(--theme-bg);
4
+ font-family: var(--font-sans);
5
+ }
6
+
7
+ * {
8
+ box-sizing: border-box;
9
+ }
10
+
11
+ body {
12
+ margin: 0;
13
+ min-width: 320px;
14
+ }
15
+
16
+ .customization-shell {
17
+ width: min(1120px, calc(100vw - 32px));
18
+ margin: 0 auto;
19
+ padding: 40px 0;
20
+ }
21
+
22
+ .hero-panel,
23
+ .customization-grid > *,
24
+ .code-panel {
25
+ border: 1px solid var(--theme-border);
26
+ background: var(--theme-surface);
27
+ box-shadow: var(--theme-shadow);
28
+ }
29
+
30
+ .hero-panel {
31
+ display: grid;
32
+ grid-template-columns: minmax(0, 1fr) minmax(280px, 360px);
33
+ gap: 24px;
34
+ align-items: end;
35
+ padding: 32px;
36
+ }
37
+
38
+ .eyebrow {
39
+ margin: 0 0 8px;
40
+ color: var(--theme-muted-fg);
41
+ font-size: 0.78rem;
42
+ font-weight: 700;
43
+ text-transform: uppercase;
44
+ }
45
+
46
+ h1,
47
+ h2 {
48
+ margin: 0;
49
+ color: var(--theme-fg);
50
+ letter-spacing: 0;
51
+ }
52
+
53
+ h1 {
54
+ max-width: 720px;
55
+ font-size: clamp(2rem, 4vw, 4rem);
56
+ line-height: 1;
57
+ }
58
+
59
+ h2 {
60
+ font-size: 1.4rem;
61
+ }
62
+
63
+ .hero-copy {
64
+ max-width: 680px;
65
+ margin: 16px 0 0;
66
+ color: var(--theme-muted-fg);
67
+ font-size: 1rem;
68
+ line-height: 1.6;
69
+ }
70
+
71
+ .hero-actions {
72
+ display: grid;
73
+ gap: 14px;
74
+ }
75
+
76
+ .customization-grid {
77
+ display: grid;
78
+ grid-template-columns: minmax(280px, 0.8fr) minmax(0, 1.2fr);
79
+ gap: 16px;
80
+ margin: 16px 0;
81
+ }
82
+
83
+ .customization-grid > * {
84
+ min-width: 0;
85
+ padding: 24px;
86
+ }
87
+
88
+ .preview-panel {
89
+ display: grid;
90
+ gap: 20px;
91
+ font-family: var(--font-sans);
92
+ }
93
+
94
+ .preview-header,
95
+ .form-grid {
96
+ display: grid;
97
+ gap: 16px;
98
+ }
99
+
100
+ .preview-header {
101
+ grid-template-columns: minmax(0, 1fr) auto;
102
+ align-items: center;
103
+ }
104
+
105
+ .form-grid {
106
+ grid-template-columns: repeat(2, minmax(0, 1fr));
107
+ }
108
+
109
+ .code-panel {
110
+ display: grid;
111
+ gap: 16px;
112
+ padding: 24px;
113
+ }
114
+
115
+ pre {
116
+ overflow: auto;
117
+ margin: 0;
118
+ padding: 18px;
119
+ border: 1px solid var(--theme-border);
120
+ background: var(--theme-muted-bg);
121
+ color: var(--theme-fg);
122
+ font-size: 0.9rem;
123
+ line-height: 1.6;
124
+ }
125
+
126
+ @media (max-width: 820px) {
127
+ .hero-panel,
128
+ .customization-grid,
129
+ .preview-header,
130
+ .form-grid {
131
+ grid-template-columns: 1fr;
132
+ }
133
+
134
+ .customization-shell {
135
+ width: min(100vw - 24px, 680px);
136
+ padding: 24px 0;
137
+ }
138
+ }
@@ -0,0 +1,4 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ declare module 'base-themes/styles.css'
4
+ declare module '*.css'
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
+ "target": "ES2023",
5
+ "useDefineForClassFields": true,
6
+ "lib": ["ES2023", "DOM", "DOM.Iterable"],
7
+ "allowJs": false,
8
+ "skipLibCheck": true,
9
+ "esModuleInterop": true,
10
+ "allowSyntheticDefaultImports": true,
11
+ "strict": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "module": "ESNext",
14
+ "moduleResolution": "bundler",
15
+ "resolveJsonModule": true,
16
+ "isolatedModules": true,
17
+ "noEmit": true,
18
+ "jsx": "react-jsx",
19
+ "noUnusedLocals": true,
20
+ "noUnusedParameters": true
21
+ },
22
+ "include": ["src"]
23
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./tsconfig.app.json" },
5
+ { "path": "./tsconfig.node.json" }
6
+ ]
7
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+ "target": "ES2023",
5
+ "lib": ["ES2023"],
6
+ "module": "ESNext",
7
+ "moduleResolution": "bundler",
8
+ "allowSyntheticDefaultImports": true,
9
+ "strict": true,
10
+ "noEmit": true,
11
+ "skipLibCheck": true,
12
+ "types": ["node"]
13
+ },
14
+ "include": ["vite.config.ts"]
15
+ }
@@ -0,0 +1,6 @@
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ })
@@ -0,0 +1,32 @@
1
+ # Base Themes Vite Example
2
+
3
+ This example verifies the package install path in a fresh Vite React app with React 18.
4
+
5
+ ## Run
6
+
7
+ From this directory:
8
+
9
+ ```bash
10
+ npm install
11
+ npm run dev
12
+ ```
13
+
14
+ When testing local package changes from the repository root, build and pack first:
15
+
16
+ ```bash
17
+ npm run build
18
+ npm pack --dry-run
19
+ ```
20
+
21
+ Then install the generated tarball in this example:
22
+
23
+ ```bash
24
+ npm install ../../base-themes-0.1.2.tgz
25
+ npm run build
26
+ ```
27
+
28
+ The app intentionally imports from the public package surface only:
29
+
30
+ - `base-themes`
31
+ - `base-themes/styles.css`
32
+ - `base-themes/registry.json`
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html lang="en" data-theme="light" data-style="enterprise">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Base Themes Vite Example</title>
7
+ </head>
8
+ <body>
9
+ <div id="root"></div>
10
+ <script type="module" src="/src/main.tsx"></script>
11
+ </body>
12
+ </html>