rizzo-css 0.0.11 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +12 -0
- package/LICENSE +21 -0
- package/README.md +17 -3
- package/bin/rizzo-css.js +98 -42
- package/dist/rizzo.min.css +3 -2
- package/package.json +5 -3
- package/scaffold/astro-app/README.md +13 -2
- package/scaffold/astro-app/src/components/Accordion.astro +178 -0
- package/scaffold/astro-app/src/components/Alert.astro +131 -0
- package/scaffold/astro-app/src/components/Avatar.astro +59 -0
- package/scaffold/astro-app/src/components/Badge.astro +24 -0
- package/scaffold/astro-app/src/components/Breadcrumb.astro +61 -0
- package/scaffold/astro-app/src/components/Button.astro +3 -0
- package/scaffold/astro-app/src/components/Card.astro +18 -0
- package/scaffold/astro-app/src/components/Checkbox.astro +38 -0
- package/scaffold/astro-app/src/components/CodeBlock.astro +393 -0
- package/scaffold/astro-app/src/components/CopyToClipboard.astro +219 -0
- package/scaffold/astro-app/src/components/Divider.astro +37 -0
- package/scaffold/astro-app/src/components/Dropdown.astro +807 -0
- package/scaffold/astro-app/src/components/FormGroup.astro +59 -0
- package/scaffold/astro-app/src/components/FrameworkSwitcher.astro +72 -0
- package/scaffold/astro-app/src/components/Input.astro +59 -0
- package/scaffold/astro-app/src/components/Modal.astro +212 -0
- package/scaffold/astro-app/src/components/Navbar.astro +701 -0
- package/scaffold/astro-app/src/components/Pagination.astro +240 -0
- package/scaffold/astro-app/src/components/ProgressBar.astro +65 -0
- package/scaffold/astro-app/src/components/Radio.astro +38 -0
- package/scaffold/astro-app/src/components/Search.astro +1259 -0
- package/scaffold/astro-app/src/components/Select.astro +49 -0
- package/scaffold/astro-app/src/components/Settings.astro +382 -0
- package/scaffold/astro-app/src/components/Spinner.astro +30 -0
- package/scaffold/astro-app/src/components/Table.astro +181 -0
- package/scaffold/astro-app/src/components/Tabs.astro +223 -0
- package/scaffold/astro-app/src/components/Textarea.astro +58 -0
- package/scaffold/astro-app/src/components/ThemeSwitcher.astro +504 -0
- package/scaffold/astro-app/src/components/Toast.astro +30 -0
- package/scaffold/astro-app/src/components/Tooltip.astro +32 -0
- package/scaffold/astro-app/src/components/icons/Brush.astro +10 -0
- package/scaffold/astro-app/src/components/icons/Cake.astro +11 -0
- package/scaffold/astro-app/src/components/icons/Check.astro +29 -0
- package/scaffold/astro-app/src/components/icons/Cherry.astro +11 -0
- package/scaffold/astro-app/src/components/icons/ChevronDown.astro +29 -0
- package/scaffold/astro-app/src/components/icons/Circle.astro +29 -0
- package/scaffold/astro-app/src/components/icons/Close.astro +30 -0
- package/scaffold/astro-app/src/components/icons/Cmd.astro +26 -0
- package/scaffold/astro-app/src/components/icons/Copy.astro +30 -0
- package/scaffold/astro-app/src/components/icons/Eye.astro +30 -0
- package/scaffold/astro-app/src/components/icons/Filter.astro +29 -0
- package/scaffold/astro-app/src/components/icons/Flame.astro +28 -0
- package/scaffold/astro-app/src/components/icons/Flower.astro +11 -0
- package/scaffold/astro-app/src/components/icons/Gear.astro +30 -0
- package/scaffold/astro-app/src/components/icons/Heart.astro +28 -0
- package/scaffold/astro-app/src/components/icons/IceCream.astro +31 -0
- package/scaffold/astro-app/src/components/icons/Leaf.astro +29 -0
- package/scaffold/astro-app/src/components/icons/Lemon.astro +11 -0
- package/scaffold/astro-app/src/components/icons/Moon.astro +29 -0
- package/scaffold/astro-app/src/components/icons/Owl.astro +34 -0
- package/scaffold/astro-app/src/components/icons/Palette.astro +33 -0
- package/scaffold/astro-app/src/components/icons/Rainbow.astro +31 -0
- package/scaffold/astro-app/src/components/icons/Search.astro +30 -0
- package/scaffold/astro-app/src/components/icons/Shield.astro +28 -0
- package/scaffold/astro-app/src/components/icons/Snowflake.astro +34 -0
- package/scaffold/astro-app/src/components/icons/Sort.astro +30 -0
- package/scaffold/astro-app/src/components/icons/Sun.astro +29 -0
- package/scaffold/astro-app/src/components/icons/Sunset.astro +10 -0
- package/scaffold/astro-app/src/components/icons/Zap.astro +9 -0
- package/scaffold/astro-app/src/components/icons/devicons/Astro.astro +53 -0
- package/scaffold/astro-app/src/components/icons/devicons/Bash.astro +34 -0
- package/scaffold/astro-app/src/components/icons/devicons/Css3.astro +29 -0
- package/scaffold/astro-app/src/components/icons/devicons/Git.astro +24 -0
- package/scaffold/astro-app/src/components/icons/devicons/Html5.astro +27 -0
- package/scaffold/astro-app/src/components/icons/devicons/Javascript.astro +25 -0
- package/scaffold/astro-app/src/components/icons/devicons/Nodejs.astro +47 -0
- package/scaffold/astro-app/src/components/icons/devicons/Plaintext.astro +33 -0
- package/scaffold/astro-app/src/components/icons/devicons/React.astro +27 -0
- package/scaffold/astro-app/src/components/icons/devicons/Svelte.astro +25 -0
- package/scaffold/astro-app/src/components/icons/devicons/Vue.astro +26 -0
- package/scaffold/astro-app/src/config/frameworks.ts +26 -0
- package/scaffold/astro-app/src/config/themes.ts +54 -0
- package/scaffold/astro-app/src/layouts/DocsLayout.astro +204 -0
- package/scaffold/astro-app/src/layouts/Layout.astro +11 -2
- package/scaffold/astro-app/src/pages/components/accordion.astro +172 -0
- package/scaffold/astro-app/src/pages/components/alert.astro +250 -0
- package/scaffold/astro-app/src/pages/components/avatar.astro +102 -0
- package/scaffold/astro-app/src/pages/components/badge.astro +119 -0
- package/scaffold/astro-app/src/pages/components/breadcrumb.astro +124 -0
- package/scaffold/astro-app/src/pages/components/button.astro +74 -0
- package/scaffold/astro-app/src/pages/components/cards.astro +247 -0
- package/scaffold/astro-app/src/pages/components/copy-to-clipboard.astro +49 -0
- package/scaffold/astro-app/src/pages/components/divider.astro +74 -0
- package/scaffold/astro-app/src/pages/components/dropdown.astro +394 -0
- package/scaffold/astro-app/src/pages/components/forms.astro +367 -0
- package/scaffold/astro-app/src/pages/components/icons.astro +246 -0
- package/scaffold/astro-app/src/pages/components/modal.astro +152 -0
- package/scaffold/astro-app/src/pages/components/navbar.astro +80 -0
- package/scaffold/astro-app/src/pages/components/pagination.astro +126 -0
- package/scaffold/astro-app/src/pages/components/progress-bar.astro +94 -0
- package/scaffold/astro-app/src/pages/components/search.astro +155 -0
- package/scaffold/astro-app/src/pages/components/settings.astro +78 -0
- package/scaffold/astro-app/src/pages/components/spinner.astro +81 -0
- package/scaffold/astro-app/src/pages/components/table.astro +144 -0
- package/scaffold/astro-app/src/pages/components/tabs.astro +220 -0
- package/scaffold/astro-app/src/pages/components/theme-switcher.astro +67 -0
- package/scaffold/astro-app/src/pages/components/toast.astro +157 -0
- package/scaffold/astro-app/src/pages/components/tooltip.astro +209 -0
- package/scaffold/astro-app/src/pages/components.astro +290 -0
- package/scaffold/astro-app/src/pages/docs/accessibility.astro +9 -0
- package/scaffold/astro-app/src/pages/docs/colors.astro +9 -0
- package/scaffold/astro-app/src/pages/docs/design-system.astro +9 -0
- package/scaffold/astro-app/src/pages/docs/getting-started.astro +9 -0
- package/scaffold/astro-app/src/pages/docs/index.astro +15 -0
- package/scaffold/astro-app/src/pages/docs/themes/[theme].astro +14 -0
- package/scaffold/astro-app/src/pages/docs/theming.astro +10 -0
- package/scaffold/astro-app/src/pages/index.astro +5 -11
- package/scaffold/svelte/Table.svelte +6 -5
- package/scaffold/svelte/Tabs.svelte +3 -1
- package/scaffold/svelte-app/README.md +9 -2
- package/scaffold/svelte-app/src/app.html +1 -1
- package/scaffold/svelte-app/src/lib/rizzo/Accordion.svelte +128 -0
- package/scaffold/svelte-app/src/lib/rizzo/Alert.svelte +85 -0
- package/scaffold/svelte-app/src/lib/rizzo/Avatar.svelte +39 -0
- package/scaffold/svelte-app/src/lib/rizzo/Badge.svelte +31 -0
- package/scaffold/svelte-app/src/lib/rizzo/Breadcrumb.svelte +49 -0
- package/scaffold/svelte-app/src/lib/rizzo/Button.svelte +27 -0
- package/scaffold/svelte-app/src/lib/rizzo/Card.svelte +17 -0
- package/scaffold/svelte-app/src/lib/rizzo/Checkbox.svelte +37 -0
- package/scaffold/svelte-app/src/lib/rizzo/CopyToClipboard.svelte +79 -0
- package/scaffold/svelte-app/src/lib/rizzo/Divider.svelte +28 -0
- package/scaffold/svelte-app/src/lib/rizzo/Dropdown.svelte +254 -0
- package/scaffold/svelte-app/src/lib/rizzo/FormGroup.svelte +51 -0
- package/scaffold/svelte-app/src/lib/rizzo/Input.svelte +59 -0
- package/scaffold/svelte-app/src/lib/rizzo/Modal.svelte +157 -0
- package/scaffold/svelte-app/src/lib/rizzo/Pagination.svelte +93 -0
- package/scaffold/svelte-app/src/lib/rizzo/ProgressBar.svelte +58 -0
- package/scaffold/svelte-app/src/lib/rizzo/Radio.svelte +38 -0
- package/scaffold/svelte-app/src/lib/rizzo/Select.svelte +51 -0
- package/scaffold/svelte-app/src/lib/rizzo/Spinner.svelte +14 -0
- package/scaffold/svelte-app/src/lib/rizzo/Table.svelte +158 -0
- package/scaffold/svelte-app/src/lib/rizzo/Tabs.svelte +117 -0
- package/scaffold/svelte-app/src/lib/rizzo/Textarea.svelte +59 -0
- package/scaffold/svelte-app/src/lib/rizzo/ThemeSwitcher.svelte +315 -0
- package/scaffold/svelte-app/src/lib/rizzo/Toast.svelte +33 -0
- package/scaffold/svelte-app/src/lib/rizzo/Tooltip.svelte +19 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Check.svelte +29 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/ChevronDown.svelte +29 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Circle.svelte +29 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Close.svelte +30 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Cmd.svelte +27 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Copy.svelte +30 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Eye.svelte +30 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Filter.svelte +29 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Gear.svelte +30 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/IceCream.svelte +31 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Moon.svelte +29 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Owl.svelte +34 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Palette.svelte +33 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Rainbow.svelte +31 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Search.svelte +30 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Snowflake.svelte +34 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/Sort.svelte +30 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Astro.svelte +45 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Bash.svelte +28 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Css3.svelte +23 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Git.svelte +18 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Html5.svelte +21 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Javascript.svelte +19 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Nodejs.svelte +44 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Plaintext.svelte +24 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/React.svelte +21 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/SvelteIcon.svelte +19 -0
- package/scaffold/svelte-app/src/lib/rizzo/icons/devicons/Vue.svelte +20 -0
- package/scaffold/svelte-app/src/lib/rizzo/index.ts +33 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/CodeBlock.svelte +239 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/SvelteDocPage.svelte +99 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AccordionDoc.svelte +53 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AlertDoc.svelte +114 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/AvatarDoc.svelte +92 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/BadgeDoc.svelte +60 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/BreadcrumbDoc.svelte +55 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ButtonDoc.svelte +55 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/CardsDoc.svelte +173 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ComingSoon.svelte +12 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ComponentsOverview.svelte +92 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/CopyToClipboardDoc.svelte +26 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/DividerDoc.svelte +105 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/DropdownDoc.svelte +161 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/FormsDoc.svelte +375 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/IconsDoc.svelte +246 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/Index.svelte +8 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ModalDoc.svelte +50 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/NavbarDoc.svelte +79 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/PaginationDoc.svelte +44 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ProgressBarDoc.svelte +95 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SearchDoc.svelte +147 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SettingsDoc.svelte +158 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/SpinnerDoc.svelte +41 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TableDoc.svelte +116 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TabsDoc.svelte +152 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ThemeSwitcherDoc.svelte +181 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/Theming.svelte +6 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/ToastDoc.svelte +136 -0
- package/scaffold/svelte-app/src/lib/rizzo-docs/pages/TooltipDoc.svelte +57 -0
- package/scaffold/svelte-app/src/routes/+page.svelte +2 -2
- package/scaffold/svelte-app/src/routes/components/+page.svelte +4 -0
- package/scaffold/svelte-app/src/routes/components/[slug]/+page.svelte +7 -0
- package/scaffold/vanilla/README.md +20 -8
- package/scaffold/vanilla/components/accordion.html +187 -0
- package/scaffold/vanilla/components/alert.html +187 -0
- package/scaffold/vanilla/components/avatar.html +187 -0
- package/scaffold/vanilla/components/badge.html +187 -0
- package/scaffold/vanilla/components/breadcrumb.html +187 -0
- package/scaffold/vanilla/components/button.html +187 -0
- package/scaffold/vanilla/components/cards.html +187 -0
- package/scaffold/vanilla/components/copy-to-clipboard.html +187 -0
- package/scaffold/vanilla/components/divider.html +187 -0
- package/scaffold/vanilla/components/dropdown.html +187 -0
- package/scaffold/vanilla/components/forms.html +187 -0
- package/scaffold/vanilla/components/icons.html +187 -0
- package/scaffold/vanilla/components/index.html +212 -0
- package/scaffold/vanilla/components/modal.html +187 -0
- package/scaffold/vanilla/components/navbar.html +187 -0
- package/scaffold/vanilla/components/pagination.html +187 -0
- package/scaffold/vanilla/components/progress-bar.html +187 -0
- package/scaffold/vanilla/components/search.html +187 -0
- package/scaffold/vanilla/components/settings.html +187 -0
- package/scaffold/vanilla/components/spinner.html +187 -0
- package/scaffold/vanilla/components/table.html +187 -0
- package/scaffold/vanilla/components/tabs.html +187 -0
- package/scaffold/vanilla/components/theme-switcher.html +187 -0
- package/scaffold/vanilla/components/toast.html +187 -0
- package/scaffold/vanilla/components/tooltip.html +187 -0
- package/scaffold/vanilla/index.html +17 -283
- package/scaffold/vanilla/js/main.js +748 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import CodeBlock from '$lib/rizzo-docs/CodeBlock.svelte';
|
|
3
|
+
|
|
4
|
+
// Build code string so Svelte does not interpret {open} / {query} as expressions
|
|
5
|
+
const o = '{open}';
|
|
6
|
+
const notOpen = '{!open}';
|
|
7
|
+
const setOpenFalse = '() => (open = false)';
|
|
8
|
+
const toggleOpen = '() => (open = !open)';
|
|
9
|
+
const query = '{query}';
|
|
10
|
+
const searchStructureCode =
|
|
11
|
+
`<div class="search" data-search>
|
|
12
|
+
<div class="search__trigger-wrapper">
|
|
13
|
+
<button
|
|
14
|
+
type="button"
|
|
15
|
+
class="search__trigger"
|
|
16
|
+
aria-label="Open search"
|
|
17
|
+
aria-expanded=` +
|
|
18
|
+
o +
|
|
19
|
+
`
|
|
20
|
+
aria-controls="search-results-panel"
|
|
21
|
+
onclick=` +
|
|
22
|
+
toggleOpen +
|
|
23
|
+
`
|
|
24
|
+
>
|
|
25
|
+
<SearchIcon class="search__icon" width={20} height={20} />
|
|
26
|
+
<span class="search__trigger-text">Search</span>
|
|
27
|
+
<kbd class="search__kbd" aria-hidden="true"><span class="search__kbd-modifier"><!-- Cmd icon --></span><kbd>K</kbd></kbd>
|
|
28
|
+
</button>
|
|
29
|
+
</div>
|
|
30
|
+
<div
|
|
31
|
+
class="search__overlay"
|
|
32
|
+
data-search-overlay
|
|
33
|
+
aria-hidden=` +
|
|
34
|
+
notOpen +
|
|
35
|
+
`
|
|
36
|
+
role="dialog"
|
|
37
|
+
aria-modal="true"
|
|
38
|
+
>
|
|
39
|
+
<div
|
|
40
|
+
class="search__panel"
|
|
41
|
+
id="search-results-panel"
|
|
42
|
+
tabindex="-1"
|
|
43
|
+
aria-hidden=` +
|
|
44
|
+
notOpen +
|
|
45
|
+
`
|
|
46
|
+
>
|
|
47
|
+
<div class="search__header">
|
|
48
|
+
<input
|
|
49
|
+
type="search"
|
|
50
|
+
class="search__input"
|
|
51
|
+
placeholder="Search documentation..."
|
|
52
|
+
aria-label="Search"
|
|
53
|
+
data-search-input
|
|
54
|
+
bind:value=` +
|
|
55
|
+
query +
|
|
56
|
+
`
|
|
57
|
+
/>
|
|
58
|
+
<button type="button" class="search__close-btn" aria-label="Close" onclick=` +
|
|
59
|
+
setOpenFalse +
|
|
60
|
+
`>
|
|
61
|
+
Close
|
|
62
|
+
</button>
|
|
63
|
+
</div>
|
|
64
|
+
<div class="search__results" role="listbox" aria-label="Search results">
|
|
65
|
+
<!-- search__empty / search__results-list / search__loading / search__no-results -->
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</div>`;
|
|
70
|
+
</script>
|
|
71
|
+
|
|
72
|
+
<section>
|
|
73
|
+
<h2>Search component</h2>
|
|
74
|
+
<p>An accessible search overlay with Algolia integration (or client-side fallback). The docs site uses the <strong>Astro</strong> Search in the layout. In a Svelte app, use the same BEM classes and data attributes; wire open/close state, <strong>Cmd+K</strong> / <strong>Ctrl+K</strong>, and your search API or Algolia client.</p>
|
|
75
|
+
|
|
76
|
+
<h3>Live example</h3>
|
|
77
|
+
<p>Search is in the navbar (top of page) — click the search icon or press <kbd>Ctrl+K</kbd> / <kbd>Cmd+K</kbd>. You can also use the <strong>standalone search above</strong> (same as navbar).</p>
|
|
78
|
+
|
|
79
|
+
<h3>Features</h3>
|
|
80
|
+
<ul>
|
|
81
|
+
<li><strong>Full-screen overlay</strong> — Centered search panel; overlay covers the viewport when open.</li>
|
|
82
|
+
<li><strong>Keyboard shortcut</strong> — <kbd>Ctrl+K</kbd> / <kbd>Cmd+K</kbd> to open or close.</li>
|
|
83
|
+
<li><strong>Escape</strong> — Closes search; restore focus to trigger.</li>
|
|
84
|
+
<li>Close button (X) with screen reader label; optional text label on mobile.</li>
|
|
85
|
+
<li>Live results as you type; Algolia integration or client-side search.</li>
|
|
86
|
+
<li>Full keyboard navigation (Arrow keys, Enter, Tab) in results.</li>
|
|
87
|
+
<li>Mobile responsive; full-width panel on small screens. Mutually exclusive with mobile menu on the docs site.</li>
|
|
88
|
+
<li>ARIA (dialog, listbox, searchbox), focus trap, and live regions for screen readers.</li>
|
|
89
|
+
</ul>
|
|
90
|
+
|
|
91
|
+
<h3>Key BEM classes and data attributes</h3>
|
|
92
|
+
<p>Use these so styles and any shared scripts (e.g. Cmd+K) work. Toggle <code>aria-hidden</code> on the overlay and panel from your open state.</p>
|
|
93
|
+
<ul>
|
|
94
|
+
<li><code>search</code> — root wrapper; use <code>data-search</code> if you reuse the Astro script pattern.</li>
|
|
95
|
+
<li><code>search__trigger-wrapper</code> / <code>search__trigger</code> — button to open search; <code>aria-expanded</code>, <code>aria-controls</code> = panel id.</li>
|
|
96
|
+
<li><code>search__overlay</code> — full-screen overlay; <code>data-search-overlay</code>; set <code>aria-hidden</code> from state.</li>
|
|
97
|
+
<li><code>search__panel</code> — dialog panel; <code>role="dialog"</code>, <code>aria-modal="true"</code>, <code>aria-labelledby</code> (title id), <code>tabindex="-1"</code> for focus trap.</li>
|
|
98
|
+
<li><code>search__header</code> — contains input row and close button.</li>
|
|
99
|
+
<li><code>search__input-wrapper</code> / <code>search__input</code> — search input; <code>aria-controls</code> = results list id; <code>data-search-input</code> for script hooks.</li>
|
|
100
|
+
<li><code>search__clear</code> — clear input button; <code>data-search-clear</code>.</li>
|
|
101
|
+
<li><code>search__close-btn</code> — close overlay button.</li>
|
|
102
|
+
<li><code>search__results</code> — container for results; <code>role="listbox"</code>, <code>aria-label="Search results"</code>, <code>aria-live="polite"</code>.</li>
|
|
103
|
+
<li><code>search__empty</code>, <code>search__loading</code>, <code>search__no-results</code> — states; use <code>hidden</code> or conditional render.</li>
|
|
104
|
+
<li><code>search__result-item</code> / <code>search__result-title</code> / <code>search__result-category</code> / <code>search__result-content</code> — result row and parts.</li>
|
|
105
|
+
</ul>
|
|
106
|
+
|
|
107
|
+
<h3>Structure example (simplified)</h3>
|
|
108
|
+
<p>Minimal markup; add IDs, ARIA, and data attributes as needed. Control visibility with <code>aria-hidden</code> and optional classes.</p>
|
|
109
|
+
<CodeBlock
|
|
110
|
+
code={searchStructureCode}
|
|
111
|
+
language="svelte"
|
|
112
|
+
/>
|
|
113
|
+
|
|
114
|
+
<h3>Implementing in Svelte</h3>
|
|
115
|
+
<ul>
|
|
116
|
+
<li><strong>Open state:</strong> e.g. <code>let open = $state(false)</code>. Set <code>aria-expanded</code> on the trigger and <code>{'aria-hidden={!open}'}</code> on overlay and panel.</li>
|
|
117
|
+
<li><strong>Cmd+K / Ctrl+K:</strong> Add a <code>keydown</code> listener on <code>window</code> or <code>document</code>; if <code>key === 'k'</code> and (metaKey or ctrlKey), prevent default and toggle <code>{'open'}</code>.</li>
|
|
118
|
+
<li><strong>Escape:</strong> When overlay is open, handle Escape to set <code>{'open = false'}</code> and call <code>triggerEl.focus()</code>.</li>
|
|
119
|
+
<li><strong>Focus trap:</strong> When open, focus the input; trap Tab inside the panel; on close, restore focus to the trigger.</li>
|
|
120
|
+
<li><strong>Search:</strong> Connect <code>query</code> to Algolia (e.g. <code>searchClient</code> + index) or to client-side filtering; render results with <code>search__result-item</code> and siblings. Use <code>aria-activedescendant</code> for keyboard-highlighted result.</li>
|
|
121
|
+
</ul>
|
|
122
|
+
|
|
123
|
+
<h3>Keyboard shortcuts</h3>
|
|
124
|
+
<ul>
|
|
125
|
+
<li><kbd>Ctrl+K</kbd> / <kbd>Cmd+K</kbd> — Open or close search</li>
|
|
126
|
+
<li><kbd>Escape</kbd> — Close search</li>
|
|
127
|
+
<li><kbd>Arrow Down</kbd> — Next result</li>
|
|
128
|
+
<li><kbd>Arrow Up</kbd> — Previous result</li>
|
|
129
|
+
<li><kbd>Enter</kbd> — Open selected result</li>
|
|
130
|
+
</ul>
|
|
131
|
+
|
|
132
|
+
<p><a href="/docs/components/search">Full Astro Search documentation</a> — Algolia setup, props, and the inline script you can port to Svelte.</p>
|
|
133
|
+
<p><a href="/docs/svelte/components">← Back to Svelte components</a></p>
|
|
134
|
+
</section>
|
|
135
|
+
|
|
136
|
+
<style>
|
|
137
|
+
kbd {
|
|
138
|
+
display: inline-block;
|
|
139
|
+
padding: var(--spacing-0-125) var(--spacing-0-375);
|
|
140
|
+
background-color: var(--background-alt);
|
|
141
|
+
border: var(--outline-width) solid var(--border);
|
|
142
|
+
border-radius: var(--radius);
|
|
143
|
+
font-family: var(--font-family-mono);
|
|
144
|
+
font-size: var(--font-size-xs);
|
|
145
|
+
line-height: 1;
|
|
146
|
+
}
|
|
147
|
+
</style>
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import CodeBlock from '$lib/rizzo-docs/CodeBlock.svelte';
|
|
3
|
+
import Gear from '$lib/rizzo/icons/Gear.svelte';
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<section>
|
|
7
|
+
<h2>Settings component</h2>
|
|
8
|
+
<p>Slide-in panel for theme, font size, and accessibility options. All settings persist in <code>localStorage</code>. The docs site uses the <strong>Astro</strong> Settings in the layout; open via the navbar gear or <code>window.openSettings()</code>. In a Svelte app, use the same BEM classes and wire state + persistence to match.</p>
|
|
9
|
+
|
|
10
|
+
<h3>Live example</h3>
|
|
11
|
+
<p>Open Settings via the <strong>gear icon in the navbar</strong> or the button below (same as navbar).</p>
|
|
12
|
+
<div class="example">
|
|
13
|
+
<div class="example-title">Open Settings</div>
|
|
14
|
+
<button type="button" class="navbar__settings-btn" aria-label="Open settings" onclick={() => window.openSettings?.()}>
|
|
15
|
+
<Gear class="navbar__settings-icon" width={20} height={20} />
|
|
16
|
+
<span class="navbar__settings-label">Settings</span>
|
|
17
|
+
</button>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<h3>Features</h3>
|
|
21
|
+
<ul>
|
|
22
|
+
<li><strong>Theme switcher</strong> — Integrated ThemeSwitcher; persists as <code>theme</code> in localStorage (e.g. <code>github-dark-classic</code>, <code>system</code>).</li>
|
|
23
|
+
<li><strong>Font size slider</strong> — 75%–150%; track uses <code>--slider-progress</code>. Persists as <code>fontSizeScale</code>; apply as <code>--font-size-scale</code> on <code>html</code>.</li>
|
|
24
|
+
<li><strong>Reduce motion</strong> — Toggle adds <code>.reduced-motion</code> to document root. Persists as <code>reducedMotion</code> (<code>true</code>/<code>false</code> string).</li>
|
|
25
|
+
<li><strong>High contrast</strong> — Toggle adds <code>.high-contrast</code> to root. Persists as <code>highContrast</code>.</li>
|
|
26
|
+
<li><strong>Scrollbar style</strong> — Radio: Thin (default), Thick, Hidden. Applies <code>.scrollbar-thick</code> or <code>.scrollbar-hidden</code> on <code>html</code>. Persists as <code>scrollbarStyle</code> (<code>thin</code>, <code>thick</code>, <code>hidden</code>).</li>
|
|
27
|
+
<li>Slide-in from right with overlay; animations respect <code>prefers-reduced-motion</code>.</li>
|
|
28
|
+
<li>Focus trap when open; focus returns to trigger on close. Escape closes. ARIA (dialog, labels).</li>
|
|
29
|
+
<li>Mobile: full-width panel.</li>
|
|
30
|
+
</ul>
|
|
31
|
+
|
|
32
|
+
<h3>Key BEM classes and data attributes</h3>
|
|
33
|
+
<ul>
|
|
34
|
+
<li><code>settings</code> — root; <code>data-settings</code>. Set <code>aria-hidden</code> from open state.</li>
|
|
35
|
+
<li><code>settings__overlay</code> — backdrop; <code>data-settings-overlay</code>; click to close.</li>
|
|
36
|
+
<li><code>settings__panel</code> — drawer; <code>role="dialog"</code>, <code>aria-modal="true"</code>, <code>aria-labelledby="settings-title"</code>.</li>
|
|
37
|
+
<li><code>settings__header</code>, <code>settings__title</code>, <code>settings__close</code> — header and close button; <code>data-settings-close</code>.</li>
|
|
38
|
+
<li><code>settings__content</code> — scrollable body.</li>
|
|
39
|
+
<li><code>settings__section</code>, <code>settings__section-title</code>, <code>settings__control</code> — section layout.</li>
|
|
40
|
+
<li><code>settings__label</code>, <code>settings__label-text</code>, <code>settings__label-value</code> — labels; <code>data-font-size-value</code> for the percentage display.</li>
|
|
41
|
+
<li><code>settings__slider</code> — range input; <code>data-font-size-slider</code>, <code>style="--slider-progress: 50%"</code> for filled track.</li>
|
|
42
|
+
<li><code>settings__slider-labels</code> — e.g. Small / Default / Large.</li>
|
|
43
|
+
<li><code>settings__checkbox-label</code>, <code>settings__checkbox</code> — toggles; <code>data-reduced-motion</code>, <code>data-high-contrast</code>.</li>
|
|
44
|
+
<li><code>settings__radio-group</code> (role="radiogroup"), <code>settings__radio-label</code>, <code>settings__radio</code> — scrollbar options; <code>data-scrollbar-style</code>, <code>name="scrollbar-style"</code>, values <code>thin</code> / <code>thick</code> / <code>hidden</code>.</li>
|
|
45
|
+
<li><code>settings__help-text</code> — description under controls.</li>
|
|
46
|
+
</ul>
|
|
47
|
+
|
|
48
|
+
<h3>Persistence (localStorage)</h3>
|
|
49
|
+
<p>Read/write these keys and apply to the document so styles and theme stay in sync:</p>
|
|
50
|
+
<ul>
|
|
51
|
+
<li><code>theme</code> — theme id or <code>system</code>; set <code>data-theme</code> on <code>html</code>.</li>
|
|
52
|
+
<li><code>fontSizeScale</code> — number string (e.g. <code>1</code>, <code>1.25</code>); set <code>style="--font-size-scale: …"</code> on <code>html</code>.</li>
|
|
53
|
+
<li><code>reducedMotion</code> — <code>"true"</code> / <code>"false"</code>; add/remove <code>.reduced-motion</code> on <code>html</code>.</li>
|
|
54
|
+
<li><code>highContrast</code> — <code>"true"</code> / <code>"false"</code>; add/remove <code>.high-contrast</code> on <code>html</code>.</li>
|
|
55
|
+
<li><code>scrollbarStyle</code> — <code>thin</code> / <code>thick</code> / <code>hidden</code>; add <code>.scrollbar-thick</code> or <code>.scrollbar-hidden</code> on <code>html</code> when not thin.</li>
|
|
56
|
+
</ul>
|
|
57
|
+
|
|
58
|
+
<h3>Structure example (simplified)</h3>
|
|
59
|
+
<CodeBlock
|
|
60
|
+
code={`<div class="settings" data-settings aria-hidden={!open}>
|
|
61
|
+
<div class="settings__overlay" data-settings-overlay onclick={() => (open = false)}></div>
|
|
62
|
+
<div
|
|
63
|
+
class="settings__panel"
|
|
64
|
+
role="dialog"
|
|
65
|
+
aria-modal="true"
|
|
66
|
+
aria-labelledby="settings-title"
|
|
67
|
+
aria-hidden={!open}
|
|
68
|
+
>
|
|
69
|
+
<div class="settings__header">
|
|
70
|
+
<h2 id="settings-title" class="settings__title">Settings</h2>
|
|
71
|
+
<button type="button" class="settings__close" aria-label="Close settings" data-settings-close onclick={() => (open = false)">×</button>
|
|
72
|
+
</div>
|
|
73
|
+
<div class="settings__content">
|
|
74
|
+
<section class="settings__section">
|
|
75
|
+
<h3 class="settings__section-title">Theme</h3>
|
|
76
|
+
<div class="settings__control"><!-- ThemeSwitcher or theme list --></div>
|
|
77
|
+
</section>
|
|
78
|
+
<section class="settings__section">
|
|
79
|
+
<h3 class="settings__section-title">Font Size</h3>
|
|
80
|
+
<div class="settings__control">
|
|
81
|
+
<label for="font-size-slider" class="settings__label">
|
|
82
|
+
<span class="settings__label-text">Adjust text size</span>
|
|
83
|
+
<span class="settings__label-value" data-font-size-value>{fontSizePercent}%</span>
|
|
84
|
+
</label>
|
|
85
|
+
<input type="range" id="font-size-slider" class="settings__slider" min="0.75" max="1.5" step="0.05" bind:value={fontSizeScale} style="--slider-progress: {sliderProgress}" data-font-size-slider />
|
|
86
|
+
<div class="settings__slider-labels"><span>Small</span><span>Default</span><span>Large</span></div>
|
|
87
|
+
</div>
|
|
88
|
+
</section>
|
|
89
|
+
<section class="settings__section">
|
|
90
|
+
<h3 class="settings__section-title">Accessibility</h3>
|
|
91
|
+
<div class="settings__control">
|
|
92
|
+
<label class="settings__checkbox-label">
|
|
93
|
+
<input type="checkbox" class="settings__checkbox" bind:checked={reducedMotion} data-reduced-motion />
|
|
94
|
+
<span>Reduce motion</span>
|
|
95
|
+
</label>
|
|
96
|
+
<p class="settings__help-text">Minimize animations and transitions</p>
|
|
97
|
+
</div>
|
|
98
|
+
<div class="settings__control">
|
|
99
|
+
<label class="settings__checkbox-label">
|
|
100
|
+
<input type="checkbox" class="settings__checkbox" bind:checked={highContrast} data-high-contrast />
|
|
101
|
+
<span>High contrast</span>
|
|
102
|
+
</label>
|
|
103
|
+
<p class="settings__help-text">Increase contrast for better visibility</p>
|
|
104
|
+
</div>
|
|
105
|
+
<div class="settings__control">
|
|
106
|
+
<div class="settings__label"><span class="settings__label-text">Scrollbar style</span></div>
|
|
107
|
+
<div class="settings__radio-group" role="radiogroup" aria-label="Scrollbar style">
|
|
108
|
+
<label class="settings__radio-label">
|
|
109
|
+
<input type="radio" name="scrollbar-style" value="thin" class="settings__radio" bind:group={scrollbarStyle} data-scrollbar-style />
|
|
110
|
+
<span>Thin</span>
|
|
111
|
+
</label>
|
|
112
|
+
<label class="settings__radio-label">
|
|
113
|
+
<input type="radio" name="scrollbar-style" value="thick" class="settings__radio" bind:group={scrollbarStyle} data-scrollbar-style />
|
|
114
|
+
<span>Thick</span>
|
|
115
|
+
</label>
|
|
116
|
+
<label class="settings__radio-label">
|
|
117
|
+
<input type="radio" name="scrollbar-style" value="hidden" class="settings__radio" bind:group={scrollbarStyle} data-scrollbar-style />
|
|
118
|
+
<span>Hidden</span>
|
|
119
|
+
</label>
|
|
120
|
+
</div>
|
|
121
|
+
<p class="settings__help-text">Choose your preferred scrollbar appearance</p>
|
|
122
|
+
</div>
|
|
123
|
+
</section>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
</div>`}
|
|
127
|
+
language="svelte"
|
|
128
|
+
/>
|
|
129
|
+
|
|
130
|
+
<h3>Implementing in Svelte</h3>
|
|
131
|
+
<ul>
|
|
132
|
+
<li><strong>Open state:</strong> e.g. <code>let open = $state(false)</code>. Set <code>{'aria-hidden={!open}'}</code> on root, overlay, and panel. Expose <code>openSettings()</code> / <code>closeSettings()</code> (e.g. on a global or context) so the navbar can open the panel.</li>
|
|
133
|
+
<li><strong>Overlay/close:</strong> Click overlay or close button → <code>{'open = false'}</code>. Escape key → close and restore focus to trigger.</li>
|
|
134
|
+
<li><strong>Focus trap:</strong> When open, focus first focusable in panel; trap Tab inside; on close, focus the element that opened (e.g. settings button).</li>
|
|
135
|
+
<li><strong>Persistence:</strong> On change, write to <code>localStorage</code> and update <code>html</code> (classes, <code>data-theme</code>, <code>--font-size-scale</code>). On mount, read from <code>localStorage</code> and set initial state + DOM.</li>
|
|
136
|
+
<li><strong>Slider progress:</strong> Compute <code>--slider-progress</code> from <code>(value - min) / (max - min) * 100%</code> for the filled track gradient.</li>
|
|
137
|
+
</ul>
|
|
138
|
+
|
|
139
|
+
<h3>Opening from navbar</h3>
|
|
140
|
+
<p>Expose a global so the navbar settings button can open the panel. In your Settings component, use <code>onMount</code> to set <code>window.openSettings</code> and <code>window.closeSettings</code> to functions that toggle your <code>{'open'}</code> state and restore focus. The Vanilla scaffold and Astro layout do the same.</p>
|
|
141
|
+
<CodeBlock
|
|
142
|
+
code={`// Inside your Settings component (or a parent that holds open state)
|
|
143
|
+
import { onMount } from 'svelte';
|
|
144
|
+
let open = $state(false);
|
|
145
|
+
onMount(() => {
|
|
146
|
+
(window as any).openSettings = () => { open = true; };
|
|
147
|
+
(window as any).closeSettings = () => { open = false; };
|
|
148
|
+
return () => {
|
|
149
|
+
delete (window as any).openSettings;
|
|
150
|
+
delete (window as any).closeSettings;
|
|
151
|
+
};
|
|
152
|
+
});`}
|
|
153
|
+
language="svelte"
|
|
154
|
+
/>
|
|
155
|
+
|
|
156
|
+
<p><a href="/docs/components/settings">Full Astro Settings documentation</a> — layout, persistence, and the inline script you can port to Svelte.</p>
|
|
157
|
+
<p><a href="/docs/svelte/components">← Back to Svelte components</a></p>
|
|
158
|
+
</section>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Spinner from '$lib/rizzo/Spinner.svelte';
|
|
3
|
+
import CodeBlock from '$lib/rizzo-docs/CodeBlock.svelte';
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<section>
|
|
7
|
+
<h2>Spinner component</h2>
|
|
8
|
+
<p>Respects reduced motion via CSS.</p>
|
|
9
|
+
|
|
10
|
+
<h3>Sizes and variants</h3>
|
|
11
|
+
<div class="example">
|
|
12
|
+
<div class="example-title">Live examples</div>
|
|
13
|
+
<div class="example-row">
|
|
14
|
+
<Spinner size="sm" />
|
|
15
|
+
<Spinner size="md" />
|
|
16
|
+
<Spinner size="lg" />
|
|
17
|
+
<Spinner variant="success" />
|
|
18
|
+
<Spinner variant="error" label="Loading…" />
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
<h3>Usage</h3>
|
|
23
|
+
<CodeBlock
|
|
24
|
+
code={`<script>
|
|
25
|
+
import Spinner from './components/svelte/Spinner.svelte';
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<Spinner />
|
|
29
|
+
<Spinner size="lg" variant="success" label="Loading…" />`}
|
|
30
|
+
language="svelte"
|
|
31
|
+
/>
|
|
32
|
+
</section>
|
|
33
|
+
|
|
34
|
+
<style>
|
|
35
|
+
.example-row {
|
|
36
|
+
display: flex;
|
|
37
|
+
flex-wrap: wrap;
|
|
38
|
+
gap: var(--spacing-4);
|
|
39
|
+
align-items: center;
|
|
40
|
+
}
|
|
41
|
+
</style>
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Table from '$lib/rizzo/Table.svelte';
|
|
3
|
+
import CodeBlock from '$lib/rizzo-docs/CodeBlock.svelte';
|
|
4
|
+
|
|
5
|
+
const basicColumns = [
|
|
6
|
+
{ key: 'name', label: 'Name' },
|
|
7
|
+
{ key: 'role', label: 'Role' },
|
|
8
|
+
{ key: 'status', label: 'Status' },
|
|
9
|
+
];
|
|
10
|
+
const basicData = [
|
|
11
|
+
{ name: 'Alice', role: 'Developer', status: 'Active' },
|
|
12
|
+
{ name: 'Bob', role: 'Designer', status: 'Active' },
|
|
13
|
+
{ name: 'Carol', role: 'Manager', status: 'Away' },
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
const sortColumns = [
|
|
17
|
+
{ key: 'name', label: 'Name' },
|
|
18
|
+
{ key: 'score', label: 'Score', type: 'number' as const },
|
|
19
|
+
{ key: 'level', label: 'Level', type: 'number' as const },
|
|
20
|
+
];
|
|
21
|
+
const sortData = [
|
|
22
|
+
{ name: 'Alice', score: 92, level: 3 },
|
|
23
|
+
{ name: 'Bob', score: 87, level: 2 },
|
|
24
|
+
{ name: 'Carol', score: 95, level: 4 },
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const filterColumns = [
|
|
28
|
+
{ key: 'name', label: 'Name' },
|
|
29
|
+
{ key: 'role', label: 'Role' },
|
|
30
|
+
{ key: 'status', label: 'Status' },
|
|
31
|
+
];
|
|
32
|
+
const filterData = [
|
|
33
|
+
{ name: 'Alice', role: 'Developer', status: 'Active' },
|
|
34
|
+
{ name: 'Bob', role: 'Designer', status: 'Active' },
|
|
35
|
+
{ name: 'Carol', role: 'Manager', status: 'Away' },
|
|
36
|
+
{ name: 'Dave', role: 'Developer', status: 'Active' },
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
const plainColumns = [{ key: 'a', label: 'A' }, { key: 'b', label: 'B' }];
|
|
40
|
+
const plainData = [{ a: '1', b: '2' }, { a: '3', b: '4' }];
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<section>
|
|
44
|
+
<h2>Table component</h2>
|
|
45
|
+
<p>An accessible data table for displaying tabular data. Supports column header sorting (click or Enter/Space), optional filter input to search across all columns, striped rows, and responsive horizontal scroll. Same styles and functionality as the <a href="/docs/components/table">Astro Table</a>.</p>
|
|
46
|
+
|
|
47
|
+
<h3>Props</h3>
|
|
48
|
+
<ul>
|
|
49
|
+
<li><code>columns</code> (array, required) — Column definitions: <code>{'{ key, label, sortable?, type? }'}</code>. <code>type</code> is <code>'string'</code> or <code>'number'</code> for sort order.</li>
|
|
50
|
+
<li><code>data</code> (array, required) — Row data: array of objects with keys matching column <code>key</code>.</li>
|
|
51
|
+
<li><code>caption</code> (string, optional) — Table caption for accessibility.</li>
|
|
52
|
+
<li><code>sortable</code> (boolean, optional) — Enable column header sorting (default: true).</li>
|
|
53
|
+
<li><code>filterable</code> (boolean, optional) — Show filter input above table (default: false).</li>
|
|
54
|
+
<li><code>filterPlaceholder</code> (string, optional) — Placeholder for filter input (default: "Filter table…").</li>
|
|
55
|
+
<li><code>striped</code> (boolean, optional) — Striped rows (default: true).</li>
|
|
56
|
+
<li><code>class</code> (string, optional) — Additional CSS classes.</li>
|
|
57
|
+
</ul>
|
|
58
|
+
|
|
59
|
+
<h3>Basic usage</h3>
|
|
60
|
+
<div class="example">
|
|
61
|
+
<div class="example-title">Live example</div>
|
|
62
|
+
<Table columns={basicColumns} data={basicData} caption="Sample data" />
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<h3>With sorting (number column)</h3>
|
|
66
|
+
<p>Set <code>type: 'number'</code> on columns that should sort numerically.</p>
|
|
67
|
+
<div class="example">
|
|
68
|
+
<div class="example-title">Live example</div>
|
|
69
|
+
<Table columns={sortColumns} data={sortData} caption="Scores" />
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<h3>With filter</h3>
|
|
73
|
+
<p>Use <code>filterable</code> to show a search input that filters rows by any column.</p>
|
|
74
|
+
<div class="example">
|
|
75
|
+
<div class="example-title">Live example</div>
|
|
76
|
+
<Table columns={filterColumns} data={filterData} caption="Filterable list" filterable filterPlaceholder="Search…" />
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<h3>Without stripes</h3>
|
|
80
|
+
<div class="example">
|
|
81
|
+
<div class="example-title">Live example</div>
|
|
82
|
+
<Table columns={plainColumns} data={plainData} caption="Plain table" striped={false} />
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
<h3>Features</h3>
|
|
86
|
+
<ul>
|
|
87
|
+
<li><strong>Accessible</strong> — Semantic table, caption, <code>scope="col"</code>, <code>aria-sort</code> on sortable headers, keyboard (Enter/Space) to sort.</li>
|
|
88
|
+
<li><strong>Sorting</strong> — Sortable column headers with Sort icon; click to sort ascending/descending; <code>type: 'number'</code> for numeric sort.</li>
|
|
89
|
+
<li><strong>Filtering</strong> — Optional filter input with Filter icon; rows shown/hidden by matching text in any cell.</li>
|
|
90
|
+
<li><strong>Striped rows</strong> — Optional alternating row background (default: true).</li>
|
|
91
|
+
<li><strong>Responsive</strong> — Table wrapper scrolls horizontally on small screens.</li>
|
|
92
|
+
</ul>
|
|
93
|
+
|
|
94
|
+
<h3>Usage</h3>
|
|
95
|
+
<CodeBlock
|
|
96
|
+
code={`<script>
|
|
97
|
+
import Table from './Table.svelte';
|
|
98
|
+
</script>
|
|
99
|
+
|
|
100
|
+
<Table
|
|
101
|
+
caption="Sample data"
|
|
102
|
+
columns={[
|
|
103
|
+
{ key: 'name', label: 'Name' },
|
|
104
|
+
{ key: 'role', label: 'Role' },
|
|
105
|
+
{ key: 'status', label: 'Status' },
|
|
106
|
+
]}
|
|
107
|
+
data={[
|
|
108
|
+
{ name: 'Alice', role: 'Developer', status: 'Active' },
|
|
109
|
+
{ name: 'Bob', role: 'Designer', status: 'Active' },
|
|
110
|
+
{ name: 'Carol', role: 'Manager', status: 'Away' },
|
|
111
|
+
]}
|
|
112
|
+
/>`}
|
|
113
|
+
language="svelte"
|
|
114
|
+
/>
|
|
115
|
+
<p><strong>Astro & Vanilla:</strong> <a href="/docs/components/table">Astro</a> · <a href="/docs/vanilla/components/table">Vanilla</a></p>
|
|
116
|
+
</section>
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Tabs from '$lib/rizzo/Tabs.svelte';
|
|
3
|
+
import CodeBlock from '$lib/rizzo-docs/CodeBlock.svelte';
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<section>
|
|
7
|
+
<h2>Tabs component</h2>
|
|
8
|
+
<p>An accessible tabs component for organizing content into multiple panels. Same styles and functionality as the <a href="/docs/components/tabs">Astro Tabs</a>: full keyboard navigation and ARIA tab pattern.</p>
|
|
9
|
+
|
|
10
|
+
<h3>Props</h3>
|
|
11
|
+
<ul>
|
|
12
|
+
<li><code>tabs</code> (array, required) — Array of tab objects with <code>id</code> and <code>label</code> (optional <code>content</code>)</li>
|
|
13
|
+
<li><code>id</code> (string, optional) — Unique identifier for the tabs component</li>
|
|
14
|
+
<li><code>defaultTab</code> (string, optional) — ID of the tab to show by default (defaults to first tab)</li>
|
|
15
|
+
<li><code>variant</code> (string, optional) — <code>'default'</code>, <code>'pills'</code>, or <code>'underline'</code></li>
|
|
16
|
+
<li><code>class</code> (string, optional) — Additional CSS classes</li>
|
|
17
|
+
</ul>
|
|
18
|
+
|
|
19
|
+
<h3>Basic usage</h3>
|
|
20
|
+
<p>Use the <code>content</code> property on each tab or pass panel content via the default snippet (one child per tab, in order).</p>
|
|
21
|
+
<div class="example">
|
|
22
|
+
<div class="example-title">Live example</div>
|
|
23
|
+
<Tabs
|
|
24
|
+
tabs={[
|
|
25
|
+
{ id: 'overview', label: 'Overview' },
|
|
26
|
+
{ id: 'features', label: 'Features' },
|
|
27
|
+
{ id: 'pricing', label: 'Pricing' },
|
|
28
|
+
]}
|
|
29
|
+
>
|
|
30
|
+
{#snippet children(activeTabId)}
|
|
31
|
+
{#if activeTabId === 'overview'}
|
|
32
|
+
<div class="tabs__panel-content">
|
|
33
|
+
<h4>Overview</h4>
|
|
34
|
+
<p>This is the overview content. It provides a general introduction to the topic.</p>
|
|
35
|
+
</div>
|
|
36
|
+
{:else if activeTabId === 'features'}
|
|
37
|
+
<div class="tabs__panel-content">
|
|
38
|
+
<h4>Features</h4>
|
|
39
|
+
<ul>
|
|
40
|
+
<li>Feature 1: Accessible design</li>
|
|
41
|
+
<li>Feature 2: Keyboard navigation</li>
|
|
42
|
+
<li>Feature 3: Theme-aware styling</li>
|
|
43
|
+
</ul>
|
|
44
|
+
</div>
|
|
45
|
+
{:else if activeTabId === 'pricing'}
|
|
46
|
+
<div class="tabs__panel-content">
|
|
47
|
+
<h4>Pricing</h4>
|
|
48
|
+
<p>Choose the plan that works best for you.</p>
|
|
49
|
+
</div>
|
|
50
|
+
{/if}
|
|
51
|
+
{/snippet}
|
|
52
|
+
</Tabs>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<h3>With content property</h3>
|
|
56
|
+
<div class="example">
|
|
57
|
+
<div class="example-title">Live example</div>
|
|
58
|
+
<Tabs
|
|
59
|
+
tabs={[
|
|
60
|
+
{ id: 'tab1', label: 'Tab 1', content: '<p>Content for tab 1</p>' },
|
|
61
|
+
{ id: 'tab2', label: 'Tab 2', content: '<p>Content for tab 2</p>' },
|
|
62
|
+
{ id: 'tab3', label: 'Tab 3', content: '<p>Content for tab 3</p>' },
|
|
63
|
+
]}
|
|
64
|
+
/>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<h3>Variants</h3>
|
|
68
|
+
<h4>Default</h4>
|
|
69
|
+
<div class="example">
|
|
70
|
+
<div class="example-title">Live example</div>
|
|
71
|
+
<Tabs
|
|
72
|
+
variant="default"
|
|
73
|
+
tabs={[
|
|
74
|
+
{ id: 'd1', label: 'Tab 1', content: '<p>Default variant with bottom border indicator</p>' },
|
|
75
|
+
{ id: 'd2', label: 'Tab 2', content: '<p>Tab 2 content</p>' },
|
|
76
|
+
{ id: 'd3', label: 'Tab 3', content: '<p>Tab 3 content</p>' },
|
|
77
|
+
]}
|
|
78
|
+
/>
|
|
79
|
+
</div>
|
|
80
|
+
<h4>Pills</h4>
|
|
81
|
+
<div class="example">
|
|
82
|
+
<div class="example-title">Live example</div>
|
|
83
|
+
<Tabs
|
|
84
|
+
variant="pills"
|
|
85
|
+
tabs={[
|
|
86
|
+
{ id: 'p1', label: 'Tab 1', content: '<p>Pills variant with filled background for active tab</p>' },
|
|
87
|
+
{ id: 'p2', label: 'Tab 2', content: '<p>Tab 2 content</p>' },
|
|
88
|
+
{ id: 'p3', label: 'Tab 3', content: '<p>Tab 3 content</p>' },
|
|
89
|
+
]}
|
|
90
|
+
/>
|
|
91
|
+
</div>
|
|
92
|
+
<h4>Underline</h4>
|
|
93
|
+
<div class="example">
|
|
94
|
+
<div class="example-title">Live example</div>
|
|
95
|
+
<Tabs
|
|
96
|
+
variant="underline"
|
|
97
|
+
tabs={[
|
|
98
|
+
{ id: 'u1', label: 'Tab 1', content: '<p>Underline variant with thicker bottom border for active tab</p>' },
|
|
99
|
+
{ id: 'u2', label: 'Tab 2', content: '<p>Tab 2 content</p>' },
|
|
100
|
+
{ id: 'u3', label: 'Tab 3', content: '<p>Tab 3 content</p>' },
|
|
101
|
+
]}
|
|
102
|
+
/>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<h3>Default tab</h3>
|
|
106
|
+
<div class="example">
|
|
107
|
+
<div class="example-title">Live example</div>
|
|
108
|
+
<Tabs
|
|
109
|
+
defaultTab="second"
|
|
110
|
+
tabs={[
|
|
111
|
+
{ id: 'first', label: 'First', content: '<p>First tab content</p>' },
|
|
112
|
+
{ id: 'second', label: 'Second', content: '<p>Second tab is active by default</p>' },
|
|
113
|
+
{ id: 'third', label: 'Third', content: '<p>Third tab content</p>' },
|
|
114
|
+
]}
|
|
115
|
+
/>
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<h3>Usage</h3>
|
|
119
|
+
<CodeBlock
|
|
120
|
+
code={`<script>
|
|
121
|
+
import Tabs from './components/svelte/Tabs.svelte';
|
|
122
|
+
</script>
|
|
123
|
+
|
|
124
|
+
<!-- With content on each tab -->
|
|
125
|
+
<Tabs
|
|
126
|
+
tabs={[
|
|
127
|
+
{ id: 'overview', label: 'Overview', content: '<p>…</p>' },
|
|
128
|
+
{ id: 'api', label: 'API', content: '<p>…</p>' },
|
|
129
|
+
]}
|
|
130
|
+
defaultTab="overview"
|
|
131
|
+
/>
|
|
132
|
+
|
|
133
|
+
<!-- With snippet (dynamic content by active tab) -->
|
|
134
|
+
<Tabs tabs={[{ id: 'a', label: 'A' }, { id: 'b', label: 'B' }]}>
|
|
135
|
+
{#snippet children(activeTabId)}
|
|
136
|
+
{#if activeTabId === 'a'}…{:else}…{/if}
|
|
137
|
+
{/snippet}
|
|
138
|
+
</Tabs>
|
|
139
|
+
|
|
140
|
+
<Tabs tabs={items} variant="pills" />`}
|
|
141
|
+
language="svelte"
|
|
142
|
+
/>
|
|
143
|
+
|
|
144
|
+
<h3>Features</h3>
|
|
145
|
+
<ul>
|
|
146
|
+
<li><strong>ARIA tab pattern</strong> — <code>role="tablist"</code>, <code>role="tab"</code>, <code>role="tabpanel"</code>, <code>aria-selected</code>, <code>aria-controls</code>, <code>aria-labelledby</code></li>
|
|
147
|
+
<li><strong>Keyboard</strong> — Arrow Right/Down, Arrow Left/Up, Home, End, Enter, Space</li>
|
|
148
|
+
<li><strong>Three variants</strong> — Default, Pills, Underline</li>
|
|
149
|
+
<li><strong>Theme-aware</strong> — Adapts to all 14 themes</li>
|
|
150
|
+
</ul>
|
|
151
|
+
<p><strong>Astro & Vanilla:</strong> <a href="/docs/components/tabs">Astro</a> · <a href="/docs/vanilla/components/tabs">Vanilla</a></p>
|
|
152
|
+
</section>
|