rizzo-css 0.0.54 → 0.0.55

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 (250) hide show
  1. package/README.md +11 -7
  2. package/bin/rizzo-css.js +273 -118
  3. package/dist/rizzo.min.css +40 -16
  4. package/package.json +6 -6
  5. package/scaffold/astro/AlertDialog.astro +86 -0
  6. package/scaffold/astro/AspectRatio.astro +22 -0
  7. package/scaffold/astro/ButtonGroup.astro +16 -0
  8. package/scaffold/astro/Collapsible.astro +69 -0
  9. package/scaffold/astro/ContextMenu.astro +58 -0
  10. package/scaffold/astro/CopyToClipboard.astro +4 -0
  11. package/scaffold/astro/Dashboard.astro +74 -0
  12. package/scaffold/astro/Empty.astro +23 -0
  13. package/scaffold/astro/HoverCard.astro +64 -0
  14. package/scaffold/astro/Kbd.astro +14 -0
  15. package/scaffold/astro/Label.astro +24 -0
  16. package/scaffold/astro/Modal.astro +17 -2
  17. package/scaffold/astro/Popover.astro +62 -0
  18. package/scaffold/astro/ResizableHandle.astro +16 -0
  19. package/scaffold/astro/ResizablePane.astro +20 -0
  20. package/scaffold/astro/ResizablePaneGroup.astro +84 -0
  21. package/scaffold/astro/ScrollArea.astro +19 -0
  22. package/scaffold/astro/Separator.astro +18 -0
  23. package/scaffold/astro/Settings.astro +10 -2
  24. package/scaffold/astro/Sheet.astro +90 -0
  25. package/scaffold/astro/Skeleton.astro +16 -0
  26. package/scaffold/astro/Slider.astro +75 -0
  27. package/scaffold/astro/SoundEffects.astro +1 -0
  28. package/scaffold/astro/Switch.astro +37 -0
  29. package/scaffold/astro/Tabs.astro +1 -1
  30. package/scaffold/astro/ThemeSwitcher.astro +11 -4
  31. package/scaffold/astro/Toggle.astro +35 -0
  32. package/scaffold/astro/ToggleGroup.astro +24 -0
  33. package/scaffold/astro/base/README-RIZZO.md +55 -0
  34. package/scaffold/{astro-core → astro/base}/src/pages/index.astro +1 -1
  35. package/scaffold/astro/variants/dashboard/src/layouts/Layout.astro +85 -0
  36. package/scaffold/astro/variants/dashboard/src/pages/index.astro +110 -0
  37. package/scaffold/astro/variants/docs/src/layouts/Layout.astro +81 -0
  38. package/scaffold/astro/variants/docs/src/pages/docs/getting-started.astro +36 -0
  39. package/scaffold/astro/variants/docs/src/pages/index.astro +38 -0
  40. package/scaffold/{astro-core → astro/variants/full}/README-RIZZO.md +2 -1
  41. package/scaffold/astro/variants/full/astro.config.mjs +5 -0
  42. package/scaffold/astro/variants/full/dist/_noop-middleware.mjs +3 -0
  43. package/scaffold/astro/variants/full/dist/chunks/astro/server_9Mzx7luy.mjs +6023 -0
  44. package/scaffold/astro/variants/full/dist/chunks/astro_BOYUKg7r.mjs +1 -0
  45. package/scaffold/astro/variants/full/dist/favicon.svg +18 -0
  46. package/scaffold/astro/variants/full/dist/manifest_DXpJmqSX.mjs +154 -0
  47. package/scaffold/astro/variants/full/dist/noop-entrypoint.mjs +3 -0
  48. package/scaffold/astro/variants/full/dist/pages/index.astro.mjs +87 -0
  49. package/scaffold/astro/variants/full/dist/renderers.mjs +3 -0
  50. package/scaffold/astro/variants/full/gitignore +24 -0
  51. package/scaffold/astro/variants/full/node_modules/.astro/data-store.json +1 -0
  52. package/scaffold/astro/variants/full/node_modules/.vite/deps/_metadata.json +31 -0
  53. package/scaffold/astro/variants/full/node_modules/.vite/deps/astro___aria-query.js +6776 -0
  54. package/scaffold/astro/variants/full/node_modules/.vite/deps/astro___aria-query.js.map +7 -0
  55. package/scaffold/astro/variants/full/node_modules/.vite/deps/astro___axobject-query.js +3754 -0
  56. package/scaffold/astro/variants/full/node_modules/.vite/deps/astro___axobject-query.js.map +7 -0
  57. package/scaffold/astro/variants/full/node_modules/.vite/deps/astro___cssesc.js +99 -0
  58. package/scaffold/astro/variants/full/node_modules/.vite/deps/astro___cssesc.js.map +7 -0
  59. package/scaffold/astro/variants/full/node_modules/.vite/deps/chunk-BUSYA2B4.js +8 -0
  60. package/scaffold/astro/variants/full/node_modules/.vite/deps/chunk-BUSYA2B4.js.map +7 -0
  61. package/scaffold/astro/variants/full/node_modules/.vite/deps/package.json +3 -0
  62. package/scaffold/astro/variants/full/package.json +13 -0
  63. package/scaffold/astro/variants/full/public/.gitkeep +0 -0
  64. package/scaffold/astro/variants/full/public/favicon.svg +18 -0
  65. package/scaffold/astro/variants/full/src/components/rizzo/CopyToClipboard.astro +157 -0
  66. package/scaffold/astro/variants/full/src/components/rizzo/icons/Check.astro +29 -0
  67. package/scaffold/astro/variants/full/src/components/rizzo/icons/Copy.astro +30 -0
  68. package/scaffold/astro/variants/full/src/layouts/Layout.astro +34 -0
  69. package/scaffold/astro/variants/full/src/pages/index.astro +107 -0
  70. package/scaffold/astro/variants/full/tsconfig.json +5 -0
  71. package/scaffold/landing/index.html +13 -0
  72. package/scaffold/shared/navbar-vanilla.html +59 -0
  73. package/scaffold/shared/sound-effects-inline.js +6 -1
  74. package/scaffold/svelte/AlertDialog.svelte +55 -0
  75. package/scaffold/svelte/AspectRatio.svelte +21 -0
  76. package/scaffold/svelte/BackToTop.svelte +1 -0
  77. package/scaffold/svelte/ButtonGroup.svelte +16 -0
  78. package/scaffold/svelte/Collapsible.svelte +57 -0
  79. package/scaffold/svelte/ContextMenu.svelte +60 -0
  80. package/scaffold/svelte/Dashboard.svelte +87 -0
  81. package/scaffold/svelte/Empty.svelte +36 -0
  82. package/scaffold/svelte/HoverCard.svelte +55 -0
  83. package/scaffold/svelte/Kbd.svelte +13 -0
  84. package/scaffold/svelte/Label.svelte +19 -0
  85. package/scaffold/svelte/Popover.svelte +59 -0
  86. package/scaffold/svelte/ResizableHandle.svelte +13 -0
  87. package/scaffold/svelte/ResizablePane.svelte +16 -0
  88. package/scaffold/svelte/ResizablePaneGroup.svelte +92 -0
  89. package/scaffold/svelte/ScrollArea.svelte +18 -0
  90. package/scaffold/svelte/Separator.svelte +14 -0
  91. package/scaffold/svelte/Sheet.svelte +62 -0
  92. package/scaffold/svelte/Skeleton.svelte +19 -0
  93. package/scaffold/svelte/Slider.svelte +57 -0
  94. package/scaffold/svelte/SoundEffects.svelte +3 -0
  95. package/scaffold/svelte/Switch.svelte +35 -0
  96. package/scaffold/svelte/Tabs.svelte +1 -1
  97. package/scaffold/svelte/Toggle.svelte +41 -0
  98. package/scaffold/svelte/ToggleGroup.svelte +30 -0
  99. package/scaffold/svelte/base/README-RIZZO.md +55 -0
  100. package/scaffold/{svelte-core → svelte/base}/src/routes/+page.svelte +1 -1
  101. package/scaffold/svelte/base/static/.gitkeep +0 -0
  102. package/scaffold/svelte/index.ts +21 -0
  103. package/scaffold/svelte/variants/dashboard/src/routes/+layout.svelte +64 -0
  104. package/scaffold/svelte/variants/dashboard/src/routes/+page.svelte +104 -0
  105. package/scaffold/svelte/variants/docs/src/routes/+layout.svelte +60 -0
  106. package/scaffold/svelte/variants/docs/src/routes/+page.svelte +34 -0
  107. package/scaffold/svelte/variants/docs/src/routes/docs/getting-started/+page.svelte +31 -0
  108. package/scaffold/{svelte-core → svelte/variants/full}/README-RIZZO.md +2 -1
  109. package/scaffold/svelte/variants/full/gitignore +10 -0
  110. package/scaffold/svelte/variants/full/package.json +20 -0
  111. package/scaffold/svelte/variants/full/src/app.d.ts +11 -0
  112. package/scaffold/svelte/variants/full/src/app.html +16 -0
  113. package/scaffold/svelte/variants/full/src/routes/+layout.svelte +1 -0
  114. package/scaffold/svelte/variants/full/src/routes/+page.svelte +105 -0
  115. package/scaffold/svelte/variants/full/static/.gitkeep +0 -0
  116. package/scaffold/svelte/variants/full/svelte.config.js +10 -0
  117. package/scaffold/svelte/variants/full/tsconfig.json +11 -0
  118. package/scaffold/vanilla/README-RIZZO.md +6 -5
  119. package/scaffold/vanilla/components/accordion.html +59 -64
  120. package/scaffold/vanilla/components/alert-dialog.html +640 -0
  121. package/scaffold/vanilla/components/alert.html +59 -64
  122. package/scaffold/vanilla/components/aspect-ratio.html +640 -0
  123. package/scaffold/vanilla/components/avatar.html +59 -64
  124. package/scaffold/vanilla/components/back-to-top.html +59 -64
  125. package/scaffold/vanilla/components/badge.html +59 -64
  126. package/scaffold/vanilla/components/breadcrumb.html +59 -64
  127. package/scaffold/vanilla/components/button-group.html +640 -0
  128. package/scaffold/vanilla/components/button.html +59 -64
  129. package/scaffold/vanilla/components/cards.html +59 -64
  130. package/scaffold/vanilla/components/collapsible.html +640 -0
  131. package/scaffold/vanilla/components/context-menu.html +640 -0
  132. package/scaffold/vanilla/components/copy-to-clipboard.html +59 -64
  133. package/scaffold/vanilla/components/dashboard.html +640 -0
  134. package/scaffold/vanilla/components/divider.html +59 -64
  135. package/scaffold/vanilla/components/docs-sidebar.html +59 -64
  136. package/scaffold/vanilla/components/dropdown.html +59 -64
  137. package/scaffold/vanilla/components/empty.html +640 -0
  138. package/scaffold/vanilla/components/font-switcher.html +59 -64
  139. package/scaffold/vanilla/components/footer.html +59 -64
  140. package/scaffold/vanilla/components/forms.html +59 -64
  141. package/scaffold/vanilla/components/hover-card.html +640 -0
  142. package/scaffold/vanilla/components/icons.html +59 -64
  143. package/scaffold/vanilla/components/index.html +79 -64
  144. package/scaffold/vanilla/components/kbd.html +640 -0
  145. package/scaffold/vanilla/components/label.html +640 -0
  146. package/scaffold/vanilla/components/modal.html +59 -64
  147. package/scaffold/vanilla/components/navbar.html +59 -64
  148. package/scaffold/vanilla/components/pagination.html +59 -64
  149. package/scaffold/vanilla/components/popover.html +640 -0
  150. package/scaffold/vanilla/components/progress-bar.html +59 -64
  151. package/scaffold/vanilla/components/resizable.html +640 -0
  152. package/scaffold/vanilla/components/scroll-area.html +640 -0
  153. package/scaffold/vanilla/components/search.html +59 -64
  154. package/scaffold/vanilla/components/separator.html +640 -0
  155. package/scaffold/vanilla/components/settings.html +59 -64
  156. package/scaffold/vanilla/components/sheet.html +640 -0
  157. package/scaffold/vanilla/components/skeleton.html +640 -0
  158. package/scaffold/vanilla/components/slider.html +640 -0
  159. package/scaffold/vanilla/components/sound-effects.html +59 -64
  160. package/scaffold/vanilla/components/spinner.html +59 -64
  161. package/scaffold/vanilla/components/switch.html +640 -0
  162. package/scaffold/vanilla/components/table.html +59 -64
  163. package/scaffold/vanilla/components/tabs.html +59 -64
  164. package/scaffold/vanilla/components/theme-switcher.html +59 -64
  165. package/scaffold/vanilla/components/toast.html +59 -64
  166. package/scaffold/vanilla/components/toggle-group.html +640 -0
  167. package/scaffold/vanilla/components/toggle.html +640 -0
  168. package/scaffold/vanilla/components/tooltip.html +59 -64
  169. package/scaffold/vanilla/index.html +61 -66
  170. package/scaffold/vanilla/variants/dashboard/index.html +45 -0
  171. package/scaffold/vanilla/variants/docs/index.html +36 -0
  172. package/scaffold/vanilla/variants/full/components/accordion.html +592 -0
  173. package/scaffold/vanilla/variants/full/components/alert.html +592 -0
  174. package/scaffold/vanilla/variants/full/components/avatar.html +592 -0
  175. package/scaffold/vanilla/variants/full/components/back-to-top.html +592 -0
  176. package/scaffold/vanilla/variants/full/components/badge.html +592 -0
  177. package/scaffold/vanilla/variants/full/components/breadcrumb.html +592 -0
  178. package/scaffold/vanilla/variants/full/components/button.html +592 -0
  179. package/scaffold/vanilla/variants/full/components/cards.html +592 -0
  180. package/scaffold/vanilla/variants/full/components/copy-to-clipboard.html +592 -0
  181. package/scaffold/vanilla/variants/full/components/dashboard.html +592 -0
  182. package/scaffold/vanilla/variants/full/components/divider.html +592 -0
  183. package/scaffold/vanilla/variants/full/components/docs-sidebar.html +592 -0
  184. package/scaffold/vanilla/variants/full/components/dropdown.html +592 -0
  185. package/scaffold/vanilla/variants/full/components/font-switcher.html +592 -0
  186. package/scaffold/vanilla/variants/full/components/footer.html +592 -0
  187. package/scaffold/vanilla/variants/full/components/forms.html +592 -0
  188. package/scaffold/vanilla/variants/full/components/icons.html +592 -0
  189. package/scaffold/vanilla/variants/full/components/index.html +625 -0
  190. package/scaffold/vanilla/variants/full/components/modal.html +592 -0
  191. package/scaffold/vanilla/variants/full/components/navbar.html +592 -0
  192. package/scaffold/vanilla/variants/full/components/pagination.html +592 -0
  193. package/scaffold/vanilla/variants/full/components/progress-bar.html +592 -0
  194. package/scaffold/vanilla/variants/full/components/search.html +592 -0
  195. package/scaffold/vanilla/variants/full/components/settings.html +592 -0
  196. package/scaffold/vanilla/variants/full/components/skeleton.html +592 -0
  197. package/scaffold/vanilla/variants/full/components/sound-effects.html +592 -0
  198. package/scaffold/vanilla/variants/full/components/spinner.html +592 -0
  199. package/scaffold/vanilla/variants/full/components/switch.html +592 -0
  200. package/scaffold/vanilla/variants/full/components/table.html +592 -0
  201. package/scaffold/vanilla/variants/full/components/tabs.html +592 -0
  202. package/scaffold/vanilla/variants/full/components/theme-switcher.html +592 -0
  203. package/scaffold/vanilla/variants/full/components/toast.html +592 -0
  204. package/scaffold/vanilla/variants/full/components/tooltip.html +592 -0
  205. package/scaffold/vanilla/variants/full/index.html +682 -0
  206. package/scaffold/vanilla/variants/full/js/main.js +989 -0
  207. package/scaffold/astro-core/.astro/content-assets.mjs +0 -1
  208. package/scaffold/astro-core/.astro/content-modules.mjs +0 -1
  209. package/scaffold/astro-core/.astro/content.d.ts +0 -199
  210. package/scaffold/astro-core/.astro/types.d.ts +0 -2
  211. package/scaffold/astro-core/.env.example +0 -3
  212. package/scaffold/svelte-core/.env.example +0 -3
  213. /package/scaffold/{astro-core → astro/base}/astro.config.mjs +0 -0
  214. /package/scaffold/{astro-core → astro/base}/dist/.gitkeep +0 -0
  215. /package/scaffold/{astro-core → astro/base}/dist/_noop-middleware.mjs +0 -0
  216. /package/scaffold/{astro-core → astro/base}/dist/chunks/astro/server_9Mzx7luy.mjs +0 -0
  217. /package/scaffold/{astro-core → astro/base}/dist/chunks/astro_BOYUKg7r.mjs +0 -0
  218. /package/scaffold/{astro-core → astro/base}/dist/favicon.svg +0 -0
  219. /package/scaffold/{astro-core → astro/base}/dist/manifest_DXpJmqSX.mjs +0 -0
  220. /package/scaffold/{astro-core → astro/base}/dist/noop-entrypoint.mjs +0 -0
  221. /package/scaffold/{astro-core → astro/base}/dist/pages/index.astro.mjs +0 -0
  222. /package/scaffold/{astro-core → astro/base}/dist/renderers.mjs +0 -0
  223. /package/scaffold/{astro-core → astro/base}/gitignore +0 -0
  224. /package/scaffold/{astro-core → astro/base}/node_modules/.astro/data-store.json +0 -0
  225. /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/_metadata.json +0 -0
  226. /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/astro___aria-query.js +0 -0
  227. /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/astro___aria-query.js.map +0 -0
  228. /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/astro___axobject-query.js +0 -0
  229. /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/astro___axobject-query.js.map +0 -0
  230. /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/astro___cssesc.js +0 -0
  231. /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/astro___cssesc.js.map +0 -0
  232. /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/chunk-BUSYA2B4.js +0 -0
  233. /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/chunk-BUSYA2B4.js.map +0 -0
  234. /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/package.json +0 -0
  235. /package/scaffold/{astro-core → astro/base}/package.json +0 -0
  236. /package/scaffold/{astro-core → astro/base}/public/.gitkeep +0 -0
  237. /package/scaffold/{astro-core → astro/base}/public/favicon.svg +0 -0
  238. /package/scaffold/{astro-core → astro/base}/src/components/rizzo/CopyToClipboard.astro +0 -0
  239. /package/scaffold/{astro-core → astro/base}/src/components/rizzo/icons/Check.astro +0 -0
  240. /package/scaffold/{astro-core → astro/base}/src/components/rizzo/icons/Copy.astro +0 -0
  241. /package/scaffold/{astro-core → astro/base}/src/layouts/Layout.astro +0 -0
  242. /package/scaffold/{astro-core → astro/base}/tsconfig.json +0 -0
  243. /package/scaffold/{svelte-core/static → astro/variants/full/dist}/.gitkeep +0 -0
  244. /package/scaffold/{svelte-core → svelte/base}/gitignore +0 -0
  245. /package/scaffold/{svelte-core → svelte/base}/package.json +0 -0
  246. /package/scaffold/{svelte-core → svelte/base}/src/app.d.ts +0 -0
  247. /package/scaffold/{svelte-core → svelte/base}/src/app.html +0 -0
  248. /package/scaffold/{svelte-core → svelte/base}/src/routes/+layout.svelte +0 -0
  249. /package/scaffold/{svelte-core → svelte/base}/svelte.config.js +0 -0
  250. /package/scaffold/{svelte-core → svelte/base}/tsconfig.json +0 -0
@@ -0,0 +1,84 @@
1
+ ---
2
+ /**
3
+ * Group of resizable panes with handles. Use with ResizablePane and ResizableHandle.
4
+ * Matches shadcn-svelte Resizable.
5
+ */
6
+ interface Props {
7
+ id?: string;
8
+ direction?: 'horizontal' | 'vertical';
9
+ class?: string;
10
+ }
11
+
12
+ const { id, direction = 'horizontal', class: className = '' } = Astro.props;
13
+ const groupId = id || `resizable-${Math.random().toString(36).slice(2, 9)}`;
14
+ ---
15
+
16
+ <div
17
+ class={`resizable__pane-group resizable__pane-group--${direction} ${className}`.trim()}
18
+ id={groupId}
19
+ data-resizable-group
20
+ data-direction={direction}
21
+ >
22
+ <slot />
23
+ </div>
24
+
25
+ <script is:inline define:vars={{ groupId }}>
26
+ (function () {
27
+ function init() {
28
+ const root = document.getElementById(groupId);
29
+ if (!root) return;
30
+ const direction = root.dataset.direction === 'vertical' ? 'vertical' : 'horizontal';
31
+ const panes = Array.from(root.querySelectorAll('[data-resizable-pane]'));
32
+ const handles = Array.from(root.querySelectorAll('[data-resizable-handle]'));
33
+ if (panes.length < 2 || handles.length !== panes.length - 1) return;
34
+ function getSize(el) {
35
+ const style = getComputedStyle(el);
36
+ const basis = style.flexBasis;
37
+ if (basis && basis.endsWith('%')) return parseFloat(basis);
38
+ const rect = el.getBoundingClientRect();
39
+ const parent = el.parentElement;
40
+ if (!parent) return 50;
41
+ const parentRect = parent.getBoundingClientRect();
42
+ const pct = direction === 'horizontal' ? (rect.width / parentRect.width) * 100 : (rect.height / parentRect.height) * 100;
43
+ return pct;
44
+ }
45
+ function setSizes(pct1, pct2, idx) {
46
+ panes[idx].style.flex = '1 1 ' + pct1 + '%';
47
+ panes[idx + 1].style.flex = '1 1 ' + pct2 + '%';
48
+ }
49
+ handles.forEach(function (handle, i) {
50
+ let startX, startY, startPct1, startPct2;
51
+ function onMove(e) {
52
+ const parent = root.getBoundingClientRect();
53
+ let delta;
54
+ if (direction === 'horizontal') {
55
+ delta = ((e.clientX - startX) / parent.width) * 100;
56
+ } else {
57
+ delta = ((e.clientY - startY) / parent.height) * 100;
58
+ }
59
+ let p1 = startPct1 + delta;
60
+ let p2 = startPct2 - delta;
61
+ const min = 10;
62
+ if (p1 < min) { p1 = min; p2 = 100 - min; }
63
+ if (p2 < min) { p2 = min; p1 = 100 - min; }
64
+ setSizes(p1, p2, i);
65
+ }
66
+ function onUp() {
67
+ document.removeEventListener('mousemove', onMove);
68
+ document.removeEventListener('mouseup', onUp);
69
+ }
70
+ handle.addEventListener('mousedown', function (e) {
71
+ e.preventDefault();
72
+ startX = e.clientX;
73
+ startY = e.clientY;
74
+ startPct1 = getSize(panes[i]);
75
+ startPct2 = getSize(panes[i + 1]);
76
+ document.addEventListener('mousemove', onMove);
77
+ document.addEventListener('mouseup', onUp);
78
+ });
79
+ });
80
+ }
81
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
82
+ else init();
83
+ })();
84
+ </script>
@@ -0,0 +1,19 @@
1
+ ---
2
+ /**
3
+ * Scrollable area with themed scrollbar. Matches shadcn-svelte Scroll Area.
4
+ * orientation: 'vertical' (default) or 'horizontal'
5
+ */
6
+ interface Props {
7
+ orientation?: 'vertical' | 'horizontal';
8
+ class?: string;
9
+ }
10
+
11
+ const { orientation = 'vertical', class: className = '' } = Astro.props;
12
+ const horizontal = orientation === 'horizontal';
13
+ ---
14
+
15
+ <div class={`scroll-area ${horizontal ? 'scroll-area--horizontal' : ''} ${className}`.trim()}>
16
+ <div class="scroll-area__viewport" tabindex="0">
17
+ <slot />
18
+ </div>
19
+ </div>
@@ -0,0 +1,18 @@
1
+ ---
2
+ /**
3
+ * Thin separator line (horizontal or vertical). Same as Divider without label.
4
+ * Matches shadcn-svelte Separator.
5
+ */
6
+ interface Props {
7
+ orientation?: 'horizontal' | 'vertical';
8
+ class?: string;
9
+ }
10
+
11
+ const { orientation = 'horizontal', class: className = '' } = Astro.props;
12
+ ---
13
+
14
+ <div
15
+ class={`separator separator--${orientation} ${className}`.trim()}
16
+ role="separator"
17
+ aria-orientation={orientation}
18
+ ></div>
@@ -32,7 +32,7 @@ const { open = false } = Astro.props;
32
32
  <section class="settings__section">
33
33
  <h3 class="settings__section-title">Theme</h3>
34
34
  <div class="settings__control">
35
- <ThemeSwitcher />
35
+ <ThemeSwitcher idPrefix="settings" />
36
36
  </div>
37
37
  </section>
38
38
 
@@ -246,6 +246,10 @@ const { open = false } = Astro.props;
246
246
  // Open settings
247
247
  const openSettings = () => {
248
248
  previousActiveElement = document.activeElement;
249
+
250
+ const layoutContent = document.querySelector('[data-layout-content]');
251
+ if (layoutContent) layoutContent.setAttribute('inert', '');
252
+ document.body.style.overflow = 'hidden';
249
253
 
250
254
  // First, make elements visible but keep panel off-screen
251
255
  settings.setAttribute('aria-hidden', 'false');
@@ -280,7 +284,11 @@ const { open = false } = Astro.props;
280
284
  settings.setAttribute('aria-hidden', 'true');
281
285
  overlay?.setAttribute('aria-hidden', 'true');
282
286
  panel.setAttribute('aria-hidden', 'true');
283
-
287
+
288
+ const layoutContent = document.querySelector('[data-layout-content]');
289
+ if (layoutContent) layoutContent.removeAttribute('inert');
290
+ document.body.style.overflow = '';
291
+
284
292
  // Return focus to previous element
285
293
  if (previousActiveElement) {
286
294
  previousActiveElement.focus();
@@ -0,0 +1,90 @@
1
+ ---
2
+ /**
3
+ * Slide-out panel (drawer) from edge. Matches shadcn-svelte Sheet / Drawer.
4
+ */
5
+ import Close from './icons/Close.astro';
6
+
7
+ interface Props {
8
+ id?: string;
9
+ title?: string;
10
+ side?: 'top' | 'right' | 'bottom' | 'left';
11
+ open?: boolean;
12
+ class?: string;
13
+ }
14
+
15
+ const { id, title, side = 'right', open = false, class: className = '' } = Astro.props;
16
+ const sheetId = id || `sheet-${Math.random().toString(36).slice(2, 9)}`;
17
+ ---
18
+
19
+ <div
20
+ class={`sheet__overlay ${open ? 'sheet__overlay--open' : ''}`.trim()}
21
+ data-sheet-overlay
22
+ aria-hidden={!open}
23
+ id={`${sheetId}-overlay`}
24
+ ></div>
25
+ <div
26
+ class={`sheet sheet--${side} ${open ? 'sheet--open' : ''} ${className}`.trim()}
27
+ role="dialog"
28
+ aria-modal="true"
29
+ aria-labelledby={title ? `${sheetId}-title` : undefined}
30
+ aria-hidden={!open}
31
+ id={sheetId}
32
+ data-sheet
33
+ hidden={!open}
34
+ >
35
+ <div class="sheet__content">
36
+ {title && (
37
+ <div class="sheet__header">
38
+ <h2 id={`${sheetId}-title`} class="sheet__title">{title}</h2>
39
+ <button type="button" class="sheet__close" aria-label="Close" data-sheet-close>
40
+ <Close width={20} height={20} />
41
+ </button>
42
+ </div>
43
+ )}
44
+ <div class="sheet__body">
45
+ <slot />
46
+ </div>
47
+ </div>
48
+ </div>
49
+
50
+ <script is:inline define:vars={{ sheetId, open }}>
51
+ (function () {
52
+ function init() {
53
+ const sheet = document.getElementById(sheetId);
54
+ if (!sheet) return;
55
+ const overlay = document.getElementById(sheetId + '-overlay');
56
+ if (!overlay) return;
57
+ let escapeHandler = null;
58
+ const close = () => {
59
+ sheet.classList.remove('sheet--open');
60
+ sheet.setAttribute('aria-hidden', 'true');
61
+ sheet.hidden = true;
62
+ overlay.classList.remove('sheet__overlay--open');
63
+ overlay.setAttribute('aria-hidden', 'true');
64
+ if (escapeHandler) {
65
+ document.removeEventListener('keydown', escapeHandler);
66
+ escapeHandler = null;
67
+ }
68
+ };
69
+ const openSheet = () => {
70
+ sheet.hidden = false;
71
+ sheet.classList.add('sheet--open');
72
+ sheet.setAttribute('aria-hidden', 'false');
73
+ overlay.classList.add('sheet__overlay--open');
74
+ overlay.setAttribute('aria-hidden', 'false');
75
+ if (!escapeHandler) {
76
+ escapeHandler = (e) => { if (e.key === 'Escape') close(); };
77
+ document.addEventListener('keydown', escapeHandler);
78
+ }
79
+ };
80
+ sheet.querySelectorAll('[data-sheet-close]').forEach((b) => b.addEventListener('click', close));
81
+ overlay.addEventListener('click', close);
82
+ sheet.addEventListener('keydown', (e) => { if (e.key === 'Escape') close(); });
83
+ window['openSheet_' + sheetId.replace(/-/g, '_')] = openSheet;
84
+ window['closeSheet_' + sheetId.replace(/-/g, '_')] = close;
85
+ if (open) openSheet();
86
+ }
87
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
88
+ else init();
89
+ })();
90
+ </script>
@@ -0,0 +1,16 @@
1
+ ---
2
+ interface Props {
3
+ /** Shape variant */
4
+ variant?: 'text' | 'circle' | 'rect' | 'default';
5
+ /** Accessible label for loading state (announced by screen readers). Omit or empty = decorative (aria-hidden). */
6
+ label?: string;
7
+ class?: string;
8
+ }
9
+
10
+ const { variant = 'default', label = 'Loading', class: className = '' } = Astro.props;
11
+ const variantClass = variant !== 'default' ? `skeleton--${variant}` : '';
12
+ const classes = ['skeleton', variantClass, className].filter(Boolean).join(' ').trim();
13
+ const isDecorative = label === '';
14
+ ---
15
+
16
+ <span class={classes} role={isDecorative ? undefined : 'status'} aria-label={isDecorative ? undefined : label} aria-busy={isDecorative ? undefined : 'true'} aria-hidden={isDecorative ? 'true' : undefined}></span>
@@ -0,0 +1,75 @@
1
+ ---
2
+ /**
3
+ * Range slider input. Matches shadcn-svelte Slider.
4
+ */
5
+ interface Props {
6
+ id?: string;
7
+ name?: string;
8
+ min?: number;
9
+ max?: number;
10
+ step?: number;
11
+ value?: number;
12
+ disabled?: boolean;
13
+ /** Accessible name for the range input (required for axe / WCAG). */
14
+ ariaLabel?: string;
15
+ class?: string;
16
+ }
17
+
18
+ const {
19
+ id,
20
+ name,
21
+ min = 0,
22
+ max = 100,
23
+ step = 1,
24
+ value = min,
25
+ disabled = false,
26
+ ariaLabel,
27
+ class: className = '',
28
+ } = Astro.props;
29
+ const sliderId = id || `slider-${Math.random().toString(36).slice(2, 9)}`;
30
+ const pct = Math.min(100, Math.max(0, ((value - min) / (max - min)) * 100));
31
+ ---
32
+
33
+ <div class={`slider ${className}`.trim()} data-slider>
34
+ <input
35
+ type="range"
36
+ id={sliderId}
37
+ name={name}
38
+ class="slider__input"
39
+ min={min}
40
+ max={max}
41
+ step={step}
42
+ value={value}
43
+ disabled={disabled}
44
+ aria-valuemin={min}
45
+ aria-valuemax={max}
46
+ aria-valuenow={value}
47
+ aria-label={ariaLabel}
48
+ data-slider-input
49
+ />
50
+ <div class="slider__track" aria-hidden="true">
51
+ <div class="slider__fill" data-slider-fill style={`width: ${pct}%`} />
52
+ </div>
53
+ </div>
54
+
55
+ <script is:inline define:vars={{ sliderId, min, max }}>
56
+ (function () {
57
+ function init() {
58
+ const root = document.getElementById(sliderId);
59
+ if (!root) return;
60
+ const input = root.querySelector('[data-slider-input]');
61
+ const fill = root.querySelector('[data-slider-fill]');
62
+ if (!input || !fill) return;
63
+ function updateFill() {
64
+ const val = parseFloat(input.value);
65
+ const pct = Math.min(100, Math.max(0, ((val - min) / (max - min)) * 100));
66
+ fill.style.width = pct + '%';
67
+ input.setAttribute('aria-valuenow', String(val));
68
+ }
69
+ input.addEventListener('input', updateFill);
70
+ input.addEventListener('change', updateFill);
71
+ }
72
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
73
+ else init();
74
+ })();
75
+ </script>
@@ -37,6 +37,7 @@ const { class: className = '', showHelp = true } = Astro.props;
37
37
  el.checked = localStorage.getItem('soundEffects') === 'true';
38
38
  el.addEventListener('change', () => {
39
39
  localStorage.setItem('soundEffects', el.checked ? 'true' : 'false');
40
+ if (el.checked) window.dispatchEvent(new CustomEvent('rizzo-sound-effects-change'));
40
41
  });
41
42
  });
42
43
  }
@@ -0,0 +1,37 @@
1
+ ---
2
+ interface Props {
3
+ id?: string;
4
+ name?: string;
5
+ checked?: boolean;
6
+ disabled?: boolean;
7
+ /** Accessible label (visible or sr-only) */
8
+ label?: string;
9
+ class?: string;
10
+ }
11
+
12
+ const {
13
+ id,
14
+ name,
15
+ checked = false,
16
+ disabled = false,
17
+ label,
18
+ class: className = '',
19
+ } = Astro.props;
20
+ ---
21
+
22
+ <label class={`switch ${className}`.trim()} for={id}>
23
+ <input
24
+ type="checkbox"
25
+ id={id}
26
+ name={name}
27
+ class="switch__input"
28
+ role="switch"
29
+ aria-checked={checked}
30
+ checked={checked}
31
+ disabled={disabled}
32
+ />
33
+ <span class="switch__track" aria-hidden="true">
34
+ <span class="switch__thumb" />
35
+ </span>
36
+ {label ? <span class="switch__label">{label}</span> : null}
37
+ </label>
@@ -53,7 +53,7 @@ const classes = `tabs ${variantClass} ${className}`.trim();
53
53
  data-tab-id={tab.id}
54
54
  data-tab-index={index}
55
55
  >
56
- {tab.iconComponent ? <tab.iconComponent width={20} height={20} class="tabs__tab-icon" /> : tab.icon ? <img src={tab.icon} alt="" class="tabs__tab-icon" width="20" height="20" /> : null}
56
+ {tab.iconComponent ? <tab.iconComponent width={20} height={20} class="tabs__tab-icon" /> : tab.icon ? <img src={tab.icon} alt="" class="tabs__tab-icon" width="20" height="20" loading="lazy" aria-hidden="true" /> : null}
57
57
  {tab.label}
58
58
  </span>
59
59
  );
@@ -41,6 +41,13 @@ const themes = {
41
41
  light: THEMES_LIGHT.map((t) => ({ ...t, icon: iconMap[t.iconKey] })),
42
42
  };
43
43
 
44
+ interface Props {
45
+ /** Optional prefix for trigger/menu IDs to avoid duplicate ids when multiple ThemeSwitchers exist (e.g. idPrefix="settings"). */
46
+ idPrefix?: string;
47
+ }
48
+ const { idPrefix = '' } = Astro.props;
49
+ const triggerId = idPrefix ? `theme-trigger-${idPrefix}` : 'theme-trigger';
50
+ const menuId = idPrefix ? `theme-menu-${idPrefix}` : 'theme-menu';
44
51
 
45
52
  // Get current theme from HTML data attribute or default
46
53
  const getCurrentTheme = () => {
@@ -76,9 +83,9 @@ const InitialIcon = initialTheme ? initialTheme.icon : null;
76
83
  type="button"
77
84
  aria-expanded="false"
78
85
  aria-haspopup="true"
79
- aria-controls="theme-menu"
86
+ aria-controls={menuId}
80
87
  aria-label="Select theme"
81
- id="theme-trigger"
88
+ id={triggerId}
82
89
  >
83
90
  <span class="theme-switcher__label-wrapper" data-theme-label-wrapper>
84
91
  <span class="theme-switcher__label" data-theme-label>{initialLabel}</span>
@@ -88,9 +95,9 @@ const InitialIcon = initialTheme ? initialTheme.icon : null;
88
95
 
89
96
  <div
90
97
  class="theme-switcher__menu"
91
- id="theme-menu"
98
+ id={menuId}
92
99
  role="menu"
93
- aria-labelledby="theme-trigger"
100
+ aria-labelledby={triggerId}
94
101
  aria-label="Theme selection menu"
95
102
  aria-orientation="vertical"
96
103
  aria-hidden="true"
@@ -0,0 +1,35 @@
1
+ ---
2
+ /**
3
+ * Toggle button (pressed/unpressed state). Matches shadcn-svelte Toggle.
4
+ */
5
+ interface Props {
6
+ pressed?: boolean;
7
+ disabled?: boolean;
8
+ type?: 'button' | 'submit' | 'reset';
9
+ value?: string;
10
+ ariaLabel?: string;
11
+ class?: string;
12
+ }
13
+
14
+ const {
15
+ pressed = false,
16
+ disabled = false,
17
+ type = 'button',
18
+ value,
19
+ ariaLabel,
20
+ class: className = '',
21
+ } = Astro.props;
22
+ const pressedClass = pressed ? 'toggle--pressed' : '';
23
+ ---
24
+
25
+ <button
26
+ type={type}
27
+ class={`toggle ${pressedClass} ${className}`.trim()}
28
+ aria-pressed={pressed}
29
+ disabled={disabled}
30
+ value={value}
31
+ aria-label={ariaLabel}
32
+ data-toggle
33
+ >
34
+ <slot />
35
+ </button>
@@ -0,0 +1,24 @@
1
+ ---
2
+ /**
3
+ * Group of toggle buttons (single or multiple selection). Matches shadcn-svelte Toggle Group.
4
+ */
5
+ interface Props {
6
+ type?: 'single' | 'multiple';
7
+ orientation?: 'horizontal' | 'vertical';
8
+ class?: string;
9
+ }
10
+
11
+ const { type = 'single', orientation = 'horizontal', class: className = '' } = Astro.props;
12
+ const orientationClass = orientation === 'vertical' ? 'toggle-group--vertical' : '';
13
+ const role = type === 'single' ? 'radiogroup' : 'group';
14
+ ---
15
+
16
+ <div
17
+ class={`toggle-group ${orientationClass} ${className}`.trim()}
18
+ role={role}
19
+ aria-label="Toggle group"
20
+ data-toggle-group
21
+ data-toggle-type={type}
22
+ >
23
+ <slot />
24
+ </div>
@@ -0,0 +1,55 @@
1
+ # Astro + Rizzo CSS
2
+
3
+ ```
4
+ /\___/\
5
+ __( o o )__
6
+ ( =^= )
7
+ _/ ~ \_
8
+ / \_____/ \
9
+ ____ ___ _____________ ____ ____ ____
10
+ | _ \|_ _|__ /__ / _ \ / ___/ ___/ ___|
11
+ | |_) || | / / / / | | | | | \___ \___ \
12
+ | _ < | | / /_ / /| |_| | | |___ ___) |__) |
13
+ |_| \_\___/____/____\___/ \____|____/____/
14
+ Design system · Vanilla · Astro · Svelte
15
+ ```
16
+
17
+ Astro project with Rizzo CSS. Scaffolded with `npx rizzo-css init` when you chose **Create new** and Astro, then **Landing**, **Docs**, **Dashboard**, or **Full**. **Full** = clone of the docs site. **Landing** / **Docs** / **Dashboard** = base + component picker (all 56 or pick). Same template choice for **Add to existing** (`npx rizzo-css add`).
18
+
19
+ ## Setup
20
+
21
+ 1. Copy environment example (optional):
22
+ ```bash
23
+ cp .env.example .env
24
+ ```
25
+
26
+ 2. Install dependencies:
27
+ ```bash
28
+ pnpm install
29
+ # or: npm install
30
+ ```
31
+
32
+ 3. Start the dev server:
33
+ ```bash
34
+ pnpm dev
35
+ ```
36
+
37
+ ## Project structure
38
+
39
+ - `.gitignore` — Astro default values (same as `create-astro`): dist/, .astro/, node_modules/, .env, logs, .DS_Store, .idea/
40
+ - `astro.config.mjs` — Astro configuration
41
+ - `src/layouts/Layout.astro` — Layout with Rizzo CSS and theme (edit `data-theme` for default)
42
+ - `src/pages/index.astro` — Home page
43
+ - **Navbar** — Flat links (Docs, Components, Blocks, Themes, Colors); Search and Settings in the scaffold
44
+ - `public/css/rizzo.min.css` — Rizzo CSS bundle (added by CLI; font URLs point to `/assets/fonts/`)
45
+ - `public/assets/fonts/` — Rizzo font files (added by CLI)
46
+ - `README-RIZZO.md` — This file (scaffold docs; does not replace your project README)
47
+ - `LICENSE-RIZZO` — Rizzo CSS license (does not replace your project LICENSE)
48
+
49
+ ## Commands
50
+
51
+ - `pnpm dev` — Start dev server
52
+ - `pnpm build` — Build for production
53
+ - `pnpm preview` — Preview production build
54
+
55
+ Docs: [rizzo-css.vercel.app](https://rizzo-css.vercel.app)
@@ -33,7 +33,7 @@ const ADD_COMMAND = 'npx rizzo-css add <ComponentName>';
33
33
  </div>
34
34
  <div class="home__card home__card--featured">
35
35
  <span class="home__card-icon" aria-hidden="true">Components</span>
36
- <h3>34 ready components</h3>
36
+ <h3>All components</h3>
37
37
  <p>Navbar, Settings, Theme Switcher, Font Switcher, Modal, Dropdown, Tabs, Forms, and more — all accessible and themeable.</p>
38
38
  </div>
39
39
  </div>
@@ -0,0 +1,85 @@
1
+ ---
2
+ /* Placeholders replaced by rizzo-css CLI when scaffolding */
3
+ /* {{THEME_LIST_COMMENT}} */
4
+ const DATA_THEME = '{{DATA_THEME}}';
5
+ /** @type {{ title?: string }} */
6
+ const { title = '{{TITLE}}' } = Astro.props;
7
+ {{RIZZO_LAYOUT_IMPORTS}}
8
+ ---
9
+ <!doctype html>
10
+ <html lang="en" data-theme={DATA_THEME}>
11
+ <head>
12
+ <meta charset="UTF-8" />
13
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
14
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
15
+ <script is:inline>
16
+ (function(){try{
17
+ var s=localStorage.getItem('theme');var d='{{DEFAULT_DARK}}';var l='{{DEFAULT_LIGHT}}';var initial=document.documentElement.getAttribute('data-theme');var r=!s?((initial&&initial!=='system')?initial:(matchMedia('(prefers-color-scheme: dark)').matches?d:l)):s==='system'?(matchMedia('(prefers-color-scheme: dark)').matches?d:l):s;document.documentElement.setAttribute('data-theme',r);
18
+ var fs=localStorage.getItem('fontSizeScale');if(fs)document.documentElement.style.setProperty('--font-size-scale',fs);
19
+ var fp=localStorage.getItem('fontPair')||'geist';if(fp==='geist'){document.documentElement.style.setProperty('--font-family','var(--font-family-geist-sans)');document.documentElement.style.setProperty('--font-family-mono','var(--font-family-geist-mono)');}else if(fp==='inter-jetbrains'){document.documentElement.style.setProperty('--font-family','var(--font-family-inter)');document.documentElement.style.setProperty('--font-family-mono','var(--font-family-jetbrains-mono)');}else if(fp==='ibm-plex'){document.documentElement.style.setProperty('--font-family','var(--font-family-ibm-plex-sans)');document.documentElement.style.setProperty('--font-family-mono','var(--font-family-ibm-plex-mono)');}else if(fp==='source'){document.documentElement.style.setProperty('--font-family','var(--font-family-source-sans-3)');document.documentElement.style.setProperty('--font-family-mono','var(--font-family-source-code-pro)');}else if(fp==='dm'){document.documentElement.style.setProperty('--font-family','var(--font-family-dm-sans)');document.documentElement.style.setProperty('--font-family-mono','var(--font-family-dm-mono)');}else if(fp==='outfit-jetbrains'){document.documentElement.style.setProperty('--font-family','var(--font-family-outfit)');document.documentElement.style.setProperty('--font-family-mono','var(--font-family-jetbrains-mono)');}
20
+ }catch(e){}})();
21
+ </script>
22
+ <link rel="stylesheet" href="/css/rizzo.min.css" />
23
+ {{RIZZO_SOUND_SCRIPT}}
24
+ <title>{title}</title>
25
+ </head>
26
+ <body>
27
+ <a href="#main-content" class="skip-link">Skip to main content</a>
28
+ {{RIZZO_LAYOUT_BODY_TOP}}
29
+ <div class="dashboard">
30
+ <aside class="dashboard__sidebar" aria-label="Dashboard navigation">
31
+ <nav class="dashboard__nav">
32
+ <a href="/" class="dashboard__nav-link dashboard__nav-link--active" aria-current="page">Dashboard</a>
33
+ <a href="/" class="dashboard__nav-link">Items</a>
34
+ <a href="/" class="dashboard__nav-link">Settings</a>
35
+ </nav>
36
+ </aside>
37
+ <main id="main-content" class="dashboard__main">
38
+ <slot />
39
+ </main>
40
+ </div>
41
+ {{RIZZO_LAYOUT_BODY_BOTTOM}}
42
+ </body>
43
+ </html>
44
+
45
+ <style is:global>
46
+ .dashboard {
47
+ display: flex;
48
+ min-height: 100vh;
49
+ }
50
+ .dashboard__sidebar {
51
+ width: 16rem;
52
+ flex-shrink: 0;
53
+ border-right: 1px solid var(--border);
54
+ padding: var(--spacing-4);
55
+ background: var(--background-alt);
56
+ }
57
+ .dashboard__nav {
58
+ display: flex;
59
+ flex-direction: column;
60
+ gap: var(--spacing-1);
61
+ }
62
+ .dashboard__nav-link {
63
+ display: block;
64
+ padding: var(--spacing-2) var(--spacing-3);
65
+ border-radius: var(--radius-md);
66
+ color: var(--text);
67
+ text-decoration: none;
68
+ }
69
+ .dashboard__nav-link:hover {
70
+ background: var(--background);
71
+ }
72
+ .dashboard__nav-link--active {
73
+ background: var(--accent);
74
+ color: var(--accent-text);
75
+ }
76
+ .dashboard__main {
77
+ flex: 1;
78
+ padding: var(--spacing-6);
79
+ overflow: auto;
80
+ }
81
+ @media (max-width: 768px) {
82
+ .dashboard { flex-direction: column; }
83
+ .dashboard__sidebar { width: 100%; border-right: none; border-bottom: 1px solid var(--border); }
84
+ }
85
+ </style>