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,102 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Dismiss24RegularIcon } from '../icons/index.js';
|
|
3
|
+
import { Icon } from '../index.js';
|
|
4
|
+
import { cn } from '../utils/class-names.js';
|
|
5
|
+
import { popover } from '../utils/popover.js';
|
|
6
|
+
import type { Snippet } from 'svelte';
|
|
7
|
+
import { fade, scale } from 'svelte/transition';
|
|
8
|
+
|
|
9
|
+
type Props = {
|
|
10
|
+
open: boolean;
|
|
11
|
+
onclose?: () => void;
|
|
12
|
+
children: Snippet;
|
|
13
|
+
header?: Snippet;
|
|
14
|
+
footer?: Snippet;
|
|
15
|
+
class?: string;
|
|
16
|
+
headerClass?: string;
|
|
17
|
+
footerClass?: string;
|
|
18
|
+
contentClass?: string;
|
|
19
|
+
variant?: 'ghost' | 'surface' | 'primary' | 'secondary' | 'muted';
|
|
20
|
+
disableOverlayClose?: boolean;
|
|
21
|
+
hideCloseButton?: boolean;
|
|
22
|
+
isSolid?: boolean;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
let {
|
|
26
|
+
open = $bindable(),
|
|
27
|
+
onclose,
|
|
28
|
+
header,
|
|
29
|
+
footer,
|
|
30
|
+
children,
|
|
31
|
+
class: className,
|
|
32
|
+
headerClass,
|
|
33
|
+
contentClass,
|
|
34
|
+
footerClass,
|
|
35
|
+
variant = 'ghost',
|
|
36
|
+
disableOverlayClose,
|
|
37
|
+
hideCloseButton,
|
|
38
|
+
isSolid
|
|
39
|
+
}: Props = $props();
|
|
40
|
+
|
|
41
|
+
let openContent = $state(false);
|
|
42
|
+
|
|
43
|
+
const variants = {
|
|
44
|
+
ghost: 'is-ghost',
|
|
45
|
+
surface: 'is-surface',
|
|
46
|
+
primary: 'is-primary',
|
|
47
|
+
secondary: 'is-secondary',
|
|
48
|
+
muted: 'is-muted'
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const handleOverlayClick = () => {
|
|
52
|
+
if (!disableOverlayClose) {
|
|
53
|
+
open = false;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
$effect(() => {
|
|
58
|
+
if (open) {
|
|
59
|
+
setTimeout(() => {
|
|
60
|
+
openContent = true;
|
|
61
|
+
}, 20);
|
|
62
|
+
} else {
|
|
63
|
+
onclose?.();
|
|
64
|
+
openContent = false;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
</script>
|
|
68
|
+
|
|
69
|
+
{#if open}
|
|
70
|
+
<div transition:fade class="modal-dialog" use:popover>
|
|
71
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
72
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
73
|
+
<div class="modal-overlay" onclick={handleOverlayClick}></div>
|
|
74
|
+
{#if openContent}
|
|
75
|
+
<div
|
|
76
|
+
in:scale={{ duration: 100 }}
|
|
77
|
+
class={cn('modal', variants[variant], isSolid && 'is-solid', className)}
|
|
78
|
+
>
|
|
79
|
+
{#if header}
|
|
80
|
+
<div class={cn('modal-header', headerClass)}>
|
|
81
|
+
{@render header()}
|
|
82
|
+
</div>
|
|
83
|
+
{/if}
|
|
84
|
+
<div class={cn('modal-content', contentClass)}>
|
|
85
|
+
{@render children()}
|
|
86
|
+
</div>
|
|
87
|
+
{#if footer}
|
|
88
|
+
<div class={cn('modal-footer', footerClass)}>
|
|
89
|
+
{@render footer()}
|
|
90
|
+
</div>
|
|
91
|
+
{/if}
|
|
92
|
+
{#if !hideCloseButton}
|
|
93
|
+
<div class="btn-close">
|
|
94
|
+
<button onclick={() => (open = false)}>
|
|
95
|
+
<Icon icon={Dismiss24RegularIcon} class="btn-close-icon" />
|
|
96
|
+
</button>
|
|
97
|
+
</div>
|
|
98
|
+
{/if}
|
|
99
|
+
</div>
|
|
100
|
+
{/if}
|
|
101
|
+
</div>
|
|
102
|
+
{/if}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
type Props = {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onclose?: () => void;
|
|
5
|
+
children: Snippet;
|
|
6
|
+
header?: Snippet;
|
|
7
|
+
footer?: Snippet;
|
|
8
|
+
class?: string;
|
|
9
|
+
headerClass?: string;
|
|
10
|
+
footerClass?: string;
|
|
11
|
+
contentClass?: string;
|
|
12
|
+
variant?: 'ghost' | 'surface' | 'primary' | 'secondary' | 'muted';
|
|
13
|
+
disableOverlayClose?: boolean;
|
|
14
|
+
hideCloseButton?: boolean;
|
|
15
|
+
isSolid?: boolean;
|
|
16
|
+
};
|
|
17
|
+
declare const Modal: import("svelte").Component<Props, {}, "open">;
|
|
18
|
+
type Modal = ReturnType<typeof Modal>;
|
|
19
|
+
export default Modal;
|
|
File without changes
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export default PopoverStack;
|
|
2
|
+
type PopoverStack = SvelteComponent<{
|
|
3
|
+
[x: string]: never;
|
|
4
|
+
}, {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
}, {}> & {
|
|
7
|
+
$$bindings?: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
declare const PopoverStack: $$__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,83 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { slide } from 'svelte/transition';
|
|
3
|
+
|
|
4
|
+
import { Icon, toast } from '../index.js';
|
|
5
|
+
import { cn } from '../utils/class-names.js';
|
|
6
|
+
import { popover } from '../utils/popover.js';
|
|
7
|
+
import {
|
|
8
|
+
CheckmarkCircle24RegularIcon,
|
|
9
|
+
Dismiss24RegularIcon,
|
|
10
|
+
DismissCircle24RegularIcon,
|
|
11
|
+
Info24RegularIcon,
|
|
12
|
+
Warning24RegularIcon
|
|
13
|
+
} from '../icons/index.js';
|
|
14
|
+
|
|
15
|
+
type Props = {
|
|
16
|
+
class?: string;
|
|
17
|
+
position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
18
|
+
showIcon?: boolean;
|
|
19
|
+
isSolid?: boolean;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const { class: className, position = 'bottom-left', isSolid, showIcon }: Props = $props();
|
|
23
|
+
|
|
24
|
+
const positionClasses = {
|
|
25
|
+
'top-left': 'is-top-left',
|
|
26
|
+
'top-right': 'is-top-right',
|
|
27
|
+
'bottom-left': 'is-bottom-left',
|
|
28
|
+
'bottom-right': 'is-bottom-right'
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const status = {
|
|
32
|
+
info: 'is-info',
|
|
33
|
+
success: 'is-success',
|
|
34
|
+
warning: 'is-warning',
|
|
35
|
+
danger: 'is-danger'
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const icons = {
|
|
39
|
+
info: 'fluent:error-circle-24-regular',
|
|
40
|
+
success: 'fluent:checkmark-circle-24-regular',
|
|
41
|
+
warning: 'fluent:warning-24-regular',
|
|
42
|
+
danger: 'fluent:block-24-regular'
|
|
43
|
+
};
|
|
44
|
+
</script>
|
|
45
|
+
|
|
46
|
+
{#if toast.messages.length > 0}
|
|
47
|
+
<div
|
|
48
|
+
use:popover
|
|
49
|
+
transition:slide
|
|
50
|
+
class={cn('toast-container', positionClasses[position], className)}
|
|
51
|
+
>
|
|
52
|
+
{#each toast.messages as message, index (message.id)}
|
|
53
|
+
<div
|
|
54
|
+
transition:slide
|
|
55
|
+
class={cn('toast', status[message.status], (message.isSolid || isSolid) && 'is-solid')}
|
|
56
|
+
style="--toast-index: {index}; --toast-total: {toast.messages.length}"
|
|
57
|
+
>
|
|
58
|
+
{#if showIcon}
|
|
59
|
+
{#if message.status === 'info'}
|
|
60
|
+
<Icon icon={Info24RegularIcon} class="toast-icon" />
|
|
61
|
+
{:else if message.status === 'success'}
|
|
62
|
+
<Icon icon={CheckmarkCircle24RegularIcon} class="toast-icon" />
|
|
63
|
+
{:else if message.status === 'warning'}
|
|
64
|
+
<Icon icon={Warning24RegularIcon} class="toast-icon" />
|
|
65
|
+
{:else if message.status === 'danger'}
|
|
66
|
+
<Icon icon={DismissCircle24RegularIcon} class="toast-icon" />
|
|
67
|
+
{/if}
|
|
68
|
+
{/if}
|
|
69
|
+
<div class="toast-content">
|
|
70
|
+
{#if message.title}
|
|
71
|
+
<div class="toast-title">{message.title}</div>
|
|
72
|
+
{/if}
|
|
73
|
+
<div class="toast-description">{message.description}</div>
|
|
74
|
+
</div>
|
|
75
|
+
<div class="btn-close">
|
|
76
|
+
<button onclick={() => toast.close(message.id)}>
|
|
77
|
+
<Icon icon={Dismiss24RegularIcon} class="btn-close-icon" />
|
|
78
|
+
</button>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
{/each}
|
|
82
|
+
</div>
|
|
83
|
+
{/if}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type Props = {
|
|
2
|
+
class?: string;
|
|
3
|
+
position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
4
|
+
showIcon?: boolean;
|
|
5
|
+
isSolid?: boolean;
|
|
6
|
+
};
|
|
7
|
+
declare const Toast: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type Toast = ReturnType<typeof Toast>;
|
|
9
|
+
export default Toast;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../utils/class-names.js';
|
|
3
|
+
import { onMount } from 'svelte';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
|
|
6
|
+
type Props = {
|
|
7
|
+
label: string;
|
|
8
|
+
children: Snippet;
|
|
9
|
+
variant?: 'primary' | 'secondary' | 'muted';
|
|
10
|
+
position?: 'top' | 'bottom' | 'start' | 'end';
|
|
11
|
+
isSolid?: boolean;
|
|
12
|
+
class?: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
label,
|
|
17
|
+
children,
|
|
18
|
+
variant = 'primary',
|
|
19
|
+
position = 'top',
|
|
20
|
+
isSolid = false,
|
|
21
|
+
class: className
|
|
22
|
+
}: Props = $props();
|
|
23
|
+
|
|
24
|
+
let isOpen = $state(false);
|
|
25
|
+
let triggerElement = $state<HTMLElement>();
|
|
26
|
+
let tooltipElement = $state<HTMLElement>();
|
|
27
|
+
let tooltipPosition = $state({
|
|
28
|
+
top: 0,
|
|
29
|
+
left: 0
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const style = $derived(`top: ${tooltipPosition.top}px; left: ${tooltipPosition.left}px;`);
|
|
33
|
+
|
|
34
|
+
const variantClasses = {
|
|
35
|
+
primary: 'is-primary',
|
|
36
|
+
secondary: 'is-secondary',
|
|
37
|
+
muted: 'is-muted'
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const positionClasses = {
|
|
41
|
+
top: 'position-top',
|
|
42
|
+
bottom: 'position-bottom',
|
|
43
|
+
start: 'position-start',
|
|
44
|
+
end: 'position-end'
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const updatePosition = () => {
|
|
48
|
+
if (!triggerElement || !tooltipElement) return;
|
|
49
|
+
|
|
50
|
+
const triggerRect = triggerElement.getBoundingClientRect();
|
|
51
|
+
const tooltipRect = tooltipElement.getBoundingClientRect();
|
|
52
|
+
const gap = 8;
|
|
53
|
+
|
|
54
|
+
let top = 0;
|
|
55
|
+
let left = 0;
|
|
56
|
+
|
|
57
|
+
switch (position) {
|
|
58
|
+
case 'top':
|
|
59
|
+
top = triggerRect.top - tooltipRect.height - gap;
|
|
60
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
|
|
61
|
+
break;
|
|
62
|
+
case 'bottom':
|
|
63
|
+
top = triggerRect.bottom + gap;
|
|
64
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
|
|
65
|
+
break;
|
|
66
|
+
case 'start':
|
|
67
|
+
top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
|
|
68
|
+
left = triggerRect.left - tooltipRect.width - gap;
|
|
69
|
+
break;
|
|
70
|
+
case 'end':
|
|
71
|
+
top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
|
|
72
|
+
left = triggerRect.right + gap;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
top += window.scrollY;
|
|
77
|
+
left += window.scrollX;
|
|
78
|
+
|
|
79
|
+
const padding = 8;
|
|
80
|
+
if (left < padding) left = padding;
|
|
81
|
+
if (left + tooltipRect.width > window.innerWidth - padding) {
|
|
82
|
+
left = window.innerWidth - tooltipRect.width - padding;
|
|
83
|
+
}
|
|
84
|
+
if (top < padding) top = padding;
|
|
85
|
+
if (top + tooltipRect.height > window.innerHeight + window.scrollY - padding) {
|
|
86
|
+
top = window.innerHeight + window.scrollY - tooltipRect.height - padding;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
tooltipPosition = { top, left };
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const handleMouseEnter = () => {
|
|
93
|
+
isOpen = true;
|
|
94
|
+
setTimeout(updatePosition, 0);
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const handleMouseLeave = () => {
|
|
98
|
+
isOpen = false;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const startEventListeners = () => {
|
|
102
|
+
window.addEventListener('resize', updatePosition);
|
|
103
|
+
window.addEventListener('scroll', updatePosition, true);
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const stopEventListeners = () => {
|
|
107
|
+
window.removeEventListener('resize', updatePosition);
|
|
108
|
+
window.removeEventListener('scroll', updatePosition, true);
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
onMount(() => {
|
|
112
|
+
startEventListeners();
|
|
113
|
+
return () => stopEventListeners();
|
|
114
|
+
});
|
|
115
|
+
</script>
|
|
116
|
+
|
|
117
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
118
|
+
<div
|
|
119
|
+
class={cn('tooltip', className)}
|
|
120
|
+
bind:this={triggerElement}
|
|
121
|
+
onmouseenter={handleMouseEnter}
|
|
122
|
+
onmouseleave={handleMouseLeave}
|
|
123
|
+
>
|
|
124
|
+
{@render children()}
|
|
125
|
+
|
|
126
|
+
<div
|
|
127
|
+
bind:this={tooltipElement}
|
|
128
|
+
class={cn(
|
|
129
|
+
'tooltip-popover',
|
|
130
|
+
variantClasses[variant],
|
|
131
|
+
positionClasses[position],
|
|
132
|
+
isSolid && 'is-solid',
|
|
133
|
+
isOpen && 'is-active'
|
|
134
|
+
)}
|
|
135
|
+
{style}
|
|
136
|
+
>
|
|
137
|
+
<div class={cn('tooltip-arrow', variantClasses[variant], isSolid && 'is-solid')}></div>
|
|
138
|
+
{label}
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
type Props = {
|
|
3
|
+
label: string;
|
|
4
|
+
children: Snippet;
|
|
5
|
+
variant?: 'primary' | 'secondary' | 'muted';
|
|
6
|
+
position?: 'top' | 'bottom' | 'start' | 'end';
|
|
7
|
+
isSolid?: boolean;
|
|
8
|
+
class?: string;
|
|
9
|
+
};
|
|
10
|
+
declare const Tooltip: import("svelte").Component<Props, {}, "">;
|
|
11
|
+
type Tooltip = ReturnType<typeof Tooltip>;
|
|
12
|
+
export default Tooltip;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.drawer-panel {
|
|
3
|
+
@apply fixed inset-0 z-50;
|
|
4
|
+
@apply flex flex-col justify-center items-center;
|
|
5
|
+
|
|
6
|
+
.drawer-overlay {
|
|
7
|
+
@apply absolute inset-0 bg-overlay;
|
|
8
|
+
}
|
|
9
|
+
.drawer {
|
|
10
|
+
@apply absolute bg-surface flex flex-col;
|
|
11
|
+
@apply transition-all duration-300 ease-in-out;
|
|
12
|
+
|
|
13
|
+
&.is-start {
|
|
14
|
+
@apply inset-y-0 left-0 right-auto rounded-r-ui;
|
|
15
|
+
@apply transform -translate-x-full;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
&.is-end {
|
|
19
|
+
@apply inset-y-0 right-0 left-auto rounded-l-ui;
|
|
20
|
+
@apply transform translate-x-full;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&.is-top {
|
|
24
|
+
@apply inset-x-0 top-0 bottom-auto rounded-b-ui;
|
|
25
|
+
@apply transform -translate-y-full;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
&.is-bottom {
|
|
29
|
+
@apply inset-x-0 bottom-0 top-auto rounded-t-ui;
|
|
30
|
+
@apply transform translate-y-full;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
&.is-active {
|
|
34
|
+
@apply transform translate-x-0! translate-y-0!;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
&.is-ghost {
|
|
38
|
+
@apply bg-background text-on-background;
|
|
39
|
+
}
|
|
40
|
+
&.is-surface {
|
|
41
|
+
@apply bg-surface text-on-surface;
|
|
42
|
+
}
|
|
43
|
+
&.is-primary {
|
|
44
|
+
@apply bg-on-primary text-primary;
|
|
45
|
+
}
|
|
46
|
+
&.is-secondary {
|
|
47
|
+
@apply bg-on-secondary text-secondary;
|
|
48
|
+
}
|
|
49
|
+
&.is-muted {
|
|
50
|
+
@apply bg-muted text-on-muted;
|
|
51
|
+
}
|
|
52
|
+
&.is-primary.is-solid {
|
|
53
|
+
@apply bg-primary text-on-primary;
|
|
54
|
+
}
|
|
55
|
+
&.is-secondary.is-solid {
|
|
56
|
+
@apply bg-secondary text-on-secondary;
|
|
57
|
+
}
|
|
58
|
+
&.is-muted.is-solid {
|
|
59
|
+
@apply bg-on-muted text-muted;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.drawer-header {
|
|
63
|
+
@apply row gap-3 p-3;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.drawer-footer {
|
|
67
|
+
@apply row gap-3 p-3;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.drawer-body {
|
|
71
|
+
@apply flex min-h-0 flex-1 flex-col gap-3 p-3 overflow-auto;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.dropdown {
|
|
3
|
+
@apply relative inline-flex w-fit cursor-pointer select-none;
|
|
4
|
+
}
|
|
5
|
+
.dropdown-popover {
|
|
6
|
+
@apply overflow-y-auto flex flex-col gap-2 p-2 my-1;
|
|
7
|
+
@apply bg-background text-on-background rounded-ui;
|
|
8
|
+
@apply invisible opacity-0 transition-opacity duration-300 ease-in-out;
|
|
9
|
+
@apply shadow shadow-muted;
|
|
10
|
+
position: fixed;
|
|
11
|
+
z-index: 9999;
|
|
12
|
+
|
|
13
|
+
&.is-active {
|
|
14
|
+
@apply visible opacity-100;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
.dropdown-options {
|
|
18
|
+
@apply flex flex-1 w-full min-w-0 flex-col gap-1 overflow-y-auto scrollbar-hide;
|
|
19
|
+
|
|
20
|
+
.dropdown-options-divider {
|
|
21
|
+
@apply my-1 h-px w-full bg-muted;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.hovercard {
|
|
3
|
+
@apply relative inline-flex w-fit;
|
|
4
|
+
}
|
|
5
|
+
.hovercard-content {
|
|
6
|
+
@apply overflow-y-auto drop-shadow-sm flex flex-col gap-2 my-1;
|
|
7
|
+
@apply bg-background text-on-background border border-muted rounded-ui;
|
|
8
|
+
position: fixed;
|
|
9
|
+
z-index: 9999;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.modal-dialog {
|
|
3
|
+
@apply fixed inset-0 z-50;
|
|
4
|
+
@apply flex flex-col justify-center items-center;
|
|
5
|
+
.modal-overlay {
|
|
6
|
+
@apply absolute inset-0 bg-overlay;
|
|
7
|
+
}
|
|
8
|
+
.modal {
|
|
9
|
+
@apply relative flex flex-col gap-4 md:gap-6 rounded-ui py-4 md:py-6 max-w-[95vw] max-h-[95vh] overflow-hidden overflow-y-auto;
|
|
10
|
+
|
|
11
|
+
&.is-ghost {
|
|
12
|
+
@apply bg-background text-on-background;
|
|
13
|
+
}
|
|
14
|
+
&.is-surface {
|
|
15
|
+
@apply bg-surface text-on-surface;
|
|
16
|
+
}
|
|
17
|
+
&.is-primary {
|
|
18
|
+
@apply bg-on-primary text-primary;
|
|
19
|
+
}
|
|
20
|
+
&.is-secondary {
|
|
21
|
+
@apply bg-on-secondary text-secondary;
|
|
22
|
+
}
|
|
23
|
+
&.is-muted {
|
|
24
|
+
@apply bg-muted text-on-muted;
|
|
25
|
+
}
|
|
26
|
+
&.is-primary.is-solid {
|
|
27
|
+
@apply bg-primary text-on-primary;
|
|
28
|
+
}
|
|
29
|
+
&.is-secondary.is-solid {
|
|
30
|
+
@apply bg-secondary text-on-secondary;
|
|
31
|
+
}
|
|
32
|
+
&.is-muted.is-solid {
|
|
33
|
+
@apply bg-on-muted text-muted;
|
|
34
|
+
}
|
|
35
|
+
.modal-content {
|
|
36
|
+
@apply px-4 md:px-6;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.modal-header {
|
|
40
|
+
@apply grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-4 md:px-6;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.modal-footer {
|
|
44
|
+
@apply [.border-t]:pt-4 md:[.border-t]:pt-6 flex items-center px-4 md:px-6;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
.modal-btn-close {
|
|
48
|
+
@apply absolute top-1 right-1 float-right z-50 size-6 p-1 hover:bg-muted rounded-full flex items-center justify-center text-on-muted hover:text-danger cursor-pointer;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.toast-container {
|
|
3
|
+
@apply fixed z-50 pointer-events-none;
|
|
4
|
+
max-width: 420px;
|
|
5
|
+
width: 100%;
|
|
6
|
+
perspective: 1000px;
|
|
7
|
+
min-height: 80px;
|
|
8
|
+
|
|
9
|
+
&.is-top-left {
|
|
10
|
+
@apply top-4 left-1/2 lg:left-4 -translate-x-1/2 lg:translate-x-0;
|
|
11
|
+
}
|
|
12
|
+
&.is-top-right {
|
|
13
|
+
@apply top-4 right-1/2 lg:right-4 translate-x-1/2 lg:translate-x-0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
&.is-bottom-left {
|
|
17
|
+
@apply bottom-4 left-1/2 lg:left-4 -translate-x-1/2 lg:translate-x-0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
&.is-bottom-right {
|
|
21
|
+
@apply bottom-4 right-1/2 lg:right-4 translate-x-1/2 lg:translate-x-0;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.toast {
|
|
26
|
+
@apply absolute inset-x-0 flex items-center gap-3 p-4 pointer-events-auto rounded-ui;
|
|
27
|
+
@apply transition-all duration-300 ease-out shadow-sm;
|
|
28
|
+
|
|
29
|
+
transform: translateY(calc((var(--toast-total) - var(--toast-index) - 1) * -8px))
|
|
30
|
+
scale(calc(1 - (var(--toast-total) - var(--toast-index) - 1) * 0.05));
|
|
31
|
+
opacity: calc(1 - (var(--toast-total) - var(--toast-index) - 1) * 0.2);
|
|
32
|
+
z-index: calc(50 + var(--toast-index));
|
|
33
|
+
|
|
34
|
+
&.is-success {
|
|
35
|
+
@apply bg-on-success text-success;
|
|
36
|
+
|
|
37
|
+
&.is-solid {
|
|
38
|
+
@apply bg-success text-on-success;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
&.is-danger {
|
|
43
|
+
@apply bg-on-danger text-danger;
|
|
44
|
+
|
|
45
|
+
&.is-solid {
|
|
46
|
+
@apply bg-danger text-on-danger;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
&.is-warning {
|
|
51
|
+
@apply bg-on-warning text-warning;
|
|
52
|
+
|
|
53
|
+
&.is-solid {
|
|
54
|
+
@apply bg-warning text-on-warning;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
&.is-info {
|
|
59
|
+
@apply bg-on-info text-info;
|
|
60
|
+
|
|
61
|
+
&.is-solid {
|
|
62
|
+
@apply bg-info text-on-info;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.toast-icon {
|
|
67
|
+
@apply h-8 w-auto;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.toast-content {
|
|
71
|
+
@apply flex-1 flex flex-col gap-1;
|
|
72
|
+
.toast-title {
|
|
73
|
+
@apply text-sm font-semibold leading-tight;
|
|
74
|
+
}
|
|
75
|
+
.toast-description {
|
|
76
|
+
@apply text-sm leading-relaxed opacity-90;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|