rizzo-css 0.0.11 → 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 (233) 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 +98 -42
  5. package/dist/rizzo.min.css +3 -2
  6. package/package.json +5 -3
  7. package/scaffold/astro-app/README.md +13 -2
  8. package/scaffold/astro-app/src/components/Accordion.astro +178 -0
  9. package/scaffold/astro-app/src/components/Alert.astro +131 -0
  10. package/scaffold/astro-app/src/components/Avatar.astro +59 -0
  11. package/scaffold/astro-app/src/components/Badge.astro +24 -0
  12. package/scaffold/astro-app/src/components/Breadcrumb.astro +61 -0
  13. package/scaffold/astro-app/src/components/Button.astro +3 -0
  14. package/scaffold/astro-app/src/components/Card.astro +18 -0
  15. package/scaffold/astro-app/src/components/Checkbox.astro +38 -0
  16. package/scaffold/astro-app/src/components/CodeBlock.astro +393 -0
  17. package/scaffold/astro-app/src/components/CopyToClipboard.astro +219 -0
  18. package/scaffold/astro-app/src/components/Divider.astro +37 -0
  19. package/scaffold/astro-app/src/components/Dropdown.astro +807 -0
  20. package/scaffold/astro-app/src/components/FormGroup.astro +59 -0
  21. package/scaffold/astro-app/src/components/FrameworkSwitcher.astro +72 -0
  22. package/scaffold/astro-app/src/components/Input.astro +59 -0
  23. package/scaffold/astro-app/src/components/Modal.astro +212 -0
  24. package/scaffold/astro-app/src/components/Navbar.astro +701 -0
  25. package/scaffold/astro-app/src/components/Pagination.astro +240 -0
  26. package/scaffold/astro-app/src/components/ProgressBar.astro +65 -0
  27. package/scaffold/astro-app/src/components/Radio.astro +38 -0
  28. package/scaffold/astro-app/src/components/Search.astro +1259 -0
  29. package/scaffold/astro-app/src/components/Select.astro +49 -0
  30. package/scaffold/astro-app/src/components/Settings.astro +382 -0
  31. package/scaffold/astro-app/src/components/Spinner.astro +30 -0
  32. package/scaffold/astro-app/src/components/Table.astro +181 -0
  33. package/scaffold/astro-app/src/components/Tabs.astro +223 -0
  34. package/scaffold/astro-app/src/components/Textarea.astro +58 -0
  35. package/scaffold/astro-app/src/components/ThemeSwitcher.astro +504 -0
  36. package/scaffold/astro-app/src/components/Toast.astro +30 -0
  37. package/scaffold/astro-app/src/components/Tooltip.astro +32 -0
  38. package/scaffold/astro-app/src/components/icons/Brush.astro +10 -0
  39. package/scaffold/astro-app/src/components/icons/Cake.astro +11 -0
  40. package/scaffold/astro-app/src/components/icons/Check.astro +29 -0
  41. package/scaffold/astro-app/src/components/icons/Cherry.astro +11 -0
  42. package/scaffold/astro-app/src/components/icons/ChevronDown.astro +29 -0
  43. package/scaffold/astro-app/src/components/icons/Circle.astro +29 -0
  44. package/scaffold/astro-app/src/components/icons/Close.astro +30 -0
  45. package/scaffold/astro-app/src/components/icons/Cmd.astro +26 -0
  46. package/scaffold/astro-app/src/components/icons/Copy.astro +30 -0
  47. package/scaffold/astro-app/src/components/icons/Eye.astro +30 -0
  48. package/scaffold/astro-app/src/components/icons/Filter.astro +29 -0
  49. package/scaffold/astro-app/src/components/icons/Flame.astro +28 -0
  50. package/scaffold/astro-app/src/components/icons/Flower.astro +11 -0
  51. package/scaffold/astro-app/src/components/icons/Gear.astro +30 -0
  52. package/scaffold/astro-app/src/components/icons/Heart.astro +28 -0
  53. package/scaffold/astro-app/src/components/icons/IceCream.astro +31 -0
  54. package/scaffold/astro-app/src/components/icons/Leaf.astro +29 -0
  55. package/scaffold/astro-app/src/components/icons/Lemon.astro +11 -0
  56. package/scaffold/astro-app/src/components/icons/Moon.astro +29 -0
  57. package/scaffold/astro-app/src/components/icons/Owl.astro +34 -0
  58. package/scaffold/astro-app/src/components/icons/Palette.astro +33 -0
  59. package/scaffold/astro-app/src/components/icons/Rainbow.astro +31 -0
  60. package/scaffold/astro-app/src/components/icons/Search.astro +30 -0
  61. package/scaffold/astro-app/src/components/icons/Shield.astro +28 -0
  62. package/scaffold/astro-app/src/components/icons/Snowflake.astro +34 -0
  63. package/scaffold/astro-app/src/components/icons/Sort.astro +30 -0
  64. package/scaffold/astro-app/src/components/icons/Sun.astro +29 -0
  65. package/scaffold/astro-app/src/components/icons/Sunset.astro +10 -0
  66. package/scaffold/astro-app/src/components/icons/Zap.astro +9 -0
  67. package/scaffold/astro-app/src/components/icons/devicons/Astro.astro +53 -0
  68. package/scaffold/astro-app/src/components/icons/devicons/Bash.astro +34 -0
  69. package/scaffold/astro-app/src/components/icons/devicons/Css3.astro +29 -0
  70. package/scaffold/astro-app/src/components/icons/devicons/Git.astro +24 -0
  71. package/scaffold/astro-app/src/components/icons/devicons/Html5.astro +27 -0
  72. package/scaffold/astro-app/src/components/icons/devicons/Javascript.astro +25 -0
  73. package/scaffold/astro-app/src/components/icons/devicons/Nodejs.astro +47 -0
  74. package/scaffold/astro-app/src/components/icons/devicons/Plaintext.astro +33 -0
  75. package/scaffold/astro-app/src/components/icons/devicons/React.astro +27 -0
  76. package/scaffold/astro-app/src/components/icons/devicons/Svelte.astro +25 -0
  77. package/scaffold/astro-app/src/components/icons/devicons/Vue.astro +26 -0
  78. package/scaffold/astro-app/src/config/frameworks.ts +26 -0
  79. package/scaffold/astro-app/src/config/themes.ts +54 -0
  80. package/scaffold/astro-app/src/layouts/DocsLayout.astro +204 -0
  81. package/scaffold/astro-app/src/layouts/Layout.astro +11 -2
  82. package/scaffold/astro-app/src/pages/components/accordion.astro +172 -0
  83. package/scaffold/astro-app/src/pages/components/alert.astro +250 -0
  84. package/scaffold/astro-app/src/pages/components/avatar.astro +102 -0
  85. package/scaffold/astro-app/src/pages/components/badge.astro +119 -0
  86. package/scaffold/astro-app/src/pages/components/breadcrumb.astro +124 -0
  87. package/scaffold/astro-app/src/pages/components/button.astro +74 -0
  88. package/scaffold/astro-app/src/pages/components/cards.astro +247 -0
  89. package/scaffold/astro-app/src/pages/components/copy-to-clipboard.astro +49 -0
  90. package/scaffold/astro-app/src/pages/components/divider.astro +74 -0
  91. package/scaffold/astro-app/src/pages/components/dropdown.astro +394 -0
  92. package/scaffold/astro-app/src/pages/components/forms.astro +367 -0
  93. package/scaffold/astro-app/src/pages/components/icons.astro +246 -0
  94. package/scaffold/astro-app/src/pages/components/modal.astro +152 -0
  95. package/scaffold/astro-app/src/pages/components/navbar.astro +80 -0
  96. package/scaffold/astro-app/src/pages/components/pagination.astro +126 -0
  97. package/scaffold/astro-app/src/pages/components/progress-bar.astro +94 -0
  98. package/scaffold/astro-app/src/pages/components/search.astro +155 -0
  99. package/scaffold/astro-app/src/pages/components/settings.astro +78 -0
  100. package/scaffold/astro-app/src/pages/components/spinner.astro +81 -0
  101. package/scaffold/astro-app/src/pages/components/table.astro +144 -0
  102. package/scaffold/astro-app/src/pages/components/tabs.astro +220 -0
  103. package/scaffold/astro-app/src/pages/components/theme-switcher.astro +67 -0
  104. package/scaffold/astro-app/src/pages/components/toast.astro +157 -0
  105. package/scaffold/astro-app/src/pages/components/tooltip.astro +209 -0
  106. package/scaffold/astro-app/src/pages/components.astro +290 -0
  107. package/scaffold/astro-app/src/pages/docs/accessibility.astro +9 -0
  108. package/scaffold/astro-app/src/pages/docs/colors.astro +9 -0
  109. package/scaffold/astro-app/src/pages/docs/design-system.astro +9 -0
  110. package/scaffold/astro-app/src/pages/docs/getting-started.astro +9 -0
  111. package/scaffold/astro-app/src/pages/docs/index.astro +15 -0
  112. package/scaffold/astro-app/src/pages/docs/themes/[theme].astro +14 -0
  113. package/scaffold/astro-app/src/pages/docs/theming.astro +10 -0
  114. package/scaffold/astro-app/src/pages/index.astro +5 -11
  115. package/scaffold/svelte/Table.svelte +6 -5
  116. package/scaffold/svelte/Tabs.svelte +3 -1
  117. package/scaffold/svelte-app/README.md +9 -2
  118. package/scaffold/svelte-app/src/app.html +1 -1
  119. package/scaffold/svelte-app/src/lib/rizzo/Accordion.svelte +128 -0
  120. package/scaffold/svelte-app/src/lib/rizzo/Alert.svelte +85 -0
  121. package/scaffold/svelte-app/src/lib/rizzo/Avatar.svelte +39 -0
  122. package/scaffold/svelte-app/src/lib/rizzo/Badge.svelte +31 -0
  123. package/scaffold/svelte-app/src/lib/rizzo/Breadcrumb.svelte +49 -0
  124. package/scaffold/svelte-app/src/lib/rizzo/Button.svelte +27 -0
  125. package/scaffold/svelte-app/src/lib/rizzo/Card.svelte +17 -0
  126. package/scaffold/svelte-app/src/lib/rizzo/Checkbox.svelte +37 -0
  127. package/scaffold/svelte-app/src/lib/rizzo/CopyToClipboard.svelte +79 -0
  128. package/scaffold/svelte-app/src/lib/rizzo/Divider.svelte +28 -0
  129. package/scaffold/svelte-app/src/lib/rizzo/Dropdown.svelte +254 -0
  130. package/scaffold/svelte-app/src/lib/rizzo/FormGroup.svelte +51 -0
  131. package/scaffold/svelte-app/src/lib/rizzo/Input.svelte +59 -0
  132. package/scaffold/svelte-app/src/lib/rizzo/Modal.svelte +157 -0
  133. package/scaffold/svelte-app/src/lib/rizzo/Pagination.svelte +93 -0
  134. package/scaffold/svelte-app/src/lib/rizzo/ProgressBar.svelte +58 -0
  135. package/scaffold/svelte-app/src/lib/rizzo/Radio.svelte +38 -0
  136. package/scaffold/svelte-app/src/lib/rizzo/Select.svelte +51 -0
  137. package/scaffold/svelte-app/src/lib/rizzo/Spinner.svelte +14 -0
  138. package/scaffold/svelte-app/src/lib/rizzo/Table.svelte +158 -0
  139. package/scaffold/svelte-app/src/lib/rizzo/Tabs.svelte +117 -0
  140. package/scaffold/svelte-app/src/lib/rizzo/Textarea.svelte +59 -0
  141. package/scaffold/svelte-app/src/lib/rizzo/ThemeSwitcher.svelte +315 -0
  142. package/scaffold/svelte-app/src/lib/rizzo/Toast.svelte +33 -0
  143. package/scaffold/svelte-app/src/lib/rizzo/Tooltip.svelte +19 -0
  144. package/scaffold/svelte-app/src/lib/rizzo/icons/Check.svelte +29 -0
  145. package/scaffold/svelte-app/src/lib/rizzo/icons/ChevronDown.svelte +29 -0
  146. package/scaffold/svelte-app/src/lib/rizzo/icons/Circle.svelte +29 -0
  147. package/scaffold/svelte-app/src/lib/rizzo/icons/Close.svelte +30 -0
  148. package/scaffold/svelte-app/src/lib/rizzo/icons/Cmd.svelte +27 -0
  149. package/scaffold/svelte-app/src/lib/rizzo/icons/Copy.svelte +30 -0
  150. package/scaffold/svelte-app/src/lib/rizzo/icons/Eye.svelte +30 -0
  151. package/scaffold/svelte-app/src/lib/rizzo/icons/Filter.svelte +29 -0
  152. package/scaffold/svelte-app/src/lib/rizzo/icons/Gear.svelte +30 -0
  153. package/scaffold/svelte-app/src/lib/rizzo/icons/IceCream.svelte +31 -0
  154. package/scaffold/svelte-app/src/lib/rizzo/icons/Moon.svelte +29 -0
  155. package/scaffold/svelte-app/src/lib/rizzo/icons/Owl.svelte +34 -0
  156. package/scaffold/svelte-app/src/lib/rizzo/icons/Palette.svelte +33 -0
  157. package/scaffold/svelte-app/src/lib/rizzo/icons/Rainbow.svelte +31 -0
  158. package/scaffold/svelte-app/src/lib/rizzo/icons/Search.svelte +30 -0
  159. package/scaffold/svelte-app/src/lib/rizzo/icons/Snowflake.svelte +34 -0
  160. package/scaffold/svelte-app/src/lib/rizzo/icons/Sort.svelte +30 -0
  161. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Astro.svelte +45 -0
  162. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Bash.svelte +28 -0
  163. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Css3.svelte +23 -0
  164. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Git.svelte +18 -0
  165. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Html5.svelte +21 -0
  166. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Javascript.svelte +19 -0
  167. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Nodejs.svelte +44 -0
  168. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Plaintext.svelte +24 -0
  169. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/React.svelte +21 -0
  170. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/SvelteIcon.svelte +19 -0
  171. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Vue.svelte +20 -0
  172. package/scaffold/svelte-app/src/lib/rizzo/index.ts +33 -0
  173. package/scaffold/svelte-app/src/lib/rizzo-docs/CodeBlock.svelte +239 -0
  174. package/scaffold/svelte-app/src/lib/rizzo-docs/SvelteDocPage.svelte +99 -0
  175. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AccordionDoc.svelte +53 -0
  176. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AlertDoc.svelte +114 -0
  177. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AvatarDoc.svelte +92 -0
  178. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/BadgeDoc.svelte +60 -0
  179. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/BreadcrumbDoc.svelte +55 -0
  180. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ButtonDoc.svelte +55 -0
  181. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/CardsDoc.svelte +173 -0
  182. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ComingSoon.svelte +12 -0
  183. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ComponentsOverview.svelte +92 -0
  184. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/CopyToClipboardDoc.svelte +26 -0
  185. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/DividerDoc.svelte +105 -0
  186. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/DropdownDoc.svelte +161 -0
  187. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/FormsDoc.svelte +375 -0
  188. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/IconsDoc.svelte +246 -0
  189. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/Index.svelte +8 -0
  190. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ModalDoc.svelte +50 -0
  191. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/NavbarDoc.svelte +79 -0
  192. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/PaginationDoc.svelte +44 -0
  193. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ProgressBarDoc.svelte +95 -0
  194. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SearchDoc.svelte +147 -0
  195. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SettingsDoc.svelte +158 -0
  196. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SpinnerDoc.svelte +41 -0
  197. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TableDoc.svelte +116 -0
  198. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TabsDoc.svelte +152 -0
  199. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ThemeSwitcherDoc.svelte +181 -0
  200. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/Theming.svelte +6 -0
  201. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ToastDoc.svelte +136 -0
  202. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TooltipDoc.svelte +57 -0
  203. package/scaffold/svelte-app/src/routes/+page.svelte +2 -2
  204. package/scaffold/svelte-app/src/routes/components/+page.svelte +4 -0
  205. package/scaffold/svelte-app/src/routes/components/[slug]/+page.svelte +7 -0
  206. package/scaffold/vanilla/README.md +20 -8
  207. package/scaffold/vanilla/components/accordion.html +187 -0
  208. package/scaffold/vanilla/components/alert.html +187 -0
  209. package/scaffold/vanilla/components/avatar.html +187 -0
  210. package/scaffold/vanilla/components/badge.html +187 -0
  211. package/scaffold/vanilla/components/breadcrumb.html +187 -0
  212. package/scaffold/vanilla/components/button.html +187 -0
  213. package/scaffold/vanilla/components/cards.html +187 -0
  214. package/scaffold/vanilla/components/copy-to-clipboard.html +187 -0
  215. package/scaffold/vanilla/components/divider.html +187 -0
  216. package/scaffold/vanilla/components/dropdown.html +187 -0
  217. package/scaffold/vanilla/components/forms.html +187 -0
  218. package/scaffold/vanilla/components/icons.html +187 -0
  219. package/scaffold/vanilla/components/index.html +212 -0
  220. package/scaffold/vanilla/components/modal.html +187 -0
  221. package/scaffold/vanilla/components/navbar.html +187 -0
  222. package/scaffold/vanilla/components/pagination.html +187 -0
  223. package/scaffold/vanilla/components/progress-bar.html +187 -0
  224. package/scaffold/vanilla/components/search.html +187 -0
  225. package/scaffold/vanilla/components/settings.html +187 -0
  226. package/scaffold/vanilla/components/spinner.html +187 -0
  227. package/scaffold/vanilla/components/table.html +187 -0
  228. package/scaffold/vanilla/components/tabs.html +187 -0
  229. package/scaffold/vanilla/components/theme-switcher.html +187 -0
  230. package/scaffold/vanilla/components/toast.html +187 -0
  231. package/scaffold/vanilla/components/tooltip.html +187 -0
  232. package/scaffold/vanilla/index.html +17 -283
  233. package/scaffold/vanilla/js/main.js +748 -0
@@ -81,13 +81,13 @@
81
81
  }
82
82
  </script>
83
83
 
84
- <div class={classes} data-table-id={tableId}>
84
+ <div class={classes} data-table-id={tableId} data-table-sortable={sortable ? 'true' : undefined} data-table-filterable={filterable ? 'true' : undefined}>
85
85
  {#if filterable}
86
86
  <div class="table__filter-wrap">
87
87
  <label for="{tableId}-filter" class="sr-only">Filter table</label>
88
88
  <span class="table__filter-icon" aria-hidden="true">
89
- <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="table__filter-icon-svg" aria-hidden="true">
90
- <path d="M4 6h16M4 12h10M4 18h6" />
89
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="table__filter-icon-svg icon" aria-hidden="true">
90
+ <path d="M22 3H2l8 9.46V19l4 2v-8.54L22 3z" />
91
91
  </svg>
92
92
  </span>
93
93
  <input
@@ -129,8 +129,9 @@
129
129
  >
130
130
  <span class="table__cell-content">{col.label}</span>
131
131
  <span class="table__sort-icon" aria-hidden="true">
132
- <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="table__sort-icon-svg" aria-hidden="true">
133
- <path d="M3 6h18M7 12h10M10 18h4" />
132
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="table__sort-icon-svg icon" aria-hidden="true">
133
+ <path d="m7 15 5 5 5-5" />
134
+ <path d="m7 9 5-5 5 5" />
134
135
  </svg>
135
136
  </span>
136
137
  </button>
@@ -85,6 +85,7 @@
85
85
  aria-selected={isActive ? 'true' : 'false'}
86
86
  aria-controls="{tabsId}-panel-{tab.id}"
87
87
  data-tab-id={tab.id}
88
+ data-tab-index={index}
88
89
  onclick={() => activateTab(index)}
89
90
  onkeydown={(e) => handleKeydown(e, index)}
90
91
  >
@@ -94,7 +95,7 @@
94
95
  </div>
95
96
 
96
97
  <div class="tabs__panels-wrapper">
97
- {#each tabs as tab}
98
+ {#each tabs as tab, index}
98
99
  {@const isActive = tab.id === activeTabId}
99
100
  <div
100
101
  class="tabs__panel {isActive ? 'tabs__panel--active' : ''}"
@@ -103,6 +104,7 @@
103
104
  aria-labelledby="{tabsId}-tab-{tab.id}"
104
105
  aria-hidden={isActive ? 'false' : 'true'}
105
106
  data-panel-id={tab.id}
107
+ data-panel-index={index}
106
108
  >
107
109
  {#if tab.content}
108
110
  <div class="tabs__panel-content">{@html tab.content}</div>
@@ -1,6 +1,6 @@
1
1
  # SvelteKit + Rizzo CSS
2
2
 
3
- This project was scaffolded with `npx rizzo-css init` (Svelte).
3
+ This project was scaffolded with `npx rizzo-css init` when you chose **Create new project** and Svelte. This full clone (home, component showcase at `/components`) 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
 
@@ -19,6 +19,13 @@ pnpm dev
19
19
 
20
20
  The theme selected during `rizzo-css init` is set in `src/app.html` (`data-theme`) and is used on first load when you have no saved preference in the browser.
21
21
 
22
+ ## Editing the cloned site
23
+
24
+ - **Home** — `src/routes/+page.svelte` (hero, link to `/components`). Edit or replace with your own content.
25
+ - **Component showcase** — `src/routes/components/+page.svelte` (overview) and `src/routes/components/[slug]/+page.svelte` (each component doc). Doc content lives in `src/lib/rizzo-docs/` (SvelteDocPage, CodeBlock, pages/*). Rizzo components are in `src/lib/rizzo/`. Change routes or copy from the docs as needed.
26
+ - **Layout** — `src/routes/+layout.svelte` wraps all pages. Add a shared nav or footer here.
27
+ - **CSS** — Loaded via `src/app.html` (`/css/rizzo.min.css` from `static/css/`).
28
+
22
29
  ## Commands
23
30
 
24
31
  - `pnpm dev` — Start dev server
@@ -27,6 +34,6 @@ The theme selected during `rizzo-css init` is set in `src/app.html` (`data-theme
27
34
 
28
35
  ## Other scaffolds
29
36
 
30
- From the same **rizzo-css** package: **Vanilla** (`scaffold/vanilla/`) — single HTML file with Settings and toast; **Astro** (`scaffold/astro-app/`) — minimal Astro app. Use `npx rizzo-css init` and pick a different framework to create one of them.
37
+ From the same **rizzo-css** package: **Vanilla** (`scaffold/vanilla/`) — index + component showcase (components/index.html, components/<slug>.html) with Settings and toast; **Astro** (`scaffold/astro-app/`) — Astro app with navbar and component showcase. Use `npx rizzo-css init` and pick a different framework to create one of them.
31
38
 
32
39
  Docs: [rizzo-css.vercel.app](https://rizzo-css.vercel.app)
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
6
  <!-- Theme flash prevention + accessibility (same as main site) -->
7
7
  <script>
8
- (function(){try{var s=localStorage.getItem('theme');var d='github-dark-classic';var l='github-light';var initial=document.documentElement.getAttribute('data-theme');var r=!s?(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);var f=localStorage.getItem('fontSizeScale');if(f)document.documentElement.style.setProperty('--font-size-scale',f);if(localStorage.getItem('reducedMotion')==='true')document.documentElement.classList.add('reduced-motion');if(localStorage.getItem('highContrast')==='true')document.documentElement.classList.add('high-contrast');var b=localStorage.getItem('scrollbarStyle')||'thin';if(b==='thick')document.documentElement.classList.add('scrollbar-thick');else if(b==='hidden')document.documentElement.classList.add('scrollbar-hidden','hide-scrollbars');}catch(e){}})();
8
+ (function(){try{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);var f=localStorage.getItem('fontSizeScale');if(f)document.documentElement.style.setProperty('--font-size-scale',f);if(localStorage.getItem('reducedMotion')==='true')document.documentElement.classList.add('reduced-motion');if(localStorage.getItem('highContrast')==='true')document.documentElement.classList.add('high-contrast');var b=localStorage.getItem('scrollbarStyle')||'thin';if(b==='thick')document.documentElement.classList.add('scrollbar-thick');else if(b==='hidden')document.documentElement.classList.add('scrollbar-hidden','hide-scrollbars');}catch(e){}})();
9
9
  </script>
10
10
  <!-- Toast: showToast, removeToast, removeAllToasts -->
11
11
  <script>
@@ -0,0 +1,128 @@
1
+ <script lang="ts">
2
+ export interface AccordionItem {
3
+ id: string;
4
+ title: string;
5
+ content?: string;
6
+ }
7
+
8
+ interface Props {
9
+ items: AccordionItem[];
10
+ id?: string;
11
+ allowMultiple?: boolean;
12
+ defaultExpanded?: string | string[];
13
+ class?: string;
14
+ }
15
+
16
+ let {
17
+ items,
18
+ id,
19
+ allowMultiple = false,
20
+ defaultExpanded,
21
+ class: className = '',
22
+ }: Props = $props();
23
+
24
+ const accordionId = $derived(id ?? `accordion-${Math.random().toString(36).slice(2, 11)}`);
25
+
26
+ function getDefaultExpanded(): Set<string> {
27
+ if (defaultExpanded === undefined) return new Set(items[0] ? [items[0].id] : []);
28
+ if (typeof defaultExpanded === 'string') return new Set([defaultExpanded]);
29
+ return new Set(defaultExpanded);
30
+ }
31
+
32
+ let expanded = $state<Set<string>>(getDefaultExpanded());
33
+
34
+ const classes = $derived(['accordion', className].filter(Boolean).join(' ').trim());
35
+
36
+ function toggle(itemId: string) {
37
+ expanded = new Set(
38
+ allowMultiple
39
+ ? (expanded.has(itemId) ? [...expanded].filter((id) => id !== itemId) : [...expanded, itemId])
40
+ : expanded.has(itemId)
41
+ ? []
42
+ : [itemId]
43
+ );
44
+ }
45
+
46
+ function handleKeydown(e: KeyboardEvent, itemId: string, index: number) {
47
+ const triggers = e.currentTarget?.parentElement?.querySelectorAll?.('[data-accordion-trigger]') ?? [];
48
+ const len = triggers.length;
49
+ let targetIndex = index;
50
+ switch (e.key) {
51
+ case 'ArrowDown':
52
+ e.preventDefault();
53
+ targetIndex = Math.min(index + 1, len - 1);
54
+ break;
55
+ case 'ArrowUp':
56
+ e.preventDefault();
57
+ targetIndex = Math.max(index - 1, 0);
58
+ break;
59
+ case 'Home':
60
+ e.preventDefault();
61
+ targetIndex = 0;
62
+ break;
63
+ case 'End':
64
+ e.preventDefault();
65
+ targetIndex = len - 1;
66
+ break;
67
+ case 'Enter':
68
+ case ' ':
69
+ e.preventDefault();
70
+ toggle(itemId);
71
+ return;
72
+ default:
73
+ return;
74
+ }
75
+ if (targetIndex !== index && triggers[targetIndex]) (triggers[targetIndex] as HTMLElement).focus();
76
+ }
77
+ </script>
78
+
79
+ <div
80
+ class={classes}
81
+ data-accordion={accordionId}
82
+ data-allow-multiple={allowMultiple ? 'true' : 'false'}
83
+ >
84
+ {#each items as item, i}
85
+ {@const triggerId = `${accordionId}-trigger-${item.id}`}
86
+ {@const panelId = `${accordionId}-panel-${item.id}`}
87
+ {@const isExpanded = expanded.has(item.id)}
88
+ <div class="accordion__item" data-accordion-item data-item-id={item.id}>
89
+ <h3 class="accordion__heading">
90
+ <button
91
+ type="button"
92
+ class="accordion__trigger"
93
+ class:accordion__trigger--expanded={isExpanded}
94
+ id={triggerId}
95
+ aria-expanded={isExpanded}
96
+ aria-controls={panelId}
97
+ data-accordion-trigger
98
+ onclick={() => toggle(item.id)}
99
+ onkeydown={(e) => handleKeydown(e, item.id, i)}
100
+ >
101
+ <span class="accordion__title">{item.title}</span>
102
+ <span class="accordion__icon" aria-hidden="true">
103
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
104
+ <path d="m6 9 6 6 6-6" />
105
+ </svg>
106
+ </span>
107
+ </button>
108
+ </h3>
109
+ <div
110
+ class="accordion__panel"
111
+ class:accordion__panel--expanded={isExpanded}
112
+ id={panelId}
113
+ role="region"
114
+ aria-labelledby={triggerId}
115
+ hidden={!isExpanded}
116
+ data-accordion-panel
117
+ >
118
+ <div class="accordion__panel-inner">
119
+ <div class="accordion__panel-content">
120
+ {#if item.content}
121
+ {@html item.content}
122
+ {/if}
123
+ </div>
124
+ </div>
125
+ </div>
126
+ </div>
127
+ {/each}
128
+ </div>
@@ -0,0 +1,85 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ interface Props {
6
+ variant?: 'success' | 'error' | 'warning' | 'info';
7
+ dismissible?: boolean;
8
+ autoDismiss?: number;
9
+ class?: string;
10
+ id?: string;
11
+ onDismiss?: () => void;
12
+ children?: Snippet;
13
+ }
14
+ let {
15
+ variant = 'info',
16
+ dismissible = false,
17
+ autoDismiss = 0,
18
+ class: className = '',
19
+ id,
20
+ onDismiss,
21
+ children,
22
+ }: Props = $props();
23
+
24
+ let visible = $state(true);
25
+ const alertId = $derived(id ?? `alert-${Math.random().toString(36).slice(2, 11)}`);
26
+ const classes = $derived(['alert', `alert--${variant}`, className].filter(Boolean).join(' ').trim());
27
+
28
+ const ariaLabels: Record<string, string> = {
29
+ success: 'Success message',
30
+ error: 'Error message',
31
+ warning: 'Warning message',
32
+ info: 'Information message',
33
+ };
34
+
35
+ let autoDismissTimeout: ReturnType<typeof setTimeout> | null = null;
36
+
37
+ function dismiss() {
38
+ visible = false;
39
+ if (autoDismissTimeout) clearTimeout(autoDismissTimeout);
40
+ onDismiss?.();
41
+ }
42
+
43
+ onMount(() => {
44
+ if (autoDismiss > 0) {
45
+ autoDismissTimeout = setTimeout(dismiss, autoDismiss);
46
+ }
47
+ return () => {
48
+ if (autoDismissTimeout) clearTimeout(autoDismissTimeout);
49
+ };
50
+ });
51
+ </script>
52
+
53
+ {#if visible}
54
+ <div
55
+ class={classes}
56
+ id={alertId}
57
+ role="alert"
58
+ aria-live="polite"
59
+ aria-atomic="true"
60
+ aria-label={ariaLabels[variant]}
61
+ >
62
+ <div class="alert__content">
63
+ {@render children?.()}
64
+ </div>
65
+ {#if dismissible}
66
+ <button
67
+ type="button"
68
+ class="alert__close"
69
+ aria-label="Dismiss alert"
70
+ aria-controls={alertId}
71
+ onclick={dismiss}
72
+ onkeydown={(e) => {
73
+ if (e.key === 'Enter' || e.key === ' ') {
74
+ e.preventDefault();
75
+ dismiss();
76
+ }
77
+ }}
78
+ >
79
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
80
+ <path d="M18 6L6 18M6 6l12 12" />
81
+ </svg>
82
+ </button>
83
+ {/if}
84
+ </div>
85
+ {/if}
@@ -0,0 +1,39 @@
1
+ <script lang="ts">
2
+ function getInitials(name: string): string {
3
+ const parts = name.trim().split(/\s+/).filter(Boolean);
4
+ if (parts.length === 0) return '';
5
+ if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();
6
+ return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
7
+ }
8
+
9
+ interface Props {
10
+ src?: string;
11
+ alt?: string;
12
+ name?: string;
13
+ initials?: string;
14
+ size?: 'sm' | 'md' | 'lg';
15
+ shape?: 'circle' | 'square';
16
+ class?: string;
17
+ }
18
+ let {
19
+ src,
20
+ alt = '',
21
+ name = '',
22
+ initials: initialsProp = '',
23
+ size = 'md',
24
+ shape = 'circle',
25
+ class: className = '',
26
+ }: Props = $props();
27
+
28
+ const displayInitials = $derived(name ? getInitials(name) : initialsProp);
29
+ const classes = $derived(['avatar', `avatar--${size}`, `avatar--${shape}`, className].filter(Boolean).join(' ').trim());
30
+ const ariaLabel = $derived(alt || name || (displayInitials ? `Avatar: ${displayInitials}` : 'Avatar'));
31
+ </script>
32
+
33
+ <span class={classes} role="img" aria-label={ariaLabel}>
34
+ {#if src}
35
+ <img src={src} alt={alt || name || ''} class="avatar__img" loading="lazy" />
36
+ {:else}
37
+ <span class="avatar__initials" aria-hidden="true">{displayInitials || '?'}</span>
38
+ {/if}
39
+ </span>
@@ -0,0 +1,31 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ type Variant = 'primary' | 'success' | 'warning' | 'error' | 'info';
5
+ type Size = 'sm' | 'md' | 'lg';
6
+ interface Props {
7
+ variant?: Variant;
8
+ size?: Size;
9
+ pill?: boolean;
10
+ class?: string;
11
+ children?: Snippet;
12
+ }
13
+ let {
14
+ variant = 'primary',
15
+ size = 'md',
16
+ pill = false,
17
+ class: className = '',
18
+ children,
19
+ }: Props = $props();
20
+
21
+ const classes = $derived(
22
+ ['badge', `badge--${variant}`, `badge--${size}`, pill ? 'badge--pill' : '', className]
23
+ .filter(Boolean)
24
+ .join(' ')
25
+ .trim()
26
+ );
27
+ </script>
28
+
29
+ <span class={classes}>
30
+ {@render children?.()}
31
+ </span>
@@ -0,0 +1,49 @@
1
+ <script lang="ts">
2
+ export interface BreadcrumbItem {
3
+ label: string;
4
+ href?: string;
5
+ }
6
+
7
+ interface Props {
8
+ items: BreadcrumbItem[];
9
+ separator?: 'chevron' | 'slash' | 'arrow' | string;
10
+ class?: string;
11
+ }
12
+ let { items, separator = 'chevron', class: className = '' }: Props = $props();
13
+
14
+ const separatorVariant = $derived(
15
+ separator === 'slash' ? 'breadcrumb--slash' : separator === 'arrow' ? 'breadcrumb--arrow' : 'breadcrumb--chevron'
16
+ );
17
+ const classes = $derived(['breadcrumb', separatorVariant, className].filter(Boolean).join(' ').trim());
18
+ const separatorChar = $derived(
19
+ separator === 'slash' ? '/' : separator === 'arrow' ? '›' : typeof separator === 'string' ? separator : '›'
20
+ );
21
+ const useIcon = $derived(separator === 'chevron');
22
+ </script>
23
+
24
+ <nav class={classes} aria-label="Breadcrumb">
25
+ <ol class="breadcrumb__list">
26
+ {#each items as item, index}
27
+ {@const isLast = index === items.length - 1}
28
+ {@const isCurrent = isLast || !item.href}
29
+ <li class="breadcrumb__item {isCurrent ? 'breadcrumb__item--current' : ''}">
30
+ {#if isCurrent}
31
+ <span class="breadcrumb__current" aria-current="page">{item.label}</span>
32
+ {:else}
33
+ <a class="breadcrumb__link" href={item.href}>{item.label}</a>
34
+ {/if}
35
+ {#if !isLast}
36
+ <span class="breadcrumb__separator" aria-hidden="true">
37
+ {#if useIcon}
38
+ <svg class="breadcrumb__separator-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
39
+ <path d="M6 9l6 6 6-6" />
40
+ </svg>
41
+ {:else}
42
+ {separatorChar}
43
+ {/if}
44
+ </span>
45
+ {/if}
46
+ </li>
47
+ {/each}
48
+ </ol>
49
+ </nav>
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ type Variant = 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info' | 'outline';
5
+ interface Props {
6
+ variant?: Variant;
7
+ disabled?: boolean;
8
+ type?: 'button' | 'submit' | 'reset';
9
+ class?: string;
10
+ children?: Snippet;
11
+ }
12
+ let {
13
+ variant = 'default',
14
+ disabled = false,
15
+ type = 'button',
16
+ class: className = '',
17
+ children,
18
+ ...rest
19
+ }: Props = $props();
20
+
21
+ const variantClass = $derived(variant === 'default' ? '' : `btn-${variant}`);
22
+ const classes = $derived(['btn', variantClass, className].filter(Boolean).join(' '));
23
+ </script>
24
+
25
+ <button {type} {disabled} class={classes} {...rest}>
26
+ {@render children?.()}
27
+ </button>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ type Variant = 'default' | 'elevated' | 'outlined' | 'filled';
5
+ interface Props {
6
+ variant?: Variant;
7
+ class?: string;
8
+ children?: Snippet;
9
+ }
10
+ let { variant = 'default', class: className = '', children }: Props = $props();
11
+ const variantClass = $derived(variant !== 'default' ? `card--${variant}` : '');
12
+ const classes = $derived(['card', variantClass, className].filter(Boolean).join(' ').trim());
13
+ </script>
14
+
15
+ <div class={classes}>
16
+ {@render children?.()}
17
+ </div>
@@ -0,0 +1,37 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ id?: string;
4
+ name?: string;
5
+ value?: string;
6
+ checked?: boolean;
7
+ required?: boolean;
8
+ disabled?: boolean;
9
+ class?: string;
10
+ ariaDescribedby?: string;
11
+ ariaLabel?: string;
12
+ }
13
+ let {
14
+ id,
15
+ name,
16
+ value,
17
+ checked = $bindable(false),
18
+ required = false,
19
+ disabled = false,
20
+ class: className = '',
21
+ ariaDescribedby,
22
+ ariaLabel,
23
+ }: Props = $props();
24
+ </script>
25
+
26
+ <input
27
+ type="checkbox"
28
+ {id}
29
+ {name}
30
+ {value}
31
+ bind:checked
32
+ {required}
33
+ {disabled}
34
+ class={className}
35
+ aria-describedby={ariaDescribedby}
36
+ aria-label={ariaLabel}
37
+ />
@@ -0,0 +1,79 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ value: string;
4
+ label?: string;
5
+ format?: string;
6
+ class?: string;
7
+ id?: string;
8
+ }
9
+ let { value, label, format, class: className = '', id }: Props = $props();
10
+
11
+ let copied = $state(false);
12
+ let feedbackText = $state('');
13
+ const fallbackId = `copy-btn-${Math.random().toString(36).slice(2, 11)}`;
14
+ const buttonId = $derived(id ?? fallbackId);
15
+ const classes = $derived(['copy-to-clipboard', className].filter(Boolean).join(' ').trim());
16
+
17
+ async function copy() {
18
+ if (!value) return;
19
+ try {
20
+ await navigator.clipboard.writeText(value);
21
+ copied = true;
22
+ feedbackText = format ? `Copied ${format}!` : 'Copied!';
23
+ setTimeout(() => {
24
+ copied = false;
25
+ feedbackText = '';
26
+ }, 2000);
27
+ } catch {
28
+ const textArea = document.createElement('textarea');
29
+ textArea.value = value;
30
+ textArea.style.position = 'fixed';
31
+ textArea.style.left = '-999999px';
32
+ document.body.appendChild(textArea);
33
+ textArea.focus();
34
+ textArea.select();
35
+ try {
36
+ document.execCommand('copy');
37
+ copied = true;
38
+ feedbackText = format ? `Copied ${format}!` : 'Copied!';
39
+ setTimeout(() => {
40
+ copied = false;
41
+ feedbackText = '';
42
+ }, 2000);
43
+ } catch {
44
+ feedbackText = 'Failed to copy';
45
+ }
46
+ document.body.removeChild(textArea);
47
+ }
48
+ }
49
+ </script>
50
+
51
+ <span class="tooltip-host" data-tooltip={copied ? (format ? `Copied ${format}!` : 'Copied!') : (label ?? 'Copy to clipboard')}>
52
+ <button
53
+ type="button"
54
+ class={classes}
55
+ aria-label={copied ? (format ? `Copied ${format}!` : 'Copied!') : (label ?? `Copy ${value} to clipboard`)}
56
+ id={buttonId}
57
+ onclick={copy}
58
+ onkeydown={(e) => {
59
+ if (e.key === 'Enter' || e.key === ' ') {
60
+ e.preventDefault();
61
+ copy();
62
+ }
63
+ }}
64
+ >
65
+ <span class="copy-to-clipboard__text">{value}</span>
66
+ <span class="copy-to-clipboard__icon copy-to-clipboard__icon--copy" class:copy-to-clipboard__icon--hidden={copied} aria-hidden="true">
67
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
68
+ <rect x="9" y="9" width="13" height="13" rx="2" ry="2" />
69
+ <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" />
70
+ </svg>
71
+ </span>
72
+ <span class="copy-to-clipboard__icon copy-to-clipboard__icon--check" class:copy-to-clipboard__icon--hidden={!copied} aria-hidden="true">
73
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
74
+ <polyline points="20 6 9 17 4 12" />
75
+ </svg>
76
+ </span>
77
+ <span class="copy-to-clipboard__feedback" aria-live="polite">{feedbackText}</span>
78
+ </button>
79
+ </span>
@@ -0,0 +1,28 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ orientation?: 'horizontal' | 'vertical';
4
+ label?: string;
5
+ class?: string;
6
+ }
7
+ let { orientation = 'horizontal', label, class: className = '' }: Props = $props();
8
+ const orientationClass = $derived(`divider--${orientation}`);
9
+ const hasLabel = $derived(typeof label === 'string' && label.trim().length > 0);
10
+ const labelClass = $derived(hasLabel ? 'divider--labeled' : '');
11
+ const classes = $derived(['divider', orientationClass, labelClass, className].filter(Boolean).join(' ').trim());
12
+ const labelText = $derived(label?.trim() ?? '');
13
+ </script>
14
+
15
+ <div
16
+ class={classes}
17
+ role="separator"
18
+ aria-orientation={orientation}
19
+ aria-label={labelText || undefined}
20
+ >
21
+ {#if hasLabel && orientation === 'horizontal'}
22
+ <span class="divider__line" aria-hidden="true"></span>
23
+ <span class="divider__label">{labelText}</span>
24
+ <span class="divider__line" aria-hidden="true"></span>
25
+ {:else}
26
+ <span class="divider__line" aria-hidden="true"></span>
27
+ {/if}
28
+ </div>