rizzo-css 0.0.17 → 0.0.18

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 (260) hide show
  1. package/README.md +4 -4
  2. package/bin/rizzo-css.js +151 -103
  3. package/package.json +7 -3
  4. package/scaffold/astro-minimal/.env.example +3 -0
  5. package/scaffold/astro-minimal/README.md +36 -0
  6. package/scaffold/astro-minimal/package.json +13 -0
  7. package/scaffold/astro-minimal/src/layouts/Layout.astro +28 -0
  8. package/scaffold/astro-minimal/src/pages/index.astro +10 -0
  9. package/scaffold/svelte-minimal/.env.example +3 -0
  10. package/scaffold/svelte-minimal/README.md +37 -0
  11. package/scaffold/svelte-minimal/package.json +20 -0
  12. package/scaffold/svelte-minimal/src/app.d.ts +11 -0
  13. package/scaffold/svelte-minimal/src/app.html +15 -0
  14. package/scaffold/svelte-minimal/src/routes/+layout.svelte +1 -0
  15. package/scaffold/svelte-minimal/src/routes/+page.svelte +5 -0
  16. package/scaffold/svelte-minimal/svelte.config.js +10 -0
  17. package/scaffold/svelte-minimal/tsconfig.json +11 -0
  18. package/scaffold/vanilla/README.md +4 -4
  19. package/scaffold/vanilla/components/accordion.html +8 -0
  20. package/scaffold/vanilla/components/alert.html +8 -0
  21. package/scaffold/vanilla/components/avatar.html +8 -0
  22. package/scaffold/vanilla/components/badge.html +8 -0
  23. package/scaffold/vanilla/components/breadcrumb.html +8 -0
  24. package/scaffold/vanilla/components/button.html +8 -0
  25. package/scaffold/vanilla/components/cards.html +8 -0
  26. package/scaffold/vanilla/components/copy-to-clipboard.html +8 -0
  27. package/scaffold/vanilla/components/divider.html +8 -0
  28. package/scaffold/vanilla/components/dropdown.html +8 -0
  29. package/scaffold/vanilla/components/forms.html +8 -0
  30. package/scaffold/vanilla/components/icons.html +8 -0
  31. package/scaffold/vanilla/components/index.html +8 -0
  32. package/scaffold/vanilla/components/modal.html +8 -0
  33. package/scaffold/vanilla/components/navbar.html +8 -0
  34. package/scaffold/vanilla/components/pagination.html +8 -0
  35. package/scaffold/vanilla/components/progress-bar.html +8 -0
  36. package/scaffold/vanilla/components/search.html +8 -0
  37. package/scaffold/vanilla/components/settings.html +8 -0
  38. package/scaffold/vanilla/components/spinner.html +8 -0
  39. package/scaffold/vanilla/components/table.html +8 -0
  40. package/scaffold/vanilla/components/tabs.html +8 -0
  41. package/scaffold/vanilla/components/theme-switcher.html +8 -0
  42. package/scaffold/vanilla/components/toast.html +8 -0
  43. package/scaffold/vanilla/components/tooltip.html +8 -0
  44. package/scaffold/vanilla/index.html +8 -0
  45. package/scaffold/astro-app/README.md +0 -43
  46. package/scaffold/astro-app/package.json +0 -1
  47. package/scaffold/astro-app/src/components/Accordion.astro +0 -178
  48. package/scaffold/astro-app/src/components/Alert.astro +0 -131
  49. package/scaffold/astro-app/src/components/Avatar.astro +0 -59
  50. package/scaffold/astro-app/src/components/Badge.astro +0 -24
  51. package/scaffold/astro-app/src/components/Breadcrumb.astro +0 -61
  52. package/scaffold/astro-app/src/components/Button.astro +0 -3
  53. package/scaffold/astro-app/src/components/Card.astro +0 -18
  54. package/scaffold/astro-app/src/components/Checkbox.astro +0 -38
  55. package/scaffold/astro-app/src/components/CliCommandTabs.astro +0 -90
  56. package/scaffold/astro-app/src/components/CodeBlock.astro +0 -393
  57. package/scaffold/astro-app/src/components/CopyToClipboard.astro +0 -219
  58. package/scaffold/astro-app/src/components/Divider.astro +0 -37
  59. package/scaffold/astro-app/src/components/DocsSidebar.astro +0 -51
  60. package/scaffold/astro-app/src/components/Dropdown.astro +0 -807
  61. package/scaffold/astro-app/src/components/FormGroup.astro +0 -59
  62. package/scaffold/astro-app/src/components/FrameworkSwitcher.astro +0 -72
  63. package/scaffold/astro-app/src/components/Input.astro +0 -59
  64. package/scaffold/astro-app/src/components/Modal.astro +0 -212
  65. package/scaffold/astro-app/src/components/Navbar.astro +0 -623
  66. package/scaffold/astro-app/src/components/PackageInstallTabs.astro +0 -87
  67. package/scaffold/astro-app/src/components/Pagination.astro +0 -240
  68. package/scaffold/astro-app/src/components/ProgressBar.astro +0 -65
  69. package/scaffold/astro-app/src/components/Radio.astro +0 -38
  70. package/scaffold/astro-app/src/components/Search.astro +0 -1259
  71. package/scaffold/astro-app/src/components/Select.astro +0 -49
  72. package/scaffold/astro-app/src/components/Settings.astro +0 -382
  73. package/scaffold/astro-app/src/components/Spinner.astro +0 -30
  74. package/scaffold/astro-app/src/components/Table.astro +0 -181
  75. package/scaffold/astro-app/src/components/Tabs.astro +0 -223
  76. package/scaffold/astro-app/src/components/Textarea.astro +0 -58
  77. package/scaffold/astro-app/src/components/ThemeIcon.astro +0 -50
  78. package/scaffold/astro-app/src/components/ThemeSwitcher.astro +0 -504
  79. package/scaffold/astro-app/src/components/Toast.astro +0 -30
  80. package/scaffold/astro-app/src/components/Tooltip.astro +0 -32
  81. package/scaffold/astro-app/src/components/icons/Brush.astro +0 -10
  82. package/scaffold/astro-app/src/components/icons/Cake.astro +0 -11
  83. package/scaffold/astro-app/src/components/icons/Check.astro +0 -29
  84. package/scaffold/astro-app/src/components/icons/Cherry.astro +0 -11
  85. package/scaffold/astro-app/src/components/icons/ChevronDown.astro +0 -29
  86. package/scaffold/astro-app/src/components/icons/Circle.astro +0 -29
  87. package/scaffold/astro-app/src/components/icons/Close.astro +0 -30
  88. package/scaffold/astro-app/src/components/icons/Cmd.astro +0 -26
  89. package/scaffold/astro-app/src/components/icons/Copy.astro +0 -30
  90. package/scaffold/astro-app/src/components/icons/Eye.astro +0 -30
  91. package/scaffold/astro-app/src/components/icons/Filter.astro +0 -29
  92. package/scaffold/astro-app/src/components/icons/Flame.astro +0 -28
  93. package/scaffold/astro-app/src/components/icons/Flower.astro +0 -11
  94. package/scaffold/astro-app/src/components/icons/Gear.astro +0 -30
  95. package/scaffold/astro-app/src/components/icons/Heart.astro +0 -28
  96. package/scaffold/astro-app/src/components/icons/IceCream.astro +0 -31
  97. package/scaffold/astro-app/src/components/icons/Leaf.astro +0 -29
  98. package/scaffold/astro-app/src/components/icons/Lemon.astro +0 -11
  99. package/scaffold/astro-app/src/components/icons/Moon.astro +0 -29
  100. package/scaffold/astro-app/src/components/icons/Owl.astro +0 -34
  101. package/scaffold/astro-app/src/components/icons/Palette.astro +0 -33
  102. package/scaffold/astro-app/src/components/icons/Rainbow.astro +0 -31
  103. package/scaffold/astro-app/src/components/icons/Search.astro +0 -30
  104. package/scaffold/astro-app/src/components/icons/Shield.astro +0 -28
  105. package/scaffold/astro-app/src/components/icons/Snowflake.astro +0 -34
  106. package/scaffold/astro-app/src/components/icons/Sort.astro +0 -30
  107. package/scaffold/astro-app/src/components/icons/Sun.astro +0 -29
  108. package/scaffold/astro-app/src/components/icons/Sunset.astro +0 -10
  109. package/scaffold/astro-app/src/components/icons/Zap.astro +0 -9
  110. package/scaffold/astro-app/src/components/icons/devicons/Astro.astro +0 -53
  111. package/scaffold/astro-app/src/components/icons/devicons/Bash.astro +0 -34
  112. package/scaffold/astro-app/src/components/icons/devicons/Css3.astro +0 -29
  113. package/scaffold/astro-app/src/components/icons/devicons/Git.astro +0 -24
  114. package/scaffold/astro-app/src/components/icons/devicons/Html5.astro +0 -27
  115. package/scaffold/astro-app/src/components/icons/devicons/Javascript.astro +0 -25
  116. package/scaffold/astro-app/src/components/icons/devicons/Nodejs.astro +0 -47
  117. package/scaffold/astro-app/src/components/icons/devicons/Plaintext.astro +0 -33
  118. package/scaffold/astro-app/src/components/icons/devicons/React.astro +0 -27
  119. package/scaffold/astro-app/src/components/icons/devicons/Svelte.astro +0 -25
  120. package/scaffold/astro-app/src/components/icons/devicons/Vue.astro +0 -26
  121. package/scaffold/astro-app/src/config/frameworks.ts +0 -26
  122. package/scaffold/astro-app/src/config/themes.ts +0 -54
  123. package/scaffold/astro-app/src/layouts/DocsLayout.astro +0 -263
  124. package/scaffold/astro-app/src/layouts/Layout.astro +0 -41
  125. package/scaffold/astro-app/src/pages/components/accordion.astro +0 -172
  126. package/scaffold/astro-app/src/pages/components/alert.astro +0 -250
  127. package/scaffold/astro-app/src/pages/components/avatar.astro +0 -102
  128. package/scaffold/astro-app/src/pages/components/badge.astro +0 -119
  129. package/scaffold/astro-app/src/pages/components/breadcrumb.astro +0 -124
  130. package/scaffold/astro-app/src/pages/components/button.astro +0 -74
  131. package/scaffold/astro-app/src/pages/components/cards.astro +0 -247
  132. package/scaffold/astro-app/src/pages/components/copy-to-clipboard.astro +0 -49
  133. package/scaffold/astro-app/src/pages/components/divider.astro +0 -74
  134. package/scaffold/astro-app/src/pages/components/dropdown.astro +0 -394
  135. package/scaffold/astro-app/src/pages/components/forms.astro +0 -367
  136. package/scaffold/astro-app/src/pages/components/icons.astro +0 -246
  137. package/scaffold/astro-app/src/pages/components/modal.astro +0 -152
  138. package/scaffold/astro-app/src/pages/components/navbar.astro +0 -80
  139. package/scaffold/astro-app/src/pages/components/pagination.astro +0 -126
  140. package/scaffold/astro-app/src/pages/components/progress-bar.astro +0 -94
  141. package/scaffold/astro-app/src/pages/components/search.astro +0 -155
  142. package/scaffold/astro-app/src/pages/components/settings.astro +0 -78
  143. package/scaffold/astro-app/src/pages/components/spinner.astro +0 -81
  144. package/scaffold/astro-app/src/pages/components/table.astro +0 -144
  145. package/scaffold/astro-app/src/pages/components/tabs.astro +0 -220
  146. package/scaffold/astro-app/src/pages/components/theme-switcher.astro +0 -69
  147. package/scaffold/astro-app/src/pages/components/toast.astro +0 -157
  148. package/scaffold/astro-app/src/pages/components/tooltip.astro +0 -209
  149. package/scaffold/astro-app/src/pages/components.astro +0 -290
  150. package/scaffold/astro-app/src/pages/docs/accessibility.astro +0 -9
  151. package/scaffold/astro-app/src/pages/docs/colors.astro +0 -9
  152. package/scaffold/astro-app/src/pages/docs/design-system.astro +0 -9
  153. package/scaffold/astro-app/src/pages/docs/getting-started.astro +0 -9
  154. package/scaffold/astro-app/src/pages/docs/index.astro +0 -15
  155. package/scaffold/astro-app/src/pages/docs/themes/[theme].astro +0 -14
  156. package/scaffold/astro-app/src/pages/docs/theming.astro +0 -10
  157. package/scaffold/astro-app/src/pages/index.astro +0 -24
  158. package/scaffold/svelte-app/README.md +0 -39
  159. package/scaffold/svelte-app/package.json +0 -22
  160. package/scaffold/svelte-app/src/app.d.ts +0 -28
  161. package/scaffold/svelte-app/src/app.html +0 -21
  162. package/scaffold/svelte-app/src/lib/assets/favicon.svg +0 -1
  163. package/scaffold/svelte-app/src/lib/rizzo/Accordion.svelte +0 -128
  164. package/scaffold/svelte-app/src/lib/rizzo/Alert.svelte +0 -85
  165. package/scaffold/svelte-app/src/lib/rizzo/Avatar.svelte +0 -39
  166. package/scaffold/svelte-app/src/lib/rizzo/Badge.svelte +0 -31
  167. package/scaffold/svelte-app/src/lib/rizzo/Breadcrumb.svelte +0 -49
  168. package/scaffold/svelte-app/src/lib/rizzo/Button.svelte +0 -27
  169. package/scaffold/svelte-app/src/lib/rizzo/Card.svelte +0 -17
  170. package/scaffold/svelte-app/src/lib/rizzo/Checkbox.svelte +0 -37
  171. package/scaffold/svelte-app/src/lib/rizzo/CopyToClipboard.svelte +0 -79
  172. package/scaffold/svelte-app/src/lib/rizzo/Divider.svelte +0 -28
  173. package/scaffold/svelte-app/src/lib/rizzo/Dropdown.svelte +0 -254
  174. package/scaffold/svelte-app/src/lib/rizzo/FormGroup.svelte +0 -51
  175. package/scaffold/svelte-app/src/lib/rizzo/Input.svelte +0 -59
  176. package/scaffold/svelte-app/src/lib/rizzo/Modal.svelte +0 -157
  177. package/scaffold/svelte-app/src/lib/rizzo/Pagination.svelte +0 -93
  178. package/scaffold/svelte-app/src/lib/rizzo/ProgressBar.svelte +0 -58
  179. package/scaffold/svelte-app/src/lib/rizzo/Radio.svelte +0 -38
  180. package/scaffold/svelte-app/src/lib/rizzo/Select.svelte +0 -51
  181. package/scaffold/svelte-app/src/lib/rizzo/Spinner.svelte +0 -14
  182. package/scaffold/svelte-app/src/lib/rizzo/Table.svelte +0 -158
  183. package/scaffold/svelte-app/src/lib/rizzo/Tabs.svelte +0 -117
  184. package/scaffold/svelte-app/src/lib/rizzo/Textarea.svelte +0 -59
  185. package/scaffold/svelte-app/src/lib/rizzo/ThemeIcon.svelte +0 -54
  186. package/scaffold/svelte-app/src/lib/rizzo/ThemeSwitcher.svelte +0 -315
  187. package/scaffold/svelte-app/src/lib/rizzo/Toast.svelte +0 -33
  188. package/scaffold/svelte-app/src/lib/rizzo/Tooltip.svelte +0 -19
  189. package/scaffold/svelte-app/src/lib/rizzo/icons/Check.svelte +0 -29
  190. package/scaffold/svelte-app/src/lib/rizzo/icons/ChevronDown.svelte +0 -29
  191. package/scaffold/svelte-app/src/lib/rizzo/icons/Circle.svelte +0 -29
  192. package/scaffold/svelte-app/src/lib/rizzo/icons/Close.svelte +0 -30
  193. package/scaffold/svelte-app/src/lib/rizzo/icons/Cmd.svelte +0 -27
  194. package/scaffold/svelte-app/src/lib/rizzo/icons/Copy.svelte +0 -30
  195. package/scaffold/svelte-app/src/lib/rizzo/icons/Eye.svelte +0 -30
  196. package/scaffold/svelte-app/src/lib/rizzo/icons/Filter.svelte +0 -29
  197. package/scaffold/svelte-app/src/lib/rizzo/icons/Gear.svelte +0 -30
  198. package/scaffold/svelte-app/src/lib/rizzo/icons/IceCream.svelte +0 -31
  199. package/scaffold/svelte-app/src/lib/rizzo/icons/Moon.svelte +0 -29
  200. package/scaffold/svelte-app/src/lib/rizzo/icons/Owl.svelte +0 -34
  201. package/scaffold/svelte-app/src/lib/rizzo/icons/Palette.svelte +0 -33
  202. package/scaffold/svelte-app/src/lib/rizzo/icons/Rainbow.svelte +0 -31
  203. package/scaffold/svelte-app/src/lib/rizzo/icons/Search.svelte +0 -30
  204. package/scaffold/svelte-app/src/lib/rizzo/icons/Snowflake.svelte +0 -34
  205. package/scaffold/svelte-app/src/lib/rizzo/icons/Sort.svelte +0 -30
  206. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Astro.svelte +0 -45
  207. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Bash.svelte +0 -28
  208. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Css3.svelte +0 -23
  209. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Git.svelte +0 -18
  210. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Html5.svelte +0 -21
  211. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Javascript.svelte +0 -19
  212. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Nodejs.svelte +0 -44
  213. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Plaintext.svelte +0 -24
  214. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/React.svelte +0 -21
  215. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/SvelteIcon.svelte +0 -19
  216. package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Vue.svelte +0 -20
  217. package/scaffold/svelte-app/src/lib/rizzo/index.ts +0 -35
  218. package/scaffold/svelte-app/src/lib/rizzo-docs/CodeBlock.svelte +0 -239
  219. package/scaffold/svelte-app/src/lib/rizzo-docs/SvelteDocPage.svelte +0 -99
  220. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AccordionDoc.svelte +0 -53
  221. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AlertDoc.svelte +0 -114
  222. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AvatarDoc.svelte +0 -92
  223. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/BadgeDoc.svelte +0 -60
  224. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/BreadcrumbDoc.svelte +0 -55
  225. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ButtonDoc.svelte +0 -55
  226. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/CardsDoc.svelte +0 -173
  227. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ComingSoon.svelte +0 -12
  228. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ComponentsOverview.svelte +0 -92
  229. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/CopyToClipboardDoc.svelte +0 -26
  230. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/DividerDoc.svelte +0 -105
  231. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/DropdownDoc.svelte +0 -161
  232. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/FormsDoc.svelte +0 -375
  233. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/IconsDoc.svelte +0 -246
  234. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/Index.svelte +0 -8
  235. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ModalDoc.svelte +0 -50
  236. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/NavbarDoc.svelte +0 -79
  237. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/PaginationDoc.svelte +0 -44
  238. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ProgressBarDoc.svelte +0 -95
  239. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SearchDoc.svelte +0 -147
  240. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SettingsDoc.svelte +0 -158
  241. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SpinnerDoc.svelte +0 -41
  242. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TableDoc.svelte +0 -116
  243. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TabsDoc.svelte +0 -152
  244. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ThemeSwitcherDoc.svelte +0 -189
  245. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/Theming.svelte +0 -6
  246. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ToastDoc.svelte +0 -136
  247. package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TooltipDoc.svelte +0 -57
  248. package/scaffold/svelte-app/src/routes/+layout.svelte +0 -10
  249. package/scaffold/svelte-app/src/routes/+page.svelte +0 -31
  250. package/scaffold/svelte-app/src/routes/components/+page.svelte +0 -4
  251. package/scaffold/svelte-app/src/routes/components/[slug]/+page.svelte +0 -7
  252. package/scaffold/svelte-app/static/robots.txt +0 -3
  253. package/scaffold/svelte-app/svelte.config.js +0 -13
  254. package/scaffold/svelte-app/tsconfig.json +0 -21
  255. package/scaffold/svelte-app/vite.config.ts +0 -6
  256. /package/scaffold/{astro-app → astro-minimal}/astro.config.mjs +0 -0
  257. /package/scaffold/{astro-app → astro-minimal}/public/.gitkeep +0 -0
  258. /package/scaffold/{astro-app → astro-minimal}/public/favicon.svg +0 -0
  259. /package/scaffold/{astro-app → astro-minimal}/tsconfig.json +0 -0
  260. /package/scaffold/{svelte-app → svelte-minimal}/static/.gitkeep +0 -0
@@ -1,38 +0,0 @@
1
- <script lang="ts">
2
- interface Props {
3
- id?: string;
4
- name?: string;
5
- value?: string;
6
- /** Bind the selected value for the radio group. Use the same bound variable for all radios in the group. */
7
- group?: string;
8
- required?: boolean;
9
- disabled?: boolean;
10
- class?: string;
11
- ariaDescribedby?: string;
12
- ariaLabel?: string;
13
- }
14
- let {
15
- id,
16
- name,
17
- value = '',
18
- group = $bindable(undefined as string | undefined),
19
- required = false,
20
- disabled = false,
21
- class: className = '',
22
- ariaDescribedby,
23
- ariaLabel,
24
- }: Props = $props();
25
- </script>
26
-
27
- <input
28
- type="radio"
29
- {id}
30
- {name}
31
- {value}
32
- bind:group={group}
33
- {required}
34
- {disabled}
35
- class={className}
36
- aria-describedby={ariaDescribedby}
37
- aria-label={ariaLabel}
38
- />
@@ -1,51 +0,0 @@
1
- <script lang="ts">
2
- import type { Snippet } from 'svelte';
3
-
4
- interface Props {
5
- id?: string;
6
- name?: string;
7
- value?: string;
8
- required?: boolean;
9
- disabled?: boolean;
10
- size?: 'sm' | 'md' | 'lg';
11
- error?: boolean;
12
- success?: boolean;
13
- class?: string;
14
- ariaDescribedby?: string;
15
- ariaInvalid?: boolean | 'true' | 'false';
16
- children?: Snippet;
17
- }
18
- let {
19
- id,
20
- name,
21
- value = $bindable(''),
22
- required = false,
23
- disabled = false,
24
- size = 'md',
25
- error = false,
26
- success = false,
27
- class: className = '',
28
- ariaDescribedby,
29
- ariaInvalid,
30
- children,
31
- }: Props = $props();
32
-
33
- const sizeClass = $derived(size !== 'md' ? `form-input--${size}` : '');
34
- const errorClass = $derived(error ? 'form-input--error' : '');
35
- const successClass = $derived(success ? 'form-input--success' : '');
36
- const classes = $derived(['form-input', sizeClass, errorClass, successClass, className].filter(Boolean).join(' ').trim());
37
- const invalid = $derived(error || ariaInvalid === true || ariaInvalid === 'true');
38
- </script>
39
-
40
- <select
41
- {id}
42
- {name}
43
- bind:value
44
- {required}
45
- {disabled}
46
- class={classes}
47
- aria-invalid={invalid ? 'true' : 'false'}
48
- aria-describedby={ariaDescribedby}
49
- >
50
- {@render children?.()}
51
- </select>
@@ -1,14 +0,0 @@
1
- <script lang="ts">
2
- interface Props {
3
- size?: 'sm' | 'md' | 'lg';
4
- variant?: 'primary' | 'success' | 'warning' | 'error' | 'info';
5
- label?: string;
6
- class?: string;
7
- }
8
- let { size = 'md', variant = 'primary', label = 'Loading', class: className = '' }: Props = $props();
9
- const classes = $derived(['spinner', `spinner--${size}`, `spinner--${variant}`, className].filter(Boolean).join(' ').trim());
10
- </script>
11
-
12
- <span class={classes} role="status" aria-label={label}>
13
- <span class="spinner__ring" aria-hidden="true"></span>
14
- </span>
@@ -1,158 +0,0 @@
1
- <script lang="ts">
2
- export interface TableColumn {
3
- key: string;
4
- label: string;
5
- sortable?: boolean;
6
- type?: 'string' | 'number';
7
- }
8
-
9
- interface Props {
10
- columns: TableColumn[];
11
- data: Record<string, string | number>[];
12
- caption?: string;
13
- sortable?: boolean;
14
- filterable?: boolean;
15
- filterPlaceholder?: string;
16
- striped?: boolean;
17
- class?: string;
18
- }
19
-
20
- let {
21
- columns,
22
- data,
23
- caption,
24
- sortable = true,
25
- filterable = false,
26
- filterPlaceholder = 'Filter table…',
27
- striped = true,
28
- class: className = '',
29
- }: Props = $props();
30
-
31
- const tableId = `table-${Math.random().toString(36).slice(2, 11)}`;
32
- const classes = $derived(
33
- ['table', striped ? 'table--striped' : '', sortable ? 'table--sortable' : '', filterable ? 'table--filterable' : '', className]
34
- .filter(Boolean)
35
- .join(' ')
36
- .trim()
37
- );
38
-
39
- let sortColumnIndex = $state<number | null>(null);
40
- let sortDirection = $state<'ascending' | 'descending'>('ascending');
41
- let filterQuery = $state('');
42
-
43
- const filteredData = $derived.by(() => {
44
- if (!filterable || !filterQuery.trim()) return data;
45
- const q = filterQuery.trim().toLowerCase();
46
- return data.filter((row) =>
47
- columns.some((col) => String(row[col.key] ?? '').toLowerCase().includes(q))
48
- );
49
- });
50
-
51
- const sortedData = $derived.by(() => {
52
- if (!sortable || sortColumnIndex === null) return filteredData;
53
- const col = columns[sortColumnIndex];
54
- const type = col?.type ?? 'string';
55
- const dir = sortDirection === 'ascending' ? 1 : -1;
56
- return [...filteredData].sort((a, b) => {
57
- const aVal = a[col.key];
58
- const bVal = b[col.key];
59
- if (type === 'number') {
60
- const aNum = parseFloat(String(aVal).replace(/[^0-9.-]/g, '')) || 0;
61
- const bNum = parseFloat(String(bVal).replace(/[^0-9.-]/g, '')) || 0;
62
- return dir * (aNum - bNum);
63
- }
64
- const cmp = String(aVal).localeCompare(String(bVal), undefined, { numeric: true });
65
- return dir * cmp;
66
- });
67
- });
68
-
69
- function getSortState(colIndex: number): 'none' | 'ascending' | 'descending' {
70
- if (sortColumnIndex !== colIndex) return 'none';
71
- return sortDirection;
72
- }
73
-
74
- function handleSort(colIndex: number) {
75
- if (sortColumnIndex === colIndex) {
76
- sortDirection = sortDirection === 'ascending' ? 'descending' : 'ascending';
77
- } else {
78
- sortColumnIndex = colIndex;
79
- sortDirection = 'ascending';
80
- }
81
- }
82
- </script>
83
-
84
- <div class={classes} data-table-id={tableId} data-table-sortable={sortable ? 'true' : undefined} data-table-filterable={filterable ? 'true' : undefined}>
85
- {#if filterable}
86
- <div class="table__filter-wrap">
87
- <label for="{tableId}-filter" class="sr-only">Filter table</label>
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" 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
- </svg>
92
- </span>
93
- <input
94
- type="search"
95
- id="{tableId}-filter"
96
- class="table__filter"
97
- placeholder={filterPlaceholder}
98
- aria-controls={tableId}
99
- data-table-filter
100
- autocomplete="off"
101
- bind:value={filterQuery}
102
- />
103
- </div>
104
- {/if}
105
- <div class="table__wrapper">
106
- <table class="table__table" id={tableId}>
107
- {#if caption}
108
- <caption class="table__caption">{caption}</caption>
109
- {/if}
110
- <thead class="table__head">
111
- <tr class="table__row">
112
- {#each columns as col, i}
113
- {@const canSort = sortable && col.sortable !== false}
114
- <th
115
- class="table__cell table__cell--head"
116
- scope="col"
117
- data-column-index={i}
118
- data-sortable={canSort ? 'true' : undefined}
119
- data-type={col.type ?? 'string'}
120
- aria-sort={canSort ? getSortState(i) : undefined}
121
- >
122
- {#if canSort}
123
- <button
124
- type="button"
125
- class="table__sort-trigger"
126
- data-column-index={i}
127
- aria-label="Sort by {col.label}"
128
- onclick={() => handleSort(i)}
129
- >
130
- <span class="table__cell-content">{col.label}</span>
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" 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" />
135
- </svg>
136
- </span>
137
- </button>
138
- {:else}
139
- <span class="table__cell-content">{col.label}</span>
140
- {/if}
141
- </th>
142
- {/each}
143
- </tr>
144
- </thead>
145
- <tbody class="table__body">
146
- {#each sortedData as row, rowIndex}
147
- <tr class="table__row" data-row-index={rowIndex}>
148
- {#each columns as col}
149
- <td class="table__cell" data-column-key={col.key}>
150
- {row[col.key] ?? ''}
151
- </td>
152
- {/each}
153
- </tr>
154
- {/each}
155
- </tbody>
156
- </table>
157
- </div>
158
- </div>
@@ -1,117 +0,0 @@
1
- <script lang="ts">
2
- import type { Snippet } from 'svelte';
3
-
4
- export interface Tab {
5
- id: string;
6
- label: string;
7
- content?: string;
8
- }
9
-
10
- interface Props {
11
- tabs: Tab[];
12
- id?: string;
13
- defaultTab?: string;
14
- variant?: 'default' | 'pills' | 'underline';
15
- class?: string;
16
- children?: Snippet<[activeTabId: string]>;
17
- }
18
- let {
19
- tabs,
20
- id,
21
- defaultTab,
22
- variant = 'default',
23
- class: className = '',
24
- children,
25
- }: Props = $props();
26
-
27
- const defaultActiveId = $derived(defaultTab ?? tabs[0]?.id ?? '');
28
- let selectedId = $state(null as string | null);
29
- const activeTabId = $derived(selectedId ?? defaultActiveId);
30
- const tabsId = $derived(id ?? `tabs-${Math.random().toString(36).slice(2, 11)}`);
31
- const variantClass = $derived(variant !== 'default' ? `tabs--${variant}` : '');
32
- const classes = $derived(['tabs', variantClass, className].filter(Boolean).join(' ').trim());
33
-
34
- let tabListEl: HTMLElement | null = $state(null);
35
-
36
- function activateTab(index: number) {
37
- if (index < 0 || index >= tabs.length) return;
38
- selectedId = tabs[index].id;
39
- }
40
-
41
- function handleKeydown(e: KeyboardEvent, index: number) {
42
- let targetIndex = index;
43
- switch (e.key) {
44
- case 'ArrowRight':
45
- case 'ArrowDown':
46
- e.preventDefault();
47
- targetIndex = (index + 1) % tabs.length;
48
- break;
49
- case 'ArrowLeft':
50
- case 'ArrowUp':
51
- e.preventDefault();
52
- targetIndex = index === 0 ? tabs.length - 1 : index - 1;
53
- break;
54
- case 'Home':
55
- e.preventDefault();
56
- targetIndex = 0;
57
- break;
58
- case 'End':
59
- e.preventDefault();
60
- targetIndex = tabs.length - 1;
61
- break;
62
- case 'Enter':
63
- case ' ':
64
- e.preventDefault();
65
- activateTab(index);
66
- return;
67
- default:
68
- return;
69
- }
70
- activateTab(targetIndex);
71
- const buttons = tabListEl?.querySelectorAll('[role="tab"]');
72
- if (buttons && buttons[targetIndex]) (buttons[targetIndex] as HTMLElement).focus();
73
- }
74
- </script>
75
-
76
- <div class={classes} data-tabs={tabsId}>
77
- <div class="tabs__list" role="tablist" aria-label="Tabs" bind:this={tabListEl}>
78
- {#each tabs as tab, index}
79
- {@const isActive = tab.id === activeTabId}
80
- <span
81
- class="tabs__tab {isActive ? 'tabs__tab--active' : ''}"
82
- id="{tabsId}-tab-{tab.id}"
83
- role="tab"
84
- tabindex={isActive ? 0 : -1}
85
- aria-selected={isActive ? 'true' : 'false'}
86
- aria-controls="{tabsId}-panel-{tab.id}"
87
- data-tab-id={tab.id}
88
- data-tab-index={index}
89
- onclick={() => activateTab(index)}
90
- onkeydown={(e) => handleKeydown(e, index)}
91
- >
92
- {tab.label}
93
- </span>
94
- {/each}
95
- </div>
96
-
97
- <div class="tabs__panels-wrapper">
98
- {#each tabs as tab, index}
99
- {@const isActive = tab.id === activeTabId}
100
- <div
101
- class="tabs__panel {isActive ? 'tabs__panel--active' : ''}"
102
- id="{tabsId}-panel-{tab.id}"
103
- role="tabpanel"
104
- aria-labelledby="{tabsId}-tab-{tab.id}"
105
- aria-hidden={isActive ? 'false' : 'true'}
106
- data-panel-id={tab.id}
107
- data-panel-index={index}
108
- >
109
- {#if tab.content}
110
- <div class="tabs__panel-content">{@html tab.content}</div>
111
- {:else if isActive}
112
- {@render children?.(activeTabId)}
113
- {/if}
114
- </div>
115
- {/each}
116
- </div>
117
- </div>
@@ -1,59 +0,0 @@
1
- <script lang="ts">
2
- interface Props {
3
- id?: string;
4
- name?: string;
5
- value?: string;
6
- placeholder?: string;
7
- required?: boolean;
8
- disabled?: boolean;
9
- readonly?: boolean;
10
- rows?: number;
11
- cols?: number;
12
- size?: 'sm' | 'md' | 'lg';
13
- error?: boolean;
14
- success?: boolean;
15
- class?: string;
16
- ariaDescribedby?: string;
17
- ariaInvalid?: boolean | 'true' | 'false';
18
- }
19
- let {
20
- id,
21
- name,
22
- value = $bindable(''),
23
- placeholder,
24
- required = false,
25
- disabled = false,
26
- readonly = false,
27
- rows = 4,
28
- cols,
29
- size = 'md',
30
- error = false,
31
- success = false,
32
- class: className = '',
33
- ariaDescribedby,
34
- ariaInvalid,
35
- }: Props = $props();
36
-
37
- const sizeClass = $derived(size !== 'md' ? `form-input--${size}` : '');
38
- const errorClass = $derived(error ? 'form-input--error' : '');
39
- const successClass = $derived(success ? 'form-input--success' : '');
40
- const classes = $derived(
41
- ['form-input', sizeClass, errorClass, successClass, className].filter(Boolean).join(' ').trim()
42
- );
43
- const invalid = $derived(error || ariaInvalid === true || ariaInvalid === 'true');
44
- </script>
45
-
46
- <textarea
47
- {id}
48
- {name}
49
- bind:value
50
- {placeholder}
51
- {required}
52
- {disabled}
53
- {readonly}
54
- {rows}
55
- cols={cols}
56
- class={classes}
57
- aria-invalid={invalid ? 'true' : 'false'}
58
- aria-describedby={ariaDescribedby}
59
- ></textarea>
@@ -1,54 +0,0 @@
1
- <script lang="ts">
2
- interface Props {
3
- themeId: string;
4
- size?: number;
5
- class?: string;
6
- }
7
-
8
- let { themeId, size = 24, class: className = '' }: Props = $props();
9
-
10
- /** Same icon SVGs as ThemeSwitcher (one per theme). */
11
- const THEME_ICON_SVG: Record<string, string> = {
12
- 'github-dark-classic':
13
- '<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"><path d="M16 7h.01" /><path d="M3.4 18H12a8 8 0 0 0 8-8V7a4 4 0 0 0-7.28-2.3L2 20" /><path d="m20 7 2 .5-2 .5" /><path d="M10 18v3" /><path d="M14 17.75V21" /><path d="M7 18a6 6 0 0 0 3.84-10.61" /></svg>',
14
- 'github-light':
15
- '<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"><circle cx="12" cy="12" r="4" /><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41" /></svg>',
16
- 'red-velvet-cupcake':
17
- '<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"><path d="M20 21v-8a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8" /><path d="M4 16s1-1 4-1 5 2 8 2 4-1 4-1V4" /><path d="M2 16v4M22 16v4M8 8h.01M16 8h.01M8 12h.01M16 12h.01" /></svg>',
18
- 'orangy-one-light':
19
- '<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"><path d="M15.5 6.5c.5-2.5 2.5-4 5-4 1.5 0 2.5.5 3 1" /><path d="M12 12c-2 2-3 4-3 6 0 3 2 5 5 5 2 0 4-1 6-3" /><path d="M18 12c2 2 3 4 3 6 0 3-2 5-5 5-2 0-4-1-6-3" /></svg>',
20
- sunflower:
21
- '<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"><path d="M22 17a10 10 0 0 0-20 0" /><path d="M6 17a6 6 0 0 1 12 0" /><path d="M10 17a2 2 0 0 1 4 0" /></svg>',
22
- 'shades-of-purple':
23
- '<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"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 21a9 9 0 0 1 0 -18c4.97 0 9 3.582 9 8c0 1.06 -.474 2.078 -1.318 2.828c-.844 .75 -1.989 1.172 -3.182 1.172h-2.5a2 2 0 0 0 -1 3.75a1.3 1.3 0 0 1 -1 2.25"/><path d="M7.5 10.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"/><path d="M11.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"/><path d="M15.5 10.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"/></svg>',
24
- 'sandstorm-classic':
25
- '<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"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z" /></svg>',
26
- 'rocky-blood-orange':
27
- '<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"><path d="M12 10V2M4.93 10.93l1.41 1.41M2 18h2M20 18h2M17.66 10.93l1.41-1.41M22 22H2M8 6l4-4 4 4M16 18a4 4 0 0 0-8 0" /><path d="M12 22v-4" /></svg>',
28
- 'minimal-dark-neon-yellow':
29
- '<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"><path d="M13 2 3 14h9l-1 8 10-12h-9l1-8z" /></svg>',
30
- 'hack-the-box':
31
- '<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"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" /></svg>',
32
- 'green-breeze-light':
33
- '<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"><path d="M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2c1 2 2 4.18 2 8 0 5.5-4.78 10-10 10Z" /><path d="M2 21c0-3 1.85-5.36 5.08-6C9.5 14.52 12 13 13 12" /></svg>',
34
- 'pink-cat-boo':
35
- '<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"><path d="M19.5 12.572l-7.5 7.428l-7.5 -7.428a5 5 0 1 1 7.5 -6.566a5 5 0 1 1 7.5 6.572" /></svg>',
36
- 'cute-pink':
37
- '<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"><path d="M9 18c0-2 1.5-4 4-4s4 2 4 4c0 2-1.5 4-4 4s-4-2-4-4Z" /><path d="M15 18c0-2 1.5-4 4-4s4 2 4 4c0 2-1.5 4-4 4s-4-2-4-4Z" /><path d="M12 8v4M10 10l-2 2M14 10l2 2" /></svg>',
38
- 'semi-light-purple':
39
- '<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"><path d="m9.06 11.9 8.07-8.06a2.85 2.85 0 1 1 4.03 4.03l-8.06 8.08" /><path d="M7.87 14.14c-.32.32-.67.68-1.06 1.06a5.04 5.04 0 0 1-2.17 1.22c-.47.15-.85.2-1.15.2-.16 0-.3-.02-.41-.03a1 1 0 0 1-.63-.97c-.01-.14.02-.31.07-.51.1-.41.3-.95.6-1.59.3-.64.67-1.33 1.08-2.05" /></svg>',
40
- };
41
-
42
- const iconSvg = $derived(THEME_ICON_SVG[themeId] ?? null);
43
- const sizedSvg = $derived(
44
- iconSvg
45
- ? iconSvg.replace(/width="16"/, `width="${size}"`).replace(/height="16"/, `height="${size}"`)
46
- : null
47
- );
48
- </script>
49
-
50
- {#if sizedSvg}
51
- <span class={className} style="display: inline-flex; vertical-align: middle;">
52
- {@html sizedSvg}
53
- </span>
54
- {/if}