rizzo-css 0.0.12 → 0.0.13

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 (230) hide show
  1. package/.env.example +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +17 -3
  4. package/bin/rizzo-css.js +93 -43
  5. package/package.json +5 -3
  6. package/scaffold/astro-app/README.md +13 -2
  7. package/scaffold/astro-app/src/components/Accordion.astro +178 -0
  8. package/scaffold/astro-app/src/components/Alert.astro +131 -0
  9. package/scaffold/astro-app/src/components/Avatar.astro +59 -0
  10. package/scaffold/astro-app/src/components/Badge.astro +24 -0
  11. package/scaffold/astro-app/src/components/Breadcrumb.astro +61 -0
  12. package/scaffold/astro-app/src/components/Button.astro +3 -0
  13. package/scaffold/astro-app/src/components/Card.astro +18 -0
  14. package/scaffold/astro-app/src/components/Checkbox.astro +38 -0
  15. package/scaffold/astro-app/src/components/CodeBlock.astro +393 -0
  16. package/scaffold/astro-app/src/components/CopyToClipboard.astro +219 -0
  17. package/scaffold/astro-app/src/components/Divider.astro +37 -0
  18. package/scaffold/astro-app/src/components/Dropdown.astro +807 -0
  19. package/scaffold/astro-app/src/components/FormGroup.astro +59 -0
  20. package/scaffold/astro-app/src/components/FrameworkSwitcher.astro +72 -0
  21. package/scaffold/astro-app/src/components/Input.astro +59 -0
  22. package/scaffold/astro-app/src/components/Modal.astro +212 -0
  23. package/scaffold/astro-app/src/components/Navbar.astro +701 -0
  24. package/scaffold/astro-app/src/components/Pagination.astro +240 -0
  25. package/scaffold/astro-app/src/components/ProgressBar.astro +65 -0
  26. package/scaffold/astro-app/src/components/Radio.astro +38 -0
  27. package/scaffold/astro-app/src/components/Search.astro +1259 -0
  28. package/scaffold/astro-app/src/components/Select.astro +49 -0
  29. package/scaffold/astro-app/src/components/Settings.astro +382 -0
  30. package/scaffold/astro-app/src/components/Spinner.astro +30 -0
  31. package/scaffold/astro-app/src/components/Table.astro +181 -0
  32. package/scaffold/astro-app/src/components/Tabs.astro +223 -0
  33. package/scaffold/astro-app/src/components/Textarea.astro +58 -0
  34. package/scaffold/astro-app/src/components/ThemeSwitcher.astro +504 -0
  35. package/scaffold/astro-app/src/components/Toast.astro +30 -0
  36. package/scaffold/astro-app/src/components/Tooltip.astro +32 -0
  37. package/scaffold/astro-app/src/components/icons/Brush.astro +10 -0
  38. package/scaffold/astro-app/src/components/icons/Cake.astro +11 -0
  39. package/scaffold/astro-app/src/components/icons/Check.astro +29 -0
  40. package/scaffold/astro-app/src/components/icons/Cherry.astro +11 -0
  41. package/scaffold/astro-app/src/components/icons/ChevronDown.astro +29 -0
  42. package/scaffold/astro-app/src/components/icons/Circle.astro +29 -0
  43. package/scaffold/astro-app/src/components/icons/Close.astro +30 -0
  44. package/scaffold/astro-app/src/components/icons/Cmd.astro +26 -0
  45. package/scaffold/astro-app/src/components/icons/Copy.astro +30 -0
  46. package/scaffold/astro-app/src/components/icons/Eye.astro +30 -0
  47. package/scaffold/astro-app/src/components/icons/Filter.astro +29 -0
  48. package/scaffold/astro-app/src/components/icons/Flame.astro +28 -0
  49. package/scaffold/astro-app/src/components/icons/Flower.astro +11 -0
  50. package/scaffold/astro-app/src/components/icons/Gear.astro +30 -0
  51. package/scaffold/astro-app/src/components/icons/Heart.astro +28 -0
  52. package/scaffold/astro-app/src/components/icons/IceCream.astro +31 -0
  53. package/scaffold/astro-app/src/components/icons/Leaf.astro +29 -0
  54. package/scaffold/astro-app/src/components/icons/Lemon.astro +11 -0
  55. package/scaffold/astro-app/src/components/icons/Moon.astro +29 -0
  56. package/scaffold/astro-app/src/components/icons/Owl.astro +34 -0
  57. package/scaffold/astro-app/src/components/icons/Palette.astro +33 -0
  58. package/scaffold/astro-app/src/components/icons/Rainbow.astro +31 -0
  59. package/scaffold/astro-app/src/components/icons/Search.astro +30 -0
  60. package/scaffold/astro-app/src/components/icons/Shield.astro +28 -0
  61. package/scaffold/astro-app/src/components/icons/Snowflake.astro +34 -0
  62. package/scaffold/astro-app/src/components/icons/Sort.astro +30 -0
  63. package/scaffold/astro-app/src/components/icons/Sun.astro +29 -0
  64. package/scaffold/astro-app/src/components/icons/Sunset.astro +10 -0
  65. package/scaffold/astro-app/src/components/icons/Zap.astro +9 -0
  66. package/scaffold/astro-app/src/components/icons/devicons/Astro.astro +53 -0
  67. package/scaffold/astro-app/src/components/icons/devicons/Bash.astro +34 -0
  68. package/scaffold/astro-app/src/components/icons/devicons/Css3.astro +29 -0
  69. package/scaffold/astro-app/src/components/icons/devicons/Git.astro +24 -0
  70. package/scaffold/astro-app/src/components/icons/devicons/Html5.astro +27 -0
  71. package/scaffold/astro-app/src/components/icons/devicons/Javascript.astro +25 -0
  72. package/scaffold/astro-app/src/components/icons/devicons/Nodejs.astro +47 -0
  73. package/scaffold/astro-app/src/components/icons/devicons/Plaintext.astro +33 -0
  74. package/scaffold/astro-app/src/components/icons/devicons/React.astro +27 -0
  75. package/scaffold/astro-app/src/components/icons/devicons/Svelte.astro +25 -0
  76. package/scaffold/astro-app/src/components/icons/devicons/Vue.astro +26 -0
  77. package/scaffold/astro-app/src/config/frameworks.ts +26 -0
  78. package/scaffold/astro-app/src/config/themes.ts +54 -0
  79. package/scaffold/astro-app/src/layouts/DocsLayout.astro +204 -0
  80. package/scaffold/astro-app/src/layouts/Layout.astro +11 -2
  81. package/scaffold/astro-app/src/pages/components/accordion.astro +172 -0
  82. package/scaffold/astro-app/src/pages/components/alert.astro +250 -0
  83. package/scaffold/astro-app/src/pages/components/avatar.astro +102 -0
  84. package/scaffold/astro-app/src/pages/components/badge.astro +119 -0
  85. package/scaffold/astro-app/src/pages/components/breadcrumb.astro +124 -0
  86. package/scaffold/astro-app/src/pages/components/button.astro +74 -0
  87. package/scaffold/astro-app/src/pages/components/cards.astro +247 -0
  88. package/scaffold/astro-app/src/pages/components/copy-to-clipboard.astro +49 -0
  89. package/scaffold/astro-app/src/pages/components/divider.astro +74 -0
  90. package/scaffold/astro-app/src/pages/components/dropdown.astro +394 -0
  91. package/scaffold/astro-app/src/pages/components/forms.astro +367 -0
  92. package/scaffold/astro-app/src/pages/components/icons.astro +246 -0
  93. package/scaffold/astro-app/src/pages/components/modal.astro +152 -0
  94. package/scaffold/astro-app/src/pages/components/navbar.astro +80 -0
  95. package/scaffold/astro-app/src/pages/components/pagination.astro +126 -0
  96. package/scaffold/astro-app/src/pages/components/progress-bar.astro +94 -0
  97. package/scaffold/astro-app/src/pages/components/search.astro +155 -0
  98. package/scaffold/astro-app/src/pages/components/settings.astro +78 -0
  99. package/scaffold/astro-app/src/pages/components/spinner.astro +81 -0
  100. package/scaffold/astro-app/src/pages/components/table.astro +144 -0
  101. package/scaffold/astro-app/src/pages/components/tabs.astro +220 -0
  102. package/scaffold/astro-app/src/pages/components/theme-switcher.astro +67 -0
  103. package/scaffold/astro-app/src/pages/components/toast.astro +157 -0
  104. package/scaffold/astro-app/src/pages/components/tooltip.astro +209 -0
  105. package/scaffold/astro-app/src/pages/components.astro +290 -0
  106. package/scaffold/astro-app/src/pages/docs/accessibility.astro +9 -0
  107. package/scaffold/astro-app/src/pages/docs/colors.astro +9 -0
  108. package/scaffold/astro-app/src/pages/docs/design-system.astro +9 -0
  109. package/scaffold/astro-app/src/pages/docs/getting-started.astro +9 -0
  110. package/scaffold/astro-app/src/pages/docs/index.astro +15 -0
  111. package/scaffold/astro-app/src/pages/docs/themes/[theme].astro +14 -0
  112. package/scaffold/astro-app/src/pages/docs/theming.astro +10 -0
  113. package/scaffold/astro-app/src/pages/index.astro +5 -11
  114. package/scaffold/svelte-app/README.md +9 -2
  115. package/scaffold/svelte-app/src/app.html +1 -1
  116. package/scaffold/svelte-app/src/lib/rizzo/Accordion.svelte +128 -0
  117. package/scaffold/svelte-app/src/lib/rizzo/Alert.svelte +85 -0
  118. package/scaffold/svelte-app/src/lib/rizzo/Avatar.svelte +39 -0
  119. package/scaffold/svelte-app/src/lib/rizzo/Badge.svelte +31 -0
  120. package/scaffold/svelte-app/src/lib/rizzo/Breadcrumb.svelte +49 -0
  121. package/scaffold/svelte-app/src/lib/rizzo/Button.svelte +27 -0
  122. package/scaffold/svelte-app/src/lib/rizzo/Card.svelte +17 -0
  123. package/scaffold/svelte-app/src/lib/rizzo/Checkbox.svelte +37 -0
  124. package/scaffold/svelte-app/src/lib/rizzo/CopyToClipboard.svelte +79 -0
  125. package/scaffold/svelte-app/src/lib/rizzo/Divider.svelte +28 -0
  126. package/scaffold/svelte-app/src/lib/rizzo/Dropdown.svelte +254 -0
  127. package/scaffold/svelte-app/src/lib/rizzo/FormGroup.svelte +51 -0
  128. package/scaffold/svelte-app/src/lib/rizzo/Input.svelte +59 -0
  129. package/scaffold/svelte-app/src/lib/rizzo/Modal.svelte +157 -0
  130. package/scaffold/svelte-app/src/lib/rizzo/Pagination.svelte +93 -0
  131. package/scaffold/svelte-app/src/lib/rizzo/ProgressBar.svelte +58 -0
  132. package/scaffold/svelte-app/src/lib/rizzo/Radio.svelte +38 -0
  133. package/scaffold/svelte-app/src/lib/rizzo/Select.svelte +51 -0
  134. package/scaffold/svelte-app/src/lib/rizzo/Spinner.svelte +14 -0
  135. package/scaffold/svelte-app/src/lib/rizzo/Table.svelte +158 -0
  136. package/scaffold/svelte-app/src/lib/rizzo/Tabs.svelte +117 -0
  137. package/scaffold/svelte-app/src/lib/rizzo/Textarea.svelte +59 -0
  138. package/scaffold/svelte-app/src/lib/rizzo/ThemeSwitcher.svelte +315 -0
  139. package/scaffold/svelte-app/src/lib/rizzo/Toast.svelte +33 -0
  140. package/scaffold/svelte-app/src/lib/rizzo/Tooltip.svelte +19 -0
  141. package/scaffold/svelte-app/src/lib/rizzo/icons/Check.svelte +29 -0
  142. package/scaffold/svelte-app/src/lib/rizzo/icons/ChevronDown.svelte +29 -0
  143. package/scaffold/svelte-app/src/lib/rizzo/icons/Circle.svelte +29 -0
  144. package/scaffold/svelte-app/src/lib/rizzo/icons/Close.svelte +30 -0
  145. package/scaffold/svelte-app/src/lib/rizzo/icons/Cmd.svelte +27 -0
  146. package/scaffold/svelte-app/src/lib/rizzo/icons/Copy.svelte +30 -0
  147. package/scaffold/svelte-app/src/lib/rizzo/icons/Eye.svelte +30 -0
  148. package/scaffold/svelte-app/src/lib/rizzo/icons/Filter.svelte +29 -0
  149. package/scaffold/svelte-app/src/lib/rizzo/icons/Gear.svelte +30 -0
  150. package/scaffold/svelte-app/src/lib/rizzo/icons/IceCream.svelte +31 -0
  151. package/scaffold/svelte-app/src/lib/rizzo/icons/Moon.svelte +29 -0
  152. package/scaffold/svelte-app/src/lib/rizzo/icons/Owl.svelte +34 -0
  153. package/scaffold/svelte-app/src/lib/rizzo/icons/Palette.svelte +33 -0
  154. package/scaffold/svelte-app/src/lib/rizzo/icons/Rainbow.svelte +31 -0
  155. package/scaffold/svelte-app/src/lib/rizzo/icons/Search.svelte +30 -0
  156. package/scaffold/svelte-app/src/lib/rizzo/icons/Snowflake.svelte +34 -0
  157. package/scaffold/svelte-app/src/lib/rizzo/icons/Sort.svelte +30 -0
  158. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Astro.svelte +45 -0
  159. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Bash.svelte +28 -0
  160. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Css3.svelte +23 -0
  161. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Git.svelte +18 -0
  162. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Html5.svelte +21 -0
  163. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Javascript.svelte +19 -0
  164. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Nodejs.svelte +44 -0
  165. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Plaintext.svelte +24 -0
  166. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/React.svelte +21 -0
  167. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/SvelteIcon.svelte +19 -0
  168. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Vue.svelte +20 -0
  169. package/scaffold/svelte-app/src/lib/rizzo/index.ts +33 -0
  170. package/scaffold/svelte-app/src/lib/rizzo-docs/CodeBlock.svelte +239 -0
  171. package/scaffold/svelte-app/src/lib/rizzo-docs/SvelteDocPage.svelte +99 -0
  172. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AccordionDoc.svelte +53 -0
  173. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AlertDoc.svelte +114 -0
  174. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AvatarDoc.svelte +92 -0
  175. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/BadgeDoc.svelte +60 -0
  176. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/BreadcrumbDoc.svelte +55 -0
  177. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ButtonDoc.svelte +55 -0
  178. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/CardsDoc.svelte +173 -0
  179. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ComingSoon.svelte +12 -0
  180. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ComponentsOverview.svelte +92 -0
  181. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/CopyToClipboardDoc.svelte +26 -0
  182. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/DividerDoc.svelte +105 -0
  183. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/DropdownDoc.svelte +161 -0
  184. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/FormsDoc.svelte +375 -0
  185. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/IconsDoc.svelte +246 -0
  186. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/Index.svelte +8 -0
  187. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ModalDoc.svelte +50 -0
  188. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/NavbarDoc.svelte +79 -0
  189. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/PaginationDoc.svelte +44 -0
  190. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ProgressBarDoc.svelte +95 -0
  191. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SearchDoc.svelte +147 -0
  192. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SettingsDoc.svelte +158 -0
  193. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SpinnerDoc.svelte +41 -0
  194. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TableDoc.svelte +116 -0
  195. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TabsDoc.svelte +152 -0
  196. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ThemeSwitcherDoc.svelte +181 -0
  197. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/Theming.svelte +6 -0
  198. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ToastDoc.svelte +136 -0
  199. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TooltipDoc.svelte +57 -0
  200. package/scaffold/svelte-app/src/routes/+page.svelte +2 -2
  201. package/scaffold/svelte-app/src/routes/components/+page.svelte +4 -0
  202. package/scaffold/svelte-app/src/routes/components/[slug]/+page.svelte +7 -0
  203. package/scaffold/vanilla/README.md +11 -4
  204. package/scaffold/vanilla/components/accordion.html +187 -0
  205. package/scaffold/vanilla/components/alert.html +187 -0
  206. package/scaffold/vanilla/components/avatar.html +187 -0
  207. package/scaffold/vanilla/components/badge.html +187 -0
  208. package/scaffold/vanilla/components/breadcrumb.html +187 -0
  209. package/scaffold/vanilla/components/button.html +187 -0
  210. package/scaffold/vanilla/components/cards.html +187 -0
  211. package/scaffold/vanilla/components/copy-to-clipboard.html +187 -0
  212. package/scaffold/vanilla/components/divider.html +187 -0
  213. package/scaffold/vanilla/components/dropdown.html +187 -0
  214. package/scaffold/vanilla/components/forms.html +187 -0
  215. package/scaffold/vanilla/components/icons.html +187 -0
  216. package/scaffold/vanilla/components/index.html +212 -0
  217. package/scaffold/vanilla/components/modal.html +187 -0
  218. package/scaffold/vanilla/components/navbar.html +187 -0
  219. package/scaffold/vanilla/components/pagination.html +187 -0
  220. package/scaffold/vanilla/components/progress-bar.html +187 -0
  221. package/scaffold/vanilla/components/search.html +187 -0
  222. package/scaffold/vanilla/components/settings.html +187 -0
  223. package/scaffold/vanilla/components/spinner.html +187 -0
  224. package/scaffold/vanilla/components/table.html +187 -0
  225. package/scaffold/vanilla/components/tabs.html +187 -0
  226. package/scaffold/vanilla/components/theme-switcher.html +187 -0
  227. package/scaffold/vanilla/components/toast.html +187 -0
  228. package/scaffold/vanilla/components/tooltip.html +187 -0
  229. package/scaffold/vanilla/index.html +16 -6
  230. package/scaffold/vanilla/js/main.js +4 -3
package/.env.example ADDED
@@ -0,0 +1,12 @@
1
+ # Optional: used only if you add search (e.g. Algolia) to a scaffold-based project
2
+ # Copy to .env in your project and replace with your own values
3
+
4
+ # Public (client-side) — safe to expose in the browser
5
+ PUBLIC_ALGOLIA_APP_ID=your-algolia-app-id
6
+ PUBLIC_ALGOLIA_SEARCH_KEY=your-search-only-api-key
7
+ PUBLIC_ALGOLIA_INDEX_NAME=your-index-name
8
+
9
+ # Private (server-side only) — do not commit or expose
10
+ ALGOLIA_APP_ID=your-algolia-app-id
11
+ ALGOLIA_ADMIN_KEY=your-admin-api-key
12
+ ALGOLIA_INDEX_NAME=your-index-name
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 mingleusa
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -12,7 +12,7 @@ pnpm add rizzo-css
12
12
  yarn add rizzo-css
13
13
  ```
14
14
 
15
- **Quick start (no install):** `npx rizzo-css init` — first choose **add to existing project** or **create new**. Existing: framework (auto-detect), themes, optional components. New: scaffold (Vanilla example, default Astro app, or default Svelte app; CLI colors: Vanilla = yellow, Astro = orange, Svelte = orange-red). All get the **same CSS and component styles**. To use the **official Svelte or Astro scaffold** plus Rizzo CSS, create the app with their CLI first, then run `npx rizzo-css add`:
15
+ **Quick start (no install):** `npx rizzo-css init` — first choose **framework** (Vanilla, Astro, or Svelte), then **add to existing** or **create new**. Existing: themes, optional components. New: full scaffold (CLI colors: Vanilla = yellow, Astro = orange, Svelte = orange-red). All get the **same CSS and component styles**. To use the **official Svelte or Astro scaffold** plus Rizzo CSS, create the app with their CLI first, then run `npx rizzo-css add`:
16
16
 
17
17
  ```bash
18
18
  npm create svelte@latest my-app && cd my-app && npx rizzo-css add
@@ -31,7 +31,17 @@ You install **the same package** for every framework: `npm install rizzo-css`. N
31
31
  | **Astro** | `npm install rizzo-css` | `import 'rizzo-css'` in layout or link from `public/` | Copy components from `node_modules/rizzo-css/scaffold/astro/` or use `npx rizzo-css add` with components |
32
32
  | **Svelte** | `npm install rizzo-css` | `import 'rizzo-css'` in root layout or link from `static/` | Copy components from `node_modules/rizzo-css/scaffold/svelte/` or use `npx rizzo-css add` with components |
33
33
 
34
- Scaffolds (full starter apps) are in the package: `scaffold/vanilla/`, `scaffold/astro-app/`, `scaffold/svelte-app/`. Use `npx rizzo-css init` and choose “Create new” to generate a project from one of them; each scaffold folder has a README with setup and commands.
34
+ **CSS paths (CLI and scaffolds):**
35
+
36
+ | Framework | Where the CLI copies CSS | `<link href="...">` in your HTML/layout |
37
+ |-----------|-------------------------|----------------------------------------|
38
+ | **Vanilla** | `css/rizzo.min.css` (project root) | `css/rizzo.min.css` (relative) |
39
+ | **Astro** | `public/css/rizzo.min.css` | `/css/rizzo.min.css` (Astro serves `public/` at `/`) |
40
+ | **Svelte** | `static/css/rizzo.min.css` | `/css/rizzo.min.css` (SvelteKit serves `static/` at `/`) |
41
+
42
+ With `npx rizzo-css add --path <dir>`, the CLI still suggests the correct href for your framework (e.g. Astro/Svelte get a leading `/` path).
43
+
44
+ Scaffolds (full starter apps) are in the package: `scaffold/vanilla/`, `scaffold/astro-app/`, `scaffold/svelte-app/`. Use `npx rizzo-css init` and choose **Create new project** to get the full clone (navbar/chrome + component showcase) for the chosen framework. **Add to existing** only adds the CSS and optional components (no full scaffold). Each scaffold folder has a README with setup and instructions for editing the cloned site.
35
45
 
36
46
  ## Use
37
47
 
@@ -46,7 +56,7 @@ import 'rizzo-css';
46
56
  **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:
47
57
 
48
58
  ```html
49
- <!-- unpkg (pin version: replace @latest with @0.0.12 or any version) -->
59
+ <!-- unpkg (pin version: replace @latest with @0.0.13 or any version) -->
50
60
  <link rel="stylesheet" href="https://unpkg.com/rizzo-css@latest/dist/rizzo.min.css" />
51
61
 
52
62
  <!-- or jsDelivr -->
@@ -71,6 +81,10 @@ Theme IDs and full docs: [Theming](https://rizzo-css.vercel.app/docs/theming).
71
81
 
72
82
  Full documentation: **[rizzo-css.vercel.app](https://rizzo-css.vercel.app)** — Getting Started, Components, Themes, and usage for Vanilla, Astro, and Svelte.
73
83
 
84
+ ## Package contents
85
+
86
+ In addition to `dist/`, `bin/`, and `scaffold/`, the package includes **LICENSE** (MIT) and **.env.example** (optional; for projects that add search, e.g. Algolia — copy to `.env` and set your own values).
87
+
74
88
  ## License
75
89
 
76
90
  MIT
package/bin/rizzo-css.js CHANGED
@@ -6,15 +6,18 @@ const readline = require('readline');
6
6
 
7
7
  const COMMANDS = ['init', 'add', 'theme', 'help'];
8
8
  const FRAMEWORKS = ['vanilla', 'astro', 'svelte'];
9
- const THEMES = [
9
+ // Dark and light themes (order matches scaffold optgroups and config/themes.ts)
10
+ const DARK_THEMES = [
10
11
  'github-dark-classic',
11
- 'github-light',
12
12
  'shades-of-purple',
13
13
  'sandstorm-classic',
14
14
  'rocky-blood-orange',
15
15
  'minimal-dark-neon-yellow',
16
16
  'hack-the-box',
17
17
  'pink-cat-boo',
18
+ ];
19
+ const LIGHT_THEMES = [
20
+ 'github-light',
18
21
  'red-velvet-cupcake',
19
22
  'orangy-one-light',
20
23
  'sunflower',
@@ -22,6 +25,7 @@ const THEMES = [
22
25
  'cute-pink',
23
26
  'semi-light-purple',
24
27
  ];
28
+ const THEMES = [...DARK_THEMES, ...LIGHT_THEMES];
25
29
  // Components available for scaffold (must match scaffold/svelte and scaffold/astro)
26
30
  const SVELTE_COMPONENTS = [
27
31
  'Button', 'Badge', 'Card', 'Divider', 'Spinner', 'ProgressBar', 'Avatar', 'Alert',
@@ -336,7 +340,7 @@ Usage:
336
340
  npx rizzo-css <command> [options]
337
341
 
338
342
  Commands:
339
- init Add Rizzo to existing project or scaffold new one (first menu: existing vs new)
343
+ init Add Rizzo to existing project or scaffold new one (first: framework, then existing vs new)
340
344
  add Copy Rizzo CSS into the current project (auto-detects Svelte/Astro)
341
345
  theme List all available themes (use in init or set data-theme on <html>)
342
346
  help Show this help
@@ -360,11 +364,35 @@ Docs: https://rizzo-css.vercel.app
360
364
  }
361
365
 
362
366
  function cmdTheme() {
363
- process.stdout.write('\nAvailable themes (set data-theme on <html>):\n\n');
364
- THEMES.forEach((t) => process.stdout.write(' ' + t + '\n'));
367
+ process.stdout.write('\nDark themes (set data-theme on <html>):\n');
368
+ DARK_THEMES.forEach((t) => process.stdout.write(' ' + t + '\n'));
369
+ process.stdout.write('\nLight themes:\n');
370
+ LIGHT_THEMES.forEach((t) => process.stdout.write(' ' + t + '\n'));
365
371
  process.stdout.write('\nExample: <html lang="en" data-theme="github-dark-classic">\n\n');
366
372
  }
367
373
 
374
+ /** Prompt for default dark theme, default light theme, and initial theme. Returns { theme, defaultDark, defaultLight }. */
375
+ async function promptThemes() {
376
+ const defaultDark = await selectMenu(
377
+ DARK_THEMES.map((t) => ({ value: t, label: t })),
378
+ '? Default dark theme (used when system preference is dark)'
379
+ );
380
+ const defaultLight = await selectMenu(
381
+ LIGHT_THEMES.map((t) => ({ value: t, label: t })),
382
+ '? Default light theme (used when system preference is light)'
383
+ );
384
+ const initialChoice = await selectMenu(
385
+ [
386
+ { value: 'system', label: 'System (follow OS light/dark)' },
387
+ { value: defaultDark, label: defaultDark + ' (dark)' },
388
+ { value: defaultLight, label: defaultLight + ' (light)' },
389
+ ],
390
+ '? Initial theme on first load'
391
+ );
392
+ const theme = initialChoice;
393
+ return { theme, defaultDark: DARK_THEMES.includes(defaultDark) ? defaultDark : DARK_THEMES[0], defaultLight: LIGHT_THEMES.includes(defaultLight) ? defaultLight : LIGHT_THEMES[0] };
394
+ }
395
+
368
396
  /** Detect framework from cwd: "svelte" | "astro" | null. */
369
397
  function detectFramework(cwd) {
370
398
  if (existsSync(join(cwd, 'svelte.config.js')) || existsSync(join(cwd, 'svelte.config.ts'))) return 'svelte';
@@ -386,6 +414,24 @@ function getFrameworkCssPaths(framework) {
386
414
  return { targetDir: 'css', linkHref: 'css/rizzo.min.css' };
387
415
  }
388
416
 
417
+ /**
418
+ * Browser-visible href for the CSS file. Astro serves public/ at /, SvelteKit serves static/ at /.
419
+ * Use this when a custom --path is provided so we tell the user the correct <link href="...">.
420
+ */
421
+ function getLinkHrefForTargetDir(framework, targetDir) {
422
+ const file = 'rizzo.min.css';
423
+ if (framework === 'astro' && targetDir) {
424
+ const path = targetDir.replace(/^public\/?/, '').replace(/\/+$/, '') || 'css';
425
+ return '/' + (path ? path + '/' : '') + file;
426
+ }
427
+ if (framework === 'svelte' && targetDir) {
428
+ const path = targetDir.replace(/^static\/?/, '').replace(/\/+$/, '') || 'css';
429
+ return '/' + (path ? path + '/' : '') + file;
430
+ }
431
+ const base = targetDir ? targetDir.replace(/\/+$/, '') : 'css';
432
+ return base ? base + '/' + file : file;
433
+ }
434
+
389
435
  function cmdAdd(argv) {
390
436
  const pathIdx = argv.indexOf('--path');
391
437
  const customPath = pathIdx !== -1 && argv[pathIdx + 1] ? argv[pathIdx + 1] : null;
@@ -407,7 +453,7 @@ function cmdAdd(argv) {
407
453
 
408
454
  mkdirSync(join(cwd, targetDir), { recursive: true });
409
455
  copyFileSync(cssSource, targetFile);
410
- const linkHref = customPath ? customPath + '/rizzo.min.css' : paths.linkHref;
456
+ const linkHref = customPath ? getLinkHrefForTargetDir(framework, targetDir) : paths.linkHref;
411
457
  console.log('\n✓ Rizzo CSS copied to ' + targetFile);
412
458
  if (framework === 'svelte') {
413
459
  console.log('\nDetected Svelte/SvelteKit. Add to your root layout (e.g. src/app.html):\n');
@@ -582,26 +628,25 @@ function copyAstroComponents(projectDir, selectedNames) {
582
628
  }
583
629
  }
584
630
 
585
- /** Add Rizzo CSS (and optional components) to an existing project in cwd. */
586
- async function runAddToExisting() {
631
+ /** Add Rizzo CSS (and optional components) to an existing project in cwd. frameworkOverride: when set (from init), skip framework prompt. */
632
+ async function runAddToExisting(frameworkOverride) {
587
633
  const cwd = process.cwd();
588
- const detected = detectFramework(cwd);
589
- const frameworkOptions = [
590
- { value: 'vanilla', label: 'Vanilla JS (HTML + CSS)', color: C.vanilla },
591
- { value: 'astro', label: 'Astro', color: C.astro },
592
- { value: 'svelte', label: 'Svelte', color: C.svelte },
593
- ];
594
- let frameworkPrompt = '? Framework';
595
- if (detected) {
596
- frameworkPrompt += ' (detected: ' + detected + ' — pick to confirm or choose another)';
597
- }
598
- const framework = await selectMenu(frameworkOptions, frameworkPrompt);
599
-
600
- const defaultTheme = await selectMenu(
601
- THEMES.map((t) => ({ value: t, label: t })),
602
- '? Default theme (all 14 themes are included in the CSS; this sets the initial data-theme)'
603
- );
604
- const theme = THEMES.includes(defaultTheme) ? defaultTheme : THEMES[0];
634
+ let framework = frameworkOverride;
635
+ if (framework == null) {
636
+ const detected = detectFramework(cwd);
637
+ const frameworkOptions = [
638
+ { value: 'vanilla', label: 'Vanilla JS (HTML + CSS)', color: C.vanilla },
639
+ { value: 'astro', label: 'Astro', color: C.astro },
640
+ { value: 'svelte', label: 'Svelte', color: C.svelte },
641
+ ];
642
+ let frameworkPrompt = '? Framework';
643
+ if (detected) {
644
+ frameworkPrompt += ' (detected: ' + detected + ' — pick to confirm or choose another)';
645
+ }
646
+ framework = await selectMenu(frameworkOptions, frameworkPrompt);
647
+ }
648
+
649
+ const { theme, defaultDark, defaultLight } = await promptThemes();
605
650
 
606
651
  let selectedComponents = [];
607
652
  const componentList = framework === 'svelte' ? SVELTE_COMPONENTS : framework === 'astro' ? ASTRO_COMPONENTS : [];
@@ -652,6 +697,7 @@ async function runAddToExisting() {
652
697
  console.log('\nAdd to your root layout (e.g. src/app.html):');
653
698
  console.log(' <link rel="stylesheet" href="' + linkHref + '" />');
654
699
  console.log('\nSet a theme on <html>: data-theme="' + theme + '" (see: npx rizzo-css theme)');
700
+ console.log(' For theme "system": default dark ' + defaultDark + ', default light ' + defaultLight);
655
701
  if (selectedComponents.length > 0) {
656
702
  console.log(' Components are in src/lib/rizzo — import from \'$lib/rizzo\'.');
657
703
  }
@@ -659,6 +705,7 @@ async function runAddToExisting() {
659
705
  console.log('\nAdd to your layout (e.g. src/layouts/Layout.astro):');
660
706
  console.log(' <link rel="stylesheet" href="' + linkHref + '" />');
661
707
  console.log('\nSet a theme on <html>: data-theme="' + theme + '" (see: npx rizzo-css theme)');
708
+ console.log(' For theme "system": default dark ' + defaultDark + ', default light ' + defaultLight);
662
709
  if (selectedComponents.length > 0) {
663
710
  console.log(' Components are in src/components/rizzo — import from there.');
664
711
  }
@@ -666,21 +713,31 @@ async function runAddToExisting() {
666
713
  console.log('\nAdd to your HTML or layout:');
667
714
  console.log(' <link rel="stylesheet" href="' + linkHref + '" />');
668
715
  console.log('\nSet a theme on <html>: data-theme="' + theme + '" (see: npx rizzo-css theme)');
716
+ console.log(' For theme "system": default dark ' + defaultDark + ', default light ' + defaultLight);
669
717
  }
670
718
  console.log('\nDocs: https://rizzo-css.vercel.app\n');
671
719
  }
672
720
 
673
721
  async function cmdInit() {
722
+ const framework = await selectMenu(
723
+ [
724
+ { value: 'vanilla', label: 'Vanilla JS (HTML + CSS + same styles & components)', color: C.vanilla },
725
+ { value: 'astro', label: 'Astro', color: C.astro },
726
+ { value: 'svelte', label: 'Svelte', color: C.svelte },
727
+ ],
728
+ '? Framework — all get the same CSS and component styles'
729
+ );
730
+
674
731
  const initMode = await selectMenu(
675
732
  [
676
733
  { value: 'existing', label: 'Add to existing project (current directory)' },
677
734
  { value: 'new', label: 'Create new project (scaffold)' },
678
735
  ],
679
- '? Are you using an existing project or creating a new one?'
736
+ '? Add to existing project or create a new one?'
680
737
  );
681
738
 
682
739
  if (initMode === 'existing') {
683
- await runAddToExisting();
740
+ await runAddToExisting(framework);
684
741
  return;
685
742
  }
686
743
 
@@ -693,20 +750,7 @@ async function cmdInit() {
693
750
  );
694
751
  const name = projectChoice === 'name' ? await question('Project name (folder name): ') : '';
695
752
 
696
- const framework = await selectMenu(
697
- [
698
- { value: 'vanilla', label: 'Vanilla JS (HTML + CSS + same styles & components)', color: C.vanilla },
699
- { value: 'astro', label: 'Astro', color: C.astro },
700
- { value: 'svelte', label: 'Svelte', color: C.svelte },
701
- ],
702
- '? Framework (arrows, Enter to select) — all get the same CSS and component styles'
703
- );
704
-
705
- const defaultTheme = await selectMenu(
706
- THEMES.map((t) => ({ value: t, label: t })),
707
- '? Default theme (all 14 themes are included in the CSS; this sets the initial data-theme)'
708
- );
709
- const theme = THEMES.includes(defaultTheme) ? defaultTheme : THEMES[0];
753
+ const { theme, defaultDark, defaultLight } = await promptThemes();
710
754
 
711
755
  let selectedComponents = [];
712
756
  const componentList = framework === 'svelte' ? SVELTE_COMPONENTS : framework === 'astro' ? ASTRO_COMPONENTS : [];
@@ -739,12 +783,14 @@ async function cmdInit() {
739
783
  process.exit(1);
740
784
  }
741
785
 
742
- const themeComment = '\n <!-- Default theme: ' + theme + ' (all 14 themes included in CSS) -->';
786
+ const themeComment = '\n <!-- Initial: ' + theme + '; dark: ' + defaultDark + '; light: ' + defaultLight + ' (all 14 themes in CSS) -->';
743
787
  const projectNamePkg = name
744
788
  ? name.replace(/\s+/g, '-').toLowerCase()
745
789
  : (framework === 'astro' ? 'my-astro-app' : framework === 'svelte' ? 'my-svelte-app' : 'my-app');
746
790
  const replacements = {
747
791
  '{{DATA_THEME}}': theme,
792
+ '{{DEFAULT_DARK}}': defaultDark,
793
+ '{{DEFAULT_LIGHT}}': defaultLight,
748
794
  '{{THEME_LIST_COMMENT}}': themeComment,
749
795
  '{{TITLE}}': name || 'App',
750
796
  '{{PROJECT_NAME}}': projectNamePkg,
@@ -798,6 +844,8 @@ async function cmdInit() {
798
844
  let indexHtml = readFileSync(vanillaScaffoldPath, 'utf8');
799
845
  indexHtml = indexHtml
800
846
  .replace(/\{\{DATA_THEME\}\}/g, theme)
847
+ .replace(/\{\{DEFAULT_DARK\}\}/g, defaultDark)
848
+ .replace(/\{\{DEFAULT_LIGHT\}\}/g, defaultLight)
801
849
  .replace(/\{\{THEME_LIST_COMMENT\}\}/g, themeComment)
802
850
  .replace(/\{\{TITLE\}\}/g, name || 'App')
803
851
  .replace(/\{\{LINK_HREF\}\}/g, linkHref);
@@ -828,7 +876,9 @@ async function cmdInit() {
828
876
  const vanillaJs = join(getPackageRoot(), 'scaffold', 'vanilla', 'js', 'main.js');
829
877
  if (existsSync(vanillaJs)) {
830
878
  mkdirSync(join(projectDir, 'js'), { recursive: true });
831
- copyFileSync(vanillaJs, join(projectDir, 'js', 'main.js'));
879
+ let mainJs = readFileSync(vanillaJs, 'utf8');
880
+ mainJs = mainJs.replace(/\{\{DEFAULT_DARK\}\}/g, defaultDark).replace(/\{\{DEFAULT_LIGHT\}\}/g, defaultLight);
881
+ writeFileSync(join(projectDir, 'js', 'main.js'), mainJs, 'utf8');
832
882
  }
833
883
  }
834
884
  if (framework === 'svelte' && selectedComponents.length > 0) {
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "rizzo-css",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "scripts": {
5
- "prepublishOnly": "cd ../.. && pnpm build:css && node scripts/copy-scaffold.js"
5
+ "prepublishOnly": "cd ../.. && pnpm build:css && node scripts/copy-scaffold.js && node scripts/prepare-astro-scaffold.js && node scripts/prepare-vanilla-scaffold.js && node scripts/prepare-svelte-scaffold.js"
6
6
  },
7
7
  "description": "A modern CSS design system with semantic theming, 14 themes, and accessible components (BEM). Use with Astro, Svelte, or any framework.",
8
8
  "style": "dist/rizzo.min.css",
@@ -22,6 +22,8 @@
22
22
  "files": [
23
23
  "dist",
24
24
  "README.md",
25
+ "LICENSE",
26
+ ".env.example",
25
27
  "bin",
26
28
  "scaffold"
27
29
  ],
@@ -41,4 +43,4 @@
41
43
  "homepage": "https://rizzo-css.vercel.app",
42
44
  "license": "MIT",
43
45
  "author": "mingleusa"
44
- }
46
+ }
@@ -1,6 +1,6 @@
1
1
  # Astro + Rizzo CSS
2
2
 
3
- This project was scaffolded with `npx rizzo-css init` (Astro).
3
+ This project was scaffolded with `npx rizzo-css init` when you chose **Create new project** and Astro. This full clone (navbar, docs pages, component showcase) is only generated for new projects; **Add to existing project** only adds the CSS and optional components.
4
4
 
5
5
  ## First-time setup
6
6
 
@@ -25,8 +25,19 @@ The theme selected during `rizzo-css init` is set in `src/layouts/Layout.astro`
25
25
  - `pnpm build` — Build for production
26
26
  - `pnpm preview` — Preview production build
27
27
 
28
+ ## Editing the cloned site
29
+
30
+ - **Layout and shell** — `src/layouts/Layout.astro` (navbar, settings, theme script, CSS link). Change the default theme or title placeholders here.
31
+ - **Docs and theme pages** — `src/pages/docs/` (getting-started, design-system, theming, themes, etc.). Each page uses `DocsLayout` and can be edited or replaced; stubs link to the main site for full content.
32
+ - **Component showcase** — `src/pages/components.astro` (index) and `src/pages/components/*.astro`. Edit or add component demos; imports use `../../components/` and `../../layouts/`.
33
+ - **Home page** — `src/pages/index.astro`. Replace the hero and links with your own content.
34
+ - **Components and config** — `src/components/` (Navbar, Settings, Card, etc.) and `src/config/themes.ts`. Customize or remove components; update the nav in `Navbar.astro` if you add/remove routes.
35
+ - **CSS** — The app loads `/css/rizzo.min.css` (from `public/css/`). Replace or add styles as needed.
36
+
37
+ After editing, run `pnpm dev` to preview and `pnpm build` for production.
38
+
28
39
  ## Other scaffolds
29
40
 
30
- From the same **rizzo-css** package: **Vanilla** (`scaffold/vanilla/`) — single HTML file with Settings and toast; **Svelte** (`scaffold/svelte-app/`) — SvelteKit app. Use `npx rizzo-css init` and pick a different framework to create one of them.
41
+ From the same **rizzo-css** package: **Vanilla** (`scaffold/vanilla/`) — index + component showcase (components/index.html, components/<slug>.html) with Settings and toast; **Svelte** (`scaffold/svelte-app/`) — SvelteKit app with /components and /components/[slug]. Use `npx rizzo-css init` and pick a different framework to create one of them.
31
42
 
32
43
  Docs: [rizzo-css.vercel.app](https://rizzo-css.vercel.app)
@@ -0,0 +1,178 @@
1
+ ---
2
+ import ChevronDown from './icons/ChevronDown.astro';
3
+
4
+ interface AccordionItem {
5
+ id: string;
6
+ title: string;
7
+ content?: string;
8
+ }
9
+
10
+ interface Props {
11
+ items: AccordionItem[];
12
+ id?: string;
13
+ allowMultiple?: boolean;
14
+ defaultExpanded?: string | string[];
15
+ class?: string;
16
+ }
17
+
18
+ const {
19
+ items,
20
+ id,
21
+ allowMultiple = false,
22
+ defaultExpanded,
23
+ class: className = '',
24
+ } = Astro.props;
25
+
26
+ const accordionId = id || `accordion-${Math.random().toString(36).substr(2, 9)}`;
27
+
28
+ const getDefaultExpanded = (): Set<string> => {
29
+ if (defaultExpanded === undefined) return new Set(items[0] ? [items[0].id] : []);
30
+ if (typeof defaultExpanded === 'string') return new Set([defaultExpanded]);
31
+ return new Set(defaultExpanded);
32
+ };
33
+
34
+ const defaultOpenIds = getDefaultExpanded();
35
+ const classes = `accordion ${className}`.trim();
36
+ let slotIndex = 0;
37
+ ---
38
+
39
+ <div class={classes} data-accordion={accordionId} data-allow-multiple={allowMultiple ? 'true' : 'false'}>
40
+ {items.map((item) => {
41
+ const triggerId = `${accordionId}-trigger-${item.id}`;
42
+ const panelId = `${accordionId}-panel-${item.id}`;
43
+ const isExpanded = defaultOpenIds.has(item.id);
44
+ const useSlot = !item.content;
45
+ const currentSlotIndex = useSlot ? slotIndex++ : -1;
46
+
47
+ return (
48
+ <div class="accordion__item" data-accordion-item data-item-id={item.id}>
49
+ <h3 class="accordion__heading">
50
+ <button
51
+ type="button"
52
+ class={`accordion__trigger ${isExpanded ? 'accordion__trigger--expanded' : ''}`}
53
+ id={triggerId}
54
+ aria-expanded={isExpanded}
55
+ aria-controls={panelId}
56
+ data-accordion-trigger
57
+ >
58
+ <span class="accordion__title">{item.title}</span>
59
+ <ChevronDown class="accordion__icon" width={16} height={16} aria-hidden="true" />
60
+ </button>
61
+ </h3>
62
+ <div
63
+ class={`accordion__panel ${isExpanded ? 'accordion__panel--expanded' : ''}`}
64
+ id={panelId}
65
+ role="region"
66
+ aria-labelledby={triggerId}
67
+ hidden={!isExpanded}
68
+ data-accordion-panel
69
+ >
70
+ <div class="accordion__panel-inner">
71
+ {item.content ? (
72
+ <div class="accordion__panel-content" set:html={item.content} />
73
+ ) : (
74
+ <div class="accordion__panel-content accordion__panel-slot" data-accordion-slot-index={currentSlotIndex}>
75
+ <!-- Slot content distributed by script -->
76
+ </div>
77
+ )}
78
+ </div>
79
+ </div>
80
+ </div>
81
+ );
82
+ })}
83
+ <!-- Slot content for distribution (same order as items) -->
84
+ <div class="accordion__slot-content" style="display: none;">
85
+ <slot />
86
+ </div>
87
+ </div>
88
+
89
+ <script is:inline>
90
+ (function initAccordions() {
91
+ function initOne(accordion) {
92
+ if (accordion.dataset.accordionInit === 'true') return;
93
+ accordion.dataset.accordionInit = 'true';
94
+
95
+ const isMultiple = accordion.getAttribute('data-allow-multiple') === 'true';
96
+ const triggers = accordion.querySelectorAll('[data-accordion-trigger]');
97
+
98
+ const setExpanded = (trigger, expanded) => {
99
+ const panelId = trigger.getAttribute('aria-controls');
100
+ const panel = panelId ? accordion.querySelector('#' + CSS.escape(panelId)) : null;
101
+ trigger.setAttribute('aria-expanded', String(expanded));
102
+ trigger.classList.toggle('accordion__trigger--expanded', expanded);
103
+ if (panel) {
104
+ panel.classList.toggle('accordion__panel--expanded', expanded);
105
+ panel.hidden = !expanded;
106
+ }
107
+ };
108
+
109
+ const toggle = (trigger) => {
110
+ const expanded = trigger.getAttribute('aria-expanded') === 'true';
111
+ if (!isMultiple) {
112
+ triggers.forEach((t) => setExpanded(t, false));
113
+ }
114
+ setExpanded(trigger, !expanded);
115
+ };
116
+
117
+ triggers.forEach((trigger) => {
118
+ trigger.addEventListener('click', () => toggle(trigger));
119
+ });
120
+
121
+ triggers.forEach((trigger, index) => {
122
+ trigger.addEventListener('keydown', (e) => {
123
+ let targetIndex = index;
124
+ switch (e.key) {
125
+ case 'ArrowDown':
126
+ e.preventDefault();
127
+ targetIndex = Math.min(index + 1, triggers.length - 1);
128
+ break;
129
+ case 'ArrowUp':
130
+ e.preventDefault();
131
+ targetIndex = Math.max(index - 1, 0);
132
+ break;
133
+ case 'Home':
134
+ e.preventDefault();
135
+ targetIndex = 0;
136
+ break;
137
+ case 'End':
138
+ e.preventDefault();
139
+ targetIndex = triggers.length - 1;
140
+ break;
141
+ case 'Enter':
142
+ case ' ':
143
+ e.preventDefault();
144
+ toggle(trigger);
145
+ return;
146
+ default:
147
+ return;
148
+ }
149
+ if (targetIndex !== index) {
150
+ triggers[targetIndex].focus();
151
+ }
152
+ });
153
+ });
154
+
155
+ const slotContent = accordion.querySelector('.accordion__slot-content');
156
+ if (slotContent) {
157
+ const slotChildren = Array.from(slotContent.children);
158
+ slotChildren.forEach((child, index) => {
159
+ const slotPlaceholder = accordion.querySelector('[data-accordion-slot-index="' + index + '"]');
160
+ if (slotPlaceholder) {
161
+ slotPlaceholder.appendChild(child);
162
+ }
163
+ });
164
+ slotContent.remove();
165
+ }
166
+ }
167
+
168
+ function init() {
169
+ document.querySelectorAll('[data-accordion]').forEach(initOne);
170
+ }
171
+
172
+ if (document.readyState === 'loading') {
173
+ document.addEventListener('DOMContentLoaded', init);
174
+ } else {
175
+ init();
176
+ }
177
+ })();
178
+ </script>