rizzo-css 0.0.12 → 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 +93 -43
- 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-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 +11 -4
- 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 +16 -6
- package/scaffold/vanilla/js/main.js +4 -3
package/.env.example
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Optional: used only if you add search (e.g. Algolia) to a scaffold-based project
|
|
2
|
+
# Copy to .env in your project and replace with your own values
|
|
3
|
+
|
|
4
|
+
# Public (client-side) — safe to expose in the browser
|
|
5
|
+
PUBLIC_ALGOLIA_APP_ID=your-algolia-app-id
|
|
6
|
+
PUBLIC_ALGOLIA_SEARCH_KEY=your-search-only-api-key
|
|
7
|
+
PUBLIC_ALGOLIA_INDEX_NAME=your-index-name
|
|
8
|
+
|
|
9
|
+
# Private (server-side only) — do not commit or expose
|
|
10
|
+
ALGOLIA_APP_ID=your-algolia-app-id
|
|
11
|
+
ALGOLIA_ADMIN_KEY=your-admin-api-key
|
|
12
|
+
ALGOLIA_INDEX_NAME=your-index-name
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 mingleusa
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ pnpm add rizzo-css
|
|
|
12
12
|
yarn add rizzo-css
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
**Quick start (no install):** `npx rizzo-css init` — first choose **add to existing
|
|
15
|
+
**Quick start (no install):** `npx rizzo-css init` — first choose **framework** (Vanilla, Astro, or Svelte), then **add to existing** or **create new**. Existing: themes, optional components. New: full scaffold (CLI colors: Vanilla = yellow, Astro = orange, Svelte = orange-red). All get the **same CSS and component styles**. To use the **official Svelte or Astro scaffold** plus Rizzo CSS, create the app with their CLI first, then run `npx rizzo-css add`:
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
18
|
npm create svelte@latest my-app && cd my-app && npx rizzo-css add
|
|
@@ -31,7 +31,17 @@ You install **the same package** for every framework: `npm install rizzo-css`. N
|
|
|
31
31
|
| **Astro** | `npm install rizzo-css` | `import 'rizzo-css'` in layout or link from `public/` | Copy components from `node_modules/rizzo-css/scaffold/astro/` or use `npx rizzo-css add` with components |
|
|
32
32
|
| **Svelte** | `npm install rizzo-css` | `import 'rizzo-css'` in root layout or link from `static/` | Copy components from `node_modules/rizzo-css/scaffold/svelte/` or use `npx rizzo-css add` with components |
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
**CSS paths (CLI and scaffolds):**
|
|
35
|
+
|
|
36
|
+
| Framework | Where the CLI copies CSS | `<link href="...">` in your HTML/layout |
|
|
37
|
+
|-----------|-------------------------|----------------------------------------|
|
|
38
|
+
| **Vanilla** | `css/rizzo.min.css` (project root) | `css/rizzo.min.css` (relative) |
|
|
39
|
+
| **Astro** | `public/css/rizzo.min.css` | `/css/rizzo.min.css` (Astro serves `public/` at `/`) |
|
|
40
|
+
| **Svelte** | `static/css/rizzo.min.css` | `/css/rizzo.min.css` (SvelteKit serves `static/` at `/`) |
|
|
41
|
+
|
|
42
|
+
With `npx rizzo-css add --path <dir>`, the CLI still suggests the correct href for your framework (e.g. Astro/Svelte get a leading `/` path).
|
|
43
|
+
|
|
44
|
+
Scaffolds (full starter apps) are in the package: `scaffold/vanilla/`, `scaffold/astro-app/`, `scaffold/svelte-app/`. Use `npx rizzo-css init` and choose **Create new project** to get the full clone (navbar/chrome + component showcase) for the chosen framework. **Add to existing** only adds the CSS and optional components (no full scaffold). Each scaffold folder has a README with setup and instructions for editing the cloned site.
|
|
35
45
|
|
|
36
46
|
## Use
|
|
37
47
|
|
|
@@ -46,7 +56,7 @@ import 'rizzo-css';
|
|
|
46
56
|
**Without a bundler (plain HTML):** Use a CDN. Both unpkg and jsDelivr resolve the package root to the built CSS (via the `unpkg` / `jsdelivr` fields in this package). For reliability or to pin a version, use the explicit path:
|
|
47
57
|
|
|
48
58
|
```html
|
|
49
|
-
<!-- unpkg (pin version: replace @latest with @0.0.
|
|
59
|
+
<!-- unpkg (pin version: replace @latest with @0.0.13 or any version) -->
|
|
50
60
|
<link rel="stylesheet" href="https://unpkg.com/rizzo-css@latest/dist/rizzo.min.css" />
|
|
51
61
|
|
|
52
62
|
<!-- or jsDelivr -->
|
|
@@ -71,6 +81,10 @@ Theme IDs and full docs: [Theming](https://rizzo-css.vercel.app/docs/theming).
|
|
|
71
81
|
|
|
72
82
|
Full documentation: **[rizzo-css.vercel.app](https://rizzo-css.vercel.app)** — Getting Started, Components, Themes, and usage for Vanilla, Astro, and Svelte.
|
|
73
83
|
|
|
84
|
+
## Package contents
|
|
85
|
+
|
|
86
|
+
In addition to `dist/`, `bin/`, and `scaffold/`, the package includes **LICENSE** (MIT) and **.env.example** (optional; for projects that add search, e.g. Algolia — copy to `.env` and set your own values).
|
|
87
|
+
|
|
74
88
|
## License
|
|
75
89
|
|
|
76
90
|
MIT
|
package/bin/rizzo-css.js
CHANGED
|
@@ -6,15 +6,18 @@ const readline = require('readline');
|
|
|
6
6
|
|
|
7
7
|
const COMMANDS = ['init', 'add', 'theme', 'help'];
|
|
8
8
|
const FRAMEWORKS = ['vanilla', 'astro', 'svelte'];
|
|
9
|
-
|
|
9
|
+
// Dark and light themes (order matches scaffold optgroups and config/themes.ts)
|
|
10
|
+
const DARK_THEMES = [
|
|
10
11
|
'github-dark-classic',
|
|
11
|
-
'github-light',
|
|
12
12
|
'shades-of-purple',
|
|
13
13
|
'sandstorm-classic',
|
|
14
14
|
'rocky-blood-orange',
|
|
15
15
|
'minimal-dark-neon-yellow',
|
|
16
16
|
'hack-the-box',
|
|
17
17
|
'pink-cat-boo',
|
|
18
|
+
];
|
|
19
|
+
const LIGHT_THEMES = [
|
|
20
|
+
'github-light',
|
|
18
21
|
'red-velvet-cupcake',
|
|
19
22
|
'orangy-one-light',
|
|
20
23
|
'sunflower',
|
|
@@ -22,6 +25,7 @@ const THEMES = [
|
|
|
22
25
|
'cute-pink',
|
|
23
26
|
'semi-light-purple',
|
|
24
27
|
];
|
|
28
|
+
const THEMES = [...DARK_THEMES, ...LIGHT_THEMES];
|
|
25
29
|
// Components available for scaffold (must match scaffold/svelte and scaffold/astro)
|
|
26
30
|
const SVELTE_COMPONENTS = [
|
|
27
31
|
'Button', 'Badge', 'Card', 'Divider', 'Spinner', 'ProgressBar', 'Avatar', 'Alert',
|
|
@@ -336,7 +340,7 @@ Usage:
|
|
|
336
340
|
npx rizzo-css <command> [options]
|
|
337
341
|
|
|
338
342
|
Commands:
|
|
339
|
-
init Add Rizzo to existing project or scaffold new one (first
|
|
343
|
+
init Add Rizzo to existing project or scaffold new one (first: framework, then existing vs new)
|
|
340
344
|
add Copy Rizzo CSS into the current project (auto-detects Svelte/Astro)
|
|
341
345
|
theme List all available themes (use in init or set data-theme on <html>)
|
|
342
346
|
help Show this help
|
|
@@ -360,11 +364,35 @@ Docs: https://rizzo-css.vercel.app
|
|
|
360
364
|
}
|
|
361
365
|
|
|
362
366
|
function cmdTheme() {
|
|
363
|
-
process.stdout.write('\
|
|
364
|
-
|
|
367
|
+
process.stdout.write('\nDark themes (set data-theme on <html>):\n');
|
|
368
|
+
DARK_THEMES.forEach((t) => process.stdout.write(' ' + t + '\n'));
|
|
369
|
+
process.stdout.write('\nLight themes:\n');
|
|
370
|
+
LIGHT_THEMES.forEach((t) => process.stdout.write(' ' + t + '\n'));
|
|
365
371
|
process.stdout.write('\nExample: <html lang="en" data-theme="github-dark-classic">\n\n');
|
|
366
372
|
}
|
|
367
373
|
|
|
374
|
+
/** Prompt for default dark theme, default light theme, and initial theme. Returns { theme, defaultDark, defaultLight }. */
|
|
375
|
+
async function promptThemes() {
|
|
376
|
+
const defaultDark = await selectMenu(
|
|
377
|
+
DARK_THEMES.map((t) => ({ value: t, label: t })),
|
|
378
|
+
'? Default dark theme (used when system preference is dark)'
|
|
379
|
+
);
|
|
380
|
+
const defaultLight = await selectMenu(
|
|
381
|
+
LIGHT_THEMES.map((t) => ({ value: t, label: t })),
|
|
382
|
+
'? Default light theme (used when system preference is light)'
|
|
383
|
+
);
|
|
384
|
+
const initialChoice = await selectMenu(
|
|
385
|
+
[
|
|
386
|
+
{ value: 'system', label: 'System (follow OS light/dark)' },
|
|
387
|
+
{ value: defaultDark, label: defaultDark + ' (dark)' },
|
|
388
|
+
{ value: defaultLight, label: defaultLight + ' (light)' },
|
|
389
|
+
],
|
|
390
|
+
'? Initial theme on first load'
|
|
391
|
+
);
|
|
392
|
+
const theme = initialChoice;
|
|
393
|
+
return { theme, defaultDark: DARK_THEMES.includes(defaultDark) ? defaultDark : DARK_THEMES[0], defaultLight: LIGHT_THEMES.includes(defaultLight) ? defaultLight : LIGHT_THEMES[0] };
|
|
394
|
+
}
|
|
395
|
+
|
|
368
396
|
/** Detect framework from cwd: "svelte" | "astro" | null. */
|
|
369
397
|
function detectFramework(cwd) {
|
|
370
398
|
if (existsSync(join(cwd, 'svelte.config.js')) || existsSync(join(cwd, 'svelte.config.ts'))) return 'svelte';
|
|
@@ -386,6 +414,24 @@ function getFrameworkCssPaths(framework) {
|
|
|
386
414
|
return { targetDir: 'css', linkHref: 'css/rizzo.min.css' };
|
|
387
415
|
}
|
|
388
416
|
|
|
417
|
+
/**
|
|
418
|
+
* Browser-visible href for the CSS file. Astro serves public/ at /, SvelteKit serves static/ at /.
|
|
419
|
+
* Use this when a custom --path is provided so we tell the user the correct <link href="...">.
|
|
420
|
+
*/
|
|
421
|
+
function getLinkHrefForTargetDir(framework, targetDir) {
|
|
422
|
+
const file = 'rizzo.min.css';
|
|
423
|
+
if (framework === 'astro' && targetDir) {
|
|
424
|
+
const path = targetDir.replace(/^public\/?/, '').replace(/\/+$/, '') || 'css';
|
|
425
|
+
return '/' + (path ? path + '/' : '') + file;
|
|
426
|
+
}
|
|
427
|
+
if (framework === 'svelte' && targetDir) {
|
|
428
|
+
const path = targetDir.replace(/^static\/?/, '').replace(/\/+$/, '') || 'css';
|
|
429
|
+
return '/' + (path ? path + '/' : '') + file;
|
|
430
|
+
}
|
|
431
|
+
const base = targetDir ? targetDir.replace(/\/+$/, '') : 'css';
|
|
432
|
+
return base ? base + '/' + file : file;
|
|
433
|
+
}
|
|
434
|
+
|
|
389
435
|
function cmdAdd(argv) {
|
|
390
436
|
const pathIdx = argv.indexOf('--path');
|
|
391
437
|
const customPath = pathIdx !== -1 && argv[pathIdx + 1] ? argv[pathIdx + 1] : null;
|
|
@@ -407,7 +453,7 @@ function cmdAdd(argv) {
|
|
|
407
453
|
|
|
408
454
|
mkdirSync(join(cwd, targetDir), { recursive: true });
|
|
409
455
|
copyFileSync(cssSource, targetFile);
|
|
410
|
-
const linkHref = customPath ?
|
|
456
|
+
const linkHref = customPath ? getLinkHrefForTargetDir(framework, targetDir) : paths.linkHref;
|
|
411
457
|
console.log('\n✓ Rizzo CSS copied to ' + targetFile);
|
|
412
458
|
if (framework === 'svelte') {
|
|
413
459
|
console.log('\nDetected Svelte/SvelteKit. Add to your root layout (e.g. src/app.html):\n');
|
|
@@ -582,26 +628,25 @@ function copyAstroComponents(projectDir, selectedNames) {
|
|
|
582
628
|
}
|
|
583
629
|
}
|
|
584
630
|
|
|
585
|
-
/** Add Rizzo CSS (and optional components) to an existing project in cwd. */
|
|
586
|
-
async function runAddToExisting() {
|
|
631
|
+
/** Add Rizzo CSS (and optional components) to an existing project in cwd. frameworkOverride: when set (from init), skip framework prompt. */
|
|
632
|
+
async function runAddToExisting(frameworkOverride) {
|
|
587
633
|
const cwd = process.cwd();
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
frameworkPrompt
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
);
|
|
604
|
-
const theme = THEMES.includes(defaultTheme) ? defaultTheme : THEMES[0];
|
|
634
|
+
let framework = frameworkOverride;
|
|
635
|
+
if (framework == null) {
|
|
636
|
+
const detected = detectFramework(cwd);
|
|
637
|
+
const frameworkOptions = [
|
|
638
|
+
{ value: 'vanilla', label: 'Vanilla JS (HTML + CSS)', color: C.vanilla },
|
|
639
|
+
{ value: 'astro', label: 'Astro', color: C.astro },
|
|
640
|
+
{ value: 'svelte', label: 'Svelte', color: C.svelte },
|
|
641
|
+
];
|
|
642
|
+
let frameworkPrompt = '? Framework';
|
|
643
|
+
if (detected) {
|
|
644
|
+
frameworkPrompt += ' (detected: ' + detected + ' — pick to confirm or choose another)';
|
|
645
|
+
}
|
|
646
|
+
framework = await selectMenu(frameworkOptions, frameworkPrompt);
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
const { theme, defaultDark, defaultLight } = await promptThemes();
|
|
605
650
|
|
|
606
651
|
let selectedComponents = [];
|
|
607
652
|
const componentList = framework === 'svelte' ? SVELTE_COMPONENTS : framework === 'astro' ? ASTRO_COMPONENTS : [];
|
|
@@ -652,6 +697,7 @@ async function runAddToExisting() {
|
|
|
652
697
|
console.log('\nAdd to your root layout (e.g. src/app.html):');
|
|
653
698
|
console.log(' <link rel="stylesheet" href="' + linkHref + '" />');
|
|
654
699
|
console.log('\nSet a theme on <html>: data-theme="' + theme + '" (see: npx rizzo-css theme)');
|
|
700
|
+
console.log(' For theme "system": default dark ' + defaultDark + ', default light ' + defaultLight);
|
|
655
701
|
if (selectedComponents.length > 0) {
|
|
656
702
|
console.log(' Components are in src/lib/rizzo — import from \'$lib/rizzo\'.');
|
|
657
703
|
}
|
|
@@ -659,6 +705,7 @@ async function runAddToExisting() {
|
|
|
659
705
|
console.log('\nAdd to your layout (e.g. src/layouts/Layout.astro):');
|
|
660
706
|
console.log(' <link rel="stylesheet" href="' + linkHref + '" />');
|
|
661
707
|
console.log('\nSet a theme on <html>: data-theme="' + theme + '" (see: npx rizzo-css theme)');
|
|
708
|
+
console.log(' For theme "system": default dark ' + defaultDark + ', default light ' + defaultLight);
|
|
662
709
|
if (selectedComponents.length > 0) {
|
|
663
710
|
console.log(' Components are in src/components/rizzo — import from there.');
|
|
664
711
|
}
|
|
@@ -666,21 +713,31 @@ async function runAddToExisting() {
|
|
|
666
713
|
console.log('\nAdd to your HTML or layout:');
|
|
667
714
|
console.log(' <link rel="stylesheet" href="' + linkHref + '" />');
|
|
668
715
|
console.log('\nSet a theme on <html>: data-theme="' + theme + '" (see: npx rizzo-css theme)');
|
|
716
|
+
console.log(' For theme "system": default dark ' + defaultDark + ', default light ' + defaultLight);
|
|
669
717
|
}
|
|
670
718
|
console.log('\nDocs: https://rizzo-css.vercel.app\n');
|
|
671
719
|
}
|
|
672
720
|
|
|
673
721
|
async function cmdInit() {
|
|
722
|
+
const framework = await selectMenu(
|
|
723
|
+
[
|
|
724
|
+
{ value: 'vanilla', label: 'Vanilla JS (HTML + CSS + same styles & components)', color: C.vanilla },
|
|
725
|
+
{ value: 'astro', label: 'Astro', color: C.astro },
|
|
726
|
+
{ value: 'svelte', label: 'Svelte', color: C.svelte },
|
|
727
|
+
],
|
|
728
|
+
'? Framework — all get the same CSS and component styles'
|
|
729
|
+
);
|
|
730
|
+
|
|
674
731
|
const initMode = await selectMenu(
|
|
675
732
|
[
|
|
676
733
|
{ value: 'existing', label: 'Add to existing project (current directory)' },
|
|
677
734
|
{ value: 'new', label: 'Create new project (scaffold)' },
|
|
678
735
|
],
|
|
679
|
-
'?
|
|
736
|
+
'? Add to existing project or create a new one?'
|
|
680
737
|
);
|
|
681
738
|
|
|
682
739
|
if (initMode === 'existing') {
|
|
683
|
-
await runAddToExisting();
|
|
740
|
+
await runAddToExisting(framework);
|
|
684
741
|
return;
|
|
685
742
|
}
|
|
686
743
|
|
|
@@ -693,20 +750,7 @@ async function cmdInit() {
|
|
|
693
750
|
);
|
|
694
751
|
const name = projectChoice === 'name' ? await question('Project name (folder name): ') : '';
|
|
695
752
|
|
|
696
|
-
const
|
|
697
|
-
[
|
|
698
|
-
{ value: 'vanilla', label: 'Vanilla JS (HTML + CSS + same styles & components)', color: C.vanilla },
|
|
699
|
-
{ value: 'astro', label: 'Astro', color: C.astro },
|
|
700
|
-
{ value: 'svelte', label: 'Svelte', color: C.svelte },
|
|
701
|
-
],
|
|
702
|
-
'? Framework (arrows, Enter to select) — all get the same CSS and component styles'
|
|
703
|
-
);
|
|
704
|
-
|
|
705
|
-
const defaultTheme = await selectMenu(
|
|
706
|
-
THEMES.map((t) => ({ value: t, label: t })),
|
|
707
|
-
'? Default theme (all 14 themes are included in the CSS; this sets the initial data-theme)'
|
|
708
|
-
);
|
|
709
|
-
const theme = THEMES.includes(defaultTheme) ? defaultTheme : THEMES[0];
|
|
753
|
+
const { theme, defaultDark, defaultLight } = await promptThemes();
|
|
710
754
|
|
|
711
755
|
let selectedComponents = [];
|
|
712
756
|
const componentList = framework === 'svelte' ? SVELTE_COMPONENTS : framework === 'astro' ? ASTRO_COMPONENTS : [];
|
|
@@ -739,12 +783,14 @@ async function cmdInit() {
|
|
|
739
783
|
process.exit(1);
|
|
740
784
|
}
|
|
741
785
|
|
|
742
|
-
const themeComment = '\n <!--
|
|
786
|
+
const themeComment = '\n <!-- Initial: ' + theme + '; dark: ' + defaultDark + '; light: ' + defaultLight + ' (all 14 themes in CSS) -->';
|
|
743
787
|
const projectNamePkg = name
|
|
744
788
|
? name.replace(/\s+/g, '-').toLowerCase()
|
|
745
789
|
: (framework === 'astro' ? 'my-astro-app' : framework === 'svelte' ? 'my-svelte-app' : 'my-app');
|
|
746
790
|
const replacements = {
|
|
747
791
|
'{{DATA_THEME}}': theme,
|
|
792
|
+
'{{DEFAULT_DARK}}': defaultDark,
|
|
793
|
+
'{{DEFAULT_LIGHT}}': defaultLight,
|
|
748
794
|
'{{THEME_LIST_COMMENT}}': themeComment,
|
|
749
795
|
'{{TITLE}}': name || 'App',
|
|
750
796
|
'{{PROJECT_NAME}}': projectNamePkg,
|
|
@@ -798,6 +844,8 @@ async function cmdInit() {
|
|
|
798
844
|
let indexHtml = readFileSync(vanillaScaffoldPath, 'utf8');
|
|
799
845
|
indexHtml = indexHtml
|
|
800
846
|
.replace(/\{\{DATA_THEME\}\}/g, theme)
|
|
847
|
+
.replace(/\{\{DEFAULT_DARK\}\}/g, defaultDark)
|
|
848
|
+
.replace(/\{\{DEFAULT_LIGHT\}\}/g, defaultLight)
|
|
801
849
|
.replace(/\{\{THEME_LIST_COMMENT\}\}/g, themeComment)
|
|
802
850
|
.replace(/\{\{TITLE\}\}/g, name || 'App')
|
|
803
851
|
.replace(/\{\{LINK_HREF\}\}/g, linkHref);
|
|
@@ -828,7 +876,9 @@ async function cmdInit() {
|
|
|
828
876
|
const vanillaJs = join(getPackageRoot(), 'scaffold', 'vanilla', 'js', 'main.js');
|
|
829
877
|
if (existsSync(vanillaJs)) {
|
|
830
878
|
mkdirSync(join(projectDir, 'js'), { recursive: true });
|
|
831
|
-
|
|
879
|
+
let mainJs = readFileSync(vanillaJs, 'utf8');
|
|
880
|
+
mainJs = mainJs.replace(/\{\{DEFAULT_DARK\}\}/g, defaultDark).replace(/\{\{DEFAULT_LIGHT\}\}/g, defaultLight);
|
|
881
|
+
writeFileSync(join(projectDir, 'js', 'main.js'), mainJs, 'utf8');
|
|
832
882
|
}
|
|
833
883
|
}
|
|
834
884
|
if (framework === 'svelte' && selectedComponents.length > 0) {
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rizzo-css",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"scripts": {
|
|
5
|
-
"prepublishOnly": "cd ../.. && pnpm build:css && node scripts/copy-scaffold.js"
|
|
5
|
+
"prepublishOnly": "cd ../.. && pnpm build:css && node scripts/copy-scaffold.js && node scripts/prepare-astro-scaffold.js && node scripts/prepare-vanilla-scaffold.js && node scripts/prepare-svelte-scaffold.js"
|
|
6
6
|
},
|
|
7
7
|
"description": "A modern CSS design system with semantic theming, 14 themes, and accessible components (BEM). Use with Astro, Svelte, or any framework.",
|
|
8
8
|
"style": "dist/rizzo.min.css",
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
"files": [
|
|
23
23
|
"dist",
|
|
24
24
|
"README.md",
|
|
25
|
+
"LICENSE",
|
|
26
|
+
".env.example",
|
|
25
27
|
"bin",
|
|
26
28
|
"scaffold"
|
|
27
29
|
],
|
|
@@ -41,4 +43,4 @@
|
|
|
41
43
|
"homepage": "https://rizzo-css.vercel.app",
|
|
42
44
|
"license": "MIT",
|
|
43
45
|
"author": "mingleusa"
|
|
44
|
-
}
|
|
46
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Astro + Rizzo CSS
|
|
2
2
|
|
|
3
|
-
This project was scaffolded with `npx rizzo-css init` (
|
|
3
|
+
This project was scaffolded with `npx rizzo-css init` when you chose **Create new project** and Astro. This full clone (navbar, docs pages, component showcase) is only generated for new projects; **Add to existing project** only adds the CSS and optional components.
|
|
4
4
|
|
|
5
5
|
## First-time setup
|
|
6
6
|
|
|
@@ -25,8 +25,19 @@ The theme selected during `rizzo-css init` is set in `src/layouts/Layout.astro`
|
|
|
25
25
|
- `pnpm build` — Build for production
|
|
26
26
|
- `pnpm preview` — Preview production build
|
|
27
27
|
|
|
28
|
+
## Editing the cloned site
|
|
29
|
+
|
|
30
|
+
- **Layout and shell** — `src/layouts/Layout.astro` (navbar, settings, theme script, CSS link). Change the default theme or title placeholders here.
|
|
31
|
+
- **Docs and theme pages** — `src/pages/docs/` (getting-started, design-system, theming, themes, etc.). Each page uses `DocsLayout` and can be edited or replaced; stubs link to the main site for full content.
|
|
32
|
+
- **Component showcase** — `src/pages/components.astro` (index) and `src/pages/components/*.astro`. Edit or add component demos; imports use `../../components/` and `../../layouts/`.
|
|
33
|
+
- **Home page** — `src/pages/index.astro`. Replace the hero and links with your own content.
|
|
34
|
+
- **Components and config** — `src/components/` (Navbar, Settings, Card, etc.) and `src/config/themes.ts`. Customize or remove components; update the nav in `Navbar.astro` if you add/remove routes.
|
|
35
|
+
- **CSS** — The app loads `/css/rizzo.min.css` (from `public/css/`). Replace or add styles as needed.
|
|
36
|
+
|
|
37
|
+
After editing, run `pnpm dev` to preview and `pnpm build` for production.
|
|
38
|
+
|
|
28
39
|
## Other scaffolds
|
|
29
40
|
|
|
30
|
-
From the same **rizzo-css** package: **Vanilla** (`scaffold/vanilla/`) —
|
|
41
|
+
From the same **rizzo-css** package: **Vanilla** (`scaffold/vanilla/`) — index + component showcase (components/index.html, components/<slug>.html) with Settings and toast; **Svelte** (`scaffold/svelte-app/`) — SvelteKit app with /components and /components/[slug]. Use `npx rizzo-css init` and pick a different framework to create one of them.
|
|
31
42
|
|
|
32
43
|
Docs: [rizzo-css.vercel.app](https://rizzo-css.vercel.app)
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
---
|
|
2
|
+
import ChevronDown from './icons/ChevronDown.astro';
|
|
3
|
+
|
|
4
|
+
interface AccordionItem {
|
|
5
|
+
id: string;
|
|
6
|
+
title: string;
|
|
7
|
+
content?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
items: AccordionItem[];
|
|
12
|
+
id?: string;
|
|
13
|
+
allowMultiple?: boolean;
|
|
14
|
+
defaultExpanded?: string | string[];
|
|
15
|
+
class?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const {
|
|
19
|
+
items,
|
|
20
|
+
id,
|
|
21
|
+
allowMultiple = false,
|
|
22
|
+
defaultExpanded,
|
|
23
|
+
class: className = '',
|
|
24
|
+
} = Astro.props;
|
|
25
|
+
|
|
26
|
+
const accordionId = id || `accordion-${Math.random().toString(36).substr(2, 9)}`;
|
|
27
|
+
|
|
28
|
+
const getDefaultExpanded = (): Set<string> => {
|
|
29
|
+
if (defaultExpanded === undefined) return new Set(items[0] ? [items[0].id] : []);
|
|
30
|
+
if (typeof defaultExpanded === 'string') return new Set([defaultExpanded]);
|
|
31
|
+
return new Set(defaultExpanded);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const defaultOpenIds = getDefaultExpanded();
|
|
35
|
+
const classes = `accordion ${className}`.trim();
|
|
36
|
+
let slotIndex = 0;
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
<div class={classes} data-accordion={accordionId} data-allow-multiple={allowMultiple ? 'true' : 'false'}>
|
|
40
|
+
{items.map((item) => {
|
|
41
|
+
const triggerId = `${accordionId}-trigger-${item.id}`;
|
|
42
|
+
const panelId = `${accordionId}-panel-${item.id}`;
|
|
43
|
+
const isExpanded = defaultOpenIds.has(item.id);
|
|
44
|
+
const useSlot = !item.content;
|
|
45
|
+
const currentSlotIndex = useSlot ? slotIndex++ : -1;
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<div class="accordion__item" data-accordion-item data-item-id={item.id}>
|
|
49
|
+
<h3 class="accordion__heading">
|
|
50
|
+
<button
|
|
51
|
+
type="button"
|
|
52
|
+
class={`accordion__trigger ${isExpanded ? 'accordion__trigger--expanded' : ''}`}
|
|
53
|
+
id={triggerId}
|
|
54
|
+
aria-expanded={isExpanded}
|
|
55
|
+
aria-controls={panelId}
|
|
56
|
+
data-accordion-trigger
|
|
57
|
+
>
|
|
58
|
+
<span class="accordion__title">{item.title}</span>
|
|
59
|
+
<ChevronDown class="accordion__icon" width={16} height={16} aria-hidden="true" />
|
|
60
|
+
</button>
|
|
61
|
+
</h3>
|
|
62
|
+
<div
|
|
63
|
+
class={`accordion__panel ${isExpanded ? 'accordion__panel--expanded' : ''}`}
|
|
64
|
+
id={panelId}
|
|
65
|
+
role="region"
|
|
66
|
+
aria-labelledby={triggerId}
|
|
67
|
+
hidden={!isExpanded}
|
|
68
|
+
data-accordion-panel
|
|
69
|
+
>
|
|
70
|
+
<div class="accordion__panel-inner">
|
|
71
|
+
{item.content ? (
|
|
72
|
+
<div class="accordion__panel-content" set:html={item.content} />
|
|
73
|
+
) : (
|
|
74
|
+
<div class="accordion__panel-content accordion__panel-slot" data-accordion-slot-index={currentSlotIndex}>
|
|
75
|
+
<!-- Slot content distributed by script -->
|
|
76
|
+
</div>
|
|
77
|
+
)}
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
);
|
|
82
|
+
})}
|
|
83
|
+
<!-- Slot content for distribution (same order as items) -->
|
|
84
|
+
<div class="accordion__slot-content" style="display: none;">
|
|
85
|
+
<slot />
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<script is:inline>
|
|
90
|
+
(function initAccordions() {
|
|
91
|
+
function initOne(accordion) {
|
|
92
|
+
if (accordion.dataset.accordionInit === 'true') return;
|
|
93
|
+
accordion.dataset.accordionInit = 'true';
|
|
94
|
+
|
|
95
|
+
const isMultiple = accordion.getAttribute('data-allow-multiple') === 'true';
|
|
96
|
+
const triggers = accordion.querySelectorAll('[data-accordion-trigger]');
|
|
97
|
+
|
|
98
|
+
const setExpanded = (trigger, expanded) => {
|
|
99
|
+
const panelId = trigger.getAttribute('aria-controls');
|
|
100
|
+
const panel = panelId ? accordion.querySelector('#' + CSS.escape(panelId)) : null;
|
|
101
|
+
trigger.setAttribute('aria-expanded', String(expanded));
|
|
102
|
+
trigger.classList.toggle('accordion__trigger--expanded', expanded);
|
|
103
|
+
if (panel) {
|
|
104
|
+
panel.classList.toggle('accordion__panel--expanded', expanded);
|
|
105
|
+
panel.hidden = !expanded;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const toggle = (trigger) => {
|
|
110
|
+
const expanded = trigger.getAttribute('aria-expanded') === 'true';
|
|
111
|
+
if (!isMultiple) {
|
|
112
|
+
triggers.forEach((t) => setExpanded(t, false));
|
|
113
|
+
}
|
|
114
|
+
setExpanded(trigger, !expanded);
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
triggers.forEach((trigger) => {
|
|
118
|
+
trigger.addEventListener('click', () => toggle(trigger));
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
triggers.forEach((trigger, index) => {
|
|
122
|
+
trigger.addEventListener('keydown', (e) => {
|
|
123
|
+
let targetIndex = index;
|
|
124
|
+
switch (e.key) {
|
|
125
|
+
case 'ArrowDown':
|
|
126
|
+
e.preventDefault();
|
|
127
|
+
targetIndex = Math.min(index + 1, triggers.length - 1);
|
|
128
|
+
break;
|
|
129
|
+
case 'ArrowUp':
|
|
130
|
+
e.preventDefault();
|
|
131
|
+
targetIndex = Math.max(index - 1, 0);
|
|
132
|
+
break;
|
|
133
|
+
case 'Home':
|
|
134
|
+
e.preventDefault();
|
|
135
|
+
targetIndex = 0;
|
|
136
|
+
break;
|
|
137
|
+
case 'End':
|
|
138
|
+
e.preventDefault();
|
|
139
|
+
targetIndex = triggers.length - 1;
|
|
140
|
+
break;
|
|
141
|
+
case 'Enter':
|
|
142
|
+
case ' ':
|
|
143
|
+
e.preventDefault();
|
|
144
|
+
toggle(trigger);
|
|
145
|
+
return;
|
|
146
|
+
default:
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (targetIndex !== index) {
|
|
150
|
+
triggers[targetIndex].focus();
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
const slotContent = accordion.querySelector('.accordion__slot-content');
|
|
156
|
+
if (slotContent) {
|
|
157
|
+
const slotChildren = Array.from(slotContent.children);
|
|
158
|
+
slotChildren.forEach((child, index) => {
|
|
159
|
+
const slotPlaceholder = accordion.querySelector('[data-accordion-slot-index="' + index + '"]');
|
|
160
|
+
if (slotPlaceholder) {
|
|
161
|
+
slotPlaceholder.appendChild(child);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
slotContent.remove();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function init() {
|
|
169
|
+
document.querySelectorAll('[data-accordion]').forEach(initOne);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (document.readyState === 'loading') {
|
|
173
|
+
document.addEventListener('DOMContentLoaded', init);
|
|
174
|
+
} else {
|
|
175
|
+
init();
|
|
176
|
+
}
|
|
177
|
+
})();
|
|
178
|
+
</script>
|