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
@@ -0,0 +1,187 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" data-theme="{{DATA_THEME}}">{{THEME_LIST_COMMENT}}
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>{{TITLE}}</title>
7
+ <!-- Theme flash prevention: apply saved theme/settings before first paint (same as main site) -->
8
+ <script>
9
+ (function() {
10
+ try {
11
+ var savedTheme = localStorage.getItem('theme');
12
+ var defaultDark = '{{DEFAULT_DARK}}';
13
+ var defaultLight = '{{DEFAULT_LIGHT}}';
14
+ var resolvedTheme;
15
+ if (!savedTheme) {
16
+ var initialTheme = document.documentElement.getAttribute('data-theme');
17
+ resolvedTheme = (initialTheme && initialTheme !== 'system') ? initialTheme : (window.matchMedia('(prefers-color-scheme: dark)').matches ? defaultDark : defaultLight);
18
+ } else if (savedTheme === 'system') {
19
+ resolvedTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? defaultDark : defaultLight;
20
+ } else {
21
+ resolvedTheme = savedTheme;
22
+ }
23
+ document.documentElement.setAttribute('data-theme', resolvedTheme);
24
+ var savedFontScale = localStorage.getItem('fontSizeScale');
25
+ if (savedFontScale) {
26
+ document.documentElement.style.setProperty('--font-size-scale', savedFontScale);
27
+ }
28
+ if (localStorage.getItem('reducedMotion') === 'true') {
29
+ document.documentElement.classList.add('reduced-motion');
30
+ }
31
+ if (localStorage.getItem('highContrast') === 'true') {
32
+ document.documentElement.classList.add('high-contrast');
33
+ }
34
+ var savedScrollbarStyle = localStorage.getItem('scrollbarStyle') || 'thin';
35
+ if (savedScrollbarStyle === 'thick') {
36
+ document.documentElement.classList.add('scrollbar-thick');
37
+ } else if (savedScrollbarStyle === 'hidden') {
38
+ document.documentElement.classList.add('scrollbar-hidden', 'hide-scrollbars');
39
+ }
40
+ if (!savedScrollbarStyle && localStorage.getItem('hideScrollbars') === 'true') {
41
+ document.documentElement.classList.add('scrollbar-hidden', 'hide-scrollbars');
42
+ localStorage.setItem('scrollbarStyle', 'hidden');
43
+ }
44
+ } catch (e) {}
45
+ })();
46
+ </script>
47
+ <link rel="stylesheet" href="../{{LINK_HREF}}" />
48
+ </head>
49
+ <body>
50
+ <a href="#main-content" class="skip-link">Skip to main content</a>
51
+ <header class="container flex flex-wrap items-center justify-between gap-4" style="padding-top: var(--spacing-4); padding-bottom: var(--spacing-4); border-bottom: 1px solid var(--border);">
52
+ <a href="#" class="font-semibold" style="font-size: var(--font-size-lg); color: var(--text); text-decoration: none;">{{TITLE}}</a>
53
+ <div class="flex items-center gap-3 flex-wrap">
54
+ <label for="theme-select" class="sr-only">Theme</label>
55
+ <select id="theme-select" class="form-control" style="width: auto; min-width: 12rem;" aria-label="Theme">
56
+ <option value="system">System</option>
57
+ <optgroup label="Dark themes">
58
+ <option value="github-dark-classic">GitHub Dark Classic</option>
59
+ <option value="shades-of-purple">Shades of Purple</option>
60
+ <option value="sandstorm-classic">Sandstorm Classic</option>
61
+ <option value="rocky-blood-orange">Rocky Blood Orange</option>
62
+ <option value="minimal-dark-neon-yellow">Minimal Dark Neon Yellow</option>
63
+ <option value="hack-the-box">Hack The Box</option>
64
+ <option value="pink-cat-boo">Pink Cat Boo</option>
65
+ </optgroup>
66
+ <optgroup label="Light themes">
67
+ <option value="github-light">GitHub Light</option>
68
+ <option value="red-velvet-cupcake">Red Velvet Cupcake</option>
69
+ <option value="orangy-one-light">Orangy One Light</option>
70
+ <option value="sunflower">Sunflower</option>
71
+ <option value="green-breeze-light">Green Breeze Light</option>
72
+ <option value="cute-pink">Cute Pink</option>
73
+ <option value="semi-light-purple">Semi Light Purple</option>
74
+ </optgroup>
75
+ </select>
76
+ <button type="button" class="btn btn-outline" aria-label="Open settings" onclick="window.openSettings && window.openSettings()">Settings</button>
77
+ </div>
78
+ </header>
79
+
80
+ <!-- Settings panel (same structure as main site; CSS from Rizzo) -->
81
+ <div class="settings" data-settings aria-hidden="true">
82
+ <div class="settings__overlay" data-settings-overlay aria-hidden="true"></div>
83
+ <div class="settings__panel" role="dialog" aria-modal="true" aria-labelledby="settings-title" aria-hidden="true">
84
+ <div class="settings__header">
85
+ <h2 id="settings-title" class="settings__title">Settings</h2>
86
+ <button type="button" class="settings__close" aria-label="Close settings" data-settings-close>
87
+ <svg width="20" height="20" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2"><line x1="4" y1="4" x2="12" y2="12"></line><line x1="12" y1="4" x2="4" y2="12"></line></svg>
88
+ </button>
89
+ </div>
90
+ <div class="settings__content">
91
+ <section class="settings__section">
92
+ <h3 class="settings__section-title">Theme</h3>
93
+ <div class="settings__control">
94
+ <label for="settings-theme" class="settings__label">Theme</label>
95
+ <select id="settings-theme" class="form-control" aria-label="Theme" data-settings-theme style="width: 100%;">
96
+ <option value="system">System</option>
97
+ <optgroup label="Dark themes">
98
+ <option value="github-dark-classic">GitHub Dark Classic</option>
99
+ <option value="shades-of-purple">Shades of Purple</option>
100
+ <option value="sandstorm-classic">Sandstorm Classic</option>
101
+ <option value="rocky-blood-orange">Rocky Blood Orange</option>
102
+ <option value="minimal-dark-neon-yellow">Minimal Dark Neon Yellow</option>
103
+ <option value="hack-the-box">Hack The Box</option>
104
+ <option value="pink-cat-boo">Pink Cat Boo</option>
105
+ </optgroup>
106
+ <optgroup label="Light themes">
107
+ <option value="github-light">GitHub Light</option>
108
+ <option value="red-velvet-cupcake">Red Velvet Cupcake</option>
109
+ <option value="orangy-one-light">Orangy One Light</option>
110
+ <option value="sunflower">Sunflower</option>
111
+ <option value="green-breeze-light">Green Breeze Light</option>
112
+ <option value="cute-pink">Cute Pink</option>
113
+ <option value="semi-light-purple">Semi Light Purple</option>
114
+ </optgroup>
115
+ </select>
116
+ </div>
117
+ </section>
118
+ <section class="settings__section">
119
+ <h3 class="settings__section-title">Font Size</h3>
120
+ <div class="settings__control">
121
+ <label for="font-size-slider" class="settings__label">
122
+ <span class="settings__label-text">Adjust text size</span>
123
+ <span class="settings__label-value" data-font-size-value>100%</span>
124
+ </label>
125
+ <input type="range" id="font-size-slider" class="settings__slider" min="0.75" max="1.5" step="0.05" value="1" aria-label="Font size" data-font-size-slider style="--slider-progress: 50%;" />
126
+ <div class="settings__slider-labels"><span>Small</span><span>Default</span><span>Large</span></div>
127
+ </div>
128
+ </section>
129
+ <section class="settings__section">
130
+ <h3 class="settings__section-title">Accessibility</h3>
131
+ <div class="settings__control">
132
+ <label class="settings__checkbox-label">
133
+ <input type="checkbox" class="settings__checkbox" data-reduced-motion aria-label="Reduce motion" />
134
+ <span>Reduce motion</span>
135
+ </label>
136
+ <p class="settings__help-text">Minimize animations and transitions</p>
137
+ </div>
138
+ <div class="settings__control">
139
+ <label class="settings__checkbox-label">
140
+ <input type="checkbox" class="settings__checkbox" data-high-contrast aria-label="High contrast" />
141
+ <span>High contrast</span>
142
+ </label>
143
+ <p class="settings__help-text">Increase contrast for better visibility</p>
144
+ </div>
145
+ <div class="settings__control">
146
+ <div class="settings__label"><span class="settings__label-text">Scrollbar style</span></div>
147
+ <div class="settings__radio-group" role="radiogroup" aria-label="Scrollbar style">
148
+ <label class="settings__radio-label">
149
+ <input type="radio" name="scrollbar-style" value="thin" class="settings__radio" data-scrollbar-style aria-label="Thin scrollbar" checked />
150
+ <span>Thin</span>
151
+ </label>
152
+ <label class="settings__radio-label">
153
+ <input type="radio" name="scrollbar-style" value="thick" class="settings__radio" data-scrollbar-style aria-label="Thick scrollbar" />
154
+ <span>Thick</span>
155
+ </label>
156
+ <label class="settings__radio-label">
157
+ <input type="radio" name="scrollbar-style" value="hidden" class="settings__radio" data-scrollbar-style aria-label="Hidden scrollbars" />
158
+ <span>Hidden</span>
159
+ </label>
160
+ </div>
161
+ <p class="settings__help-text">Choose your preferred scrollbar appearance</p>
162
+ </div>
163
+ </section>
164
+ </div>
165
+ </div>
166
+ </div>
167
+
168
+
169
+
170
+
171
+
172
+
173
+ <main id="main-content" class="flex flex-col items-center justify-center text-center min-h-screen" style="padding: var(--spacing-12) var(--spacing-4); min-height: calc(100vh - 4rem);">
174
+ <h1 style="font-size: var(--font-size-3xl); margin: 0 0 var(--spacing-4) 0; color: var(--text);">Tooltip</h1>
175
+ <p style="color: var(--text-dim); margin-bottom: var(--spacing-4);">Read the full docs for this component on the main site:</p>
176
+ <p><a href="https://rizzo-css.vercel.app/docs/components/tooltip" target="_blank" rel="noopener noreferrer" class="btn btn-primary">https://rizzo-css.vercel.app/docs/components/tooltip</a></p>
177
+ <p style="margin-top: var(--spacing-8);"><a href="index.html" class="btn btn-outline">← Component list</a> <a href="../index.html" class="btn btn-outline">Home</a></p>
178
+ </main>
179
+
180
+
181
+
182
+
183
+
184
+
185
+ <script src="../js/main.js"></script>
186
+ </body>
187
+ </html>
@@ -9,12 +9,12 @@
9
9
  (function() {
10
10
  try {
11
11
  var savedTheme = localStorage.getItem('theme');
12
- var defaultDark = 'github-dark-classic';
13
- var defaultLight = 'github-light';
12
+ var defaultDark = '{{DEFAULT_DARK}}';
13
+ var defaultLight = '{{DEFAULT_LIGHT}}';
14
14
  var resolvedTheme;
15
15
  if (!savedTheme) {
16
16
  var initialTheme = document.documentElement.getAttribute('data-theme');
17
- resolvedTheme = initialTheme || (window.matchMedia('(prefers-color-scheme: dark)').matches ? defaultDark : defaultLight);
17
+ resolvedTheme = (initialTheme && initialTheme !== 'system') ? initialTheme : (window.matchMedia('(prefers-color-scheme: dark)').matches ? defaultDark : defaultLight);
18
18
  } else if (savedTheme === 'system') {
19
19
  resolvedTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? defaultDark : defaultLight;
20
20
  } else {
@@ -44,118 +44,6 @@
44
44
  } catch (e) {}
45
45
  })();
46
46
  </script>
47
- <!-- Toast: showToast, removeToast, removeAllToasts (same as main site) -->
48
- <script>
49
- (function() {
50
- if (typeof window === 'undefined' || window.showToast) return;
51
- function showToast(message, options) {
52
- if (!message) return null;
53
- options = options || {};
54
- var variant = options.variant || 'info';
55
- var position = options.position || 'top-right';
56
- var autoDismiss = options.autoDismiss !== undefined ? options.autoDismiss : 5000;
57
- var dismissible = options.dismissible !== undefined ? options.dismissible : true;
58
- var toastId = 'toast-' + Math.random().toString(36).substr(2, 9);
59
- function createToast() {
60
- if (!document.body) return;
61
- var containerId = 'toast-container-' + position;
62
- var container = document.getElementById(containerId);
63
- if (!container) {
64
- container = document.createElement('div');
65
- container.id = containerId;
66
- container.className = 'toast-container toast-container--' + position;
67
- container.style.cssText = 'display:flex;visibility:visible;z-index:1100;';
68
- document.body.appendChild(container);
69
- }
70
- var toast = document.createElement('div');
71
- toast.id = toastId;
72
- toast.className = 'alert alert--' + variant;
73
- toast.setAttribute('role', 'alert');
74
- toast.setAttribute('aria-live', 'polite');
75
- toast.style.cssText = 'display:flex;visibility:visible;opacity:0;transition:opacity 0.3s ease-out, transform 0.3s ease-out;';
76
- var isRight = position.indexOf('right') !== -1;
77
- var isLeft = position.indexOf('left') !== -1;
78
- toast.style.transform = isRight ? 'translateX(100%)' : isLeft ? 'translateX(-100%)' : 'translateY(-100%)';
79
- var content = document.createElement('div');
80
- content.className = 'alert__content';
81
- content.textContent = message;
82
- toast.appendChild(content);
83
- var closeBtn;
84
- if (dismissible) {
85
- closeBtn = document.createElement('button');
86
- closeBtn.type = 'button';
87
- closeBtn.className = 'alert__close';
88
- closeBtn.setAttribute('aria-label', 'Dismiss toast');
89
- closeBtn.innerHTML = '<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2"><line x1="4" y1="4" x2="12" y2="12"></line><line x1="12" y1="4" x2="4" y2="12"></line></svg>';
90
- toast.appendChild(closeBtn);
91
- closeBtn.addEventListener('click', function() {
92
- toast.style.opacity = '0';
93
- toast.style.transform = isRight ? 'translateX(100%)' : isLeft ? 'translateX(-100%)' : 'translateY(-100%)';
94
- setTimeout(function() {
95
- if (toast.parentNode) toast.remove();
96
- if (container.children.length === 0) container.remove();
97
- }, 300);
98
- });
99
- }
100
- container.appendChild(toast);
101
- requestAnimationFrame(function() {
102
- toast.offsetHeight;
103
- if (variant === 'warning') {
104
- toast.style.color = 'var(--warning-text)';
105
- content.style.color = 'var(--warning-text)';
106
- if (closeBtn) closeBtn.style.color = 'var(--warning-text)';
107
- }
108
- setTimeout(function() {
109
- requestAnimationFrame(function() {
110
- toast.style.opacity = '1';
111
- toast.style.transform = isRight || isLeft ? 'translateX(0)' : 'translateY(0)';
112
- });
113
- }, 10);
114
- });
115
- if (autoDismiss > 0) {
116
- setTimeout(function() {
117
- if (toast.parentNode) {
118
- toast.style.opacity = '0';
119
- toast.style.transform = isRight ? 'translateX(100%)' : isLeft ? 'translateX(-100%)' : 'translateY(-100%)';
120
- setTimeout(function() {
121
- if (toast.parentNode) toast.remove();
122
- if (container.children.length === 0) container.remove();
123
- }, 300);
124
- }
125
- }, autoDismiss);
126
- }
127
- }
128
- if (document.body) createToast();
129
- else document.addEventListener('DOMContentLoaded', createToast);
130
- return toastId;
131
- }
132
- function removeToast(toastId) {
133
- var toast = document.getElementById(toastId);
134
- if (toast) {
135
- var container = toast.parentElement;
136
- var position = container ? container.id.replace('toast-container-', '') : 'top-right';
137
- toast.style.opacity = '0';
138
- toast.style.transform = position.indexOf('right') !== -1 ? 'translateX(100%)' : position.indexOf('left') !== -1 ? 'translateX(-100%)' : 'translateY(-100%)';
139
- setTimeout(function() {
140
- if (toast.parentNode) toast.remove();
141
- if (container && container.classList.contains('toast-container') && container.children.length === 0) container.remove();
142
- }, 300);
143
- }
144
- }
145
- function removeAllToasts() {
146
- document.querySelectorAll('.toast-container').forEach(function(c) {
147
- c.querySelectorAll('.alert').forEach(function(t) {
148
- t.style.opacity = '0';
149
- t.style.transform = 'translateY(-10px)';
150
- });
151
- setTimeout(function() { c.remove(); }, 300);
152
- });
153
- }
154
- window.showToast = showToast;
155
- window.removeToast = removeToast;
156
- window.removeAllToasts = removeAllToasts;
157
- })();
158
- </script>
159
47
  <link rel="stylesheet" href="{{LINK_HREF}}" />
160
48
  </head>
161
49
  <body>
@@ -277,13 +165,18 @@
277
165
  </div>
278
166
  </div>
279
167
 
168
+
169
+
170
+
171
+
172
+
280
173
  <main id="main-content" class="flex flex-col items-center justify-center text-center min-h-screen" style="padding: var(--spacing-12) var(--spacing-4); min-height: calc(100vh - 4rem);">
281
174
  <span class="badge badge--primary badge--sm mb-4">Vanilla JS + Rizzo CSS</span>
282
175
  <h1 style="font-size: clamp(2.5rem, 8vw, 4rem); font-weight: 800; line-height: 1.1; margin: 0 0 var(--spacing-4) 0; color: var(--text);">Build something great</h1>
283
176
  <p style="font-size: var(--font-size-xl); color: var(--text-dim); max-width: 42ch; margin: 0 0 var(--spacing-8) 0; line-height: var(--line-height-relaxed);">Same design system as Astro and Svelte — 14 themes, 24 components, full keyboard and screen reader support.</p>
284
177
  <div class="flex flex-wrap justify-center gap-4 mb-12">
285
- <a href="https://rizzo-css.vercel.app/docs/getting-started" class="btn btn-primary" target="_blank" rel="noopener noreferrer">Get started</a>
286
- <a href="https://rizzo-css.vercel.app/docs/components" class="btn btn-outline" target="_blank" rel="noopener noreferrer">Components</a>
178
+ <a href="components/index.html" class="btn btn-primary">Component showcase</a>
179
+ <a href="https://rizzo-css.vercel.app/docs/getting-started" class="btn btn-outline" target="_blank" rel="noopener noreferrer">Get started (docs)</a>
287
180
  <button type="button" class="btn btn-outline" onclick="window.showToast && window.showToast('Hello from Rizzo!', { variant: 'success' });">Show toast</button>
288
181
  </div>
289
182
  <div class="flex flex-wrap justify-center gap-3 mb-16">
@@ -292,174 +185,15 @@
292
185
  <span class="badge badge--info">WCAG AA</span>
293
186
  </div>
294
187
  <footer style="margin-top: auto; padding-top: var(--spacing-8); color: var(--text-dim); font-size: var(--font-size-sm);">
295
- <a href="https://rizzo-css.vercel.app" class="text-accent" style="color: var(--accent);">Rizzo CSS</a> — design system for the web
188
+ <a href="https://rizzo-css.vercel.app" style="color: var(--accent);">Rizzo CSS</a> — design system for the web. <a href="https://rizzo-css.vercel.app/docs" target="_blank" rel="noopener noreferrer">Full docs</a>.
296
189
  </footer>
297
190
  </main>
298
191
 
299
- <script>
300
- (function() {
301
- var KEY = 'theme';
302
- var defaultDark = 'github-dark-classic';
303
- var defaultLight = 'github-light';
304
- function resolveSystem() {
305
- return window.matchMedia('(prefers-color-scheme: dark)').matches ? defaultDark : defaultLight;
306
- }
307
- function applyTheme(value) {
308
- var effective = value === 'system' ? resolveSystem() : value;
309
- document.documentElement.setAttribute('data-theme', effective);
310
- try { localStorage.setItem(KEY, value); } catch (e) {}
311
- var headerSelect = document.getElementById('theme-select');
312
- var settingsSelect = document.getElementById('settings-theme');
313
- if (headerSelect && headerSelect.value !== value) headerSelect.value = value;
314
- if (settingsSelect && settingsSelect.value !== value) settingsSelect.value = value;
315
- try { window.dispatchEvent(new CustomEvent('rizzo-theme-change', { detail: { themeValue: value, effective: effective } })); } catch (e) {}
316
- }
317
- function syncSelects() {
318
- var stored = null;
319
- try { stored = localStorage.getItem(KEY); } catch (e) {}
320
- var value = stored || 'system';
321
- var headerSelect = document.getElementById('theme-select');
322
- var settingsSelect = document.getElementById('settings-theme');
323
- if (headerSelect) headerSelect.value = value;
324
- if (settingsSelect) settingsSelect.value = value;
325
- }
326
- var headerSelect = document.getElementById('theme-select');
327
- var settingsSelect = document.getElementById('settings-theme');
328
- if (headerSelect) headerSelect.addEventListener('change', function() { applyTheme(headerSelect.value); });
329
- if (settingsSelect) settingsSelect.addEventListener('change', function() { applyTheme(settingsSelect.value); });
330
- syncSelects();
331
- window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function() {
332
- if ((localStorage.getItem(KEY) || 'system') === 'system') applyTheme('system');
333
- });
334
- })();
335
- </script>
336
- <script>
337
- (function initSettings() {
338
- var settings = document.querySelector('[data-settings]');
339
- if (!settings) return;
340
- var overlay = settings.querySelector('[data-settings-overlay]');
341
- var panel = settings.querySelector('.settings__panel');
342
- var closeBtn = settings.querySelector('[data-settings-close]');
343
- var fontSizeSlider = settings.querySelector('[data-font-size-slider]');
344
- var fontSizeValue = settings.querySelector('[data-font-size-value]');
345
- var reducedMotion = settings.querySelector('[data-reduced-motion]');
346
- var highContrast = settings.querySelector('[data-high-contrast]');
347
- var scrollbarStyleRadios = settings.querySelectorAll('[data-scrollbar-style]');
348
- var html = document.documentElement;
349
- if (!panel || !overlay || !closeBtn) return;
350
- function updateSliderProgress(slider) {
351
- var min = parseFloat(slider.min), max = parseFloat(slider.max), value = parseFloat(slider.value);
352
- slider.style.setProperty('--slider-progress', ((value - min) / (max - min)) * 100 + '%');
353
- }
354
- function applyFontSize(scale) {
355
- html.style.setProperty('--font-size-scale', scale);
356
- if (fontSizeValue) fontSizeValue.textContent = Math.round(scale * 100) + '%';
357
- }
358
- function applyScrollbarStyle(style) {
359
- html.classList.remove('scrollbar-thin', 'scrollbar-thick', 'scrollbar-hidden', 'hide-scrollbars');
360
- if (style === 'thick') html.classList.add('scrollbar-thick');
361
- else if (style === 'hidden') html.classList.add('scrollbar-hidden', 'hide-scrollbars');
362
- }
363
- function loadSettings() {
364
- var saved = localStorage.getItem('fontSizeScale');
365
- if (saved && fontSizeSlider) {
366
- fontSizeSlider.value = saved;
367
- applyFontSize(parseFloat(saved));
368
- }
369
- if (fontSizeSlider) updateSliderProgress(fontSizeSlider);
370
- if (reducedMotion) {
371
- reducedMotion.checked = localStorage.getItem('reducedMotion') === 'true';
372
- html.classList.toggle('reduced-motion', reducedMotion.checked);
373
- }
374
- if (highContrast) {
375
- highContrast.checked = localStorage.getItem('highContrast') === 'true';
376
- html.classList.toggle('high-contrast', highContrast.checked);
377
- }
378
- var scrollbar = localStorage.getItem('scrollbarStyle') || 'thin';
379
- for (var i = 0; i < scrollbarStyleRadios.length; i++) {
380
- if (scrollbarStyleRadios[i].value === scrollbar) scrollbarStyleRadios[i].checked = true;
381
- }
382
- applyScrollbarStyle(scrollbar);
383
- }
384
- function getFocusable(container) {
385
- var sel = 'button:not([disabled]),a[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])';
386
- return Array.prototype.slice.call(container.querySelectorAll(sel));
387
- }
388
- var previousActive = null;
389
- function openSettings() {
390
- previousActive = document.activeElement;
391
- settings.setAttribute('aria-hidden', 'false');
392
- overlay.setAttribute('aria-hidden', 'false');
393
- panel.setAttribute('aria-hidden', 'false');
394
- panel.removeAttribute('data-open');
395
- void panel.offsetHeight;
396
- requestAnimationFrame(function() {
397
- requestAnimationFrame(function() {
398
- panel.setAttribute('data-open', 'true');
399
- if (closeBtn) closeBtn.focus();
400
- });
401
- });
402
- }
403
- function closeSettings() {
404
- panel.removeAttribute('data-open');
405
- var duration = window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 0 : 300;
406
- setTimeout(function() {
407
- settings.setAttribute('aria-hidden', 'true');
408
- overlay.setAttribute('aria-hidden', 'true');
409
- panel.setAttribute('aria-hidden', 'true');
410
- if (previousActive) {
411
- previousActive.focus();
412
- previousActive = null;
413
- }
414
- }, duration);
415
- }
416
- closeBtn.addEventListener('click', closeSettings);
417
- overlay.addEventListener('click', closeSettings);
418
- document.addEventListener('keydown', function(e) {
419
- if (panel.getAttribute('data-open') !== 'true') return;
420
- if (e.key === 'Escape') { e.preventDefault(); closeSettings(); return; }
421
- if (e.key === 'Tab') {
422
- var els = getFocusable(panel);
423
- if (els.length === 0) return;
424
- var first = els[0], last = els[els.length - 1], active = document.activeElement;
425
- if (e.shiftKey) {
426
- if (active === first || !panel.contains(active)) { e.preventDefault(); last.focus(); }
427
- } else {
428
- if (active === last || !panel.contains(active)) { e.preventDefault(); first.focus(); }
429
- }
430
- }
431
- });
432
- if (fontSizeSlider) {
433
- fontSizeSlider.addEventListener('input', function() {
434
- var scale = parseFloat(this.value);
435
- applyFontSize(scale);
436
- updateSliderProgress(this);
437
- localStorage.setItem('fontSizeScale', scale);
438
- });
439
- }
440
- if (reducedMotion) {
441
- reducedMotion.addEventListener('change', function() {
442
- html.classList.toggle('reduced-motion', this.checked);
443
- localStorage.setItem('reducedMotion', this.checked);
444
- });
445
- }
446
- if (highContrast) {
447
- highContrast.addEventListener('change', function() {
448
- html.classList.toggle('high-contrast', this.checked);
449
- localStorage.setItem('highContrast', this.checked);
450
- });
451
- }
452
- for (var j = 0; j < scrollbarStyleRadios.length; j++) {
453
- scrollbarStyleRadios[j].addEventListener('change', function() {
454
- if (this.checked) {
455
- applyScrollbarStyle(this.value);
456
- localStorage.setItem('scrollbarStyle', this.value);
457
- }
458
- });
459
- }
460
- loadSettings();
461
- window.openSettings = openSettings;
462
- })();
463
- </script>
192
+
193
+
194
+
195
+
196
+
197
+ <script src="js/main.js"></script>
464
198
  </body>
465
199
  </html>