rizzo-css 0.0.81 → 0.0.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +1 -1
  2. package/bin/rizzo-css.js +12 -0
  3. package/dist/rizzo.min.css +1 -1
  4. package/package.json +1 -1
  5. package/scaffold/astro/Settings.astro +3 -2
  6. package/scaffold/react/DocsSidebar.tsx +137 -28
  7. package/scaffold/react/ThemeIcon.tsx +57 -0
  8. package/scaffold/react/base/package.json +1 -1
  9. package/scaffold/react/themes.ts +54 -0
  10. package/scaffold/react/variants/full/README-RIZZO.md +35 -0
  11. package/scaffold/react/variants/full/package.json +24 -0
  12. package/scaffold/react/variants/full/src/App.tsx +41 -0
  13. package/scaffold/react/variants/full/src/config/componentCategories.ts +43 -0
  14. package/scaffold/react/variants/full/src/config/docsNav.ts +87 -0
  15. package/scaffold/react/variants/full/src/index.css +96 -0
  16. package/scaffold/react/variants/full/src/layouts/BlocksLayout.tsx +124 -0
  17. package/scaffold/react/variants/full/src/layouts/DocsLayout.tsx +93 -0
  18. package/scaffold/react/variants/full/src/main.tsx +13 -0
  19. package/scaffold/react/variants/full/src/views/BlocksIndex.tsx +56 -0
  20. package/scaffold/react/variants/full/src/views/DocsComponents.tsx +56 -0
  21. package/scaffold/react/variants/full/src/views/DocsGettingStarted.tsx +27 -0
  22. package/scaffold/react/variants/full/src/views/DocsIndex.tsx +39 -0
  23. package/scaffold/react/variants/full/src/views/DocsOverview.tsx +39 -0
  24. package/scaffold/react/variants/full/src/views/Home.tsx +104 -0
  25. package/scaffold/react/variants/full/src/views/Themes.tsx +118 -0
  26. package/scaffold/svelte/Settings.svelte +30 -5
  27. package/scaffold/svelte/variants/full/src/config/docsNav.ts +213 -13
  28. package/scaffold/svelte/variants/full/src/routes/+layout.svelte +4 -1
  29. package/scaffold/svelte/variants/full/src/routes/blocks/+layout.svelte +4 -2
  30. package/scaffold/svelte/variants/full/src/routes/docs/+layout.svelte +3 -1
  31. package/scaffold/svelte/variants/full/src/routes/themes/+page.svelte +130 -69
  32. package/scaffold/vanilla/README-RIZZO.md +1 -1
  33. package/scaffold/vanilla/components/accordion.html +8 -0
  34. package/scaffold/vanilla/components/alert-dialog.html +8 -0
  35. package/scaffold/vanilla/components/alert.html +8 -0
  36. package/scaffold/vanilla/components/aspect-ratio.html +8 -0
  37. package/scaffold/vanilla/components/avatar.html +8 -0
  38. package/scaffold/vanilla/components/back-to-top.html +8 -0
  39. package/scaffold/vanilla/components/badge.html +8 -0
  40. package/scaffold/vanilla/components/breadcrumb.html +8 -0
  41. package/scaffold/vanilla/components/button-group.html +8 -0
  42. package/scaffold/vanilla/components/button.html +8 -0
  43. package/scaffold/vanilla/components/calendar.html +8 -0
  44. package/scaffold/vanilla/components/cards.html +8 -0
  45. package/scaffold/vanilla/components/carousel.html +8 -0
  46. package/scaffold/vanilla/components/chart.html +8 -0
  47. package/scaffold/vanilla/components/collapsible.html +8 -0
  48. package/scaffold/vanilla/components/command.html +8 -0
  49. package/scaffold/vanilla/components/context-menu.html +8 -0
  50. package/scaffold/vanilla/components/copy-to-clipboard.html +8 -0
  51. package/scaffold/vanilla/components/dashboard.html +8 -0
  52. package/scaffold/vanilla/components/direction.html +8 -0
  53. package/scaffold/vanilla/components/divider.html +8 -0
  54. package/scaffold/vanilla/components/docs-sidebar.html +8 -0
  55. package/scaffold/vanilla/components/dropdown.html +8 -0
  56. package/scaffold/vanilla/components/empty.html +8 -0
  57. package/scaffold/vanilla/components/font-switcher.html +8 -0
  58. package/scaffold/vanilla/components/footer.html +8 -0
  59. package/scaffold/vanilla/components/forms.html +8 -0
  60. package/scaffold/vanilla/components/hover-card.html +8 -0
  61. package/scaffold/vanilla/components/icons.html +8 -0
  62. package/scaffold/vanilla/components/index.html +8 -0
  63. package/scaffold/vanilla/components/input-group.html +8 -0
  64. package/scaffold/vanilla/components/input-otp.html +8 -0
  65. package/scaffold/vanilla/components/kbd.html +8 -0
  66. package/scaffold/vanilla/components/label.html +8 -0
  67. package/scaffold/vanilla/components/menubar.html +8 -0
  68. package/scaffold/vanilla/components/modal.html +8 -0
  69. package/scaffold/vanilla/components/navbar.html +8 -0
  70. package/scaffold/vanilla/components/pagination.html +8 -0
  71. package/scaffold/vanilla/components/popover.html +8 -0
  72. package/scaffold/vanilla/components/progress-bar.html +8 -0
  73. package/scaffold/vanilla/components/range-calendar.html +8 -0
  74. package/scaffold/vanilla/components/resizable.html +8 -0
  75. package/scaffold/vanilla/components/scroll-area.html +8 -0
  76. package/scaffold/vanilla/components/search.html +8 -0
  77. package/scaffold/vanilla/components/separator.html +8 -0
  78. package/scaffold/vanilla/components/settings.html +8 -0
  79. package/scaffold/vanilla/components/sheet.html +8 -0
  80. package/scaffold/vanilla/components/skeleton.html +8 -0
  81. package/scaffold/vanilla/components/slider.html +8 -0
  82. package/scaffold/vanilla/components/sound-effects.html +8 -0
  83. package/scaffold/vanilla/components/spinner.html +8 -0
  84. package/scaffold/vanilla/components/switch.html +8 -0
  85. package/scaffold/vanilla/components/table.html +8 -0
  86. package/scaffold/vanilla/components/tabs.html +8 -0
  87. package/scaffold/vanilla/components/theme-switcher.html +8 -0
  88. package/scaffold/vanilla/components/toast.html +8 -0
  89. package/scaffold/vanilla/components/toggle-group.html +8 -0
  90. package/scaffold/vanilla/components/toggle.html +8 -0
  91. package/scaffold/vanilla/components/tooltip.html +8 -0
  92. package/scaffold/vanilla/index.html +8 -0
  93. package/scaffold/vue/DocsSidebar.vue +138 -4
  94. package/scaffold/vue/ThemeIcon.vue +50 -0
  95. package/scaffold/vue/base/package.json +1 -1
  96. package/scaffold/vue/themes.ts +54 -0
  97. package/scaffold/vue/variants/full/README-RIZZO.md +35 -0
  98. package/scaffold/vue/variants/full/package.json +22 -0
  99. package/scaffold/vue/variants/full/src/App.vue +17 -0
  100. package/scaffold/vue/variants/full/src/config/componentCategories.ts +43 -0
  101. package/scaffold/vue/variants/full/src/config/docsNav.ts +87 -0
  102. package/scaffold/vue/variants/full/src/layouts/BlocksLayout.vue +136 -0
  103. package/scaffold/vue/variants/full/src/layouts/DocsLayout.vue +145 -0
  104. package/scaffold/vue/variants/full/src/main.ts +6 -0
  105. package/scaffold/vue/variants/full/src/router/index.ts +38 -0
  106. package/scaffold/vue/variants/full/src/views/BlocksIndex.vue +111 -0
  107. package/scaffold/vue/variants/full/src/views/DocsComponents.vue +115 -0
  108. package/scaffold/vue/variants/full/src/views/DocsGettingStarted.vue +45 -0
  109. package/scaffold/vue/variants/full/src/views/DocsIndex.vue +69 -0
  110. package/scaffold/vue/variants/full/src/views/DocsOverview.vue +66 -0
  111. package/scaffold/vue/variants/full/src/views/Home.vue +240 -0
  112. package/scaffold/vue/variants/full/src/views/Themes.vue +257 -0
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Docs sidebar nav for full template. Matches https://rizzo-css.vercel.app exactly.
3
+ * Local routes: /docs/overview, /docs/getting-started, /docs/components. All other links point to the main site.
4
+ */
5
+ import { COMPONENT_CATEGORIES } from './componentCategories';
6
+
7
+ const SITE_BASE = 'https://rizzo-css.vercel.app';
8
+ const FRAMEWORK_PREFIX = '/docs/vue';
9
+
10
+ function slugToTitle(slug: string): string {
11
+ return slug.split('-').map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
12
+ }
13
+
14
+ export interface DocsNavSection {
15
+ id: string;
16
+ label: string;
17
+ }
18
+
19
+ export interface DocsNavLink {
20
+ href: string;
21
+ label: string;
22
+ frameworkOnly?: boolean;
23
+ absolute?: boolean;
24
+ sections?: DocsNavSection[];
25
+ external?: boolean;
26
+ }
27
+
28
+ export interface DocsNavGroup {
29
+ label: string;
30
+ links: DocsNavLink[];
31
+ }
32
+
33
+ export const DOCS_NAV: DocsNavGroup[] = [
34
+ {
35
+ label: 'Introduction',
36
+ links: [
37
+ { href: '/docs/overview', label: 'Overview', absolute: true, sections: [{ id: 'overview', label: 'Overview' }, { id: 'installation', label: 'Installation' }, { id: 'components', label: 'Components' }, { id: 'blocks', label: 'Blocks' }] },
38
+ { href: `${SITE_BASE}/docs/showcase`, label: 'Showcase', absolute: true, external: true, sections: [{ id: 'components', label: 'Components' }, { id: 'themes', label: 'Themes' }, { id: 'blocks', label: 'Blocks' }, { id: 'examples', label: 'Examples' }] },
39
+ { href: '/docs/getting-started', label: 'Getting Started', absolute: true, sections: [{ id: 'installation', label: 'Installation' }, { id: 'installation-by-framework', label: 'By framework' }, { id: 'vanilla', label: 'Vanilla' }, { id: 'astro', label: 'Astro' }, { id: 'svelte', label: 'Svelte' }, { id: 'react', label: 'React' }, { id: 'vue', label: 'Vue' }, { id: 'project-structure', label: 'Project Structure' }, { id: 'development', label: 'Development' }, { id: 'building', label: 'Building' }, { id: 'using-components', label: 'Using Components' }, { id: 'using-themes', label: 'Using Themes' }, { id: 'css-architecture', label: 'CSS Architecture' }] },
40
+ ],
41
+ },
42
+ {
43
+ label: 'Foundations',
44
+ links: [
45
+ { href: `${SITE_BASE}/docs/design-system`, label: 'Design System', absolute: true, external: true },
46
+ { href: `${SITE_BASE}/docs/theming`, label: 'Theming', absolute: true, external: true },
47
+ { href: `${SITE_BASE}/docs/accessibility`, label: 'Accessibility', absolute: true, external: true },
48
+ { href: `${SITE_BASE}/docs/accessibility/manual-testing`, label: 'Manual testing checklist', absolute: true, external: true },
49
+ { href: `${SITE_BASE}/docs/colors`, label: 'Colors', absolute: true, external: true },
50
+ { href: `${SITE_BASE}/docs/tokens`, label: 'Tokens reference', absolute: true, external: true },
51
+ { href: `${SITE_BASE}/docs/best-practices`, label: 'Best Practices', absolute: true, external: true },
52
+ ],
53
+ },
54
+ {
55
+ label: 'Components',
56
+ links: [
57
+ { href: '/docs/components', label: 'Overview', absolute: true },
58
+ ...COMPONENT_CATEGORIES.flatMap((cat) =>
59
+ cat.slugs.map((slug) => ({
60
+ href: `${SITE_BASE}${FRAMEWORK_PREFIX}/components/${slug}`,
61
+ label: slugToTitle(slug),
62
+ absolute: true as const,
63
+ external: true as const,
64
+ }))
65
+ ),
66
+ ],
67
+ },
68
+ {
69
+ label: 'Blocks',
70
+ links: [
71
+ { href: `${SITE_BASE}/blocks`, label: 'Blocks overview', absolute: true, external: true },
72
+ { href: `${SITE_BASE}/blocks/landing-hero`, label: 'Landing hero', absolute: true, external: true },
73
+ { href: `${SITE_BASE}/blocks/pricing`, label: 'Pricing cards', absolute: true, external: true },
74
+ { href: `${SITE_BASE}/blocks/dashboard-01`, label: 'Dashboard', absolute: true, external: true },
75
+ { href: `${SITE_BASE}/blocks/docs-layout`, label: 'Docs layout', absolute: true, external: true },
76
+ { href: `${SITE_BASE}/blocks/login`, label: 'Login', absolute: true, external: true },
77
+ { href: `${SITE_BASE}/blocks/signup`, label: 'Sign up', absolute: true, external: true },
78
+ ],
79
+ },
80
+ {
81
+ label: 'Examples',
82
+ links: [
83
+ { href: `${SITE_BASE}/docs/examples`, label: 'Examples overview', absolute: true, external: true },
84
+ { href: `${SITE_BASE}/docs/examples/form-layouts`, label: 'Form & layout examples', absolute: true, external: true, sections: [{ id: 'login-form', label: 'Login form' }, { id: 'contact-form', label: 'Contact form' }, { id: 'dashboard-stats', label: 'Dashboard stats cards' }, { id: 'card-grid', label: 'Card grid' }, { id: 'settings-panel', label: 'Settings panel' }] },
85
+ ],
86
+ },
87
+ ];
@@ -0,0 +1,136 @@
1
+ <template>
2
+ <div class="docs" data-docs>
3
+ <div id="docs-sidebar-container">
4
+ <button
5
+ type="button"
6
+ class="docs__sidebar-toggle"
7
+ aria-label="Open blocks menu"
8
+ aria-expanded="false"
9
+ aria-controls="docs-sidebar"
10
+ data-docs-sidebar-toggle
11
+ @click="toggleSidebar"
12
+ >
13
+ <span class="docs__sidebar-toggle-icon" aria-hidden="true">
14
+ <span></span><span></span><span></span>
15
+ </span>
16
+ <span class="docs__sidebar-toggle-text">Blocks</span>
17
+ </button>
18
+ <div class="docs__sidebar-overlay" data-docs-sidebar-overlay aria-hidden="true" @click="closeSidebar" />
19
+ <aside id="docs-sidebar" class="docs-sidebar" aria-label="Blocks navigation">
20
+ <nav class="docs-sidebar__nav">
21
+ <div class="docs-sidebar__group">
22
+ <h2 class="docs-sidebar__group-label">Blocks</h2>
23
+ <ul class="docs-sidebar__list">
24
+ <li v-for="item in BLOCKS_NAV" :key="item.href" class="docs-sidebar__item">
25
+ <a
26
+ :href="item.href"
27
+ class="docs-sidebar__link"
28
+ :class="{ 'docs-sidebar__link--active': isActive(item) }"
29
+ :aria-current="isActive(item) ? 'page' : undefined"
30
+ >
31
+ {{ item.label }}
32
+ </a>
33
+ </li>
34
+ </ul>
35
+ </div>
36
+ </nav>
37
+ </aside>
38
+ </div>
39
+ <div class="docs__main">
40
+ <div class="docs__container">
41
+ <div class="docs__content">
42
+ <router-view />
43
+ </div>
44
+ </div>
45
+ </div>
46
+ </div>
47
+ <BackToTop />
48
+ </template>
49
+
50
+ <script setup lang="ts">
51
+ import { computed, onMounted } from 'vue';
52
+ import { useRoute } from 'vue-router';
53
+ import BackToTop from '@/components/rizzo/BackToTop.vue';
54
+
55
+ const route = useRoute();
56
+ const currentPath = computed(() => route.path);
57
+
58
+ const BLOCKS_NAV = [
59
+ { href: '/blocks', label: 'Overview' },
60
+ { href: '/blocks/landing-hero', label: 'Landing hero' },
61
+ { href: '/blocks/pricing', label: 'Pricing cards' },
62
+ { href: '/blocks/dashboard-01', label: 'Dashboard with sidebar' },
63
+ { href: '/blocks/docs-layout', label: 'Docs layout with sidebar' },
64
+ { href: '/blocks/login', label: 'Login' },
65
+ { href: '/blocks/signup', label: 'Sign up' },
66
+ ];
67
+
68
+ function isActive(item: { href: string }) {
69
+ const path = currentPath.value;
70
+ return path === item.href || (item.href !== '/blocks' && path.startsWith(item.href));
71
+ }
72
+
73
+ function openSidebar() {
74
+ const docs = document.querySelector('[data-docs]');
75
+ const toggle = document.querySelector('[data-docs-sidebar-toggle]');
76
+ const overlay = document.querySelector('[data-docs-sidebar-overlay]');
77
+ docs?.classList.add('docs--sidebar-open');
78
+ toggle?.setAttribute('aria-expanded', 'true');
79
+ overlay?.setAttribute('aria-hidden', 'false');
80
+ }
81
+
82
+ function closeSidebar() {
83
+ const docs = document.querySelector('[data-docs]');
84
+ const toggle = document.querySelector('[data-docs-sidebar-toggle]');
85
+ const overlay = document.querySelector('[data-docs-sidebar-overlay]');
86
+ docs?.classList.remove('docs--sidebar-open');
87
+ toggle?.setAttribute('aria-expanded', 'false');
88
+ overlay?.setAttribute('aria-hidden', 'true');
89
+ }
90
+
91
+ function toggleSidebar() {
92
+ const docs = document.querySelector('[data-docs]');
93
+ if (docs?.classList.contains('docs--sidebar-open')) closeSidebar();
94
+ else openSidebar();
95
+ }
96
+
97
+ onMounted(() => {
98
+ const w = typeof window !== 'undefined' ? window.innerWidth : 1025;
99
+ document.documentElement.classList.add(w <= 1024 ? 'docs-sidebar-mobile' : 'docs-sidebar-desktop');
100
+
101
+ const container = document.getElementById('docs-sidebar-container');
102
+ if (!container) return;
103
+ const toggle = container.querySelector('[data-docs-sidebar-toggle]');
104
+ const overlay = container.querySelector('[data-docs-sidebar-overlay]');
105
+ const docs = document.querySelector('[data-docs]');
106
+ if (!toggle || !overlay || !docs) return;
107
+
108
+ toggle.addEventListener('click', () => (docs.classList.contains('docs--sidebar-open') ? closeSidebar() : openSidebar()));
109
+ overlay.addEventListener('click', closeSidebar);
110
+
111
+ if (document.documentElement.classList.contains('docs-sidebar-mobile')) {
112
+ if (document.readyState === 'loading') {
113
+ document.addEventListener('DOMContentLoaded', () => container.remove());
114
+ } else {
115
+ container.remove();
116
+ }
117
+ }
118
+ });
119
+ </script>
120
+
121
+ <style scoped>
122
+ :deep(.docs__container) {
123
+ box-sizing: border-box;
124
+ width: 100%;
125
+ min-width: 0;
126
+ max-width: var(--container-default);
127
+ margin: 0 auto;
128
+ padding: 0 var(--content-padding-x);
129
+ }
130
+ :deep(.docs__content) {
131
+ width: 100%;
132
+ min-width: 0;
133
+ color: var(--text);
134
+ line-height: var(--line-height-relaxed);
135
+ }
136
+ </style>
@@ -0,0 +1,145 @@
1
+ <template>
2
+ <div class="docs" data-docs>
3
+ <div id="docs-sidebar-container">
4
+ <button
5
+ type="button"
6
+ class="docs__sidebar-toggle"
7
+ aria-label="Open documentation menu"
8
+ aria-expanded="false"
9
+ aria-controls="docs-sidebar"
10
+ data-docs-sidebar-toggle
11
+ @click="toggleSidebar"
12
+ >
13
+ <span class="docs__sidebar-toggle-icon" aria-hidden="true">
14
+ <span></span><span></span><span></span>
15
+ </span>
16
+ <span class="docs__sidebar-toggle-text">Docs</span>
17
+ </button>
18
+ <div class="docs__sidebar-overlay" data-docs-sidebar-overlay aria-hidden="true" @click="closeSidebar" />
19
+ <DocsSidebar :current-path="currentPath" path-prefix="/docs" :nav="DOCS_NAV" />
20
+ </div>
21
+ <div class="docs__main">
22
+ <div class="docs__container">
23
+ <div class="docs__content">
24
+ <router-view />
25
+ </div>
26
+ </div>
27
+ </div>
28
+ </div>
29
+ <BackToTop />
30
+ </template>
31
+
32
+ <script setup lang="ts">
33
+ import { computed, onMounted } from 'vue';
34
+ import { useRoute } from 'vue-router';
35
+ import DocsSidebar from '@/components/rizzo/DocsSidebar.vue';
36
+ import BackToTop from '@/components/rizzo/BackToTop.vue';
37
+ import { DOCS_NAV } from '@/config/docsNav';
38
+
39
+ const route = useRoute();
40
+ const currentPath = computed(() => route.path);
41
+
42
+ function openSidebar() {
43
+ const docs = document.querySelector('[data-docs]');
44
+ const toggle = document.querySelector('[data-docs-sidebar-toggle]');
45
+ const overlay = document.querySelector('[data-docs-sidebar-overlay]');
46
+ docs?.classList.add('docs--sidebar-open');
47
+ toggle?.setAttribute('aria-expanded', 'true');
48
+ overlay?.setAttribute('aria-hidden', 'false');
49
+ }
50
+
51
+ function closeSidebar() {
52
+ const docs = document.querySelector('[data-docs]');
53
+ const toggle = document.querySelector('[data-docs-sidebar-toggle]');
54
+ const overlay = document.querySelector('[data-docs-sidebar-overlay]');
55
+ docs?.classList.remove('docs--sidebar-open');
56
+ toggle?.setAttribute('aria-expanded', 'false');
57
+ overlay?.setAttribute('aria-hidden', 'true');
58
+ }
59
+
60
+ function toggleSidebar() {
61
+ const docs = document.querySelector('[data-docs]');
62
+ if (docs?.classList.contains('docs--sidebar-open')) closeSidebar();
63
+ else openSidebar();
64
+ }
65
+
66
+ onMounted(() => {
67
+ const w = typeof window !== 'undefined' ? window.innerWidth : 1025;
68
+ document.documentElement.classList.add(w <= 1024 ? 'docs-sidebar-mobile' : 'docs-sidebar-desktop');
69
+
70
+ const container = document.getElementById('docs-sidebar-container');
71
+ if (!container) return;
72
+ const toggle = container.querySelector('[data-docs-sidebar-toggle]');
73
+ const overlay = container.querySelector('[data-docs-sidebar-overlay]');
74
+ const docs = document.querySelector('[data-docs]');
75
+ if (!toggle || !overlay || !docs) return;
76
+
77
+ toggle.addEventListener('click', () => (docs.classList.contains('docs--sidebar-open') ? closeSidebar() : openSidebar()));
78
+ overlay.addEventListener('click', closeSidebar);
79
+
80
+ if (document.documentElement.classList.contains('docs-sidebar-mobile')) {
81
+ if (document.readyState === 'loading') {
82
+ document.addEventListener('DOMContentLoaded', () => container.remove());
83
+ } else {
84
+ container.remove();
85
+ }
86
+ }
87
+ });
88
+ </script>
89
+
90
+ <style scoped>
91
+ :deep(.docs__container) {
92
+ box-sizing: border-box;
93
+ width: 100%;
94
+ min-width: 0;
95
+ max-width: var(--container-default);
96
+ margin: 0 auto;
97
+ padding: 0 var(--content-padding-x);
98
+ }
99
+ :deep(.docs__content) {
100
+ width: 100%;
101
+ min-width: 0;
102
+ color: var(--text);
103
+ line-height: var(--line-height-relaxed);
104
+ }
105
+ :deep(.docs__content h2) {
106
+ font-size: var(--font-size-4xl);
107
+ font-weight: var(--font-weight-bold);
108
+ margin-top: var(--section-spacing-lg);
109
+ margin-bottom: var(--spacing-6);
110
+ color: var(--text);
111
+ padding-bottom: var(--spacing-2);
112
+ border-bottom: 1px solid var(--border);
113
+ }
114
+ :deep(.docs__content h3) {
115
+ font-size: var(--font-size-3xl);
116
+ font-weight: var(--font-weight-semibold);
117
+ margin-top: var(--spacing-8);
118
+ margin-bottom: var(--spacing-4);
119
+ color: var(--text);
120
+ }
121
+ :deep(.docs__content p) {
122
+ font-size: var(--font-size-base);
123
+ margin-bottom: var(--spacing-5);
124
+ }
125
+ :deep(.docs__content ul) {
126
+ margin-bottom: var(--spacing-5);
127
+ padding-left: var(--spacing-8);
128
+ }
129
+ :deep(.docs__content a) {
130
+ color: var(--accent-fg);
131
+ text-decoration: underline;
132
+ text-underline-offset: 0.15em;
133
+ }
134
+ :deep(.docs__content a:hover) {
135
+ color: var(--accent-fg-hover);
136
+ }
137
+ :deep(.docs__content .component-card-link),
138
+ :deep(.docs__content .block-card-link) {
139
+ text-decoration: none;
140
+ }
141
+ :deep(.docs__content .component-card-link *),
142
+ :deep(.docs__content .block-card-link *) {
143
+ text-decoration: none;
144
+ }
145
+ </style>
@@ -0,0 +1,6 @@
1
+ import { createApp } from 'vue';
2
+ import App from './App.vue';
3
+ import { router } from './router';
4
+ import './index.css';
5
+
6
+ createApp(App).use(router).mount('#app');
@@ -0,0 +1,38 @@
1
+ import { createRouter, createWebHistory } from 'vue-router';
2
+ import type { RouteRecordRaw } from 'vue-router';
3
+ import Home from '../views/Home.vue';
4
+ import BlocksLayout from '../layouts/BlocksLayout.vue';
5
+ import BlocksIndex from '../views/BlocksIndex.vue';
6
+ import DocsLayout from '../layouts/DocsLayout.vue';
7
+ import DocsIndex from '../views/DocsIndex.vue';
8
+ import DocsOverview from '../views/DocsOverview.vue';
9
+ import DocsGettingStarted from '../views/DocsGettingStarted.vue';
10
+ import DocsComponents from '../views/DocsComponents.vue';
11
+ import Themes from '../views/Themes.vue';
12
+
13
+ const routes: RouteRecordRaw[] = [
14
+ { path: '/', name: 'Home', component: Home },
15
+ {
16
+ path: '/blocks',
17
+ component: BlocksLayout,
18
+ children: [
19
+ { path: '', name: 'Blocks', component: BlocksIndex },
20
+ ],
21
+ },
22
+ {
23
+ path: '/docs',
24
+ component: DocsLayout,
25
+ children: [
26
+ { path: '', name: 'Docs', component: DocsIndex },
27
+ { path: 'overview', name: 'DocsOverview', component: DocsOverview },
28
+ { path: 'getting-started', name: 'DocsGettingStarted', component: DocsGettingStarted },
29
+ { path: 'components', name: 'DocsComponents', component: DocsComponents },
30
+ ],
31
+ },
32
+ { path: '/themes', name: 'Themes', component: Themes },
33
+ ];
34
+
35
+ export const router = createRouter({
36
+ history: createWebHistory(),
37
+ routes,
38
+ });
@@ -0,0 +1,111 @@
1
+ <template>
2
+ <section class="blocks-index__browse">
3
+ <h1 class="docs__title">Blocks</h1>
4
+ <p class="blocks-index__browse-desc">
5
+ Pre-built layouts and patterns using Rizzo components and design tokens. Use them as starting points for dashboards, docs sites, auth screens, and app shells.
6
+ </p>
7
+ </section>
8
+
9
+ <section>
10
+ <h2 class="blocks-index__section-label">Featured</h2>
11
+ <div class="blocks-index__grid">
12
+ <a
13
+ v-for="block in blocks"
14
+ :key="block.href"
15
+ :href="DOCS_BASE + block.href"
16
+ class="block-card-link"
17
+ target="_blank"
18
+ rel="noopener noreferrer"
19
+ >
20
+ <Card variant="elevated">
21
+ <div class="card__body">
22
+ <h3 style="margin: 0 0 var(--spacing-2) 0;">{{ block.title }}</h3>
23
+ <p style="margin: 0; color: var(--text-dim); font-size: var(--font-size-sm);">{{ block.desc }}</p>
24
+ <span class="block-card-meta" style="margin-top: var(--spacing-2); font-size: var(--font-size-xs); color: var(--text-dim);">{{ block.meta }}</span>
25
+ </div>
26
+ </Card>
27
+ </a>
28
+ </div>
29
+ </section>
30
+
31
+ <section>
32
+ <h2>Scaffold from CLI</h2>
33
+ <p>When you create a new project or add to existing, choose a <strong>template</strong>: <strong>CSS only</strong>, <strong>Landing</strong>, <strong>Docs</strong>, <strong>Dashboard</strong>, or <strong>Full</strong>. Full clones the entire docs site with home, docs, components, blocks, and themes.</p>
34
+ <pre><code>npx rizzo-css init
35
+ # → Choose framework (Vanilla, Astro, Svelte, React, Vue)
36
+ # → Choose template: CSS only | Landing | Docs | Dashboard | Full</code></pre>
37
+ </section>
38
+ </template>
39
+
40
+ <script setup lang="ts">
41
+ import Card from '@/components/rizzo/Card.vue';
42
+
43
+ const DOCS_BASE = 'https://rizzo-css.vercel.app';
44
+
45
+ const blocks = [
46
+ { href: '/blocks/landing-hero', title: 'Landing hero', desc: 'Marketing hero with headline, subtitle, and primary CTAs. Typography and button tokens.', meta: 'Hero · Buttons · Typography' },
47
+ { href: '/blocks/pricing', title: 'Pricing cards', desc: 'Three-tier pricing section using Card, Badge, and buttons. Theme-aware.', meta: 'Card · Badge · Buttons' },
48
+ { href: '/blocks/dashboard-01', title: 'Dashboard', desc: 'App dashboard with sidebar, stat cards, and data table. Uses Dashboard, Card, and Table components.', meta: 'Dashboard · Sidebar · Cards · Table' },
49
+ { href: '/blocks/docs-layout', title: 'Docs layout', desc: 'Documentation layout with a sidebar nav and main content area. Same pattern as this docs site.', meta: 'Docs Sidebar · Layout' },
50
+ { href: '/blocks/login', title: 'Login', desc: 'Centered login form on a muted background. Brand link, email/password fields, and footer links.', meta: 'Form · Button · Tokens' },
51
+ { href: '/blocks/signup', title: 'Sign up', desc: 'Centered sign-up form with name, email, password, and link to sign in. Same tokens as Login.', meta: 'Form · Button · Tokens' },
52
+ ];
53
+ </script>
54
+
55
+ <style scoped>
56
+ .blocks-index__browse {
57
+ margin-bottom: var(--section-spacing);
58
+ }
59
+ .blocks-index__browse-desc {
60
+ margin: 0;
61
+ color: var(--text-dim);
62
+ font-size: var(--font-size-sm);
63
+ }
64
+ .blocks-index__section-label {
65
+ font-size: var(--text-lg);
66
+ font-weight: 600;
67
+ margin: 0 0 var(--page-header-margin-bottom);
68
+ color: var(--text);
69
+ }
70
+ .blocks-index__grid {
71
+ display: grid;
72
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 20rem), 1fr));
73
+ gap: var(--spacing-6);
74
+ margin: var(--page-header-margin-bottom) 0;
75
+ }
76
+ .block-card-link {
77
+ text-decoration: none;
78
+ color: inherit;
79
+ display: flex;
80
+ flex-direction: column;
81
+ height: 100%;
82
+ transition: transform var(--transition-base);
83
+ }
84
+ .block-card-link :deep(.card) {
85
+ flex: 1;
86
+ display: flex;
87
+ flex-direction: column;
88
+ min-height: 0;
89
+ }
90
+ .block-card-link :deep(.card .card__body) {
91
+ flex: 1;
92
+ }
93
+ .block-card-link:hover {
94
+ transform: translateY(calc(-1 * var(--spacing-0-125)));
95
+ }
96
+ .block-card-link:hover :deep(.card__body h3) {
97
+ color: var(--accent-fg);
98
+ }
99
+ pre {
100
+ background: var(--background-alt);
101
+ border: 1px solid var(--border);
102
+ border-radius: var(--radius-lg);
103
+ padding: var(--spacing-4);
104
+ overflow-x: auto;
105
+ font-size: var(--font-size-sm);
106
+ }
107
+ pre code {
108
+ background: none;
109
+ padding: 0;
110
+ }
111
+ </style>
@@ -0,0 +1,115 @@
1
+ <template>
2
+ <div>
3
+ <section class="docs-components-intro">
4
+ <h1 class="docs__title">Components</h1>
5
+ <p class="docs-components-intro__tagline">
6
+ Browse the collection of accessible, themeable components. Same CSS and BEM for Astro, Svelte, Vue, and Vanilla.
7
+ </p>
8
+ <p class="docs-components-intro__meta">
9
+ Each component has live demos and code on the full docs site. Quick jump:
10
+ <a href="https://rizzo-css.vercel.app/docs/components" target="_blank" rel="noopener noreferrer">Astro</a>
11
+ ·
12
+ <a href="https://rizzo-css.vercel.app/docs/svelte/components" target="_blank" rel="noopener noreferrer">Svelte</a>
13
+ ·
14
+ <a href="https://rizzo-css.vercel.app/docs/vanilla/components" target="_blank" rel="noopener noreferrer">Vanilla</a>.
15
+ </p>
16
+ </section>
17
+
18
+ <section v-for="cat in categories" :key="cat.id" class="docs-component-category" :id="cat.id">
19
+ <h2 class="docs-component-category__title">{{ cat.label }}</h2>
20
+ <div class="docs-component-grid">
21
+ <a
22
+ v-for="item in cat.items"
23
+ :key="item.href"
24
+ :href="DOCS_BASE + item.href"
25
+ class="component-card-link"
26
+ target="_blank"
27
+ rel="noopener noreferrer"
28
+ >
29
+ <Card variant="elevated">
30
+ <div class="card__body">
31
+ <h3 style="margin: 0 0 var(--spacing-2) 0;">{{ item.title }}</h3>
32
+ <p style="margin: 0; color: var(--text-dim); font-size: var(--font-size-sm);">{{ item.description }}</p>
33
+ </div>
34
+ </Card>
35
+ </a>
36
+ </div>
37
+ </section>
38
+
39
+ <section>
40
+ <h2>Component features</h2>
41
+ <p>All components share: semantic theming, accessibility (keyboard + ARIA), BEM naming, responsive design, and WCAG AA compliance.</p>
42
+ </section>
43
+ </div>
44
+ </template>
45
+
46
+ <script setup lang="ts">
47
+ import { getComponentsByCategory } from '@/config/componentCategories';
48
+ import Card from '@/components/rizzo/Card.vue';
49
+
50
+ const DOCS_BASE = 'https://rizzo-css.vercel.app';
51
+ const categories = getComponentsByCategory();
52
+ </script>
53
+
54
+ <style scoped>
55
+ .docs-components-intro {
56
+ margin-bottom: var(--spacing-10);
57
+ }
58
+ .docs-components-intro__tagline {
59
+ font-size: var(--text-lg);
60
+ color: var(--text-dim);
61
+ margin: 0 0 var(--spacing-2);
62
+ line-height: var(--line-height-relaxed);
63
+ }
64
+ .docs-components-intro__meta {
65
+ font-size: var(--font-size-sm);
66
+ color: var(--text-dim);
67
+ margin: 0;
68
+ }
69
+ .docs-component-category {
70
+ margin-bottom: var(--spacing-10);
71
+ }
72
+ .docs-component-category:last-of-type {
73
+ margin-bottom: 0;
74
+ }
75
+ .docs-component-category__title {
76
+ font-size: var(--text-lg);
77
+ font-weight: 600;
78
+ margin: 0 0 var(--spacing-4);
79
+ color: var(--text);
80
+ }
81
+ .docs-component-grid {
82
+ display: grid;
83
+ grid-template-columns: repeat(auto-fill, minmax(var(--spacing-70), 1fr));
84
+ gap: var(--spacing-6);
85
+ margin: 0;
86
+ }
87
+ .component-card-link {
88
+ text-decoration: none;
89
+ color: inherit;
90
+ display: flex;
91
+ flex-direction: column;
92
+ height: 100%;
93
+ transition: transform var(--transition-base);
94
+ }
95
+ .component-card-link :deep(.card) {
96
+ flex: 1;
97
+ display: flex;
98
+ flex-direction: column;
99
+ min-height: 0;
100
+ }
101
+ .component-card-link :deep(.card .card__body) {
102
+ flex: 1;
103
+ }
104
+ .component-card-link:hover {
105
+ transform: translateY(calc(-1 * var(--spacing-0-125)));
106
+ }
107
+ .component-card-link:hover :deep(.card__body h3) {
108
+ color: var(--accent-fg);
109
+ }
110
+ @media (width <= 640px) {
111
+ .docs-component-grid {
112
+ grid-template-columns: 1fr;
113
+ }
114
+ }
115
+ </style>