ui-svelte 0.1.0
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/LICENSE +21 -0
- package/README.md +118 -0
- package/dist/charts/ArcChart.svelte +320 -0
- package/dist/charts/ArcChart.svelte.d.ts +26 -0
- package/dist/charts/AreaChart.svelte +495 -0
- package/dist/charts/AreaChart.svelte.d.ts +32 -0
- package/dist/charts/BarChart.svelte +504 -0
- package/dist/charts/BarChart.svelte.d.ts +38 -0
- package/dist/charts/Candlestick.svelte +527 -0
- package/dist/charts/Candlestick.svelte.d.ts +38 -0
- package/dist/charts/LineChart.svelte +365 -0
- package/dist/charts/LineChart.svelte.d.ts +36 -0
- package/dist/charts/PieChart.svelte +311 -0
- package/dist/charts/PieChart.svelte.d.ts +28 -0
- package/dist/charts/css/arc-chart.css +237 -0
- package/dist/charts/css/area-chart.css +289 -0
- package/dist/charts/css/bar-chart.css +167 -0
- package/dist/charts/css/candlestick.css +197 -0
- package/dist/charts/css/line-chart.css +202 -0
- package/dist/charts/css/pie-chart.css +199 -0
- package/dist/control/Audio.svelte +212 -0
- package/dist/control/Audio.svelte.d.ts +8 -0
- package/dist/control/Button.svelte +116 -0
- package/dist/control/Button.svelte.d.ts +22 -0
- package/dist/control/IconButton.svelte +104 -0
- package/dist/control/IconButton.svelte.d.ts +17 -0
- package/dist/control/Record.svelte +430 -0
- package/dist/control/Record.svelte.d.ts +11 -0
- package/dist/control/ToggleTheme.svelte +21 -0
- package/dist/control/ToggleTheme.svelte.d.ts +8 -0
- package/dist/control/Video.svelte +222 -0
- package/dist/control/Video.svelte.d.ts +10 -0
- package/dist/control/css/btn.css +206 -0
- package/dist/control/css/media.css +78 -0
- package/dist/control/css/video.css +58 -0
- package/dist/css/animations.css +27 -0
- package/dist/css/base.css +192 -0
- package/dist/css/utilities.css +136 -0
- package/dist/display/Accordion.svelte +98 -0
- package/dist/display/Accordion.svelte.d.ts +20 -0
- package/dist/display/Alert.svelte +65 -0
- package/dist/display/Alert.svelte.d.ts +15 -0
- package/dist/display/Avatar.svelte +80 -0
- package/dist/display/Avatar.svelte.d.ts +13 -0
- package/dist/display/Badge.svelte +46 -0
- package/dist/display/Badge.svelte.d.ts +11 -0
- package/dist/display/Card.svelte +94 -0
- package/dist/display/Card.svelte.d.ts +21 -0
- package/dist/display/Carousel.svelte +359 -0
- package/dist/display/Carousel.svelte.d.ts +25 -0
- package/dist/display/ChatBox.svelte +249 -0
- package/dist/display/ChatBox.svelte.d.ts +18 -0
- package/dist/display/Chip.svelte +67 -0
- package/dist/display/Chip.svelte.d.ts +17 -0
- package/dist/display/Code.svelte +56 -0
- package/dist/display/Code.svelte.d.ts +9 -0
- package/dist/display/Collapsible.svelte +71 -0
- package/dist/display/Collapsible.svelte.d.ts +15 -0
- package/dist/display/Divider.svelte +32 -0
- package/dist/display/Divider.svelte.d.ts +10 -0
- package/dist/display/Empty.svelte +462 -0
- package/dist/display/Empty.svelte.d.ts +11 -0
- package/dist/display/Icon.svelte +20 -0
- package/dist/display/Icon.svelte.d.ts +11 -0
- package/dist/display/Item.svelte +119 -0
- package/dist/display/Item.svelte.d.ts +24 -0
- package/dist/display/Loading.svelte +8 -0
- package/dist/display/Loading.svelte.d.ts +26 -0
- package/dist/display/Marquee.svelte +164 -0
- package/dist/display/Marquee.svelte.d.ts +21 -0
- package/dist/display/Section.svelte +63 -0
- package/dist/display/Section.svelte.d.ts +16 -0
- package/dist/display/Table.svelte +407 -0
- package/dist/display/Table.svelte.d.ts +32 -0
- package/dist/display/TypeWriter.svelte +23 -0
- package/dist/display/TypeWriter.svelte.d.ts +11 -0
- package/dist/display/User.svelte +0 -0
- package/dist/display/User.svelte.d.ts +26 -0
- package/dist/display/css/accordion.css +98 -0
- package/dist/display/css/alert.css +51 -0
- package/dist/display/css/avatar.css +158 -0
- package/dist/display/css/badge.css +47 -0
- package/dist/display/css/card.css +231 -0
- package/dist/display/css/carousel.css +156 -0
- package/dist/display/css/chat-box.css +188 -0
- package/dist/display/css/chip.css +91 -0
- package/dist/display/css/code.css +19 -0
- package/dist/display/css/collapsible.css +86 -0
- package/dist/display/css/divider.css +54 -0
- package/dist/display/css/empty.css +8 -0
- package/dist/display/css/item.css +149 -0
- package/dist/display/css/listbox.css +24 -0
- package/dist/display/css/marquee.css +138 -0
- package/dist/display/css/section.css +85 -0
- package/dist/display/css/table.css +361 -0
- package/dist/form/Checkbox.svelte +45 -0
- package/dist/form/Checkbox.svelte.d.ts +13 -0
- package/dist/form/ComboBox.svelte +448 -0
- package/dist/form/ComboBox.svelte.d.ts +29 -0
- package/dist/form/CsvField.svelte +389 -0
- package/dist/form/CsvField.svelte.d.ts +21 -0
- package/dist/form/DateField.svelte +292 -0
- package/dist/form/DateField.svelte.d.ts +18 -0
- package/dist/form/Dropzone.svelte +196 -0
- package/dist/form/Dropzone.svelte.d.ts +30 -0
- package/dist/form/ImageCropper.svelte +254 -0
- package/dist/form/ImageCropper.svelte.d.ts +14 -0
- package/dist/form/PasswordField.svelte +170 -0
- package/dist/form/PasswordField.svelte.d.ts +28 -0
- package/dist/form/PhoneField.svelte +485 -0
- package/dist/form/PhoneField.svelte.d.ts +25 -0
- package/dist/form/PinField.svelte +139 -0
- package/dist/form/PinField.svelte.d.ts +17 -0
- package/dist/form/RadioGroup.svelte +70 -0
- package/dist/form/RadioGroup.svelte.d.ts +19 -0
- package/dist/form/Select.svelte +350 -0
- package/dist/form/Select.svelte.d.ts +26 -0
- package/dist/form/Slider.svelte +60 -0
- package/dist/form/Slider.svelte.d.ts +15 -0
- package/dist/form/TextField.svelte +154 -0
- package/dist/form/TextField.svelte.d.ts +31 -0
- package/dist/form/Textarea.svelte +137 -0
- package/dist/form/Textarea.svelte.d.ts +27 -0
- package/dist/form/Toggle.svelte +45 -0
- package/dist/form/Toggle.svelte.d.ts +13 -0
- package/dist/form/css/checkbox.css +46 -0
- package/dist/form/css/combo-box.css +69 -0
- package/dist/form/css/control.css +177 -0
- package/dist/form/css/csv-field.css +0 -0
- package/dist/form/css/date.css +56 -0
- package/dist/form/css/dropzone.css +133 -0
- package/dist/form/css/field.css +17 -0
- package/dist/form/css/image-cropper.css +155 -0
- package/dist/form/css/password.css +35 -0
- package/dist/form/css/radio-group.css +57 -0
- package/dist/form/css/select.css +18 -0
- package/dist/form/css/slider.css +80 -0
- package/dist/form/css/textarea.css +130 -0
- package/dist/form/css/toggle.css +27 -0
- package/dist/form/js/countries.d.ts +13 -0
- package/dist/form/js/countries.js +307 -0
- package/dist/form/js/phone-examples.d.ts +248 -0
- package/dist/form/js/phone-examples.js +247 -0
- package/dist/hooks/use-auth.svelte.d.ts +11 -0
- package/dist/hooks/use-auth.svelte.js +59 -0
- package/dist/hooks/use-chat.svelte.d.ts +40 -0
- package/dist/hooks/use-chat.svelte.js +265 -0
- package/dist/hooks/use-clipboard.svelte.d.ts +9 -0
- package/dist/hooks/use-clipboard.svelte.js +52 -0
- package/dist/hooks/use-fetch.svelte.d.ts +11 -0
- package/dist/hooks/use-fetch.svelte.js +38 -0
- package/dist/hooks/use-form.svelte.d.ts +31 -0
- package/dist/hooks/use-form.svelte.js +110 -0
- package/dist/hooks/use-localstorage.svelte.d.ts +3 -0
- package/dist/hooks/use-localstorage.svelte.js +26 -0
- package/dist/hooks/use-scroll.svelte.d.ts +6 -0
- package/dist/hooks/use-scroll.svelte.js +34 -0
- package/dist/hooks/use-search.svelte.d.ts +49 -0
- package/dist/hooks/use-search.svelte.js +229 -0
- package/dist/hooks/use-table.svelte.d.ts +85 -0
- package/dist/hooks/use-table.svelte.js +362 -0
- package/dist/hooks/use-websocket.svelte.d.ts +18 -0
- package/dist/hooks/use-websocket.svelte.js +79 -0
- package/dist/icons/index.d.ts +132 -0
- package/dist/icons/index.js +132 -0
- package/dist/index.css +115 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.js +76 -0
- package/dist/layout/AppBar.svelte +94 -0
- package/dist/layout/AppBar.svelte.d.ts +17 -0
- package/dist/layout/Footer.svelte +94 -0
- package/dist/layout/Footer.svelte.d.ts +17 -0
- package/dist/layout/FooterLinks.svelte +28 -0
- package/dist/layout/FooterLinks.svelte.d.ts +11 -0
- package/dist/layout/Provider.svelte +52 -0
- package/dist/layout/Provider.svelte.d.ts +10 -0
- package/dist/layout/Scaffold.svelte +46 -0
- package/dist/layout/Scaffold.svelte.d.ts +15 -0
- package/dist/layout/Sidebar.svelte +40 -0
- package/dist/layout/Sidebar.svelte.d.ts +13 -0
- package/dist/layout/css/app-bar.css +35 -0
- package/dist/layout/css/bottom-bar.css +12 -0
- package/dist/layout/css/footer-links.css +17 -0
- package/dist/layout/css/footer.css +35 -0
- package/dist/layout/css/scaffold.css +15 -0
- package/dist/layout/css/sidebar.css +17 -0
- package/dist/navigation/BottomNav.svelte +0 -0
- package/dist/navigation/BottomNav.svelte.d.ts +26 -0
- package/dist/navigation/NavMenu.svelte +254 -0
- package/dist/navigation/SideNav.svelte +249 -0
- package/dist/navigation/Tabs.svelte +79 -0
- package/dist/navigation/Tabs.svelte.d.ts +19 -0
- package/dist/navigation/css/bottom-nav.css +0 -0
- package/dist/navigation/css/nav-menu.css +168 -0
- package/dist/navigation/css/side-nav.css +244 -0
- package/dist/navigation/css/tabs.css +118 -0
- package/dist/overlay/AlertDialog.svelte +0 -0
- package/dist/overlay/AlertDialog.svelte.d.ts +26 -0
- package/dist/overlay/Command.svelte +0 -0
- package/dist/overlay/Command.svelte.d.ts +26 -0
- package/dist/overlay/Drawer.svelte +129 -0
- package/dist/overlay/Drawer.svelte.d.ts +20 -0
- package/dist/overlay/Dropdown.svelte +140 -0
- package/dist/overlay/Modal.svelte +102 -0
- package/dist/overlay/Modal.svelte.d.ts +19 -0
- package/dist/overlay/PopoverStack.svelte +0 -0
- package/dist/overlay/PopoverStack.svelte.d.ts +26 -0
- package/dist/overlay/Toast.svelte +83 -0
- package/dist/overlay/Toast.svelte.d.ts +9 -0
- package/dist/overlay/Tooltip.svelte +140 -0
- package/dist/overlay/Tooltip.svelte.d.ts +12 -0
- package/dist/overlay/css/drawer.css +75 -0
- package/dist/overlay/css/dropdown.css +24 -0
- package/dist/overlay/css/hovercard.css +11 -0
- package/dist/overlay/css/modal.css +51 -0
- package/dist/overlay/css/toast.css +80 -0
- package/dist/overlay/css/tooltip.css +89 -0
- package/dist/stores/i18n.svelte.d.ts +16 -0
- package/dist/stores/i18n.svelte.js +137 -0
- package/dist/stores/theme.svelte.d.ts +5 -0
- package/dist/stores/theme.svelte.js +55 -0
- package/dist/stores/toast.svelte.d.ts +19 -0
- package/dist/stores/toast.svelte.js +38 -0
- package/dist/types.d.ts +75 -0
- package/dist/types.js +1 -0
- package/dist/utils/charts.d.ts +27 -0
- package/dist/utils/charts.js +140 -0
- package/dist/utils/class-names.d.ts +1 -0
- package/dist/utils/class-names.js +3 -0
- package/dist/utils/click-outside.d.ts +3 -0
- package/dist/utils/click-outside.js +9 -0
- package/dist/utils/popover.d.ts +3 -0
- package/dist/utils/popover.js +17 -0
- package/dist/utils/ulid.d.ts +1 -0
- package/dist/utils/ulid.js +22 -0
- package/dist/utils/validate-schema.d.ts +2 -0
- package/dist/utils/validate-schema.js +97 -0
- package/package.json +69 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.sidenav {
|
|
3
|
+
@apply flex w-full min-w-0 flex-col gap-0.5 text-on-muted;
|
|
4
|
+
|
|
5
|
+
.sidenav-divider {
|
|
6
|
+
@apply my-2 h-px w-full bg-muted;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.sidenav-header {
|
|
10
|
+
@apply flex items-center gap-2 px-3 py-3 text-sm font-bold text-on-surface;
|
|
11
|
+
@apply mt-4 mb-1 first:mt-0;
|
|
12
|
+
@apply justify-start;
|
|
13
|
+
|
|
14
|
+
.icon {
|
|
15
|
+
@apply h-5 w-5 shrink-0 text-on-surface;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.sidenav-header-content {
|
|
19
|
+
@apply flex flex-1 flex-col overflow-hidden;
|
|
20
|
+
|
|
21
|
+
.sidenav-header-label {
|
|
22
|
+
@apply truncate font-bold uppercase text-xs tracking-wider text-left;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.sidenav-header-description {
|
|
26
|
+
@apply truncate text-xs font-normal text-on-muted/70 text-left;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
&.sidenav-header-link {
|
|
31
|
+
@apply cursor-pointer rounded-ui outline-none;
|
|
32
|
+
@apply transition-all duration-200;
|
|
33
|
+
@apply hover:bg-muted/50;
|
|
34
|
+
|
|
35
|
+
&.is-active {
|
|
36
|
+
@apply bg-muted;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.sidenav-arrow-wrapper {
|
|
41
|
+
@apply flex shrink-0 items-center justify-center ml-auto;
|
|
42
|
+
|
|
43
|
+
.sidenav-arrow {
|
|
44
|
+
@apply h-4 w-4 transition-transform duration-200;
|
|
45
|
+
|
|
46
|
+
&.is-open {
|
|
47
|
+
@apply rotate-90;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.sidenav-item {
|
|
54
|
+
@apply relative flex w-fit items-center gap-2 rounded-ui pl-4 pr-3 py-2;
|
|
55
|
+
@apply cursor-pointer select-none outline-none;
|
|
56
|
+
@apply hover:bg-muted;
|
|
57
|
+
|
|
58
|
+
&.is-wide {
|
|
59
|
+
@apply w-full;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.sidenav-icon-wrapper {
|
|
63
|
+
@apply flex shrink-0 items-center justify-center;
|
|
64
|
+
|
|
65
|
+
.sidenav-icon {
|
|
66
|
+
@apply h-5 w-5;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.sidenav-content {
|
|
71
|
+
@apply flex flex-1 flex-col overflow-hidden;
|
|
72
|
+
|
|
73
|
+
.sidenav-label {
|
|
74
|
+
@apply truncate font-medium text-sm;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.sidenav-description {
|
|
78
|
+
@apply truncate text-xs text-on-muted/70;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.sidenav-status-wrapper {
|
|
83
|
+
@apply flex shrink-0 items-center;
|
|
84
|
+
|
|
85
|
+
.sidenav-status {
|
|
86
|
+
@apply rounded-full bg-muted px-2 py-0.5 text-xs font-medium;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.sidenav-arrow-wrapper {
|
|
91
|
+
@apply flex shrink-0 items-center justify-center;
|
|
92
|
+
|
|
93
|
+
.sidenav-arrow {
|
|
94
|
+
@apply h-4 w-4 transition-transform duration-200;
|
|
95
|
+
|
|
96
|
+
&.is-open {
|
|
97
|
+
@apply rotate-90;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
&.is-sm {
|
|
104
|
+
.sidenav-item {
|
|
105
|
+
@apply gap-1.5 pl-3 pr-2 py-1.5 text-xs;
|
|
106
|
+
|
|
107
|
+
.sidenav-icon-wrapper .sidenav-icon {
|
|
108
|
+
@apply h-4 w-4;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.sidenav-header {
|
|
113
|
+
@apply gap-1.5 px-2 py-1.5 text-xs;
|
|
114
|
+
|
|
115
|
+
.sidenav-header-icon {
|
|
116
|
+
@apply h-4 w-4;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
&.is-md {
|
|
122
|
+
.sidenav-item {
|
|
123
|
+
@apply gap-2 pl-4 pr-3 py-2 text-sm;
|
|
124
|
+
|
|
125
|
+
.sidenav-icon-wrapper .sidenav-icon {
|
|
126
|
+
@apply h-5 w-5;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.sidenav-header {
|
|
131
|
+
@apply gap-2 px-3 py-2 text-sm;
|
|
132
|
+
|
|
133
|
+
.sidenav-header-icon {
|
|
134
|
+
@apply h-5 w-5;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
&.is-lg {
|
|
140
|
+
.sidenav-item {
|
|
141
|
+
@apply gap-3 pl-5 pr-4 py-3 text-base;
|
|
142
|
+
|
|
143
|
+
.sidenav-icon-wrapper .sidenav-icon {
|
|
144
|
+
@apply h-6 w-6;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.sidenav-header {
|
|
149
|
+
@apply gap-3 px-4 py-3 text-base;
|
|
150
|
+
|
|
151
|
+
.sidenav-header-icon {
|
|
152
|
+
@apply h-6 w-6;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
&.is-compact {
|
|
158
|
+
.sidenav-item {
|
|
159
|
+
@apply py-1.5;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.sidenav-header {
|
|
163
|
+
@apply py-1;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
&.is-collapsible {
|
|
168
|
+
@apply w-16;
|
|
169
|
+
|
|
170
|
+
&.is-collapsed {
|
|
171
|
+
.sidenav-item {
|
|
172
|
+
@apply justify-center;
|
|
173
|
+
|
|
174
|
+
.sidenav-content,
|
|
175
|
+
.sidenav-status-wrapper,
|
|
176
|
+
.sidenav-arrow-wrapper {
|
|
177
|
+
@apply hidden;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.sidenav-header-content {
|
|
182
|
+
@apply hidden;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.sidenav-submenu-content {
|
|
186
|
+
@apply hidden;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
&:hover {
|
|
191
|
+
@apply w-full;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
&.sidenav-primary {
|
|
196
|
+
.sidenav-item.is-active {
|
|
197
|
+
@apply bg-on-primary text-primary;
|
|
198
|
+
|
|
199
|
+
.sidenav-icon {
|
|
200
|
+
@apply text-primary;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
&.sidenav-secondary {
|
|
206
|
+
.sidenav-item.is-active {
|
|
207
|
+
@apply bg-on-secondary text-secondary;
|
|
208
|
+
|
|
209
|
+
.sidenav-icon {
|
|
210
|
+
@apply text-secondary;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
&.sidenav-muted {
|
|
216
|
+
.sidenav-item.is-active {
|
|
217
|
+
@apply bg-muted text-on-muted;
|
|
218
|
+
|
|
219
|
+
.sidenav-icon {
|
|
220
|
+
@apply text-on-muted;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.sidenav-submenu-wrapper {
|
|
226
|
+
@apply flex flex-col gap-0.5;
|
|
227
|
+
|
|
228
|
+
.sidenav-submenu-trigger {
|
|
229
|
+
@apply w-full cursor-pointer rounded-ui outline-none;
|
|
230
|
+
@apply transition-all duration-200;
|
|
231
|
+
@apply hover:bg-muted/50;
|
|
232
|
+
@apply justify-start;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.sidenav-submenu-content {
|
|
236
|
+
@apply ml-6 flex flex-col gap-0.5 border-l border-muted pl-2;
|
|
237
|
+
|
|
238
|
+
.sidenav-subitem {
|
|
239
|
+
@apply text-sm pl-2;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.tabs {
|
|
3
|
+
@apply flex relative;
|
|
4
|
+
&.is-top {
|
|
5
|
+
@apply flex-col;
|
|
6
|
+
}
|
|
7
|
+
&.is-bottom {
|
|
8
|
+
@apply flex-col-reverse;
|
|
9
|
+
}
|
|
10
|
+
&.is-start {
|
|
11
|
+
@apply flex-row h-fit gap-1;
|
|
12
|
+
.tabs-list {
|
|
13
|
+
@apply flex-col;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
&.is-end {
|
|
17
|
+
@apply flex-row-reverse h-fit gap-1;
|
|
18
|
+
.tabs-list {
|
|
19
|
+
@apply flex-col;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
.tabs-list {
|
|
23
|
+
@apply flex w-auto max-w-min overflow-x-auto scrollbar-hide gap-2 p-1 relative select-none;
|
|
24
|
+
&.is-primary {
|
|
25
|
+
@apply bg-primary/10 text-on-surface rounded-xl py-1;
|
|
26
|
+
.tab {
|
|
27
|
+
@apply flex flex-nowrap cursor-pointer px-4 py-1 relative rounded-lg transition-colors;
|
|
28
|
+
&.on-active {
|
|
29
|
+
@apply bg-primary text-on-primary;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
&.is-secondary {
|
|
34
|
+
@apply bg-secondary/10 text-on-surface rounded-xl py-1;
|
|
35
|
+
.tab {
|
|
36
|
+
@apply flex flex-nowrap cursor-pointer px-4 py-1 relative rounded-lg transition-colors;
|
|
37
|
+
&.on-active {
|
|
38
|
+
@apply bg-secondary text-on-secondary;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
&.is-muted {
|
|
43
|
+
@apply bg-muted text-on-muted rounded-xl py-1;
|
|
44
|
+
.tab {
|
|
45
|
+
@apply flex flex-nowrap cursor-pointer px-4 py-1 relative rounded-lg transition-colors;
|
|
46
|
+
&.on-active {
|
|
47
|
+
@apply bg-on-muted text-muted;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
&.is-outline {
|
|
52
|
+
@apply border border-muted rounded-xl;
|
|
53
|
+
.tab {
|
|
54
|
+
@apply flex flex-nowrap cursor-pointer px-4 py-1 relative rounded-lg transition-colors;
|
|
55
|
+
&.on-active {
|
|
56
|
+
@apply bg-primary text-on-primary;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
&.is-line {
|
|
61
|
+
@apply gap-4;
|
|
62
|
+
.tab {
|
|
63
|
+
@apply flex flex-nowrap cursor-pointer px-4 py-1 relative;
|
|
64
|
+
&.on-active {
|
|
65
|
+
@apply text-primary border-b-2 border-primary;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
&.is-ghost {
|
|
70
|
+
.tab {
|
|
71
|
+
@apply flex flex-nowrap cursor-pointer px-4 py-1 relative;
|
|
72
|
+
&.on-active {
|
|
73
|
+
@apply text-primary;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
.tab {
|
|
78
|
+
.tabs-icon {
|
|
79
|
+
@apply mr-2 shrink-0 h-6 w-auto;
|
|
80
|
+
}
|
|
81
|
+
.tabs-label {
|
|
82
|
+
@apply whitespace-nowrap;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
&.is-top,
|
|
87
|
+
&.is-bottom {
|
|
88
|
+
.tabs-list {
|
|
89
|
+
&.is-pill:not(.is-line) {
|
|
90
|
+
@apply rounded-full;
|
|
91
|
+
.tab {
|
|
92
|
+
@apply rounded-full;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
&.is-start {
|
|
98
|
+
.tabs-list.is-line {
|
|
99
|
+
.tab.on-active {
|
|
100
|
+
@apply border-b-0 border-l-2 border-primary;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
&.is-end {
|
|
105
|
+
.tabs-list.is-line {
|
|
106
|
+
.tab.on-active {
|
|
107
|
+
@apply border-b-0 border-r-2 border-primary;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
.tabs-wrapper {
|
|
112
|
+
@apply flex flex-1 overflow-hidden relative;
|
|
113
|
+
.tabs-content {
|
|
114
|
+
@apply relative w-full;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export default AlertDialog;
|
|
2
|
+
type AlertDialog = SvelteComponent<{
|
|
3
|
+
[x: string]: never;
|
|
4
|
+
}, {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
}, {}> & {
|
|
7
|
+
$$bindings?: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
declare const AlertDialog: $$__sveltets_2_IsomorphicComponent<{
|
|
10
|
+
[x: string]: never;
|
|
11
|
+
}, {
|
|
12
|
+
[evt: string]: CustomEvent<any>;
|
|
13
|
+
}, {}, {}, string>;
|
|
14
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
15
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
16
|
+
$$bindings?: Bindings;
|
|
17
|
+
} & Exports;
|
|
18
|
+
(internal: unknown, props: {
|
|
19
|
+
$$events?: Events;
|
|
20
|
+
$$slots?: Slots;
|
|
21
|
+
}): Exports & {
|
|
22
|
+
$set?: any;
|
|
23
|
+
$on?: any;
|
|
24
|
+
};
|
|
25
|
+
z_$$bindings?: Bindings;
|
|
26
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export default Command;
|
|
2
|
+
type Command = SvelteComponent<{
|
|
3
|
+
[x: string]: never;
|
|
4
|
+
}, {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
}, {}> & {
|
|
7
|
+
$$bindings?: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
declare const Command: $$__sveltets_2_IsomorphicComponent<{
|
|
10
|
+
[x: string]: never;
|
|
11
|
+
}, {
|
|
12
|
+
[evt: string]: CustomEvent<any>;
|
|
13
|
+
}, {}, {}, string>;
|
|
14
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
15
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
16
|
+
$$bindings?: Bindings;
|
|
17
|
+
} & Exports;
|
|
18
|
+
(internal: unknown, props: {
|
|
19
|
+
$$events?: Events;
|
|
20
|
+
$$slots?: Slots;
|
|
21
|
+
}): Exports & {
|
|
22
|
+
$set?: any;
|
|
23
|
+
$on?: any;
|
|
24
|
+
};
|
|
25
|
+
z_$$bindings?: Bindings;
|
|
26
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../utils/class-names.js';
|
|
3
|
+
import { popover } from '../utils/popover.js';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
import { fade } from 'svelte/transition';
|
|
6
|
+
import { afterNavigate } from '$app/navigation';
|
|
7
|
+
import { Dismiss24RegularIcon } from '../icons/index.js';
|
|
8
|
+
import { Icon } from '../index.js';
|
|
9
|
+
|
|
10
|
+
type Props = {
|
|
11
|
+
open: boolean;
|
|
12
|
+
onclose?: () => void;
|
|
13
|
+
position?: 'start' | 'end' | 'top' | 'bottom';
|
|
14
|
+
children: Snippet;
|
|
15
|
+
header?: Snippet;
|
|
16
|
+
footer?: Snippet;
|
|
17
|
+
class?: string;
|
|
18
|
+
headerClass?: string;
|
|
19
|
+
footerClass?: string;
|
|
20
|
+
bodyClass?: string;
|
|
21
|
+
variant?: 'ghost' | 'surface' | 'primary' | 'secondary' | 'muted';
|
|
22
|
+
disableOverlayClose?: boolean;
|
|
23
|
+
hideCloseButton?: boolean;
|
|
24
|
+
isSolid?: boolean;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
let {
|
|
28
|
+
open = $bindable(),
|
|
29
|
+
onclose,
|
|
30
|
+
position = 'start',
|
|
31
|
+
header,
|
|
32
|
+
footer,
|
|
33
|
+
children,
|
|
34
|
+
class: className,
|
|
35
|
+
headerClass,
|
|
36
|
+
bodyClass,
|
|
37
|
+
footerClass,
|
|
38
|
+
variant = 'ghost',
|
|
39
|
+
disableOverlayClose,
|
|
40
|
+
hideCloseButton,
|
|
41
|
+
isSolid
|
|
42
|
+
}: Props = $props();
|
|
43
|
+
|
|
44
|
+
const positionClasses = {
|
|
45
|
+
start: 'is-start',
|
|
46
|
+
end: 'is-end',
|
|
47
|
+
top: 'is-top',
|
|
48
|
+
bottom: 'is-bottom'
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const variants = {
|
|
52
|
+
ghost: 'is-ghost',
|
|
53
|
+
surface: 'is-surface',
|
|
54
|
+
primary: 'is-primary',
|
|
55
|
+
secondary: 'is-secondary',
|
|
56
|
+
muted: 'is-muted'
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
let openDrawer = $state(false);
|
|
60
|
+
let openContent = $state(false);
|
|
61
|
+
|
|
62
|
+
const handleOverlayClick = () => {
|
|
63
|
+
if (!disableOverlayClose) {
|
|
64
|
+
open = false;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
$effect(() => {
|
|
69
|
+
afterNavigate(() => {
|
|
70
|
+
if (open) {
|
|
71
|
+
open = false;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
$effect(() => {
|
|
77
|
+
if (open) {
|
|
78
|
+
openDrawer = true;
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
openContent = true;
|
|
81
|
+
}, 100);
|
|
82
|
+
} else {
|
|
83
|
+
onclose?.();
|
|
84
|
+
openContent = false;
|
|
85
|
+
setTimeout(() => {
|
|
86
|
+
openDrawer = false;
|
|
87
|
+
}, 300);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
</script>
|
|
91
|
+
|
|
92
|
+
{#if openDrawer}
|
|
93
|
+
<div transition:fade class="drawer-panel" use:popover>
|
|
94
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
95
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
96
|
+
<div class="drawer-overlay" onclick={handleOverlayClick}></div>
|
|
97
|
+
<div
|
|
98
|
+
class={cn(
|
|
99
|
+
'drawer',
|
|
100
|
+
positionClasses[position],
|
|
101
|
+
variants[variant],
|
|
102
|
+
isSolid && 'is-solid',
|
|
103
|
+
className
|
|
104
|
+
)}
|
|
105
|
+
class:is-active={openContent}
|
|
106
|
+
>
|
|
107
|
+
{#if header}
|
|
108
|
+
<div class={cn('drawer-header', headerClass)}>
|
|
109
|
+
{@render header()}
|
|
110
|
+
</div>
|
|
111
|
+
{/if}
|
|
112
|
+
<div class={cn('drawer-body', bodyClass)}>
|
|
113
|
+
{@render children()}
|
|
114
|
+
</div>
|
|
115
|
+
{#if footer}
|
|
116
|
+
<div class={cn('drawer-footer', footerClass)}>
|
|
117
|
+
{@render footer()}
|
|
118
|
+
</div>
|
|
119
|
+
{/if}
|
|
120
|
+
{#if !hideCloseButton}
|
|
121
|
+
<div class="btn-close">
|
|
122
|
+
<button onclick={() => (open = false)}>
|
|
123
|
+
<Icon icon={Dismiss24RegularIcon} class="btn-close-icon" />
|
|
124
|
+
</button>
|
|
125
|
+
</div>
|
|
126
|
+
{/if}
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
{/if}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
type Props = {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onclose?: () => void;
|
|
5
|
+
position?: 'start' | 'end' | 'top' | 'bottom';
|
|
6
|
+
children: Snippet;
|
|
7
|
+
header?: Snippet;
|
|
8
|
+
footer?: Snippet;
|
|
9
|
+
class?: string;
|
|
10
|
+
headerClass?: string;
|
|
11
|
+
footerClass?: string;
|
|
12
|
+
bodyClass?: string;
|
|
13
|
+
variant?: 'ghost' | 'surface' | 'primary' | 'secondary' | 'muted';
|
|
14
|
+
disableOverlayClose?: boolean;
|
|
15
|
+
hideCloseButton?: boolean;
|
|
16
|
+
isSolid?: boolean;
|
|
17
|
+
};
|
|
18
|
+
declare const Drawer: import("svelte").Component<Props, {}, "open">;
|
|
19
|
+
type Drawer = ReturnType<typeof Drawer>;
|
|
20
|
+
export default Drawer;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Item } from '../index.js';
|
|
3
|
+
import { onMount, type Snippet } from 'svelte';
|
|
4
|
+
|
|
5
|
+
type Option = {
|
|
6
|
+
id?: string | number;
|
|
7
|
+
label: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
src?: string;
|
|
10
|
+
href?: string;
|
|
11
|
+
onclick?: (option: Option) => void;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
type Props = {
|
|
15
|
+
options: Option[];
|
|
16
|
+
variant?: 'primary' | 'secondary' | 'muted';
|
|
17
|
+
children: Snippet;
|
|
18
|
+
header?: Snippet;
|
|
19
|
+
footer?: Snippet;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const { children, header, footer, options, variant = 'primary' }: Props = $props();
|
|
23
|
+
|
|
24
|
+
let isOpen = $state(false);
|
|
25
|
+
let controlElement = $state<HTMLElement>();
|
|
26
|
+
let contentEl = $state<HTMLElement>();
|
|
27
|
+
let optionsEl = $state<HTMLElement>();
|
|
28
|
+
let position = $state({
|
|
29
|
+
top: 0,
|
|
30
|
+
left: 0,
|
|
31
|
+
width: 'auto',
|
|
32
|
+
isBottomHalf: false
|
|
33
|
+
});
|
|
34
|
+
const style = $derived(
|
|
35
|
+
`top: ${position.top}px; left: ${position.left}px; width: ${position.width}px; transform-origin: ${position.isBottomHalf ? 'bottom' : 'top'} center;`
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
const updatePosition = () => {
|
|
39
|
+
if (!controlElement || !contentEl) return;
|
|
40
|
+
|
|
41
|
+
const rect = controlElement.getBoundingClientRect();
|
|
42
|
+
const windowHeight = window.innerHeight;
|
|
43
|
+
const contentHeight = contentEl.getBoundingClientRect().height;
|
|
44
|
+
const contentWidth = contentEl?.getBoundingClientRect().width;
|
|
45
|
+
const centerX = rect.left + rect.width / 2;
|
|
46
|
+
const isBottomHalf = rect.top + rect.height / 2 > windowHeight / 2;
|
|
47
|
+
const isRightHalf = centerX > window.innerWidth / 2;
|
|
48
|
+
|
|
49
|
+
const top = isBottomHalf ? rect.top - contentHeight - 8 : rect.top + rect.height;
|
|
50
|
+
const left = isRightHalf
|
|
51
|
+
? rect.left - contentWidth + rect.width + window.scrollX
|
|
52
|
+
: rect.left + window.scrollX;
|
|
53
|
+
position = {
|
|
54
|
+
top: top,
|
|
55
|
+
left: left,
|
|
56
|
+
width: 'auto',
|
|
57
|
+
isBottomHalf
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const toggleDropdown = () => {
|
|
62
|
+
if (!isOpen) {
|
|
63
|
+
startEventListeners();
|
|
64
|
+
updatePosition();
|
|
65
|
+
isOpen = true;
|
|
66
|
+
} else {
|
|
67
|
+
stopEventListeners();
|
|
68
|
+
isOpen = false;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const handleClickOutside = (event: Event) => {
|
|
73
|
+
if (
|
|
74
|
+
isOpen &&
|
|
75
|
+
!controlElement?.contains(event.target as Node) &&
|
|
76
|
+
!contentEl?.contains(event.target as Node)
|
|
77
|
+
) {
|
|
78
|
+
isOpen = false;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const handleKeyDown = (event: KeyboardEvent) => {
|
|
83
|
+
if (!isOpen) return;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const startEventListeners = () => {
|
|
87
|
+
window.addEventListener('resize', updatePosition);
|
|
88
|
+
window.addEventListener('scroll', updatePosition, true);
|
|
89
|
+
document.addEventListener('click', handleClickOutside);
|
|
90
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const stopEventListeners = () => {
|
|
94
|
+
window.removeEventListener('resize', updatePosition);
|
|
95
|
+
window.removeEventListener('scroll', updatePosition, true);
|
|
96
|
+
document.removeEventListener('click', handleClickOutside);
|
|
97
|
+
document.removeEventListener('keydown', handleKeyDown);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
onMount(() => {
|
|
101
|
+
return () => stopEventListeners();
|
|
102
|
+
});
|
|
103
|
+
</script>
|
|
104
|
+
|
|
105
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
106
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
107
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
108
|
+
<div class="dropdown" bind:this={controlElement} onclick={toggleDropdown}>
|
|
109
|
+
{@render children()}
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
113
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
114
|
+
<div
|
|
115
|
+
class:is-active={isOpen}
|
|
116
|
+
class="dropdown-popover"
|
|
117
|
+
bind:this={contentEl}
|
|
118
|
+
{style}
|
|
119
|
+
onclick={() => (isOpen = false)}
|
|
120
|
+
>
|
|
121
|
+
{@render header?.()}
|
|
122
|
+
<ul class="dropdown-options" bind:this={optionsEl}>
|
|
123
|
+
{#each options as item}
|
|
124
|
+
<li>
|
|
125
|
+
<Item
|
|
126
|
+
label={item.label}
|
|
127
|
+
src={item.src}
|
|
128
|
+
description={item.description}
|
|
129
|
+
id={item.id}
|
|
130
|
+
href={item.href}
|
|
131
|
+
onclick={() => item.onclick?.(item)}
|
|
132
|
+
{variant}
|
|
133
|
+
size="sm"
|
|
134
|
+
isCompact
|
|
135
|
+
/>
|
|
136
|
+
</li>
|
|
137
|
+
{/each}
|
|
138
|
+
</ul>
|
|
139
|
+
{@render footer?.()}
|
|
140
|
+
</div>
|