rizzo-css 0.0.63 → 0.0.65

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 (93) hide show
  1. package/README.md +4 -4
  2. package/bin/rizzo-css.js +108 -9
  3. package/dist/rizzo.min.css +4 -2
  4. package/package.json +1 -1
  5. package/scaffold/astro/Footer.astro +1 -1
  6. package/scaffold/astro/InputGroup.astro +74 -0
  7. package/scaffold/astro/base/README-RIZZO.md +1 -1
  8. package/scaffold/astro/base/src/pages/index.astro +2 -2
  9. package/scaffold/astro/variants/full/README-RIZZO.md +1 -1
  10. package/scaffold/astro/variants/full/src/pages/index.astro +2 -2
  11. package/scaffold/react/base/README-RIZZO.md +50 -0
  12. package/scaffold/react/base/gitignore +8 -0
  13. package/scaffold/react/base/index.html +16 -0
  14. package/scaffold/react/base/package.json +22 -0
  15. package/scaffold/react/base/public/.gitkeep +0 -0
  16. package/scaffold/react/base/src/App.tsx +11 -0
  17. package/scaffold/react/base/src/index.css +1 -0
  18. package/scaffold/react/base/src/main.tsx +10 -0
  19. package/scaffold/react/base/src/vite-env.d.ts +1 -0
  20. package/scaffold/react/base/tsconfig.json +21 -0
  21. package/scaffold/react/base/tsconfig.node.json +9 -0
  22. package/scaffold/react/base/vite.config.ts +6 -0
  23. package/scaffold/shared/sound-effects-inline.js +1 -1
  24. package/scaffold/svelte/InputGroup.svelte +71 -0
  25. package/scaffold/svelte/base/README-RIZZO.md +1 -1
  26. package/scaffold/svelte/base/package.json +2 -2
  27. package/scaffold/svelte/variants/full/README-RIZZO.md +1 -1
  28. package/scaffold/svelte/variants/full/package.json +2 -2
  29. package/scaffold/vanilla/README-RIZZO.md +2 -2
  30. package/scaffold/vanilla/components/accordion.html +24 -0
  31. package/scaffold/vanilla/components/alert-dialog.html +24 -0
  32. package/scaffold/vanilla/components/alert.html +24 -0
  33. package/scaffold/vanilla/components/aspect-ratio.html +24 -0
  34. package/scaffold/vanilla/components/avatar.html +24 -0
  35. package/scaffold/vanilla/components/back-to-top.html +24 -0
  36. package/scaffold/vanilla/components/badge.html +24 -0
  37. package/scaffold/vanilla/components/breadcrumb.html +24 -0
  38. package/scaffold/vanilla/components/button-group.html +24 -0
  39. package/scaffold/vanilla/components/button.html +24 -0
  40. package/scaffold/vanilla/components/cards.html +24 -0
  41. package/scaffold/vanilla/components/collapsible.html +24 -0
  42. package/scaffold/vanilla/components/context-menu.html +24 -0
  43. package/scaffold/vanilla/components/copy-to-clipboard.html +24 -0
  44. package/scaffold/vanilla/components/dashboard.html +24 -0
  45. package/scaffold/vanilla/components/divider.html +24 -0
  46. package/scaffold/vanilla/components/docs-sidebar.html +24 -0
  47. package/scaffold/vanilla/components/dropdown.html +24 -0
  48. package/scaffold/vanilla/components/empty.html +24 -0
  49. package/scaffold/vanilla/components/font-switcher.html +24 -0
  50. package/scaffold/vanilla/components/footer.html +24 -0
  51. package/scaffold/vanilla/components/forms.html +24 -0
  52. package/scaffold/vanilla/components/hover-card.html +24 -0
  53. package/scaffold/vanilla/components/icons.html +24 -0
  54. package/scaffold/vanilla/components/index.html +25 -0
  55. package/scaffold/vanilla/components/input-group.html +746 -0
  56. package/scaffold/vanilla/components/kbd.html +24 -0
  57. package/scaffold/vanilla/components/label.html +24 -0
  58. package/scaffold/vanilla/components/modal.html +24 -0
  59. package/scaffold/vanilla/components/navbar.html +24 -0
  60. package/scaffold/vanilla/components/pagination.html +24 -0
  61. package/scaffold/vanilla/components/popover.html +24 -0
  62. package/scaffold/vanilla/components/progress-bar.html +24 -0
  63. package/scaffold/vanilla/components/resizable.html +24 -0
  64. package/scaffold/vanilla/components/scroll-area.html +24 -0
  65. package/scaffold/vanilla/components/search.html +24 -0
  66. package/scaffold/vanilla/components/separator.html +24 -0
  67. package/scaffold/vanilla/components/settings.html +24 -0
  68. package/scaffold/vanilla/components/sheet.html +24 -0
  69. package/scaffold/vanilla/components/skeleton.html +24 -0
  70. package/scaffold/vanilla/components/slider.html +24 -0
  71. package/scaffold/vanilla/components/sound-effects.html +24 -0
  72. package/scaffold/vanilla/components/spinner.html +24 -0
  73. package/scaffold/vanilla/components/switch.html +24 -0
  74. package/scaffold/vanilla/components/table.html +24 -0
  75. package/scaffold/vanilla/components/tabs.html +24 -0
  76. package/scaffold/vanilla/components/theme-switcher.html +24 -0
  77. package/scaffold/vanilla/components/toast.html +24 -0
  78. package/scaffold/vanilla/components/toggle-group.html +24 -0
  79. package/scaffold/vanilla/components/toggle.html +24 -0
  80. package/scaffold/vanilla/components/tooltip.html +24 -0
  81. package/scaffold/vanilla/index.html +26 -2
  82. package/scaffold/vue/base/README-RIZZO.md +50 -0
  83. package/scaffold/vue/base/gitignore +8 -0
  84. package/scaffold/vue/base/index.html +16 -0
  85. package/scaffold/vue/base/package.json +20 -0
  86. package/scaffold/vue/base/public/.gitkeep +0 -0
  87. package/scaffold/vue/base/src/App.vue +13 -0
  88. package/scaffold/vue/base/src/index.css +1 -0
  89. package/scaffold/vue/base/src/main.ts +5 -0
  90. package/scaffold/vue/base/src/vite-env.d.ts +7 -0
  91. package/scaffold/vue/base/tsconfig.json +22 -0
  92. package/scaffold/vue/base/tsconfig.node.json +10 -0
  93. package/scaffold/vue/base/vite.config.ts +6 -0
package/README.md CHANGED
@@ -16,7 +16,7 @@ bun add rizzo-css
16
16
 
17
17
  The package works with **npm**, **pnpm**, **yarn**, and **bun**. After install, run the CLI with your manager’s runner: `npx` (npm/yarn), `pnpm dlx`, or `bunx`.
18
18
 
19
- **Quick start (no install):** `npx rizzo-css init` — choose **framework** (Vanilla, Astro, Svelte, React, or Vue), then **add to existing** or **create new**. Both flows use the **same template choice**: **Landing** (hero/features), **Docs** (sidebar + sample doc), **Dashboard** (sidebar + stats/table), or **Full** (clone of the docs site). Landing/Docs/Dashboard = component picker (all 56 or pick). We **never overwrite your existing files**; any skipped content is in **RIZZO-SETUP.md**. You must add the `<link>` yourself (CLI prints the exact tag). Non-interactive: `npx rizzo-css init --yes --framework vanilla|astro|svelte|react|vue --template landing|docs|dashboard|full` or `npx rizzo-css add --template landing|docs|dashboard|full`. Optional **rizzo-css.json** and `add --install-package`. All get the **same CSS and component styles**. To use the **official Svelte or Astro create command** plus Rizzo, create the app first, then run `npx rizzo-css add`:
19
+ **Quick start (no install):** `npx rizzo-css init` — choose **framework** (Vanilla, Astro, Svelte, React, or Vue), then **add to existing** or **create new**. Both flows use the **same template choice**: **Landing** (hero/features), **Docs** (sidebar + sample doc), **Dashboard** (sidebar + stats/table), or **Full** (clone of the docs site). Landing/Docs/Dashboard = component picker (all 57 or pick). We **never overwrite your existing files**; any skipped content is in **RIZZO-SETUP.md**. You must add the `<link>` yourself (CLI prints the exact tag). Non-interactive: `npx rizzo-css init --yes --framework vanilla|astro|svelte|react|vue --template landing|docs|dashboard|full` or `npx rizzo-css add --template landing|docs|dashboard|full`. Optional **rizzo-css.json** and `add --install-package`. All get the **same CSS and component styles**. To use the **official Svelte or Astro create command** plus Rizzo, create the app first, then run `npx rizzo-css add`:
20
20
 
21
21
  ```bash
22
22
  npm create svelte@latest my-app && cd my-app && npx rizzo-css add
@@ -25,7 +25,7 @@ npm create astro@latest my-app && cd my-app && npx rizzo-css add
25
25
 
26
26
  **Running the CLI:** npm → `npx`; pnpm → `pnpm dlx`; yarn → `npx` (Yarn 1 has no `dlx`; works with Yarn 2+ too); bun → `bunx`. The [docs site](https://rizzo-css.vercel.app/docs/getting-started) tabs show the correct command for each manager.
27
27
 
28
- **Same flow for new and existing:** Both prompt for **Landing** | **Docs** | **Dashboard** | **Full**. Landing/Docs/Dashboard = component picker (all 56 or pick). Full = site clone (no picker); also writes **RIZZO-SNIPPET.txt** (link + theme) unless `--no-snippet`. `npx rizzo-css doctor` checks config and CSS path. `npx rizzo-css theme` lists themes.
28
+ **Same flow for new and existing:** Both prompt for **Landing** | **Docs** | **Dashboard** | **Full**. Landing/Docs/Dashboard = component picker (all 57 or pick). Full = site clone (no picker); also writes **RIZZO-SNIPPET.txt** (link + theme) unless `--no-snippet`. `npx rizzo-css doctor` checks config and CSS path. `npx rizzo-css theme` lists themes.
29
29
 
30
30
  | | **Create new** (`init` → new) | **Add to existing** (`add` or `init` → existing) |
31
31
  |---|------------------------------|--------------------------------------------------|
@@ -72,7 +72,7 @@ import 'rizzo-css';
72
72
  **Without a bundler (plain HTML):** Use a CDN. Both unpkg and jsDelivr resolve the package root to the built CSS (via the `unpkg` / `jsdelivr` fields in this package). For reliability or to pin a version, use the explicit path:
73
73
 
74
74
  ```html
75
- <!-- unpkg (pin version: replace @latest with @0.0.63 or any version) -->
75
+ <!-- unpkg (pin version: replace @latest with @0.0.65 or any version) -->
76
76
  <link rel="stylesheet" href="https://unpkg.com/rizzo-css@latest/dist/rizzo.min.css" />
77
77
 
78
78
  <!-- or jsDelivr -->
@@ -95,7 +95,7 @@ Theme IDs and full docs: [Theming](https://rizzo-css.vercel.app/docs/theming).
95
95
 
96
96
  ## Docs
97
97
 
98
- Full documentation: **[rizzo-css.vercel.app](https://rizzo-css.vercel.app)** — **Docs** (Getting Started, Design System, Theming, Accessibility), **Components**, **Blocks** (pre-built layouts), **Themes**, **Colors**, and usage for Vanilla, Astro, and Svelte.
98
+ Full documentation: **[rizzo-css.vercel.app](https://rizzo-css.vercel.app)** — **Docs** (Getting Started, Design System, Theming, Accessibility), **Components**, **Blocks** (pre-built layouts), **Themes**, **Colors**, and usage for Vanilla, Astro, Svelte, React, and Vue.
99
99
 
100
100
  ## Package contents
101
101
 
package/bin/rizzo-css.js CHANGED
@@ -197,7 +197,7 @@ const VALID_THEME_VALUES = ['system', ...THEMES];
197
197
  // Components available for scaffold (must match scaffold/svelte and scaffold/astro; missing files are skipped on copy)
198
198
  const SVELTE_COMPONENTS = [
199
199
  'Button', 'Badge', 'Card', 'Dashboard', 'Divider', 'DocsSidebar', 'Footer', 'Spinner', 'ProgressBar', 'Avatar', 'Alert',
200
- 'BackToTop', 'Breadcrumb', 'FormGroup', 'Input', 'Checkbox', 'Textarea', 'Select', 'Radio',
200
+ 'BackToTop', 'Breadcrumb', 'FormGroup', 'Input', 'InputGroup', 'Checkbox', 'Textarea', 'Select', 'Radio',
201
201
  'CopyToClipboard', 'Tooltip', 'Pagination', 'Tabs', 'Accordion', 'Dropdown',
202
202
  'Modal', 'Toast', 'Table', 'ThemeSwitcher', 'FontSwitcher', 'SoundEffects',
203
203
  'Navbar', 'Settings', 'Search', 'Icons', 'Skeleton', 'Switch',
@@ -206,7 +206,7 @@ const SVELTE_COMPONENTS = [
206
206
  ];
207
207
  const ASTRO_COMPONENTS = [
208
208
  'Button', 'Badge', 'Card', 'Dashboard', 'Divider', 'DocsSidebar', 'Footer', 'Spinner', 'ProgressBar', 'Avatar', 'Alert',
209
- 'BackToTop', 'Breadcrumb', 'FormGroup', 'Input', 'Checkbox', 'Textarea', 'Select', 'Radio',
209
+ 'BackToTop', 'Breadcrumb', 'FormGroup', 'Input', 'InputGroup', 'Checkbox', 'Textarea', 'Select', 'Radio',
210
210
  'CopyToClipboard', 'Tooltip', 'Pagination', 'Tabs', 'Accordion', 'Dropdown',
211
211
  'Modal', 'Toast', 'Table', 'ThemeSwitcher', 'FontSwitcher', 'SoundEffects',
212
212
  'Navbar', 'Settings', 'Search', 'Icons', 'Skeleton', 'Switch',
@@ -291,7 +291,7 @@ function logAddedDeps(selected, expanded, framework) {
291
291
  const VANILLA_COMPONENT_SLUGS = {
292
292
  Accordion: 'accordion', Alert: 'alert', AlertDialog: 'alert-dialog', AspectRatio: 'aspect-ratio', Avatar: 'avatar', BackToTop: 'back-to-top', Badge: 'badge', Breadcrumb: 'breadcrumb', Button: 'button', ButtonGroup: 'button-group',
293
293
  Card: 'cards', Checkbox: 'forms', Collapsible: 'collapsible', ContextMenu: 'context-menu', CopyToClipboard: 'copy-to-clipboard', Dashboard: 'dashboard', Divider: 'divider', DocsSidebar: 'docs-sidebar', Dropdown: 'dropdown',
294
- Empty: 'empty', Footer: 'footer', FormGroup: 'forms', HoverCard: 'hover-card', Input: 'forms', Icons: 'icons', Kbd: 'kbd', Label: 'label',
294
+ Empty: 'empty', Footer: 'footer', FormGroup: 'forms', HoverCard: 'hover-card', Input: 'forms', InputGroup: 'input-group', Icons: 'icons', Kbd: 'kbd', Label: 'label',
295
295
  Modal: 'modal', Navbar: 'navbar', Pagination: 'pagination', Popover: 'popover', ProgressBar: 'progress-bar',
296
296
  Radio: 'forms', ResizableHandle: 'resizable', ResizablePane: 'resizable', ResizablePaneGroup: 'resizable', ScrollArea: 'scroll-area', Search: 'search', Separator: 'separator', Select: 'forms', Settings: 'settings', Sheet: 'sheet',
297
297
  Skeleton: 'skeleton', Slider: 'slider', SoundEffects: 'sound-effects', Spinner: 'spinner', Switch: 'switch', Table: 'table',
@@ -564,6 +564,26 @@ function copySvelteGitignore(projectDir) {
564
564
  }
565
565
  }
566
566
 
567
+ /** Copy React scaffold gitignore into project as .gitignore. */
568
+ function copyReactGitignore(projectDir) {
569
+ const gitignorePath = join(getScaffoldReactCoreDir(), SCAFFOLD_GITIGNORE_FILE);
570
+ if (existsSync(gitignorePath)) {
571
+ copyFileSync(gitignorePath, join(projectDir, '.gitignore'));
572
+ const copiedAsFile = join(projectDir, SCAFFOLD_GITIGNORE_FILE);
573
+ if (existsSync(copiedAsFile)) unlinkSync(copiedAsFile);
574
+ }
575
+ }
576
+
577
+ /** Copy Vue scaffold gitignore into project as .gitignore. */
578
+ function copyVueGitignore(projectDir) {
579
+ const gitignorePath = join(getScaffoldVueCoreDir(), SCAFFOLD_GITIGNORE_FILE);
580
+ if (existsSync(gitignorePath)) {
581
+ copyFileSync(gitignorePath, join(projectDir, '.gitignore'));
582
+ const copiedAsFile = join(projectDir, SCAFFOLD_GITIGNORE_FILE);
583
+ if (existsSync(copiedAsFile)) unlinkSync(copiedAsFile);
584
+ }
585
+ }
586
+
567
587
  /** Read rizzo-css.json from cwd. Returns { targetDir?, framework?, packageManager?, theme? } or null. Preserves unknown keys. */
568
588
  function readRizzoConfig(cwd) {
569
589
  if (!cwd || !existsSync(cwd)) return null;
@@ -1104,7 +1124,7 @@ Commands:
1104
1124
  Options (init):
1105
1125
  --yes Non-interactive: scaffold new in cwd with defaults (framework: astro, template: landing)
1106
1126
  --path <dir> Project directory (relative to cwd or absolute). Scaffold and run install there. With --yes; interactive: "Enter path" option.
1107
- --framework <fw> vanilla | astro | svelte | react | vue (same 56 components each)
1127
+ --framework <fw> vanilla | astro | svelte | react | vue (same 57 components each)
1108
1128
  --template <t> create new: css-only | landing | docs | dashboard | full (default: landing). add: same options.
1109
1129
  --package-manager <pm> npm | pnpm | yarn | bun (with --yes, or skip PM prompt when interactive)
1110
1130
  --install After scaffolding, run package manager install in project directory (no prompt)
@@ -1169,7 +1189,7 @@ Component dependencies (Full template):
1169
1189
  Full list of available components and what relies on what: npx rizzo-css help components
1170
1190
 
1171
1191
  Frameworks:
1172
- Scaffolds (init/add): Vanilla, Astro, Svelte, React, Vue. Same 56 components in each framework’s syntax; same CSS and BEM. Docs: https://rizzo-css.vercel.app/docs/react and Vue.
1192
+ Scaffolds (init/add): Vanilla, Astro, Svelte, React, Vue. Same 57 components in each framework’s syntax; same CSS and BEM. Docs: https://rizzo-css.vercel.app/docs/react and Vue.
1173
1193
 
1174
1194
  Docs: https://rizzo-css.vercel.app
1175
1195
  `);
@@ -1702,6 +1722,14 @@ function getScaffoldSvelteCoreDir() {
1702
1722
  return join(getPackageRoot(), 'scaffold', 'svelte', 'base');
1703
1723
  }
1704
1724
 
1725
+ function getScaffoldReactCoreDir() {
1726
+ return join(getPackageRoot(), 'scaffold', 'react', 'base');
1727
+ }
1728
+
1729
+ function getScaffoldVueCoreDir() {
1730
+ return join(getPackageRoot(), 'scaffold', 'vue', 'base');
1731
+ }
1732
+
1705
1733
  function copyDirRecursive(src, dest) {
1706
1734
  mkdirSync(dest, { recursive: true });
1707
1735
  const entries = readdirSync(src, { withFileTypes: true });
@@ -2202,13 +2230,15 @@ async function runAddToExisting(frameworkOverride, options) {
2202
2230
  let addSkippedFiles = [];
2203
2231
  const astroCoreDir = getScaffoldAstroCoreDir();
2204
2232
  const svelteCoreDir = getScaffoldSvelteCoreDir();
2233
+ const reactCoreDir = getScaffoldReactCoreDir();
2234
+ const vueCoreDir = getScaffoldVueCoreDir();
2205
2235
  const themeCommentAdd = ' <!-- Initial: ' + theme + '; dark: ' + defaultDark + '; light: ' + defaultLight + ' (all 14 themes in CSS) -->';
2206
2236
  const copyOpts = options.dryRun && options.plan ? options : undefined;
2207
2237
  if (framework === 'vanilla' && getVariantDir('vanilla', selectedVariation)) {
2208
2238
  const vanillaRepl = { '{{LINK_HREF}}': 'css/rizzo.min.css', '{{TITLE}}': 'App', '{{DATA_THEME}}': theme, '{{THEME_LIST_COMMENT}}': themeCommentAdd };
2209
2239
  const variantResult = copyVariantOverlayNoOverwrite(cwd, 'vanilla', selectedVariation, vanillaRepl, copyOpts);
2210
2240
  if (variantResult && variantResult.skipped) addSkippedFiles = variantResult.skipped;
2211
- } else if (selectedVariation !== 'css-only' && ((framework === 'astro' && existsSync(astroCoreDir)) || (framework === 'svelte' && existsSync(svelteCoreDir)))) {
2241
+ } else if (selectedVariation !== 'css-only' && ((framework === 'astro' && existsSync(astroCoreDir)) || (framework === 'svelte' && existsSync(svelteCoreDir)) || (framework === 'react' && existsSync(reactCoreDir)) || (framework === 'vue' && existsSync(vueCoreDir)))) {
2212
2242
  const themeComment = themeCommentAdd;
2213
2243
  const replacements = {
2214
2244
  '{{DATA_THEME}}': theme,
@@ -2255,6 +2285,14 @@ async function runAddToExisting(frameworkOverride, options) {
2255
2285
  const baseResult = copyDirRecursiveWithReplacementsNoOverwrite(svelteCoreDir, cwd, replacements, cwd, copyOpts);
2256
2286
  const variantResult = copyVariantOverlayNoOverwrite(cwd, 'svelte', selectedVariation, replacements, copyOpts);
2257
2287
  addSkippedFiles = baseResult.skipped.concat(variantResult.skipped || []);
2288
+ } else if (framework === 'react') {
2289
+ const baseResult = copyDirRecursiveWithReplacementsNoOverwrite(reactCoreDir, cwd, replacements, cwd, copyOpts);
2290
+ const variantResult = copyVariantOverlayNoOverwrite(cwd, 'react', selectedVariation, replacements, copyOpts);
2291
+ addSkippedFiles = baseResult.skipped.concat(variantResult.skipped || []);
2292
+ } else if (framework === 'vue') {
2293
+ const baseResult = copyDirRecursiveWithReplacementsNoOverwrite(vueCoreDir, cwd, replacements, cwd, copyOpts);
2294
+ const variantResult = copyVariantOverlayNoOverwrite(cwd, 'vue', selectedVariation, replacements, copyOpts);
2295
+ addSkippedFiles = baseResult.skipped.concat(variantResult.skipped || []);
2258
2296
  }
2259
2297
  }
2260
2298
 
@@ -2607,12 +2645,16 @@ async function cmdInit(argv) {
2607
2645
 
2608
2646
  const astroCoreDir = getScaffoldAstroCoreDir();
2609
2647
  const svelteCoreDir = getScaffoldSvelteCoreDir();
2648
+ const reactCoreDir = getScaffoldReactCoreDir();
2649
+ const vueCoreDir = getScaffoldVueCoreDir();
2610
2650
  const pathsForScaffold = getFrameworkCssPaths(framework);
2611
2651
  const useFullVariant = selectedVariation === 'full' && hasFullVariant(framework);
2612
2652
  const useHandpickAstro = selectedTemplate === 'full' && !fullAllComponents && framework === 'astro' && existsSync(astroCoreDir) && !useFullVariant;
2613
2653
  const useHandpickSvelte = selectedTemplate === 'full' && !fullAllComponents && framework === 'svelte' && existsSync(svelteCoreDir) && !useFullVariant;
2614
2654
  const useAstroBase = selectedTemplate === 'full' && fullAllComponents && framework === 'astro' && existsSync(astroCoreDir) && !useFullVariant;
2615
2655
  const useSvelteBase = selectedTemplate === 'full' && fullAllComponents && framework === 'svelte' && existsSync(svelteCoreDir) && !useFullVariant;
2656
+ const useReactBase = selectedVariation !== 'css-only' && framework === 'react' && existsSync(reactCoreDir);
2657
+ const useVueBase = selectedVariation !== 'css-only' && framework === 'vue' && existsSync(vueCoreDir);
2616
2658
  const useVanillaCore = selectedTemplate === 'full' && fullAllComponents && framework === 'vanilla' && existsSync(getScaffoldVanillaIndex()) && !useFullVariant && selectedVariation === 'landing';
2617
2659
  const useVanillaWithOverlay = selectedTemplate === 'full' && framework === 'vanilla' && (selectedVariation === 'docs' || selectedVariation === 'dashboard') && getVariantDir('vanilla', selectedVariation);
2618
2660
 
@@ -2798,6 +2840,38 @@ async function cmdInit(argv) {
2798
2840
  copyRizzoIcons(projectDir, 'svelte');
2799
2841
  copySvelteComponents(projectDir, componentsToCopy);
2800
2842
  }
2843
+ } else if (useReactBase) {
2844
+ mkdirSync(projectDir, { recursive: true });
2845
+ const { skipped } = copyDirRecursiveWithReplacementsNoOverwrite(reactCoreDir, projectDir, replacements, projectDir);
2846
+ copyVariantOverlay(projectDir, 'react', selectedVariation, replacements);
2847
+ copyRizzoCssAndFontsForAstro(projectDir, cssSource);
2848
+ if (skipped.length > 0) {
2849
+ writeFileSync(join(projectDir, RIZZO_SETUP_FILE), buildRizzoSetupMd('react', { linkHref: '/css/rizzo.min.css', theme, defaultDark, defaultLight, skippedFiles: skipped }), 'utf8');
2850
+ }
2851
+ cssTarget = join(projectDir, 'public', 'css', 'rizzo.min.css');
2852
+ if (existsSync(cssTarget) && statSync(cssTarget).size < 5000) {
2853
+ console.warn('\nWarning: rizzo.min.css is very small. From repo root run: pnpm build:css');
2854
+ }
2855
+ copyPackageLicense(projectDir);
2856
+ copyReactGitignore(projectDir);
2857
+ copyRizzoIcons(projectDir, 'react');
2858
+ if (componentsToCopy.length > 0) copyReactComponents(projectDir, componentsToCopy);
2859
+ } else if (useVueBase) {
2860
+ mkdirSync(projectDir, { recursive: true });
2861
+ const { skipped } = copyDirRecursiveWithReplacementsNoOverwrite(vueCoreDir, projectDir, replacements, projectDir);
2862
+ copyVariantOverlay(projectDir, 'vue', selectedVariation, replacements);
2863
+ copyRizzoCssAndFontsForAstro(projectDir, cssSource);
2864
+ if (skipped.length > 0) {
2865
+ writeFileSync(join(projectDir, RIZZO_SETUP_FILE), buildRizzoSetupMd('vue', { linkHref: '/css/rizzo.min.css', theme, defaultDark, defaultLight, skippedFiles: skipped }), 'utf8');
2866
+ }
2867
+ cssTarget = join(projectDir, 'public', 'css', 'rizzo.min.css');
2868
+ if (existsSync(cssTarget) && statSync(cssTarget).size < 5000) {
2869
+ console.warn('\nWarning: rizzo.min.css is very small. From repo root run: pnpm build:css');
2870
+ }
2871
+ copyPackageLicense(projectDir);
2872
+ copyVueGitignore(projectDir);
2873
+ copyRizzoIcons(projectDir, 'vue');
2874
+ if (componentsToCopy.length > 0) copyVueComponents(projectDir, componentsToCopy);
2801
2875
  } else if (selectedVariation === 'css-only') {
2802
2876
  // CSS only: no components, no web pages — just CSS, fonts, license, README, .gitignore (and framework base for Astro/Svelte)
2803
2877
  mkdirSync(projectDir, { recursive: true });
@@ -2828,6 +2902,24 @@ async function cmdInit(argv) {
2828
2902
  cssTarget = join(projectDir, 'static', 'css', 'rizzo.min.css');
2829
2903
  copyPackageLicense(projectDir);
2830
2904
  copySvelteGitignore(projectDir);
2905
+ } else if (framework === 'react' && existsSync(reactCoreDir)) {
2906
+ const { skipped } = copyDirRecursiveWithReplacementsNoOverwrite(reactCoreDir, projectDir, replacements, projectDir);
2907
+ copyRizzoCssAndFontsForAstro(projectDir, cssSource);
2908
+ if (skipped.length > 0) {
2909
+ writeFileSync(join(projectDir, RIZZO_SETUP_FILE), buildRizzoSetupMd('react', { linkHref: '/css/rizzo.min.css', theme, defaultDark, defaultLight, skippedFiles: skipped }), 'utf8');
2910
+ }
2911
+ cssTarget = join(projectDir, 'public', 'css', 'rizzo.min.css');
2912
+ copyPackageLicense(projectDir);
2913
+ copyReactGitignore(projectDir);
2914
+ } else if (framework === 'vue' && existsSync(vueCoreDir)) {
2915
+ const { skipped } = copyDirRecursiveWithReplacementsNoOverwrite(vueCoreDir, projectDir, replacements, projectDir);
2916
+ copyRizzoCssAndFontsForAstro(projectDir, cssSource);
2917
+ if (skipped.length > 0) {
2918
+ writeFileSync(join(projectDir, RIZZO_SETUP_FILE), buildRizzoSetupMd('vue', { linkHref: '/css/rizzo.min.css', theme, defaultDark, defaultLight, skippedFiles: skipped }), 'utf8');
2919
+ }
2920
+ cssTarget = join(projectDir, 'public', 'css', 'rizzo.min.css');
2921
+ copyPackageLicense(projectDir);
2922
+ copyVueGitignore(projectDir);
2831
2923
  } else {
2832
2924
  // fallback: same as vanilla (no index.html)
2833
2925
  const cssDir = join(projectDir, pathsForScaffold.targetDir);
@@ -3033,7 +3125,7 @@ async function cmdInit(argv) {
3033
3125
  const pm = getPackageManagerCommands({ agent: selectedPm, command: selectedPm });
3034
3126
  const nextStep = pm.install + ' && ' + pm.run('dev');
3035
3127
  const runPrefix = projectDir !== cwd ? 'cd ' + pathRelative(cwd, projectDir) + ' && ' : '';
3036
- const hasPackageJson = useHandpickAstro || useHandpickSvelte || useAstroBase || useSvelteBase || (selectedVariation === 'css-only' && (framework === 'astro' || framework === 'svelte'));
3128
+ const hasPackageJson = useHandpickAstro || useHandpickSvelte || useAstroBase || useSvelteBase || useReactBase || useVueBase || (selectedVariation === 'css-only' && (framework === 'astro' || framework === 'svelte' || framework === 'react' || framework === 'vue'));
3037
3129
 
3038
3130
  console.log('\n Scaffold complete. Summary above.');
3039
3131
 
@@ -3092,8 +3184,15 @@ async function cmdInit(argv) {
3092
3184
  if (useSvelteBase) {
3093
3185
  console.log(' - SvelteKit (core): app + ' + selectedComponents.length + ' component(s). Run: ' + runPrefix + nextStep);
3094
3186
  }
3095
- if ((framework === 'astro' || framework === 'svelte') && !useAstroBase && !useSvelteBase && !useHandpickAstro && !useHandpickSvelte) {
3096
- const fw = framework === 'svelte' ? 'Svelte' : 'Astro';
3187
+ if (useReactBase) {
3188
+ console.log(' - React (Vite): app + ' + (componentsToCopy.length > 0 ? componentsToCopy.length + ' component(s).' : 'base.') + ' Run: ' + runPrefix + nextStep);
3189
+ }
3190
+ if (useVueBase) {
3191
+ console.log(' - Vue (Vite): app + ' + (componentsToCopy.length > 0 ? componentsToCopy.length + ' component(s).' : 'base.') + ' Run: ' + runPrefix + nextStep);
3192
+ }
3193
+ const hasBaseScaffold = useAstroBase || useSvelteBase || useHandpickAstro || useHandpickSvelte || useReactBase || useVueBase || (selectedVariation === 'css-only' && (framework === 'astro' || framework === 'svelte' || framework === 'react' || framework === 'vue'));
3194
+ if ((framework === 'astro' || framework === 'svelte' || framework === 'react' || framework === 'vue') && !hasBaseScaffold) {
3195
+ const fw = framework === 'svelte' ? 'Svelte' : framework === 'react' ? 'React' : framework === 'vue' ? 'Vue' : 'Astro';
3097
3196
  const createExample = getCreateProjectExample(pm, framework);
3098
3197
  console.log('\n - Basic template (CSS + index). To get a full app: ' + createExample + ', then cd into the project and run ' + pm.dlx('rizzo-css add') + '.');
3099
3198
  }
@@ -89,7 +89,8 @@ input[type="radio"]:disabled{cursor:not-allowed;opacity:var(--opacity-60)}.check
89
89
  .radio-label:hover{color:var(--accent)}.checkbox-label:has(input:disabled),
90
90
  .radio-label:has(input:disabled){cursor:not-allowed;opacity:var(--opacity-60)}.checkbox-label:has(input:disabled):hover,
91
91
  .radio-label:has(input:disabled):hover{color:var(--text)}.checkbox-group,
92
- .radio-group{display:flex;flex-direction:column;gap:var(--spacing-3)}input[type="file"]{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);color:var(--text);cursor:pointer;font-family:var(--font-family);font-size:var(--font-size-base);padding:var(--spacing-0-625) var(--spacing-3);width:100%}input[type="file"]:focus{border-color:var(--accent);box-shadow:0 0 0 var(--spacing-3) oklch(from var(--accent) l c h/10%);outline:none}input[type="file"]:disabled{cursor:not-allowed;opacity:var(--opacity-60)}input[type="range"]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--background-alt);border-radius:var(--radius);height:var(--spacing-2);outline:none;width:100%}input[type="range"]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:var(--accent);border:var(--outline-width) solid var(--background-alt);border-radius:var(--radius-circle);box-shadow:0 0 0 var(--spacing-0-125) var(--accent);cursor:pointer;height:var(--spacing-5);width:var(--spacing-5)}input[type="range"]::-moz-range-thumb{background-color:var(--accent);border:var(--outline-width) solid var(--background-alt);border-radius:var(--radius-circle);box-shadow:0 0 0 var(--spacing-0-125) var(--accent);cursor:pointer;height:var(--spacing-5);width:var(--spacing-5)}input[type="range"]:focus::-webkit-slider-thumb{box-shadow:0 0 0 var(--spacing-0-125) var(--accent),0 0 0 var(--spacing-1) oklch(from var(--accent) l c h/10%)}input[type="range"]:focus::-moz-range-thumb{box-shadow:0 0 0 var(--spacing-0-125) var(--accent),0 0 0 var(--spacing-1) oklch(from var(--accent) l c h/10%)}fieldset{border:var(--border-width) solid var(--border);border-radius:var(--radius-md);margin:0 0 var(--spacing-6);padding:var(--spacing-4)}legend{color:var(--text);font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);padding:0 var(--spacing-2)}.form-error{color:var(--error)}.form-error,.form-success{display:block;font-size:var(--font-size-xs);margin-top:var(--spacing-0-375)}.form-success{color:var(--success)}.form-row{display:flex;gap:var(--spacing-4);margin-bottom:var(--spacing-6)}.form-row .form-group{flex:1;margin-bottom:0}@media (width <= 640px){.form-row{flex-direction:column;gap:var(--spacing-0)}}main{max-width:100%;overflow-x:clip;width:100%}.layout__container{box-sizing:border-box;min-width:0;padding:0;width:100%}.container,.layout__container{margin:0 auto;max-width:var(--container-default)}.container{padding:0 var(--content-padding-x)}.card{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);box-sizing:border-box;color:var(--text);display:flex;flex-direction:column;min-width:0;padding:var(--spacing-6);transition:border-color var(--transition-base),box-shadow var(--transition-base),transform var(--transition-base);width:100%}.card--elevated{border:none;box-shadow:var(--shadow-md)}.card--elevated:hover{box-shadow:var(--shadow-lg);transform:translateY(calc(var(--spacing-0-125)*-1))}.card--outlined{background-color:transparent;border:var(--outline-width) solid var(--border)}.card--outlined:hover{border-color:var(--accent)}.card--filled{background-color:var(--background);border:var(--border-width) solid var(--border)}.card__header{border-bottom:var(--border-width) solid var(--border);margin-bottom:var(--spacing-4);padding-bottom:var(--spacing-4)}.card__header:empty{display:none}.card__body{flex:1}.card__body:empty{display:none}.card__body h2,
92
+ .radio-group{display:flex;flex-direction:column;gap:var(--spacing-3)}input[type="file"]{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);color:var(--text);cursor:pointer;font-family:var(--font-family);font-size:var(--font-size-base);padding:var(--spacing-0-625) var(--spacing-3);width:100%}input[type="file"]:focus{border-color:var(--accent);box-shadow:0 0 0 var(--spacing-3) oklch(from var(--accent) l c h/10%);outline:none}input[type="file"]:disabled{cursor:not-allowed;opacity:var(--opacity-60)}input[type="range"]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--background-alt);border-radius:var(--radius);height:var(--spacing-2);outline:none;width:100%}input[type="range"]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:var(--accent);border:var(--outline-width) solid var(--background-alt);border-radius:var(--radius-circle);box-shadow:0 0 0 var(--spacing-0-125) var(--accent);cursor:pointer;height:var(--spacing-5);width:var(--spacing-5)}input[type="range"]::-moz-range-thumb{background-color:var(--accent);border:var(--outline-width) solid var(--background-alt);border-radius:var(--radius-circle);box-shadow:0 0 0 var(--spacing-0-125) var(--accent);cursor:pointer;height:var(--spacing-5);width:var(--spacing-5)}input[type="range"]:focus::-webkit-slider-thumb{box-shadow:0 0 0 var(--spacing-0-125) var(--accent),0 0 0 var(--spacing-1) oklch(from var(--accent) l c h/10%)}input[type="range"]:focus::-moz-range-thumb{box-shadow:0 0 0 var(--spacing-0-125) var(--accent),0 0 0 var(--spacing-1) oklch(from var(--accent) l c h/10%)}fieldset{border:var(--border-width) solid var(--border);border-radius:var(--radius-md);margin:0 0 var(--spacing-6);padding:var(--spacing-4)}legend{color:var(--text);font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);padding:0 var(--spacing-2)}.form-error{color:var(--error)}.form-error,.form-success{display:block;font-size:var(--font-size-xs);margin-top:var(--spacing-0-375)}.form-success{color:var(--success)}.input-group{display:flex;width:100%}.input-group__wrapper{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);display:flex;flex:1;min-width:0;transition:border-color var(--transition-base),box-shadow var(--transition-base)}.input-group__wrapper:focus-within{border-color:var(--accent);box-shadow:0 0 0 var(--spacing-3) oklch(from var(--accent) l c h/10%);outline:none}.input-group__addon{align-items:center;background-color:var(--background);border:var(--border-width) solid var(--border);color:var(--text-dim);display:inline-flex;font-size:var(--font-size-base);padding:var(--spacing-0-625) var(--spacing-3);white-space:nowrap}.input-group__addon--prefix{border-radius:var(--radius-md) 0 0 var(--radius-md);border-right:none}.input-group__addon--suffix{border-left:none;border-radius:0 var(--radius-md) var(--radius-md) 0}.input-group__input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:var(--border-width) solid var(--border);border-radius:0;color:var(--text);flex:1;font-family:var(--font-family);font-size:var(--font-size-base);line-height:var(--line-height-normal);min-width:0;padding:var(--spacing-0-625) var(--spacing-3);transition:border-color var(--transition-base)}.input-group__input::-moz-placeholder{color:var(--text-dim);opacity:var(--opacity-70)}.input-group__input::placeholder{color:var(--text-dim);opacity:var(--opacity-70)}.input-group__wrapper:has(.input-group__addon--prefix):not(:has(.input-group__addon--suffix)) .input-group__input{border-left:none;border-radius:0 var(--radius-md) var(--radius-md) 0}.input-group__wrapper:has(.input-group__addon--suffix):not(:has(.input-group__addon--prefix)) .input-group__input{border-radius:var(--radius-md) 0 0 var(--radius-md);border-right:none}.input-group__wrapper:has(.input-group__addon--prefix):has(.input-group__addon--suffix) .input-group__input{border-left:none;border-right:none}.input-group__input:focus{border-color:transparent;box-shadow:none;outline:none}.input-group__input:disabled,
93
+ .input-group__wrapper:has(.input-group__input:disabled){cursor:not-allowed;opacity:var(--opacity-60)}.input-group--error .input-group__wrapper{border-color:var(--error)}.input-group--error .input-group__wrapper:focus-within{border-color:var(--error);box-shadow:0 0 0 var(--spacing-3) oklch(from var(--error) l c h/10%)}.input-group--success .input-group__wrapper{border-color:var(--success)}.input-group--success .input-group__wrapper:focus-within{border-color:var(--success);box-shadow:0 0 0 var(--spacing-3) oklch(from var(--success) l c h/10%)}.form-row{display:flex;gap:var(--spacing-4);margin-bottom:var(--spacing-6)}.form-row .form-group{flex:1;margin-bottom:0}@media (width <= 640px){.form-row{flex-direction:column;gap:var(--spacing-0)}}main{max-width:100%;overflow-x:clip;width:100%}.layout__container{box-sizing:border-box;min-width:0;padding:0;width:100%}.container,.layout__container{margin:0 auto;max-width:var(--container-default)}.container{padding:0 var(--content-padding-x)}.card{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);box-sizing:border-box;color:var(--text);display:flex;flex-direction:column;min-width:0;padding:var(--spacing-6);transition:border-color var(--transition-base),box-shadow var(--transition-base),transform var(--transition-base);width:100%}.card--elevated{border:none;box-shadow:var(--shadow-md)}.card--elevated:hover{box-shadow:var(--shadow-lg);transform:translateY(calc(var(--spacing-0-125)*-1))}.card--outlined{background-color:transparent;border:var(--outline-width) solid var(--border)}.card--outlined:hover{border-color:var(--accent)}.card--filled{background-color:var(--background);border:var(--border-width) solid var(--border)}.card__header{border-bottom:var(--border-width) solid var(--border);margin-bottom:var(--spacing-4);padding-bottom:var(--spacing-4)}.card__header:empty{display:none}.card__body{flex:1}.card__body:empty{display:none}.card__body h2,
93
94
  .card__body h3,
94
95
  .card__body h4{color:var(--text)}.card a{text-decoration:none}
95
96
  .card a:hover,.card:hover a{text-decoration:underline;text-underline-offset:.15em}.card__footer{border-top:var(--border-width) solid var(--border);margin-top:var(--spacing-4);padding-top:var(--spacing-4)}.card__footer:empty{display:none}.card__image{border-radius:var(--radius-lg) var(--radius-lg) 0 0;display:block;height:auto;margin:calc(var(--spacing-6)*-1) calc(var(--spacing-6)*-1) var(--spacing-6) calc(var(--spacing-6)*-1);-o-object-fit:cover;object-fit:cover;width:100%}.card:has(.card__image){padding-top:0}.card__image + .card__header{margin-top:0;padding-top:0}.card__title{color:var(--text);font-size:var(--font-size-xl);font-weight:var(--font-weight-semibold);margin:0 0 var(--spacing-2) 0}.card__subtitle{color:var(--text-dim);font-size:var(--font-size-sm);margin:0}section{background-color:var(--background);color:var(--text)}.border{border:var(--border-width) solid var(--border)}.border-top{border-top:var(--border-width) solid var(--border)}.border-bottom{border-bottom:var(--border-width) solid var(--border)}.border-left{border-left:var(--border-width) solid var(--border)}.border-right{border-right:var(--border-width) solid var(--border)}.m-0{margin:0}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-3{margin:.75rem}.m-4{margin:1rem}.m-5{margin:1.25rem}.m-6{margin:1.5rem}.m-8{margin:2rem}.m-10{margin:2.5rem}.m-12{margin:3rem}.m-16{margin:4rem}.m-20{margin:5rem}.m-24{margin:6rem}.m-auto{margin:auto}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-16{margin-top:4rem}.mt-20{margin-top:5rem}.mt-24{margin-top:6rem}.mt-auto{margin-top:auto}.mr-0{margin-right:0}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mr-6{margin-right:1.5rem}.mr-8{margin-right:2rem}.mr-10{margin-right:2.5rem}.mr-12{margin-right:3rem}.mr-16{margin-right:4rem}.mr-20{margin-right:5rem}.mr-24{margin-right:6rem}.mr-auto{margin-right:auto}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-16{margin-bottom:4rem}.mb-20{margin-bottom:5rem}.mb-24{margin-bottom:6rem}.mb-auto{margin-bottom:auto}.ml-0{margin-left:0}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.ml-6{margin-left:1.5rem}.ml-8{margin-left:2rem}.ml-10{margin-left:2.5rem}.ml-12{margin-left:3rem}.ml-16{margin-left:4rem}.ml-20{margin-left:5rem}.ml-24{margin-left:6rem}.ml-auto{margin-left:auto}.mx-0{margin-left:0;margin-right:0}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.mx-12{margin-left:3rem;margin-right:3rem}.mx-16{margin-left:4rem;margin-right:4rem}.mx-20{margin-left:5rem;margin-right:5rem}.mx-24{margin-left:6rem;margin-right:6rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0{margin-bottom:0;margin-top:0}.my-1{margin-bottom:.25rem;margin-top:.25rem}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-3{margin-bottom:.75rem;margin-top:.75rem}.my-4{margin-bottom:1rem;margin-top:1rem}.my-5{margin-bottom:1.25rem;margin-top:1.25rem}.my-6{margin-bottom:1.5rem;margin-top:1.5rem}.my-8{margin-bottom:2rem;margin-top:2rem}.my-10{margin-bottom:2.5rem;margin-top:2.5rem}.my-12{margin-bottom:3rem;margin-top:3rem}.my-16{margin-bottom:4rem;margin-top:4rem}.my-20{margin-bottom:5rem;margin-top:5rem}.my-24{margin-bottom:6rem;margin-top:6rem}.my-auto{margin-bottom:auto;margin-top:auto}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-16{padding:4rem}.p-20{padding:5rem}.p-24{padding:6rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.pt-10{padding-top:2.5rem}.pt-12{padding-top:3rem}.pt-16{padding-top:4rem}.pt-20{padding-top:5rem}.pt-24{padding-top:6rem}.pr-0{padding-right:0}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-5{padding-right:1.25rem}.pr-6{padding-right:1.5rem}.pr-8{padding-right:2rem}.pr-10{padding-right:2.5rem}.pr-12{padding-right:3rem}.pr-16{padding-right:4rem}.pr-20{padding-right:5rem}.pr-24{padding-right:6rem}.pb-0{padding-bottom:0}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pb-10{padding-bottom:2.5rem}.pb-12{padding-bottom:3rem}.pb-16{padding-bottom:4rem}.pb-20{padding-bottom:5rem}.pb-24{padding-bottom:6rem}.pl-0{padding-left:0}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pl-10{padding-left:2.5rem}.pl-12{padding-left:3rem}.pl-16{padding-left:4rem}.pl-20{padding-left:5rem}.pl-24{padding-left:6rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-12{padding-left:3rem;padding-right:3rem}.px-16{padding-left:4rem;padding-right:4rem}.px-20{padding-left:5rem;padding-right:5rem}.px-24{padding-left:6rem;padding-right:6rem}.py-0{padding-bottom:0;padding-top:0}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-8{padding-bottom:2rem;padding-top:2rem}.py-10{padding-bottom:2.5rem;padding-top:2.5rem}.py-12{padding-bottom:3rem;padding-top:3rem}.py-16{padding-bottom:4rem;padding-top:4rem}.py-20{padding-bottom:5rem;padding-top:5rem}.py-24{padding-bottom:6rem;padding-top:6rem}.container-sm{max-width:640px}.container-md,.container-sm{margin-left:auto;margin-right:auto;padding-left:var(--spacing-4);padding-right:var(--spacing-4)}.container-md{max-width:768px}.container-lg{max-width:1024px}.container-lg,.container-xl{margin-left:auto;margin-right:auto;padding-left:var(--spacing-4);padding-right:var(--spacing-4)}.container-xl{max-width:1280px}.container-2xl{max-width:1536px}.container-2xl,.container-full{margin-left:auto;margin-right:auto;padding-left:var(--spacing-4);padding-right:var(--spacing-4)}.container-full{max-width:100%}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.w-fit{width:-moz-fit-content;width:fit-content}.w-max{width:-moz-max-content;width:max-content}.w-min{width:-moz-min-content;width:min-content}.w-0{width:0}.w-1{width:.25rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-32{width:8rem}.w-40{width:10rem}.w-48{width:12rem}.w-56{width:14rem}.w-64{width:16rem}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.h-fit{height:-moz-fit-content;height:fit-content}.h-max{height:-moz-max-content;height:max-content}.h-min{height:-moz-min-content;height:min-content}.h-0{height:0}.h-1{height:.25rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-32{height:8rem}.h-40{height:10rem}.h-48{height:12rem}.h-56{height:14rem}.h-64{height:16rem}.min-w-0{min-width:0}.min-w-full{min-width:100%}.min-w-min{min-width:-moz-min-content;min-width:min-content}.min-w-max{min-width:-moz-max-content;min-width:max-content}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.min-h-0{min-height:0}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-h-fit{min-height:-moz-fit-content;min-height:fit-content}.min-h-max{min-height:-moz-max-content;min-height:max-content}.min-h-min{min-height:-moz-min-content;min-height:min-content}.max-w-none{max-width:none}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-screen-sm{max-width:640px}.max-w-screen-md{max-width:768px}.max-w-screen-lg{max-width:1024px}.max-w-screen-xl{max-width:1280px}.max-w-screen-2xl{max-width:1536px}.max-h-none{max-height:none}.max-h-full{max-height:100%}.max-h-screen{max-height:100vh}.max-h-fit{max-height:-moz-fit-content;max-height:fit-content}.max-h-max{max-height:-moz-max-content;max-height:max-content}.max-h-min{max-height:-moz-min-content;max-height:min-content}.max-h-0{max-height:0}.max-h-1{max-height:.25rem}.max-h-2{max-height:.5rem}.max-h-3{max-height:.75rem}.max-h-4{max-height:1rem}.max-h-5{max-height:1.25rem}.max-h-6{max-height:1.5rem}.max-h-8{max-height:2rem}.max-h-10{max-height:2.5rem}.max-h-12{max-height:3rem}.max-h-16{max-height:4rem}.max-h-20{max-height:5rem}.max-h-24{max-height:6rem}.max-h-32{max-height:8rem}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-56{max-height:14rem}.max-h-64{max-height:16rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.inline-grid{display:inline-grid}.table{display:table}.table-row{display:table-row}.table-cell{display:table-cell}.contents{display:contents}.list-item{display:list-item}.hidden{display:none}@media (width >= 640px){.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:grid{display:grid}.sm\:inline-grid{display:inline-grid}.sm\:hidden{display:none}}@media (width >= 768px){.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:inline-flex{display:inline-flex}.md\:grid{display:grid}.md\:inline-grid{display:inline-grid}.md\:hidden{display:none}}@media (width >= 1024px){.lg\:block{display:block}.lg\:inline-block{display:inline-block}.lg\:inline{display:inline}.lg\:flex{display:flex}.lg\:inline-flex{display:inline-flex}.lg\:grid{display:grid}.lg\:inline-grid{display:inline-grid}.lg\:hidden{display:none}}@media (width >= 1280px){.xl\:block{display:block}.xl\:inline-block{display:inline-block}.xl\:inline{display:inline}.xl\:flex{display:flex}.xl\:inline-flex{display:inline-flex}.xl\:grid{display:grid}.xl\:inline-grid{display:inline-grid}.xl\:hidden{display:none}}@media (width >= 1536px){.xxl\:block{display:block}.xxl\:inline-block{display:inline-block}.xxl\:inline{display:inline}.xxl\:flex{display:flex}.xxl\:inline-flex{display:inline-flex}.xxl\:grid{display:grid}.xxl\:inline-grid{display:inline-grid}.xxl\:hidden{display:none}}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-auto{z-index:auto}.z-dropdown{z-index:1000}.z-dropdown-submenu{z-index:1001}.z-modal{z-index:2000}.z-modal-backdrop{z-index:1999}.z-tooltip{z-index:3000}.z-toast{z-index:4000}.z-navbar{z-index:5000}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.rounded-r-none{border-bottom-right-radius:0;border-top-right-radius:0}.rounded-r-sm{border-bottom-right-radius:.125rem;border-top-right-radius:.125rem}.rounded-r{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.rounded-r-md{border-bottom-right-radius:.375rem;border-top-right-radius:.375rem}.rounded-r-lg{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}.rounded-r-xl{border-bottom-right-radius:.75rem;border-top-right-radius:.75rem}.rounded-r-2xl{border-bottom-right-radius:1rem;border-top-right-radius:1rem}.rounded-r-full{border-bottom-right-radius:9999px;border-top-right-radius:9999px}.rounded-b-none{border-bottom-left-radius:0;border-bottom-right-radius:0}.rounded-b-sm{border-bottom-left-radius:.125rem;border-bottom-right-radius:.125rem}.rounded-b{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-b-md{border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-b-lg{border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-b-xl{border-bottom-left-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-b-2xl{border-bottom-left-radius:1rem;border-bottom-right-radius:1rem}.rounded-b-full{border-bottom-left-radius:9999px;border-bottom-right-radius:9999px}.rounded-l-none{border-bottom-left-radius:0;border-top-left-radius:0}.rounded-l-sm{border-bottom-left-radius:.125rem;border-top-left-radius:.125rem}.rounded-l{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.rounded-l-md{border-bottom-left-radius:.375rem;border-top-left-radius:.375rem}.rounded-l-lg{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.rounded-l-xl{border-bottom-left-radius:.75rem;border-top-left-radius:.75rem}.rounded-l-2xl{border-bottom-left-radius:1rem;border-top-left-radius:1rem}.rounded-l-full{border-bottom-left-radius:9999px;border-top-left-radius:9999px}.border-0{border-width:0}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-8{border-width:8px}.border-t-0{border-top-width:0}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-t-4{border-top-width:4px}.border-t-8{border-top-width:8px}.border-r-0{border-right-width:0}.border-r{border-right-width:1px}.border-r-2{border-right-width:2px}.border-r-4{border-right-width:4px}.border-r-8{border-right-width:8px}.border-b-0{border-bottom-width:0}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-b-4{border-bottom-width:4px}.border-b-8{border-bottom-width:8px}.border-l-0{border-left-width:0}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-l-8{border-left-width:8px}.border-transparent{border-color:transparent}.border-color{border-color:var(--border)}.border-accent{border-color:var(--accent)}.border-success{border-color:var(--success)}.border-warning{border-color:var(--warning)}.border-error{border-color:var(--error)}.border-info{border-color:var(--info)}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.flex-nowrap{flex-wrap:nowrap}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.self-auto{align-self:auto}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.self-baseline{align-self:baseline}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.grow{flex-grow:1}.grow-0{flex-grow:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-none{grid-template-columns:none}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid-rows-none{grid-template-rows:none}.col-auto{grid-column:auto}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-full{grid-column:1/-1}.row-auto{grid-row:auto}.row-span-1{grid-row:span 1/span 1}.row-span-2{grid-row:span 2/span 2}.row-span-3{grid-row:span 3/span 3}.row-span-4{grid-row:span 4/span 4}.row-span-5{grid-row:span 5/span 5}.row-span-6{grid-row:span 6/span 6}.row-span-full{grid-row:1/-1}.gap-0{gap:0}.gap-1{gap:var(--spacing-1)}.gap-2{gap:var(--spacing-2)}.gap-3{gap:var(--spacing-3)}.gap-4{gap:var(--spacing-4)}.gap-5{gap:var(--spacing-5)}.gap-6{gap:var(--spacing-6)}.gap-8{gap:var(--spacing-8)}.gap-10{gap:var(--spacing-10)}.gap-12{gap:var(--spacing-12)}.gap-16{gap:var(--spacing-16)}.gap-20{gap:var(--spacing-20)}.gap-24{gap:var(--spacing-24)}.gap-x-0{-moz-column-gap:0;column-gap:0}.gap-x-1{-moz-column-gap:var(--spacing-1);column-gap:var(--spacing-1)}.gap-x-2{-moz-column-gap:var(--spacing-2);column-gap:var(--spacing-2)}.gap-x-3{-moz-column-gap:var(--spacing-3);column-gap:var(--spacing-3)}.gap-x-4{-moz-column-gap:var(--spacing-4);column-gap:var(--spacing-4)}.gap-x-5{-moz-column-gap:var(--spacing-5);column-gap:var(--spacing-5)}.gap-x-6{-moz-column-gap:var(--spacing-6);column-gap:var(--spacing-6)}.gap-x-8{-moz-column-gap:var(--spacing-8);column-gap:var(--spacing-8)}.gap-x-10{-moz-column-gap:var(--spacing-10);column-gap:var(--spacing-10)}.gap-x-12{-moz-column-gap:var(--spacing-12);column-gap:var(--spacing-12)}.gap-x-16{-moz-column-gap:var(--spacing-16);column-gap:var(--spacing-16)}.gap-x-20{-moz-column-gap:var(--spacing-20);column-gap:var(--spacing-20)}.gap-x-24{-moz-column-gap:var(--spacing-24);column-gap:var(--spacing-24)}.gap-y-0{row-gap:0}.gap-y-1{row-gap:var(--spacing-1)}.gap-y-2{row-gap:var(--spacing-2)}.gap-y-3{row-gap:var(--spacing-3)}.gap-y-4{row-gap:var(--spacing-4)}.gap-y-5{row-gap:var(--spacing-5)}.gap-y-6{row-gap:var(--spacing-6)}.gap-y-8{row-gap:var(--spacing-8)}.gap-y-10{row-gap:var(--spacing-10)}.gap-y-12{row-gap:var(--spacing-12)}.gap-y-16{row-gap:var(--spacing-16)}.gap-y-20{row-gap:var(--spacing-20)}.gap-y-24{row-gap:var(--spacing-24)}.transition-none{transition-property:none}.transition-all{transition-property:all}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke}.transition-opacity{transition-property:opacity}.transition-shadow{transition-property:box-shadow}.transition-transform{transition-property:transform}.duration-75{transition-duration:75ms}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-700{transition-duration:.7s}.duration-1000{transition-duration:1s}.ease-linear{transition-timing-function:linear}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.delay-75{transition-delay:75ms}.delay-100{transition-delay:.1s}.delay-150{transition-delay:.15s}.delay-200{transition-delay:.2s}.delay-300{transition-delay:.3s}.delay-500{transition-delay:.5s}.delay-700{transition-delay:.7s}.delay-1000{transition-delay:1s}.transition-fast{transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-base{transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-slow{transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1)}@media (prefers-reduced-motion:reduce){
@@ -219,7 +220,8 @@ div.navbar__link{background:none;border:none;color:inherit;cursor:pointer;font:i
219
220
  #themes-preview .themes-page__preview-dropdown-menu .dropdown__item:focus-visible:not(.dropdown__item--disabled) span,#themes-preview .themes-page__preview-dropdown-menu .dropdown__item:hover:not(.dropdown__item--disabled) span,
220
221
  #themes-preview .themes-page__preview-dropdown-menu .dropdown__item[aria-current="true"] span,
221
222
  #themes-preview .themes-page__preview-dropdown-menu .dropdown__item[aria-current="true"]:focus-visible span,
222
- #themes-preview .themes-page__preview-dropdown-menu .dropdown__item[aria-current="true"]:hover span{color:var(--accent)!important}[data-theme="github-dark-classic"]{--bg:oklch(18% 0.012 264deg);--bg-alt:oklch(15% 0.01 264deg);--current-line:oklch(20% 0.012 264deg);--selection:oklch(28% 0.08 255deg);--fg:oklch(91% 0.004 264deg);--fg-dim:oklch(66% 0.01 264deg);--comment:oklch(52% 0.015 264deg);--cyan:oklch(72% 0.12 250deg);--green:oklch(72% 0.19 145deg);--orange:oklch(78% 0.12 55deg);--pink:oklch(68% 0.14 15deg);--purple:oklch(68% 0.14 300deg);--red:oklch(68% 0.16 15deg);--yellow:oklch(88% 0.12 95deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--icon:var(--fg);--icon-dim:oklch(75% 0.01 264deg);--border:oklch(13% 0.01 264deg);--accent:oklch(45% 0.18 250deg);--accent-hover:oklch(48% 0.18 250deg);--accent-text:oklch(100% 0 0deg);--accent-text-on-hover:var(--accent-text);--accent-fg:var(--cyan);--accent-fg-hover:oklch(78% 0.12 250deg);--success:var(--green);--success-hover:oklch(78% 0.16 145deg);--success-text:oklch(100% 0 0deg);--success-text-on-solid:oklch(22% 0.03 145deg);--warning:var(--orange);--warning-hover:oklch(85% 0.1 55deg);--warning-text:oklch(100% 0 0deg);--warning-text-on-solid:oklch(22% 0.02 55deg);--error:var(--red);--error-hover:oklch(75% 0.14 15deg);--error-text:oklch(100% 0 0deg);--error-text-on-solid:oklch(22% 0.03 25deg);--info:var(--cyan);--info-hover:oklch(78% 0.1 250deg);--info-text:oklch(100% 0 0deg);--info-text-on-solid:oklch(22% 0.03 250deg);--scrollbar-thumb:oklch(42% 0.02 264deg);--scrollbar-thumb-hover:oklch(52% 0.03 264deg);--scrollbar-thumb-active:oklch(58% 0.04 264deg);.card .card__body h2,
223
+ #themes-preview .themes-page__preview-dropdown-menu .dropdown__item[aria-current="true"]:hover span{color:var(--accent)!important}.block-preview-wrapper{border:1px solid var(--border);border-radius:var(--radius-lg);margin:var(--spacing-6) 0;overflow:hidden}.block-preview-wrapper--hero{background:var(--background-alt);padding:var(--spacing-16) var(--spacing-6);text-align:center}.block-preview-wrapper--pricing{background:var(--background-alt);padding:var(--spacing-6)}.block-preview-wrapper--docs{min-height:16rem}.block-preview-wrapper--dashboard{min-height:24rem}.docs-dim{color:var(--text-dim);font-size:var(--font-size-sm);margin-top:0}.landing-hero__title{color:var(--text);font-size:var(--font-size-4xl);font-weight:var(--font-weight-extrabold);line-height:var(--line-height-tight);margin:0 0 var(--spacing-4)}.landing-hero__subtitle{color:var(--text-dim);font-size:var(--font-size-xl);line-height:var(--line-height-relaxed);margin:0 auto var(--spacing-8);max-width:var(--spacing-175)}.landing-hero__ctas{display:flex;flex-wrap:wrap;gap:var(--spacing-3);justify-content:center}.pricing-grid{display:grid;gap:var(--spacing-6);grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));margin:0 auto;max-width:56rem}.pricing-card{display:flex;flex-direction:column}.pricing-card .card__body{display:flex;flex:1;flex-direction:column}.pricing-card--featured{border-color:var(--accent);box-shadow:0 0 0 2px oklch(from var(--accent) l c h/20%)}.pricing-card__badge{align-self:flex-start;margin-bottom:var(--spacing-2)}.pricing-card__name{color:var(--text);font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);margin:0 0 var(--spacing-2)}.pricing-card__price{color:var(--text);font-size:var(--font-size-3xl);font-weight:var(--font-weight-bold);margin:0 0 var(--spacing-0-5)}.pricing-card__currency,
224
+ .pricing-card__period-inline{color:var(--text-dim);font-size:var(--font-size-lg);font-weight:var(--font-weight-normal)}.pricing-card__period{color:var(--text-dim);font-size:var(--font-size-sm);margin:0 0 var(--spacing-4)}.pricing-card__features{color:var(--text);flex:1;font-size:var(--font-size-sm);list-style:none;margin:0 0 var(--spacing-6);padding:0}.pricing-card__features li{padding:var(--spacing-1) 0;padding-left:var(--spacing-4);position:relative}.pricing-card__features li::before{background:var(--accent);border-radius:50%;content:"";height:.35em;left:0;position:absolute;top:.65em;width:.35em}.pricing-card__cta{justify-content:center;width:100%}.dashboard-page__header{margin-bottom:var(--spacing-6)}.dashboard-page__title{color:var(--text);font-size:var(--font-size-2xl);font-weight:var(--font-weight-bold);margin:0 0 var(--spacing-1)}.dashboard-page__subtitle{color:var(--text-dim);font-size:var(--font-size-sm);margin:0}.dashboard-page__stats-grid{display:grid;gap:var(--spacing-4);grid-template-columns:repeat(auto-fill,minmax(10rem,1fr));margin-bottom:var(--spacing-8)}.dashboard-page__stat .card__body{display:flex;flex-direction:column;gap:var(--spacing-1)}.dashboard-page__stat .card__label{color:var(--text-dim);font-size:var(--font-size-sm)}.dashboard-page__stat .card__value{color:var(--text);font-size:var(--font-size-xl);font-weight:var(--font-weight-bold)}.dashboard-page__section-title{color:var(--text);font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);margin:0 0 var(--spacing-4)}.docs-layout-demo{display:flex;min-height:16rem}.docs-layout-demo__sidebar{background:var(--background-alt);border-right:1px solid var(--border);flex-shrink:0;padding:var(--spacing-4);width:12rem}.docs-layout-demo__nav{display:flex;flex-direction:column;gap:var(--spacing-1)}.docs-layout-demo__nav-link{border-radius:var(--radius-md);color:var(--text);display:block;font-size:var(--font-size-sm);padding:var(--spacing-2) var(--spacing-3);text-decoration:none}.docs-layout-demo__nav-link:hover{background:var(--background)}.docs-layout-demo__nav-link--active{background:var(--accent);color:var(--accent-text)}.docs-layout-demo__main{flex:1;overflow:auto;padding:var(--spacing-6)}.docs-layout-demo__header{margin-bottom:var(--spacing-4)}.docs-layout-demo__title{color:var(--text);font-size:var(--font-size-2xl);font-weight:var(--font-weight-bold);margin:0 0 var(--spacing-1)}.docs-layout-demo__desc{color:var(--text-dim);margin:0}.docs-layout-demo__content{margin-top:var(--spacing-4)}[data-theme="github-dark-classic"]{--bg:oklch(18% 0.012 264deg);--bg-alt:oklch(15% 0.01 264deg);--current-line:oklch(20% 0.012 264deg);--selection:oklch(28% 0.08 255deg);--fg:oklch(91% 0.004 264deg);--fg-dim:oklch(66% 0.01 264deg);--comment:oklch(52% 0.015 264deg);--cyan:oklch(72% 0.12 250deg);--green:oklch(72% 0.19 145deg);--orange:oklch(78% 0.12 55deg);--pink:oklch(68% 0.14 15deg);--purple:oklch(68% 0.14 300deg);--red:oklch(68% 0.16 15deg);--yellow:oklch(88% 0.12 95deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--icon:var(--fg);--icon-dim:oklch(75% 0.01 264deg);--border:oklch(13% 0.01 264deg);--accent:oklch(45% 0.18 250deg);--accent-hover:oklch(48% 0.18 250deg);--accent-text:oklch(100% 0 0deg);--accent-text-on-hover:var(--accent-text);--accent-fg:var(--cyan);--accent-fg-hover:oklch(78% 0.12 250deg);--success:var(--green);--success-hover:oklch(78% 0.16 145deg);--success-text:oklch(100% 0 0deg);--success-text-on-solid:oklch(22% 0.03 145deg);--warning:var(--orange);--warning-hover:oklch(85% 0.1 55deg);--warning-text:oklch(100% 0 0deg);--warning-text-on-solid:oklch(22% 0.02 55deg);--error:var(--red);--error-hover:oklch(75% 0.14 15deg);--error-text:oklch(100% 0 0deg);--error-text-on-solid:oklch(22% 0.03 25deg);--info:var(--cyan);--info-hover:oklch(78% 0.1 250deg);--info-text:oklch(100% 0 0deg);--info-text-on-solid:oklch(22% 0.03 250deg);--scrollbar-thumb:oklch(42% 0.02 264deg);--scrollbar-thumb-hover:oklch(52% 0.03 264deg);--scrollbar-thumb-active:oklch(58% 0.04 264deg);.card .card__body h2,
223
225
  .card .card__body h3,
224
226
  .card .card__body h4,.footer__link{color:var(--fg)}}@supports (color:oklch(from red l c h)){[data-theme="github-dark-classic"]{--color-accent-50:oklch(from var(--accent) 0.97deg 0.03 h);--color-accent-100:oklch(from var(--accent) 0.93deg 0.06 h);--color-accent-200:oklch(from var(--accent) 0.88deg 0.1 h);--color-accent-300:oklch(from var(--accent) 0.78deg 0.14 h);--color-accent-400:oklch(from var(--accent) 0.65deg 0.16 h);--color-accent-500:var(--accent);--color-accent-600:oklch(from var(--accent) 0.45deg 0.18 h);--color-accent-700:oklch(from var(--accent) 0.38deg 0.16 h);--color-accent-800:oklch(from var(--accent) 0.3deg 0.12 h);--color-accent-900:oklch(from var(--accent) 0.22deg 0.08 h);--color-accent-950:oklch(from var(--accent) 0.15deg 0.05 h);--color-success-50:oklch(from var(--success) 0.97deg 0.03 h);--color-success-100:oklch(from var(--success) 0.93deg 0.06 h);--color-success-200:oklch(from var(--success) 0.88deg 0.1 h);--color-success-300:oklch(from var(--success) 0.78deg 0.14 h);--color-success-400:oklch(from var(--success) 0.65deg 0.16 h);--color-success-500:var(--success);--color-success-600:oklch(from var(--success) 0.45deg 0.18 h);--color-success-700:oklch(from var(--success) 0.38deg 0.16 h);--color-success-800:oklch(from var(--success) 0.3deg 0.12 h);--color-success-900:oklch(from var(--success) 0.22deg 0.08 h);--color-success-950:oklch(from var(--success) 0.15deg 0.05 h);--color-warning-50:oklch(from var(--warning) 0.97deg 0.03 h);--color-warning-100:oklch(from var(--warning) 0.93deg 0.06 h);--color-warning-200:oklch(from var(--warning) 0.88deg 0.1 h);--color-warning-300:oklch(from var(--warning) 0.82deg 0.12 h);--color-warning-400:oklch(from var(--warning) 0.75deg 0.14 h);--color-warning-500:var(--warning);--color-warning-600:oklch(from var(--warning) 0.55deg 0.14 h);--color-warning-700:oklch(from var(--warning) 0.45deg 0.12 h);--color-warning-800:oklch(from var(--warning) 0.35deg 0.1 h);--color-warning-900:oklch(from var(--warning) 0.25deg 0.06 h);--color-warning-950:oklch(from var(--warning) 0.18deg 0.04 h);--color-error-50:oklch(from var(--error) 0.97deg 0.03 h);--color-error-100:oklch(from var(--error) 0.93deg 0.06 h);--color-error-200:oklch(from var(--error) 0.88deg 0.1 h);--color-error-300:oklch(from var(--error) 0.78deg 0.14 h);--color-error-400:oklch(from var(--error) 0.65deg 0.18 h);--color-error-500:var(--error);--color-error-600:oklch(from var(--error) 0.45deg 0.2 h);--color-error-700:oklch(from var(--error) 0.38deg 0.18 h);--color-error-800:oklch(from var(--error) 0.3deg 0.14 h);--color-error-900:oklch(from var(--error) 0.22deg 0.1 h);--color-error-950:oklch(from var(--error) 0.15deg 0.06 h);--color-info-50:oklch(from var(--info) 0.97deg 0.03 h);--color-info-100:oklch(from var(--info) 0.93deg 0.06 h);--color-info-200:oklch(from var(--info) 0.88deg 0.08 h);--color-info-300:oklch(from var(--info) 0.78deg 0.1 h);--color-info-400:oklch(from var(--info) 0.65deg 0.12 h);--color-info-500:var(--info);--color-info-600:oklch(from var(--info) 0.45deg 0.12 h);--color-info-700:oklch(from var(--info) 0.38deg 0.1 h);--color-info-800:oklch(from var(--info) 0.3deg 0.08 h);--color-info-900:oklch(from var(--info) 0.22deg 0.06 h);--color-info-950:oklch(from var(--info) 0.15deg 0.04 h)}}
225
227
  [data-theme="github-dark-classic"] ::-webkit-scrollbar-thumb,[data-theme="github-dark-classic"]::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rizzo-css",
3
- "version": "0.0.63",
3
+ "version": "0.0.65",
4
4
  "engines": {
5
5
  "node": ">=18"
6
6
  },
@@ -13,7 +13,7 @@ interface Props {
13
13
  links?: FooterLink[];
14
14
  /** Optional class for the root element */
15
15
  class?: string;
16
- /** Optional version string (e.g. from package.json); shown as "v0.0.63" with link to CHANGELOG */
16
+ /** Optional version string (e.g. from package.json); shown as "v0.0.65" with link to CHANGELOG */
17
17
  version?: string;
18
18
  }
19
19
 
@@ -0,0 +1,74 @@
1
+ ---
2
+ /**
3
+ * Input Group – input with optional prefix and/or suffix addons.
4
+ * BEM: input-group, input-group__wrapper, input-group__addon, input-group__addon--prefix|--suffix, input-group__input.
5
+ * Uses design tokens (--border, --accent, --text-dim, --radius-md, etc.).
6
+ */
7
+ interface Props {
8
+ id?: string;
9
+ name?: string;
10
+ type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search';
11
+ value?: string;
12
+ placeholder?: string;
13
+ required?: boolean;
14
+ disabled?: boolean;
15
+ readonly?: boolean;
16
+ autocomplete?: string;
17
+ class?: string;
18
+ error?: boolean;
19
+ success?: boolean;
20
+ /** ID for the inner input (for label for=""). */
21
+ inputId?: string;
22
+ }
23
+
24
+ const {
25
+ id,
26
+ name,
27
+ type = 'text',
28
+ value,
29
+ placeholder,
30
+ required = false,
31
+ disabled = false,
32
+ readonly = false,
33
+ autocomplete,
34
+ class: className = '',
35
+ error = false,
36
+ success = false,
37
+ inputId,
38
+ } = Astro.props;
39
+
40
+ const inputIdFinal = inputId ?? id ?? `input-group-${Math.random().toString(36).slice(2, 9)}`;
41
+ const errorClass = error ? 'input-group--error' : '';
42
+ const successClass = success ? 'input-group--success' : '';
43
+ const rootClass = ['input-group', errorClass, successClass, className].filter(Boolean).join(' ');
44
+ const hasPrefix = Astro.slots.has('prefix');
45
+ const hasSuffix = Astro.slots.has('suffix');
46
+ ---
47
+
48
+ <div class={rootClass}>
49
+ <div class="input-group__wrapper">
50
+ {hasPrefix && (
51
+ <span class="input-group__addon input-group__addon--prefix" aria-hidden="true">
52
+ <slot name="prefix" />
53
+ </span>
54
+ )}
55
+ <input
56
+ id={inputIdFinal}
57
+ name={name}
58
+ type={type}
59
+ value={value}
60
+ placeholder={placeholder}
61
+ required={required}
62
+ disabled={disabled}
63
+ readonly={readonly}
64
+ autocomplete={autocomplete}
65
+ class="input-group__input"
66
+ aria-invalid={error ? 'true' : undefined}
67
+ />
68
+ {hasSuffix && (
69
+ <span class="input-group__addon input-group__addon--suffix" aria-hidden="true">
70
+ <slot name="suffix" />
71
+ </span>
72
+ )}
73
+ </div>
74
+ </div>
@@ -15,7 +15,7 @@
15
15
  Design system · Vanilla · Astro · Svelte
16
16
  </pre>
17
17
 
18
- Astro project with Rizzo CSS. Scaffolded with `npx rizzo-css init` when you chose **Create new** and Astro, then **Landing**, **Docs**, **Dashboard**, or **Full**. **Full** = clone of the docs site. **Landing** / **Docs** / **Dashboard** = base + component picker (all 56 or pick). Same template choice for **Add to existing** (`npx rizzo-css add`).
18
+ Astro project with Rizzo CSS. Scaffolded with `npx rizzo-css init` when you chose **Create new** and Astro, then **Landing**, **Docs**, **Dashboard**, or **Full**. **Full** = clone of the docs site. **Landing** / **Docs** / **Dashboard** = base + component picker (all 57 or pick). Same template choice for **Add to existing** (`npx rizzo-css add`).
19
19
 
20
20
  ## Setup
21
21
 
@@ -10,7 +10,7 @@ const ADD_COMMAND = 'npx rizzo-css add <ComponentName>';
10
10
  <div class="home__container">
11
11
  <header class="home__hero">
12
12
  <h1 class="home__title">Rizzo CSS</h1>
13
- <p class="home__subtitle">A modern CSS design system with semantic theming, accessibility-first components, and one CLI for Vanilla, Astro, and Svelte. Start here then make it your own.</p>
13
+ <p class="home__subtitle">A modern CSS design system with semantic theming, accessibility-first components, and one CLI for Vanilla, Astro, Svelte, React, and Vue. Start here then make it your own.</p>
14
14
  <div class="home__hero-ctas">
15
15
  <a href={`${DOCS_BASE}/docs/getting-started`} class="btn btn-primary home__hero-cta" target="_blank" rel="noopener noreferrer">Get Started<span class="sr-only"> (opens in new tab)</span></a>
16
16
  <a href={`${DOCS_BASE}/docs/components`} class="btn btn-outline home__hero-cta" target="_blank" rel="noopener noreferrer">View Components<span class="sr-only"> (opens in new tab)</span></a>
@@ -19,7 +19,7 @@ const ADD_COMMAND = 'npx rizzo-css add <ComponentName>';
19
19
 
20
20
  <section class="home__features" aria-labelledby="home-features-heading">
21
21
  <h2 id="home-features-heading" class="home__section-title">Features</h2>
22
- <p class="home__features-intro">A complete design system that works across Vanilla, Astro, and Svelte — same CSS, same components, zero lock-in.</p>
22
+ <p class="home__features-intro">A complete design system that works across Vanilla, Astro, Svelte, React, and Vue — same CSS, same components, zero lock-in.</p>
23
23
  <div class="home__features-featured">
24
24
  <div class="home__card home__card--featured">
25
25
  <span class="home__card-icon" aria-hidden="true">Themes</span>
@@ -15,7 +15,7 @@
15
15
  Design system · Vanilla · Astro · Svelte
16
16
  </pre>
17
17
 
18
- Astro project with Rizzo CSS. Scaffolded with `npx rizzo-css init` when you chose **Create new** and Astro, then **Full** template. **Full** = clone of the Rizzo docs site (no component picker). **Landing** / **Docs** / **Dashboard** = base + component picker (all 56 or pick). Same template choice for **Add to existing** (`npx rizzo-css add`).
18
+ Astro project with Rizzo CSS. Scaffolded with `npx rizzo-css init` when you chose **Create new** and Astro, then **Full** template. **Full** = clone of the Rizzo docs site (no component picker). **Landing** / **Docs** / **Dashboard** = base + component picker (all 57 or pick). Same template choice for **Add to existing** (`npx rizzo-css add`).
19
19
 
20
20
  ## Setup
21
21
 
@@ -10,7 +10,7 @@ const ADD_COMMAND = 'npx rizzo-css add <ComponentName>';
10
10
  <div class="home__container">
11
11
  <header class="home__hero">
12
12
  <h1 class="home__title">Rizzo CSS</h1>
13
- <p class="home__subtitle">A modern CSS design system with semantic theming, accessibility-first components, and one CLI for Vanilla, Astro, and Svelte. Start here then make it your own.</p>
13
+ <p class="home__subtitle">A modern CSS design system with semantic theming, accessibility-first components, and one CLI for Vanilla, Astro, Svelte, React, and Vue. Start here then make it your own.</p>
14
14
  <div class="home__hero-ctas">
15
15
  <a href={`${DOCS_BASE}/docs/getting-started`} class="btn btn-primary home__hero-cta" target="_blank" rel="noopener noreferrer">Get Started<span class="sr-only"> (opens in new tab)</span></a>
16
16
  <a href={`${DOCS_BASE}/docs/components`} class="btn btn-outline home__hero-cta" target="_blank" rel="noopener noreferrer">View Components<span class="sr-only"> (opens in new tab)</span></a>
@@ -19,7 +19,7 @@ const ADD_COMMAND = 'npx rizzo-css add <ComponentName>';
19
19
 
20
20
  <section class="home__features" aria-labelledby="home-features-heading">
21
21
  <h2 id="home-features-heading" class="home__section-title">Features</h2>
22
- <p class="home__features-intro">A complete design system that works across Vanilla, Astro, and Svelte — same CSS, same components, zero lock-in.</p>
22
+ <p class="home__features-intro">A complete design system that works across Vanilla, Astro, Svelte, React, and Vue — same CSS, same components, zero lock-in.</p>
23
23
  <div class="home__features-featured">
24
24
  <div class="home__card home__card--featured">
25
25
  <span class="home__card-icon" aria-hidden="true">Themes</span>
@@ -0,0 +1,50 @@
1
+ # React + Rizzo CSS
2
+
3
+ <pre style="font-family: ui-monospace, monospace; font-size: 0.85em; line-height: 1.2;">
4
+ /\___/\
5
+ __( o o )__
6
+ ( =^= )
7
+ _/ ~ \_
8
+ / \_____/ \
9
+ <span style="color:#c44536"> ____ </span><span style="color:#e07c3e"> ___ _</span><span style="color:#d4a800">______</span><span style="color:#2d9d78">______</span><span style="color:#0052bd"> _</span><span style="color:#7c3aed">___ __</span><span style="color:#d946ef">__ ____</span>
10
+ <span style="color:#c44536">| _ \</span><span style="color:#e07c3e">|_ _|_</span><span style="color:#d4a800">_ /__</span><span style="color:#2d9d78"> / _ </span><span style="color:#0052bd">\ / </span><span style="color:#7c3aed">___/ _</span><span style="color:#d946ef">__/ ___|</span>
11
+ <span style="color:#c44536">| |_) </span><span style="color:#e07c3e">|| | </span><span style="color:#d4a800">/ / /</span><span style="color:#2d9d78"> / | |</span><span style="color:#0052bd"> | | |</span><span style="color:#7c3aed"> \__</span><span style="color:#d946ef">_ \___ \</span>
12
+ <span style="color:#c44536">| _ &lt;</span><span style="color:#e07c3e"> | | /</span><span style="color:#d4a800"> /_ / </span><span style="color:#2d9d78">/| |_|</span><span style="color:#0052bd"> | | |</span><span style="color:#7c3aed">___ __</span><span style="color:#d946ef">_) |__) |</span>
13
+ <span style="color:#c44536">|_| \_</span><span style="color:#e07c3e">\___/_</span><span style="color:#d4a800">___/__</span><span style="color:#2d9d78">__\___</span><span style="color:#0052bd">/ \_</span><span style="color:#7c3aed">___|__</span><span style="color:#d946ef">__/____/</span>
14
+
15
+ Design system · Vanilla · Astro · Svelte · React · Vue
16
+ </pre>
17
+
18
+ Vite + React project with Rizzo CSS. Scaffolded with `npx rizzo-css init` when you chose **Create new** and React, then **Landing**, **Docs**, **Dashboard**, or **Full**. Same template choice for **Add to existing** (`npx rizzo-css add`).
19
+
20
+ ## Setup
21
+
22
+ 1. Install dependencies:
23
+ ```bash
24
+ pnpm install
25
+ # or: npm install
26
+ ```
27
+
28
+ 2. Start the dev server:
29
+ ```bash
30
+ pnpm dev
31
+ ```
32
+
33
+ ## Project structure
34
+
35
+ - `vite.config.ts` — Vite configuration
36
+ - `index.html` — HTML shell with Rizzo CSS and theme (edit `data-theme` for default)
37
+ - `src/main.tsx` — Entry point
38
+ - `src/App.tsx` — Root component
39
+ - `public/css/rizzo.min.css` — Rizzo CSS bundle (added by CLI; font URLs point to `/assets/fonts/`)
40
+ - `public/assets/fonts/` — Rizzo font files (added by CLI)
41
+ - `README-RIZZO.md` — This file (scaffold docs; does not replace your project README)
42
+ - `LICENSE-RIZZO` — Rizzo CSS license (does not replace your project LICENSE)
43
+
44
+ ## Commands
45
+
46
+ - `pnpm dev` — Start dev server
47
+ - `pnpm build` — Build for production
48
+ - `pnpm preview` — Preview production build
49
+
50
+ Docs: [rizzo-css.vercel.app](https://rizzo-css.vercel.app)
@@ -0,0 +1,8 @@
1
+ node_modules
2
+ dist
3
+ dist-ssr
4
+ .DS_Store
5
+ .env
6
+ .env.*
7
+ !.env.example
8
+ *.local