rizzo-css 0.0.54 → 0.0.55
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 +11 -7
- package/bin/rizzo-css.js +273 -118
- package/dist/rizzo.min.css +40 -16
- package/package.json +6 -6
- package/scaffold/astro/AlertDialog.astro +86 -0
- package/scaffold/astro/AspectRatio.astro +22 -0
- package/scaffold/astro/ButtonGroup.astro +16 -0
- package/scaffold/astro/Collapsible.astro +69 -0
- package/scaffold/astro/ContextMenu.astro +58 -0
- package/scaffold/astro/CopyToClipboard.astro +4 -0
- package/scaffold/astro/Dashboard.astro +74 -0
- package/scaffold/astro/Empty.astro +23 -0
- package/scaffold/astro/HoverCard.astro +64 -0
- package/scaffold/astro/Kbd.astro +14 -0
- package/scaffold/astro/Label.astro +24 -0
- package/scaffold/astro/Modal.astro +17 -2
- package/scaffold/astro/Popover.astro +62 -0
- package/scaffold/astro/ResizableHandle.astro +16 -0
- package/scaffold/astro/ResizablePane.astro +20 -0
- package/scaffold/astro/ResizablePaneGroup.astro +84 -0
- package/scaffold/astro/ScrollArea.astro +19 -0
- package/scaffold/astro/Separator.astro +18 -0
- package/scaffold/astro/Settings.astro +10 -2
- package/scaffold/astro/Sheet.astro +90 -0
- package/scaffold/astro/Skeleton.astro +16 -0
- package/scaffold/astro/Slider.astro +75 -0
- package/scaffold/astro/SoundEffects.astro +1 -0
- package/scaffold/astro/Switch.astro +37 -0
- package/scaffold/astro/Tabs.astro +1 -1
- package/scaffold/astro/ThemeSwitcher.astro +11 -4
- package/scaffold/astro/Toggle.astro +35 -0
- package/scaffold/astro/ToggleGroup.astro +24 -0
- package/scaffold/astro/base/README-RIZZO.md +55 -0
- package/scaffold/{astro-core → astro/base}/src/pages/index.astro +1 -1
- package/scaffold/astro/variants/dashboard/src/layouts/Layout.astro +85 -0
- package/scaffold/astro/variants/dashboard/src/pages/index.astro +110 -0
- package/scaffold/astro/variants/docs/src/layouts/Layout.astro +81 -0
- package/scaffold/astro/variants/docs/src/pages/docs/getting-started.astro +36 -0
- package/scaffold/astro/variants/docs/src/pages/index.astro +38 -0
- package/scaffold/{astro-core → astro/variants/full}/README-RIZZO.md +2 -1
- package/scaffold/astro/variants/full/astro.config.mjs +5 -0
- package/scaffold/astro/variants/full/dist/_noop-middleware.mjs +3 -0
- package/scaffold/astro/variants/full/dist/chunks/astro/server_9Mzx7luy.mjs +6023 -0
- package/scaffold/astro/variants/full/dist/chunks/astro_BOYUKg7r.mjs +1 -0
- package/scaffold/astro/variants/full/dist/favicon.svg +18 -0
- package/scaffold/astro/variants/full/dist/manifest_DXpJmqSX.mjs +154 -0
- package/scaffold/astro/variants/full/dist/noop-entrypoint.mjs +3 -0
- package/scaffold/astro/variants/full/dist/pages/index.astro.mjs +87 -0
- package/scaffold/astro/variants/full/dist/renderers.mjs +3 -0
- package/scaffold/astro/variants/full/gitignore +24 -0
- package/scaffold/astro/variants/full/node_modules/.astro/data-store.json +1 -0
- package/scaffold/astro/variants/full/node_modules/.vite/deps/_metadata.json +31 -0
- package/scaffold/astro/variants/full/node_modules/.vite/deps/astro___aria-query.js +6776 -0
- package/scaffold/astro/variants/full/node_modules/.vite/deps/astro___aria-query.js.map +7 -0
- package/scaffold/astro/variants/full/node_modules/.vite/deps/astro___axobject-query.js +3754 -0
- package/scaffold/astro/variants/full/node_modules/.vite/deps/astro___axobject-query.js.map +7 -0
- package/scaffold/astro/variants/full/node_modules/.vite/deps/astro___cssesc.js +99 -0
- package/scaffold/astro/variants/full/node_modules/.vite/deps/astro___cssesc.js.map +7 -0
- package/scaffold/astro/variants/full/node_modules/.vite/deps/chunk-BUSYA2B4.js +8 -0
- package/scaffold/astro/variants/full/node_modules/.vite/deps/chunk-BUSYA2B4.js.map +7 -0
- package/scaffold/astro/variants/full/node_modules/.vite/deps/package.json +3 -0
- package/scaffold/astro/variants/full/package.json +13 -0
- package/scaffold/astro/variants/full/public/.gitkeep +0 -0
- package/scaffold/astro/variants/full/public/favicon.svg +18 -0
- package/scaffold/astro/variants/full/src/components/rizzo/CopyToClipboard.astro +157 -0
- package/scaffold/astro/variants/full/src/components/rizzo/icons/Check.astro +29 -0
- package/scaffold/astro/variants/full/src/components/rizzo/icons/Copy.astro +30 -0
- package/scaffold/astro/variants/full/src/layouts/Layout.astro +34 -0
- package/scaffold/astro/variants/full/src/pages/index.astro +107 -0
- package/scaffold/astro/variants/full/tsconfig.json +5 -0
- package/scaffold/landing/index.html +13 -0
- package/scaffold/shared/navbar-vanilla.html +59 -0
- package/scaffold/shared/sound-effects-inline.js +6 -1
- package/scaffold/svelte/AlertDialog.svelte +55 -0
- package/scaffold/svelte/AspectRatio.svelte +21 -0
- package/scaffold/svelte/BackToTop.svelte +1 -0
- package/scaffold/svelte/ButtonGroup.svelte +16 -0
- package/scaffold/svelte/Collapsible.svelte +57 -0
- package/scaffold/svelte/ContextMenu.svelte +60 -0
- package/scaffold/svelte/Dashboard.svelte +87 -0
- package/scaffold/svelte/Empty.svelte +36 -0
- package/scaffold/svelte/HoverCard.svelte +55 -0
- package/scaffold/svelte/Kbd.svelte +13 -0
- package/scaffold/svelte/Label.svelte +19 -0
- package/scaffold/svelte/Popover.svelte +59 -0
- package/scaffold/svelte/ResizableHandle.svelte +13 -0
- package/scaffold/svelte/ResizablePane.svelte +16 -0
- package/scaffold/svelte/ResizablePaneGroup.svelte +92 -0
- package/scaffold/svelte/ScrollArea.svelte +18 -0
- package/scaffold/svelte/Separator.svelte +14 -0
- package/scaffold/svelte/Sheet.svelte +62 -0
- package/scaffold/svelte/Skeleton.svelte +19 -0
- package/scaffold/svelte/Slider.svelte +57 -0
- package/scaffold/svelte/SoundEffects.svelte +3 -0
- package/scaffold/svelte/Switch.svelte +35 -0
- package/scaffold/svelte/Tabs.svelte +1 -1
- package/scaffold/svelte/Toggle.svelte +41 -0
- package/scaffold/svelte/ToggleGroup.svelte +30 -0
- package/scaffold/svelte/base/README-RIZZO.md +55 -0
- package/scaffold/{svelte-core → svelte/base}/src/routes/+page.svelte +1 -1
- package/scaffold/svelte/base/static/.gitkeep +0 -0
- package/scaffold/svelte/index.ts +21 -0
- package/scaffold/svelte/variants/dashboard/src/routes/+layout.svelte +64 -0
- package/scaffold/svelte/variants/dashboard/src/routes/+page.svelte +104 -0
- package/scaffold/svelte/variants/docs/src/routes/+layout.svelte +60 -0
- package/scaffold/svelte/variants/docs/src/routes/+page.svelte +34 -0
- package/scaffold/svelte/variants/docs/src/routes/docs/getting-started/+page.svelte +31 -0
- package/scaffold/{svelte-core → svelte/variants/full}/README-RIZZO.md +2 -1
- package/scaffold/svelte/variants/full/gitignore +10 -0
- package/scaffold/svelte/variants/full/package.json +20 -0
- package/scaffold/svelte/variants/full/src/app.d.ts +11 -0
- package/scaffold/svelte/variants/full/src/app.html +16 -0
- package/scaffold/svelte/variants/full/src/routes/+layout.svelte +1 -0
- package/scaffold/svelte/variants/full/src/routes/+page.svelte +105 -0
- package/scaffold/svelte/variants/full/static/.gitkeep +0 -0
- package/scaffold/svelte/variants/full/svelte.config.js +10 -0
- package/scaffold/svelte/variants/full/tsconfig.json +11 -0
- package/scaffold/vanilla/README-RIZZO.md +6 -5
- package/scaffold/vanilla/components/accordion.html +59 -64
- package/scaffold/vanilla/components/alert-dialog.html +640 -0
- package/scaffold/vanilla/components/alert.html +59 -64
- package/scaffold/vanilla/components/aspect-ratio.html +640 -0
- package/scaffold/vanilla/components/avatar.html +59 -64
- package/scaffold/vanilla/components/back-to-top.html +59 -64
- package/scaffold/vanilla/components/badge.html +59 -64
- package/scaffold/vanilla/components/breadcrumb.html +59 -64
- package/scaffold/vanilla/components/button-group.html +640 -0
- package/scaffold/vanilla/components/button.html +59 -64
- package/scaffold/vanilla/components/cards.html +59 -64
- package/scaffold/vanilla/components/collapsible.html +640 -0
- package/scaffold/vanilla/components/context-menu.html +640 -0
- package/scaffold/vanilla/components/copy-to-clipboard.html +59 -64
- package/scaffold/vanilla/components/dashboard.html +640 -0
- package/scaffold/vanilla/components/divider.html +59 -64
- package/scaffold/vanilla/components/docs-sidebar.html +59 -64
- package/scaffold/vanilla/components/dropdown.html +59 -64
- package/scaffold/vanilla/components/empty.html +640 -0
- package/scaffold/vanilla/components/font-switcher.html +59 -64
- package/scaffold/vanilla/components/footer.html +59 -64
- package/scaffold/vanilla/components/forms.html +59 -64
- package/scaffold/vanilla/components/hover-card.html +640 -0
- package/scaffold/vanilla/components/icons.html +59 -64
- package/scaffold/vanilla/components/index.html +79 -64
- package/scaffold/vanilla/components/kbd.html +640 -0
- package/scaffold/vanilla/components/label.html +640 -0
- package/scaffold/vanilla/components/modal.html +59 -64
- package/scaffold/vanilla/components/navbar.html +59 -64
- package/scaffold/vanilla/components/pagination.html +59 -64
- package/scaffold/vanilla/components/popover.html +640 -0
- package/scaffold/vanilla/components/progress-bar.html +59 -64
- package/scaffold/vanilla/components/resizable.html +640 -0
- package/scaffold/vanilla/components/scroll-area.html +640 -0
- package/scaffold/vanilla/components/search.html +59 -64
- package/scaffold/vanilla/components/separator.html +640 -0
- package/scaffold/vanilla/components/settings.html +59 -64
- package/scaffold/vanilla/components/sheet.html +640 -0
- package/scaffold/vanilla/components/skeleton.html +640 -0
- package/scaffold/vanilla/components/slider.html +640 -0
- package/scaffold/vanilla/components/sound-effects.html +59 -64
- package/scaffold/vanilla/components/spinner.html +59 -64
- package/scaffold/vanilla/components/switch.html +640 -0
- package/scaffold/vanilla/components/table.html +59 -64
- package/scaffold/vanilla/components/tabs.html +59 -64
- package/scaffold/vanilla/components/theme-switcher.html +59 -64
- package/scaffold/vanilla/components/toast.html +59 -64
- package/scaffold/vanilla/components/toggle-group.html +640 -0
- package/scaffold/vanilla/components/toggle.html +640 -0
- package/scaffold/vanilla/components/tooltip.html +59 -64
- package/scaffold/vanilla/index.html +61 -66
- package/scaffold/vanilla/variants/dashboard/index.html +45 -0
- package/scaffold/vanilla/variants/docs/index.html +36 -0
- package/scaffold/vanilla/variants/full/components/accordion.html +592 -0
- package/scaffold/vanilla/variants/full/components/alert.html +592 -0
- package/scaffold/vanilla/variants/full/components/avatar.html +592 -0
- package/scaffold/vanilla/variants/full/components/back-to-top.html +592 -0
- package/scaffold/vanilla/variants/full/components/badge.html +592 -0
- package/scaffold/vanilla/variants/full/components/breadcrumb.html +592 -0
- package/scaffold/vanilla/variants/full/components/button.html +592 -0
- package/scaffold/vanilla/variants/full/components/cards.html +592 -0
- package/scaffold/vanilla/variants/full/components/copy-to-clipboard.html +592 -0
- package/scaffold/vanilla/variants/full/components/dashboard.html +592 -0
- package/scaffold/vanilla/variants/full/components/divider.html +592 -0
- package/scaffold/vanilla/variants/full/components/docs-sidebar.html +592 -0
- package/scaffold/vanilla/variants/full/components/dropdown.html +592 -0
- package/scaffold/vanilla/variants/full/components/font-switcher.html +592 -0
- package/scaffold/vanilla/variants/full/components/footer.html +592 -0
- package/scaffold/vanilla/variants/full/components/forms.html +592 -0
- package/scaffold/vanilla/variants/full/components/icons.html +592 -0
- package/scaffold/vanilla/variants/full/components/index.html +625 -0
- package/scaffold/vanilla/variants/full/components/modal.html +592 -0
- package/scaffold/vanilla/variants/full/components/navbar.html +592 -0
- package/scaffold/vanilla/variants/full/components/pagination.html +592 -0
- package/scaffold/vanilla/variants/full/components/progress-bar.html +592 -0
- package/scaffold/vanilla/variants/full/components/search.html +592 -0
- package/scaffold/vanilla/variants/full/components/settings.html +592 -0
- package/scaffold/vanilla/variants/full/components/skeleton.html +592 -0
- package/scaffold/vanilla/variants/full/components/sound-effects.html +592 -0
- package/scaffold/vanilla/variants/full/components/spinner.html +592 -0
- package/scaffold/vanilla/variants/full/components/switch.html +592 -0
- package/scaffold/vanilla/variants/full/components/table.html +592 -0
- package/scaffold/vanilla/variants/full/components/tabs.html +592 -0
- package/scaffold/vanilla/variants/full/components/theme-switcher.html +592 -0
- package/scaffold/vanilla/variants/full/components/toast.html +592 -0
- package/scaffold/vanilla/variants/full/components/tooltip.html +592 -0
- package/scaffold/vanilla/variants/full/index.html +682 -0
- package/scaffold/vanilla/variants/full/js/main.js +989 -0
- package/scaffold/astro-core/.astro/content-assets.mjs +0 -1
- package/scaffold/astro-core/.astro/content-modules.mjs +0 -1
- package/scaffold/astro-core/.astro/content.d.ts +0 -199
- package/scaffold/astro-core/.astro/types.d.ts +0 -2
- package/scaffold/astro-core/.env.example +0 -3
- package/scaffold/svelte-core/.env.example +0 -3
- /package/scaffold/{astro-core → astro/base}/astro.config.mjs +0 -0
- /package/scaffold/{astro-core → astro/base}/dist/.gitkeep +0 -0
- /package/scaffold/{astro-core → astro/base}/dist/_noop-middleware.mjs +0 -0
- /package/scaffold/{astro-core → astro/base}/dist/chunks/astro/server_9Mzx7luy.mjs +0 -0
- /package/scaffold/{astro-core → astro/base}/dist/chunks/astro_BOYUKg7r.mjs +0 -0
- /package/scaffold/{astro-core → astro/base}/dist/favicon.svg +0 -0
- /package/scaffold/{astro-core → astro/base}/dist/manifest_DXpJmqSX.mjs +0 -0
- /package/scaffold/{astro-core → astro/base}/dist/noop-entrypoint.mjs +0 -0
- /package/scaffold/{astro-core → astro/base}/dist/pages/index.astro.mjs +0 -0
- /package/scaffold/{astro-core → astro/base}/dist/renderers.mjs +0 -0
- /package/scaffold/{astro-core → astro/base}/gitignore +0 -0
- /package/scaffold/{astro-core → astro/base}/node_modules/.astro/data-store.json +0 -0
- /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/_metadata.json +0 -0
- /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/astro___aria-query.js +0 -0
- /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/astro___aria-query.js.map +0 -0
- /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/astro___axobject-query.js +0 -0
- /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/astro___axobject-query.js.map +0 -0
- /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/astro___cssesc.js +0 -0
- /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/astro___cssesc.js.map +0 -0
- /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/chunk-BUSYA2B4.js +0 -0
- /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/chunk-BUSYA2B4.js.map +0 -0
- /package/scaffold/{astro-core → astro/base}/node_modules/.vite/deps/package.json +0 -0
- /package/scaffold/{astro-core → astro/base}/package.json +0 -0
- /package/scaffold/{astro-core → astro/base}/public/.gitkeep +0 -0
- /package/scaffold/{astro-core → astro/base}/public/favicon.svg +0 -0
- /package/scaffold/{astro-core → astro/base}/src/components/rizzo/CopyToClipboard.astro +0 -0
- /package/scaffold/{astro-core → astro/base}/src/components/rizzo/icons/Check.astro +0 -0
- /package/scaffold/{astro-core → astro/base}/src/components/rizzo/icons/Copy.astro +0 -0
- /package/scaffold/{astro-core → astro/base}/src/layouts/Layout.astro +0 -0
- /package/scaffold/{astro-core → astro/base}/tsconfig.json +0 -0
- /package/scaffold/{svelte-core/static → astro/variants/full/dist}/.gitkeep +0 -0
- /package/scaffold/{svelte-core → svelte/base}/gitignore +0 -0
- /package/scaffold/{svelte-core → svelte/base}/package.json +0 -0
- /package/scaffold/{svelte-core → svelte/base}/src/app.d.ts +0 -0
- /package/scaffold/{svelte-core → svelte/base}/src/app.html +0 -0
- /package/scaffold/{svelte-core → svelte/base}/src/routes/+layout.svelte +0 -0
- /package/scaffold/{svelte-core → svelte/base}/svelte.config.js +0 -0
- /package/scaffold/{svelte-core → svelte/base}/tsconfig.json +0 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* Group of resizable panes with handles. Use with ResizablePane and ResizableHandle.
|
|
4
|
+
* Matches shadcn-svelte Resizable.
|
|
5
|
+
*/
|
|
6
|
+
interface Props {
|
|
7
|
+
id?: string;
|
|
8
|
+
direction?: 'horizontal' | 'vertical';
|
|
9
|
+
class?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const { id, direction = 'horizontal', class: className = '' } = Astro.props;
|
|
13
|
+
const groupId = id || `resizable-${Math.random().toString(36).slice(2, 9)}`;
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
<div
|
|
17
|
+
class={`resizable__pane-group resizable__pane-group--${direction} ${className}`.trim()}
|
|
18
|
+
id={groupId}
|
|
19
|
+
data-resizable-group
|
|
20
|
+
data-direction={direction}
|
|
21
|
+
>
|
|
22
|
+
<slot />
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<script is:inline define:vars={{ groupId }}>
|
|
26
|
+
(function () {
|
|
27
|
+
function init() {
|
|
28
|
+
const root = document.getElementById(groupId);
|
|
29
|
+
if (!root) return;
|
|
30
|
+
const direction = root.dataset.direction === 'vertical' ? 'vertical' : 'horizontal';
|
|
31
|
+
const panes = Array.from(root.querySelectorAll('[data-resizable-pane]'));
|
|
32
|
+
const handles = Array.from(root.querySelectorAll('[data-resizable-handle]'));
|
|
33
|
+
if (panes.length < 2 || handles.length !== panes.length - 1) return;
|
|
34
|
+
function getSize(el) {
|
|
35
|
+
const style = getComputedStyle(el);
|
|
36
|
+
const basis = style.flexBasis;
|
|
37
|
+
if (basis && basis.endsWith('%')) return parseFloat(basis);
|
|
38
|
+
const rect = el.getBoundingClientRect();
|
|
39
|
+
const parent = el.parentElement;
|
|
40
|
+
if (!parent) return 50;
|
|
41
|
+
const parentRect = parent.getBoundingClientRect();
|
|
42
|
+
const pct = direction === 'horizontal' ? (rect.width / parentRect.width) * 100 : (rect.height / parentRect.height) * 100;
|
|
43
|
+
return pct;
|
|
44
|
+
}
|
|
45
|
+
function setSizes(pct1, pct2, idx) {
|
|
46
|
+
panes[idx].style.flex = '1 1 ' + pct1 + '%';
|
|
47
|
+
panes[idx + 1].style.flex = '1 1 ' + pct2 + '%';
|
|
48
|
+
}
|
|
49
|
+
handles.forEach(function (handle, i) {
|
|
50
|
+
let startX, startY, startPct1, startPct2;
|
|
51
|
+
function onMove(e) {
|
|
52
|
+
const parent = root.getBoundingClientRect();
|
|
53
|
+
let delta;
|
|
54
|
+
if (direction === 'horizontal') {
|
|
55
|
+
delta = ((e.clientX - startX) / parent.width) * 100;
|
|
56
|
+
} else {
|
|
57
|
+
delta = ((e.clientY - startY) / parent.height) * 100;
|
|
58
|
+
}
|
|
59
|
+
let p1 = startPct1 + delta;
|
|
60
|
+
let p2 = startPct2 - delta;
|
|
61
|
+
const min = 10;
|
|
62
|
+
if (p1 < min) { p1 = min; p2 = 100 - min; }
|
|
63
|
+
if (p2 < min) { p2 = min; p1 = 100 - min; }
|
|
64
|
+
setSizes(p1, p2, i);
|
|
65
|
+
}
|
|
66
|
+
function onUp() {
|
|
67
|
+
document.removeEventListener('mousemove', onMove);
|
|
68
|
+
document.removeEventListener('mouseup', onUp);
|
|
69
|
+
}
|
|
70
|
+
handle.addEventListener('mousedown', function (e) {
|
|
71
|
+
e.preventDefault();
|
|
72
|
+
startX = e.clientX;
|
|
73
|
+
startY = e.clientY;
|
|
74
|
+
startPct1 = getSize(panes[i]);
|
|
75
|
+
startPct2 = getSize(panes[i + 1]);
|
|
76
|
+
document.addEventListener('mousemove', onMove);
|
|
77
|
+
document.addEventListener('mouseup', onUp);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
|
|
82
|
+
else init();
|
|
83
|
+
})();
|
|
84
|
+
</script>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* Scrollable area with themed scrollbar. Matches shadcn-svelte Scroll Area.
|
|
4
|
+
* orientation: 'vertical' (default) or 'horizontal'
|
|
5
|
+
*/
|
|
6
|
+
interface Props {
|
|
7
|
+
orientation?: 'vertical' | 'horizontal';
|
|
8
|
+
class?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const { orientation = 'vertical', class: className = '' } = Astro.props;
|
|
12
|
+
const horizontal = orientation === 'horizontal';
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
<div class={`scroll-area ${horizontal ? 'scroll-area--horizontal' : ''} ${className}`.trim()}>
|
|
16
|
+
<div class="scroll-area__viewport" tabindex="0">
|
|
17
|
+
<slot />
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* Thin separator line (horizontal or vertical). Same as Divider without label.
|
|
4
|
+
* Matches shadcn-svelte Separator.
|
|
5
|
+
*/
|
|
6
|
+
interface Props {
|
|
7
|
+
orientation?: 'horizontal' | 'vertical';
|
|
8
|
+
class?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const { orientation = 'horizontal', class: className = '' } = Astro.props;
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<div
|
|
15
|
+
class={`separator separator--${orientation} ${className}`.trim()}
|
|
16
|
+
role="separator"
|
|
17
|
+
aria-orientation={orientation}
|
|
18
|
+
></div>
|
|
@@ -32,7 +32,7 @@ const { open = false } = Astro.props;
|
|
|
32
32
|
<section class="settings__section">
|
|
33
33
|
<h3 class="settings__section-title">Theme</h3>
|
|
34
34
|
<div class="settings__control">
|
|
35
|
-
<ThemeSwitcher />
|
|
35
|
+
<ThemeSwitcher idPrefix="settings" />
|
|
36
36
|
</div>
|
|
37
37
|
</section>
|
|
38
38
|
|
|
@@ -246,6 +246,10 @@ const { open = false } = Astro.props;
|
|
|
246
246
|
// Open settings
|
|
247
247
|
const openSettings = () => {
|
|
248
248
|
previousActiveElement = document.activeElement;
|
|
249
|
+
|
|
250
|
+
const layoutContent = document.querySelector('[data-layout-content]');
|
|
251
|
+
if (layoutContent) layoutContent.setAttribute('inert', '');
|
|
252
|
+
document.body.style.overflow = 'hidden';
|
|
249
253
|
|
|
250
254
|
// First, make elements visible but keep panel off-screen
|
|
251
255
|
settings.setAttribute('aria-hidden', 'false');
|
|
@@ -280,7 +284,11 @@ const { open = false } = Astro.props;
|
|
|
280
284
|
settings.setAttribute('aria-hidden', 'true');
|
|
281
285
|
overlay?.setAttribute('aria-hidden', 'true');
|
|
282
286
|
panel.setAttribute('aria-hidden', 'true');
|
|
283
|
-
|
|
287
|
+
|
|
288
|
+
const layoutContent = document.querySelector('[data-layout-content]');
|
|
289
|
+
if (layoutContent) layoutContent.removeAttribute('inert');
|
|
290
|
+
document.body.style.overflow = '';
|
|
291
|
+
|
|
284
292
|
// Return focus to previous element
|
|
285
293
|
if (previousActiveElement) {
|
|
286
294
|
previousActiveElement.focus();
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* Slide-out panel (drawer) from edge. Matches shadcn-svelte Sheet / Drawer.
|
|
4
|
+
*/
|
|
5
|
+
import Close from './icons/Close.astro';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
id?: string;
|
|
9
|
+
title?: string;
|
|
10
|
+
side?: 'top' | 'right' | 'bottom' | 'left';
|
|
11
|
+
open?: boolean;
|
|
12
|
+
class?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const { id, title, side = 'right', open = false, class: className = '' } = Astro.props;
|
|
16
|
+
const sheetId = id || `sheet-${Math.random().toString(36).slice(2, 9)}`;
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
<div
|
|
20
|
+
class={`sheet__overlay ${open ? 'sheet__overlay--open' : ''}`.trim()}
|
|
21
|
+
data-sheet-overlay
|
|
22
|
+
aria-hidden={!open}
|
|
23
|
+
id={`${sheetId}-overlay`}
|
|
24
|
+
></div>
|
|
25
|
+
<div
|
|
26
|
+
class={`sheet sheet--${side} ${open ? 'sheet--open' : ''} ${className}`.trim()}
|
|
27
|
+
role="dialog"
|
|
28
|
+
aria-modal="true"
|
|
29
|
+
aria-labelledby={title ? `${sheetId}-title` : undefined}
|
|
30
|
+
aria-hidden={!open}
|
|
31
|
+
id={sheetId}
|
|
32
|
+
data-sheet
|
|
33
|
+
hidden={!open}
|
|
34
|
+
>
|
|
35
|
+
<div class="sheet__content">
|
|
36
|
+
{title && (
|
|
37
|
+
<div class="sheet__header">
|
|
38
|
+
<h2 id={`${sheetId}-title`} class="sheet__title">{title}</h2>
|
|
39
|
+
<button type="button" class="sheet__close" aria-label="Close" data-sheet-close>
|
|
40
|
+
<Close width={20} height={20} />
|
|
41
|
+
</button>
|
|
42
|
+
</div>
|
|
43
|
+
)}
|
|
44
|
+
<div class="sheet__body">
|
|
45
|
+
<slot />
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<script is:inline define:vars={{ sheetId, open }}>
|
|
51
|
+
(function () {
|
|
52
|
+
function init() {
|
|
53
|
+
const sheet = document.getElementById(sheetId);
|
|
54
|
+
if (!sheet) return;
|
|
55
|
+
const overlay = document.getElementById(sheetId + '-overlay');
|
|
56
|
+
if (!overlay) return;
|
|
57
|
+
let escapeHandler = null;
|
|
58
|
+
const close = () => {
|
|
59
|
+
sheet.classList.remove('sheet--open');
|
|
60
|
+
sheet.setAttribute('aria-hidden', 'true');
|
|
61
|
+
sheet.hidden = true;
|
|
62
|
+
overlay.classList.remove('sheet__overlay--open');
|
|
63
|
+
overlay.setAttribute('aria-hidden', 'true');
|
|
64
|
+
if (escapeHandler) {
|
|
65
|
+
document.removeEventListener('keydown', escapeHandler);
|
|
66
|
+
escapeHandler = null;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const openSheet = () => {
|
|
70
|
+
sheet.hidden = false;
|
|
71
|
+
sheet.classList.add('sheet--open');
|
|
72
|
+
sheet.setAttribute('aria-hidden', 'false');
|
|
73
|
+
overlay.classList.add('sheet__overlay--open');
|
|
74
|
+
overlay.setAttribute('aria-hidden', 'false');
|
|
75
|
+
if (!escapeHandler) {
|
|
76
|
+
escapeHandler = (e) => { if (e.key === 'Escape') close(); };
|
|
77
|
+
document.addEventListener('keydown', escapeHandler);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
sheet.querySelectorAll('[data-sheet-close]').forEach((b) => b.addEventListener('click', close));
|
|
81
|
+
overlay.addEventListener('click', close);
|
|
82
|
+
sheet.addEventListener('keydown', (e) => { if (e.key === 'Escape') close(); });
|
|
83
|
+
window['openSheet_' + sheetId.replace(/-/g, '_')] = openSheet;
|
|
84
|
+
window['closeSheet_' + sheetId.replace(/-/g, '_')] = close;
|
|
85
|
+
if (open) openSheet();
|
|
86
|
+
}
|
|
87
|
+
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
|
|
88
|
+
else init();
|
|
89
|
+
})();
|
|
90
|
+
</script>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Shape variant */
|
|
4
|
+
variant?: 'text' | 'circle' | 'rect' | 'default';
|
|
5
|
+
/** Accessible label for loading state (announced by screen readers). Omit or empty = decorative (aria-hidden). */
|
|
6
|
+
label?: string;
|
|
7
|
+
class?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { variant = 'default', label = 'Loading', class: className = '' } = Astro.props;
|
|
11
|
+
const variantClass = variant !== 'default' ? `skeleton--${variant}` : '';
|
|
12
|
+
const classes = ['skeleton', variantClass, className].filter(Boolean).join(' ').trim();
|
|
13
|
+
const isDecorative = label === '';
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
<span class={classes} role={isDecorative ? undefined : 'status'} aria-label={isDecorative ? undefined : label} aria-busy={isDecorative ? undefined : 'true'} aria-hidden={isDecorative ? 'true' : undefined}></span>
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* Range slider input. Matches shadcn-svelte Slider.
|
|
4
|
+
*/
|
|
5
|
+
interface Props {
|
|
6
|
+
id?: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
min?: number;
|
|
9
|
+
max?: number;
|
|
10
|
+
step?: number;
|
|
11
|
+
value?: number;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
/** Accessible name for the range input (required for axe / WCAG). */
|
|
14
|
+
ariaLabel?: string;
|
|
15
|
+
class?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const {
|
|
19
|
+
id,
|
|
20
|
+
name,
|
|
21
|
+
min = 0,
|
|
22
|
+
max = 100,
|
|
23
|
+
step = 1,
|
|
24
|
+
value = min,
|
|
25
|
+
disabled = false,
|
|
26
|
+
ariaLabel,
|
|
27
|
+
class: className = '',
|
|
28
|
+
} = Astro.props;
|
|
29
|
+
const sliderId = id || `slider-${Math.random().toString(36).slice(2, 9)}`;
|
|
30
|
+
const pct = Math.min(100, Math.max(0, ((value - min) / (max - min)) * 100));
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
<div class={`slider ${className}`.trim()} data-slider>
|
|
34
|
+
<input
|
|
35
|
+
type="range"
|
|
36
|
+
id={sliderId}
|
|
37
|
+
name={name}
|
|
38
|
+
class="slider__input"
|
|
39
|
+
min={min}
|
|
40
|
+
max={max}
|
|
41
|
+
step={step}
|
|
42
|
+
value={value}
|
|
43
|
+
disabled={disabled}
|
|
44
|
+
aria-valuemin={min}
|
|
45
|
+
aria-valuemax={max}
|
|
46
|
+
aria-valuenow={value}
|
|
47
|
+
aria-label={ariaLabel}
|
|
48
|
+
data-slider-input
|
|
49
|
+
/>
|
|
50
|
+
<div class="slider__track" aria-hidden="true">
|
|
51
|
+
<div class="slider__fill" data-slider-fill style={`width: ${pct}%`} />
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<script is:inline define:vars={{ sliderId, min, max }}>
|
|
56
|
+
(function () {
|
|
57
|
+
function init() {
|
|
58
|
+
const root = document.getElementById(sliderId);
|
|
59
|
+
if (!root) return;
|
|
60
|
+
const input = root.querySelector('[data-slider-input]');
|
|
61
|
+
const fill = root.querySelector('[data-slider-fill]');
|
|
62
|
+
if (!input || !fill) return;
|
|
63
|
+
function updateFill() {
|
|
64
|
+
const val = parseFloat(input.value);
|
|
65
|
+
const pct = Math.min(100, Math.max(0, ((val - min) / (max - min)) * 100));
|
|
66
|
+
fill.style.width = pct + '%';
|
|
67
|
+
input.setAttribute('aria-valuenow', String(val));
|
|
68
|
+
}
|
|
69
|
+
input.addEventListener('input', updateFill);
|
|
70
|
+
input.addEventListener('change', updateFill);
|
|
71
|
+
}
|
|
72
|
+
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
|
|
73
|
+
else init();
|
|
74
|
+
})();
|
|
75
|
+
</script>
|
|
@@ -37,6 +37,7 @@ const { class: className = '', showHelp = true } = Astro.props;
|
|
|
37
37
|
el.checked = localStorage.getItem('soundEffects') === 'true';
|
|
38
38
|
el.addEventListener('change', () => {
|
|
39
39
|
localStorage.setItem('soundEffects', el.checked ? 'true' : 'false');
|
|
40
|
+
if (el.checked) window.dispatchEvent(new CustomEvent('rizzo-sound-effects-change'));
|
|
40
41
|
});
|
|
41
42
|
});
|
|
42
43
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
interface Props {
|
|
3
|
+
id?: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
checked?: boolean;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
/** Accessible label (visible or sr-only) */
|
|
8
|
+
label?: string;
|
|
9
|
+
class?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const {
|
|
13
|
+
id,
|
|
14
|
+
name,
|
|
15
|
+
checked = false,
|
|
16
|
+
disabled = false,
|
|
17
|
+
label,
|
|
18
|
+
class: className = '',
|
|
19
|
+
} = Astro.props;
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
<label class={`switch ${className}`.trim()} for={id}>
|
|
23
|
+
<input
|
|
24
|
+
type="checkbox"
|
|
25
|
+
id={id}
|
|
26
|
+
name={name}
|
|
27
|
+
class="switch__input"
|
|
28
|
+
role="switch"
|
|
29
|
+
aria-checked={checked}
|
|
30
|
+
checked={checked}
|
|
31
|
+
disabled={disabled}
|
|
32
|
+
/>
|
|
33
|
+
<span class="switch__track" aria-hidden="true">
|
|
34
|
+
<span class="switch__thumb" />
|
|
35
|
+
</span>
|
|
36
|
+
{label ? <span class="switch__label">{label}</span> : null}
|
|
37
|
+
</label>
|
|
@@ -53,7 +53,7 @@ const classes = `tabs ${variantClass} ${className}`.trim();
|
|
|
53
53
|
data-tab-id={tab.id}
|
|
54
54
|
data-tab-index={index}
|
|
55
55
|
>
|
|
56
|
-
{tab.iconComponent ? <tab.iconComponent width={20} height={20} class="tabs__tab-icon" /> : tab.icon ? <img src={tab.icon} alt="" class="tabs__tab-icon" width="20" height="20" /> : null}
|
|
56
|
+
{tab.iconComponent ? <tab.iconComponent width={20} height={20} class="tabs__tab-icon" /> : tab.icon ? <img src={tab.icon} alt="" class="tabs__tab-icon" width="20" height="20" loading="lazy" aria-hidden="true" /> : null}
|
|
57
57
|
{tab.label}
|
|
58
58
|
</span>
|
|
59
59
|
);
|
|
@@ -41,6 +41,13 @@ const themes = {
|
|
|
41
41
|
light: THEMES_LIGHT.map((t) => ({ ...t, icon: iconMap[t.iconKey] })),
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
+
interface Props {
|
|
45
|
+
/** Optional prefix for trigger/menu IDs to avoid duplicate ids when multiple ThemeSwitchers exist (e.g. idPrefix="settings"). */
|
|
46
|
+
idPrefix?: string;
|
|
47
|
+
}
|
|
48
|
+
const { idPrefix = '' } = Astro.props;
|
|
49
|
+
const triggerId = idPrefix ? `theme-trigger-${idPrefix}` : 'theme-trigger';
|
|
50
|
+
const menuId = idPrefix ? `theme-menu-${idPrefix}` : 'theme-menu';
|
|
44
51
|
|
|
45
52
|
// Get current theme from HTML data attribute or default
|
|
46
53
|
const getCurrentTheme = () => {
|
|
@@ -76,9 +83,9 @@ const InitialIcon = initialTheme ? initialTheme.icon : null;
|
|
|
76
83
|
type="button"
|
|
77
84
|
aria-expanded="false"
|
|
78
85
|
aria-haspopup="true"
|
|
79
|
-
aria-controls=
|
|
86
|
+
aria-controls={menuId}
|
|
80
87
|
aria-label="Select theme"
|
|
81
|
-
id=
|
|
88
|
+
id={triggerId}
|
|
82
89
|
>
|
|
83
90
|
<span class="theme-switcher__label-wrapper" data-theme-label-wrapper>
|
|
84
91
|
<span class="theme-switcher__label" data-theme-label>{initialLabel}</span>
|
|
@@ -88,9 +95,9 @@ const InitialIcon = initialTheme ? initialTheme.icon : null;
|
|
|
88
95
|
|
|
89
96
|
<div
|
|
90
97
|
class="theme-switcher__menu"
|
|
91
|
-
id=
|
|
98
|
+
id={menuId}
|
|
92
99
|
role="menu"
|
|
93
|
-
aria-labelledby=
|
|
100
|
+
aria-labelledby={triggerId}
|
|
94
101
|
aria-label="Theme selection menu"
|
|
95
102
|
aria-orientation="vertical"
|
|
96
103
|
aria-hidden="true"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* Toggle button (pressed/unpressed state). Matches shadcn-svelte Toggle.
|
|
4
|
+
*/
|
|
5
|
+
interface Props {
|
|
6
|
+
pressed?: boolean;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
type?: 'button' | 'submit' | 'reset';
|
|
9
|
+
value?: string;
|
|
10
|
+
ariaLabel?: string;
|
|
11
|
+
class?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const {
|
|
15
|
+
pressed = false,
|
|
16
|
+
disabled = false,
|
|
17
|
+
type = 'button',
|
|
18
|
+
value,
|
|
19
|
+
ariaLabel,
|
|
20
|
+
class: className = '',
|
|
21
|
+
} = Astro.props;
|
|
22
|
+
const pressedClass = pressed ? 'toggle--pressed' : '';
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
<button
|
|
26
|
+
type={type}
|
|
27
|
+
class={`toggle ${pressedClass} ${className}`.trim()}
|
|
28
|
+
aria-pressed={pressed}
|
|
29
|
+
disabled={disabled}
|
|
30
|
+
value={value}
|
|
31
|
+
aria-label={ariaLabel}
|
|
32
|
+
data-toggle
|
|
33
|
+
>
|
|
34
|
+
<slot />
|
|
35
|
+
</button>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* Group of toggle buttons (single or multiple selection). Matches shadcn-svelte Toggle Group.
|
|
4
|
+
*/
|
|
5
|
+
interface Props {
|
|
6
|
+
type?: 'single' | 'multiple';
|
|
7
|
+
orientation?: 'horizontal' | 'vertical';
|
|
8
|
+
class?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const { type = 'single', orientation = 'horizontal', class: className = '' } = Astro.props;
|
|
12
|
+
const orientationClass = orientation === 'vertical' ? 'toggle-group--vertical' : '';
|
|
13
|
+
const role = type === 'single' ? 'radiogroup' : 'group';
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
<div
|
|
17
|
+
class={`toggle-group ${orientationClass} ${className}`.trim()}
|
|
18
|
+
role={role}
|
|
19
|
+
aria-label="Toggle group"
|
|
20
|
+
data-toggle-group
|
|
21
|
+
data-toggle-type={type}
|
|
22
|
+
>
|
|
23
|
+
<slot />
|
|
24
|
+
</div>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Astro + Rizzo CSS
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
/\___/\
|
|
5
|
+
__( o o )__
|
|
6
|
+
( =^= )
|
|
7
|
+
_/ ~ \_
|
|
8
|
+
/ \_____/ \
|
|
9
|
+
____ ___ _____________ ____ ____ ____
|
|
10
|
+
| _ \|_ _|__ /__ / _ \ / ___/ ___/ ___|
|
|
11
|
+
| |_) || | / / / / | | | | | \___ \___ \
|
|
12
|
+
| _ < | | / /_ / /| |_| | | |___ ___) |__) |
|
|
13
|
+
|_| \_\___/____/____\___/ \____|____/____/
|
|
14
|
+
Design system · Vanilla · Astro · Svelte
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Astro project with Rizzo CSS. Scaffolded with `npx rizzo-css init` when you chose **Create new** and Astro, then **Landing**, **Docs**, **Dashboard**, or **Full**. **Full** = clone of the docs site. **Landing** / **Docs** / **Dashboard** = base + component picker (all 56 or pick). Same template choice for **Add to existing** (`npx rizzo-css add`).
|
|
18
|
+
|
|
19
|
+
## Setup
|
|
20
|
+
|
|
21
|
+
1. Copy environment example (optional):
|
|
22
|
+
```bash
|
|
23
|
+
cp .env.example .env
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
2. Install dependencies:
|
|
27
|
+
```bash
|
|
28
|
+
pnpm install
|
|
29
|
+
# or: npm install
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
3. Start the dev server:
|
|
33
|
+
```bash
|
|
34
|
+
pnpm dev
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Project structure
|
|
38
|
+
|
|
39
|
+
- `.gitignore` — Astro default values (same as `create-astro`): dist/, .astro/, node_modules/, .env, logs, .DS_Store, .idea/
|
|
40
|
+
- `astro.config.mjs` — Astro configuration
|
|
41
|
+
- `src/layouts/Layout.astro` — Layout with Rizzo CSS and theme (edit `data-theme` for default)
|
|
42
|
+
- `src/pages/index.astro` — Home page
|
|
43
|
+
- **Navbar** — Flat links (Docs, Components, Blocks, Themes, Colors); Search and Settings in the scaffold
|
|
44
|
+
- `public/css/rizzo.min.css` — Rizzo CSS bundle (added by CLI; font URLs point to `/assets/fonts/`)
|
|
45
|
+
- `public/assets/fonts/` — Rizzo font files (added by CLI)
|
|
46
|
+
- `README-RIZZO.md` — This file (scaffold docs; does not replace your project README)
|
|
47
|
+
- `LICENSE-RIZZO` — Rizzo CSS license (does not replace your project LICENSE)
|
|
48
|
+
|
|
49
|
+
## Commands
|
|
50
|
+
|
|
51
|
+
- `pnpm dev` — Start dev server
|
|
52
|
+
- `pnpm build` — Build for production
|
|
53
|
+
- `pnpm preview` — Preview production build
|
|
54
|
+
|
|
55
|
+
Docs: [rizzo-css.vercel.app](https://rizzo-css.vercel.app)
|
|
@@ -33,7 +33,7 @@ const ADD_COMMAND = 'npx rizzo-css add <ComponentName>';
|
|
|
33
33
|
</div>
|
|
34
34
|
<div class="home__card home__card--featured">
|
|
35
35
|
<span class="home__card-icon" aria-hidden="true">Components</span>
|
|
36
|
-
<h3>
|
|
36
|
+
<h3>All components</h3>
|
|
37
37
|
<p>Navbar, Settings, Theme Switcher, Font Switcher, Modal, Dropdown, Tabs, Forms, and more — all accessible and themeable.</p>
|
|
38
38
|
</div>
|
|
39
39
|
</div>
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
/* Placeholders replaced by rizzo-css CLI when scaffolding */
|
|
3
|
+
/* {{THEME_LIST_COMMENT}} */
|
|
4
|
+
const DATA_THEME = '{{DATA_THEME}}';
|
|
5
|
+
/** @type {{ title?: string }} */
|
|
6
|
+
const { title = '{{TITLE}}' } = Astro.props;
|
|
7
|
+
{{RIZZO_LAYOUT_IMPORTS}}
|
|
8
|
+
---
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en" data-theme={DATA_THEME}>
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="UTF-8" />
|
|
13
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
14
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
15
|
+
<script is:inline>
|
|
16
|
+
(function(){try{
|
|
17
|
+
var s=localStorage.getItem('theme');var d='{{DEFAULT_DARK}}';var l='{{DEFAULT_LIGHT}}';var initial=document.documentElement.getAttribute('data-theme');var r=!s?((initial&&initial!=='system')?initial:(matchMedia('(prefers-color-scheme: dark)').matches?d:l)):s==='system'?(matchMedia('(prefers-color-scheme: dark)').matches?d:l):s;document.documentElement.setAttribute('data-theme',r);
|
|
18
|
+
var fs=localStorage.getItem('fontSizeScale');if(fs)document.documentElement.style.setProperty('--font-size-scale',fs);
|
|
19
|
+
var fp=localStorage.getItem('fontPair')||'geist';if(fp==='geist'){document.documentElement.style.setProperty('--font-family','var(--font-family-geist-sans)');document.documentElement.style.setProperty('--font-family-mono','var(--font-family-geist-mono)');}else if(fp==='inter-jetbrains'){document.documentElement.style.setProperty('--font-family','var(--font-family-inter)');document.documentElement.style.setProperty('--font-family-mono','var(--font-family-jetbrains-mono)');}else if(fp==='ibm-plex'){document.documentElement.style.setProperty('--font-family','var(--font-family-ibm-plex-sans)');document.documentElement.style.setProperty('--font-family-mono','var(--font-family-ibm-plex-mono)');}else if(fp==='source'){document.documentElement.style.setProperty('--font-family','var(--font-family-source-sans-3)');document.documentElement.style.setProperty('--font-family-mono','var(--font-family-source-code-pro)');}else if(fp==='dm'){document.documentElement.style.setProperty('--font-family','var(--font-family-dm-sans)');document.documentElement.style.setProperty('--font-family-mono','var(--font-family-dm-mono)');}else if(fp==='outfit-jetbrains'){document.documentElement.style.setProperty('--font-family','var(--font-family-outfit)');document.documentElement.style.setProperty('--font-family-mono','var(--font-family-jetbrains-mono)');}
|
|
20
|
+
}catch(e){}})();
|
|
21
|
+
</script>
|
|
22
|
+
<link rel="stylesheet" href="/css/rizzo.min.css" />
|
|
23
|
+
{{RIZZO_SOUND_SCRIPT}}
|
|
24
|
+
<title>{title}</title>
|
|
25
|
+
</head>
|
|
26
|
+
<body>
|
|
27
|
+
<a href="#main-content" class="skip-link">Skip to main content</a>
|
|
28
|
+
{{RIZZO_LAYOUT_BODY_TOP}}
|
|
29
|
+
<div class="dashboard">
|
|
30
|
+
<aside class="dashboard__sidebar" aria-label="Dashboard navigation">
|
|
31
|
+
<nav class="dashboard__nav">
|
|
32
|
+
<a href="/" class="dashboard__nav-link dashboard__nav-link--active" aria-current="page">Dashboard</a>
|
|
33
|
+
<a href="/" class="dashboard__nav-link">Items</a>
|
|
34
|
+
<a href="/" class="dashboard__nav-link">Settings</a>
|
|
35
|
+
</nav>
|
|
36
|
+
</aside>
|
|
37
|
+
<main id="main-content" class="dashboard__main">
|
|
38
|
+
<slot />
|
|
39
|
+
</main>
|
|
40
|
+
</div>
|
|
41
|
+
{{RIZZO_LAYOUT_BODY_BOTTOM}}
|
|
42
|
+
</body>
|
|
43
|
+
</html>
|
|
44
|
+
|
|
45
|
+
<style is:global>
|
|
46
|
+
.dashboard {
|
|
47
|
+
display: flex;
|
|
48
|
+
min-height: 100vh;
|
|
49
|
+
}
|
|
50
|
+
.dashboard__sidebar {
|
|
51
|
+
width: 16rem;
|
|
52
|
+
flex-shrink: 0;
|
|
53
|
+
border-right: 1px solid var(--border);
|
|
54
|
+
padding: var(--spacing-4);
|
|
55
|
+
background: var(--background-alt);
|
|
56
|
+
}
|
|
57
|
+
.dashboard__nav {
|
|
58
|
+
display: flex;
|
|
59
|
+
flex-direction: column;
|
|
60
|
+
gap: var(--spacing-1);
|
|
61
|
+
}
|
|
62
|
+
.dashboard__nav-link {
|
|
63
|
+
display: block;
|
|
64
|
+
padding: var(--spacing-2) var(--spacing-3);
|
|
65
|
+
border-radius: var(--radius-md);
|
|
66
|
+
color: var(--text);
|
|
67
|
+
text-decoration: none;
|
|
68
|
+
}
|
|
69
|
+
.dashboard__nav-link:hover {
|
|
70
|
+
background: var(--background);
|
|
71
|
+
}
|
|
72
|
+
.dashboard__nav-link--active {
|
|
73
|
+
background: var(--accent);
|
|
74
|
+
color: var(--accent-text);
|
|
75
|
+
}
|
|
76
|
+
.dashboard__main {
|
|
77
|
+
flex: 1;
|
|
78
|
+
padding: var(--spacing-6);
|
|
79
|
+
overflow: auto;
|
|
80
|
+
}
|
|
81
|
+
@media (max-width: 768px) {
|
|
82
|
+
.dashboard { flex-direction: column; }
|
|
83
|
+
.dashboard__sidebar { width: 100%; border-right: none; border-bottom: 1px solid var(--border); }
|
|
84
|
+
}
|
|
85
|
+
</style>
|