rizzo-css 0.0.82 → 0.0.83

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 (75) hide show
  1. package/README.md +1 -1
  2. package/dist/rizzo.min.css +1 -1
  3. package/package.json +1 -1
  4. package/scaffold/astro/Settings.astro +3 -2
  5. package/scaffold/react/DocsSidebar.tsx +10 -3
  6. package/scaffold/react/base/package.json +1 -1
  7. package/scaffold/react/variants/full/package.json +1 -1
  8. package/scaffold/react/variants/full/src/config/docsNav.ts +50 -33
  9. package/scaffold/svelte/Settings.svelte +30 -5
  10. package/scaffold/svelte/variants/full/src/config/docsNav.ts +194 -14
  11. package/scaffold/vanilla/README-RIZZO.md +1 -1
  12. package/scaffold/vanilla/components/accordion.html +2 -0
  13. package/scaffold/vanilla/components/alert-dialog.html +2 -0
  14. package/scaffold/vanilla/components/alert.html +2 -0
  15. package/scaffold/vanilla/components/aspect-ratio.html +2 -0
  16. package/scaffold/vanilla/components/avatar.html +2 -0
  17. package/scaffold/vanilla/components/back-to-top.html +2 -0
  18. package/scaffold/vanilla/components/badge.html +2 -0
  19. package/scaffold/vanilla/components/breadcrumb.html +2 -0
  20. package/scaffold/vanilla/components/button-group.html +2 -0
  21. package/scaffold/vanilla/components/button.html +2 -0
  22. package/scaffold/vanilla/components/calendar.html +2 -0
  23. package/scaffold/vanilla/components/cards.html +2 -0
  24. package/scaffold/vanilla/components/carousel.html +2 -0
  25. package/scaffold/vanilla/components/chart.html +2 -0
  26. package/scaffold/vanilla/components/collapsible.html +2 -0
  27. package/scaffold/vanilla/components/command.html +2 -0
  28. package/scaffold/vanilla/components/context-menu.html +2 -0
  29. package/scaffold/vanilla/components/copy-to-clipboard.html +2 -0
  30. package/scaffold/vanilla/components/dashboard.html +2 -0
  31. package/scaffold/vanilla/components/direction.html +2 -0
  32. package/scaffold/vanilla/components/divider.html +2 -0
  33. package/scaffold/vanilla/components/docs-sidebar.html +2 -0
  34. package/scaffold/vanilla/components/dropdown.html +2 -0
  35. package/scaffold/vanilla/components/empty.html +2 -0
  36. package/scaffold/vanilla/components/font-switcher.html +2 -0
  37. package/scaffold/vanilla/components/footer.html +2 -0
  38. package/scaffold/vanilla/components/forms.html +2 -0
  39. package/scaffold/vanilla/components/hover-card.html +2 -0
  40. package/scaffold/vanilla/components/icons.html +2 -0
  41. package/scaffold/vanilla/components/index.html +2 -0
  42. package/scaffold/vanilla/components/input-group.html +2 -0
  43. package/scaffold/vanilla/components/input-otp.html +2 -0
  44. package/scaffold/vanilla/components/kbd.html +2 -0
  45. package/scaffold/vanilla/components/label.html +2 -0
  46. package/scaffold/vanilla/components/menubar.html +2 -0
  47. package/scaffold/vanilla/components/modal.html +2 -0
  48. package/scaffold/vanilla/components/navbar.html +2 -0
  49. package/scaffold/vanilla/components/pagination.html +2 -0
  50. package/scaffold/vanilla/components/popover.html +2 -0
  51. package/scaffold/vanilla/components/progress-bar.html +2 -0
  52. package/scaffold/vanilla/components/range-calendar.html +2 -0
  53. package/scaffold/vanilla/components/resizable.html +2 -0
  54. package/scaffold/vanilla/components/scroll-area.html +2 -0
  55. package/scaffold/vanilla/components/search.html +2 -0
  56. package/scaffold/vanilla/components/separator.html +2 -0
  57. package/scaffold/vanilla/components/settings.html +2 -0
  58. package/scaffold/vanilla/components/sheet.html +2 -0
  59. package/scaffold/vanilla/components/skeleton.html +2 -0
  60. package/scaffold/vanilla/components/slider.html +2 -0
  61. package/scaffold/vanilla/components/sound-effects.html +2 -0
  62. package/scaffold/vanilla/components/spinner.html +2 -0
  63. package/scaffold/vanilla/components/switch.html +2 -0
  64. package/scaffold/vanilla/components/table.html +2 -0
  65. package/scaffold/vanilla/components/tabs.html +2 -0
  66. package/scaffold/vanilla/components/theme-switcher.html +2 -0
  67. package/scaffold/vanilla/components/toast.html +2 -0
  68. package/scaffold/vanilla/components/toggle-group.html +2 -0
  69. package/scaffold/vanilla/components/toggle.html +2 -0
  70. package/scaffold/vanilla/components/tooltip.html +2 -0
  71. package/scaffold/vanilla/index.html +2 -0
  72. package/scaffold/vue/DocsSidebar.vue +9 -3
  73. package/scaffold/vue/base/package.json +1 -1
  74. package/scaffold/vue/variants/full/package.json +1 -1
  75. package/scaffold/vue/variants/full/src/config/docsNav.ts +50 -33
package/README.md CHANGED
@@ -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.82 or any version) -->
75
+ <!-- unpkg (pin version: replace @latest with @0.0.83 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 -->
@@ -126,7 +126,7 @@ div.navbar__link{background:none;border:none;color:inherit;cursor:pointer;font:i
126
126
  .theme-switcher__option--active:hover{background-color:var(--theme-bg,var(--background));border-left:var(--border-width-accent) solid var(--accent);border-radius:var(--radius);color:var(--text);font-weight:var(--font-weight-medium);padding-left:calc(var(--spacing-4) - var(--border-width-accent))}.theme-switcher__option--active:focus-visible{box-shadow:inset 0 0 0 var(--outline-width) var(--accent)}@media (width <= 768px){.theme-switcher,.theme-switcher__menu{max-width:100%;width:100%}.theme-switcher__menu{box-sizing:border-box;left:0;min-width:0;right:auto}}@media (width <= 640px){.theme-switcher__menu{left:0;right:auto}}.font-switcher{display:inline-block;position:relative;width:var(--theme-switcher-width)}.font-switcher__trigger{align-items:center;background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);color:var(--text);cursor:pointer;display:flex;font-family:var(--font-family);font-size:var(--font-size-base);gap:var(--spacing-3);justify-content:space-between;min-width:0;padding:var(--spacing-3) var(--spacing-4);transition:background-color var(--transition-base),border-color var(--transition-base);width:100%}.font-switcher__label{flex:1;min-width:0;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.font-switcher__trigger:hover{background-color:var(--background);border-color:var(--accent);color:var(--text)}.font-switcher__trigger:focus-visible{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.font-switcher__trigger[aria-expanded="true"] .font-switcher__icon{transform:rotate(180deg)}.font-switcher__icon{color:var(--icon);flex-shrink:0;transition:transform var(--transition-base),color var(--transition-base)}.font-switcher__menu{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-md);display:flex;flex-direction:row;gap:0;left:0;max-height:var(--spacing-100);min-width:var(--theme-switcher-width);opacity:0;overflow-y:auto;position:absolute;top:calc(100% + var(--spacing-2));transform:translateY(calc(var(--spacing-2)*-1));transition:opacity var(--transition-base),visibility var(--transition-base),transform var(--transition-base);visibility:hidden;width:var(--theme-switcher-width);z-index:var(--z-dropdown)}.font-switcher__menu--open{opacity:1;transform:translateY(0);visibility:visible}.font-switcher__menu-options{flex:1 1 auto;min-width:0;overflow-y:auto}.font-switcher__preview{background-color:var(--background);display:flex;flex:0 0 auto;flex-direction:column;gap:var(--spacing-2);justify-content:flex-start;min-width:var(--spacing-32);padding:var(--spacing-4);pointer-events:none;width:var(--spacing-32)}.font-switcher__preview-title{color:var(--text);font-size:var(--font-size-sm);font-weight:var(--font-weight-bold);line-height:1.2;margin:0 0 var(--spacing-1) 0;padding:0}.font-switcher__preview-sample{color:var(--text);font-size:var(--font-size-lg);line-height:1.3;margin:0}.font-switcher__preview-mono{color:var(--text-dim);font-family:var(--font-family-mono);font-size:var(--font-size-sm);margin:0}@media (width <= 480px){.font-switcher__preview{display:none}}@media (width >= 481px){.font-switcher__menu-options{border-right:var(--border-width) solid var(--border)}}.font-switcher__option{align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:none;color:var(--text);cursor:pointer;display:flex;font:inherit;font-family:var(--font-family);font-size:var(--font-size-base);padding:var(--spacing-2) var(--spacing-4);position:relative;text-align:left;transition:background-color var(--transition-fast),color var(--transition-fast);-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}
127
127
  .font-switcher__option:focus-visible,.font-switcher__option:hover{background-color:var(--background);color:var(--text);outline:none}.font-switcher__option:focus-visible{box-shadow:inset 0 0 0 var(--outline-width) var(--accent)}.font-switcher__option--active,
128
128
  .font-switcher__option--active:focus-visible,
129
- .font-switcher__option--active:hover{background-color:var(--background);border-left:var(--border-width-accent) solid var(--accent);border-radius:var(--radius);color:var(--text);font-weight:var(--font-weight-medium);padding-left:calc(var(--spacing-4) - var(--border-width-accent))}.font-switcher__option--active:focus-visible{box-shadow:inset 0 0 0 var(--outline-width) var(--accent)}@media (width <= 768px){.font-switcher,.font-switcher__menu{max-width:100%;width:100%}.font-switcher__menu{box-sizing:border-box;left:0;min-width:0;right:auto}}.settings__control .font-switcher{max-width:100%;width:100%}.settings__control .font-switcher__menu{box-sizing:border-box;max-width:100%;min-width:0;width:100%}.settings{inset:0;pointer-events:none;position:fixed;z-index:var(--z-settings)}.settings[aria-hidden="true"]{display:none}.settings__overlay{backdrop-filter:blur(var(--blur-sm));background-color:var(--overlay);inset:0;opacity:0;pointer-events:all;position:absolute;transition:opacity var(--transition-ease-out);z-index:1}.settings[aria-hidden="false"] .settings__overlay[aria-hidden="false"],.settings__overlay[aria-hidden="false"]{opacity:1}.settings__panel{background-color:var(--background-alt);border-left:var(--border-width) solid var(--border);box-shadow:calc(var(--spacing-1)*-1) 0 var(--spacing-3) calc(var(--spacing-0-125)*-1) oklch(from var(--shadow-color) l c h/15%);display:flex;flex-direction:column;height:100%;max-height:100vh;max-height:100dvh;max-width:var(--spacing-105);overflow:hidden;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(100%);transition:transform var(--transition-ease-out);width:100%;z-index:2}.settings__panel[data-open="true"]{transform:translateX(0)}.settings[aria-hidden="false"] .settings__panel:not([data-open]){transform:translateX(100%)}@media (prefers-reduced-motion:reduce){.settings__overlay,.settings__panel{transition:none}}.settings__header{align-items:center;background-color:var(--background-alt);border-bottom:var(--border-width) solid var(--border);display:flex;flex-shrink:0;justify-content:space-between;padding:var(--spacing-6);position:sticky;top:0;z-index:var(--z-dropdown)}.settings__title{color:var(--text);font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);margin:0}.settings__close{align-items:center;background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);color:var(--text);cursor:pointer;display:flex;height:var(--spacing-8);justify-content:center;min-height:var(--touch-target-min);min-width:var(--touch-target-min);padding:0;transition:background-color var(--transition-base),color var(--transition-base),border-color var(--transition-base);width:var(--spacing-8)}.settings__close:hover{background-color:var(--background-alt);border-color:var(--accent);color:var(--accent)}.settings__close:focus-visible{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.settings__content{background-color:var(--background);display:flex;flex:1 1 0;flex-direction:column;gap:var(--spacing-8);min-height:0;overflow-x:hidden;overflow-y:auto;overscroll-behavior-y:contain;padding:var(--spacing-6);-webkit-overflow-scrolling:touch;scrollbar-gutter:stable}@media (width >= 641px){.settings__content{max-height:calc(100dvh - 4.5rem);max-height:calc(100vh - 4.5rem)}}.settings__section{display:flex;flex-direction:column;gap:var(--spacing-4)}.settings__section-title{color:var(--text);font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);margin:0 0 var(--spacing-4)}.settings__control{display:flex;flex-direction:column;gap:var(--spacing-3)}.settings__control .theme-switcher{max-width:100%;width:100%}.settings__control .theme-switcher__menu{box-sizing:border-box;max-width:100%;min-width:0;width:100%}.settings__label{align-items:center;color:var(--text);display:flex;font-weight:var(--font-weight-medium);justify-content:space-between;margin-bottom:var(--spacing-3)}.settings__label-text{font-size:var(--font-size-base)}.settings__label-value{color:var(--text-dim);font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold)}.settings__slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:linear-gradient(to right,var(--accent) 0,var(--accent) var(--slider-progress,50%),var(--background-alt) var(--slider-progress,50%),var(--background-alt) 100%);border:var(--border-width) solid var(--border);border-radius:var(--radius);cursor:pointer;height:var(--spacing-2);outline:none;width:100%}.settings__slider::-webkit-slider-runnable-track{background:linear-gradient(to right,var(--accent) 0,var(--accent) var(--slider-progress,50%),var(--background-alt) var(--slider-progress,50%),var(--background-alt) 100%);border:var(--border-width) solid var(--border);border-radius:var(--radius);box-shadow:inset 0 var(--spacing-0-125) var(--spacing-0-125) oklch(from var(--shadow-color) l c h/10%);height:var(--spacing-2);width:100%}.settings__slider::-moz-range-track{background:linear-gradient(to right,var(--accent) 0,var(--accent) var(--slider-progress,50%),var(--background-alt) var(--slider-progress,50%),var(--background-alt) 100%);border:var(--border-width) solid var(--border);border-radius:var(--radius);box-shadow:inset 0 var(--spacing-0-125) var(--spacing-0-125) oklch(from var(--shadow-color) l c h/10%);height:var(--spacing-2);width:100%}.settings__slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:var(--accent);border:var(--outline-width) solid var(--background);border-radius:var(--radius-circle);box-shadow:0 0 0 var(--spacing-0-125) var(--border);cursor:pointer;height:var(--spacing-5);margin-top:calc(var(--spacing-2)*-1);-webkit-transition:background-color var(--transition-base),transform var(--transition-base),border-color var(--transition-base);transition:background-color var(--transition-base),transform var(--transition-base),border-color var(--transition-base);width:var(--spacing-5)}.settings__slider::-webkit-slider-thumb:hover{background-color:var(--accent-hover);transform:scale(1.1)}.settings__slider::-moz-range-thumb{background-color:var(--accent);border:var(--outline-width) solid var(--background);border-radius:var(--radius-circle);box-shadow:0 0 0 var(--spacing-0-125) var(--border);cursor:pointer;height:var(--spacing-5);-moz-transition:background-color var(--transition-base),transform var(--transition-base),border-color var(--transition-base);transition:background-color var(--transition-base),transform var(--transition-base),border-color var(--transition-base);width:var(--spacing-5)}.settings__slider::-moz-range-thumb:hover{background-color:var(--accent-hover);transform:scale(1.1)}.settings__slider:focus-visible{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.settings__slider-labels{color:var(--text-dim);display:flex;font-size:var(--font-size-xs);justify-content:space-between;margin-top:var(--spacing-1)}.settings__checkbox-label{align-items:center;color:var(--text);cursor:pointer;display:flex;font-size:var(--font-size-base);font-weight:var(--font-weight-medium);gap:var(--spacing-3);-webkit-user-select:none;-moz-user-select:none;user-select:none}.settings__checkbox-label:hover{color:var(--accent)}.settings__checkbox{accent-color:var(--accent);cursor:pointer;height:var(--spacing-5);margin:0;width:var(--spacing-5)}.settings__radio-group{display:flex;flex-direction:column;gap:var(--spacing-2)}.settings__radio-label{align-items:center;border-radius:var(--radius-md);color:var(--text);cursor:pointer;display:flex;font-size:var(--font-size-base);font-weight:var(--font-weight-normal);gap:var(--spacing-2);padding:var(--spacing-2);transition:background-color var(--transition-base),color var(--transition-base);-webkit-user-select:none;-moz-user-select:none;user-select:none}.settings__radio-label:hover{background-color:var(--background-alt);color:var(--accent)}.settings__radio{accent-color:var(--accent);cursor:pointer;height:var(--spacing-5);margin:0;width:var(--spacing-5)}.settings__help-text{color:var(--text-dim);font-size:var(--font-size-sm);line-height:var(--line-height-relaxed);margin:0}.back-to-top{bottom:var(--spacing-6);opacity:0;position:fixed;right:var(--spacing-6);transform:translateY(var(--spacing-2));transition:opacity var(--transition-base),visibility var(--transition-base),transform var(--transition-base);visibility:hidden;z-index:var(--z-fixed)}.back-to-top[data-visible="true"]{opacity:1;transform:translateY(0);visibility:visible}.back-to-top__btn{align-items:center;background-color:var(--accent);border:none;border-radius:var(--radius-md);box-shadow:var(--shadow-lg);color:var(--accent-text);cursor:pointer;display:flex;height:var(--spacing-10);justify-content:center;min-height:var(--touch-target-min);min-width:var(--touch-target-min);padding:0;transition:background-color var(--transition-base),transform var(--transition-base);width:var(--spacing-10)}.back-to-top__btn:hover{background-color:var(--accent-hover)}.back-to-top__btn:focus-visible{outline:var(--outline-width) solid var(--accent-text);outline-offset:var(--outline-offset)}.back-to-top__icon{flex-shrink:0}@media (prefers-reduced-motion:reduce){.back-to-top,
129
+ .font-switcher__option--active:hover{background-color:var(--background);border-left:var(--border-width-accent) solid var(--accent);border-radius:var(--radius);color:var(--text);font-weight:var(--font-weight-medium);padding-left:calc(var(--spacing-4) - var(--border-width-accent))}.font-switcher__option--active:focus-visible{box-shadow:inset 0 0 0 var(--outline-width) var(--accent)}@media (width <= 768px){.font-switcher,.font-switcher__menu{max-width:100%;width:100%}.font-switcher__menu{box-sizing:border-box;left:0;min-width:0;right:auto}}.settings__control .font-switcher{max-width:100%;width:100%}.settings__control .font-switcher__menu{box-sizing:border-box;max-width:100%;min-width:0;width:100%}.settings{inset:0;pointer-events:none;position:fixed;z-index:var(--z-settings)}.settings[aria-hidden="true"]{display:none}.settings__overlay{backdrop-filter:blur(var(--blur-sm));background-color:var(--overlay);inset:0;opacity:0;pointer-events:all;position:absolute;transition:opacity var(--transition-ease-out);z-index:1}.settings[aria-hidden="false"] .settings__overlay[aria-hidden="false"],.settings__overlay[aria-hidden="false"]{opacity:1}.settings__panel{background-color:var(--background-alt);border-left:var(--border-width) solid var(--border);box-shadow:calc(var(--spacing-1)*-1) 0 var(--spacing-3) calc(var(--spacing-0-125)*-1) oklch(from var(--shadow-color) l c h/15%);display:flex;flex-direction:column;height:100%;max-height:100vh;max-height:100dvh;max-width:var(--spacing-105);overflow:hidden;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(100%);transition:transform var(--transition-ease-out);width:100%;z-index:2}.settings__panel[data-open="true"]{transform:translateX(0)}.settings[aria-hidden="false"] .settings__panel:not([data-open]){transform:translateX(100%)}@media (prefers-reduced-motion:reduce){.settings__overlay,.settings__panel{transition:none}}.reduced-motion .settings__overlay,.reduced-motion .settings__panel{transition:none}.settings__header{align-items:center;background-color:var(--background-alt);border-bottom:var(--border-width) solid var(--border);display:flex;flex-shrink:0;justify-content:space-between;padding:var(--spacing-6);position:sticky;top:0;z-index:var(--z-dropdown)}.settings__title{color:var(--text);font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);margin:0}.settings__close{align-items:center;background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);color:var(--text);cursor:pointer;display:flex;height:var(--spacing-8);justify-content:center;min-height:var(--touch-target-min);min-width:var(--touch-target-min);padding:0;transition:background-color var(--transition-base),color var(--transition-base),border-color var(--transition-base);width:var(--spacing-8)}.settings__close:hover{background-color:var(--background-alt);border-color:var(--accent);color:var(--accent)}.settings__close:focus-visible{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.settings__content{background-color:var(--background);display:flex;flex:1 1 0;flex-direction:column;gap:var(--spacing-8);min-height:0;overflow-x:hidden;overflow-y:auto;overscroll-behavior-y:contain;padding:var(--spacing-6);-webkit-overflow-scrolling:touch;scrollbar-gutter:stable}@media (width >= 641px){.settings__content{max-height:calc(100dvh - 4.5rem);max-height:calc(100vh - 4.5rem)}}.settings__section{display:flex;flex-direction:column;gap:var(--spacing-4)}.settings__section-title{color:var(--text);font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);margin:0 0 var(--spacing-4)}.settings__control{display:flex;flex-direction:column;gap:var(--spacing-3)}.settings__control .theme-switcher{max-width:100%;width:100%}.settings__control .theme-switcher__menu{box-sizing:border-box;max-width:100%;min-width:0;width:100%}.settings__label{align-items:center;color:var(--text);display:flex;font-weight:var(--font-weight-medium);justify-content:space-between;margin-bottom:var(--spacing-3)}.settings__label-text{font-size:var(--font-size-base)}.settings__label-value{color:var(--text-dim);font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold)}.settings__slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:linear-gradient(to right,var(--accent) 0,var(--accent) var(--slider-progress,50%),var(--background-alt) var(--slider-progress,50%),var(--background-alt) 100%);border:var(--border-width) solid var(--border);border-radius:var(--radius);cursor:pointer;height:var(--spacing-2);outline:none;width:100%}.settings__slider::-webkit-slider-runnable-track{background:linear-gradient(to right,var(--accent) 0,var(--accent) var(--slider-progress,50%),var(--background-alt) var(--slider-progress,50%),var(--background-alt) 100%);border:var(--border-width) solid var(--border);border-radius:var(--radius);box-shadow:inset 0 var(--spacing-0-125) var(--spacing-0-125) oklch(from var(--shadow-color) l c h/10%);height:var(--spacing-2);width:100%}.settings__slider::-moz-range-track{background:linear-gradient(to right,var(--accent) 0,var(--accent) var(--slider-progress,50%),var(--background-alt) var(--slider-progress,50%),var(--background-alt) 100%);border:var(--border-width) solid var(--border);border-radius:var(--radius);box-shadow:inset 0 var(--spacing-0-125) var(--spacing-0-125) oklch(from var(--shadow-color) l c h/10%);height:var(--spacing-2);width:100%}.settings__slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:var(--accent);border:var(--outline-width) solid var(--background);border-radius:var(--radius-circle);box-shadow:0 0 0 var(--spacing-0-125) var(--border);cursor:pointer;height:var(--spacing-5);margin-top:calc(var(--spacing-2)*-1);-webkit-transition:background-color var(--transition-base),transform var(--transition-base),border-color var(--transition-base);transition:background-color var(--transition-base),transform var(--transition-base),border-color var(--transition-base);width:var(--spacing-5)}.settings__slider::-webkit-slider-thumb:hover{background-color:var(--accent-hover);transform:scale(1.1)}.settings__slider::-moz-range-thumb{background-color:var(--accent);border:var(--outline-width) solid var(--background);border-radius:var(--radius-circle);box-shadow:0 0 0 var(--spacing-0-125) var(--border);cursor:pointer;height:var(--spacing-5);-moz-transition:background-color var(--transition-base),transform var(--transition-base),border-color var(--transition-base);transition:background-color var(--transition-base),transform var(--transition-base),border-color var(--transition-base);width:var(--spacing-5)}.settings__slider::-moz-range-thumb:hover{background-color:var(--accent-hover);transform:scale(1.1)}.settings__slider:focus-visible{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.settings__slider-labels{color:var(--text-dim);display:flex;font-size:var(--font-size-xs);justify-content:space-between;margin-top:var(--spacing-1)}.settings__checkbox-label{align-items:center;color:var(--text);cursor:pointer;display:flex;font-size:var(--font-size-base);font-weight:var(--font-weight-medium);gap:var(--spacing-3);-webkit-user-select:none;-moz-user-select:none;user-select:none}.settings__checkbox-label:hover{color:var(--accent)}.settings__checkbox{accent-color:var(--accent);cursor:pointer;height:var(--spacing-5);margin:0;width:var(--spacing-5)}.settings__radio-group{display:flex;flex-direction:column;gap:var(--spacing-2)}.settings__radio-label{align-items:center;border-radius:var(--radius-md);color:var(--text);cursor:pointer;display:flex;font-size:var(--font-size-base);font-weight:var(--font-weight-normal);gap:var(--spacing-2);padding:var(--spacing-2);transition:background-color var(--transition-base),color var(--transition-base);-webkit-user-select:none;-moz-user-select:none;user-select:none}.settings__radio-label:hover{background-color:var(--background-alt);color:var(--accent)}.settings__radio{accent-color:var(--accent);cursor:pointer;height:var(--spacing-5);margin:0;width:var(--spacing-5)}.settings__help-text{color:var(--text-dim);font-size:var(--font-size-sm);line-height:var(--line-height-relaxed);margin:0}.back-to-top{bottom:var(--spacing-6);opacity:0;position:fixed;right:var(--spacing-6);transform:translateY(var(--spacing-2));transition:opacity var(--transition-base),visibility var(--transition-base),transform var(--transition-base);visibility:hidden;z-index:var(--z-fixed)}.back-to-top[data-visible="true"]{opacity:1;transform:translateY(0);visibility:visible}.back-to-top__btn{align-items:center;background-color:var(--accent);border:none;border-radius:var(--radius-md);box-shadow:var(--shadow-lg);color:var(--accent-text);cursor:pointer;display:flex;height:var(--spacing-10);justify-content:center;min-height:var(--touch-target-min);min-width:var(--touch-target-min);padding:0;transition:background-color var(--transition-base),transform var(--transition-base);width:var(--spacing-10)}.back-to-top__btn:hover{background-color:var(--accent-hover)}.back-to-top__btn:focus-visible{outline:var(--outline-width) solid var(--accent-text);outline-offset:var(--outline-offset)}.back-to-top__icon{flex-shrink:0}@media (prefers-reduced-motion:reduce){.back-to-top,
130
130
  .back-to-top[data-visible="true"]{transition:none}}@media (width <= 640px){.settings__panel{max-width:100%;width:100%}}.modal-root{inset:0;pointer-events:none;position:fixed;z-index:var(--z-modal)}.modal-root > .modal__overlay{backdrop-filter:blur(var(--blur-sm));background-color:oklch(from var(--shadow-color) l c h/60%);bottom:0;left:0;opacity:0;pointer-events:none;position:fixed;right:0;top:0;transition:opacity var(--transition-slow) ease;z-index:0}.modal-root > .modal__overlay[aria-hidden="false"]{opacity:1;pointer-events:auto}.modal-root > .modal{pointer-events:none;z-index:1}.modal-root > .modal[aria-hidden="false"]{pointer-events:auto}.modal__overlay{backdrop-filter:blur(var(--blur-sm));background-color:oklch(from var(--shadow-color) l c h/60%);bottom:0;left:0;opacity:0;pointer-events:none;position:fixed;right:0;top:0;transition:opacity var(--transition-slow) ease;z-index:var(--z-modal-backdrop)}.modal__overlay[aria-hidden="false"]{opacity:1;pointer-events:auto}.modal{background-color:var(--background);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-xl);display:flex;flex-direction:column;left:50%;max-height:var(--vh-90);max-width:var(--max-height-modal);opacity:0;pointer-events:none;position:fixed;top:50%;transform:translate(-50%,-50%);transition:opacity var(--transition-slow) ease,transform var(--transition-slow) ease;width:100%;z-index:var(--z-modal)}.modal[aria-hidden="false"]{opacity:1;pointer-events:auto}.modal__header{align-items:center;border-bottom:var(--border-width) solid var(--border);display:flex;flex-shrink:0;justify-content:space-between;padding:var(--spacing-6)}.modal__title{color:var(--text);font-size:var(--font-size-xl);font-weight:var(--font-weight-semibold);margin:0}.modal__close{align-items:center;background:none;border:none;border-radius:var(--radius);color:var(--text-dim);cursor:pointer;display:flex;flex-shrink:0;justify-content:center;padding:var(--spacing-2);transition:background-color var(--transition-base),color var(--transition-base)}.modal__close:hover{background-color:var(--background-alt);color:var(--text)}.modal__close:focus{box-shadow:0 0 0 3px oklch(from var(--accent) l c h/10%);outline:none}.modal__body{flex:1;min-height:0;overflow-y:auto;padding:var(--spacing-6)}.modal__footer{border-top:var(--border-width) solid var(--border);display:flex;flex-shrink:0;gap:var(--spacing-3);justify-content:flex-end;padding:var(--spacing-6)}.modal__footer:empty{display:none}.modal--sm{max-width:var(--spacing-96)}.modal--md{max-width:var(--max-height-modal)}.modal--lg{max-width:var(--max-width-modal-lg)}
131
131
  .reduced-motion .modal,.reduced-motion .modal__overlay{transition:none}@media (width <= 640px){.modal{bottom:auto;left:auto;margin:var(--spacing-4);max-height:95vh;max-width:95vw;right:auto;top:auto}.modal,.modal[aria-hidden="false"]{transform:none}
132
132
  .modal__body,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rizzo-css",
3
- "version": "0.0.82",
3
+ "version": "0.0.83",
4
4
  "engines": {
5
5
  "node": ">=18"
6
6
  },
@@ -277,9 +277,10 @@ const { open = false } = Astro.props;
277
277
  // Remove data-open first to trigger close animation
278
278
  panel.removeAttribute('data-open');
279
279
 
280
- // Wait for animation to complete before hiding
280
+ // Wait for animation to complete before hiding (respect system preference and user toggle)
281
281
  const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
282
- const animationDuration = prefersReducedMotion ? 0 : 300;
282
+ const reducedMotionClass = html.classList.contains('reduced-motion');
283
+ const animationDuration = (prefersReducedMotion || reducedMotionClass) ? 0 : 300;
283
284
 
284
285
  setTimeout(() => {
285
286
  settings.setAttribute('aria-hidden', 'true');
@@ -12,6 +12,8 @@ export interface DocsNavLink {
12
12
  frameworkOnly?: boolean;
13
13
  absolute?: boolean;
14
14
  sections?: DocsNavSection[];
15
+ /** When true, open in new tab (external to main site). */
16
+ external?: boolean;
15
17
  }
16
18
 
17
19
  export interface DocsNavGroup {
@@ -32,7 +34,7 @@ export interface DocsSidebarProps extends HTMLAttributes<HTMLElement> {
32
34
  }
33
35
 
34
36
  function fullHref(link: { href: string; frameworkOnly?: boolean; absolute?: boolean }, pathPrefix: string): string {
35
- if (link.absolute && link.href.startsWith('/')) return link.href;
37
+ if (link.absolute && link.href) return link.href;
36
38
  const base = link.frameworkOnly ? pathPrefix : '/docs';
37
39
  return `${base}/${link.href}`;
38
40
  }
@@ -110,19 +112,24 @@ export function DocsSidebar({
110
112
  href={href}
111
113
  className={`docs-sidebar__link ${active && (sections.length === 0 || activeSectionId == null) ? 'docs-sidebar__link--active' : ''}`.trim()}
112
114
  aria-current={active && (sections.length === 0 || activeSectionId == null) ? 'page' : undefined}
115
+ target={link.external ? '_blank' : undefined}
116
+ rel={link.external ? 'noopener noreferrer' : undefined}
113
117
  >
114
118
  {link.label}
115
119
  </a>
116
120
  {sections.length > 0 && (
117
121
  <ul className="docs-sidebar__sublist" aria-label={`Sections in ${link.label}`}>
118
122
  {sections.map((section) => {
119
- const sublinkActive = activeSectionId === section.id && currentPath.replace(/\/$/, '') === href;
123
+ const sublinkHref = `${href}#${section.id}`;
124
+ const sublinkActive = !link.external && activeSectionId === section.id && currentPath.replace(/\/$/, '') === href.split('#')[0];
120
125
  return (
121
126
  <li key={section.id} className="docs-sidebar__subitem">
122
127
  <a
123
- href={`${href}#${section.id}`}
128
+ href={sublinkHref}
124
129
  className={`docs-sidebar__sublink ${sublinkActive ? 'docs-sidebar__sublink--active' : ''}`.trim()}
125
130
  aria-current={sublinkActive ? 'location' : undefined}
131
+ target={link.external ? '_blank' : undefined}
132
+ rel={link.external ? 'noopener noreferrer' : undefined}
126
133
  >
127
134
  {section.label}
128
135
  </a>
@@ -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.82",
19
+ "rizzo-css": "^0.0.83",
20
20
  "typescript": "~5.6.2",
21
21
  "vite": "^6.0.1"
22
22
  }
@@ -17,7 +17,7 @@
17
17
  "@types/react": "^18.3.12",
18
18
  "@types/react-dom": "^18.3.1",
19
19
  "@vitejs/plugin-react": "^4.3.3",
20
- "rizzo-css": "^0.0.82",
20
+ "rizzo-css": "^0.0.83",
21
21
  "typescript": "~5.6.2",
22
22
  "vite": "^6.0.1"
23
23
  }
@@ -1,6 +1,16 @@
1
1
  /**
2
- * Docs nav for the full template. Matches main site structure (Introduction, Components, Blocks, Themes).
2
+ * Docs sidebar nav for full template. Matches https://rizzo-css.vercel.app exactly.
3
+ * Local routes: /docs/overview, /docs/getting-started, /docs/components. All other links point to the main site.
3
4
  */
5
+ import { COMPONENT_CATEGORIES } from './componentCategories';
6
+
7
+ const SITE_BASE = 'https://rizzo-css.vercel.app';
8
+ const FRAMEWORK_PREFIX = '/docs/react';
9
+
10
+ function slugToTitle(slug: string): string {
11
+ return slug.split('-').map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
12
+ }
13
+
4
14
  export interface DocsNavSection {
5
15
  id: string;
6
16
  label: string;
@@ -12,6 +22,7 @@ export interface DocsNavLink {
12
22
  frameworkOnly?: boolean;
13
23
  absolute?: boolean;
14
24
  sections?: DocsNavSection[];
25
+ external?: boolean;
15
26
  }
16
27
 
17
28
  export interface DocsNavGroup {
@@ -23,48 +34,54 @@ export const DOCS_NAV: DocsNavGroup[] = [
23
34
  {
24
35
  label: 'Introduction',
25
36
  links: [
26
- {
27
- href: 'overview',
28
- label: 'Overview',
29
- frameworkOnly: true,
30
- sections: [
31
- { id: 'overview', label: 'Overview' },
32
- { id: 'installation', label: 'Installation' },
33
- { id: 'components', label: 'Components' },
34
- { id: 'blocks', label: 'Blocks' },
35
- ],
36
- },
37
- {
38
- href: 'getting-started',
39
- label: 'Getting Started',
40
- sections: [
41
- { id: 'installation', label: 'Installation' },
42
- { id: 'project-structure', label: 'Project Structure' },
43
- { id: 'development', label: 'Development' },
44
- { id: 'using-components', label: 'Using Components' },
45
- { id: 'using-themes', label: 'Using Themes' },
46
- ],
47
- },
37
+ { href: '/docs/overview', label: 'Overview', absolute: true, sections: [{ id: 'overview', label: 'Overview' }, { id: 'installation', label: 'Installation' }, { id: 'components', label: 'Components' }, { id: 'blocks', label: 'Blocks' }] },
38
+ { href: `${SITE_BASE}/docs/showcase`, label: 'Showcase', absolute: true, external: true, sections: [{ id: 'components', label: 'Components' }, { id: 'themes', label: 'Themes' }, { id: 'blocks', label: 'Blocks' }, { id: 'examples', label: 'Examples' }] },
39
+ { href: '/docs/getting-started', label: 'Getting Started', absolute: true, sections: [{ id: 'installation', label: 'Installation' }, { id: 'installation-by-framework', label: 'By framework' }, { id: 'vanilla', label: 'Vanilla' }, { id: 'astro', label: 'Astro' }, { id: 'svelte', label: 'Svelte' }, { id: 'react', label: 'React' }, { id: 'vue', label: 'Vue' }, { id: 'project-structure', label: 'Project Structure' }, { id: 'development', label: 'Development' }, { id: 'building', label: 'Building' }, { id: 'using-components', label: 'Using Components' }, { id: 'using-themes', label: 'Using Themes' }, { id: 'css-architecture', label: 'CSS Architecture' }] },
40
+ ],
41
+ },
42
+ {
43
+ label: 'Foundations',
44
+ links: [
45
+ { href: `${SITE_BASE}/docs/design-system`, label: 'Design System', absolute: true, external: true },
46
+ { href: `${SITE_BASE}/docs/theming`, label: 'Theming', absolute: true, external: true },
47
+ { href: `${SITE_BASE}/docs/accessibility`, label: 'Accessibility', absolute: true, external: true },
48
+ { href: `${SITE_BASE}/docs/accessibility/manual-testing`, label: 'Manual testing checklist', absolute: true, external: true },
49
+ { href: `${SITE_BASE}/docs/colors`, label: 'Colors', absolute: true, external: true },
50
+ { href: `${SITE_BASE}/docs/tokens`, label: 'Tokens reference', absolute: true, external: true },
51
+ { href: `${SITE_BASE}/docs/best-practices`, label: 'Best Practices', absolute: true, external: true },
48
52
  ],
49
53
  },
50
54
  {
51
55
  label: 'Components',
52
- links: [{ href: 'components', label: 'Overview', frameworkOnly: true }],
56
+ links: [
57
+ { href: '/docs/components', label: 'Overview', absolute: true },
58
+ ...COMPONENT_CATEGORIES.flatMap((cat) =>
59
+ cat.slugs.map((slug) => ({
60
+ href: `${SITE_BASE}${FRAMEWORK_PREFIX}/components/${slug}`,
61
+ label: slugToTitle(slug),
62
+ absolute: true as const,
63
+ external: true as const,
64
+ }))
65
+ ),
66
+ ],
53
67
  },
54
68
  {
55
69
  label: 'Blocks',
56
70
  links: [
57
- { href: '/blocks', label: 'Blocks overview', absolute: true },
58
- { href: '/blocks/landing-hero', label: 'Landing hero', absolute: true },
59
- { href: '/blocks/pricing', label: 'Pricing cards', absolute: true },
60
- { href: '/blocks/dashboard-01', label: 'Dashboard', absolute: true },
61
- { href: '/blocks/docs-layout', label: 'Docs layout', absolute: true },
62
- { href: '/blocks/login', label: 'Login', absolute: true },
63
- { href: '/blocks/signup', label: 'Sign up', absolute: true },
71
+ { href: `${SITE_BASE}/blocks`, label: 'Blocks overview', absolute: true, external: true },
72
+ { href: `${SITE_BASE}/blocks/landing-hero`, label: 'Landing hero', absolute: true, external: true },
73
+ { href: `${SITE_BASE}/blocks/pricing`, label: 'Pricing cards', absolute: true, external: true },
74
+ { href: `${SITE_BASE}/blocks/dashboard-01`, label: 'Dashboard', absolute: true, external: true },
75
+ { href: `${SITE_BASE}/blocks/docs-layout`, label: 'Docs layout', absolute: true, external: true },
76
+ { href: `${SITE_BASE}/blocks/login`, label: 'Login', absolute: true, external: true },
77
+ { href: `${SITE_BASE}/blocks/signup`, label: 'Sign up', absolute: true, external: true },
64
78
  ],
65
79
  },
66
80
  {
67
- label: 'Themes',
68
- links: [{ href: '/themes', label: 'Themes', absolute: true }],
81
+ label: 'Examples',
82
+ links: [
83
+ { href: `${SITE_BASE}/docs/examples`, label: 'Examples overview', absolute: true, external: true },
84
+ { href: `${SITE_BASE}/docs/examples/form-layouts`, label: 'Form & layout examples', absolute: true, external: true, sections: [{ id: 'login-form', label: 'Login form' }, { id: 'contact-form', label: 'Contact form' }, { id: 'dashboard-stats', label: 'Dashboard stats cards' }, { id: 'card-grid', label: 'Card grid' }, { id: 'settings-panel', label: 'Settings panel' }] },
85
+ ],
69
86
  },
70
87
  ];
@@ -2,12 +2,14 @@
2
2
  import ThemeSwitcher from './ThemeSwitcher.svelte';
3
3
  import FontSwitcher from './FontSwitcher.svelte';
4
4
  import SoundEffects from './SoundEffects.svelte';
5
+ import Close from './icons/Close.svelte';
5
6
 
6
7
  interface Props {
7
8
  open?: boolean;
8
9
  }
9
10
  let { open: openProp }: Props = $props();
10
11
  let openInternal = $state(false);
12
+ let closing = $state(false);
11
13
  const open = $derived(openProp !== undefined ? openProp : openInternal);
12
14
 
13
15
  const isBrowser = typeof window !== 'undefined' && typeof localStorage?.getItem === 'function';
@@ -24,10 +26,20 @@
24
26
  fontSizeLabel = `${Math.round(scale * 100)}%`;
25
27
  }
26
28
 
29
+ let opening = $state(false);
30
+ /** Panel shows open state only after first frame when opening (so slide-in animation runs). */
31
+ const panelDataOpen = $derived(open && !closing && !opening);
32
+
27
33
  $effect(() => {
28
34
  if (typeof window === 'undefined') return;
29
35
  (window as unknown as { openSettings?: () => void }).openSettings = () => {
30
36
  openInternal = true;
37
+ opening = true;
38
+ requestAnimationFrame(() => {
39
+ requestAnimationFrame(() => {
40
+ opening = false;
41
+ });
42
+ });
31
43
  };
32
44
  return () => {
33
45
  if ((window as unknown as { openSettings?: () => void }).openSettings) {
@@ -39,7 +51,7 @@
39
51
  $effect(() => {
40
52
  if (typeof document === 'undefined' || !open) return;
41
53
  const onEscape = (e: KeyboardEvent) => {
42
- if (e.key === 'Escape') openInternal = false;
54
+ if (e.key === 'Escape') close();
43
55
  };
44
56
  document.addEventListener('keydown', onEscape);
45
57
  return () => document.removeEventListener('keydown', onEscape);
@@ -58,7 +70,18 @@
58
70
  });
59
71
 
60
72
  function close() {
61
- openInternal = false;
73
+ const prefersReducedMotion = typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
74
+ const reducedMotionClass = typeof document !== 'undefined' && document.documentElement.classList.contains('reduced-motion');
75
+ const duration = (prefersReducedMotion || reducedMotionClass) ? 0 : 300;
76
+ if (duration === 0) {
77
+ openInternal = false;
78
+ return;
79
+ }
80
+ closing = true;
81
+ setTimeout(() => {
82
+ openInternal = false;
83
+ closing = false;
84
+ }, duration);
62
85
  }
63
86
 
64
87
  function onFontSizeInput(e: Event) {
@@ -100,11 +123,13 @@
100
123
  aria-modal="true"
101
124
  aria-labelledby="settings-title"
102
125
  aria-hidden={!open}
103
- data-open={open ? 'true' : undefined}
126
+ data-open={panelDataOpen ? 'true' : undefined}
104
127
  >
105
128
  <div class="settings__header">
106
129
  <h2 id="settings-title" class="settings__title">Settings</h2>
107
- <button type="button" class="settings__close" data-settings-close aria-label="Close settings" onclick={close}>×</button>
130
+ <button type="button" class="settings__close" data-settings-close aria-label="Close settings" title="Close settings" onclick={close}>
131
+ <Close width={20} height={20} />
132
+ </button>
108
133
  </div>
109
134
  <div class="settings__content" tabindex="-1" aria-label="Settings options">
110
135
  <section class="settings__section">
@@ -153,7 +178,7 @@
153
178
  <h3 class="settings__section-title">Accessibility</h3>
154
179
  <div class="settings__control">
155
180
  <label class="settings__checkbox-label">
156
- <input type="checkbox" class="settings__checkbox" aria-label="Reduce motion" checked={reducedMotion} onchange={onReducedMotionChange} />
181
+ <input type="checkbox" class="settings__checkbox" data-reduced-motion aria-label="Reduce motion" checked={reducedMotion} onchange={onReducedMotionChange} />
157
182
  <span>Reduce motion</span>
158
183
  </label>
159
184
  <p class="settings__help-text">Minimize animations and transitions</p>
@@ -1,6 +1,16 @@
1
1
  /**
2
- * Docs nav for the full template. Matches main site structure (Introduction, Components, Blocks, Themes).
2
+ * Docs sidebar nav for full template. Matches https://rizzo-css.vercel.app exactly.
3
+ * Local routes: /docs/overview, /docs/getting-started, /docs/components. All other links point to the main site.
3
4
  */
5
+ import { COMPONENT_CATEGORIES } from './componentCategories';
6
+
7
+ const SITE_BASE = 'https://rizzo-css.vercel.app';
8
+ const FRAMEWORK_PREFIX = '/docs/svelte';
9
+
10
+ function slugToTitle(slug: string): string {
11
+ return slug.split('-').map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
12
+ }
13
+
4
14
  export interface DocsNavSection {
5
15
  id: string;
6
16
  label: string;
@@ -12,6 +22,8 @@ export interface DocsNavLink {
12
22
  frameworkOnly?: boolean;
13
23
  absolute?: boolean;
14
24
  sections?: DocsNavSection[];
25
+ /** When true, open in new tab (external to main site). */
26
+ external?: boolean;
15
27
  }
16
28
 
17
29
  export interface DocsNavGroup {
@@ -24,9 +36,9 @@ export const DOCS_NAV: DocsNavGroup[] = [
24
36
  label: 'Introduction',
25
37
  links: [
26
38
  {
27
- href: 'overview',
39
+ href: '/docs/overview',
28
40
  label: 'Overview',
29
- frameworkOnly: true,
41
+ absolute: true,
30
42
  sections: [
31
43
  { id: 'overview', label: 'Overview' },
32
44
  { id: 'installation', label: 'Installation' },
@@ -35,36 +47,204 @@ export const DOCS_NAV: DocsNavGroup[] = [
35
47
  ],
36
48
  },
37
49
  {
38
- href: 'getting-started',
50
+ href: `${SITE_BASE}/docs/showcase`,
51
+ label: 'Showcase',
52
+ absolute: true,
53
+ external: true,
54
+ sections: [
55
+ { id: 'components', label: 'Components' },
56
+ { id: 'themes', label: 'Themes' },
57
+ { id: 'blocks', label: 'Blocks' },
58
+ { id: 'examples', label: 'Examples' },
59
+ ],
60
+ },
61
+ {
62
+ href: '/docs/getting-started',
39
63
  label: 'Getting Started',
64
+ absolute: true,
40
65
  sections: [
41
66
  { id: 'installation', label: 'Installation' },
67
+ { id: 'installation-by-framework', label: 'By framework' },
68
+ { id: 'vanilla', label: 'Vanilla' },
69
+ { id: 'astro', label: 'Astro' },
70
+ { id: 'svelte', label: 'Svelte' },
71
+ { id: 'react', label: 'React' },
72
+ { id: 'vue', label: 'Vue' },
42
73
  { id: 'project-structure', label: 'Project Structure' },
43
74
  { id: 'development', label: 'Development' },
75
+ { id: 'building', label: 'Building' },
44
76
  { id: 'using-components', label: 'Using Components' },
45
77
  { id: 'using-themes', label: 'Using Themes' },
78
+ { id: 'css-architecture', label: 'CSS Architecture' },
79
+ ],
80
+ },
81
+ ],
82
+ },
83
+ {
84
+ label: 'Foundations',
85
+ links: [
86
+ {
87
+ href: `${SITE_BASE}/docs/design-system`,
88
+ label: 'Design System',
89
+ absolute: true,
90
+ external: true,
91
+ sections: [
92
+ { id: 'semantic-variables', label: 'Semantic Variables' },
93
+ { id: 'typography-system', label: 'Typography System' },
94
+ { id: 'shadow-and-overlay-variables', label: 'Shadow and Overlay Variables' },
95
+ { id: 'selection-color', label: 'Selection Color' },
96
+ { id: 'color-format', label: 'Color Format' },
97
+ { id: 'using-variables', label: 'Using Variables' },
98
+ { id: 'naming-convention', label: 'Naming Convention' },
99
+ { id: 'spacing-utilities', label: 'Spacing Utilities' },
100
+ { id: 'container-utilities', label: 'Container Utilities' },
101
+ { id: 'max-width-utilities', label: 'Max-Width Utilities' },
102
+ { id: 'sizing-utilities', label: 'Sizing Utilities' },
103
+ { id: 'media-queries', label: 'Media Queries' },
104
+ { id: 'display-utilities', label: 'Display Utilities' },
105
+ { id: 'position-utilities', label: 'Position Utilities' },
106
+ { id: 'border-utilities', label: 'Border Utilities' },
107
+ { id: 'flexbox-utilities', label: 'Flexbox Utilities' },
108
+ { id: 'grid-utilities', label: 'Grid Utilities' },
109
+ { id: 'gap-utilities', label: 'Gap Utilities' },
110
+ { id: 'animation-transition-utilities', label: 'Animation & Transition Utilities' },
111
+ { id: 'best-practices', label: 'Best Practices' },
112
+ ],
113
+ },
114
+ {
115
+ href: `${SITE_BASE}/docs/theming`,
116
+ label: 'Theming',
117
+ absolute: true,
118
+ external: true,
119
+ sections: [
120
+ { id: 'available-themes', label: 'Available Themes' },
121
+ { id: 'dark-themes', label: 'Dark Themes' },
122
+ { id: 'light-themes', label: 'Light Themes' },
123
+ { id: 'using-themes', label: 'Using Themes' },
124
+ { id: 'theme-file-structure', label: 'Theme File Structure' },
125
+ { id: 'creating-custom-themes', label: 'Creating Custom Themes' },
126
+ { id: 'color-format', label: 'Color Format' },
127
+ { id: 'theme-persistence', label: 'Theme Persistence' },
128
+ ],
129
+ },
130
+ {
131
+ href: `${SITE_BASE}/docs/accessibility`,
132
+ label: 'Accessibility',
133
+ absolute: true,
134
+ external: true,
135
+ sections: [
136
+ { id: 'accessibility-features', label: 'Accessibility Features' },
137
+ { id: 'utility-classes', label: 'Utility Classes' },
138
+ { id: 'focus-styles', label: 'Focus Styles' },
139
+ { id: 'form-accessibility', label: 'Form Accessibility' },
140
+ { id: 'responsive-design', label: 'Responsive Design' },
141
+ { id: 'color-contrast', label: 'Color Contrast' },
142
+ { id: 'reduced-motion', label: 'Reduced Motion' },
143
+ { id: 'high-contrast-mode', label: 'High Contrast Mode' },
144
+ { id: 'best-practices', label: 'Best Practices' },
145
+ { id: 'testing', label: 'Testing' },
146
+ { id: 'resources', label: 'Resources' },
147
+ ],
148
+ },
149
+ {
150
+ href: `${SITE_BASE}/docs/accessibility/manual-testing`,
151
+ label: 'Manual testing checklist',
152
+ absolute: true,
153
+ external: true,
154
+ sections: [
155
+ { id: 'overview', label: 'Overview' },
156
+ { id: 'before-you-start', label: 'Before you start' },
157
+ { id: 'priority-1', label: 'Priority 1 — High interaction' },
158
+ { id: 'priority-2', label: 'Priority 2 — Forms and feedback' },
159
+ { id: 'priority-3', label: 'Priority 3 — Navigation and layout' },
160
+ { id: 'tools', label: 'Tools' },
161
+ { id: 'step-by-step-example', label: 'Step-by-step example (Modal)' },
162
+ { id: 'results-log', label: 'Results log' },
163
+ { id: 'screen-reader-keys', label: 'Screen reader quick reference' },
164
+ { id: 'suggested-order', label: 'Suggested order' },
165
+ ],
166
+ },
167
+ {
168
+ href: `${SITE_BASE}/docs/colors`,
169
+ label: 'Colors',
170
+ absolute: true,
171
+ external: true,
172
+ sections: [
173
+ { id: 'color-reference', label: 'Color Reference' },
174
+ { id: 'core-colors', label: 'Core Colors' },
175
+ { id: 'accent-colors', label: 'Accent Colors' },
176
+ { id: 'semantic-colors', label: 'Semantic Colors' },
177
+ { id: 'text-on-solid', label: 'Text on solid' },
178
+ { id: 'color-scales', label: 'Color scales' },
179
+ ],
180
+ },
181
+ {
182
+ href: `${SITE_BASE}/docs/tokens`,
183
+ label: 'Tokens reference',
184
+ absolute: true,
185
+ external: true,
186
+ sections: [
187
+ { id: 'spacing', label: 'Spacing' },
188
+ { id: 'typography', label: 'Typography' },
189
+ { id: 'semantic-colors', label: 'Semantic colors' },
190
+ { id: 'radius-transition', label: 'Radius & transition' },
191
+ ],
192
+ },
193
+ {
194
+ href: `${SITE_BASE}/docs/best-practices`,
195
+ label: 'Best Practices',
196
+ absolute: true,
197
+ external: true,
198
+ sections: [
199
+ { id: 'component-composition-patterns', label: 'Component Composition Patterns' },
200
+ { id: 'performance-optimization-tips', label: 'Performance Optimization Tips' },
46
201
  ],
47
202
  },
48
203
  ],
49
204
  },
50
205
  {
51
206
  label: 'Components',
52
- links: [{ href: 'components', label: 'Overview', frameworkOnly: true }],
207
+ links: [
208
+ { href: '/docs/components', label: 'Overview', absolute: true },
209
+ ...COMPONENT_CATEGORIES.flatMap((cat) =>
210
+ cat.slugs.map((slug) => ({
211
+ href: `${SITE_BASE}${FRAMEWORK_PREFIX}/components/${slug}`,
212
+ label: slugToTitle(slug),
213
+ absolute: true as const,
214
+ external: true as const,
215
+ }))
216
+ ),
217
+ ],
53
218
  },
54
219
  {
55
220
  label: 'Blocks',
56
221
  links: [
57
- { href: '/blocks', label: 'Blocks overview', absolute: true },
58
- { href: '/blocks/landing-hero', label: 'Landing hero', absolute: true },
59
- { href: '/blocks/pricing', label: 'Pricing cards', absolute: true },
60
- { href: '/blocks/dashboard-01', label: 'Dashboard', absolute: true },
61
- { href: '/blocks/docs-layout', label: 'Docs layout', absolute: true },
62
- { href: '/blocks/login', label: 'Login', absolute: true },
63
- { href: '/blocks/signup', label: 'Sign up', absolute: true },
222
+ { href: `${SITE_BASE}/blocks`, label: 'Blocks overview', absolute: true, external: true },
223
+ { href: `${SITE_BASE}/blocks/landing-hero`, label: 'Landing hero', absolute: true, external: true },
224
+ { href: `${SITE_BASE}/blocks/pricing`, label: 'Pricing cards', absolute: true, external: true },
225
+ { href: `${SITE_BASE}/blocks/dashboard-01`, label: 'Dashboard', absolute: true, external: true },
226
+ { href: `${SITE_BASE}/blocks/docs-layout`, label: 'Docs layout', absolute: true, external: true },
227
+ { href: `${SITE_BASE}/blocks/login`, label: 'Login', absolute: true, external: true },
228
+ { href: `${SITE_BASE}/blocks/signup`, label: 'Sign up', absolute: true, external: true },
64
229
  ],
65
230
  },
66
231
  {
67
- label: 'Themes',
68
- links: [{ href: '/themes', label: 'Themes', absolute: true }],
232
+ label: 'Examples',
233
+ links: [
234
+ { href: `${SITE_BASE}/docs/examples`, label: 'Examples overview', absolute: true, external: true },
235
+ {
236
+ href: `${SITE_BASE}/docs/examples/form-layouts`,
237
+ label: 'Form & layout examples',
238
+ absolute: true,
239
+ external: true,
240
+ sections: [
241
+ { id: 'login-form', label: 'Login form' },
242
+ { id: 'contact-form', label: 'Contact form' },
243
+ { id: 'dashboard-stats', label: 'Dashboard stats cards' },
244
+ { id: 'card-grid', label: 'Card grid' },
245
+ { id: 'settings-panel', label: 'Settings panel' },
246
+ ],
247
+ },
248
+ ],
69
249
  },
70
250
  ];
@@ -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.82`, in production.)
31
+ (Replace `@latest` with a specific version, e.g. `@0.0.83`, 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