ui-svelte 0.2.11 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/charts/ArcChart.svelte +9 -14
- package/dist/charts/ArcChart.svelte.d.ts +3 -3
- package/dist/charts/AreaChart.svelte +347 -118
- package/dist/charts/AreaChart.svelte.d.ts +33 -4
- package/dist/charts/BarChart.svelte +288 -66
- package/dist/charts/BarChart.svelte.d.ts +26 -1
- package/dist/charts/Candlestick.svelte +53 -50
- package/dist/charts/Candlestick.svelte.d.ts +8 -8
- package/dist/charts/LineChart.svelte +391 -91
- package/dist/charts/LineChart.svelte.d.ts +26 -3
- package/dist/charts/PieChart.svelte +333 -92
- package/dist/charts/PieChart.svelte.d.ts +33 -5
- package/dist/charts/css/arc-chart.css +3 -3
- package/dist/charts/css/area-chart.css +127 -29
- package/dist/charts/css/bar-chart.css +114 -8
- package/dist/charts/css/candlestick.css +2 -0
- package/dist/charts/css/line-chart.css +111 -13
- package/dist/charts/css/pie-chart.css +92 -20
- package/dist/control/Audio.svelte +86 -44
- package/dist/control/Audio.svelte.d.ts +4 -1
- package/dist/control/Button.svelte +18 -27
- package/dist/control/Button.svelte.d.ts +3 -2
- package/dist/control/Fab.svelte +103 -0
- package/dist/control/Fab.svelte.d.ts +25 -0
- package/dist/control/IconButton.svelte +17 -27
- package/dist/control/IconButton.svelte.d.ts +3 -3
- package/dist/control/Image.svelte +123 -0
- package/dist/control/Image.svelte.d.ts +13 -0
- package/dist/control/Record.svelte +141 -98
- package/dist/control/Record.svelte.d.ts +2 -1
- package/dist/control/ToggleGroup.svelte +22 -8
- package/dist/control/ToggleGroup.svelte.d.ts +2 -1
- package/dist/control/ToggleTheme.svelte +13 -11
- package/dist/control/ToggleTheme.svelte.d.ts +3 -2
- package/dist/control/Video.svelte +57 -29
- package/dist/control/Video.svelte.d.ts +1 -0
- package/dist/control/css/btn.css +200 -152
- package/dist/control/css/fab.css +84 -0
- package/dist/control/css/image.css +56 -0
- package/dist/control/css/media.css +95 -30
- package/dist/control/css/toggle-group.css +253 -84
- package/dist/control/css/video.css +1 -14
- package/dist/css/animations.css +5 -9
- package/dist/css/base.css +13 -347
- package/dist/css/decorations.css +561 -0
- package/dist/css/rich-text.css +485 -0
- package/dist/css/transitions.css +158 -0
- package/dist/css/typography.css +291 -0
- package/dist/css/utilities.css +0 -4
- package/dist/display/Accordion.svelte +28 -4
- package/dist/display/Accordion.svelte.d.ts +2 -1
- package/dist/display/Alert.svelte +32 -12
- package/dist/display/Alert.svelte.d.ts +2 -3
- package/dist/display/Avatar.svelte +23 -18
- package/dist/display/Avatar.svelte.d.ts +4 -1
- package/dist/display/AvatarGroup.svelte +20 -18
- package/dist/display/AvatarGroup.svelte.d.ts +6 -3
- package/dist/display/Badge.svelte +11 -4
- package/dist/display/Badge.svelte.d.ts +2 -1
- package/dist/display/Card.svelte +15 -14
- package/dist/display/Card.svelte.d.ts +2 -3
- package/dist/display/Carousel.svelte +130 -99
- package/dist/display/Carousel.svelte.d.ts +6 -4
- package/dist/display/ChatBox.svelte +245 -106
- package/dist/display/ChatBox.svelte.d.ts +32 -5
- package/dist/display/Chip.svelte +31 -17
- package/dist/display/Chip.svelte.d.ts +3 -2
- package/dist/display/Code.svelte +7 -4
- package/dist/display/Code.svelte.d.ts +1 -0
- package/dist/display/Collapsible.svelte +30 -4
- package/dist/display/Collapsible.svelte.d.ts +2 -1
- package/dist/display/Countdown.svelte +169 -0
- package/dist/display/Countdown.svelte.d.ts +21 -0
- package/dist/display/Empty.svelte +37 -3
- package/dist/display/Empty.svelte.d.ts +3 -0
- package/dist/display/Item.svelte +42 -11
- package/dist/display/Item.svelte.d.ts +4 -2
- package/dist/display/Map.svelte +488 -0
- package/dist/display/Map.svelte.d.ts +44 -0
- package/dist/display/Marquee.svelte +0 -2
- package/dist/display/Section.svelte +14 -12
- package/dist/display/Section.svelte.d.ts +2 -3
- package/dist/display/Skeleton.svelte +32 -0
- package/dist/display/Skeleton.svelte.d.ts +10 -0
- package/dist/display/Table.svelte +94 -132
- package/dist/display/Table.svelte.d.ts +10 -1
- package/dist/display/css/accordion.css +349 -52
- package/dist/display/css/alert.css +38 -18
- package/dist/display/css/avatar-group.css +38 -75
- package/dist/display/css/avatar.css +139 -121
- package/dist/display/css/badge.css +50 -27
- package/dist/display/css/card.css +123 -71
- package/dist/display/css/carousel.css +25 -5
- package/dist/display/css/chat-box.css +158 -26
- package/dist/display/css/chip.css +142 -68
- package/dist/display/css/code.css +2 -6
- package/dist/display/css/collapsible.css +349 -45
- package/dist/display/css/countdown.css +206 -0
- package/dist/display/css/divider.css +8 -6
- package/dist/display/css/empty.css +7 -0
- package/dist/display/css/item.css +330 -84
- package/dist/display/css/map.css +164 -0
- package/dist/display/css/marquee.css +0 -3
- package/dist/display/css/section.css +89 -65
- package/dist/display/css/skeleton.css +58 -0
- package/dist/display/css/table.css +309 -193
- package/dist/form/Checkbox.svelte +11 -5
- package/dist/form/Checkbox.svelte.d.ts +2 -1
- package/dist/form/ColorField.svelte +601 -0
- package/dist/form/ColorField.svelte.d.ts +29 -0
- package/dist/form/ComboBox.svelte +24 -9
- package/dist/form/ComboBox.svelte.d.ts +2 -2
- package/dist/form/CsvField.svelte +62 -136
- package/dist/form/CsvField.svelte.d.ts +2 -2
- package/dist/form/DateField.svelte +33 -15
- package/dist/form/DateField.svelte.d.ts +2 -1
- package/dist/form/DateRange.svelte +436 -0
- package/dist/form/DateRange.svelte.d.ts +24 -0
- package/dist/form/DragDrop.svelte +578 -0
- package/dist/form/DragDrop.svelte.d.ts +33 -0
- package/dist/form/Dropzone.svelte +28 -8
- package/dist/form/Dropzone.svelte.d.ts +2 -2
- package/dist/form/Editor.svelte +626 -0
- package/dist/form/Editor.svelte.d.ts +50 -0
- package/dist/form/ImageCropper.svelte +422 -61
- package/dist/form/ImageCropper.svelte.d.ts +15 -1
- package/dist/form/{PasswordStrength.svelte → PasswordField.svelte} +58 -24
- package/dist/form/{PasswordStrength.svelte.d.ts → PasswordField.svelte.d.ts} +6 -5
- package/dist/form/PhoneField.svelte +26 -14
- package/dist/form/PhoneField.svelte.d.ts +4 -3
- package/dist/form/PinField.svelte +39 -31
- package/dist/form/PinField.svelte.d.ts +3 -3
- package/dist/form/RadioGroup.svelte +9 -5
- package/dist/form/RadioGroup.svelte.d.ts +1 -1
- package/dist/form/Select.svelte +20 -19
- package/dist/form/Select.svelte.d.ts +2 -2
- package/dist/form/Slider.svelte +10 -4
- package/dist/form/Slider.svelte.d.ts +2 -1
- package/dist/form/TextField.svelte +29 -11
- package/dist/form/TextField.svelte.d.ts +5 -4
- package/dist/form/Textarea.svelte +15 -6
- package/dist/form/Textarea.svelte.d.ts +2 -2
- package/dist/form/Toggle.svelte +7 -3
- package/dist/form/Toggle.svelte.d.ts +1 -1
- package/dist/form/css/checkbox.css +18 -2
- package/dist/form/css/color-field.css +141 -0
- package/dist/form/css/control.css +193 -82
- package/dist/form/css/csv-field.css +221 -0
- package/dist/form/css/date-range.css +122 -0
- package/dist/form/css/date.css +24 -2
- package/dist/form/css/drag-drop.css +234 -0
- package/dist/form/css/dropzone.css +153 -34
- package/dist/form/css/editor.css +367 -0
- package/dist/form/css/field.css +4 -0
- package/dist/form/css/image-cropper.css +242 -20
- package/dist/form/css/radio-group.css +26 -1
- package/dist/form/css/select.css +2 -2
- package/dist/form/css/slider.css +37 -0
- package/dist/form/css/textarea.css +178 -75
- package/dist/form/css/toggle.css +15 -3
- package/dist/hooks/use-chat.svelte.js +1 -1
- package/dist/hooks/use-form.svelte.js +3 -3
- package/dist/hooks/use-search.svelte.js +0 -3
- package/dist/hooks/use-table.svelte.d.ts +1 -0
- package/dist/hooks/use-table.svelte.js +6 -0
- package/dist/icons/index.d.ts +34 -2
- package/dist/icons/index.js +36 -4
- package/dist/index.css +44 -49
- package/dist/index.d.ts +14 -4
- package/dist/index.js +13 -3
- package/dist/layout/AppBar.svelte +22 -14
- package/dist/layout/AppBar.svelte.d.ts +2 -1
- package/dist/layout/Footer.svelte +19 -11
- package/dist/layout/Footer.svelte.d.ts +2 -1
- package/dist/layout/Provider.svelte +32 -9
- package/dist/layout/Provider.svelte.d.ts +3 -1
- package/dist/layout/Sidebar.svelte +17 -8
- package/dist/layout/Sidebar.svelte.d.ts +2 -1
- package/dist/layout/css/app-bar.css +63 -66
- package/dist/layout/css/footer.css +62 -65
- package/dist/layout/css/sidebar.css +120 -59
- package/dist/navigation/BottomNav.svelte +51 -14
- package/dist/navigation/FooterGroup.svelte +1 -1
- package/dist/navigation/NavMenu.svelte +47 -23
- package/dist/navigation/NavMenu.svelte.d.ts +29 -0
- package/dist/navigation/Pagination.svelte +158 -0
- package/dist/navigation/Pagination.svelte.d.ts +18 -0
- package/dist/navigation/SideNav.svelte +30 -25
- package/dist/navigation/SideNav.svelte.d.ts +2 -3
- package/dist/navigation/Tabs.svelte +17 -7
- package/dist/navigation/Tabs.svelte.d.ts +2 -2
- package/dist/navigation/css/bottom-nav.css +319 -257
- package/dist/navigation/css/footer-group.css +1 -1
- package/dist/navigation/css/footer-nav.css +1 -1
- package/dist/navigation/css/nav-menu.css +331 -106
- package/dist/navigation/css/pagination.css +74 -0
- package/dist/navigation/css/side-nav.css +514 -75
- package/dist/navigation/css/tabs.css +246 -52
- package/dist/overlay/AlertDialog.svelte +58 -0
- package/dist/overlay/AlertDialog.svelte.d.ts +14 -25
- package/dist/overlay/Command.svelte +347 -0
- package/dist/overlay/Command.svelte.d.ts +33 -25
- package/dist/overlay/Drawer.svelte +49 -21
- package/dist/overlay/Drawer.svelte.d.ts +2 -2
- package/dist/overlay/Dropdown.svelte +3 -3
- package/dist/overlay/Modal.svelte +51 -16
- package/dist/overlay/Modal.svelte.d.ts +3 -3
- package/dist/overlay/Toast.svelte +41 -17
- package/dist/overlay/Toast.svelte.d.ts +1 -1
- package/dist/overlay/Tooltip.svelte +36 -27
- package/dist/overlay/Tooltip.svelte.d.ts +2 -2
- package/dist/overlay/css/command.css +68 -0
- package/dist/overlay/css/drawer.css +63 -24
- package/dist/overlay/css/dropdown.css +1 -1
- package/dist/overlay/css/hovercard.css +1 -1
- package/dist/overlay/css/modal.css +79 -27
- package/dist/overlay/css/toast.css +40 -24
- package/dist/overlay/css/tooltip.css +110 -67
- package/dist/stores/theme.svelte.js +44 -12
- package/dist/stores/toast.svelte.d.ts +4 -4
- package/dist/stores/toast.svelte.js +2 -2
- package/package.json +1 -1
- package/dist/utils/charts.d.ts +0 -27
- package/dist/utils/charts.js +0 -140
|
@@ -1,33 +1,39 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import {
|
|
3
|
-
import { ChevronDown24RegularIcon } from '../icons/index.js';
|
|
4
|
-
import { Icon } from '../index.js';
|
|
5
|
-
import { cn } from '../utils/class-names.js';
|
|
6
|
-
import type { Snippet } from 'svelte';
|
|
7
|
-
import { onMount } from 'svelte';
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { IconData } from '../index.js';
|
|
8
3
|
|
|
9
|
-
type
|
|
4
|
+
export type NavMenuSubItem = {
|
|
10
5
|
label: string;
|
|
11
6
|
description?: string;
|
|
12
7
|
href?: string;
|
|
13
|
-
onclick?: (item:
|
|
8
|
+
onclick?: (item: NavMenuSubItem) => void;
|
|
9
|
+
icon?: IconData;
|
|
14
10
|
};
|
|
15
11
|
|
|
16
|
-
type
|
|
12
|
+
export type NavMenuItem = {
|
|
17
13
|
label: string;
|
|
18
14
|
description?: string;
|
|
19
15
|
href?: string;
|
|
20
|
-
onclick?: (item:
|
|
21
|
-
subitems?:
|
|
16
|
+
onclick?: (item: NavMenuItem) => void;
|
|
17
|
+
subitems?: NavMenuSubItem[];
|
|
22
18
|
megamenu?: Snippet;
|
|
23
19
|
type?: 'item' | 'submenu' | 'megamenu';
|
|
20
|
+
icon?: IconData;
|
|
24
21
|
};
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<script lang="ts">
|
|
25
|
+
import { page } from '$app/state';
|
|
26
|
+
import { ChevronDown24RegularIcon } from '../icons/index.js';
|
|
27
|
+
import { Icon } from '../index.js';
|
|
28
|
+
import { cn } from '../utils/class-names.js';
|
|
29
|
+
import type { Snippet } from 'svelte';
|
|
30
|
+
import { onMount } from 'svelte';
|
|
25
31
|
|
|
26
32
|
type Props = {
|
|
27
|
-
items:
|
|
33
|
+
items: NavMenuItem[];
|
|
28
34
|
size?: 'sm' | 'md' | 'lg';
|
|
29
|
-
|
|
30
|
-
|
|
35
|
+
variant?: 'solid' | 'soft' | 'ghost';
|
|
36
|
+
color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'warning' | 'danger';
|
|
31
37
|
class?: string;
|
|
32
38
|
};
|
|
33
39
|
|
|
@@ -35,8 +41,8 @@
|
|
|
35
41
|
items = [],
|
|
36
42
|
class: className,
|
|
37
43
|
size = 'md',
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
variant = 'ghost',
|
|
45
|
+
color = 'muted'
|
|
40
46
|
}: Props = $props();
|
|
41
47
|
|
|
42
48
|
let openSubmenuIndex = $state<number | null>(null);
|
|
@@ -56,9 +62,13 @@
|
|
|
56
62
|
lg: 'is-lg'
|
|
57
63
|
};
|
|
58
64
|
|
|
59
|
-
const solidClass = $derived(isSolid ? 'is-filled' : 'is-default');
|
|
60
|
-
|
|
61
65
|
const variantClasses = {
|
|
66
|
+
solid: 'is-solid',
|
|
67
|
+
soft: 'is-soft',
|
|
68
|
+
ghost: 'is-ghost'
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const colorClasses = {
|
|
62
72
|
primary: 'is-primary',
|
|
63
73
|
secondary: 'is-secondary',
|
|
64
74
|
muted: 'is-muted',
|
|
@@ -77,7 +87,7 @@
|
|
|
77
87
|
return page.url.pathname === href || page.url.pathname.startsWith(href + '/');
|
|
78
88
|
}
|
|
79
89
|
|
|
80
|
-
function hasActiveSubmenu(subitems?:
|
|
90
|
+
function hasActiveSubmenu(subitems?: NavMenuSubItem[]): boolean {
|
|
81
91
|
if (!subitems) return false;
|
|
82
92
|
return subitems.some((item) => isItemActive(item.href));
|
|
83
93
|
}
|
|
@@ -164,7 +174,7 @@
|
|
|
164
174
|
document.removeEventListener('click', handleClickOutside);
|
|
165
175
|
}
|
|
166
176
|
|
|
167
|
-
function handleItemClick(item:
|
|
177
|
+
function handleItemClick(item: NavMenuItem, index: number) {
|
|
168
178
|
if (item.subitems || item.megamenu) {
|
|
169
179
|
toggleSubmenu(index);
|
|
170
180
|
} else if (item.onclick) {
|
|
@@ -172,7 +182,7 @@
|
|
|
172
182
|
}
|
|
173
183
|
}
|
|
174
184
|
|
|
175
|
-
function handleSubmenuItemClick(item:
|
|
185
|
+
function handleSubmenuItemClick(item: NavMenuSubItem) {
|
|
176
186
|
if (item.onclick) {
|
|
177
187
|
item.onclick(item);
|
|
178
188
|
}
|
|
@@ -185,10 +195,15 @@
|
|
|
185
195
|
});
|
|
186
196
|
</script>
|
|
187
197
|
|
|
188
|
-
<nav
|
|
198
|
+
<nav
|
|
199
|
+
class={cn('navmenu', sizeClasses[size], variantClasses[variant], colorClasses[color], className)}
|
|
200
|
+
>
|
|
189
201
|
{#each items as item, index}
|
|
190
202
|
{#if item.href && !item.subitems && !item.megamenu}
|
|
191
203
|
<a href={item.href} class={cn('navmenu-item', isItemActive(item.href) && 'is-active')}>
|
|
204
|
+
{#if item.icon}
|
|
205
|
+
<Icon icon={item.icon} class="navmenu-icon" />
|
|
206
|
+
{/if}
|
|
192
207
|
<span class="navmenu-label" data-text={item.label}>{item.label}</span>
|
|
193
208
|
</a>
|
|
194
209
|
{:else}
|
|
@@ -202,6 +217,9 @@
|
|
|
202
217
|
bind:this={triggerElements[index]}
|
|
203
218
|
onclick={() => handleItemClick(item, index)}
|
|
204
219
|
>
|
|
220
|
+
{#if item.icon}
|
|
221
|
+
<Icon icon={item.icon} class="navmenu-icon" />
|
|
222
|
+
{/if}
|
|
205
223
|
<span class="navmenu-label" data-text={item.label}>{item.label}</span>
|
|
206
224
|
{#if item.subitems || item.megamenu}
|
|
207
225
|
<Icon
|
|
@@ -240,6 +258,9 @@
|
|
|
240
258
|
stopEventListeners();
|
|
241
259
|
}}
|
|
242
260
|
>
|
|
261
|
+
{#if subitem.icon}
|
|
262
|
+
<Icon icon={subitem.icon} class="navmenu-submenu-icon" />
|
|
263
|
+
{/if}
|
|
243
264
|
<div class="navmenu-submenu-content">
|
|
244
265
|
<div class="navmenu-submenu-label">{subitem.label}</div>
|
|
245
266
|
{#if subitem.description}
|
|
@@ -253,6 +274,9 @@
|
|
|
253
274
|
class="navmenu-submenu-item"
|
|
254
275
|
onclick={() => handleSubmenuItemClick(subitem)}
|
|
255
276
|
>
|
|
277
|
+
{#if subitem.icon}
|
|
278
|
+
<Icon icon={subitem.icon} class="navmenu-submenu-icon" />
|
|
279
|
+
{/if}
|
|
256
280
|
<div class="navmenu-submenu-content">
|
|
257
281
|
<div class="navmenu-submenu-label">{subitem.label}</div>
|
|
258
282
|
{#if subitem.description}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { IconData } from '../index.js';
|
|
2
|
+
export type NavMenuSubItem = {
|
|
3
|
+
label: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
href?: string;
|
|
6
|
+
onclick?: (item: NavMenuSubItem) => void;
|
|
7
|
+
icon?: IconData;
|
|
8
|
+
};
|
|
9
|
+
export type NavMenuItem = {
|
|
10
|
+
label: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
href?: string;
|
|
13
|
+
onclick?: (item: NavMenuItem) => void;
|
|
14
|
+
subitems?: NavMenuSubItem[];
|
|
15
|
+
megamenu?: Snippet;
|
|
16
|
+
type?: 'item' | 'submenu' | 'megamenu';
|
|
17
|
+
icon?: IconData;
|
|
18
|
+
};
|
|
19
|
+
import type { Snippet } from 'svelte';
|
|
20
|
+
type Props = {
|
|
21
|
+
items: NavMenuItem[];
|
|
22
|
+
size?: 'sm' | 'md' | 'lg';
|
|
23
|
+
variant?: 'solid' | 'soft' | 'ghost';
|
|
24
|
+
color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'warning' | 'danger';
|
|
25
|
+
class?: string;
|
|
26
|
+
};
|
|
27
|
+
declare const NavMenu: import("svelte").Component<Props, {}, "">;
|
|
28
|
+
type NavMenu = ReturnType<typeof NavMenu>;
|
|
29
|
+
export default NavMenu;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { IconButton, Button } from '../index.js';
|
|
3
|
+
import { ArrowLeftRegularIcon, ArrowRightRegularIcon } from '../icons/index.js';
|
|
4
|
+
import { cn } from '../utils/class-names.js';
|
|
5
|
+
|
|
6
|
+
type Props = {
|
|
7
|
+
page: number;
|
|
8
|
+
totalPages: number;
|
|
9
|
+
onPageChange?: (page: number) => void;
|
|
10
|
+
onPrev?: () => void;
|
|
11
|
+
onNext?: () => void;
|
|
12
|
+
hasPrevPage?: boolean;
|
|
13
|
+
hasNextPage?: boolean;
|
|
14
|
+
color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
|
|
15
|
+
variant?: 'solid' | 'soft' | 'outlined' | 'ghost';
|
|
16
|
+
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
17
|
+
align?: 'start' | 'center' | 'end';
|
|
18
|
+
class?: string;
|
|
19
|
+
hidePageNumbers?: boolean;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
let {
|
|
23
|
+
page = 1,
|
|
24
|
+
totalPages = 1,
|
|
25
|
+
onPageChange,
|
|
26
|
+
onPrev,
|
|
27
|
+
onNext,
|
|
28
|
+
hasPrevPage,
|
|
29
|
+
hasNextPage,
|
|
30
|
+
color = 'primary',
|
|
31
|
+
variant = 'solid',
|
|
32
|
+
size = 'md',
|
|
33
|
+
align = 'center',
|
|
34
|
+
class: className,
|
|
35
|
+
hidePageNumbers
|
|
36
|
+
}: Props = $props();
|
|
37
|
+
|
|
38
|
+
const colors = {
|
|
39
|
+
primary: 'is-primary',
|
|
40
|
+
secondary: 'is-secondary',
|
|
41
|
+
muted: 'is-muted',
|
|
42
|
+
success: 'is-success',
|
|
43
|
+
info: 'is-info',
|
|
44
|
+
danger: 'is-danger',
|
|
45
|
+
warning: 'is-warning'
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const aligns = {
|
|
49
|
+
start: 'is-start',
|
|
50
|
+
center: 'is-center',
|
|
51
|
+
end: 'is-end'
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const getPageNumbers = (current: number, total: number): (number | string)[] => {
|
|
55
|
+
const pages: (number | string)[] = [];
|
|
56
|
+
const delta = 1;
|
|
57
|
+
|
|
58
|
+
if (total <= 7) {
|
|
59
|
+
for (let i = 1; i <= total; i++) {
|
|
60
|
+
pages.push(i);
|
|
61
|
+
}
|
|
62
|
+
} else {
|
|
63
|
+
pages.push(1);
|
|
64
|
+
const start = Math.max(2, current - delta);
|
|
65
|
+
const end = Math.min(total - 1, current + delta);
|
|
66
|
+
|
|
67
|
+
if (start > 2) {
|
|
68
|
+
pages.push('...');
|
|
69
|
+
}
|
|
70
|
+
for (let i = start; i <= end; i++) {
|
|
71
|
+
pages.push(i);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (end < total - 1) {
|
|
75
|
+
pages.push('...');
|
|
76
|
+
}
|
|
77
|
+
pages.push(total);
|
|
78
|
+
}
|
|
79
|
+
return pages;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const pageNumbers = $derived(!hidePageNumbers ? getPageNumbers(page, totalPages) : []);
|
|
83
|
+
|
|
84
|
+
const canGoPrev = $derived(hasPrevPage ?? page > 1);
|
|
85
|
+
const canGoNext = $derived(hasNextPage ?? page < totalPages);
|
|
86
|
+
|
|
87
|
+
const handlePrev = () => {
|
|
88
|
+
if (onPrev) {
|
|
89
|
+
onPrev();
|
|
90
|
+
} else if (onPageChange && page > 1) {
|
|
91
|
+
onPageChange(page - 1);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const handleNext = () => {
|
|
96
|
+
if (onNext) {
|
|
97
|
+
onNext();
|
|
98
|
+
} else if (onPageChange && page < totalPages) {
|
|
99
|
+
onPageChange(page + 1);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const handlePageClick = (pageNum: number) => {
|
|
104
|
+
if (onPageChange) {
|
|
105
|
+
onPageChange(pageNum);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const alignStyles = {
|
|
110
|
+
start: 'flex-start',
|
|
111
|
+
center: 'center',
|
|
112
|
+
end: 'flex-end'
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
let baseClasses = $derived(cn('pagination', colors[color], className));
|
|
116
|
+
</script>
|
|
117
|
+
|
|
118
|
+
<div class={cn('pagination-container', aligns[align])}>
|
|
119
|
+
<div class={baseClasses}>
|
|
120
|
+
<IconButton
|
|
121
|
+
icon={ArrowLeftRegularIcon}
|
|
122
|
+
onclick={handlePrev}
|
|
123
|
+
isDisabled={!canGoPrev}
|
|
124
|
+
{color}
|
|
125
|
+
{variant}
|
|
126
|
+
{size}
|
|
127
|
+
class="pagination-btn pagination-nav"
|
|
128
|
+
/>
|
|
129
|
+
|
|
130
|
+
{#if !hidePageNumbers}
|
|
131
|
+
{#each pageNumbers as pageNum}
|
|
132
|
+
{#if pageNum === '...'}
|
|
133
|
+
<span class="pagination-ellipsis">...</span>
|
|
134
|
+
{:else}
|
|
135
|
+
<Button
|
|
136
|
+
onclick={() => handlePageClick(pageNum as number)}
|
|
137
|
+
color={pageNum === page ? color : 'muted'}
|
|
138
|
+
variant={pageNum === page ? variant : 'ghost'}
|
|
139
|
+
{size}
|
|
140
|
+
class="pagination-btn pagination-page"
|
|
141
|
+
>
|
|
142
|
+
{pageNum}
|
|
143
|
+
</Button>
|
|
144
|
+
{/if}
|
|
145
|
+
{/each}
|
|
146
|
+
{/if}
|
|
147
|
+
|
|
148
|
+
<IconButton
|
|
149
|
+
icon={ArrowRightRegularIcon}
|
|
150
|
+
onclick={handleNext}
|
|
151
|
+
isDisabled={!canGoNext}
|
|
152
|
+
{color}
|
|
153
|
+
{variant}
|
|
154
|
+
{size}
|
|
155
|
+
class="pagination-btn pagination-nav"
|
|
156
|
+
/>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
type Props = {
|
|
2
|
+
page: number;
|
|
3
|
+
totalPages: number;
|
|
4
|
+
onPageChange?: (page: number) => void;
|
|
5
|
+
onPrev?: () => void;
|
|
6
|
+
onNext?: () => void;
|
|
7
|
+
hasPrevPage?: boolean;
|
|
8
|
+
hasNextPage?: boolean;
|
|
9
|
+
color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
|
|
10
|
+
variant?: 'solid' | 'soft' | 'outlined' | 'ghost';
|
|
11
|
+
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
12
|
+
align?: 'start' | 'center' | 'end';
|
|
13
|
+
class?: string;
|
|
14
|
+
hidePageNumbers?: boolean;
|
|
15
|
+
};
|
|
16
|
+
declare const Pagination: import("svelte").Component<Props, {}, "">;
|
|
17
|
+
type Pagination = ReturnType<typeof Pagination>;
|
|
18
|
+
export default Pagination;
|
|
@@ -34,10 +34,9 @@
|
|
|
34
34
|
size?: 'sm' | 'md' | 'lg';
|
|
35
35
|
class?: string;
|
|
36
36
|
isWide?: boolean;
|
|
37
|
-
isCompact?: boolean;
|
|
38
37
|
isCollapsible?: boolean;
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
variant?: 'solid' | 'soft' | 'ghost';
|
|
39
|
+
color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'warning' | 'danger';
|
|
41
40
|
};
|
|
42
41
|
|
|
43
42
|
const {
|
|
@@ -45,10 +44,9 @@
|
|
|
45
44
|
class: className,
|
|
46
45
|
size = 'md',
|
|
47
46
|
isWide,
|
|
48
|
-
isCompact,
|
|
49
47
|
isCollapsible,
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
variant = 'ghost',
|
|
49
|
+
color = 'muted'
|
|
52
50
|
}: Props = $props();
|
|
53
51
|
|
|
54
52
|
let openSubmenus = $state<Record<number, boolean>>({});
|
|
@@ -78,9 +76,13 @@
|
|
|
78
76
|
lg: 'is-lg'
|
|
79
77
|
};
|
|
80
78
|
|
|
81
|
-
const solidClass = $derived(isSolid ? 'is-solid' : '');
|
|
82
|
-
|
|
83
79
|
const variantClasses = {
|
|
80
|
+
solid: 'is-solid',
|
|
81
|
+
soft: 'is-soft',
|
|
82
|
+
ghost: 'is-ghost'
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const colorClasses = {
|
|
84
86
|
primary: 'is-primary',
|
|
85
87
|
secondary: 'is-secondary',
|
|
86
88
|
muted: 'is-muted',
|
|
@@ -106,9 +108,17 @@
|
|
|
106
108
|
}
|
|
107
109
|
</script>
|
|
108
110
|
|
|
111
|
+
{#snippet navItemIcon(icon: IconData | undefined)}
|
|
112
|
+
{#if icon}
|
|
113
|
+
<div class="sidenav-icon-wrapper">
|
|
114
|
+
<Icon {icon} class="sidenav-icon" />
|
|
115
|
+
</div>
|
|
116
|
+
{/if}
|
|
117
|
+
{/snippet}
|
|
118
|
+
|
|
109
119
|
{#snippet navItemContent(item: SideNavItem | SideNavSubItem, isSubitem = false)}
|
|
110
120
|
<div class="sidenav-content">
|
|
111
|
-
<div class="sidenav-label">{item.label}</div>
|
|
121
|
+
<div class="sidenav-label" data-text={item.label}>{item.label}</div>
|
|
112
122
|
{#if item.description && (isExpanded || !isCollapsible)}
|
|
113
123
|
<div class="sidenav-description">{item.description}</div>
|
|
114
124
|
{/if}
|
|
@@ -128,9 +138,8 @@
|
|
|
128
138
|
class={cn(
|
|
129
139
|
'sidenav',
|
|
130
140
|
sizeClasses[size],
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
isCompact && 'is-compact',
|
|
141
|
+
variantClasses[variant],
|
|
142
|
+
colorClasses[color],
|
|
134
143
|
isCollapsible && 'is-collapsible',
|
|
135
144
|
!isExpanded && 'is-collapsed',
|
|
136
145
|
className
|
|
@@ -148,9 +157,7 @@
|
|
|
148
157
|
href={item.href}
|
|
149
158
|
class={cn('sidenav-header sidenav-header-link', isItemActive(item.href) && 'is-active')}
|
|
150
159
|
>
|
|
151
|
-
{
|
|
152
|
-
<Icon icon={item.icon} />
|
|
153
|
-
{/if}
|
|
160
|
+
{@render navItemIcon(item.icon)}
|
|
154
161
|
{#if isExpanded || !isCollapsible}
|
|
155
162
|
<div class="sidenav-header-content">
|
|
156
163
|
<div class="sidenav-header-label">{item.label}</div>
|
|
@@ -166,9 +173,7 @@
|
|
|
166
173
|
class="sidenav-header sidenav-header-link"
|
|
167
174
|
onclick={() => item.onclick?.(item)}
|
|
168
175
|
>
|
|
169
|
-
{
|
|
170
|
-
<Icon icon={item.icon} />
|
|
171
|
-
{/if}
|
|
176
|
+
{@render navItemIcon(item.icon)}
|
|
172
177
|
{#if isExpanded || !isCollapsible}
|
|
173
178
|
<div class="sidenav-header-content">
|
|
174
179
|
<div class="sidenav-header-label">{item.label}</div>
|
|
@@ -181,9 +186,7 @@
|
|
|
181
186
|
{/if}
|
|
182
187
|
{:else}
|
|
183
188
|
<div class="sidenav-header">
|
|
184
|
-
{
|
|
185
|
-
<Icon icon={item.icon} />
|
|
186
|
-
{/if}
|
|
189
|
+
{@render navItemIcon(item.icon)}
|
|
187
190
|
{#if isExpanded || !isCollapsible}
|
|
188
191
|
<div class="sidenav-header-content">
|
|
189
192
|
<div class="sidenav-header-label">{item.label}</div>
|
|
@@ -201,9 +204,7 @@
|
|
|
201
204
|
class="sidenav-header sidenav-submenu-trigger"
|
|
202
205
|
onclick={() => toggleSubmenu(index)}
|
|
203
206
|
>
|
|
204
|
-
{
|
|
205
|
-
<Icon icon={item.icon} />
|
|
206
|
-
{/if}
|
|
207
|
+
{@render navItemIcon(item.icon)}
|
|
207
208
|
{#if isExpanded || !isCollapsible}
|
|
208
209
|
<div class="sidenav-header-content">
|
|
209
210
|
<div class="sidenav-header-label">{item.label}</div>
|
|
@@ -234,14 +235,16 @@
|
|
|
234
235
|
isItemActive(subitem.href) && 'is-active'
|
|
235
236
|
)}
|
|
236
237
|
>
|
|
238
|
+
{@render navItemIcon(subitem.icon)}
|
|
237
239
|
{@render navItemContent(subitem, true)}
|
|
238
240
|
</a>
|
|
239
241
|
{:else}
|
|
240
242
|
<button
|
|
241
243
|
type="button"
|
|
242
|
-
class=
|
|
244
|
+
class={cn('sidenav-item sidenav-subitem', isWide && 'is-wide')}
|
|
243
245
|
onclick={() => subitem.onclick?.(subitem)}
|
|
244
246
|
>
|
|
247
|
+
{@render navItemIcon(subitem.icon)}
|
|
245
248
|
{@render navItemContent(subitem, true)}
|
|
246
249
|
</button>
|
|
247
250
|
{/if}
|
|
@@ -254,6 +257,7 @@
|
|
|
254
257
|
href={item.href}
|
|
255
258
|
class={cn('sidenav-item', isWide && 'is-wide', isItemActive(item.href) && 'is-active')}
|
|
256
259
|
>
|
|
260
|
+
{@render navItemIcon(item.icon)}
|
|
257
261
|
{@render navItemContent(item)}
|
|
258
262
|
</a>
|
|
259
263
|
{:else}
|
|
@@ -262,6 +266,7 @@
|
|
|
262
266
|
class={cn('sidenav-item', isWide && 'is-wide')}
|
|
263
267
|
onclick={() => item.onclick?.(item)}
|
|
264
268
|
>
|
|
269
|
+
{@render navItemIcon(item.icon)}
|
|
265
270
|
{@render navItemContent(item)}
|
|
266
271
|
</button>
|
|
267
272
|
{/if}
|
|
@@ -24,10 +24,9 @@ type Props = {
|
|
|
24
24
|
size?: 'sm' | 'md' | 'lg';
|
|
25
25
|
class?: string;
|
|
26
26
|
isWide?: boolean;
|
|
27
|
-
isCompact?: boolean;
|
|
28
27
|
isCollapsible?: boolean;
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
variant?: 'solid' | 'soft' | 'ghost';
|
|
29
|
+
color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'warning' | 'danger';
|
|
31
30
|
};
|
|
32
31
|
declare const SideNav: import("svelte").Component<Props, {}, "">;
|
|
33
32
|
type SideNav = ReturnType<typeof SideNav>;
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
type Props = {
|
|
11
11
|
tabs: Tab[];
|
|
12
12
|
position?: 'top' | 'bottom' | 'start' | 'end';
|
|
13
|
-
variant?: '
|
|
14
|
-
|
|
13
|
+
variant?: 'solid' | 'outline' | 'line' | 'ghost' | 'pills';
|
|
14
|
+
color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
|
|
15
15
|
rootClass?: string;
|
|
16
16
|
tabListClass?: string;
|
|
17
17
|
tabClass?: string;
|
|
@@ -23,18 +23,27 @@
|
|
|
23
23
|
tabListClass,
|
|
24
24
|
tabContentClass,
|
|
25
25
|
tabs,
|
|
26
|
-
variant = '
|
|
27
|
-
|
|
26
|
+
variant = 'solid',
|
|
27
|
+
color = 'muted',
|
|
28
28
|
position = 'top'
|
|
29
29
|
}: Props = $props();
|
|
30
30
|
|
|
31
|
-
const
|
|
31
|
+
const colors = {
|
|
32
32
|
primary: 'is-primary',
|
|
33
33
|
secondary: 'is-secondary',
|
|
34
34
|
muted: 'is-muted',
|
|
35
|
+
success: 'is-success',
|
|
36
|
+
info: 'is-info',
|
|
37
|
+
danger: 'is-danger',
|
|
38
|
+
warning: 'is-warning'
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const variants = {
|
|
42
|
+
solid: 'is-solid',
|
|
35
43
|
outline: 'is-outline',
|
|
36
44
|
line: 'is-line',
|
|
37
|
-
ghost: 'is-ghost'
|
|
45
|
+
ghost: 'is-ghost',
|
|
46
|
+
pills: 'is-pills'
|
|
38
47
|
};
|
|
39
48
|
|
|
40
49
|
const positionClasses = {
|
|
@@ -44,6 +53,7 @@
|
|
|
44
53
|
end: 'is-end'
|
|
45
54
|
};
|
|
46
55
|
|
|
56
|
+
// svelte-ignore state_referenced_locally
|
|
47
57
|
let activeTab = $state(tabs[0]);
|
|
48
58
|
|
|
49
59
|
function handleTabChange(tab: Tab) {
|
|
@@ -52,7 +62,7 @@
|
|
|
52
62
|
</script>
|
|
53
63
|
|
|
54
64
|
<div class={cn('tabs', positionClasses[position], rootClass)}>
|
|
55
|
-
<div class={cn('tabs-list',
|
|
65
|
+
<div class={cn('tabs-list', variants[variant], colors[color], tabListClass)}>
|
|
56
66
|
{#each tabs as tab}
|
|
57
67
|
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
58
68
|
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
@@ -7,8 +7,8 @@ type Tab = {
|
|
|
7
7
|
type Props = {
|
|
8
8
|
tabs: Tab[];
|
|
9
9
|
position?: 'top' | 'bottom' | 'start' | 'end';
|
|
10
|
-
variant?: '
|
|
11
|
-
|
|
10
|
+
variant?: 'solid' | 'outline' | 'line' | 'ghost' | 'pills';
|
|
11
|
+
color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
|
|
12
12
|
rootClass?: string;
|
|
13
13
|
tabListClass?: string;
|
|
14
14
|
tabClass?: string;
|