rizzo-css 0.0.74 → 0.0.75

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 (77) hide show
  1. package/README.md +3 -3
  2. package/bin/rizzo-css.js +10 -10
  3. package/dist/rizzo.min.css +3 -1
  4. package/package.json +4 -4
  5. package/scaffold/astro/Footer.astro +1 -1
  6. package/scaffold/astro/base/README-RIZZO.md +1 -1
  7. package/scaffold/astro/variants/full/README-RIZZO.md +1 -1
  8. package/scaffold/react/base/package.json +1 -1
  9. package/scaffold/svelte/Chart.svelte +34 -0
  10. package/scaffold/svelte/Command.svelte +89 -0
  11. package/scaffold/svelte/Direction.svelte +17 -0
  12. package/scaffold/svelte/InputOtp.svelte +57 -0
  13. package/scaffold/svelte/Menubar.svelte +78 -0
  14. package/scaffold/svelte/base/README-RIZZO.md +1 -1
  15. package/scaffold/svelte/variants/full/README-RIZZO.md +1 -1
  16. package/scaffold/vanilla/README-RIZZO.md +2 -2
  17. package/scaffold/vanilla/components/accordion.html +16 -0
  18. package/scaffold/vanilla/components/alert-dialog.html +16 -0
  19. package/scaffold/vanilla/components/alert.html +16 -0
  20. package/scaffold/vanilla/components/aspect-ratio.html +16 -0
  21. package/scaffold/vanilla/components/avatar.html +16 -0
  22. package/scaffold/vanilla/components/back-to-top.html +16 -0
  23. package/scaffold/vanilla/components/badge.html +16 -0
  24. package/scaffold/vanilla/components/breadcrumb.html +16 -0
  25. package/scaffold/vanilla/components/button-group.html +16 -0
  26. package/scaffold/vanilla/components/button.html +16 -0
  27. package/scaffold/vanilla/components/calendar.html +16 -0
  28. package/scaffold/vanilla/components/cards.html +16 -0
  29. package/scaffold/vanilla/components/carousel.html +16 -0
  30. package/scaffold/vanilla/components/chart.html +870 -0
  31. package/scaffold/vanilla/components/collapsible.html +16 -0
  32. package/scaffold/vanilla/components/command.html +870 -0
  33. package/scaffold/vanilla/components/context-menu.html +16 -0
  34. package/scaffold/vanilla/components/copy-to-clipboard.html +16 -0
  35. package/scaffold/vanilla/components/dashboard.html +16 -0
  36. package/scaffold/vanilla/components/direction.html +870 -0
  37. package/scaffold/vanilla/components/divider.html +16 -0
  38. package/scaffold/vanilla/components/docs-sidebar.html +16 -0
  39. package/scaffold/vanilla/components/dropdown.html +16 -0
  40. package/scaffold/vanilla/components/empty.html +16 -0
  41. package/scaffold/vanilla/components/font-switcher.html +16 -0
  42. package/scaffold/vanilla/components/footer.html +16 -0
  43. package/scaffold/vanilla/components/forms.html +16 -0
  44. package/scaffold/vanilla/components/hover-card.html +16 -0
  45. package/scaffold/vanilla/components/icons.html +16 -0
  46. package/scaffold/vanilla/components/index.html +21 -0
  47. package/scaffold/vanilla/components/input-group.html +16 -0
  48. package/scaffold/vanilla/components/input-otp.html +870 -0
  49. package/scaffold/vanilla/components/kbd.html +16 -0
  50. package/scaffold/vanilla/components/label.html +16 -0
  51. package/scaffold/vanilla/components/menubar.html +870 -0
  52. package/scaffold/vanilla/components/modal.html +16 -0
  53. package/scaffold/vanilla/components/navbar.html +16 -0
  54. package/scaffold/vanilla/components/pagination.html +16 -0
  55. package/scaffold/vanilla/components/popover.html +16 -0
  56. package/scaffold/vanilla/components/progress-bar.html +16 -0
  57. package/scaffold/vanilla/components/range-calendar.html +16 -0
  58. package/scaffold/vanilla/components/resizable.html +16 -0
  59. package/scaffold/vanilla/components/scroll-area.html +16 -0
  60. package/scaffold/vanilla/components/search.html +16 -0
  61. package/scaffold/vanilla/components/separator.html +16 -0
  62. package/scaffold/vanilla/components/settings.html +16 -0
  63. package/scaffold/vanilla/components/sheet.html +16 -0
  64. package/scaffold/vanilla/components/skeleton.html +16 -0
  65. package/scaffold/vanilla/components/slider.html +16 -0
  66. package/scaffold/vanilla/components/sound-effects.html +16 -0
  67. package/scaffold/vanilla/components/spinner.html +16 -0
  68. package/scaffold/vanilla/components/switch.html +16 -0
  69. package/scaffold/vanilla/components/table.html +16 -0
  70. package/scaffold/vanilla/components/tabs.html +16 -0
  71. package/scaffold/vanilla/components/theme-switcher.html +16 -0
  72. package/scaffold/vanilla/components/toast.html +16 -0
  73. package/scaffold/vanilla/components/toggle-group.html +16 -0
  74. package/scaffold/vanilla/components/toggle.html +16 -0
  75. package/scaffold/vanilla/components/tooltip.html +16 -0
  76. package/scaffold/vanilla/index.html +16 -0
  77. package/scaffold/vue/base/package.json +1 -1
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 53 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 58 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 53 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 58 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.74 or any version) -->
75
+ <!-- unpkg (pin version: replace @latest with @0.0.75 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 -->
package/bin/rizzo-css.js CHANGED
@@ -196,18 +196,18 @@ const THEMES = [...DARK_THEMES, ...LIGHT_THEMES];
196
196
  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
- 'Button', 'Badge', 'Card', 'Calendar', 'RangeCalendar', 'Carousel', 'Dashboard', 'Divider', 'DocsSidebar', 'Footer', 'Spinner', 'ProgressBar', 'Avatar', 'Alert',
200
- 'BackToTop', 'Breadcrumb', 'FormGroup', 'Input', 'InputGroup', 'Checkbox', 'Textarea', 'Select', 'Radio',
201
- 'CopyToClipboard', 'Tooltip', 'Pagination', 'Tabs', 'Accordion', 'Dropdown',
199
+ 'Button', 'Badge', 'Card', 'Calendar', 'RangeCalendar', 'Carousel', 'Chart', 'Dashboard', 'Divider', 'DocsSidebar', 'Footer', 'Spinner', 'ProgressBar', 'Avatar', 'Alert',
200
+ 'BackToTop', 'Breadcrumb', 'Command', 'FormGroup', 'Input', 'InputGroup', 'InputOtp', 'Checkbox', 'Textarea', 'Select', 'Radio',
201
+ 'CopyToClipboard', 'Tooltip', 'Pagination', 'Tabs', 'Accordion', 'Dropdown', 'Direction', 'Menubar',
202
202
  'Modal', 'Toast', 'Table', 'ThemeSwitcher', 'FontSwitcher', 'SoundEffects',
203
203
  'Navbar', 'Settings', 'Search', 'Icons', 'Skeleton', 'Switch',
204
204
  'Label', 'Kbd', 'Collapsible', 'AlertDialog', 'AspectRatio', 'ButtonGroup', 'Empty', 'Separator',
205
205
  'Slider', 'Sheet', 'Popover', 'Toggle', 'ToggleGroup', 'ScrollArea', 'HoverCard', 'ContextMenu', 'ResizablePaneGroup', 'ResizablePane', 'ResizableHandle',
206
206
  ];
207
207
  const ASTRO_COMPONENTS = [
208
- 'Button', 'Badge', 'Card', 'Calendar', 'RangeCalendar', 'Carousel', 'Dashboard', 'Divider', 'DocsSidebar', 'Footer', 'Spinner', 'ProgressBar', 'Avatar', 'Alert',
209
- 'BackToTop', 'Breadcrumb', 'FormGroup', 'Input', 'InputGroup', 'Checkbox', 'Textarea', 'Select', 'Radio',
210
- 'CopyToClipboard', 'Tooltip', 'Pagination', 'Tabs', 'Accordion', 'Dropdown',
208
+ 'Button', 'Badge', 'Card', 'Calendar', 'RangeCalendar', 'Carousel', 'Chart', 'Dashboard', 'Divider', 'DocsSidebar', 'Footer', 'Spinner', 'ProgressBar', 'Avatar', 'Alert',
209
+ 'BackToTop', 'Breadcrumb', 'Command', 'FormGroup', 'Input', 'InputGroup', 'InputOtp', 'Checkbox', 'Textarea', 'Select', 'Radio',
210
+ 'CopyToClipboard', 'Tooltip', 'Pagination', 'Tabs', 'Accordion', 'Dropdown', 'Direction', 'Menubar',
211
211
  'Modal', 'Toast', 'Table', 'ThemeSwitcher', 'FontSwitcher', 'SoundEffects',
212
212
  'Navbar', 'Settings', 'Search', 'Icons', 'Skeleton', 'Switch',
213
213
  'Label', 'Kbd', 'Collapsible', 'AlertDialog', 'AspectRatio', 'ButtonGroup', 'Empty', 'Separator',
@@ -290,8 +290,8 @@ function logAddedDeps(selected, expanded, framework) {
290
290
  // Vanilla scaffold: component name (same as ASTRO_COMPONENTS) -> components/*.html slug. New components (label, kbd, etc.) have stub pages in scaffold/vanilla/components/.
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
- Card: 'cards', Calendar: 'calendar', RangeCalendar: 'range-calendar', Carousel: 'carousel', 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', InputGroup: 'input-group', Icons: 'icons', Kbd: 'kbd', Label: 'label',
293
+ Card: 'cards', Calendar: 'calendar', RangeCalendar: 'range-calendar', Carousel: 'carousel', Chart: 'chart', Checkbox: 'forms', Collapsible: 'collapsible', Command: 'command', ContextMenu: 'context-menu', CopyToClipboard: 'copy-to-clipboard', Dashboard: 'dashboard', Direction: 'direction', Divider: 'divider', DocsSidebar: 'docs-sidebar', Dropdown: 'dropdown',
294
+ Empty: 'empty', Footer: 'footer', FormGroup: 'forms', HoverCard: 'hover-card', Input: 'forms', InputGroup: 'input-group', InputOtp: 'input-otp', Icons: 'icons', Kbd: 'kbd', Label: 'label', Menubar: 'menubar',
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',
@@ -1124,7 +1124,7 @@ Commands:
1124
1124
  Options (init):
1125
1125
  --yes Non-interactive: scaffold new in cwd with defaults (framework: astro, template: landing)
1126
1126
  --path <dir> Project directory (relative to cwd or absolute). Scaffold and run install there. With --yes; interactive: "Enter path" option.
1127
- --framework <fw> vanilla | astro | svelte | react | vue (same 53 components each)
1127
+ --framework <fw> vanilla | astro | svelte | react | vue (same 58 components each)
1128
1128
  --template <t> create new: css-only | landing | docs | dashboard | full (default: landing). add: same options.
1129
1129
  --package-manager <pm> npm | pnpm | yarn | bun (with --yes, or skip PM prompt when interactive)
1130
1130
  --install After scaffolding, run package manager install in project directory (no prompt)
@@ -1189,7 +1189,7 @@ Component dependencies (Full template):
1189
1189
  Full list of available components and what relies on what: npx rizzo-css help components
1190
1190
 
1191
1191
  Frameworks:
1192
- Scaffolds (init/add): Vanilla, Astro, Svelte, React, Vue. Same 53 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 58 components in each framework’s syntax; same CSS and BEM. Docs: https://rizzo-css.vercel.app/docs/react and Vue.
1193
1193
 
1194
1194
  Docs: https://rizzo-css.vercel.app
1195
1195
  `);
@@ -213,7 +213,9 @@ div.navbar__link{background:none;border:none;color:inherit;cursor:pointer;font:i
213
213
  .calendar__next,.calendar__prev{align-items:center;background:transparent;border:none;border-radius:var(--radius-md);color:var(--text);cursor:pointer;display:inline-flex;height:36px;justify-content:center;padding:0;transition:background var(--transition-fast);width:36px}
214
214
  .calendar__next:hover,.calendar__prev:hover{background:var(--border)}.calendar__month{color:var(--text);font-size:var(--font-size-base);font-weight:var(--font-weight-semibold)}.calendar__grid{display:flex;flex-direction:column;gap:0}.calendar__row{display:grid;gap:0;grid-template-columns:repeat(7,1fr)}.calendar__weekday{color:var(--text-dim);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);padding:var(--spacing-1) var(--spacing-2);text-align:center}.calendar__day{align-items:center;background:transparent;border:none;border-radius:var(--radius-md);color:var(--text);cursor:pointer;display:inline-flex;font-size:var(--font-size-sm);height:36px;justify-content:center;margin:2px;min-width:36px;padding:0;transition:background var(--transition-fast)}.calendar__day:hover{background:var(--border)}.calendar__day--today{font-weight:var(--font-weight-semibold);outline:2px solid var(--accent);outline-offset:-2px}.calendar__day--selected{background:var(--accent);color:var(--background)}.calendar__day--selected:hover{background:var(--accent-hover);color:var(--background)}.calendar__day--other-month{color:var(--text-dim);opacity:.7}.calendar__day--in-range{background:oklch(from var(--accent) l c h/20%);color:var(--text)}.calendar__day--in-range:hover{background:oklch(from var(--accent) l c h/35%)}
215
215
  .calendar__day--range-end,.calendar__day--range-start{background:var(--accent);color:var(--accent-text)}
216
- .calendar__day--range-end:hover,.calendar__day--range-start:hover{background:var(--accent-hover);color:var(--accent-text-on-hover)}.home{padding:var(--content-padding-y) 0}.home__container{box-sizing:border-box;margin-left:auto;margin-right:auto;max-width:var(--container-default);min-width:0;padding-left:var(--content-padding-x);padding-right:var(--content-padding-x);width:100%}.home__announcement{align-items:center;background-color:oklch(from var(--accent-fg) l c h/8%);border:var(--border-width) solid oklch(from var(--accent-fg) l c h/14%);border-radius:var(--radius-lg);color:var(--text);display:flex;flex-wrap:wrap;font-size:var(--font-size-sm);gap:var(--spacing-2);justify-content:center;margin-bottom:var(--section-spacing);padding:var(--spacing-3) var(--spacing-4);text-decoration:none;transition:background-color var(--transition-base),border-color var(--transition-base)}.home__announcement:hover{background-color:oklch(from var(--accent-fg) l c h/12%);border-color:oklch(from var(--accent-fg) l c h/20%)}.home__announcement-label{color:var(--accent-fg);font-weight:var(--font-weight-semibold)}.home__announcement-text{color:var(--text-dim)}.home__announcement-arrow{color:var(--text-dim);transition:transform var(--transition-base)}.home__announcement:hover .home__announcement-arrow{transform:translateX(var(--spacing-0-5))}.home__hero{margin-bottom:var(--section-spacing-lg);padding:var(--spacing-14) 0 var(--spacing-16);text-align:center}.home__title{color:var(--text);font-size:var(--font-size-5xl);font-weight:var(--font-weight-extrabold);line-height:var(--line-height-tight);margin:0 0 var(--spacing-6) 0}.home__subtitle{color:var(--text-dim);font-size:var(--font-size-xl);line-height:var(--line-height-relaxed);margin:0 auto var(--spacing-8) auto;max-width:var(--spacing-175)}.home__hero-ctas{display:flex;flex-wrap:wrap;gap:var(--spacing-4);justify-content:center;margin-top:var(--spacing-6)}.home__hero-cta{text-decoration:none}.home__examples-row{display:flex;flex-wrap:wrap;gap:var(--spacing-3);justify-content:center;margin-top:var(--spacing-10)}.home__example-pill{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-full);color:var(--text);display:inline-block;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);padding:var(--spacing-2) var(--spacing-4);text-decoration:none;transition:background-color var(--transition-base),border-color var(--transition-base),color var(--transition-base)}.home__example-pill:hover{background-color:var(--background);border-color:var(--accent);color:var(--accent-fg)}.home__example-pill:focus-visible{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.home__showcase{margin-bottom:var(--section-spacing-lg)}.home__showcase-grid{display:grid;gap:var(--spacing-8);grid-template-columns:1fr;margin:0 auto;max-width:var(--spacing-150)}@media (width >= 768px){.home__showcase-grid{grid-template-columns:1fr 1fr;max-width:100%}}.home__showcase .home__example{margin-bottom:0}.home__showcase .home__example:last-child{grid-column:1/-1;justify-self:center;max-width:var(--spacing-80)}@media (width >= 768px){.home__showcase .home__example:last-child{grid-column:auto;max-width:100%}}.home__section-title{color:var(--text);font-size:var(--font-size-3xl);font-weight:var(--font-weight-bold);margin-bottom:var(--page-header-margin-bottom);text-align:center}.home__install{align-items:center;display:flex;flex-direction:column;justify-content:center;margin-bottom:var(--section-spacing-lg);max-width:100%;min-width:0}.home__install-grid{display:grid;gap:0;grid-template-columns:1fr;margin:0 auto;max-width:var(--spacing-150);min-width:0;width:100%}@media (width >= 768px){.home__install-grid{grid-template-columns:1fr auto 1fr;max-width:100%}}.home__install-block{align-items:stretch;background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);box-sizing:border-box;display:flex;flex-direction:column;justify-content:center;min-height:var(--spacing-24);min-width:0;overflow:hidden;padding:var(--spacing-6);width:100%}.home__install-or{align-items:center;color:var(--text-dim);display:flex;font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);gap:var(--spacing-4);justify-content:center;letter-spacing:var(--letter-spacing-wider);padding:var(--spacing-4) 0}
216
+ .calendar__day--range-end:hover,.calendar__day--range-start:hover{background:var(--accent-hover);color:var(--accent-text-on-hover)}.chart{--chart-bar-fill:var(--accent);display:block;width:100%}.chart__bars{align-items:flex-end;display:flex;gap:var(--spacing-2);min-height:120px;padding:var(--spacing-4) 0}.chart__bar-wrap{align-items:center;display:flex;flex:1;flex-direction:column;gap:var(--spacing-1)}.chart__bar{background:var(--chart-bar-fill);border-radius:var(--radius-sm);max-width:2.5rem;min-height:4px;transition:height .2s ease;width:100%}.chart__label{color:var(--text-dim);font-size:var(--font-size-sm)}.command-root{position:relative}.command__overlay{background:oklch(from var(--overlay) l c h/60%);inset:0;z-index:var(--z-modal,4000)}.command__dialog,.command__overlay{animation:overlay-in .15s ease;position:fixed}.command__dialog{background:var(--background);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;left:50%;max-height:70vh;top:15%;transform:translateX(-50%);width:min(100% - var(--spacing-8),28rem);z-index:calc(var(--z-modal, 4000) + 1)}.command__search-wrap{border-bottom:1px solid var(--border);padding:var(--spacing-2)}.command__search{background:var(--background);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);font-size:var(--font-size-base);padding:var(--spacing-2) var(--spacing-3);width:100%}.command__list{max-height:280px;overflow-y:auto;padding:var(--spacing-2)}.command__item{background:transparent;border:none;border-radius:var(--radius);color:var(--text);cursor:pointer;display:block;font-size:var(--font-size-sm);padding:var(--spacing-2) var(--spacing-3);text-align:left;width:100%}.command__item:hover,
217
+ .command__item[aria-selected="true"]{background:var(--background-alt)}.command__item kbd{color:var(--text-dim);font-size:var(--font-size-xs);margin-left:var(--spacing-2)}.direction{display:block}.direction--rtl{direction:rtl}.direction--ltr{direction:ltr}.input-otp{display:flex;gap:var(--spacing-2);justify-content:center}.input-otp__digit{background:var(--background);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);font-size:var(--font-size-lg);font-variant-numeric:tabular-nums;height:2.5rem;text-align:center;width:2.5rem}.input-otp__digit:focus{outline:2px solid var(--accent);outline-offset:2px}.input-otp__digit::-moz-placeholder{color:var(--text-dim)}.input-otp__digit::placeholder{color:var(--text-dim)}.menubar{align-items:center;background:var(--background-alt);border:1px solid var(--border);border-radius:var(--radius);display:flex;gap:0;min-height:2.5rem;padding:0 var(--spacing-2)}.menubar__item{position:relative}.menubar__trigger{background:transparent;border:none;border-radius:var(--radius);color:var(--text);cursor:pointer;font-size:var(--font-size-sm);padding:var(--spacing-2) var(--spacing-3)}.menubar__menu,.menubar__trigger:hover,
218
+ .menubar__trigger[aria-expanded="true"]{background:var(--background)}.menubar__menu{border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow-md);left:0;margin-top:var(--spacing-1);min-width:10rem;padding:var(--spacing-1);position:absolute;top:100%;z-index:100}.menubar__menu-item{background:transparent;border:none;border-radius:var(--radius);color:var(--text);cursor:pointer;display:block;font-size:var(--font-size-sm);padding:var(--spacing-2) var(--spacing-3);text-align:left;text-decoration:none;width:100%}.menubar__menu-item:hover{background:var(--background-alt)}.home{padding:var(--content-padding-y) 0}.home__container{box-sizing:border-box;margin-left:auto;margin-right:auto;max-width:var(--container-default);min-width:0;padding-left:var(--content-padding-x);padding-right:var(--content-padding-x);width:100%}.home__announcement{align-items:center;background-color:oklch(from var(--accent-fg) l c h/8%);border:var(--border-width) solid oklch(from var(--accent-fg) l c h/14%);border-radius:var(--radius-lg);color:var(--text);display:flex;flex-wrap:wrap;font-size:var(--font-size-sm);gap:var(--spacing-2);justify-content:center;margin-bottom:var(--section-spacing);padding:var(--spacing-3) var(--spacing-4);text-decoration:none;transition:background-color var(--transition-base),border-color var(--transition-base)}.home__announcement:hover{background-color:oklch(from var(--accent-fg) l c h/12%);border-color:oklch(from var(--accent-fg) l c h/20%)}.home__announcement-label{color:var(--accent-fg);font-weight:var(--font-weight-semibold)}.home__announcement-text{color:var(--text-dim)}.home__announcement-arrow{color:var(--text-dim);transition:transform var(--transition-base)}.home__announcement:hover .home__announcement-arrow{transform:translateX(var(--spacing-0-5))}.home__hero{margin-bottom:var(--section-spacing-lg);padding:var(--spacing-14) 0 var(--spacing-16);text-align:center}.home__title{color:var(--text);font-size:var(--font-size-5xl);font-weight:var(--font-weight-extrabold);line-height:var(--line-height-tight);margin:0 0 var(--spacing-6) 0}.home__subtitle{color:var(--text-dim);font-size:var(--font-size-xl);line-height:var(--line-height-relaxed);margin:0 auto var(--spacing-8) auto;max-width:var(--spacing-175)}.home__hero-ctas{display:flex;flex-wrap:wrap;gap:var(--spacing-4);justify-content:center;margin-top:var(--spacing-6)}.home__hero-cta{text-decoration:none}.home__examples-row{display:flex;flex-wrap:wrap;gap:var(--spacing-3);justify-content:center;margin-top:var(--spacing-10)}.home__example-pill{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-full);color:var(--text);display:inline-block;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);padding:var(--spacing-2) var(--spacing-4);text-decoration:none;transition:background-color var(--transition-base),border-color var(--transition-base),color var(--transition-base)}.home__example-pill:hover{background-color:var(--background);border-color:var(--accent);color:var(--accent-fg)}.home__example-pill:focus-visible{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.home__showcase{margin-bottom:var(--section-spacing-lg)}.home__showcase-grid{display:grid;gap:var(--spacing-8);grid-template-columns:1fr;margin:0 auto;max-width:var(--spacing-150)}@media (width >= 768px){.home__showcase-grid{grid-template-columns:1fr 1fr;max-width:100%}}.home__showcase .home__example{margin-bottom:0}.home__showcase .home__example:last-child{grid-column:1/-1;justify-self:center;max-width:var(--spacing-80)}@media (width >= 768px){.home__showcase .home__example:last-child{grid-column:auto;max-width:100%}}.home__section-title{color:var(--text);font-size:var(--font-size-3xl);font-weight:var(--font-weight-bold);margin-bottom:var(--page-header-margin-bottom);text-align:center}.home__install{align-items:center;display:flex;flex-direction:column;justify-content:center;margin-bottom:var(--section-spacing-lg);max-width:100%;min-width:0}.home__install-grid{display:grid;gap:0;grid-template-columns:1fr;margin:0 auto;max-width:var(--spacing-150);min-width:0;width:100%}@media (width >= 768px){.home__install-grid{grid-template-columns:1fr auto 1fr;max-width:100%}}.home__install-block{align-items:stretch;background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);box-sizing:border-box;display:flex;flex-direction:column;justify-content:center;min-height:var(--spacing-24);min-width:0;overflow:hidden;padding:var(--spacing-6);width:100%}.home__install-or{align-items:center;color:var(--text-dim);display:flex;font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);gap:var(--spacing-4);justify-content:center;letter-spacing:var(--letter-spacing-wider);padding:var(--spacing-4) 0}
217
219
  .home__install-or::after,.home__install-or::before{border-top:var(--border-width) solid var(--border);content:"";flex:1;height:0}@media (width >= 768px){.home__install-or{flex-direction:column;gap:var(--spacing-4);padding:0 var(--spacing-4)}
218
220
  .home__install-or::after,.home__install-or::before{border-left:var(--border-width) solid var(--border);border-top:none;flex:1;min-height:var(--spacing-8);width:0}}.home__install-title{color:var(--text);font-size:var(--font-size-base);font-weight:var(--font-weight-semibold);margin:0 0 var(--spacing-2) 0;text-align:center}.home__install-label{color:var(--text-dim);font-size:var(--font-size-sm);margin:0 0 var(--spacing-4) 0;text-align:center}.home__install-copy{align-items:center;display:flex;justify-content:center;width:100%}.home__install-copy .copy-to-clipboard{justify-content:space-between;width:100%}.home__install-copy .copy-to-clipboard__text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.home__cli-tabs{margin-top:var(--spacing-1)}.home__cli-tabs .cli-command-tabs__tabs,
219
221
  .home__cli-tabs .package-install-tabs__tabs{margin-top:0}.home__cli-tabs .tabs__list{margin-bottom:var(--spacing-2);overflow-x:visible;overflow-y:visible;scrollbar-width:none}.home__cli-tabs .tabs__list::-webkit-scrollbar{display:none}.home__cli-tabs .tabs__panel{min-height:0;padding:0}.home__cli-tabs .cli-command-tabs__panel .code-block__header{padding:var(--spacing-1) var(--spacing-2)}.home__cli-tabs .cli-command-tabs__panel .code-block pre{padding:var(--spacing-2)}.home__cli-tabs .cli-command-tabs__panel .code-block,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rizzo-css",
3
- "version": "0.0.74",
3
+ "version": "0.0.75",
4
4
  "engines": {
5
5
  "node": ">=18"
6
6
  },
@@ -20,7 +20,7 @@
20
20
  }
21
21
  },
22
22
  "bin": {
23
- "rizzo-css": "./bin/rizzo-css.js"
23
+ "rizzo-css": "bin/rizzo-css.js"
24
24
  },
25
25
  "files": [
26
26
  ".env.example",
@@ -53,9 +53,9 @@
53
53
  ],
54
54
  "repository": {
55
55
  "type": "git",
56
- "url": "https://github.com/mingleusa/rizzo-css.git"
56
+ "url": "git+https://github.com/mingleusa/rizzo-css.git"
57
57
  },
58
58
  "homepage": "https://rizzo-css.vercel.app",
59
59
  "license": "MIT",
60
60
  "author": "mingleusa"
61
- }
61
+ }
@@ -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.74" with link to CHANGELOG */
16
+ /** Optional version string (e.g. from package.json); shown as "v0.0.75" with link to CHANGELOG */
17
17
  version?: string;
18
18
  }
19
19
 
@@ -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 53 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 58 or pick). Same template choice for **Add to existing** (`npx rizzo-css add`).
19
19
 
20
20
  ## Setup
21
21
 
@@ -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 53 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 58 or pick). Same template choice for **Add to existing** (`npx rizzo-css add`).
19
19
 
20
20
  ## Setup
21
21
 
@@ -16,7 +16,7 @@
16
16
  "@types/react": "^18.3.12",
17
17
  "@types/react-dom": "^18.3.1",
18
18
  "@vitejs/plugin-react": "^4.3.3",
19
- "rizzo-css": "^0.0.74",
19
+ "rizzo-css": "^0.0.75",
20
20
  "typescript": "~5.6.2",
21
21
  "vite": "^6.0.1"
22
22
  }
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ interface ChartDataItem {
3
+ label: string;
4
+ value: number;
5
+ }
6
+
7
+ interface Props {
8
+ data?: ChartDataItem[];
9
+ class?: string;
10
+ }
11
+
12
+ let {
13
+ data = [
14
+ { label: 'A', value: 40 },
15
+ { label: 'B', value: 65 },
16
+ { label: 'C', value: 30 },
17
+ ],
18
+ class: className = '',
19
+ }: Props = $props();
20
+
21
+ const max = $derived(Math.max(1, ...data.map((d) => d.value)));
22
+ const ariaLabel = $derived(`Bar chart: ${data.map((d) => `${d.label} ${d.value}`).join(', ')}`);
23
+ </script>
24
+
25
+ <div class="chart {className}" role="img" aria-label={ariaLabel}>
26
+ <div class="chart__bars">
27
+ {#each data as d (d.label)}
28
+ <div class="chart__bar-wrap">
29
+ <div class="chart__bar" style="height: {(d.value / max) * 100}%" />
30
+ <span class="chart__label">{d.label}</span>
31
+ </div>
32
+ {/each}
33
+ </div>
34
+ </div>
@@ -0,0 +1,89 @@
1
+ <script lang="ts">
2
+ interface CommandItem {
3
+ id: string;
4
+ label: string;
5
+ shortcut?: string;
6
+ }
7
+
8
+ interface Props {
9
+ triggerLabel?: string;
10
+ searchPlaceholder?: string;
11
+ items?: CommandItem[];
12
+ class?: string;
13
+ }
14
+
15
+ let {
16
+ triggerLabel = 'Open command palette (⌘K)',
17
+ searchPlaceholder = 'Search…',
18
+ items = [],
19
+ class: className = '',
20
+ }: Props = $props();
21
+
22
+ let open = $state(false);
23
+ let query = $state('');
24
+ let selectedIndex = $state(0);
25
+ let searchEl: HTMLInputElement;
26
+
27
+ const filtered = $derived(items.filter((item) => item.label.toLowerCase().includes(query.toLowerCase())));
28
+
29
+ $effect(() => {
30
+ if (filtered.length) selectedIndex = 0;
31
+ });
32
+
33
+ function close() {
34
+ open = false;
35
+ query = '';
36
+ selectedIndex = 0;
37
+ }
38
+
39
+ function onKey(e: KeyboardEvent) {
40
+ if (e.key === 'Escape') close();
41
+ if ((e.metaKey || e.ctrlKey) && e.key === 'k') {
42
+ e.preventDefault();
43
+ open = !open;
44
+ }
45
+ }
46
+
47
+ $effect(() => {
48
+ if (!open) return;
49
+ document.addEventListener('keydown', onKey);
50
+ queueMicrotask(() => searchEl?.focus());
51
+ return () => document.removeEventListener('keydown', onKey);
52
+ });
53
+ </script>
54
+
55
+ <div class="command-root {className}">
56
+ <button type="button" class="btn btn-outline" onclick={() => (open = true)} aria-haspopup="dialog" aria-expanded={open}>
57
+ {triggerLabel}
58
+ </button>
59
+ {#if open}
60
+ <div class="command__overlay" aria-hidden="false" role="presentation" onclick={close}></div>
61
+ <div class="command__dialog" role="dialog" aria-modal="true" aria-label="Command palette">
62
+ <div class="command__search-wrap">
63
+ <input
64
+ type="search"
65
+ class="command__search"
66
+ placeholder={searchPlaceholder}
67
+ autocomplete="off"
68
+ bind:value={query}
69
+ bind:this={searchEl}
70
+ />
71
+ </div>
72
+ <div class="command__list" role="listbox">
73
+ {#each filtered as item, i}
74
+ <button
75
+ type="button"
76
+ class="command__item"
77
+ role="option"
78
+ aria-selected={i === selectedIndex}
79
+ onclick={close}
80
+ onmouseenter={() => (selectedIndex = i)}
81
+ >
82
+ {item.label}
83
+ {#if item.shortcut}<kbd>{item.shortcut}</kbd>{/if}
84
+ </button>
85
+ {/each}
86
+ </div>
87
+ </div>
88
+ {/if}
89
+ </div>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ interface Props {
5
+ dir?: 'ltr' | 'rtl';
6
+ class?: string;
7
+ children?: Snippet;
8
+ }
9
+
10
+ let { dir = 'ltr', class: className = '', children }: Props = $props();
11
+
12
+ const dirClass = $derived(dir === 'rtl' ? 'direction--rtl' : 'direction--ltr');
13
+ </script>
14
+
15
+ <div class="direction {dirClass} {className}" {dir}>
16
+ {@render children?.()}
17
+ </div>
@@ -0,0 +1,57 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ length?: number;
4
+ ariaLabel?: string;
5
+ class?: string;
6
+ }
7
+
8
+ let { length = 6, ariaLabel = 'One-time code', class: className = '' }: Props = $props();
9
+
10
+ const indices = $derived(Array.from({ length }, (_, i) => i));
11
+ let digits = $state<string[]>(Array(length).fill(''));
12
+ let containerEl: HTMLDivElement;
13
+
14
+ function inputs() {
15
+ return containerEl?.querySelectorAll<HTMLInputElement>('.input-otp__digit') ?? [];
16
+ }
17
+
18
+ function handleInput(i: number, e: Event) {
19
+ const v = (e.target as HTMLInputElement).value.replace(/\D/g, '').slice(-1);
20
+ digits = [...digits];
21
+ digits[i] = v;
22
+ if (v && i < length - 1) inputs()[i + 1]?.focus();
23
+ }
24
+
25
+ function handleKeyDown(i: number, e: KeyboardEvent) {
26
+ if (e.key === 'Backspace' && !digits[i] && i > 0) inputs()[i - 1]?.focus();
27
+ }
28
+
29
+ function handlePaste(e: ClipboardEvent) {
30
+ e.preventDefault();
31
+ const pasted = (e.clipboardData?.getData('text') || '').replace(/\D/g, '').slice(0, length);
32
+ const next = [...digits];
33
+ pasted.split('').forEach((ch, j) => {
34
+ if (next[j] !== undefined) next[j] = ch;
35
+ });
36
+ digits = next;
37
+ const focusIdx = Math.min(pasted.length, length) - 1;
38
+ inputs()[focusIdx]?.focus();
39
+ }
40
+ </script>
41
+
42
+ <div class="input-otp {className}" role="group" aria-label={ariaLabel} bind:this={containerEl}>
43
+ {#each indices as i}
44
+ <input
45
+ type="text"
46
+ inputmode="numeric"
47
+ maxlength="1"
48
+ autocomplete="one-time-code"
49
+ class="input-otp__digit"
50
+ aria-label="Digit {i + 1} of {length}"
51
+ value={digits[i]}
52
+ oninput={(e) => handleInput(i, e)}
53
+ onkeydown={(e) => handleKeyDown(i, e)}
54
+ onpaste={handlePaste}
55
+ />
56
+ {/each}
57
+ </div>
@@ -0,0 +1,78 @@
1
+ <script lang="ts">
2
+ interface MenubarMenuItem {
3
+ label: string;
4
+ href?: string;
5
+ }
6
+
7
+ interface MenubarItem {
8
+ label: string;
9
+ menu: MenubarMenuItem[];
10
+ }
11
+
12
+ interface Props {
13
+ items?: MenubarItem[];
14
+ class?: string;
15
+ }
16
+
17
+ let {
18
+ items = [
19
+ { label: 'File', menu: [{ label: 'New', href: '#' }, { label: 'Open', href: '#' }] },
20
+ { label: 'Edit', menu: [{ label: 'Undo', href: '#' }] },
21
+ ],
22
+ class: className = '',
23
+ }: Props = $props();
24
+
25
+ let openIndex = $state<number | null>(null);
26
+ let navRef: HTMLElement;
27
+
28
+ function close(e?: MouseEvent) {
29
+ if (e && navRef && navRef.contains(e.target as Node)) return;
30
+ openIndex = null;
31
+ }
32
+
33
+ $effect(() => {
34
+ if (openIndex === null) return;
35
+ const onClose = (e: MouseEvent) => close(e);
36
+ const onKey = (e: KeyboardEvent) => {
37
+ if (e.key === 'Escape') openIndex = null;
38
+ };
39
+ const t = setTimeout(() => document.addEventListener('click', onClose), 0);
40
+ document.addEventListener('keydown', onKey);
41
+ return () => {
42
+ clearTimeout(t);
43
+ document.removeEventListener('click', onClose);
44
+ document.removeEventListener('keydown', onKey);
45
+ };
46
+ });
47
+ </script>
48
+
49
+ <nav bind:this={navRef} class="menubar {className}" role="menubar" aria-label="Main menu">
50
+ {#each items as item, i}
51
+ <div class="menubar__item" role="none">
52
+ <button
53
+ type="button"
54
+ role="menuitem"
55
+ class="menubar__trigger"
56
+ aria-haspopup="true"
57
+ aria-expanded={openIndex === i}
58
+ onclick={() => (openIndex = openIndex === i ? null : i)}
59
+ >
60
+ {item.label}
61
+ </button>
62
+ <div
63
+ class="menubar__menu"
64
+ role="menu"
65
+ aria-label={item.label}
66
+ hidden={openIndex !== i}
67
+ >
68
+ {#each item.menu as entry}
69
+ {#if entry.href}
70
+ <a href={entry.href} class="menubar__menu-item" role="menuitem">{entry.label}</a>
71
+ {:else}
72
+ <button type="button" class="menubar__menu-item" role="menuitem" onclick={() => (openIndex = null)}>{entry.label}</button>
73
+ {/if}
74
+ {/each}
75
+ </div>
76
+ </div>
77
+ {/each}
78
+ </nav>
@@ -15,7 +15,7 @@
15
15
  Design system · Vanilla · Astro · Svelte
16
16
  </pre>
17
17
 
18
- SvelteKit project with Rizzo CSS. Scaffolded with `npx rizzo-css init` when you chose **Create new** and Svelte, then **Landing**, **Docs**, **Dashboard**, or **Full**. **Full** = clone of the docs site. **Landing** / **Docs** / **Dashboard** = base + component picker (all 53 or pick). Same template choice for **Add to existing** (`npx rizzo-css add`).
18
+ SvelteKit project with Rizzo CSS. Scaffolded with `npx rizzo-css init` when you chose **Create new** and Svelte, then **Landing**, **Docs**, **Dashboard**, or **Full**. **Full** = clone of the docs site. **Landing** / **Docs** / **Dashboard** = base + component picker (all 58 or pick). Same template choice for **Add to existing** (`npx rizzo-css add`).
19
19
 
20
20
  ## Setup
21
21
 
@@ -15,7 +15,7 @@
15
15
  Design system · Vanilla · Astro · Svelte
16
16
  </pre>
17
17
 
18
- SvelteKit project with Rizzo CSS. Scaffolded with `npx rizzo-css init` when you chose **Create new** and Svelte, then **Full** template. **Full** = clone of the Rizzo docs site (no component picker). **Landing** / **Docs** / **Dashboard** = base + component picker (all 53 or pick). Same template choice for **Add to existing** (`npx rizzo-css add`).
18
+ SvelteKit project with Rizzo CSS. Scaffolded with `npx rizzo-css init` when you chose **Create new** and Svelte, then **Full** template. **Full** = clone of the Rizzo docs site (no component picker). **Landing** / **Docs** / **Dashboard** = base + component picker (all 58 or pick). Same template choice for **Add to existing** (`npx rizzo-css add`).
19
19
 
20
20
  ## Setup
21
21
 
@@ -15,7 +15,7 @@
15
15
  Design system · Vanilla · Astro · Svelte
16
16
  </pre>
17
17
 
18
- This project was scaffolded with `npx rizzo-css init` when you chose **Create new project** and Vanilla JS, then **Landing**, **Docs**, **Dashboard**, or **Full**. **Full** = clone of the docs site. **Landing** / **Docs** / **Dashboard** = CSS, fonts, icons, sfx + component picker (all 53 or pick); Landing adds hero/features; Docs adds sidebar + sample doc; Dashboard adds sidebar + stats/table. **Add to existing project** (or `npx rizzo-css add`) uses the **same template choice**; you must add the stylesheet `<link>` yourself (CLI prints the exact tag).
18
+ This project was scaffolded with `npx rizzo-css init` when you chose **Create new project** and Vanilla JS, then **Landing**, **Docs**, **Dashboard**, or **Full**. **Full** = clone of the docs site. **Landing** / **Docs** / **Dashboard** = CSS, fonts, icons, sfx + component picker (all 58 or pick); Landing adds hero/features; Docs adds sidebar + sample doc; Dashboard adds sidebar + stats/table. **Add to existing project** (or `npx rizzo-css add`) uses the **same template choice**; you must add the stylesheet `<link>` yourself (CLI prints the exact tag).
19
19
 
20
20
  ## First-time setup
21
21
 
@@ -28,7 +28,7 @@ If you prefer to load CSS from a CDN instead of the local file, replace the `<li
28
28
  - `<link rel="stylesheet" href="https://unpkg.com/rizzo-css@latest/dist/rizzo.min.css" />`
29
29
  - Or jsDelivr: `https://cdn.jsdelivr.net/npm/rizzo-css@latest/dist/rizzo.min.css`
30
30
 
31
- (Replace `@latest` with a specific version, e.g. `@0.0.74`, in production.)
31
+ (Replace `@latest` with a specific version, e.g. `@0.0.75`, in production.)
32
32
 
33
33
  The CLI replaces placeholders in `index.html` (e.g. `{{DATA_THEME}}`, `{{TITLE}}`) when you run `rizzo-css init`. The theme selected during init is used on first load when you have no saved preference in the browser.
34
34