@makolabs/ripple 0.0.1-dev.4 → 0.0.1-dev.40
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 +394 -54
- package/dist/button/Button.svelte +5 -3
- package/dist/button/Button.svelte.d.ts +1 -1
- package/dist/button/button.d.ts +40 -63
- package/dist/button/button.js +15 -14
- package/dist/charts/Chart.svelte +545 -0
- package/dist/charts/Chart.svelte.d.ts +4 -0
- package/dist/drawer/Drawer.svelte +13 -2
- package/dist/drawer/Drawer.svelte.d.ts +1 -1
- package/dist/drawer/drawer.d.ts +0 -17
- package/dist/drawer/drawer.js +3 -3
- package/dist/elements/accordion/Accordion.svelte +83 -0
- package/dist/elements/accordion/Accordion.svelte.d.ts +4 -0
- package/dist/elements/accordion/accordion.d.ts +200 -0
- package/dist/elements/accordion/accordion.js +86 -0
- package/dist/elements/alert/Alert.svelte +57 -0
- package/dist/elements/alert/Alert.svelte.d.ts +4 -0
- package/dist/elements/badge/Badge.svelte +13 -5
- package/dist/elements/badge/Badge.svelte.d.ts +1 -1
- package/dist/elements/badge/badge.d.ts +0 -12
- package/dist/elements/dropdown/Dropdown.svelte +32 -37
- package/dist/elements/dropdown/Dropdown.svelte.d.ts +1 -1
- package/dist/elements/dropdown/Select.svelte +143 -59
- package/dist/elements/dropdown/Select.svelte.d.ts +1 -1
- package/dist/elements/dropdown/dropdown.d.ts +34 -57
- package/dist/elements/dropdown/dropdown.js +10 -4
- package/dist/elements/dropdown/select.d.ts +34 -54
- package/dist/elements/dropdown/select.js +22 -14
- package/dist/elements/file-upload/FileUpload.svelte +130 -0
- package/dist/elements/file-upload/FileUpload.svelte.d.ts +4 -0
- package/dist/elements/file-upload/FilesPreview.svelte +93 -0
- package/dist/elements/file-upload/FilesPreview.svelte.d.ts +4 -0
- package/dist/elements/progress/Progress.svelte +145 -0
- package/dist/elements/progress/Progress.svelte.d.ts +4 -0
- package/dist/elements/timeline/Timeline.svelte +92 -0
- package/dist/elements/timeline/Timeline.svelte.d.ts +7 -0
- package/dist/forms/Checkbox.svelte +54 -0
- package/dist/forms/Checkbox.svelte.d.ts +4 -0
- package/dist/forms/DateRange.svelte +493 -0
- package/dist/forms/DateRange.svelte.d.ts +4 -0
- package/dist/forms/Form.svelte +39 -0
- package/dist/forms/Form.svelte.d.ts +4 -0
- package/dist/forms/Input.svelte +86 -0
- package/dist/forms/Input.svelte.d.ts +4 -0
- package/dist/forms/NumberInput.svelte +159 -0
- package/dist/forms/NumberInput.svelte.d.ts +4 -0
- package/dist/forms/RadioInputs.svelte +64 -0
- package/dist/forms/RadioInputs.svelte.d.ts +4 -0
- package/dist/forms/RadioPill.svelte +66 -0
- package/dist/forms/RadioPill.svelte.d.ts +4 -0
- package/dist/forms/Slider.svelte +342 -0
- package/dist/forms/Slider.svelte.d.ts +4 -0
- package/dist/forms/Tags.svelte +181 -0
- package/dist/forms/Tags.svelte.d.ts +4 -0
- package/dist/forms/Toggle.svelte +132 -0
- package/dist/forms/Toggle.svelte.d.ts +4 -0
- package/dist/forms/slider.d.ts +143 -0
- package/dist/forms/slider.js +62 -0
- package/dist/header/Breadcrumbs.svelte +2 -1
- package/dist/header/Breadcrumbs.svelte.d.ts +1 -1
- package/dist/header/PageHeader.svelte +2 -2
- package/dist/header/PageHeader.svelte.d.ts +1 -1
- package/dist/header/breadcrumbs.d.ts +20 -14
- package/dist/header/breadcrumbs.js +6 -0
- package/dist/helper/date.d.ts +7 -0
- package/dist/helper/date.js +15 -0
- package/dist/index.d.ts +762 -9
- package/dist/index.js +70 -16
- package/dist/layout/card/Card.svelte +5 -8
- package/dist/layout/card/Card.svelte.d.ts +1 -1
- package/dist/layout/card/StatsCard.svelte +119 -89
- package/dist/layout/card/StatsCard.svelte.d.ts +1 -1
- package/dist/layout/card/card.d.ts +22 -33
- package/dist/layout/card/card.js +9 -8
- package/dist/layout/card/stats-card.d.ts +22 -39
- package/dist/layout/card/stats-card.js +14 -14
- package/dist/layout/navbar/navbar.d.ts +0 -23
- package/dist/layout/sidebar/NavGroup.svelte +38 -48
- package/dist/layout/sidebar/NavGroup.svelte.d.ts +1 -1
- package/dist/layout/sidebar/NavItem.svelte +3 -3
- package/dist/layout/sidebar/NavItem.svelte.d.ts +1 -1
- package/dist/layout/sidebar/Sidebar.svelte +101 -72
- package/dist/layout/sidebar/Sidebar.svelte.d.ts +1 -1
- package/dist/layout/table/Table.svelte +2 -2
- package/dist/layout/table/Table.svelte.d.ts +1 -1
- package/dist/layout/table/table.d.ts +1 -20
- package/dist/layout/table/table.js +0 -8
- package/dist/layout/tabs/TabGroup.svelte +2 -2
- package/dist/layout/tabs/TabGroup.svelte.d.ts +2 -2
- package/dist/layout/tabs/tabs.d.ts +2 -2
- package/dist/modal/Modal.svelte +2 -1
- package/dist/modal/Modal.svelte.d.ts +1 -1
- package/dist/modal/modal.d.ts +0 -23
- package/dist/modal/modal.js +3 -3
- package/dist/sonner/sonner.svelte +13 -0
- package/dist/sonner/sonner.svelte.d.ts +4 -0
- package/dist/types/variants.d.ts +1 -21
- package/dist/types/variants.js +1 -19
- package/dist/variants.d.ts +30 -0
- package/dist/variants.js +36 -0
- package/package.json +7 -3
- package/dist/button/index.d.ts +0 -1
- package/dist/button/index.js +0 -1
- package/dist/drawer/index.d.ts +0 -2
- package/dist/drawer/index.js +0 -1
- package/dist/elements/badge/index.d.ts +0 -2
- package/dist/elements/badge/index.js +0 -2
- package/dist/elements/dropdown/index.d.ts +0 -3
- package/dist/elements/dropdown/index.js +0 -2
- package/dist/header/index.d.ts +0 -4
- package/dist/header/index.js +0 -2
- package/dist/header/pageheaders.d.ts +0 -10
- package/dist/header/pageheaders.js +0 -1
- package/dist/layout/card/index.d.ts +0 -4
- package/dist/layout/card/index.js +0 -2
- package/dist/layout/index.d.ts +0 -7
- package/dist/layout/index.js +0 -7
- package/dist/layout/navbar/index.d.ts +0 -2
- package/dist/layout/navbar/index.js +0 -2
- package/dist/layout/sidebar/index.d.ts +0 -2
- package/dist/layout/sidebar/index.js +0 -1
- package/dist/layout/sidebar/sidebar.d.ts +0 -46
- package/dist/layout/sidebar/sidebar.js +0 -1
- package/dist/layout/table/index.d.ts +0 -3
- package/dist/layout/table/index.js +0 -2
- package/dist/layout/tabs/index.d.ts +0 -3
- package/dist/layout/tabs/index.js +0 -3
- package/dist/modal/index.d.ts +0 -1
- package/dist/modal/index.js +0 -1
|
@@ -1,45 +1,43 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
import type { VariantColors } from '../../types/variants.js';
|
|
1
|
+
import { Color } from '../../variants.js';
|
|
4
2
|
export declare const statsCard: import("tailwind-variants").TVReturnType<{
|
|
5
3
|
color: {
|
|
6
|
-
|
|
4
|
+
[Color.DEFAULT]: {
|
|
7
5
|
label: string;
|
|
8
6
|
value: string;
|
|
9
7
|
trend: string;
|
|
10
8
|
previousValue: string;
|
|
11
9
|
};
|
|
12
|
-
|
|
10
|
+
[Color.PRIMARY]: {
|
|
13
11
|
label: string;
|
|
14
12
|
value: string;
|
|
15
13
|
trend: string;
|
|
16
14
|
previousValue: string;
|
|
17
15
|
};
|
|
18
|
-
|
|
16
|
+
[Color.SECONDARY]: {
|
|
19
17
|
label: string;
|
|
20
18
|
value: string;
|
|
21
19
|
trend: string;
|
|
22
20
|
previousValue: string;
|
|
23
21
|
};
|
|
24
|
-
|
|
22
|
+
[Color.INFO]: {
|
|
25
23
|
label: string;
|
|
26
24
|
value: string;
|
|
27
25
|
trend: string;
|
|
28
26
|
previousValue: string;
|
|
29
27
|
};
|
|
30
|
-
|
|
28
|
+
[Color.SUCCESS]: {
|
|
31
29
|
label: string;
|
|
32
30
|
value: string;
|
|
33
31
|
trend: string;
|
|
34
32
|
previousValue: string;
|
|
35
33
|
};
|
|
36
|
-
|
|
34
|
+
[Color.WARNING]: {
|
|
37
35
|
label: string;
|
|
38
36
|
value: string;
|
|
39
37
|
trend: string;
|
|
40
38
|
previousValue: string;
|
|
41
39
|
};
|
|
42
|
-
|
|
40
|
+
[Color.DANGER]: {
|
|
43
41
|
label: string;
|
|
44
42
|
value: string;
|
|
45
43
|
trend: string;
|
|
@@ -64,46 +62,45 @@ export declare const statsCard: import("tailwind-variants").TVReturnType<{
|
|
|
64
62
|
trend: string;
|
|
65
63
|
previousValue: string;
|
|
66
64
|
unit: string;
|
|
67
|
-
chartContainer: string;
|
|
68
65
|
}, undefined, {
|
|
69
66
|
color: {
|
|
70
|
-
|
|
67
|
+
[Color.DEFAULT]: {
|
|
71
68
|
label: string;
|
|
72
69
|
value: string;
|
|
73
70
|
trend: string;
|
|
74
71
|
previousValue: string;
|
|
75
72
|
};
|
|
76
|
-
|
|
73
|
+
[Color.PRIMARY]: {
|
|
77
74
|
label: string;
|
|
78
75
|
value: string;
|
|
79
76
|
trend: string;
|
|
80
77
|
previousValue: string;
|
|
81
78
|
};
|
|
82
|
-
|
|
79
|
+
[Color.SECONDARY]: {
|
|
83
80
|
label: string;
|
|
84
81
|
value: string;
|
|
85
82
|
trend: string;
|
|
86
83
|
previousValue: string;
|
|
87
84
|
};
|
|
88
|
-
|
|
85
|
+
[Color.INFO]: {
|
|
89
86
|
label: string;
|
|
90
87
|
value: string;
|
|
91
88
|
trend: string;
|
|
92
89
|
previousValue: string;
|
|
93
90
|
};
|
|
94
|
-
|
|
91
|
+
[Color.SUCCESS]: {
|
|
95
92
|
label: string;
|
|
96
93
|
value: string;
|
|
97
94
|
trend: string;
|
|
98
95
|
previousValue: string;
|
|
99
96
|
};
|
|
100
|
-
|
|
97
|
+
[Color.WARNING]: {
|
|
101
98
|
label: string;
|
|
102
99
|
value: string;
|
|
103
100
|
trend: string;
|
|
104
101
|
previousValue: string;
|
|
105
102
|
};
|
|
106
|
-
|
|
103
|
+
[Color.DANGER]: {
|
|
107
104
|
label: string;
|
|
108
105
|
value: string;
|
|
109
106
|
trend: string;
|
|
@@ -128,46 +125,45 @@ export declare const statsCard: import("tailwind-variants").TVReturnType<{
|
|
|
128
125
|
trend: string;
|
|
129
126
|
previousValue: string;
|
|
130
127
|
unit: string;
|
|
131
|
-
chartContainer: string;
|
|
132
128
|
}, import("tailwind-variants").TVReturnType<{
|
|
133
129
|
color: {
|
|
134
|
-
|
|
130
|
+
[Color.DEFAULT]: {
|
|
135
131
|
label: string;
|
|
136
132
|
value: string;
|
|
137
133
|
trend: string;
|
|
138
134
|
previousValue: string;
|
|
139
135
|
};
|
|
140
|
-
|
|
136
|
+
[Color.PRIMARY]: {
|
|
141
137
|
label: string;
|
|
142
138
|
value: string;
|
|
143
139
|
trend: string;
|
|
144
140
|
previousValue: string;
|
|
145
141
|
};
|
|
146
|
-
|
|
142
|
+
[Color.SECONDARY]: {
|
|
147
143
|
label: string;
|
|
148
144
|
value: string;
|
|
149
145
|
trend: string;
|
|
150
146
|
previousValue: string;
|
|
151
147
|
};
|
|
152
|
-
|
|
148
|
+
[Color.INFO]: {
|
|
153
149
|
label: string;
|
|
154
150
|
value: string;
|
|
155
151
|
trend: string;
|
|
156
152
|
previousValue: string;
|
|
157
153
|
};
|
|
158
|
-
|
|
154
|
+
[Color.SUCCESS]: {
|
|
159
155
|
label: string;
|
|
160
156
|
value: string;
|
|
161
157
|
trend: string;
|
|
162
158
|
previousValue: string;
|
|
163
159
|
};
|
|
164
|
-
|
|
160
|
+
[Color.WARNING]: {
|
|
165
161
|
label: string;
|
|
166
162
|
value: string;
|
|
167
163
|
trend: string;
|
|
168
164
|
previousValue: string;
|
|
169
165
|
};
|
|
170
|
-
|
|
166
|
+
[Color.DANGER]: {
|
|
171
167
|
label: string;
|
|
172
168
|
value: string;
|
|
173
169
|
trend: string;
|
|
@@ -192,17 +188,4 @@ export declare const statsCard: import("tailwind-variants").TVReturnType<{
|
|
|
192
188
|
trend: string;
|
|
193
189
|
previousValue: string;
|
|
194
190
|
unit: string;
|
|
195
|
-
chartContainer: string;
|
|
196
191
|
}, undefined, unknown, unknown, undefined>>;
|
|
197
|
-
export type StatsCardProps = {
|
|
198
|
-
label?: string;
|
|
199
|
-
value?: string | number;
|
|
200
|
-
previousValue?: string | number;
|
|
201
|
-
previousValuePrefix?: string;
|
|
202
|
-
trend?: number;
|
|
203
|
-
color?: VariantColors;
|
|
204
|
-
chartData?: number[];
|
|
205
|
-
children?: Snippet;
|
|
206
|
-
class?: ClassValue;
|
|
207
|
-
formatLargeNumbers?: boolean;
|
|
208
|
-
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { tv } from 'tailwind-variants';
|
|
2
|
+
import { Color } from '../../variants.js';
|
|
2
3
|
export const statsCard = tv({
|
|
3
4
|
slots: {
|
|
4
5
|
base: '',
|
|
@@ -7,47 +8,46 @@ export const statsCard = tv({
|
|
|
7
8
|
trend: '',
|
|
8
9
|
previousValue: '',
|
|
9
10
|
unit: '',
|
|
10
|
-
chartContainer: ''
|
|
11
11
|
},
|
|
12
12
|
variants: {
|
|
13
13
|
color: {
|
|
14
|
-
|
|
15
|
-
label: 'text-
|
|
16
|
-
value: 'text-
|
|
17
|
-
trend: 'text-
|
|
18
|
-
previousValue: 'text-
|
|
14
|
+
[Color.DEFAULT]: {
|
|
15
|
+
label: 'text-default-500',
|
|
16
|
+
value: 'text-default-900',
|
|
17
|
+
trend: 'text-default-600',
|
|
18
|
+
previousValue: 'text-default-500'
|
|
19
19
|
},
|
|
20
|
-
|
|
20
|
+
[Color.PRIMARY]: {
|
|
21
21
|
label: 'text-primary-500',
|
|
22
22
|
value: 'text-primary-600',
|
|
23
23
|
trend: 'text-primary-600',
|
|
24
24
|
previousValue: 'text-primary-400'
|
|
25
25
|
},
|
|
26
|
-
|
|
26
|
+
[Color.SECONDARY]: {
|
|
27
27
|
label: 'text-secondary-500',
|
|
28
28
|
value: 'text-secondary-600',
|
|
29
29
|
trend: 'text-secondary-600',
|
|
30
30
|
previousValue: 'text-secondary-400'
|
|
31
31
|
},
|
|
32
|
-
|
|
32
|
+
[Color.INFO]: {
|
|
33
33
|
label: 'text-info-500',
|
|
34
34
|
value: 'text-info-600',
|
|
35
35
|
trend: 'text-info-600',
|
|
36
36
|
previousValue: 'text-info-400'
|
|
37
37
|
},
|
|
38
|
-
|
|
38
|
+
[Color.SUCCESS]: {
|
|
39
39
|
label: 'text-success-500',
|
|
40
40
|
value: 'text-success-600',
|
|
41
41
|
trend: 'text-success-600',
|
|
42
42
|
previousValue: 'text-success-400'
|
|
43
43
|
},
|
|
44
|
-
|
|
44
|
+
[Color.WARNING]: {
|
|
45
45
|
label: 'text-warning-500',
|
|
46
46
|
value: 'text-warning-600',
|
|
47
47
|
trend: 'text-warning-600',
|
|
48
48
|
previousValue: 'text-warning-400'
|
|
49
49
|
},
|
|
50
|
-
|
|
50
|
+
[Color.DANGER]: {
|
|
51
51
|
label: 'text-danger-500',
|
|
52
52
|
value: 'text-danger-600',
|
|
53
53
|
trend: 'text-danger-600',
|
|
@@ -62,12 +62,12 @@ export const statsCard = tv({
|
|
|
62
62
|
trend: 'text-danger-600'
|
|
63
63
|
},
|
|
64
64
|
neutral: {
|
|
65
|
-
trend: 'text-
|
|
65
|
+
trend: 'text-default-600'
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
},
|
|
69
69
|
defaultVariants: {
|
|
70
|
-
color:
|
|
70
|
+
color: Color.DEFAULT,
|
|
71
71
|
trendDirection: 'neutral'
|
|
72
72
|
}
|
|
73
73
|
});
|
|
@@ -198,31 +198,8 @@ export declare const navbar: import("tailwind-variants").TVReturnType<{
|
|
|
198
198
|
export type NavbarProps = {
|
|
199
199
|
logo?: string | Component;
|
|
200
200
|
links?: NavbarLinkItem[];
|
|
201
|
-
color?: keyof typeof navbar.variants.color;
|
|
202
|
-
size?: keyof typeof navbar.variants.size;
|
|
203
201
|
class?: ClassValue;
|
|
204
|
-
wrapperClass?: ClassValue;
|
|
205
|
-
brandClass?: ClassValue;
|
|
206
|
-
menuClass?: ClassValue;
|
|
207
|
-
mobileMenuClass?: ClassValue;
|
|
208
|
-
linksClass?: ClassValue;
|
|
209
|
-
linkClass?: ClassValue;
|
|
210
|
-
mobileLinkClass?: ClassValue;
|
|
211
|
-
actionsClass?: ClassValue;
|
|
212
|
-
sticky?: boolean;
|
|
213
202
|
brand?: Snippet;
|
|
214
203
|
children?: Snippet;
|
|
215
204
|
actions?: Snippet;
|
|
216
|
-
userMenu?: boolean;
|
|
217
|
-
username?: string;
|
|
218
|
-
userAvatar?: string;
|
|
219
|
-
userMenuItems?: {
|
|
220
|
-
label: string;
|
|
221
|
-
href: string;
|
|
222
|
-
onClick?: () => void;
|
|
223
|
-
}[];
|
|
224
|
-
onmenuitemclick?: (item: {
|
|
225
|
-
label: string;
|
|
226
|
-
href: string;
|
|
227
|
-
}) => void;
|
|
228
205
|
};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import FluentChevronRight16Filled from '../../../icons/FluentChevronRight16Filled.svelte';
|
|
3
2
|
import { getContext } from 'svelte';
|
|
4
|
-
import type { MenuBar, NavGroupProps } from '
|
|
3
|
+
import type { MenuBar, NavGroupProps } from '../../index.js';
|
|
5
4
|
import { cn } from '../../helper/cls.js';
|
|
6
5
|
|
|
7
6
|
let {
|
|
@@ -21,23 +20,20 @@
|
|
|
21
20
|
|
|
22
21
|
const menubar: MenuBar = getContext('menubar');
|
|
23
22
|
|
|
24
|
-
$effect(() => {
|
|
25
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
26
|
-
menubar.collapsed;
|
|
27
|
-
resetIsActive();
|
|
28
|
-
});
|
|
29
|
-
|
|
30
23
|
const navGroupClasses = $derived(
|
|
31
24
|
cn(
|
|
32
|
-
`
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
`items-center gap-x-3 p-1.5 rounded-md w-full cursor-pointer text-default-400 text-sm/6 text-left font-medium`,
|
|
26
|
+
{
|
|
27
|
+
'font-semibold ': isActive,
|
|
28
|
+
hidden: menubar.collapsed,
|
|
29
|
+
'hidden xl:flex': !menubar.collapsed
|
|
30
|
+
},
|
|
35
31
|
className
|
|
36
32
|
)
|
|
37
33
|
);
|
|
38
34
|
|
|
39
35
|
const chevronIconClasses = $derived(
|
|
40
|
-
cn('size-4 text-
|
|
36
|
+
cn('size-4 text-default-600 shrink-0', {
|
|
41
37
|
'rotate-90': isActive,
|
|
42
38
|
'-ml-2 xl:ml-auto': !menubar.collapsed,
|
|
43
39
|
'-ml-2': menubar.collapsed
|
|
@@ -51,51 +47,45 @@
|
|
|
51
47
|
})
|
|
52
48
|
);
|
|
53
49
|
|
|
54
|
-
const
|
|
55
|
-
cn('
|
|
56
|
-
'
|
|
57
|
-
'xl:static xl:shadow-none xl:bg-transparent mt-0 xl:mt-1 xl:w-auto xl:h-auto':
|
|
58
|
-
!menubar.collapsed
|
|
59
|
-
})
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
const toggleButtonClasses = $derived(
|
|
63
|
-
cn('bg-slate-900 w-72 pl-3 h-8 flex p-2', {
|
|
64
|
-
'xl:hidden': isActive && !menubar.collapsed
|
|
50
|
+
const iconClasses = $derived(
|
|
51
|
+
cn('size-6 shrink-0 text-default-600', {
|
|
52
|
+
'flex xl:hidden': !menubar.collapsed
|
|
65
53
|
})
|
|
66
54
|
);
|
|
67
55
|
|
|
68
|
-
const
|
|
69
|
-
cn('
|
|
70
|
-
'bg-
|
|
71
|
-
'xl:
|
|
56
|
+
const topDivClasses = $derived(
|
|
57
|
+
cn('overflow-hidden transition-all duration-200', {
|
|
58
|
+
'bg-transparent mt-0 mt-1 w-auto': !menubar.collapsed,
|
|
59
|
+
'xl:hidden': !isActive,
|
|
60
|
+
'hidden xl:block': menubar.collapsed
|
|
72
61
|
})
|
|
73
62
|
);
|
|
74
63
|
</script>
|
|
75
64
|
|
|
76
|
-
<svelte:window onresize={resetIsActive} />
|
|
77
|
-
|
|
78
65
|
<div>
|
|
79
66
|
<button type="button" class={navGroupClasses} onclick={toggle}>
|
|
80
|
-
{@render labelArea(labelClasses)}
|
|
81
|
-
|
|
67
|
+
{@render labelArea(labelClasses, iconClasses)}
|
|
68
|
+
{@render ChevronIcon(chevronIconClasses, 0.7)}
|
|
82
69
|
</button>
|
|
83
70
|
|
|
84
|
-
{
|
|
85
|
-
<
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
class="flex h-7 w-7 cursor-pointer items-center justify-center gap-x-3
|
|
90
|
-
rounded-md bg-slate-800 text-left text-sm/6 text-gray-700"
|
|
91
|
-
onclick={toggle}
|
|
92
|
-
>
|
|
93
|
-
<FluentChevronRight16Filled class="size-4 shrink-0 -rotate-180 text-gray-600" />
|
|
94
|
-
</button>
|
|
95
|
-
</div>
|
|
96
|
-
<ul class={navUlClasses}>
|
|
97
|
-
{@render children?.()}
|
|
98
|
-
</ul>
|
|
99
|
-
</div>
|
|
100
|
-
{/if}
|
|
71
|
+
<div class={topDivClasses}>
|
|
72
|
+
<ul>
|
|
73
|
+
{@render children?.()}
|
|
74
|
+
</ul>
|
|
75
|
+
</div>
|
|
101
76
|
</div>
|
|
77
|
+
|
|
78
|
+
{#snippet ChevronIcon(className: string, size: number)}
|
|
79
|
+
<svg
|
|
80
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
81
|
+
width="{size}em"
|
|
82
|
+
height="{size}em"
|
|
83
|
+
viewBox="0 0 16 16"
|
|
84
|
+
class={className}
|
|
85
|
+
>
|
|
86
|
+
<path
|
|
87
|
+
fill="currentColor"
|
|
88
|
+
d="M5.74 3.2a.75.75 0 0 0-.04 1.06L9.227 8L5.7 11.74a.75.75 0 1 0 1.1 1.02l4-4.25a.75.75 0 0 0 0-1.02l-4-4.25a.75.75 0 0 0-1.06-.04"
|
|
89
|
+
/>
|
|
90
|
+
</svg>
|
|
91
|
+
{/snippet}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import clsx from 'clsx';
|
|
3
3
|
import { getContext } from 'svelte';
|
|
4
|
-
import type { MenuBar, NavItemProps } from '
|
|
4
|
+
import type { MenuBar, NavItemProps } from '../../index.js';
|
|
5
5
|
import { cn } from '../../helper/cls.js';
|
|
6
6
|
|
|
7
7
|
let { href, children, active, class: className = '' }: NavItemProps = $props();
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
const navItemClasses = $derived(
|
|
12
12
|
cn([
|
|
13
|
-
'group flex gap-x-3 p-2 rounded-md text-
|
|
14
|
-
{ 'bg-
|
|
13
|
+
'group flex gap-x-3 p-2 rounded-md text-default-400 text-sm/6',
|
|
14
|
+
{ 'bg-default-950 font-semibold': active, 'hover:bg-default-950': !active },
|
|
15
15
|
className
|
|
16
16
|
])
|
|
17
17
|
);
|
|
@@ -1,16 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import NavGroup from './NavGroup.svelte';
|
|
3
|
-
import NavItem from './NavItem.svelte';
|
|
4
2
|
import { setContext } from 'svelte';
|
|
5
|
-
import type {
|
|
6
|
-
MenuBar,
|
|
7
|
-
NavigationItem,
|
|
8
|
-
SidebarProps,
|
|
9
|
-
ParentItem,
|
|
10
|
-
LinkItem
|
|
11
|
-
} from './sidebar.js';
|
|
3
|
+
import type { MenuBar, NavigationItem, SidebarProps, ParentItem, LinkItem } from '../../index.js';
|
|
12
4
|
import clsx from 'clsx';
|
|
13
|
-
import { cn } from '../../helper/cls.js';
|
|
14
5
|
import { isRouteActive } from '../../helper/nav.svelte.js';
|
|
15
6
|
|
|
16
7
|
let { items = [], logo }: SidebarProps = $props();
|
|
@@ -33,16 +24,15 @@
|
|
|
33
24
|
|
|
34
25
|
if ('children' in item) {
|
|
35
26
|
const parentItem = item as ParentItem;
|
|
36
|
-
let anyChildActive =
|
|
27
|
+
let anyChildActive = parentItem.active;
|
|
37
28
|
|
|
38
29
|
const updatedChildren = parentItem.children.map((child) => {
|
|
39
|
-
const childActive = isRouteActive(child.href);
|
|
30
|
+
const childActive = isRouteActive(child.href, true);
|
|
40
31
|
if (childActive) {
|
|
41
32
|
anyChildActive = true;
|
|
42
33
|
}
|
|
43
34
|
return { ...child, active: childActive };
|
|
44
35
|
});
|
|
45
|
-
|
|
46
36
|
return { ...parentItem, active: anyChildActive, children: updatedChildren };
|
|
47
37
|
}
|
|
48
38
|
|
|
@@ -56,90 +46,129 @@
|
|
|
56
46
|
|
|
57
47
|
// Reactively compute the active states based on the current route
|
|
58
48
|
const navigationItems = $derived(items.map((item) => processNavigationItem(item)));
|
|
49
|
+
$inspect(navigationItems)
|
|
59
50
|
|
|
60
51
|
const sidebarClasses = $derived(
|
|
61
|
-
clsx(
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
'w-16': menubar.collapsed,
|
|
66
|
-
'w-16 xl:w-72 shrink-0': !menubar.collapsed
|
|
67
|
-
}
|
|
68
|
-
)
|
|
52
|
+
clsx(`min-h-screen flex flex-col bg-gradient-to-b from-gray-900 to-default-900 h-full`, {
|
|
53
|
+
'w-16': menubar.collapsed,
|
|
54
|
+
'w-16 xl:w-64 shrink-0': !menubar.collapsed
|
|
55
|
+
})
|
|
69
56
|
);
|
|
70
57
|
|
|
71
58
|
const logoTextClasses = $derived(
|
|
72
|
-
clsx('text-xl font-
|
|
59
|
+
clsx('text-xl font-bold text-white', {
|
|
60
|
+
'xl:block': !menubar.collapsed,
|
|
61
|
+
hidden: menubar.collapsed
|
|
62
|
+
})
|
|
73
63
|
);
|
|
74
64
|
|
|
75
65
|
const logoWrapperClasses = $derived(
|
|
76
|
-
clsx(
|
|
77
|
-
'
|
|
78
|
-
|
|
66
|
+
clsx(
|
|
67
|
+
'flex items-center h-16 flex-shrink-0 px-4 bg-gradient-to-r from-gray-900 to-default-900/50 border-b border-white/10',
|
|
68
|
+
{
|
|
69
|
+
'justify-between': !menubar.collapsed,
|
|
70
|
+
'justify-center': menubar.collapsed
|
|
71
|
+
}
|
|
72
|
+
)
|
|
79
73
|
);
|
|
80
74
|
</script>
|
|
81
75
|
|
|
82
76
|
<div class={sidebarClasses}>
|
|
83
77
|
<div class={logoWrapperClasses}>
|
|
84
78
|
<div class="flex items-center gap-x-1">
|
|
85
|
-
{#if logo.src}
|
|
79
|
+
{#if logo.src && !menubar.collapsed}
|
|
86
80
|
<img src={logo.src} alt={logo.title} class="size-8 shrink-0" />
|
|
87
81
|
{/if}
|
|
88
|
-
{#if logo.title}
|
|
82
|
+
{#if logo.title && !menubar.collapsed}
|
|
89
83
|
<h1 class={logoTextClasses}>{logo.title}</h1>
|
|
90
84
|
{/if}
|
|
91
85
|
</div>
|
|
92
|
-
<button
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
class="size-6 shrink-0 text-gray-600"
|
|
99
|
-
>
|
|
100
|
-
<path
|
|
101
|
-
fill="currentColor"
|
|
102
|
-
d="M3 17h18a1 1 0 0 1 .117 1.993L21 19H3a1 1 0 0 1-.117-1.993zh18zm0-6l18-.002a1 1 0 0 1 .117 1.993l-.117.007L3 13a1 1 0 0 1-.117-1.993zl18-.002zm0-6h18a1 1 0 0 1 .117 1.993L21 7H3a1 1 0 0 1-.117-1.993zh18z"
|
|
103
|
-
/>
|
|
104
|
-
</svg>
|
|
86
|
+
<button
|
|
87
|
+
onclick={toggle}
|
|
88
|
+
class="hidden cursor-pointer text-white xl:block"
|
|
89
|
+
aria-label="Toggle Sidebar"
|
|
90
|
+
>
|
|
91
|
+
{@render ToggleIcon()}
|
|
105
92
|
</button>
|
|
106
93
|
</div>
|
|
107
|
-
|
|
108
|
-
|
|
94
|
+
|
|
95
|
+
<div class="flex flex-1 flex-col overflow-y-auto bg-gradient-to-b from-transparent to-black/20">
|
|
96
|
+
<nav class="flex-1 space-y-6 px-2 py-4">
|
|
109
97
|
{#each navigationItems as item, index (index)}
|
|
110
98
|
{#if 'type' in item && item.type === 'horizontal-divider'}
|
|
111
|
-
<li class="my-
|
|
99
|
+
<li class="my-2 border-t border-white/10"></li>
|
|
112
100
|
{:else if 'children' in item}
|
|
113
|
-
<
|
|
114
|
-
{#
|
|
115
|
-
|
|
116
|
-
{
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
101
|
+
<div>
|
|
102
|
+
{#if !menubar.collapsed}
|
|
103
|
+
<h3 class="text-default-200 px-3 text-xs font-semibold tracking-wider uppercase">
|
|
104
|
+
{item.label}
|
|
105
|
+
</h3>
|
|
106
|
+
{/if}
|
|
107
|
+
<div class={menubar.collapsed ? '' : 'mt-2 space-y-1'}>
|
|
108
|
+
{#each item.children as child (child.label)}
|
|
109
|
+
<button
|
|
110
|
+
class="group hover:bg-default-500/10 flex w-full cursor-pointer items-center rounded-md px-3 py-2 text-sm font-medium transition-all duration-150 ease-in-out hover:text-white {child.active
|
|
111
|
+
? 'bg-default-500/20'
|
|
112
|
+
: ''} {menubar.collapsed ? 'justify-center' : ''}"
|
|
113
|
+
class:text-white={child.active}
|
|
114
|
+
class:text-gray-300={!child.active}
|
|
115
|
+
onclick={() => (window.location.href = child.href)}
|
|
116
|
+
title={menubar.collapsed ? child.label : ''}
|
|
117
|
+
>
|
|
118
|
+
{#if child.Icon}
|
|
119
|
+
{@const Icon = child.Icon}
|
|
120
|
+
<Icon
|
|
121
|
+
class="h-5 w-5 flex-shrink-0 {child.active
|
|
122
|
+
? 'text-default-200'
|
|
123
|
+
: 'text-gray-400'} {menubar.collapsed ? '' : 'mr-3'}"
|
|
124
|
+
/>
|
|
125
|
+
{/if}
|
|
126
|
+
{#if !menubar.collapsed}
|
|
127
|
+
<span class="truncate">{child.label}</span>
|
|
128
|
+
{/if}
|
|
129
|
+
</button>
|
|
130
|
+
{/each}
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
131
133
|
{:else if 'href' in item}
|
|
132
|
-
<
|
|
133
|
-
{
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
{
|
|
140
|
-
|
|
134
|
+
<button
|
|
135
|
+
class="group hover:bg-default-500/10 flex w-full cursor-pointer items-center rounded-md px-3 py-2 text-sm font-medium transition-all duration-150 ease-in-out hover:text-white {item.active
|
|
136
|
+
? 'bg-default-500/20'
|
|
137
|
+
: ''} {menubar.collapsed ? 'justify-center' : ''}"
|
|
138
|
+
class:text-white={item.active}
|
|
139
|
+
class:text-gray-300={!item.active}
|
|
140
|
+
onclick={() => (window.location.href = item.href)}
|
|
141
|
+
title={menubar.collapsed ? item.label : ''}
|
|
142
|
+
>
|
|
143
|
+
{#if item.Icon}
|
|
144
|
+
{@const Icon = item.Icon}
|
|
145
|
+
<Icon
|
|
146
|
+
class="h-5 w-5 flex-shrink-0 {item.active
|
|
147
|
+
? 'text-default-200'
|
|
148
|
+
: 'text-gray-400'} {menubar.collapsed ? '' : 'mr-3'}"
|
|
149
|
+
/>
|
|
150
|
+
{/if}
|
|
151
|
+
{#if !menubar.collapsed}
|
|
152
|
+
<span class="truncate">{item.label}</span>
|
|
153
|
+
{/if}
|
|
154
|
+
</button>
|
|
141
155
|
{/if}
|
|
142
156
|
{/each}
|
|
143
|
-
</
|
|
144
|
-
</
|
|
157
|
+
</nav>
|
|
158
|
+
</div>
|
|
145
159
|
</div>
|
|
160
|
+
|
|
161
|
+
{#snippet ToggleIcon(classes = 'size-6 shrink-0 text-default-200')}
|
|
162
|
+
<svg
|
|
163
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
164
|
+
width="0.8em"
|
|
165
|
+
height="0.8em"
|
|
166
|
+
viewBox="0 0 24 24"
|
|
167
|
+
class={classes}
|
|
168
|
+
>
|
|
169
|
+
<path
|
|
170
|
+
fill="currentColor"
|
|
171
|
+
d="M3 17h18a1 1 0 0 1 .117 1.993L21 19H3a1 1 0 0 1-.117-1.993zh18zm0-6l18-.002a1 1 0 0 1 .117 1.993l-.117.007L3 13a1 1 0 0 1-.117-1.993zl18-.002zm0-6h18a1 1 0 0 1 .117 1.993L21 7H3a1 1 0 0 1-.117-1.993zh18z"
|
|
172
|
+
/>
|
|
173
|
+
</svg>
|
|
174
|
+
{/snippet}
|