rizzo-css 0.0.7 → 0.0.8

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.
package/README.md CHANGED
@@ -41,7 +41,7 @@ import 'rizzo-css';
41
41
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/rizzo-css@latest" />
42
42
  ```
43
43
 
44
- Use the same class names and HTML structure as in the [component docs](https://rizzo-css.vercel.app/docs/components). **Vanilla JS**, Astro, and Svelte all use the same CSS and BEM markup; Astro/Svelte add framework component files for convenience.
44
+ Use the same class names and HTML structure as in the [component docs](https://rizzo-css.vercel.app/docs/components). **Vanilla JS**, Astro, and Svelte all use the same CSS and BEM markup; Astro/Svelte add framework component files for convenience. The **Vanilla** scaffold includes a full Settings panel and toast; **Astro** and **Svelte** scaffold layouts include theme persistence and toast (`showToast`, `removeToast`, `removeAllToasts`).
45
45
 
46
46
  ## Themes
47
47
 
package/bin/rizzo-css.js CHANGED
@@ -154,13 +154,28 @@ function selectMenu(options, title) {
154
154
  });
155
155
  }
156
156
 
157
- /** Multi-select menu: circles ○/●, Space toggles, Enter confirms. Returns array of selected values. */
157
+ /** Index of first "real" option when using all/none sentinels (0=Select all, 1=Select none, 2+=real). */
158
+ const SENTINEL_ALL = '__all__';
159
+ const SENTINEL_NONE = '__none__';
160
+
161
+ function hasAllNoneSentinels(items) {
162
+ return items.length >= 2 && items[0].value === SENTINEL_ALL && items[1].value === SENTINEL_NONE;
163
+ }
164
+
165
+ function getRealValues(items) {
166
+ if (hasAllNoneSentinels(items)) return items.slice(2).map((i) => i.value);
167
+ return items.map((i) => i.value);
168
+ }
169
+
170
+ /** Multi-select menu: circles ○/●, Space toggles, Enter confirms. Optional first two options: Select all / Select none (value __all__ / __none__). Returns array of selected values. */
158
171
  function multiSelectMenu(options, title) {
159
172
  const items = options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o));
160
173
  const isTty = process.stdin.isTTY && process.stdout.isTTY;
174
+ const withSentinels = hasAllNoneSentinels(items);
175
+ const realValues = getRealValues(items);
161
176
 
162
177
  if (!isTty) {
163
- console.log('\n' + (title || 'Choose (space to toggle, enter when done') + ':');
178
+ console.log('\n' + (title || 'Choose (space to toggle, enter when done)') + ':');
164
179
  items.forEach((item, i) => console.log(' ' + (i + 1) + '. ' + (item.label || item.value)));
165
180
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
166
181
  return new Promise((resolve) => {
@@ -168,7 +183,15 @@ function multiSelectMenu(options, title) {
168
183
  rl.close();
169
184
  const s = (answer || '').trim().toLowerCase();
170
185
  if (s === 'all' || s === 'a') {
171
- resolve(items.map((i) => i.value));
186
+ resolve(realValues);
187
+ return;
188
+ }
189
+ if (withSentinels && s === '1') {
190
+ resolve(realValues);
191
+ return;
192
+ }
193
+ if (withSentinels && (s === '2' || s === 'none' || s === 'n')) {
194
+ resolve([]);
172
195
  return;
173
196
  }
174
197
  const parts = s.split(/[\s,]+/).filter(Boolean);
@@ -177,7 +200,19 @@ function multiSelectMenu(options, title) {
177
200
  const n = parseInt(p, 10);
178
201
  if (n >= 1 && n <= items.length) indices.add(n - 1);
179
202
  }
180
- resolve(Array.from(indices).sort((a, b) => a - b).map((i) => items[i].value));
203
+ if (withSentinels && indices.has(0)) {
204
+ resolve(realValues);
205
+ return;
206
+ }
207
+ if (withSentinels && indices.has(1)) {
208
+ resolve([]);
209
+ return;
210
+ }
211
+ const result = Array.from(indices)
212
+ .sort((a, b) => a - b)
213
+ .filter((i) => !withSentinels || (i !== 0 && i !== 1))
214
+ .map((i) => items[i].value);
215
+ resolve(result);
181
216
  });
182
217
  });
183
218
  }
@@ -186,11 +221,30 @@ function multiSelectMenu(options, title) {
186
221
  let index = 0;
187
222
  const selected = new Set();
188
223
  const lineCount = (title ? 1 : 0) + items.length + 1;
224
+ const realStart = withSentinels ? 2 : 0;
225
+
226
+ const finish = () => {
227
+ if (withSentinels && index === 0) {
228
+ resolve(realValues);
229
+ return;
230
+ }
231
+ if (withSentinels && index === 1) {
232
+ resolve([]);
233
+ return;
234
+ }
235
+ resolve(
236
+ Array.from(selected)
237
+ .filter((i) => i >= realStart)
238
+ .sort((a, b) => a - b)
239
+ .map((i) => items[i].value)
240
+ );
241
+ };
189
242
 
190
243
  const render = (first) => {
191
244
  const lines = (title ? [title] : []).concat(
192
245
  items.map((item, i) => {
193
- const circle = selected.has(i) ? CIRCLE_FILLED : CIRCLE_EMPTY;
246
+ const isAction = withSentinels && (i === 0 || i === 1);
247
+ const circle = isAction ? CIRCLE_EMPTY : selected.has(i) ? CIRCLE_FILLED : CIRCLE_EMPTY;
194
248
  const prefix = i === index ? C.cyan + '>' + C.reset + ' ' : ' ';
195
249
  return prefix + circle + formatLabel(item);
196
250
  })
@@ -222,25 +276,36 @@ function multiSelectMenu(options, title) {
222
276
  process.stdin.removeListener('data', onData);
223
277
  process.stdin.pause();
224
278
  process.stdout.write('\n');
225
- resolve(Array.from(selected).sort((a, b) => a - b).map((i) => items[i].value));
279
+ if (withSentinels && (index === 0 || index === 1)) {
280
+ if (index === 0) resolve(realValues);
281
+ else resolve([]);
282
+ } else {
283
+ finish();
284
+ }
226
285
  return;
227
286
  }
228
287
  if (ch === ' ') {
229
288
  buf = '';
230
- if (selected.has(index)) selected.delete(index);
231
- else selected.add(index);
289
+ if (withSentinels && index === 0) {
290
+ for (let i = realStart; i < items.length; i++) selected.add(i);
291
+ } else if (withSentinels && index === 1) {
292
+ for (let i = realStart; i < items.length; i++) selected.delete(i);
293
+ } else {
294
+ if (selected.has(index)) selected.delete(index);
295
+ else selected.add(index);
296
+ }
232
297
  render(false);
233
298
  return;
234
299
  }
235
300
  if (ch === 'a' || ch === 'A') {
236
301
  buf = '';
237
- for (let i = 0; i < items.length; i++) selected.add(i);
302
+ for (let i = realStart; i < items.length; i++) selected.add(i);
238
303
  render(false);
239
304
  return;
240
305
  }
241
306
  if (ch === 'n' || ch === 'N') {
242
307
  buf = '';
243
- selected.clear();
308
+ for (let i = realStart; i < items.length; i++) selected.delete(i);
244
309
  render(false);
245
310
  return;
246
311
  }
@@ -533,8 +598,12 @@ async function runAddToExisting() {
533
598
  const framework = await selectMenu(frameworkOptions, frameworkPrompt);
534
599
 
535
600
  const selectedThemes = await multiSelectMenu(
536
- THEMES.map((t) => ({ value: t, label: t })),
537
- '? Themes (Space to toggle, Enter to confirm) — we\'ll suggest the first as default data-theme'
601
+ [
602
+ { value: SENTINEL_ALL, label: 'Select all themes' },
603
+ { value: SENTINEL_NONE, label: 'Select no themes' },
604
+ ...THEMES.map((t) => ({ value: t, label: t })),
605
+ ],
606
+ '? Themes — pick individuals (Space to toggle) or choose Select all/none below. Enter=confirm'
538
607
  );
539
608
  const themeList = selectedThemes.length > 0 ? selectedThemes : [THEMES[0]];
540
609
  const suggestedTheme = THEMES.includes(themeList[0]) ? themeList[0] : THEMES[0];
@@ -552,8 +621,12 @@ async function runAddToExisting() {
552
621
  );
553
622
  if (includeChoice === 'pick') {
554
623
  selectedComponents = await multiSelectMenu(
555
- componentList.map((c) => ({ value: c, label: c })),
556
- '? Components (Space to toggle, Enter to confirm)'
624
+ [
625
+ { value: SENTINEL_ALL, label: 'Select all components' },
626
+ { value: SENTINEL_NONE, label: 'Select no components' },
627
+ ...componentList.map((c) => ({ value: c, label: c })),
628
+ ],
629
+ '? Components — pick individuals (Space to toggle) or choose Select all/none below. Enter=confirm'
557
630
  );
558
631
  }
559
632
  }
@@ -635,8 +708,12 @@ async function cmdInit() {
635
708
  );
636
709
 
637
710
  const selectedThemes = await multiSelectMenu(
638
- THEMES.map((t) => ({ value: t, label: t })),
639
- '? Themes (Space to toggle, Enter to confirm)'
711
+ [
712
+ { value: SENTINEL_ALL, label: 'Select all themes' },
713
+ { value: SENTINEL_NONE, label: 'Select no themes' },
714
+ ...THEMES.map((t) => ({ value: t, label: t })),
715
+ ],
716
+ '? Themes — pick individuals (Space to toggle) or choose Select all/none below. Enter=confirm'
640
717
  );
641
718
  const themeList = selectedThemes.length > 0 ? selectedThemes : [THEMES[0]];
642
719
  const theme = THEMES.includes(themeList[0]) ? themeList[0] : THEMES[0];
@@ -654,8 +731,12 @@ async function cmdInit() {
654
731
  );
655
732
  if (includeChoice === 'pick') {
656
733
  selectedComponents = await multiSelectMenu(
657
- componentList.map((c) => ({ value: c, label: c })),
658
- '? Components (Space to toggle, Enter to confirm)'
734
+ [
735
+ { value: SENTINEL_ALL, label: 'Select all components' },
736
+ { value: SENTINEL_NONE, label: 'Select no components' },
737
+ ...componentList.map((c) => ({ value: c, label: c })),
738
+ ],
739
+ '? Components — pick individuals (Space to toggle) or choose Select all/none below. Enter=confirm'
659
740
  );
660
741
  }
661
742
  }
@@ -133,5 +133,5 @@ div.navbar__link{background:none;border:none;cursor:pointer;font:inherit;text-al
133
133
  .accordion__panel-content :global(ol:first-child),.accordion__panel-content :global(p:first-child),
134
134
  .accordion__panel-content :global(ul:first-child){margin-top:0}
135
135
  .accordion__panel-content :global(ol:last-child),.accordion__panel-content :global(p:last-child),
136
- .accordion__panel-content :global(ul:last-child){margin-bottom:0}.accordion__slot-content{display:none}.tabs{width:100%}.tabs__list{border-bottom:var(--outline-width) solid var(--border);display:flex;gap:var(--spacing-1);margin-bottom:var(--spacing-6);overflow-x:auto;scrollbar-width:thin;-webkit-overflow-scrolling:touch}.tabs__list::-webkit-scrollbar{height:var(--spacing-0-125)}.tabs__list::-webkit-scrollbar-track{background:var(--background-alt)}.tabs__list::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius)}.tabs__tab{align-items:center;background:transparent;border:none;border-bottom:calc(var(--outline-width)*2) solid transparent;border-radius:var(--radius-md) var(--radius-md) 0 0;color:var(--text-dim);cursor:pointer;display:inline-flex;font-family:var(--font-family);font-size:var(--font-size-base);font-weight:var(--font-weight-medium);justify-content:center;margin-bottom:calc(var(--outline-width)*-1*2);min-height:var(--touch-target-min);outline:none;padding:var(--spacing-3) var(--spacing-5);position:relative;transition:color var(--transition-base),border-color var(--transition-base),background-color var(--transition-base);white-space:nowrap}.tabs__tab:hover:not(.tabs__tab--active){background-color:var(--background-alt);color:var(--text)}.tabs__tab:focus-visible{border-radius:var(--radius-md) var(--radius-md) 0 0;outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.tabs__tab--active{border-bottom-color:var(--accent);border-bottom-width:calc(var(--outline-width)*3);font-weight:var(--font-weight-semibold)}.tabs__tab--active,.tabs__tab--active:hover{background-color:var(--background-alt);color:var(--accent)}.tabs__tab--active:hover{border-bottom-color:var(--accent)}.tabs__panels-wrapper{width:100%}.tabs__panel{display:none;min-height:var(--spacing-20);padding:var(--spacing-6) 0;width:100%}.tabs__panel--active{animation:fadeIn var(--transition-base);display:block}.tabs__panel-content{width:100%}@keyframes fade-in{from{opacity:0;transform:translateY(var(--spacing-1))}to{opacity:1;transform:translateY(0)}}.tabs__slot-content{display:none}.tabs--pills .tabs__list{border-bottom:none;gap:var(--spacing-2)}.tabs--pills .tabs__tab{border-bottom:none;border-radius:var(--radius-md);margin-bottom:0}.tabs--pills .tabs__tab--active{background-color:var(--accent);border-bottom-color:transparent;color:var(--accent-text)}.tabs--pills .tabs__tab--active:hover{background-color:var(--accent-hover);color:var(--accent-text)}.tabs--underline .tabs__list{border-bottom:var(--outline-width) solid var(--border)}.tabs--underline .tabs__tab{border-bottom:var(--outline-width) solid transparent;padding-bottom:var(--spacing-3)}.tabs--underline .tabs__tab--active{border-bottom-color:var(--accent);border-bottom-width:calc(var(--outline-width)*2)}@media (width <= 640px){.tabs__list{gap:var(--spacing-1)}.tabs__tab{font-size:var(--font-size-sm);padding:var(--spacing-2) var(--spacing-3)}.tabs__panel{padding:var(--spacing-3) 0}}@media (prefers-reduced-motion:reduce){.tabs__tab{transition:none}.tabs__panel--active{animation:none}}.progress{display:flex;flex-direction:column;gap:var(--spacing-2);width:100%}.progress__track{background-color:var(--background-alt);border:var(--border-width) solid var(--border);overflow:hidden;width:100%}.progress__bar,.progress__track{border-radius:var(--radius-full)}.progress__bar{flex-shrink:0;height:100%;min-height:var(--spacing-2);transition:width var(--transition-slow) var(--ease-in-out-cubic)}.progress--sm .progress__track{height:var(--spacing-1)}.progress--sm .progress__bar{min-height:var(--spacing-1)}.progress--md .progress__track{height:var(--spacing-2)}.progress--md .progress__bar{min-height:var(--spacing-2)}.progress--lg .progress__track{height:var(--spacing-3)}.progress--lg .progress__bar{min-height:var(--spacing-3)}.progress--primary .progress__bar{background-color:var(--accent)}.progress--success .progress__bar{background-color:var(--success)}.progress--warning .progress__bar{background-color:var(--warning)}.progress--error .progress__bar{background-color:var(--error)}.progress--info .progress__bar{background-color:var(--info)}.progress__label{color:var(--text-dim);font-size:var(--font-size-sm);text-align:right}.progress--indeterminate .progress__bar{animation:progress-indeterminate 1.5s ease-in-out infinite;min-width:30%;width:30%!important}@keyframes progress-indeterminate{0%{transform:translateX(-100%)}100%{transform:translateX(233.333%)}}@media (prefers-reduced-motion:reduce){.progress__bar{transition:none}.progress--indeterminate .progress__bar{animation:none;opacity:.7;width:50%!important}}.spinner{align-items:center;display:inline-flex;justify-content:center;vertical-align:middle}.spinner__ring{animation:spinner-rotate .8s linear infinite;border-color:var(--border);border-radius:var(--radius-full);border-style:solid;border-top-color:currentcolor;display:block}.spinner--sm .spinner__ring{border-width:var(--border-width-2);height:var(--spacing-4);width:var(--spacing-4)}.spinner--md .spinner__ring{border-width:var(--border-width-3);height:var(--spacing-6);width:var(--spacing-6)}.spinner--lg .spinner__ring{border-width:var(--border-width-4);height:var(--spacing-8);width:var(--spacing-8)}.spinner--primary{color:var(--accent)}.spinner--success{color:var(--success)}.spinner--warning{color:var(--warning)}.spinner--error{color:var(--error)}.spinner--info{color:var(--info)}@keyframes spinner-rotate{to{transform:rotate(1turn)}}@media (prefers-reduced-motion:reduce){.spinner__ring{animation:none;border-bottom-color:transparent;border-left-color:transparent;border-right-color:transparent}}.avatar{align-items:center;background-color:var(--background-alt);border:var(--border-width) solid var(--border);color:var(--text-dim);display:inline-flex;flex-shrink:0;font-size:inherit;font-weight:var(--font-weight-semibold);justify-content:center;line-height:1;overflow:hidden}.avatar__img{display:block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.avatar__initials{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.avatar--sm{font-size:var(--font-size-xs);height:var(--spacing-8);width:var(--spacing-8)}.avatar--md{font-size:var(--font-size-sm);height:var(--spacing-10);width:var(--spacing-10)}.avatar--lg{font-size:var(--font-size-base);height:var(--spacing-12);width:var(--spacing-12)}.avatar--circle{border-radius:var(--radius-full)}.avatar--square{border-radius:var(--radius-md)}.divider{align-items:center;color:var(--text-dim);display:flex;font-size:var(--font-size-sm);gap:var(--spacing-3)}.divider__line{border:none;border-left:none;border-top:var(--border-width) solid var(--border);flex:1;min-height:0;min-width:0}.divider__label{flex-shrink:0;padding:0 var(--spacing-2);white-space:nowrap}.divider--horizontal{width:100%}.divider--horizontal .divider__line{border-left:none;border-top:var(--border-width) solid var(--border)}.divider--vertical{flex-direction:column;height:100%;min-height:var(--spacing-8);width:auto}.divider--vertical .divider__line{border-left:var(--border-width) solid var(--border);border-top:none;flex:1;min-height:var(--spacing-4);width:0}.table{display:flex;flex-direction:column;gap:var(--spacing-3);width:100%}.table__filter-wrap{align-items:center;display:flex;flex-shrink:0;position:relative}.table__filter-icon{align-items:center;color:var(--icon-dim);display:flex;justify-content:center;left:var(--spacing-3);pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.table__filter-icon-svg{color:currentcolor;height:var(--table-filter-icon-size,1.25rem);width:var(--table-filter-icon-size,1.25rem)}.table__filter-wrap:focus-within .table__filter-icon{color:var(--accent)}.table__filter-wrap .table__filter{background-color:var(--background);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);color:var(--text);font-family:var(--font-family);font-size:var(--font-size-base);max-width:var(--spacing-80);padding-bottom:var(--spacing-2);padding-left:3.5rem;padding-right:var(--spacing-3);padding-top:var(--spacing-2);width:100%}.table__filter-wrap .table__filter::-moz-placeholder{color:var(--text-dim)}.table__filter-wrap .table__filter::placeholder{color:var(--text-dim)}.table__filter-wrap .table__filter:focus{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.table__wrapper{overflow-x:auto;-webkit-overflow-scrolling:touch}.table__table{border-collapse:collapse;border-spacing:0;font-size:var(--font-size-sm);width:100%}.table__caption{color:var(--text);font-weight:var(--font-weight-semibold);padding:var(--spacing-2) 0;text-align:left}.table__head .table__row{border-bottom:var(--border-width-2) solid var(--border)}.table__cell{border-bottom:var(--border-width) solid var(--border);color:var(--text);padding:var(--spacing-3) var(--spacing-4);text-align:left}.table__cell--head{color:var(--text);font-weight:var(--font-weight-semibold);white-space:nowrap}.table__sort-trigger{align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;border-radius:var(--radius-md);color:var(--text);cursor:pointer;display:inline-flex;font:inherit;font-weight:var(--font-weight-semibold);padding:0;text-align:left;transition:background-color var(--transition-fast),color var(--transition-fast);width:100%}.table__sort-trigger:hover{background-color:var(--background-alt);color:var(--text)}.table__sort-trigger:hover .table__sort-icon-svg{color:var(--accent)}.table__sort-trigger:focus-visible{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.table--sortable .table__cell--head{padding:0}.table--sortable .table__cell--head .table__sort-trigger{padding:var(--spacing-3) var(--spacing-4)}.table__cell-content{display:inline-block}.table__sort-icon{align-items:center;display:inline-flex;flex-shrink:0;justify-content:center;margin-left:var(--spacing-2)}.table__sort-icon-svg{color:var(--icon-dim);height:var(--table-sort-icon-size,1.25rem);transition:color var(--transition-fast);width:var(--table-sort-icon-size,1.25rem)}.table__body .table__row:hover{background-color:var(--background-alt)}.table__body .table__row:hover .table__cell{color:var(--text)}.table--striped .table__body .table__row:nth-child(even){background-color:var(--background-alt)}.table--striped .table__body .table__row:nth-child(even):hover{background-color:var(--background)}.table--striped .table__body .table__row:nth-child(even):hover .table__cell{color:var(--text)}.table__body .table__row[hidden]{display:none}@media (prefers-reduced-motion:reduce){.table__sort-icon-svg,.table__sort-trigger{transition:none}}.home{padding:var(--spacing-8) var(--spacing-4)}.home__container{margin:0 auto;max-width:var(--container-default);padding:0 var(--spacing-4)}.home__hero{margin-bottom:var(--spacing-16);padding:var(--spacing-16) 0;text-align:center}.home__title{color:var(--text);font-size:var(--font-size-5xl);font-weight:var(--font-weight-extrabold);line-height:var(--line-height-tight);margin:0 0 var(--spacing-6) 0}.home__subtitle{color:var(--text-dim);font-size:var(--font-size-xl);line-height:var(--line-height-relaxed);margin:0 auto;max-width:var(--spacing-175)}.home__section-title{color:var(--text);font-size:var(--font-size-3xl);font-weight:var(--font-weight-bold);margin-bottom:var(--spacing-8);text-align:center}.home__grid{display:grid;gap:var(--spacing-6);grid-template-columns:repeat(auto-fit,minmax(var(--spacing-75),1fr));margin-bottom:var(--spacing-16)}.home__card{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);color:var(--text);padding:var(--spacing-6)}.home__card h3{color:var(--text);font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);margin:0 0 var(--spacing-3) 0}.home__card p{color:var(--text-dim);line-height:var(--line-height-relaxed);margin:0}.home__examples{margin-bottom:var(--spacing-16)}.home__example{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);margin-bottom:var(--spacing-8);padding:var(--spacing-8)}.home__example h3{color:var(--text);font-size:var(--font-size-xl);font-weight:var(--font-weight-semibold);margin:0 0 var(--spacing-4) 0}.home__example p{color:var(--text-dim);margin-bottom:var(--spacing-4)}.home__button-group{display:flex;flex-wrap:wrap;gap:var(--spacing-3)}.home__theme-demo{max-width:var(--spacing-75)}.home__theme-demo .theme-switcher{position:relative;width:100%;z-index:var(--z-dropdown)}.home__theme-demo .theme-switcher__menu{z-index:var(--z-dropdown)}.home__docs{margin-bottom:var(--spacing-8)}.home__docs-grid{display:grid;gap:var(--spacing-6);grid-template-columns:repeat(auto-fit,minmax(var(--spacing-70),1fr))}.home__doc-card{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);color:var(--text);display:block;padding:var(--spacing-6);text-decoration:none;transition:border-color var(--transition-base),transform var(--transition-base),box-shadow var(--transition-base)}.home__doc-card:hover{border-color:var(--accent);box-shadow:var(--shadow-md);transform:translateY(calc(var(--spacing-0-125)*-1))}.home__doc-card:focus-visible{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.home__doc-card h3{color:var(--accent);font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);margin:0 0 var(--spacing-2) 0}.home__doc-card p{color:var(--text-dim);line-height:var(--line-height-relaxed);margin:0}@media (width <= 640px){.home__title{font-size:var(--font-size-4xl)}.home__subtitle{font-size:var(--font-size-lg)}
136
+ .accordion__panel-content :global(ul:last-child){margin-bottom:0}.accordion__slot-content{display:none}.tabs{width:100%}.tabs__list{border-bottom:var(--outline-width) solid var(--border);display:flex;gap:var(--spacing-1);margin-bottom:var(--spacing-6);overflow-x:auto;scrollbar-width:thin;-webkit-overflow-scrolling:touch}.tabs__list::-webkit-scrollbar{height:var(--spacing-0-125)}.tabs__list::-webkit-scrollbar-track{background:var(--background-alt)}.tabs__list::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius)}.tabs__tab{align-items:center;background:transparent;border:none;border-bottom:calc(var(--outline-width)*2) solid transparent;border-radius:var(--radius-md) var(--radius-md) 0 0;color:var(--text-dim);cursor:pointer;display:inline-flex;font-family:var(--font-family);font-size:var(--font-size-base);font-weight:var(--font-weight-medium);justify-content:center;margin-bottom:calc(var(--outline-width)*-1*2);min-height:var(--touch-target-min);outline:none;padding:var(--spacing-3) var(--spacing-5);position:relative;transition:color var(--transition-base),border-color var(--transition-base),background-color var(--transition-base);white-space:nowrap}.tabs__tab:hover:not(.tabs__tab--active){background-color:var(--background-alt);color:var(--text)}.tabs__tab:focus-visible{border-radius:var(--radius-md) var(--radius-md) 0 0;outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.tabs__tab--active{border-bottom-color:var(--accent);border-bottom-width:calc(var(--outline-width)*3);font-weight:var(--font-weight-semibold)}.tabs__tab--active,.tabs__tab--active:hover{background-color:var(--background-alt);color:var(--accent)}.tabs__tab--active:hover{border-bottom-color:var(--accent)}.tabs__panels-wrapper{width:100%}.tabs__panel{display:none;min-height:var(--spacing-20);padding:var(--spacing-6) 0;width:100%}.tabs__panel--active{animation:fadeIn var(--transition-base);display:block}.tabs__panel-content{width:100%}@keyframes fade-in{from{opacity:0;transform:translateY(var(--spacing-1))}to{opacity:1;transform:translateY(0)}}.tabs__slot-content{display:none}.tabs--pills .tabs__list{border-bottom:none;gap:var(--spacing-2)}.tabs--pills .tabs__tab{border-bottom:none;border-radius:var(--radius-md);margin-bottom:0}.tabs--pills .tabs__tab--active{background-color:var(--accent);border-bottom-color:transparent;color:var(--accent-text)}.tabs--pills .tabs__tab--active:hover{background-color:var(--accent-hover);color:var(--accent-text)}.tabs--underline .tabs__list{border-bottom:var(--outline-width) solid var(--border)}.tabs--underline .tabs__tab{border-bottom:var(--outline-width) solid transparent;padding-bottom:var(--spacing-3)}.tabs--underline .tabs__tab--active{border-bottom-color:var(--accent);border-bottom-width:calc(var(--outline-width)*2)}@media (width <= 640px){.tabs__list{gap:var(--spacing-1)}.tabs__tab{font-size:var(--font-size-sm);padding:var(--spacing-2) var(--spacing-3)}.tabs__panel{padding:var(--spacing-3) 0}}@media (prefers-reduced-motion:reduce){.tabs__tab{transition:none}.tabs__panel--active{animation:none}}.progress{display:flex;flex-direction:column;gap:var(--spacing-2);width:100%}.progress__track{background-color:var(--background-alt);border:var(--border-width) solid var(--border);overflow:hidden;width:100%}.progress__bar,.progress__track{border-radius:var(--radius-full)}.progress__bar{flex-shrink:0;height:100%;min-height:var(--spacing-2);transition:width var(--transition-slow) var(--ease-in-out-cubic)}.progress--sm .progress__track{height:var(--spacing-1)}.progress--sm .progress__bar{min-height:var(--spacing-1)}.progress--md .progress__track{height:var(--spacing-2)}.progress--md .progress__bar{min-height:var(--spacing-2)}.progress--lg .progress__track{height:var(--spacing-3)}.progress--lg .progress__bar{min-height:var(--spacing-3)}.progress--primary .progress__bar{background-color:var(--accent)}.progress--success .progress__bar{background-color:var(--success)}.progress--warning .progress__bar{background-color:var(--warning)}.progress--error .progress__bar{background-color:var(--error)}.progress--info .progress__bar{background-color:var(--info)}.progress__label{color:var(--text-dim);font-size:var(--font-size-sm);text-align:right}.progress--indeterminate .progress__bar{animation:progress-indeterminate 1.5s ease-in-out infinite;min-width:30%;width:30%!important}@keyframes progress-indeterminate{0%{transform:translateX(-100%)}100%{transform:translateX(233.333%)}}@media (prefers-reduced-motion:reduce){.progress__bar{transition:none}.progress--indeterminate .progress__bar{animation:none;opacity:.7;width:50%!important}}.spinner{align-items:center;display:inline-flex;justify-content:center;vertical-align:middle}.spinner__ring{animation:spinner-rotate .8s linear infinite;border-color:var(--border);border-radius:var(--radius-full);border-style:solid;border-top-color:currentcolor;display:block}.spinner--sm .spinner__ring{border-width:var(--border-width-2);height:var(--spacing-4);width:var(--spacing-4)}.spinner--md .spinner__ring{border-width:var(--border-width-3);height:var(--spacing-6);width:var(--spacing-6)}.spinner--lg .spinner__ring{border-width:var(--border-width-4);height:var(--spacing-8);width:var(--spacing-8)}.spinner--primary{color:var(--accent)}.spinner--success{color:var(--success)}.spinner--warning{color:var(--warning)}.spinner--error{color:var(--error)}.spinner--info{color:var(--info)}@keyframes spinner-rotate{to{transform:rotate(1turn)}}@media (prefers-reduced-motion:reduce){.spinner__ring{animation:none;border-bottom-color:transparent;border-left-color:transparent;border-right-color:transparent}}.avatar{align-items:center;background-color:var(--background-alt);border:var(--border-width) solid var(--border);color:var(--text-dim);display:inline-flex;flex-shrink:0;font-size:inherit;font-weight:var(--font-weight-semibold);justify-content:center;line-height:1;overflow:hidden}.avatar__img{display:block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.avatar__initials{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.avatar--sm{font-size:var(--font-size-xs);height:var(--spacing-8);width:var(--spacing-8)}.avatar--md{font-size:var(--font-size-sm);height:var(--spacing-10);width:var(--spacing-10)}.avatar--lg{font-size:var(--font-size-base);height:var(--spacing-12);width:var(--spacing-12)}.avatar--circle{border-radius:var(--radius-full)}.avatar--square{border-radius:var(--radius-md)}.divider{align-items:center;color:var(--text-dim);display:flex;font-size:var(--font-size-sm);gap:var(--spacing-3)}.divider__line{border:none;border-left:none;border-top:var(--border-width) solid var(--border);flex:1;min-height:0;min-width:0}.divider__label{flex-shrink:0;padding:0 var(--spacing-2);white-space:nowrap}.divider--horizontal{width:100%}.divider--horizontal .divider__line{border-left:none;border-top:var(--border-width) solid var(--border)}.divider--vertical{flex-direction:column;height:100%;min-height:var(--spacing-8);width:auto}.divider--vertical .divider__line{border-left:var(--border-width) solid var(--border);border-top:none;flex:1;min-height:var(--spacing-4);width:0}.table{display:flex;flex-direction:column;gap:var(--spacing-3);width:100%}.table__filter-wrap{align-items:center;display:flex;flex-shrink:0;position:relative}.table__filter-icon{align-items:center;color:var(--icon-dim);display:flex;justify-content:center;left:var(--spacing-3);pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.table__filter-icon-svg{color:currentcolor;height:var(--table-filter-icon-size,1.25rem);width:var(--table-filter-icon-size,1.25rem)}.table__filter-wrap:focus-within .table__filter-icon{color:var(--accent)}.table__filter-wrap .table__filter{background-color:var(--background);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);color:var(--text);font-family:var(--font-family);font-size:var(--font-size-base);max-width:var(--spacing-80);padding-bottom:var(--spacing-2);padding-left:3.5rem;padding-right:var(--spacing-3);padding-top:var(--spacing-2);width:100%}.table__filter-wrap .table__filter::-moz-placeholder{color:var(--text-dim)}.table__filter-wrap .table__filter::placeholder{color:var(--text-dim)}.table__filter-wrap .table__filter:focus{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.table__wrapper{overflow-x:auto;-webkit-overflow-scrolling:touch}.table__table{border-collapse:collapse;border-spacing:0;font-size:var(--font-size-sm);width:100%}.table__caption{color:var(--text);font-weight:var(--font-weight-semibold);padding:var(--spacing-2) 0;text-align:left}.table__head .table__row{border-bottom:var(--border-width-2) solid var(--border)}.table__cell{border-bottom:var(--border-width) solid var(--border);color:var(--text);padding:var(--spacing-3) var(--spacing-4);text-align:left}.table__cell--head{color:var(--text);font-weight:var(--font-weight-semibold);white-space:nowrap}.table__sort-trigger{align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;border-radius:var(--radius-md);color:var(--text);cursor:pointer;display:inline-flex;font:inherit;font-weight:var(--font-weight-semibold);padding:0;text-align:left;transition:background-color var(--transition-fast),color var(--transition-fast);width:100%}.table__sort-trigger:hover{background-color:var(--background-alt);color:var(--text)}.table__sort-trigger:hover .table__sort-icon-svg{color:var(--accent)}.table__sort-trigger:focus-visible{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.table--sortable .table__cell--head{padding:0}.table--sortable .table__cell--head .table__sort-trigger{padding:var(--spacing-3) var(--spacing-4)}.table__cell-content{display:inline-block}.table__sort-icon{align-items:center;display:inline-flex;flex-shrink:0;justify-content:center;margin-left:var(--spacing-2)}.table__sort-icon-svg{color:var(--icon-dim);height:var(--table-sort-icon-size,1.25rem);transition:color var(--transition-fast);width:var(--table-sort-icon-size,1.25rem)}.table__body .table__row:hover{background-color:var(--background-alt)}.table__body .table__row:hover .table__cell{color:var(--text)}.table--striped .table__body .table__row:nth-child(even){background-color:var(--background-alt)}.table--striped .table__body .table__row:nth-child(even):hover{background-color:var(--background)}.table--striped .table__body .table__row:nth-child(even):hover .table__cell{color:var(--text)}.table__body .table__row[hidden]{display:none}@media (prefers-reduced-motion:reduce){.table__sort-icon-svg,.table__sort-trigger{transition:none}}.home{padding:var(--spacing-8) var(--spacing-4)}.home__container{margin:0 auto;max-width:var(--container-default);padding:0 var(--spacing-4)}.home__hero{margin-bottom:var(--spacing-16);padding:var(--spacing-16) 0;text-align:center}.home__title{color:var(--text);font-size:var(--font-size-5xl);font-weight:var(--font-weight-extrabold);line-height:var(--line-height-tight);margin:0 0 var(--spacing-6) 0}.home__subtitle{color:var(--text-dim);font-size:var(--font-size-xl);line-height:var(--line-height-relaxed);margin:0 auto;max-width:var(--spacing-175)}.home__section-title{color:var(--text);font-size:var(--font-size-3xl);font-weight:var(--font-weight-bold);margin-bottom:var(--spacing-8);text-align:center}.home__install{margin-bottom:var(--spacing-16)}.home__install-grid{display:grid;gap:var(--spacing-6);grid-template-columns:repeat(auto-fit,minmax(min(100%,var(--spacing-100)),1fr));margin:0 auto;max-width:var(--spacing-175)}.home__install-block{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);padding:var(--spacing-5)}.home__install-label{color:var(--text-dim);font-size:var(--font-size-sm);margin:0 0 var(--spacing-3) 0}.home__install-copy{display:block;max-width:100%;width:100%}.home__install-copy .copy-to-clipboard__text{white-space:normal;word-break:break-all}.home__grid{display:grid;gap:var(--spacing-6);grid-template-columns:repeat(auto-fit,minmax(var(--spacing-75),1fr));margin-bottom:var(--spacing-16)}.home__card{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);color:var(--text);padding:var(--spacing-6)}.home__card h3{color:var(--text);font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);margin:0 0 var(--spacing-3) 0}.home__card p{color:var(--text-dim);line-height:var(--line-height-relaxed);margin:0}.home__examples{margin-bottom:var(--spacing-16)}.home__example{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);margin-bottom:var(--spacing-8);padding:var(--spacing-8)}.home__example h3{color:var(--text);font-size:var(--font-size-xl);font-weight:var(--font-weight-semibold);margin:0 0 var(--spacing-4) 0}.home__example p{color:var(--text-dim);margin-bottom:var(--spacing-4)}.home__button-group{display:flex;flex-wrap:wrap;gap:var(--spacing-3)}.home__theme-demo{max-width:var(--spacing-75)}.home__theme-demo .theme-switcher{position:relative;width:100%;z-index:var(--z-dropdown)}.home__theme-demo .theme-switcher__menu{z-index:var(--z-dropdown)}.home__docs{margin-bottom:var(--spacing-8)}.home__docs-grid{display:grid;gap:var(--spacing-6);grid-template-columns:repeat(auto-fit,minmax(var(--spacing-70),1fr))}.home__doc-card{background-color:var(--background-alt);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);color:var(--text);display:block;padding:var(--spacing-6);text-decoration:none;transition:border-color var(--transition-base),transform var(--transition-base),box-shadow var(--transition-base)}.home__doc-card:hover{border-color:var(--accent);box-shadow:var(--shadow-md);transform:translateY(calc(var(--spacing-0-125)*-1))}.home__doc-card:focus-visible{outline:var(--outline-width) solid var(--accent);outline-offset:var(--outline-offset)}.home__doc-card h3{color:var(--accent);font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);margin:0 0 var(--spacing-2) 0}.home__doc-card p{color:var(--text-dim);line-height:var(--line-height-relaxed);margin:0}@media (width <= 640px){.home__title{font-size:var(--font-size-4xl)}.home__subtitle{font-size:var(--font-size-lg)}
137
137
  .home__docs-grid,.home__grid{grid-template-columns:1fr}}.theming-page .card a{color:var(--text);text-decoration:none;transition:color var(--transition-base)}.theming-page .card a:hover{color:var(--accent)}.theming-page .card:hover{transform:translateY(calc(var(--spacing-0-125)*-1));transition:transform var(--transition-base)}.reduced-motion .theming-page .card:hover{transform:none}.theme-by{color:var(--text-dim);font-size:var(--font-size-sm);margin:0 0 var(--spacing-4) 0}.theme-by a{color:var(--accent);text-decoration:none;transition:color var(--transition-base)}.theme-by a:hover{color:var(--accent-hover);text-decoration:underline}[data-theme="github-dark-classic"]{--bg:oklch(18% 0.012 264deg);--bg-alt:oklch(15% 0.01 264deg);--current-line:oklch(20% 0.012 264deg);--selection:oklch(28% 0.08 255deg);--fg:oklch(91% 0.004 264deg);--fg-dim:oklch(66% 0.01 264deg);--comment:oklch(52% 0.015 264deg);--cyan:oklch(72% 0.12 250deg);--green:oklch(72% 0.19 145deg);--orange:oklch(78% 0.12 55deg);--pink:oklch(68% 0.14 15deg);--purple:oklch(68% 0.14 300deg);--red:oklch(68% 0.16 15deg);--yellow:oklch(88% 0.12 95deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--icon:var(--fg);--icon-dim:oklch(75% 0.01 264deg);--border:oklch(13% 0.01 264deg);--accent:var(--cyan);--accent-hover:oklch(78% 0.12 250deg);--accent-text:oklch(100% 0 0deg);--accent-text-on-hover:oklch(22% 0.03 250deg);--success:var(--green);--success-hover:oklch(78% 0.16 145deg);--success-text:oklch(100% 0 0deg);--success-text-on-solid:oklch(22% 0.03 145deg);--warning:var(--orange);--warning-hover:oklch(85% 0.1 55deg);--warning-text:oklch(100% 0 0deg);--warning-text-on-solid:oklch(22% 0.02 55deg);--error:var(--red);--error-hover:oklch(75% 0.14 15deg);--error-text:oklch(100% 0 0deg);--error-text-on-solid:oklch(22% 0.03 25deg);--info:var(--cyan);--info-hover:oklch(78% 0.1 250deg);--info-text:oklch(100% 0 0deg);--info-text-on-solid:oklch(22% 0.03 250deg)}[data-theme="shades-of-purple"]{--bg:oklch(18% 0.08 290deg);--bg-alt:oklch(15% 0.08 290deg);--current-line:oklch(25% 0.10 290deg);--selection:oklch(30% 0.12 290deg);--fg:oklch(95% 0.01 300deg);--fg-dim:oklch(75% 0.05 300deg);--comment:oklch(55.% 0.08 280deg);--cyan:oklch(75% 0.15 220deg);--green:oklch(70% 0.20 150deg);--orange:oklch(75% 0.18 60deg);--pink:oklch(75% 0.22 340deg);--purple:oklch(65% 0.25 290deg);--red:oklch(65% 0.22 25deg);--yellow:oklch(85% 0.18 100deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--icon:var(--fg);--icon-dim:oklch(80% 0.05 300deg);--border:var(--current-line);--accent:var(--purple);--accent-hover:var(--pink);--accent-text:oklch(100% 0 0deg);--accent-text-on-hover:oklch(22% 0.03 300deg);--success:var(--green);--success-hover:oklch(78% 0.16 145deg);--success-text:oklch(100% 0 0deg);--success-text-on-solid:oklch(22% 0.03 145deg);--warning:var(--yellow);--warning-hover:oklch(92% 0.1 95deg);--warning-text:oklch(100% 0 0deg);--warning-text-on-solid:oklch(22% 0.02 95deg);--error:var(--red);--error-hover:oklch(75% 0.14 15deg);--error-text:oklch(100% 0 0deg);--error-text-on-solid:oklch(22% 0.03 15deg);--info:var(--cyan);--info-hover:oklch(78% 0.1 250deg);--info-text:oklch(100% 0 0deg);--info-text-on-solid:oklch(22% 0.03 250deg)}[data-theme="sandstorm-classic"]{--bg:oklch(16% 0.025 25deg);--bg-alt:oklch(13% 0.02 25deg);--current-line:oklch(20% 0.025 25deg);--selection:oklch(28% 0.06 25deg);--fg:oklch(90% 0.01 25deg);--fg-dim:oklch(62% 0.02 25deg);--comment:oklch(52% 0.03 25deg);--cyan:oklch(68% 0.12 220deg);--green:oklch(68% 0.18 145deg);--orange:oklch(72% 0.14 55deg);--pink:oklch(65% 0.16 350deg);--purple:oklch(62% 0.14 300deg);--red:oklch(58% 0.18 25deg);--yellow:oklch(82% 0.12 95deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--icon:var(--fg);--icon-dim:oklch(72% 0.02 25deg);--border:oklch(22% 0.02 25deg);--accent:var(--red);--accent-hover:oklch(62% 0.16 25deg);--accent-text:oklch(100% 0 0deg);--accent-text-on-hover:oklch(22% 0.03 25deg);--success:var(--green);--success-hover:oklch(74% 0.16 145deg);--success-text:oklch(100% 0 0deg);--success-text-on-solid:oklch(22% 0.03 145deg);--warning:var(--orange);--warning-hover:oklch(78% 0.12 55deg);--warning-text:oklch(98% 0 0deg);--warning-text-on-solid:oklch(22% 0.02 55deg);--error:var(--red);--error-hover:oklch(65% 0.16 25deg);--error-text:oklch(100% 0 0deg);--error-text-on-solid:oklch(22% 0.03 25deg);--info:var(--cyan);--info-hover:oklch(74% 0.1 220deg);--info-text:oklch(100% 0 0deg);--info-text-on-solid:oklch(22% 0.03 220deg)}[data-theme="rocky-blood-orange"]{--bg:oklch(16% 0.03 45deg);--bg-alt:oklch(13% 0.025 45deg);--current-line:oklch(20% 0.03 45deg);--selection:oklch(28% 0.06 45deg);--fg:oklch(90% 0.01 45deg);--fg-dim:oklch(60% 0.02 45deg);--comment:oklch(52% 0.03 45deg);--cyan:oklch(68% 0.12 220deg);--green:oklch(68% 0.18 145deg);--orange:oklch(62% 0.16 55deg);--pink:oklch(65% 0.16 350deg);--purple:oklch(62% 0.14 300deg);--red:oklch(58% 0.18 25deg);--yellow:oklch(82% 0.12 95deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--icon:var(--fg);--icon-dim:oklch(72% 0.02 45deg);--border:oklch(22% 0.02 45deg);--accent:var(--orange);--accent-hover:oklch(68% 0.14 55deg);--accent-text:oklch(100% 0 0deg);--accent-text-on-hover:oklch(22% 0.03 55deg);--success:var(--green);--success-hover:oklch(74% 0.16 145deg);--success-text:oklch(100% 0 0deg);--success-text-on-solid:oklch(22% 0.03 145deg);--warning:var(--orange);--warning-hover:oklch(72% 0.14 55deg);--warning-text:oklch(98% 0 0deg);--warning-text-on-solid:oklch(22% 0.02 55deg);--error:var(--red);--error-hover:oklch(65% 0.16 25deg);--error-text:oklch(100% 0 0deg);--error-text-on-solid:oklch(22% 0.03 25deg);--info:var(--cyan);--info-hover:oklch(74% 0.1 220deg);--info-text:oklch(100% 0 0deg);--info-text-on-solid:oklch(22% 0.03 220deg)}[data-theme="minimal-dark-neon-yellow"]{--bg:oklch(14% 0.01 95deg);--bg-alt:oklch(11% 0.008 95deg);--current-line:oklch(18% 0.015 95deg);--selection:oklch(25% 0.08 95deg);--fg:oklch(92% 0.02 95deg);--fg-dim:oklch(65% 0.02 95deg);--comment:oklch(50% 0.02 95deg);--icon:var(--fg);--icon-dim:oklch(72% 0.02 95deg);--cyan:oklch(72% 0.12 220deg);--green:oklch(72% 0.18 145deg);--orange:oklch(78% 0.14 55deg);--pink:oklch(68% 0.16 350deg);--purple:oklch(65% 0.14 300deg);--red:oklch(62% 0.18 25deg);--yellow:oklch(88% 0.18 95deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--border:oklch(20% 0.02 95deg);--accent:var(--yellow);--accent-hover:oklch(90% 0.16 95deg);--accent-text:oklch(12% 0.02 95deg);--accent-text-on-hover:oklch(22% 0.03 95deg);--success:var(--green);--success-hover:oklch(78% 0.16 145deg);--success-text:oklch(100% 0 0deg);--success-text-on-solid:oklch(22% 0.03 145deg);--warning:var(--orange);--warning-hover:oklch(85% 0.12 55deg);--warning-text:oklch(98% 0 0deg);--warning-text-on-solid:oklch(22% 0.02 55deg);--error:var(--red);--error-hover:oklch(68% 0.16 25deg);--error-text:oklch(100% 0 0deg);--error-text-on-solid:oklch(22% 0.03 25deg);--info:var(--cyan);--info-hover:oklch(78% 0.1 220deg);--info-text:oklch(100% 0 0deg);--info-text-on-solid:oklch(22% 0.03 220deg)}[data-theme="hack-the-box"]{--bg:oklch(16% 0.03 255deg);--bg-alt:oklch(13% 0.025 255deg);--current-line:oklch(20% 0.03 255deg);--selection:oklch(55% 0.08 255deg);--fg:oklch(82% 0.03 255deg);--fg-dim:oklch(62% 0.04 255deg);--comment:oklch(55% 0.03 255deg);--icon:var(--fg);--icon-dim:oklch(70% 0.04 255deg);--cyan:oklch(78% 0.12 175deg);--green:oklch(88% 0.22 130deg);--orange:oklch(78% 0.14 75deg);--pink:oklch(65% 0.18 340deg);--purple:oklch(65% 0.22 300deg);--red:oklch(65% 0.22 25deg);--yellow:oklch(82% 0.16 95deg);--background:var(--bg);--background-alt:oklch(14% 0.028 255deg);--text:var(--fg);--text-dim:var(--fg-dim);--border:oklch(20% 0.03 255deg);--accent:var(--green);--accent-hover:oklch(85% 0.2 125deg);--accent-text:oklch(12% 0.02 255deg);--accent-text-on-hover:oklch(22% 0.03 130deg);--success:var(--green);--success-hover:oklch(90% 0.18 130deg);--success-text:oklch(98% 0 0deg);--success-text-on-solid:oklch(22% 0.03 130deg);--warning:var(--yellow);--warning-hover:oklch(92% 0.14 95deg);--warning-text:oklch(98% 0 0deg);--warning-text-on-solid:oklch(22% 0.02 95deg);--error:var(--red);--error-hover:oklch(72% 0.18 25deg);--error-text:oklch(100% 0 0deg);--error-text-on-solid:oklch(22% 0.03 25deg);--info:oklch(68% 0.14 240deg);--info-hover:oklch(75% 0.12 240deg);--info-text:oklch(100% 0 0deg);--info-text-on-solid:oklch(22% 0.03 240deg)}[data-theme="pink-cat-boo"]{--bg:oklch(18% 0.03 280deg);--bg-alt:oklch(22% 0.04 280deg);--current-line:oklch(28% 0.06 320deg);--selection:oklch(28% 0.06 320deg);--fg:oklch(98% 0.01 350deg);--fg-dim:oklch(65% 0.04 280deg);--comment:oklch(55% 0.03 160deg);--cyan:oklch(72% 0.1 220deg);--green:oklch(72% 0.14 165deg);--orange:oklch(72% 0.14 75deg);--pink:oklch(78% 0.12 350deg);--purple:oklch(72% 0.14 300deg);--red:oklch(72% 0.18 350deg);--yellow:oklch(78% 0.14 85deg);--background:var(--bg);--background-alt:oklch(20% 0.035 280deg);--text:var(--fg);--text-dim:var(--fg-dim);--icon:var(--fg);--icon-dim:oklch(75% 0.04 280deg);--border:oklch(35% 0.04 280deg);--accent:var(--pink);--accent-hover:oklch(82% 0.1 350deg);--accent-text:oklch(18% 0.02 280deg);--accent-text-on-hover:oklch(22% 0.03 350deg);--success:var(--green);--success-hover:oklch(78% 0.12 165deg);--success-text:oklch(98% 0 0deg);--success-text-on-solid:oklch(22% 0.03 165deg);--warning:var(--yellow);--warning-hover:oklch(85% 0.12 85deg);--warning-text:oklch(98% 0 0deg);--warning-text-on-solid:oklch(22% 0.02 85deg);--error:var(--red);--error-hover:oklch(78% 0.14 350deg);--error-text:oklch(100% 0 0deg);--error-text-on-solid:oklch(22% 0.03 15deg);--info:var(--cyan);--info-hover:oklch(78% 0.1 220deg);--info-text:oklch(98% 0 0deg);--info-text-on-solid:oklch(22% 0.03 220deg)}[data-theme="github-light"]{--bg:oklch(100% 0 0deg);--bg-alt:oklch(97% 0.005 264deg);--current-line:oklch(95% 0.008 264deg);--selection:oklch(88% 0.06 255deg);--fg:oklch(18% 0.02 264deg);--fg-dim:oklch(52% 0.02 264deg);--comment:oklch(58% 0.02 264deg);--cyan:oklch(55% 0.18 255deg);--green:oklch(48% 0.16 145deg);--orange:oklch(65% 0.14 75deg);--pink:oklch(55% 0.18 340deg);--purple:oklch(50% 0.18 290deg);--red:oklch(50% 0.2 25deg);--yellow:oklch(75% 0.14 90deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--border:oklch(86% 0.01 264deg);--accent:var(--cyan);--accent-hover:oklch(38% 0.18 255deg);--accent-text:oklch(100% 0 0deg);--success:var(--green);--success-hover:oklch(55% 0.14 145deg);--success-text:oklch(20% 0 0deg);--warning:var(--yellow);--warning-hover:oklch(82% 0.12 90deg);--warning-text:oklch(20% 0 0deg);--error:var(--red);--error-hover:oklch(62% 0.18 25deg);--error-text:oklch(100% 0 0deg);--info:var(--cyan);--info-hover:oklch(65% 0.1 210deg);--info-text:oklch(20% 0 0deg)}[data-theme="red-velvet-cupcake"]{--bg:oklch(99% 0.005 25deg);--bg-alt:oklch(96% 0.01 25deg);--current-line:oklch(94% 0.015 25deg);--selection:oklch(92% 0.04 25deg);--fg:oklch(28% 0.02 250deg);--fg-dim:oklch(48% 0.02 250deg);--comment:oklch(55% 0.02 250deg);--cyan:oklch(55% 0.12 220deg);--green:oklch(50% 0.16 145deg);--orange:oklch(62% 0.14 55deg);--pink:oklch(58% 0.16 350deg);--purple:oklch(52% 0.16 290deg);--red:oklch(55% 0.17 25deg);--yellow:oklch(75% 0.12 95deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--border:oklch(88% 0.015 25deg);--accent:var(--red);--accent-hover:oklch(48% 0.18 25deg);--accent-text:oklch(100% 0 0deg);--success:var(--green);--success-hover:oklch(54% 0.14 145deg);--success-text:oklch(20% 0 0deg);--warning:var(--orange);--warning-hover:oklch(70% 0.12 55deg);--warning-text:oklch(20% 0 0deg);--error:var(--red);--error-hover:oklch(60% 0.16 25deg);--error-text:oklch(100% 0 0deg);--info:var(--cyan);--info-hover:oklch(58% 0.1 220deg);--info-text:oklch(20% 0 0deg)}[data-theme="orangy-one-light"]{--bg:oklch(99% 0.008 70deg);--bg-alt:oklch(96% 0.012 70deg);--current-line:oklch(94% 0.015 70deg);--selection:oklch(92% 0.05 70deg);--fg:oklch(22% 0.02 70deg);--fg-dim:oklch(48% 0.02 70deg);--comment:oklch(55% 0.02 70deg);--cyan:oklch(55% 0.12 220deg);--green:oklch(50% 0.16 145deg);--orange:oklch(58% 0.16 55deg);--pink:oklch(58% 0.16 350deg);--purple:oklch(52% 0.16 290deg);--red:oklch(52% 0.18 25deg);--yellow:oklch(75% 0.14 90deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--border:oklch(88% 0.02 70deg);--accent:var(--orange);--accent-hover:oklch(50% 0.18 55deg);--accent-text:oklch(100% 0 0deg);--success:var(--green);--success-hover:oklch(55% 0.14 145deg);--success-text:oklch(20% 0 0deg);--warning:var(--orange);--warning-hover:oklch(72% 0.12 55deg);--warning-text:oklch(20% 0 0deg);--error:var(--red);--error-hover:oklch(58% 0.16 25deg);--error-text:oklch(100% 0 0deg);--info:var(--cyan);--info-hover:oklch(62% 0.1 220deg);--info-text:oklch(20% 0 0deg)}[data-theme="sunflower"]{--bg:oklch(98% 0.03 95deg);--bg-alt:oklch(95% 0.04 95deg);--current-line:oklch(92% 0.05 95deg);--selection:oklch(88% 0.08 95deg);--fg:oklch(22% 0.03 95deg);--fg-dim:oklch(45% 0.03 95deg);--comment:oklch(52% 0.03 95deg);--cyan:oklch(55% 0.12 220deg);--green:oklch(50% 0.16 145deg);--orange:oklch(62% 0.14 55deg);--pink:oklch(58% 0.16 350deg);--purple:oklch(52% 0.16 290deg);--red:oklch(52% 0.18 25deg);--yellow:oklch(75% 0.16 95deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--border:oklch(85% 0.04 95deg);--accent:var(--yellow);--accent-hover:oklch(65% 0.18 95deg);--accent-text:oklch(15% 0.02 95deg);--accent-text-on-hover:oklch(22% 0.02 95deg);--success:var(--green);--success-hover:oklch(55% 0.14 145deg);--success-text:oklch(20% 0 0deg);--warning:var(--orange);--warning-hover:oklch(70% 0.12 55deg);--warning-text:oklch(20% 0 0deg);--error:var(--red);--error-hover:oklch(60% 0.16 25deg);--error-text:oklch(100% 0 0deg);--info:var(--cyan);--info-hover:oklch(62% 0.1 220deg);--info-text:oklch(20% 0 0deg)}[data-theme="green-breeze-light"]{--bg:oklch(98% 0.008 140deg);--bg-alt:oklch(96% 0.01 140deg);--current-line:oklch(94% 0.012 140deg);--selection:oklch(88% 0.06 200deg);--fg:oklch(20% 0.02 80deg);--fg-dim:oklch(45% 0.02 80deg);--comment:oklch(55% 0.02 80deg);--cyan:oklch(58% 0.14 205deg);--green:oklch(42% 0.14 145deg);--orange:oklch(62% 0.12 65deg);--pink:oklch(55% 0.12 340deg);--purple:oklch(55% 0.12 290deg);--red:oklch(45% 0.18 25deg);--yellow:oklch(75% 0.14 90deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--border:oklch(88% 0.02 140deg);--accent:oklch(48% 0.16 155deg);--accent-hover:oklch(38% 0.16 155deg);--accent-text:oklch(100% 0 0deg);--success:var(--green);--success-hover:oklch(55% 0.14 145deg);--success-text:oklch(20% 0 0deg);--warning:var(--yellow);--warning-hover:oklch(82% 0.12 95deg);--warning-text:oklch(20% 0 0deg);--error:var(--red);--error-hover:oklch(58% 0.16 25deg);--error-text:oklch(100% 0 0deg);--info:var(--cyan);--info-hover:oklch(65% 0.1 210deg);--info-text:oklch(20% 0 0deg)}[data-theme="cute-pink"]{--bg:oklch(100% 0 0deg);--bg-alt:oklch(98% 0.02 350deg);--current-line:oklch(96% 0.03 350deg);--selection:oklch(78% 0.12 350deg);--fg:oklch(25% 0.01 0deg);--fg-dim:oklch(50% 0.02 0deg);--comment:oklch(55% 0.02 0deg);--cyan:oklch(55% 0.1 220deg);--green:oklch(48% 0.12 145deg);--orange:oklch(65% 0.12 65deg);--pink:oklch(62% 0.2 350deg);--purple:oklch(42% 0.18 300deg);--red:oklch(55% 0.2 25deg);--yellow:oklch(75% 0.14 90deg);--background:var(--bg);--background-alt:oklch(98% 0.025 350deg);--text:var(--fg);--text-dim:var(--fg-dim);--border:oklch(88% 0.06 350deg);--accent:oklch(62% 0.22 350deg);--accent-hover:oklch(55% 0.22 350deg);--accent-text:oklch(100% 0 0deg);--success:var(--green);--success-hover:oklch(58% 0.14 145deg);--success-text:oklch(20% 0 0deg);--warning:var(--yellow);--warning-hover:oklch(80% 0.14 90deg);--warning-text:oklch(20% 0 0deg);--error:var(--red);--error-hover:oklch(60% 0.18 25deg);--error-text:oklch(100% 0 0deg);--info:var(--cyan);--info-hover:oklch(65% 0.1 220deg);--info-text:oklch(20% 0 0deg)}[data-theme="semi-light-purple"]{--bg:oklch(96% 0.02 290deg);--bg-alt:oklch(94% 0.03 290deg);--current-line:oklch(91% 0.04 290deg);--selection:oklch(88% 0.06 290deg);--fg:oklch(25% 0.02 290deg);--fg-dim:oklch(48% 0.03 290deg);--comment:oklch(55% 0.04 280deg);--cyan:oklch(58% 0.12 220deg);--green:oklch(50% 0.14 150deg);--orange:oklch(65% 0.12 60deg);--pink:oklch(62% 0.16 340deg);--purple:oklch(52% 0.2 290deg);--red:oklch(52% 0.18 25deg);--yellow:oklch(75% 0.14 90deg);--background:var(--bg);--background-alt:var(--bg-alt);--text:var(--fg);--text-dim:var(--fg-dim);--border:oklch(86% 0.05 290deg);--accent:var(--purple);--accent-hover:oklch(45% 0.2 290deg);--accent-text:oklch(100% 0 0deg);--success:var(--green);--success-hover:oklch(55% 0.14 145deg);--success-text:oklch(20% 0 0deg);--warning:var(--yellow);--warning-hover:oklch(82% 0.12 90deg);--warning-text:oklch(20% 0 0deg);--error:var(--red);--error-hover:oklch(58% 0.16 25deg);--error-text:oklch(100% 0 0deg);--info:var(--cyan);--info-hover:oklch(62% 0.1 220deg);--info-text:oklch(20% 0 0deg)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rizzo-css",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "scripts": {
5
5
  "prepublishOnly": "cd ../.. && pnpm build:css && node scripts/copy-scaffold.js"
6
6
  },
@@ -11,6 +11,14 @@ const { title = '{{TITLE}}' } = Astro.props;
11
11
  <meta charset="UTF-8" />
12
12
  <meta name="viewport" content="width=device-width, initial-scale=1" />
13
13
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
14
+ <!-- Theme flash prevention + accessibility (same as main site) -->
15
+ <script is:inline>
16
+ (function(){try{var s=localStorage.getItem('theme');var d='github-dark-classic';var l='github-light';var r=!s?(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){}})();
17
+ </script>
18
+ <!-- Toast: showToast, removeToast, removeAllToasts -->
19
+ <script is:inline>
20
+ (function(){if(typeof window==='undefined'||window.showToast)return;function t(m,o){if(!m)return null;o=o||{};var v=o.variant||'info',p=o.position||'top-right',a=o.autoDismiss!==undefined?o.autoDismiss:5000,d=o.dismissible!==undefined?o.dismissible:true,i='toast-'+Math.random().toString(36).substr(2,9);function c(){if(!document.body)return;var cn=document.getElementById('toast-container-'+p);if(!cn){cn=document.createElement('div');cn.id='toast-container-'+p;cn.className='toast-container toast-container--'+p;cn.style.cssText='display:flex;visibility:visible;z-index:1100';document.body.appendChild(cn);}var to=document.createElement('div');to.id=i;to.className='alert alert--'+v;to.setAttribute('role','alert');to.setAttribute('aria-live','polite');to.style.cssText='display:flex;visibility:visible;opacity:0;transition:opacity .3s ease-out,transform .3s ease-out';var ir=p.indexOf('right')!==-1,il=p.indexOf('left')!==-1;to.style.transform=ir?'translateX(100%)':il?'translateX(-100%)':'translateY(-100%)';var co=document.createElement('div');co.className='alert__content';co.textContent=m;to.appendChild(co);if(d){var cb=document.createElement('button');cb.type='button';cb.className='alert__close';cb.setAttribute('aria-label','Dismiss toast');cb.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>';to.appendChild(cb);cb.onclick=function(){to.style.opacity='0';to.style.transform=ir?'translateX(100%)':il?'translateX(-100%)':'translateY(-100%)';setTimeout(function(){if(to.parentNode)to.remove();if(cn.children.length===0)cn.remove();},300);};}cn.appendChild(to);requestAnimationFrame(function(){to.offsetHeight;setTimeout(function(){requestAnimationFrame(function(){to.style.opacity='1';to.style.transform=ir||il?'translateX(0)':'translateY(0)';});},10);});if(a>0)setTimeout(function(){if(to.parentNode){to.style.opacity='0';to.style.transform=ir?'translateX(100%)':il?'translateX(-100%)':'translateY(-100%)';setTimeout(function(){if(to.parentNode)to.remove();if(cn.children.length===0)cn.remove();},300);}},a);return i;}document.body?c():document.addEventListener('DOMContentLoaded',c);return i;}function r(i){var to=document.getElementById(i);if(to){var cn=to.parentElement;to.style.opacity='0';to.style.transform='translateY(-10px)';setTimeout(function(){if(to.parentNode)to.remove();if(cn&&cn.classList.contains('toast-container')&&!cn.children.length)cn.remove();},300);}}function ra(){document.querySelectorAll('.toast-container').forEach(function(c){c.querySelectorAll('.alert').forEach(function(t){t.style.opacity='0';t.style.transform='translateY(-10px)';});setTimeout(function(){c.remove();},300);});}window.showToast=t;window.removeToast=r;window.removeAllToasts=ra;})();
21
+ </script>
14
22
  <!-- Rizzo CSS: full bundle (reset + base + components + themes) -->
15
23
  <link rel="stylesheet" href="/css/rizzo.min.css" />
16
24
  <title>{title}</title>
@@ -1,13 +1,28 @@
1
1
  ---
2
2
  import Layout from '../layouts/Layout.astro';
3
3
  ---
4
- <Layout>
5
- <main style="padding: var(--spacing-6); max-width: 65ch;">
6
- <h1>Hello, Rizzo CSS</h1>
7
- <p>Your Astro project is set up with Rizzo CSS. Same styles and components as Vanilla JS and Svelte.</p>
8
- <p>
9
- <a href="https://rizzo-css.vercel.app/docs/components">Component docs</a>
10
- Set theme via <code>data-theme</code> on <code>&lt;html&gt;</code> (e.g. <code>github-dark-classic</code>). Run <code>npx rizzo-css theme</code> to list themes.
11
- </p>
4
+ <Layout title="{{TITLE}}">
5
+ <a href="#main-content" class="skip-link">Skip to main content</a>
6
+ <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);">
7
+ <a href="/" class="font-semibold" style="font-size: var(--font-size-lg); color: var(--text); text-decoration: none;">{{TITLE}}</a>
8
+ <a href="https://rizzo-css.vercel.app/docs/getting-started" class="btn btn-outline" target="_blank" rel="noopener noreferrer">Docs</a>
9
+ </header>
10
+ <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);">
11
+ <span class="badge badge--primary badge--sm mb-4">Astro + Rizzo CSS</span>
12
+ <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>
13
+ <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 Vanilla JS and Svelte — 14 themes, 24 components, full keyboard and screen reader support.</p>
14
+ <div class="flex flex-wrap justify-center gap-4 mb-12">
15
+ <a href="https://rizzo-css.vercel.app/docs/getting-started" class="btn btn-primary" target="_blank" rel="noopener noreferrer">Get started</a>
16
+ <a href="https://rizzo-css.vercel.app/docs/components" class="btn btn-outline" target="_blank" rel="noopener noreferrer">Components</a>
17
+ <button type="button" class="btn btn-outline" onclick="window.showToast && window.showToast('Hello from Rizzo!', { variant: 'success' })">Show toast</button>
18
+ </div>
19
+ <div class="flex flex-wrap justify-center gap-3 mb-16">
20
+ <span class="badge badge--info">14 themes</span>
21
+ <span class="badge badge--info">24 components</span>
22
+ <span class="badge badge--info">WCAG AA</span>
23
+ </div>
24
+ <footer style="margin-top: auto; padding-top: var(--spacing-8); color: var(--text-dim); font-size: var(--font-size-sm);">
25
+ <a href="https://rizzo-css.vercel.app" style="color: var(--accent);">Rizzo CSS</a> — design system for the web
26
+ </footer>
12
27
  </main>
13
28
  </Layout>
@@ -3,6 +3,14 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <!-- Theme flash prevention + accessibility (same as main site) -->
7
+ <script>
8
+ (function(){try{var s=localStorage.getItem('theme');var d='github-dark-classic';var l='github-light';var r=!s?(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
+ </script>
10
+ <!-- Toast: showToast, removeToast, removeAllToasts -->
11
+ <script>
12
+ (function(){if(typeof window==='undefined'||window.showToast)return;function t(m,o){if(!m)return null;o=o||{};var v=o.variant||'info',p=o.position||'top-right',a=o.autoDismiss!==undefined?o.autoDismiss:5000,d=o.dismissible!==undefined?o.dismissible:true,i='toast-'+Math.random().toString(36).substr(2,9);function c(){if(!document.body)return;var cn=document.getElementById('toast-container-'+p);if(!cn){cn=document.createElement('div');cn.id='toast-container-'+p;cn.className='toast-container toast-container--'+p;cn.style.cssText='display:flex;visibility:visible;z-index:1100';document.body.appendChild(cn);}var to=document.createElement('div');to.id=i;to.className='alert alert--'+v;to.setAttribute('role','alert');to.setAttribute('aria-live','polite');to.style.cssText='display:flex;visibility:visible;opacity:0;transition:opacity .3s ease-out,transform .3s ease-out';var ir=p.indexOf('right')!==-1,il=p.indexOf('left')!==-1;to.style.transform=ir?'translateX(100%)':il?'translateX(-100%)':'translateY(-100%)';var co=document.createElement('div');co.className='alert__content';co.textContent=m;to.appendChild(co);if(d){var cb=document.createElement('button');cb.type='button';cb.className='alert__close';cb.setAttribute('aria-label','Dismiss toast');cb.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>';to.appendChild(cb);cb.onclick=function(){to.style.opacity='0';to.style.transform=ir?'translateX(100%)':il?'translateX(-100%)':'translateY(-100%)';setTimeout(function(){if(to.parentNode)to.remove();if(cn.children.length===0)cn.remove();},300);};}cn.appendChild(to);requestAnimationFrame(function(){to.offsetHeight;setTimeout(function(){requestAnimationFrame(function(){to.style.opacity='1';to.style.transform=ir||il?'translateX(0)':'translateY(0)';});},10);});if(a>0)setTimeout(function(){if(to.parentNode){to.style.opacity='0';to.style.transform=ir?'translateX(100%)':il?'translateX(-100%)':'translateY(-100%)';setTimeout(function(){if(to.parentNode)to.remove();if(cn.children.length===0)cn.remove();},300);}},a);return i;}document.body?c():document.addEventListener('DOMContentLoaded',c);return i;}function r(i){var to=document.getElementById(i);if(to){var cn=to.parentElement;to.style.opacity='0';to.style.transform='translateY(-10px)';setTimeout(function(){if(to.parentNode)to.remove();if(cn&&cn.classList.contains('toast-container')&&!cn.children.length)cn.remove();},300);}}function ra(){document.querySelectorAll('.toast-container').forEach(function(c){c.querySelectorAll('.alert').forEach(function(t){t.style.opacity='0';t.style.transform='translateY(-10px)';});setTimeout(function(){c.remove();},300);});}window.showToast=t;window.removeToast=r;window.removeAllToasts=ra;})();
13
+ </script>
6
14
  <!-- Rizzo CSS: full bundle (reset + base + components + themes) -->
7
15
  <link rel="stylesheet" href="/css/rizzo.min.css" />
8
16
  %sveltekit.head%
@@ -1,12 +1,31 @@
1
1
  <script>
2
- // Welcome page
2
+ function showDemoToast() {
3
+ if (typeof window !== 'undefined' && window.showToast) {
4
+ window.showToast('Hello from Rizzo!', { variant: 'success' });
5
+ }
6
+ }
3
7
  </script>
4
8
 
5
- <main style="padding: var(--spacing-6); max-width: 65ch;">
6
- <h1>Hello, Rizzo CSS</h1>
7
- <p>Your SvelteKit project is set up with Rizzo CSS. Same styles and components as Vanilla JS and Astro.</p>
8
- <p>
9
- <a href="https://rizzo-css.vercel.app/docs/components">Component docs</a>
10
- Set theme via <code>data-theme</code> on <code>&lt;html&gt;</code> (e.g. <code>github-dark-classic</code>). Run <code>npx rizzo-css theme</code> to list themes.
11
- </p>
9
+ <a href="#main-content" class="skip-link">Skip to main content</a>
10
+ <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);">
11
+ <a href="/" class="font-semibold" style="font-size: var(--font-size-lg); color: var(--text); text-decoration: none;">{{TITLE}}</a>
12
+ <a href="https://rizzo-css.vercel.app/docs/getting-started" class="btn btn-outline" target="_blank" rel="noopener noreferrer">Docs</a>
13
+ </header>
14
+ <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);">
15
+ <span class="badge badge--primary badge--sm mb-4">Svelte + Rizzo CSS</span>
16
+ <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>
17
+ <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 Vanilla JS and Astro — 14 themes, 24 components, full keyboard and screen reader support.</p>
18
+ <div class="flex flex-wrap justify-center gap-4 mb-12">
19
+ <a href="https://rizzo-css.vercel.app/docs/getting-started" class="btn btn-primary" target="_blank" rel="noopener noreferrer">Get started</a>
20
+ <a href="https://rizzo-css.vercel.app/docs/components" class="btn btn-outline" target="_blank" rel="noopener noreferrer">Components</a>
21
+ <button type="button" class="btn btn-outline" on:click={showDemoToast}>Show toast</button>
22
+ </div>
23
+ <div class="flex flex-wrap justify-center gap-3 mb-16">
24
+ <span class="badge badge--info">14 themes</span>
25
+ <span class="badge badge--info">24 components</span>
26
+ <span class="badge badge--info">WCAG AA</span>
27
+ </div>
28
+ <footer style="margin-top: auto; padding-top: var(--spacing-8); color: var(--text-dim); font-size: var(--font-size-sm);">
29
+ <a href="https://rizzo-css.vercel.app" style="color: var(--accent);">Rizzo CSS</a> — design system for the web
30
+ </footer>
12
31
  </main>
@@ -4,73 +4,460 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
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 = 'github-dark-classic';
13
+ var defaultLight = 'github-light';
14
+ var resolvedTheme;
15
+ if (!savedTheme) {
16
+ resolvedTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? defaultDark : defaultLight;
17
+ } else if (savedTheme === 'system') {
18
+ resolvedTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? defaultDark : defaultLight;
19
+ } else {
20
+ resolvedTheme = savedTheme;
21
+ }
22
+ document.documentElement.setAttribute('data-theme', resolvedTheme);
23
+ var savedFontScale = localStorage.getItem('fontSizeScale');
24
+ if (savedFontScale) {
25
+ document.documentElement.style.setProperty('--font-size-scale', savedFontScale);
26
+ }
27
+ if (localStorage.getItem('reducedMotion') === 'true') {
28
+ document.documentElement.classList.add('reduced-motion');
29
+ }
30
+ if (localStorage.getItem('highContrast') === 'true') {
31
+ document.documentElement.classList.add('high-contrast');
32
+ }
33
+ var savedScrollbarStyle = localStorage.getItem('scrollbarStyle') || 'thin';
34
+ if (savedScrollbarStyle === 'thick') {
35
+ document.documentElement.classList.add('scrollbar-thick');
36
+ } else if (savedScrollbarStyle === 'hidden') {
37
+ document.documentElement.classList.add('scrollbar-hidden', 'hide-scrollbars');
38
+ }
39
+ if (!savedScrollbarStyle && localStorage.getItem('hideScrollbars') === 'true') {
40
+ document.documentElement.classList.add('scrollbar-hidden', 'hide-scrollbars');
41
+ localStorage.setItem('scrollbarStyle', 'hidden');
42
+ }
43
+ } catch (e) {}
44
+ })();
45
+ </script>
46
+ <!-- Toast: showToast, removeToast, removeAllToasts (same as main site) -->
47
+ <script>
48
+ (function() {
49
+ if (typeof window === 'undefined' || window.showToast) return;
50
+ function showToast(message, options) {
51
+ if (!message) return null;
52
+ options = options || {};
53
+ var variant = options.variant || 'info';
54
+ var position = options.position || 'top-right';
55
+ var autoDismiss = options.autoDismiss !== undefined ? options.autoDismiss : 5000;
56
+ var dismissible = options.dismissible !== undefined ? options.dismissible : true;
57
+ var toastId = 'toast-' + Math.random().toString(36).substr(2, 9);
58
+ function createToast() {
59
+ if (!document.body) return;
60
+ var containerId = 'toast-container-' + position;
61
+ var container = document.getElementById(containerId);
62
+ if (!container) {
63
+ container = document.createElement('div');
64
+ container.id = containerId;
65
+ container.className = 'toast-container toast-container--' + position;
66
+ container.style.cssText = 'display:flex;visibility:visible;z-index:1100;';
67
+ document.body.appendChild(container);
68
+ }
69
+ var toast = document.createElement('div');
70
+ toast.id = toastId;
71
+ toast.className = 'alert alert--' + variant;
72
+ toast.setAttribute('role', 'alert');
73
+ toast.setAttribute('aria-live', 'polite');
74
+ toast.style.cssText = 'display:flex;visibility:visible;opacity:0;transition:opacity 0.3s ease-out, transform 0.3s ease-out;';
75
+ var isRight = position.indexOf('right') !== -1;
76
+ var isLeft = position.indexOf('left') !== -1;
77
+ toast.style.transform = isRight ? 'translateX(100%)' : isLeft ? 'translateX(-100%)' : 'translateY(-100%)';
78
+ var content = document.createElement('div');
79
+ content.className = 'alert__content';
80
+ content.textContent = message;
81
+ toast.appendChild(content);
82
+ var closeBtn;
83
+ if (dismissible) {
84
+ closeBtn = document.createElement('button');
85
+ closeBtn.type = 'button';
86
+ closeBtn.className = 'alert__close';
87
+ closeBtn.setAttribute('aria-label', 'Dismiss toast');
88
+ 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>';
89
+ toast.appendChild(closeBtn);
90
+ closeBtn.addEventListener('click', function() {
91
+ toast.style.opacity = '0';
92
+ toast.style.transform = isRight ? 'translateX(100%)' : isLeft ? 'translateX(-100%)' : 'translateY(-100%)';
93
+ setTimeout(function() {
94
+ if (toast.parentNode) toast.remove();
95
+ if (container.children.length === 0) container.remove();
96
+ }, 300);
97
+ });
98
+ }
99
+ container.appendChild(toast);
100
+ requestAnimationFrame(function() {
101
+ toast.offsetHeight;
102
+ if (variant === 'warning') {
103
+ toast.style.color = 'var(--warning-text)';
104
+ content.style.color = 'var(--warning-text)';
105
+ if (closeBtn) closeBtn.style.color = 'var(--warning-text)';
106
+ }
107
+ setTimeout(function() {
108
+ requestAnimationFrame(function() {
109
+ toast.style.opacity = '1';
110
+ toast.style.transform = isRight || isLeft ? 'translateX(0)' : 'translateY(0)';
111
+ });
112
+ }, 10);
113
+ });
114
+ if (autoDismiss > 0) {
115
+ setTimeout(function() {
116
+ if (toast.parentNode) {
117
+ toast.style.opacity = '0';
118
+ toast.style.transform = isRight ? 'translateX(100%)' : isLeft ? 'translateX(-100%)' : 'translateY(-100%)';
119
+ setTimeout(function() {
120
+ if (toast.parentNode) toast.remove();
121
+ if (container.children.length === 0) container.remove();
122
+ }, 300);
123
+ }
124
+ }, autoDismiss);
125
+ }
126
+ }
127
+ if (document.body) createToast();
128
+ else document.addEventListener('DOMContentLoaded', createToast);
129
+ return toastId;
130
+ }
131
+ function removeToast(toastId) {
132
+ var toast = document.getElementById(toastId);
133
+ if (toast) {
134
+ var container = toast.parentElement;
135
+ var position = container ? container.id.replace('toast-container-', '') : 'top-right';
136
+ toast.style.opacity = '0';
137
+ toast.style.transform = position.indexOf('right') !== -1 ? 'translateX(100%)' : position.indexOf('left') !== -1 ? 'translateX(-100%)' : 'translateY(-100%)';
138
+ setTimeout(function() {
139
+ if (toast.parentNode) toast.remove();
140
+ if (container && container.classList.contains('toast-container') && container.children.length === 0) container.remove();
141
+ }, 300);
142
+ }
143
+ }
144
+ function removeAllToasts() {
145
+ document.querySelectorAll('.toast-container').forEach(function(c) {
146
+ c.querySelectorAll('.alert').forEach(function(t) {
147
+ t.style.opacity = '0';
148
+ t.style.transform = 'translateY(-10px)';
149
+ });
150
+ setTimeout(function() { c.remove(); }, 300);
151
+ });
152
+ }
153
+ window.showToast = showToast;
154
+ window.removeToast = removeToast;
155
+ window.removeAllToasts = removeAllToasts;
156
+ })();
157
+ </script>
7
158
  <link rel="stylesheet" href="{{LINK_HREF}}" />
8
159
  </head>
9
160
  <body>
10
- <header style="margin-bottom: var(--spacing-6);">
11
- <h1>Hello, Rizzo CSS</h1>
12
- <p>Vanilla JS same styles and components as Astro/Svelte. Use the same BEM classes; see <a href="https://rizzo-css.vercel.app/docs/components">docs</a>.</p>
13
- <div style="display: flex; align-items: center; gap: var(--spacing-3); flex-wrap: wrap; margin-top: var(--spacing-3);">
14
- <label for="theme-select">Theme:</label>
15
- <select id="theme-select" style="width: auto; min-width: 12rem;">
16
- <option value="github-dark-classic">github-dark-classic</option>
17
- <option value="github-light">github-light</option>
18
- <option value="shades-of-purple">shades-of-purple</option>
19
- <option value="sandstorm-classic">sandstorm-classic</option>
20
- <option value="rocky-blood-orange">rocky-blood-orange</option>
21
- <option value="minimal-dark-neon-yellow">minimal-dark-neon-yellow</option>
22
- <option value="hack-the-box">hack-the-box</option>
23
- <option value="pink-cat-boo">pink-cat-boo</option>
24
- <option value="red-velvet-cupcake">red-velvet-cupcake</option>
25
- <option value="orangy-one-light">orangy-one-light</option>
26
- <option value="sunflower">sunflower</option>
27
- <option value="green-breeze-light">green-breeze-light</option>
28
- <option value="cute-pink">cute-pink</option>
29
- <option value="semi-light-purple">semi-light-purple</option>
161
+ <a href="#main-content" class="skip-link">Skip to main content</a>
162
+ <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);">
163
+ <a href="#" class="font-semibold" style="font-size: var(--font-size-lg); color: var(--text); text-decoration: none;">{{TITLE}}</a>
164
+ <div class="flex items-center gap-3 flex-wrap">
165
+ <label for="theme-select" class="sr-only">Theme</label>
166
+ <select id="theme-select" class="form-control" style="width: auto; min-width: 12rem;" aria-label="Theme">
167
+ <option value="system">System</option>
168
+ <optgroup label="Dark themes">
169
+ <option value="github-dark-classic">GitHub Dark Classic</option>
170
+ <option value="shades-of-purple">Shades of Purple</option>
171
+ <option value="sandstorm-classic">Sandstorm Classic</option>
172
+ <option value="rocky-blood-orange">Rocky Blood Orange</option>
173
+ <option value="minimal-dark-neon-yellow">Minimal Dark Neon Yellow</option>
174
+ <option value="hack-the-box">Hack The Box</option>
175
+ <option value="pink-cat-boo">Pink Cat Boo</option>
176
+ </optgroup>
177
+ <optgroup label="Light themes">
178
+ <option value="github-light">GitHub Light</option>
179
+ <option value="red-velvet-cupcake">Red Velvet Cupcake</option>
180
+ <option value="orangy-one-light">Orangy One Light</option>
181
+ <option value="sunflower">Sunflower</option>
182
+ <option value="green-breeze-light">Green Breeze Light</option>
183
+ <option value="cute-pink">Cute Pink</option>
184
+ <option value="semi-light-purple">Semi Light Purple</option>
185
+ </optgroup>
30
186
  </select>
187
+ <button type="button" class="btn btn-outline" aria-label="Open settings" onclick="window.openSettings && window.openSettings()">Settings</button>
31
188
  </div>
32
189
  </header>
33
190
 
34
- <section style="margin-bottom: var(--spacing-6);">
35
- <h2>Buttons</h2>
36
- <div style="display: flex; flex-wrap: wrap; gap: var(--spacing-3);">
37
- <button type="button" class="btn">Default</button>
38
- <button type="button" class="btn btn-primary">Primary</button>
39
- <button type="button" class="btn btn-success">Success</button>
40
- <button type="button" class="btn btn-warning">Warning</button>
41
- <button type="button" class="btn btn-error">Error</button>
42
- <button type="button" class="btn btn-outline">Outline</button>
43
- </div>
44
- </section>
45
-
46
- <section style="margin-bottom: var(--spacing-6);">
47
- <h2>Card &amp; Badge</h2>
48
- <div class="card" style="max-width: 20rem;">
49
- <div class="card__body">
50
- <h3 class="card__title">Card title</h3>
51
- <p>Same component styles as Astro and Svelte. Use class names from the <a href="https://rizzo-css.vercel.app/docs/components">component docs</a>.</p>
52
- <span class="badge badge--primary">Badge</span>
191
+ <!-- Settings panel (same structure as main site; CSS from Rizzo) -->
192
+ <div class="settings" data-settings aria-hidden="true">
193
+ <div class="settings__overlay" data-settings-overlay aria-hidden="true"></div>
194
+ <div class="settings__panel" role="dialog" aria-modal="true" aria-labelledby="settings-title" aria-hidden="true">
195
+ <div class="settings__header">
196
+ <h2 id="settings-title" class="settings__title">Settings</h2>
197
+ <button type="button" class="settings__close" aria-label="Close settings" data-settings-close>
198
+ <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>
199
+ </button>
200
+ </div>
201
+ <div class="settings__content">
202
+ <section class="settings__section">
203
+ <h3 class="settings__section-title">Theme</h3>
204
+ <div class="settings__control">
205
+ <label for="settings-theme" class="settings__label">Theme</label>
206
+ <select id="settings-theme" class="form-control" aria-label="Theme" data-settings-theme style="width: 100%;">
207
+ <option value="system">System</option>
208
+ <optgroup label="Dark themes">
209
+ <option value="github-dark-classic">GitHub Dark Classic</option>
210
+ <option value="shades-of-purple">Shades of Purple</option>
211
+ <option value="sandstorm-classic">Sandstorm Classic</option>
212
+ <option value="rocky-blood-orange">Rocky Blood Orange</option>
213
+ <option value="minimal-dark-neon-yellow">Minimal Dark Neon Yellow</option>
214
+ <option value="hack-the-box">Hack The Box</option>
215
+ <option value="pink-cat-boo">Pink Cat Boo</option>
216
+ </optgroup>
217
+ <optgroup label="Light themes">
218
+ <option value="github-light">GitHub Light</option>
219
+ <option value="red-velvet-cupcake">Red Velvet Cupcake</option>
220
+ <option value="orangy-one-light">Orangy One Light</option>
221
+ <option value="sunflower">Sunflower</option>
222
+ <option value="green-breeze-light">Green Breeze Light</option>
223
+ <option value="cute-pink">Cute Pink</option>
224
+ <option value="semi-light-purple">Semi Light Purple</option>
225
+ </optgroup>
226
+ </select>
227
+ </div>
228
+ </section>
229
+ <section class="settings__section">
230
+ <h3 class="settings__section-title">Font Size</h3>
231
+ <div class="settings__control">
232
+ <label for="font-size-slider" class="settings__label">
233
+ <span class="settings__label-text">Adjust text size</span>
234
+ <span class="settings__label-value" data-font-size-value>100%</span>
235
+ </label>
236
+ <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%;" />
237
+ <div class="settings__slider-labels"><span>Small</span><span>Default</span><span>Large</span></div>
238
+ </div>
239
+ </section>
240
+ <section class="settings__section">
241
+ <h3 class="settings__section-title">Accessibility</h3>
242
+ <div class="settings__control">
243
+ <label class="settings__checkbox-label">
244
+ <input type="checkbox" class="settings__checkbox" data-reduced-motion aria-label="Reduce motion" />
245
+ <span>Reduce motion</span>
246
+ </label>
247
+ <p class="settings__help-text">Minimize animations and transitions</p>
248
+ </div>
249
+ <div class="settings__control">
250
+ <label class="settings__checkbox-label">
251
+ <input type="checkbox" class="settings__checkbox" data-high-contrast aria-label="High contrast" />
252
+ <span>High contrast</span>
253
+ </label>
254
+ <p class="settings__help-text">Increase contrast for better visibility</p>
255
+ </div>
256
+ <div class="settings__control">
257
+ <div class="settings__label"><span class="settings__label-text">Scrollbar style</span></div>
258
+ <div class="settings__radio-group" role="radiogroup" aria-label="Scrollbar style">
259
+ <label class="settings__radio-label">
260
+ <input type="radio" name="scrollbar-style" value="thin" class="settings__radio" data-scrollbar-style aria-label="Thin scrollbar" checked />
261
+ <span>Thin</span>
262
+ </label>
263
+ <label class="settings__radio-label">
264
+ <input type="radio" name="scrollbar-style" value="thick" class="settings__radio" data-scrollbar-style aria-label="Thick scrollbar" />
265
+ <span>Thick</span>
266
+ </label>
267
+ <label class="settings__radio-label">
268
+ <input type="radio" name="scrollbar-style" value="hidden" class="settings__radio" data-scrollbar-style aria-label="Hidden scrollbars" />
269
+ <span>Hidden</span>
270
+ </label>
271
+ </div>
272
+ <p class="settings__help-text">Choose your preferred scrollbar appearance</p>
273
+ </div>
274
+ </section>
53
275
  </div>
54
276
  </div>
55
- </section>
277
+ </div>
56
278
 
57
- <p><small>All themes and component styles are included. Run <code>npx rizzo-css theme</code> to list themes.</small></p>
279
+ <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);">
280
+ <span class="badge badge--primary badge--sm mb-4">Vanilla JS + Rizzo CSS</span>
281
+ <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>
282
+ <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>
283
+ <div class="flex flex-wrap justify-center gap-4 mb-12">
284
+ <a href="https://rizzo-css.vercel.app/docs/getting-started" class="btn btn-primary" target="_blank" rel="noopener noreferrer">Get started</a>
285
+ <a href="https://rizzo-css.vercel.app/docs/components" class="btn btn-outline" target="_blank" rel="noopener noreferrer">Components</a>
286
+ <button type="button" class="btn btn-outline" onclick="window.showToast && window.showToast('Hello from Rizzo!', { variant: 'success' });">Show toast</button>
287
+ </div>
288
+ <div class="flex flex-wrap justify-center gap-3 mb-16">
289
+ <span class="badge badge--info">14 themes</span>
290
+ <span class="badge badge--info">24 components</span>
291
+ <span class="badge badge--info">WCAG AA</span>
292
+ </div>
293
+ <footer style="margin-top: auto; padding-top: var(--spacing-8); color: var(--text-dim); font-size: var(--font-size-sm);">
294
+ <a href="https://rizzo-css.vercel.app" class="text-accent" style="color: var(--accent);">Rizzo CSS</a> — design system for the web
295
+ </footer>
296
+ </main>
58
297
 
59
298
  <script>
60
- (function () {
61
- var select = document.getElementById('theme-select');
62
- var html = document.documentElement;
63
- var key = 'rizzo-theme';
299
+ (function() {
300
+ var KEY = 'theme';
301
+ var defaultDark = 'github-dark-classic';
302
+ var defaultLight = 'github-light';
303
+ function resolveSystem() {
304
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? defaultDark : defaultLight;
305
+ }
64
306
  function applyTheme(value) {
65
- html.setAttribute('data-theme', value);
66
- try { localStorage.setItem(key, value); } catch (e) {}
67
- select.value = value;
68
- }
69
- var stored = null;
70
- try { stored = localStorage.getItem(key); } catch (e) {}
71
- var initial = stored || html.getAttribute('data-theme') || 'github-dark-classic';
72
- applyTheme(initial);
73
- select.addEventListener('change', function () { applyTheme(select.value); });
307
+ var effective = value === 'system' ? resolveSystem() : value;
308
+ document.documentElement.setAttribute('data-theme', effective);
309
+ try { localStorage.setItem(KEY, value); } catch (e) {}
310
+ var headerSelect = document.getElementById('theme-select');
311
+ var settingsSelect = document.getElementById('settings-theme');
312
+ if (headerSelect && headerSelect.value !== value) headerSelect.value = value;
313
+ if (settingsSelect && settingsSelect.value !== value) settingsSelect.value = value;
314
+ try { window.dispatchEvent(new CustomEvent('rizzo-theme-change', { detail: { themeValue: value, effective: effective } })); } catch (e) {}
315
+ }
316
+ function syncSelects() {
317
+ var stored = null;
318
+ try { stored = localStorage.getItem(KEY); } catch (e) {}
319
+ var value = stored || 'system';
320
+ var headerSelect = document.getElementById('theme-select');
321
+ var settingsSelect = document.getElementById('settings-theme');
322
+ if (headerSelect) headerSelect.value = value;
323
+ if (settingsSelect) settingsSelect.value = value;
324
+ }
325
+ var headerSelect = document.getElementById('theme-select');
326
+ var settingsSelect = document.getElementById('settings-theme');
327
+ if (headerSelect) headerSelect.addEventListener('change', function() { applyTheme(headerSelect.value); });
328
+ if (settingsSelect) settingsSelect.addEventListener('change', function() { applyTheme(settingsSelect.value); });
329
+ syncSelects();
330
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function() {
331
+ if ((localStorage.getItem(KEY) || 'system') === 'system') applyTheme('system');
332
+ });
333
+ })();
334
+ </script>
335
+ <script>
336
+ (function initSettings() {
337
+ var settings = document.querySelector('[data-settings]');
338
+ if (!settings) return;
339
+ var overlay = settings.querySelector('[data-settings-overlay]');
340
+ var panel = settings.querySelector('.settings__panel');
341
+ var closeBtn = settings.querySelector('[data-settings-close]');
342
+ var fontSizeSlider = settings.querySelector('[data-font-size-slider]');
343
+ var fontSizeValue = settings.querySelector('[data-font-size-value]');
344
+ var reducedMotion = settings.querySelector('[data-reduced-motion]');
345
+ var highContrast = settings.querySelector('[data-high-contrast]');
346
+ var scrollbarStyleRadios = settings.querySelectorAll('[data-scrollbar-style]');
347
+ var html = document.documentElement;
348
+ if (!panel || !overlay || !closeBtn) return;
349
+ function updateSliderProgress(slider) {
350
+ var min = parseFloat(slider.min), max = parseFloat(slider.max), value = parseFloat(slider.value);
351
+ slider.style.setProperty('--slider-progress', ((value - min) / (max - min)) * 100 + '%');
352
+ }
353
+ function applyFontSize(scale) {
354
+ html.style.setProperty('--font-size-scale', scale);
355
+ if (fontSizeValue) fontSizeValue.textContent = Math.round(scale * 100) + '%';
356
+ }
357
+ function applyScrollbarStyle(style) {
358
+ html.classList.remove('scrollbar-thin', 'scrollbar-thick', 'scrollbar-hidden', 'hide-scrollbars');
359
+ if (style === 'thick') html.classList.add('scrollbar-thick');
360
+ else if (style === 'hidden') html.classList.add('scrollbar-hidden', 'hide-scrollbars');
361
+ }
362
+ function loadSettings() {
363
+ var saved = localStorage.getItem('fontSizeScale');
364
+ if (saved && fontSizeSlider) {
365
+ fontSizeSlider.value = saved;
366
+ applyFontSize(parseFloat(saved));
367
+ }
368
+ if (fontSizeSlider) updateSliderProgress(fontSizeSlider);
369
+ if (reducedMotion) {
370
+ reducedMotion.checked = localStorage.getItem('reducedMotion') === 'true';
371
+ html.classList.toggle('reduced-motion', reducedMotion.checked);
372
+ }
373
+ if (highContrast) {
374
+ highContrast.checked = localStorage.getItem('highContrast') === 'true';
375
+ html.classList.toggle('high-contrast', highContrast.checked);
376
+ }
377
+ var scrollbar = localStorage.getItem('scrollbarStyle') || 'thin';
378
+ for (var i = 0; i < scrollbarStyleRadios.length; i++) {
379
+ if (scrollbarStyleRadios[i].value === scrollbar) scrollbarStyleRadios[i].checked = true;
380
+ }
381
+ applyScrollbarStyle(scrollbar);
382
+ }
383
+ function getFocusable(container) {
384
+ var sel = 'button:not([disabled]),a[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])';
385
+ return Array.prototype.slice.call(container.querySelectorAll(sel));
386
+ }
387
+ var previousActive = null;
388
+ function openSettings() {
389
+ previousActive = document.activeElement;
390
+ settings.setAttribute('aria-hidden', 'false');
391
+ overlay.setAttribute('aria-hidden', 'false');
392
+ panel.setAttribute('aria-hidden', 'false');
393
+ panel.removeAttribute('data-open');
394
+ void panel.offsetHeight;
395
+ requestAnimationFrame(function() {
396
+ requestAnimationFrame(function() {
397
+ panel.setAttribute('data-open', 'true');
398
+ if (closeBtn) closeBtn.focus();
399
+ });
400
+ });
401
+ }
402
+ function closeSettings() {
403
+ panel.removeAttribute('data-open');
404
+ var duration = window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 0 : 300;
405
+ setTimeout(function() {
406
+ settings.setAttribute('aria-hidden', 'true');
407
+ overlay.setAttribute('aria-hidden', 'true');
408
+ panel.setAttribute('aria-hidden', 'true');
409
+ if (previousActive) {
410
+ previousActive.focus();
411
+ previousActive = null;
412
+ }
413
+ }, duration);
414
+ }
415
+ closeBtn.addEventListener('click', closeSettings);
416
+ overlay.addEventListener('click', closeSettings);
417
+ document.addEventListener('keydown', function(e) {
418
+ if (panel.getAttribute('data-open') !== 'true') return;
419
+ if (e.key === 'Escape') { e.preventDefault(); closeSettings(); return; }
420
+ if (e.key === 'Tab') {
421
+ var els = getFocusable(panel);
422
+ if (els.length === 0) return;
423
+ var first = els[0], last = els[els.length - 1], active = document.activeElement;
424
+ if (e.shiftKey) {
425
+ if (active === first || !panel.contains(active)) { e.preventDefault(); last.focus(); }
426
+ } else {
427
+ if (active === last || !panel.contains(active)) { e.preventDefault(); first.focus(); }
428
+ }
429
+ }
430
+ });
431
+ if (fontSizeSlider) {
432
+ fontSizeSlider.addEventListener('input', function() {
433
+ var scale = parseFloat(this.value);
434
+ applyFontSize(scale);
435
+ updateSliderProgress(this);
436
+ localStorage.setItem('fontSizeScale', scale);
437
+ });
438
+ }
439
+ if (reducedMotion) {
440
+ reducedMotion.addEventListener('change', function() {
441
+ html.classList.toggle('reduced-motion', this.checked);
442
+ localStorage.setItem('reducedMotion', this.checked);
443
+ });
444
+ }
445
+ if (highContrast) {
446
+ highContrast.addEventListener('change', function() {
447
+ html.classList.toggle('high-contrast', this.checked);
448
+ localStorage.setItem('highContrast', this.checked);
449
+ });
450
+ }
451
+ for (var j = 0; j < scrollbarStyleRadios.length; j++) {
452
+ scrollbarStyleRadios[j].addEventListener('change', function() {
453
+ if (this.checked) {
454
+ applyScrollbarStyle(this.value);
455
+ localStorage.setItem('scrollbarStyle', this.value);
456
+ }
457
+ });
458
+ }
459
+ loadSettings();
460
+ window.openSettings = openSettings;
74
461
  })();
75
462
  </script>
76
463
  </body>