@sveltekitchen/sveltekitchen 0.0.0-stage → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -2
- package/dist/components/Accordion.svelte +36 -0
- package/dist/components/Accordion.svelte.d.ts +15 -0
- package/dist/components/AccordionItem.svelte +73 -0
- package/dist/components/AccordionItem.svelte.d.ts +21 -0
- package/dist/components/Alert.svelte +23 -0
- package/dist/components/Alert.svelte.d.ts +15 -0
- package/dist/components/Badge.svelte +16 -0
- package/dist/components/Badge.svelte.d.ts +15 -0
- package/dist/components/Button.svelte +43 -0
- package/dist/components/Button.svelte.d.ts +25 -0
- package/dist/components/Calendar.svelte +88 -0
- package/dist/components/Calendar.svelte.d.ts +13 -0
- package/dist/components/Card.svelte +68 -0
- package/dist/components/Card.svelte.d.ts +25 -0
- package/dist/components/Chevron.svelte +36 -0
- package/dist/components/Chevron.svelte.d.ts +19 -0
- package/dist/components/Collapsible.svelte +46 -0
- package/dist/components/Collapsible.svelte.d.ts +19 -0
- package/dist/components/ConfirmDialog.svelte +70 -0
- package/dist/components/ConfirmDialog.svelte.d.ts +27 -0
- package/dist/components/DatePicker.svelte +60 -0
- package/dist/components/DatePicker.svelte.d.ts +17 -0
- package/dist/components/Divider.svelte +25 -0
- package/dist/components/Divider.svelte.d.ts +17 -0
- package/dist/components/Dropdown.svelte +100 -0
- package/dist/components/Dropdown.svelte.d.ts +21 -0
- package/dist/components/Form/Checkbox.svelte +37 -0
- package/dist/components/Form/Checkbox.svelte.d.ts +19 -0
- package/dist/components/Form/Field.svelte +28 -0
- package/dist/components/Form/Field.svelte.d.ts +21 -0
- package/dist/components/Form/Input.svelte +56 -0
- package/dist/components/Form/Input.svelte.d.ts +29 -0
- package/dist/components/Form/MaskedInput.svelte +152 -0
- package/dist/components/Form/MaskedInput.svelte.d.ts +25 -0
- package/dist/components/Form/Radio.svelte +28 -0
- package/dist/components/Form/Radio.svelte.d.ts +19 -0
- package/dist/components/Form/RadioGroup.svelte +28 -0
- package/dist/components/Form/RadioGroup.svelte.d.ts +19 -0
- package/dist/components/Form/Select.svelte +20 -0
- package/dist/components/Form/Select.svelte.d.ts +19 -0
- package/dist/components/Form/Textarea.svelte +30 -0
- package/dist/components/Form/Textarea.svelte.d.ts +25 -0
- package/dist/components/Form/Toggle.svelte +21 -0
- package/dist/components/Form/Toggle.svelte.d.ts +17 -0
- package/dist/components/Modal.svelte +77 -0
- package/dist/components/Modal.svelte.d.ts +27 -0
- package/dist/components/Pagination.svelte +77 -0
- package/dist/components/Pagination.svelte.d.ts +17 -0
- package/dist/components/Progress.svelte +34 -0
- package/dist/components/Progress.svelte.d.ts +21 -0
- package/dist/components/Spinner.svelte +24 -0
- package/dist/components/Spinner.svelte.d.ts +13 -0
- package/dist/components/Table.svelte +100 -0
- package/dist/components/Table.svelte.d.ts +21 -0
- package/dist/components/ThemeToggle.svelte +22 -0
- package/dist/components/ThemeToggle.svelte.d.ts +11 -0
- package/dist/components/Tooltip.svelte +45 -0
- package/dist/components/Tooltip.svelte.d.ts +15 -0
- package/dist/css/base/root.css +103 -0
- package/dist/css/base.css +47 -0
- package/dist/css/components/accordion.css +151 -0
- package/dist/css/components/alert.css +56 -0
- package/dist/css/components/badge.css +56 -0
- package/dist/css/components/button.css +171 -0
- package/dist/css/components/calendar.css +105 -0
- package/dist/css/components/card.css +128 -0
- package/dist/css/components/checkbox-radio.css +105 -0
- package/dist/css/components/collapsible.css +61 -0
- package/dist/css/components/divider.css +42 -0
- package/dist/css/components/dock-layout.css +111 -0
- package/dist/css/components/dropdown.css +68 -0
- package/dist/css/components/floating-shell.css +93 -0
- package/dist/css/components/form.css +286 -0
- package/dist/css/components/login.css +145 -0
- package/dist/css/components/modal.css +179 -0
- package/dist/css/components/nav.css +190 -0
- package/dist/css/components/nestable.css +187 -0
- package/dist/css/components/pagination.css +50 -0
- package/dist/css/components/progress.css +50 -0
- package/dist/css/components/sidebar.css +78 -0
- package/dist/css/components/spinner.css +36 -0
- package/dist/css/components/table.css +98 -0
- package/dist/css/components/tooltip.css +77 -0
- package/dist/css/components/topbar-layout.css +108 -0
- package/dist/css/icons/icons.css +52 -0
- package/dist/css/index.css +20 -0
- package/dist/css/layout/container.css +12 -0
- package/dist/css/layout/grid.css +40 -0
- package/dist/css/layout/shell.css +185 -0
- package/dist/css/overlay/default.css +27 -0
- package/dist/css/tokens/colors.css +81 -0
- package/dist/css/tokens/radius.css +8 -0
- package/dist/css/tokens/shadows.css +23 -0
- package/dist/css/tokens/spacing.css +30 -0
- package/dist/css/tokens/transitions.css +10 -0
- package/dist/css/tokens/typography.css +44 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +52 -0
- package/dist/layout/NavItem.svelte +84 -0
- package/dist/layout/NavItem.svelte.d.ts +25 -0
- package/dist/layout/Shell.svelte +7 -0
- package/dist/layout/Shell.svelte.d.ts +13 -0
- package/dist/layout/SidebarProfile.svelte +31 -0
- package/dist/layout/SidebarProfile.svelte.d.ts +19 -0
- package/dist/layouts/AppShell.svelte +60 -0
- package/dist/layouts/AppShell.svelte.d.ts +21 -0
- package/dist/layouts/BarLayout.svelte +60 -0
- package/dist/layouts/BarLayout.svelte.d.ts +21 -0
- package/dist/layouts/BottomBarLayout.svelte +23 -0
- package/dist/layouts/BottomBarLayout.svelte.d.ts +15 -0
- package/dist/layouts/DockLayout.svelte +81 -0
- package/dist/layouts/DockLayout.svelte.d.ts +15 -0
- package/dist/layouts/FloatingDockLayout.svelte +56 -0
- package/dist/layouts/FloatingDockLayout.svelte.d.ts +13 -0
- package/dist/layouts/FloatingLayout.svelte +80 -0
- package/dist/layouts/FloatingLayout.svelte.d.ts +19 -0
- package/dist/layouts/FloatingLeftLayout.svelte +59 -0
- package/dist/layouts/FloatingLeftLayout.svelte.d.ts +15 -0
- package/dist/layouts/FloatingShell.svelte +80 -0
- package/dist/layouts/FloatingShell.svelte.d.ts +19 -0
- package/dist/layouts/FloatingTopLayout.svelte +68 -0
- package/dist/layouts/FloatingTopLayout.svelte.d.ts +15 -0
- package/dist/layouts/HybridLayout.svelte +20 -0
- package/dist/layouts/HybridLayout.svelte.d.ts +17 -0
- package/dist/layouts/IconRailLayout.svelte +75 -0
- package/dist/layouts/IconRailLayout.svelte.d.ts +15 -0
- package/dist/layouts/LeftBarLayout.svelte +19 -0
- package/dist/layouts/LeftBarLayout.svelte.d.ts +15 -0
- package/dist/layouts/RightBarLayout.svelte +21 -0
- package/dist/layouts/RightBarLayout.svelte.d.ts +15 -0
- package/dist/layouts/SideBar.svelte +86 -0
- package/dist/layouts/SideBar.svelte.d.ts +17 -0
- package/dist/layouts/SidebarLayout.svelte +11 -0
- package/dist/layouts/SidebarLayout.svelte.d.ts +15 -0
- package/dist/layouts/TopBar.svelte +90 -0
- package/dist/layouts/TopBar.svelte.d.ts +21 -0
- package/dist/layouts/TopBarLayout.svelte +26 -0
- package/dist/layouts/TopBarLayout.svelte.d.ts +15 -0
- package/dist/theme/theme.svelte.d.ts +11 -0
- package/dist/theme/theme.svelte.js +48 -0
- package/package.json +56 -4
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/* layout/shell.css */
|
|
2
|
+
|
|
3
|
+
.shell {
|
|
4
|
+
display: grid;
|
|
5
|
+
grid-template:
|
|
6
|
+
"header header" var(--shell-header-height)
|
|
7
|
+
"sidebar content" 1fr
|
|
8
|
+
/ var(--shell-sidebar-width) 1fr;
|
|
9
|
+
min-height: 100vh;
|
|
10
|
+
|
|
11
|
+
--shell-header-height: 3.5rem;
|
|
12
|
+
--shell-sidebar-width: 15rem;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
/* --- Header --- */
|
|
17
|
+
|
|
18
|
+
.shell-header {
|
|
19
|
+
grid-area: header;
|
|
20
|
+
display: flex;
|
|
21
|
+
align-items: center;
|
|
22
|
+
justify-content: space-between;
|
|
23
|
+
padding: 0 var(--space-6);
|
|
24
|
+
background-color: var(--color-header-bg);
|
|
25
|
+
color: var(--color-text-inverse);
|
|
26
|
+
border-bottom: 1px solid var(--color-header-border);
|
|
27
|
+
position: sticky;
|
|
28
|
+
top: 0;
|
|
29
|
+
z-index: 100;
|
|
30
|
+
gap: var(--space-4);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.shell-header-brand {
|
|
34
|
+
display: flex;
|
|
35
|
+
align-items: center;
|
|
36
|
+
gap: var(--space-3);
|
|
37
|
+
font-size: var(--text-base);
|
|
38
|
+
font-weight: var(--font-semibold);
|
|
39
|
+
color: var(--color-text-inverse);
|
|
40
|
+
white-space: nowrap;
|
|
41
|
+
flex-shrink: 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.shell-header-brand img {
|
|
45
|
+
height: 1.75rem;
|
|
46
|
+
width: auto;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.shell-header-center {
|
|
50
|
+
flex: 1;
|
|
51
|
+
display: flex;
|
|
52
|
+
align-items: center;
|
|
53
|
+
gap: var(--space-2);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.shell-header-actions {
|
|
57
|
+
display: flex;
|
|
58
|
+
align-items: center;
|
|
59
|
+
gap: var(--space-2);
|
|
60
|
+
flex-shrink: 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.shell-header .btn-ghost {
|
|
64
|
+
color: var(--color-slate-300);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.shell-header .btn-ghost:hover {
|
|
68
|
+
background-color: rgba(255 255 255 / 0.08);
|
|
69
|
+
color: var(--color-text-inverse);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
/* --- Sidebar --- */
|
|
74
|
+
|
|
75
|
+
.shell-sidebar {
|
|
76
|
+
grid-area: sidebar;
|
|
77
|
+
background-color: var(--color-surface);
|
|
78
|
+
border-right: 1px solid var(--color-border);
|
|
79
|
+
display: flex;
|
|
80
|
+
flex-direction: column;
|
|
81
|
+
position: sticky;
|
|
82
|
+
top: var(--shell-header-height);
|
|
83
|
+
height: calc(100vh - var(--shell-header-height));
|
|
84
|
+
overflow-y: auto;
|
|
85
|
+
overflow-x: hidden;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.shell-sidebar-section {
|
|
89
|
+
padding: var(--space-4) var(--space-3);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.shell-sidebar-section + .shell-sidebar-section {
|
|
93
|
+
border-top: 1px solid var(--color-border);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.shell-sidebar-label {
|
|
97
|
+
font-size: var(--text-xs);
|
|
98
|
+
font-weight: var(--font-semibold);
|
|
99
|
+
color: var(--color-text-subtle);
|
|
100
|
+
letter-spacing: var(--tracking-wider);
|
|
101
|
+
text-transform: uppercase;
|
|
102
|
+
padding: 0 var(--space-3);
|
|
103
|
+
margin-bottom: var(--space-2);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.shell-sidebar-footer {
|
|
107
|
+
margin-top: auto;
|
|
108
|
+
padding: var(--space-4) var(--space-3);
|
|
109
|
+
border-top: 1px solid var(--color-border);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
/* --- Content --- */
|
|
114
|
+
|
|
115
|
+
.shell-content {
|
|
116
|
+
grid-area: content;
|
|
117
|
+
overflow-y: auto;
|
|
118
|
+
background: var(--color-bg);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.shell-content-inner {
|
|
122
|
+
padding: var(--space-6);
|
|
123
|
+
max-width: 72rem;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.shell-content-inner-full {
|
|
127
|
+
padding: var(--space-6);
|
|
128
|
+
max-width: none;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
/* --- Page header --- */
|
|
133
|
+
|
|
134
|
+
.page-header {
|
|
135
|
+
display: flex;
|
|
136
|
+
align-items: flex-start;
|
|
137
|
+
justify-content: space-between;
|
|
138
|
+
margin-bottom: var(--space-6);
|
|
139
|
+
gap: var(--space-4);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.page-title {
|
|
143
|
+
font-size: var(--text-2xl);
|
|
144
|
+
font-weight: var(--font-semibold);
|
|
145
|
+
color: var(--color-text);
|
|
146
|
+
margin: 0;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.page-subtitle {
|
|
150
|
+
font-size: var(--text-sm);
|
|
151
|
+
color: var(--color-text-muted);
|
|
152
|
+
margin-top: var(--space-1);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.page-header-actions {
|
|
156
|
+
display: flex;
|
|
157
|
+
align-items: center;
|
|
158
|
+
gap: var(--space-2);
|
|
159
|
+
flex-shrink: 0;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
/* --- Collapsed sidebar --- */
|
|
164
|
+
|
|
165
|
+
.shell-collapsed {
|
|
166
|
+
--shell-sidebar-width: 3.5rem;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.shell-collapsed .shell-sidebar-label,
|
|
170
|
+
.shell-collapsed .nav-label,
|
|
171
|
+
.shell-collapsed .nav-badge,
|
|
172
|
+
.shell-collapsed .nav-chevron,
|
|
173
|
+
.shell-collapsed .accordion-title,
|
|
174
|
+
.shell-collapsed .accordion-subtitle {
|
|
175
|
+
display: none;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.shell-collapsed .nav-item {
|
|
179
|
+
justify-content: center;
|
|
180
|
+
padding: var(--space-2);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.shell-collapsed .shell-sidebar-section {
|
|
184
|
+
padding: var(--space-3) var(--space-2);
|
|
185
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* overlay/default.css
|
|
2
|
+
──────────────────────────────────────────────────────────────
|
|
3
|
+
THE CUSTOMIZABLE LAYER.
|
|
4
|
+
|
|
5
|
+
Everything that defines the *look* of the design system lives here
|
|
6
|
+
as CSS custom properties: colors, typography, spacing, radius,
|
|
7
|
+
shadows, transitions — for both light and dark mode.
|
|
8
|
+
|
|
9
|
+
The base layer (base/, components/, layout/) only ever *consumes*
|
|
10
|
+
these tokens via var(). It never defines their values.
|
|
11
|
+
|
|
12
|
+
A theme generated by the Theme Builder is a drop-in replacement
|
|
13
|
+
for this file: same custom-property names, different values.
|
|
14
|
+
|
|
15
|
+
To use a custom theme in a real project, load index.css for the
|
|
16
|
+
base layer, then load your generated theme.css AFTER it:
|
|
17
|
+
|
|
18
|
+
<link rel="stylesheet" href="/css/index.css" />
|
|
19
|
+
<link rel="stylesheet" href="/css/my-theme.css" /> <!-- overrides :root -->
|
|
20
|
+
────────────────────────────────────────────────────────────── */
|
|
21
|
+
|
|
22
|
+
@import '../tokens/colors.css';
|
|
23
|
+
@import '../tokens/typography.css';
|
|
24
|
+
@import '../tokens/spacing.css';
|
|
25
|
+
@import '../tokens/shadows.css';
|
|
26
|
+
@import '../tokens/radius.css';
|
|
27
|
+
@import '../tokens/transitions.css';
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* tokens/colors.css */
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
/* Slate scale */
|
|
5
|
+
--color-slate-50: #f8fafc;
|
|
6
|
+
--color-slate-100: #f1f5f9;
|
|
7
|
+
--color-slate-200: #e2e8f0;
|
|
8
|
+
--color-slate-300: #cbd5e1;
|
|
9
|
+
--color-slate-400: #94a3b8;
|
|
10
|
+
--color-slate-500: #64748b;
|
|
11
|
+
--color-slate-600: #475569;
|
|
12
|
+
--color-slate-700: #334155;
|
|
13
|
+
--color-slate-800: #1e293b;
|
|
14
|
+
--color-slate-900: #0f172a;
|
|
15
|
+
|
|
16
|
+
/* Accent */
|
|
17
|
+
--color-accent-light: #4f87f5;
|
|
18
|
+
--color-accent: #2d6ae0;
|
|
19
|
+
--color-accent-dark: #1d58cc;
|
|
20
|
+
|
|
21
|
+
/* ── Light mode (default) ── */
|
|
22
|
+
--color-bg: #f9fafb;
|
|
23
|
+
--color-bg-subtle: #f1f5f9;
|
|
24
|
+
--color-surface: #ffffff;
|
|
25
|
+
--color-border: #e8edf2;
|
|
26
|
+
--color-border-strong: #d4dbe4;
|
|
27
|
+
|
|
28
|
+
--color-text: var(--color-slate-900);
|
|
29
|
+
--color-text-muted: var(--color-slate-500);
|
|
30
|
+
--color-text-subtle: var(--color-slate-400);
|
|
31
|
+
--color-text-inverse: #ffffff;
|
|
32
|
+
|
|
33
|
+
--color-primary: var(--color-accent);
|
|
34
|
+
--color-primary-hover: var(--color-accent-dark);
|
|
35
|
+
--color-primary-text: #ffffff;
|
|
36
|
+
|
|
37
|
+
/* Header */
|
|
38
|
+
--color-header-bg: var(--color-slate-800);
|
|
39
|
+
--color-header-border: var(--color-slate-700);
|
|
40
|
+
|
|
41
|
+
/* Feedback */
|
|
42
|
+
--color-success: #16a34a;
|
|
43
|
+
--color-success-bg: #f0fdf4;
|
|
44
|
+
--color-warning: #d97706;
|
|
45
|
+
--color-warning-bg: #fffbeb;
|
|
46
|
+
--color-error: #dc2626;
|
|
47
|
+
--color-error-bg: #fef2f2;
|
|
48
|
+
--color-info: #0284c7;
|
|
49
|
+
--color-info-bg: #f0f9ff;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* ── Dark mode ── */
|
|
53
|
+
[data-theme="dark"] {
|
|
54
|
+
--color-bg: #0f172a;
|
|
55
|
+
--color-bg-subtle: #1e293b;
|
|
56
|
+
--color-surface: #1e293b;
|
|
57
|
+
--color-border: #2d3f55;
|
|
58
|
+
--color-border-strong: #3d5068;
|
|
59
|
+
|
|
60
|
+
--color-text: #f1f5f9;
|
|
61
|
+
--color-text-muted: #94a3b8;
|
|
62
|
+
--color-text-subtle: #64748b;
|
|
63
|
+
--color-text-inverse: #0f172a;
|
|
64
|
+
|
|
65
|
+
--color-primary: #4f87f5;
|
|
66
|
+
--color-primary-hover: #6b9bf7;
|
|
67
|
+
--color-primary-text: #ffffff;
|
|
68
|
+
|
|
69
|
+
--color-header-bg: #0a111e;
|
|
70
|
+
--color-header-border: #1e293b;
|
|
71
|
+
|
|
72
|
+
/* Feedback — slightly brighter for dark backgrounds */
|
|
73
|
+
--color-success: #22c55e;
|
|
74
|
+
--color-success-bg: #052e16;
|
|
75
|
+
--color-warning: #f59e0b;
|
|
76
|
+
--color-warning-bg: #1c1408;
|
|
77
|
+
--color-error: #f87171;
|
|
78
|
+
--color-error-bg: #2d0a0a;
|
|
79
|
+
--color-info: #38bdf8;
|
|
80
|
+
--color-info-bg: #0a1f2e;
|
|
81
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* tokens/shadows.css */
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
/* xs — button resting state */
|
|
5
|
+
--shadow-xs: 0 2px 4px 0 rgb(15 23 42 / 0.14),
|
|
6
|
+
0 1px 2px 0 rgb(15 23 42 / 0.08);
|
|
7
|
+
|
|
8
|
+
/* sm — cards default */
|
|
9
|
+
--shadow-sm: 0 4px 10px -2px rgb(15 23 42 / 0.18),
|
|
10
|
+
0 2px 6px -2px rgb(15 23 42 / 0.10);
|
|
11
|
+
|
|
12
|
+
/* md — hover state, raised cards */
|
|
13
|
+
--shadow-md: 0 12px 24px -6px rgb(15 23 42 / 0.20),
|
|
14
|
+
0 6px 12px -4px rgb(15 23 42 / 0.12);
|
|
15
|
+
|
|
16
|
+
/* lg — modals, dropdowns */
|
|
17
|
+
--shadow-lg: 0 28px 44px -10px rgb(15 23 42 / 0.24),
|
|
18
|
+
0 12px 22px -8px rgb(15 23 42 / 0.14);
|
|
19
|
+
|
|
20
|
+
/* xl — large modals */
|
|
21
|
+
--shadow-xl: 0 44px 64px -16px rgb(15 23 42 / 0.28),
|
|
22
|
+
0 18px 28px -10px rgb(15 23 42 / 0.14);
|
|
23
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/* tokens/spacing.css */
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
--space-0: 0;
|
|
5
|
+
--space-1: 0.25rem; /* 4px */
|
|
6
|
+
--space-2: 0.5rem; /* 8px */
|
|
7
|
+
--space-3: 0.75rem; /* 12px */
|
|
8
|
+
--space-4: 1rem; /* 16px */
|
|
9
|
+
--space-5: 1.25rem; /* 20px */
|
|
10
|
+
--space-6: 1.5rem; /* 24px */
|
|
11
|
+
--space-8: 2rem; /* 32px */
|
|
12
|
+
--space-10: 2.5rem; /* 40px */
|
|
13
|
+
--space-12: 3rem; /* 48px */
|
|
14
|
+
--space-16: 4rem; /* 64px */
|
|
15
|
+
--space-20: 5rem; /* 80px */
|
|
16
|
+
|
|
17
|
+
/* Semantic gaps */
|
|
18
|
+
--gap-xs: var(--space-1);
|
|
19
|
+
--gap-sm: var(--space-2);
|
|
20
|
+
--gap-md: var(--space-4);
|
|
21
|
+
--gap-lg: var(--space-6);
|
|
22
|
+
--gap-xl: var(--space-8);
|
|
23
|
+
|
|
24
|
+
/* Semantic padding */
|
|
25
|
+
--padding-xs: var(--space-2);
|
|
26
|
+
--padding-sm: var(--space-3);
|
|
27
|
+
--padding-md: var(--space-4);
|
|
28
|
+
--padding-lg: var(--space-6);
|
|
29
|
+
--padding-xl: var(--space-8);
|
|
30
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/* tokens/typography.css */
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
Inter — loaded from the Google Fonts CDN so the package works with no
|
|
5
|
+
setup. @import must stay at the top of this file.
|
|
6
|
+
|
|
7
|
+
To self-host instead: drop this @import, place Inter.var.woff2 in your
|
|
8
|
+
app's static/fonts/ directory, and declare your own @font-face for
|
|
9
|
+
'Inter' (weight 100 900).
|
|
10
|
+
*/
|
|
11
|
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap');
|
|
12
|
+
|
|
13
|
+
:root {
|
|
14
|
+
/* Font families */
|
|
15
|
+
--font-sans: 'Inter', system-ui, -apple-system, sans-serif;
|
|
16
|
+
--font-mono: 'JetBrains Mono', 'Fira Code', monospace;
|
|
17
|
+
|
|
18
|
+
/* Scale */
|
|
19
|
+
--text-xs: 0.75rem; /* 12px */
|
|
20
|
+
--text-sm: 0.875rem; /* 14px */
|
|
21
|
+
--text-base: 1rem; /* 16px */
|
|
22
|
+
--text-lg: 1.125rem; /* 18px */
|
|
23
|
+
--text-xl: 1.25rem; /* 20px */
|
|
24
|
+
--text-2xl: 1.5rem; /* 24px */
|
|
25
|
+
--text-3xl: 1.875rem; /* 30px */
|
|
26
|
+
|
|
27
|
+
/* Weights */
|
|
28
|
+
--font-normal: 400;
|
|
29
|
+
--font-medium: 500;
|
|
30
|
+
--font-semibold: 600;
|
|
31
|
+
--font-bold: 700;
|
|
32
|
+
|
|
33
|
+
/* Line heights */
|
|
34
|
+
--leading-tight: 1.25;
|
|
35
|
+
--leading-snug: 1.375;
|
|
36
|
+
--leading-normal: 1.5;
|
|
37
|
+
--leading-relaxed: 1.625;
|
|
38
|
+
|
|
39
|
+
/* Letter spacing */
|
|
40
|
+
--tracking-tight: -0.01em;
|
|
41
|
+
--tracking-normal: 0;
|
|
42
|
+
--tracking-wide: 0.02em;
|
|
43
|
+
--tracking-wider: 0.05em;
|
|
44
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export { default as Shell } from "./layout/Shell.svelte";
|
|
2
|
+
export { default as NavItem } from "./layout/NavItem.svelte";
|
|
3
|
+
export { default as SidebarProfile } from "./layout/SidebarProfile.svelte";
|
|
4
|
+
export { default as Button } from "./components/Button.svelte";
|
|
5
|
+
export { default as Card } from "./components/Card.svelte";
|
|
6
|
+
export { default as Badge } from "./components/Badge.svelte";
|
|
7
|
+
export { default as Alert } from "./components/Alert.svelte";
|
|
8
|
+
export { default as Modal } from "./components/Modal.svelte";
|
|
9
|
+
export { default as ConfirmDialog } from "./components/ConfirmDialog.svelte";
|
|
10
|
+
export { default as Accordion } from "./components/Accordion.svelte";
|
|
11
|
+
export { default as AccordionItem } from "./components/AccordionItem.svelte";
|
|
12
|
+
export { default as ThemeToggle } from "./components/ThemeToggle.svelte";
|
|
13
|
+
export { default as Dropdown } from "./components/Dropdown.svelte";
|
|
14
|
+
export { default as Table } from "./components/Table.svelte";
|
|
15
|
+
export { default as Spinner } from "./components/Spinner.svelte";
|
|
16
|
+
export { default as Tooltip } from "./components/Tooltip.svelte";
|
|
17
|
+
export { default as Divider } from "./components/Divider.svelte";
|
|
18
|
+
export { default as Progress } from "./components/Progress.svelte";
|
|
19
|
+
export { default as Pagination } from "./components/Pagination.svelte";
|
|
20
|
+
export { default as Calendar } from "./components/Calendar.svelte";
|
|
21
|
+
export { default as DatePicker } from "./components/DatePicker.svelte";
|
|
22
|
+
export { default as Chevron } from "./components/Chevron.svelte";
|
|
23
|
+
export { default as Collapsible } from "./components/Collapsible.svelte";
|
|
24
|
+
export { default as Field } from "./components/Form/Field.svelte";
|
|
25
|
+
export { default as Input } from "./components/Form/Input.svelte";
|
|
26
|
+
export { default as Select } from "./components/Form/Select.svelte";
|
|
27
|
+
export { default as Toggle } from "./components/Form/Toggle.svelte";
|
|
28
|
+
export { default as Checkbox } from "./components/Form/Checkbox.svelte";
|
|
29
|
+
export { default as Radio } from "./components/Form/Radio.svelte";
|
|
30
|
+
export { default as RadioGroup } from "./components/Form/RadioGroup.svelte";
|
|
31
|
+
export { default as Textarea } from "./components/Form/Textarea.svelte";
|
|
32
|
+
export { default as MaskedInput } from "./components/Form/MaskedInput.svelte";
|
|
33
|
+
export { theme } from "./theme/theme.svelte.js";
|
|
34
|
+
export { default as TopBar } from "./layouts/TopBar.svelte";
|
|
35
|
+
export { default as SideBar } from "./layouts/SideBar.svelte";
|
|
36
|
+
export { default as TopBarLayout } from "./layouts/TopBarLayout.svelte";
|
|
37
|
+
export { default as LeftBarLayout } from "./layouts/LeftBarLayout.svelte";
|
|
38
|
+
export { default as RightBarLayout } from "./layouts/RightBarLayout.svelte";
|
|
39
|
+
export { default as BottomBarLayout } from "./layouts/BottomBarLayout.svelte";
|
|
40
|
+
export { default as IconRailLayout } from "./layouts/IconRailLayout.svelte";
|
|
41
|
+
export { default as FloatingTopLayout } from "./layouts/FloatingTopLayout.svelte";
|
|
42
|
+
export { default as FloatingLeftLayout } from "./layouts/FloatingLeftLayout.svelte";
|
|
43
|
+
export { default as FloatingDockLayout } from "./layouts/FloatingDockLayout.svelte";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Layout
|
|
2
|
+
export { default as Shell } from './layout/Shell.svelte';
|
|
3
|
+
export { default as NavItem } from './layout/NavItem.svelte';
|
|
4
|
+
export { default as SidebarProfile } from './layout/SidebarProfile.svelte';
|
|
5
|
+
|
|
6
|
+
// Components
|
|
7
|
+
export { default as Button } from './components/Button.svelte';
|
|
8
|
+
export { default as Card } from './components/Card.svelte';
|
|
9
|
+
export { default as Badge } from './components/Badge.svelte';
|
|
10
|
+
export { default as Alert } from './components/Alert.svelte';
|
|
11
|
+
export { default as Modal } from './components/Modal.svelte';
|
|
12
|
+
export { default as ConfirmDialog } from './components/ConfirmDialog.svelte';
|
|
13
|
+
export { default as Accordion } from './components/Accordion.svelte';
|
|
14
|
+
export { default as AccordionItem } from './components/AccordionItem.svelte';
|
|
15
|
+
export { default as ThemeToggle } from './components/ThemeToggle.svelte';
|
|
16
|
+
export { default as Dropdown } from './components/Dropdown.svelte';
|
|
17
|
+
export { default as Table } from './components/Table.svelte';
|
|
18
|
+
export { default as Spinner } from './components/Spinner.svelte';
|
|
19
|
+
export { default as Tooltip } from './components/Tooltip.svelte';
|
|
20
|
+
export { default as Divider } from './components/Divider.svelte';
|
|
21
|
+
export { default as Progress } from './components/Progress.svelte';
|
|
22
|
+
export { default as Pagination } from './components/Pagination.svelte';
|
|
23
|
+
export { default as Calendar } from './components/Calendar.svelte';
|
|
24
|
+
export { default as DatePicker } from './components/DatePicker.svelte';
|
|
25
|
+
export { default as Chevron } from './components/Chevron.svelte';
|
|
26
|
+
export { default as Collapsible } from './components/Collapsible.svelte';
|
|
27
|
+
|
|
28
|
+
// Form
|
|
29
|
+
export { default as Field } from './components/Form/Field.svelte';
|
|
30
|
+
export { default as Input } from './components/Form/Input.svelte';
|
|
31
|
+
export { default as Select } from './components/Form/Select.svelte';
|
|
32
|
+
export { default as Toggle } from './components/Form/Toggle.svelte';
|
|
33
|
+
export { default as Checkbox } from './components/Form/Checkbox.svelte';
|
|
34
|
+
export { default as Radio } from './components/Form/Radio.svelte';
|
|
35
|
+
export { default as RadioGroup } from './components/Form/RadioGroup.svelte';
|
|
36
|
+
export { default as Textarea } from './components/Form/Textarea.svelte';
|
|
37
|
+
export { default as MaskedInput } from './components/Form/MaskedInput.svelte';
|
|
38
|
+
|
|
39
|
+
// Theme
|
|
40
|
+
export { theme } from './theme/theme.svelte.js';
|
|
41
|
+
|
|
42
|
+
// Layouts (importable app shells)
|
|
43
|
+
export { default as TopBar } from './layouts/TopBar.svelte';
|
|
44
|
+
export { default as SideBar } from './layouts/SideBar.svelte';
|
|
45
|
+
export { default as TopBarLayout } from './layouts/TopBarLayout.svelte';
|
|
46
|
+
export { default as LeftBarLayout } from './layouts/LeftBarLayout.svelte';
|
|
47
|
+
export { default as RightBarLayout } from './layouts/RightBarLayout.svelte';
|
|
48
|
+
export { default as BottomBarLayout } from './layouts/BottomBarLayout.svelte';
|
|
49
|
+
export { default as IconRailLayout } from './layouts/IconRailLayout.svelte';
|
|
50
|
+
export { default as FloatingTopLayout } from './layouts/FloatingTopLayout.svelte';
|
|
51
|
+
export { default as FloatingLeftLayout } from './layouts/FloatingLeftLayout.svelte';
|
|
52
|
+
export { default as FloatingDockLayout } from './layouts/FloatingDockLayout.svelte';
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
let {
|
|
3
|
+
href = undefined,
|
|
4
|
+
icon = undefined,
|
|
5
|
+
badge = undefined,
|
|
6
|
+
active = false,
|
|
7
|
+
children, // snippet: the label content
|
|
8
|
+
subItems = undefined, // optional array of { href, icon, label }
|
|
9
|
+
isActive = undefined, // (href) => boolean, used to mark active sub-items
|
|
10
|
+
initialOpen = false,
|
|
11
|
+
...restProps
|
|
12
|
+
} = $props();
|
|
13
|
+
|
|
14
|
+
const hasSub = $derived(Array.isArray(subItems) && subItems.length > 0);
|
|
15
|
+
|
|
16
|
+
// Expansion state for the second level (vertical, inline).
|
|
17
|
+
let open = $state(initialOpen);
|
|
18
|
+
|
|
19
|
+
// Auto-open if a child is active.
|
|
20
|
+
$effect(() => {
|
|
21
|
+
if (hasSub && isActive && subItems.some((s) => isActive(s.href))) {
|
|
22
|
+
open = true;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
function toggle(e) {
|
|
27
|
+
e.preventDefault();
|
|
28
|
+
e.stopPropagation();
|
|
29
|
+
open = !open;
|
|
30
|
+
}
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<div class="nav-item-wrap">
|
|
34
|
+
{#if href}
|
|
35
|
+
<a {href} class="nav-item" class:active {...restProps}>
|
|
36
|
+
{#if icon}<span class="material-symbols-outlined nav-icon">{icon}</span>{/if}
|
|
37
|
+
<span class="nav-label">{@render children?.()}</span>
|
|
38
|
+
{#if badge !== undefined}<span class="nav-badge">{badge}</span>{/if}
|
|
39
|
+
{#if hasSub}
|
|
40
|
+
<button
|
|
41
|
+
type="button"
|
|
42
|
+
class="nav-chevron"
|
|
43
|
+
class:open
|
|
44
|
+
aria-label={open ? 'Collapse' : 'Expand'}
|
|
45
|
+
aria-expanded={open}
|
|
46
|
+
onclick={toggle}
|
|
47
|
+
>
|
|
48
|
+
<span class="material-symbols-outlined">chevron_right</span>
|
|
49
|
+
</button>
|
|
50
|
+
{/if}
|
|
51
|
+
</a>
|
|
52
|
+
{:else}
|
|
53
|
+
<button
|
|
54
|
+
class="nav-item"
|
|
55
|
+
class:active
|
|
56
|
+
onclick={hasSub ? (() => (open = !open)) : restProps.onclick}
|
|
57
|
+
{...restProps}
|
|
58
|
+
>
|
|
59
|
+
{#if icon}<span class="material-symbols-outlined nav-icon">{icon}</span>{/if}
|
|
60
|
+
<span class="nav-label">{@render children?.()}</span>
|
|
61
|
+
{#if badge !== undefined}<span class="nav-badge">{badge}</span>{/if}
|
|
62
|
+
{#if hasSub}
|
|
63
|
+
<span class="nav-chevron" class:open aria-hidden="true">
|
|
64
|
+
<span class="material-symbols-outlined">chevron_right</span>
|
|
65
|
+
</span>
|
|
66
|
+
{/if}
|
|
67
|
+
</button>
|
|
68
|
+
{/if}
|
|
69
|
+
|
|
70
|
+
{#if hasSub && open}
|
|
71
|
+
<div class="nav-subitems">
|
|
72
|
+
{#each subItems as sub}
|
|
73
|
+
<a
|
|
74
|
+
href={sub.href}
|
|
75
|
+
class="nav-subitem"
|
|
76
|
+
class:active={isActive ? isActive(sub.href) : false}
|
|
77
|
+
>
|
|
78
|
+
{#if sub.icon}<span class="material-symbols-outlined nav-subicon">{sub.icon}</span>{/if}
|
|
79
|
+
<span>{sub.label}</span>
|
|
80
|
+
</a>
|
|
81
|
+
{/each}
|
|
82
|
+
</div>
|
|
83
|
+
{/if}
|
|
84
|
+
</div>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export default NavItem;
|
|
2
|
+
type NavItem = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
declare const NavItem: import("svelte").Component<{
|
|
7
|
+
href?: any;
|
|
8
|
+
icon?: any;
|
|
9
|
+
badge?: any;
|
|
10
|
+
active?: boolean;
|
|
11
|
+
children: any;
|
|
12
|
+
subItems?: any;
|
|
13
|
+
isActive?: any;
|
|
14
|
+
initialOpen?: boolean;
|
|
15
|
+
} & Record<string, any>, {}, "">;
|
|
16
|
+
type $$ComponentProps = {
|
|
17
|
+
href?: any;
|
|
18
|
+
icon?: any;
|
|
19
|
+
badge?: any;
|
|
20
|
+
active?: boolean;
|
|
21
|
+
children: any;
|
|
22
|
+
subItems?: any;
|
|
23
|
+
isActive?: any;
|
|
24
|
+
initialOpen?: boolean;
|
|
25
|
+
} & Record<string, any>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export default Shell;
|
|
2
|
+
type Shell = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
declare const Shell: import("svelte").Component<{
|
|
7
|
+
collapsed?: boolean;
|
|
8
|
+
children: any;
|
|
9
|
+
}, {}, "">;
|
|
10
|
+
type $$ComponentProps = {
|
|
11
|
+
collapsed?: boolean;
|
|
12
|
+
children: any;
|
|
13
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
let {
|
|
3
|
+
name = '',
|
|
4
|
+
role = '',
|
|
5
|
+
initials = '',
|
|
6
|
+
avatarSrc = undefined,
|
|
7
|
+
children,
|
|
8
|
+
...restProps
|
|
9
|
+
} = $props();
|
|
10
|
+
|
|
11
|
+
let display = $derived(initials || name.slice(0, 2).toUpperCase());
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<div class="sidebar-profile" {...restProps}>
|
|
15
|
+
<div class="sidebar-avatar">
|
|
16
|
+
{#if avatarSrc}
|
|
17
|
+
<img src={avatarSrc} alt={name} />
|
|
18
|
+
{:else}
|
|
19
|
+
{display}
|
|
20
|
+
{/if}
|
|
21
|
+
</div>
|
|
22
|
+
<div class="sidebar-profile-info">
|
|
23
|
+
<div class="sidebar-profile-name">{name}</div>
|
|
24
|
+
<div class="sidebar-profile-role">{role}</div>
|
|
25
|
+
</div>
|
|
26
|
+
{#if children}
|
|
27
|
+
{@render children()}
|
|
28
|
+
{:else}
|
|
29
|
+
<span class="material-symbols-outlined sidebar-profile-action">more_vert</span>
|
|
30
|
+
{/if}
|
|
31
|
+
</div>
|