@svelte-atoms/core 1.0.0-alpha.44 → 1.0.0-alpha.46
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 +13 -0
- package/dist/components/accordion/item/accordion-item-body.svelte +5 -8
- package/dist/components/accordion/item/accordion-item-header.svelte +0 -13
- package/dist/components/accordion/item/accordion-item-indicator.svelte +0 -12
- package/dist/components/accordion/item/accordion-item-root.svelte +0 -12
- package/dist/components/alert/alert-actions.svelte +0 -12
- package/dist/components/alert/alert-close-button.svelte +0 -12
- package/dist/components/alert/alert-content.svelte +0 -12
- package/dist/components/alert/alert-description.svelte +0 -12
- package/dist/components/alert/alert-icon.svelte +0 -12
- package/dist/components/alert/alert-root.svelte +1 -13
- package/dist/components/alert/alert-title.svelte +0 -12
- package/dist/components/atom/html-atom.svelte +31 -17
- package/dist/components/atom/types.d.ts +9 -0
- package/dist/components/atom/utils/base.d.ts +6 -0
- package/dist/components/atom/utils/base.js +8 -0
- package/dist/components/atom/utils/cache.d.ts +17 -0
- package/dist/components/atom/utils/cache.js +134 -0
- package/dist/components/atom/utils/classes.d.ts +14 -0
- package/dist/components/atom/utils/classes.js +42 -0
- package/dist/components/atom/utils/constants.d.ts +9 -0
- package/dist/components/atom/utils/constants.js +9 -0
- package/dist/components/atom/utils/index.d.ts +6 -0
- package/dist/components/atom/utils/index.js +5 -0
- package/dist/components/atom/utils/preset.d.ts +22 -0
- package/dist/components/atom/utils/preset.js +94 -0
- package/dist/components/atom/utils/props.d.ts +13 -0
- package/dist/components/atom/utils/props.js +60 -0
- package/dist/components/atom/utils/variants.d.ts +31 -0
- package/dist/components/atom/utils/variants.js +270 -0
- package/dist/components/card/card-body.svelte +0 -12
- package/dist/components/card/card-description.svelte +0 -12
- package/dist/components/card/card-footer.svelte +0 -12
- package/dist/components/card/card-header.svelte +0 -12
- package/dist/components/card/card-media.svelte +0 -12
- package/dist/components/card/card-root.svelte +0 -12
- package/dist/components/card/card-subtitle.svelte +0 -12
- package/dist/components/card/card-title.svelte +0 -12
- package/dist/components/collapsible/collapsible-body.svelte +5 -12
- package/dist/components/collapsible/collapsible-header.svelte +0 -12
- package/dist/components/collapsible/collapsible-indicator.svelte +0 -12
- package/dist/components/collapsible/collapsible-root.svelte +0 -12
- package/dist/components/combobox/combobox-control.svelte +0 -12
- package/dist/components/combobox/combobox-item.svelte +0 -12
- package/dist/components/combobox/combobox-item.svelte.d.ts +0 -6
- package/dist/components/combobox/index.d.ts +1 -1
- package/dist/components/container/container.svelte +0 -12
- package/dist/components/datagrid/column/datagrid-column-sort-icon.svelte +3 -12
- package/dist/components/datagrid/column/datagrid-column-sort-icon.svelte.d.ts +0 -6
- package/dist/components/datagrid/datagrid-body.svelte +17 -1
- package/dist/components/dialog/dialog-body.svelte +0 -12
- package/dist/components/dialog/dialog-close-button.svelte +0 -12
- package/dist/components/dialog/dialog-close.svelte +0 -12
- package/dist/components/dialog/dialog-content.svelte +4 -12
- package/dist/components/dialog/dialog-description.svelte +0 -12
- package/dist/components/dialog/dialog-footer.svelte +0 -12
- package/dist/components/dialog/dialog-header.svelte +0 -12
- package/dist/components/dialog/dialog-title.svelte +0 -12
- package/dist/components/dialog/index.d.ts +3 -0
- package/dist/components/dialog/index.js +3 -0
- package/dist/components/drawer/drawer-backdrop.svelte +0 -12
- package/dist/components/drawer/drawer-body.svelte +0 -12
- package/dist/components/drawer/drawer-content.svelte +5 -12
- package/dist/components/drawer/drawer-description.svelte +0 -12
- package/dist/components/drawer/drawer-footer.svelte +0 -12
- package/dist/components/drawer/drawer-header.svelte +0 -12
- package/dist/components/drawer/drawer-root.svelte +5 -4
- package/dist/components/drawer/drawer-title.svelte +0 -12
- package/dist/components/dropdown/dropdown-placeholder.svelte +0 -6
- package/dist/components/dropdown/dropdown-placeholder.svelte.d.ts +0 -6
- package/dist/components/dropdown/dropdown-query.svelte +0 -12
- package/dist/components/dropdown-menu/bond.svelte.d.ts +0 -4
- package/dist/components/dropdown-menu/dropdown-menu-content.svelte +0 -12
- package/dist/components/dropdown-menu/dropdown-menu-content.svelte.d.ts +0 -6
- package/dist/components/dropdown-menu/index.d.ts +1 -1
- package/dist/components/form/field/bond.svelte.d.ts +29 -17
- package/dist/components/form/field/bond.svelte.js +73 -49
- package/dist/components/form/field/field-control.svelte +21 -18
- package/dist/components/form/field/field-label.svelte +2 -2
- package/dist/components/form/field/field-root.svelte +2 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.js +2 -0
- package/dist/components/input/input-file-control.svelte +0 -12
- package/dist/components/input/input-icon.svelte +3 -3
- package/dist/components/input/input-number-control.svelte +28 -35
- package/dist/components/input/input-text-control.svelte +8 -3
- package/dist/components/input/input-url-control.svelte +2 -2
- package/dist/components/input/types.d.ts +4 -4
- package/dist/components/kbd/index.d.ts +3 -0
- package/dist/components/kbd/index.js +3 -0
- package/dist/components/kbd/kbd.svelte +19 -0
- package/dist/components/kbd/kbd.svelte.d.ts +4 -0
- package/dist/components/kbd/shortcut.svelte +38 -0
- package/dist/components/kbd/shortcut.svelte.d.ts +4 -0
- package/dist/components/kbd/types.d.ts +20 -0
- package/dist/components/kbd/types.js +1 -0
- package/dist/components/layer/layer-inner.svelte +0 -12
- package/dist/components/layer/layer-root.svelte +0 -12
- package/dist/components/menu/menu-content.svelte +0 -12
- package/dist/components/menu/menu-content.svelte.d.ts +0 -6
- package/dist/components/popover/bond.svelte.d.ts +29 -1
- package/dist/components/popover/bond.svelte.js +55 -2
- package/dist/components/popover/index.d.ts +1 -0
- package/dist/components/popover/index.js +1 -0
- package/dist/components/popover/popover-arrow.svelte +4 -2
- package/dist/components/popover/popover-content.svelte +17 -90
- package/dist/components/popover/popover-overlay.svelte +98 -0
- package/dist/components/popover/popover-overlay.svelte.d.ts +4 -0
- package/dist/components/popover/popover-trigger.svelte +9 -0
- package/dist/components/popover/strategies/floating.svelte +10 -10
- package/dist/components/popover/types.d.ts +7 -2
- package/dist/components/portal/portal-inner.svelte +0 -12
- package/dist/components/portal/portal-root.svelte +0 -12
- package/dist/components/portal/types.d.ts +1 -1
- package/dist/components/progress/index.d.ts +3 -0
- package/dist/components/progress/index.js +3 -0
- package/dist/components/progress/progress-circular.svelte +99 -0
- package/dist/components/progress/progress-circular.svelte.d.ts +6 -0
- package/dist/components/progress/progress-linear.svelte +66 -0
- package/dist/components/progress/progress-linear.svelte.d.ts +6 -0
- package/dist/components/progress/types.d.ts +18 -0
- package/dist/components/progress/types.js +1 -0
- package/dist/components/scrollable/scrollable-container.svelte +0 -12
- package/dist/components/scrollable/scrollable-content.svelte +0 -12
- package/dist/components/scrollable/scrollable-root.svelte +0 -12
- package/dist/components/scrollable/scrollable-thumb.svelte +1 -12
- package/dist/components/scrollable/scrollable-track.svelte +0 -12
- package/dist/components/select/bond.svelte.d.ts +0 -4
- package/dist/components/select/index.d.ts +1 -1
- package/dist/components/select/select-placeholder.svelte +0 -6
- package/dist/components/select/select-placeholder.svelte.d.ts +0 -6
- package/dist/components/sidebar/sidebar-content.svelte +5 -12
- package/dist/components/stack/bond.svelte.js +6 -0
- package/dist/components/stack/stack-item.svelte +4 -0
- package/dist/components/switch/switch.svelte +2 -0
- package/dist/components/tabs/tab/tab-header.svelte +4 -4
- package/dist/components/tabs/tabs-body.svelte +0 -2
- package/dist/components/tabs/tabs-root.svelte +11 -3
- package/dist/components/toast/atoms.d.ts +1 -1
- package/dist/components/toast/atoms.js +1 -1
- package/dist/components/toast/attachments.svelte.d.ts +10 -2
- package/dist/components/toast/attachments.svelte.js +9 -1
- package/dist/components/toast/bond.svelte.d.ts +73 -0
- package/dist/components/toast/bond.svelte.js +132 -0
- package/dist/components/toast/index.d.ts +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/toast/toast-close.svelte +47 -0
- package/dist/components/toast/toast-close.svelte.d.ts +26 -0
- package/dist/components/toast/toast-description.svelte +16 -24
- package/dist/components/toast/toast-description.svelte.d.ts +15 -19
- package/dist/components/toast/toast-root.svelte +36 -26
- package/dist/components/toast/toast-root.svelte.d.ts +16 -15
- package/dist/components/toast/toast-title.svelte +17 -22
- package/dist/components/toast/toast-title.svelte.d.ts +13 -13
- package/dist/components/toast/toaster.svelte.d.ts +38 -0
- package/dist/components/toast/toaster.svelte.js +107 -0
- package/dist/components/toast/types.d.ts +13 -21
- package/dist/components/tree/tree-body.svelte +5 -12
- package/dist/components/tree/tree-header.svelte +0 -12
- package/dist/components/tree/tree-indicator.svelte +0 -12
- package/dist/components/tree/tree-root.svelte +0 -12
- package/dist/context/preset.svelte.d.ts +53 -37
- package/dist/context/preset.svelte.js +29 -3
- package/package.json +1 -1
- package/dist/components/atom/utils.d.ts +0 -44
- package/dist/components/atom/utils.js +0 -275
- package/dist/components/popover/popover-engine.svelte +0 -118
- package/dist/components/popover/popover-engine.svelte.d.ts +0 -3
- package/dist/components/toast/bond.d.ts +0 -35
- package/dist/components/toast/bond.js +0 -59
- package/dist/components/toast/manager.svelte.d.ts +0 -38
- package/dist/components/toast/manager.svelte.js +0 -82
- package/dist/components/toast/toast-root-managed.svelte +0 -64
- package/dist/components/toast/toast-root-managed.svelte.d.ts +0 -7
- package/dist/components/toast/toast-toaster.svelte +0 -42
- package/dist/components/toast/toast-toaster.svelte.d.ts +0 -4
- /package/dist/components/popover/{motion.d.ts → motion.svelte.d.ts} +0 -0
- /package/dist/components/popover/{motion.js → motion.svelte.js} +0 -0
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { autoUpdate, ComputePositionConfig } from "@floating-ui/dom";
|
|
3
|
-
import { PopoverBond, type PopoverParams } from "./bond.svelte";
|
|
4
|
-
import { offset } from "@floating-ui/dom";
|
|
5
|
-
import { flip } from "svelte/animate";
|
|
6
|
-
import { shift } from "@floating-ui/dom";
|
|
7
|
-
import { computePosition } from "@floating-ui/dom";
|
|
8
|
-
|
|
9
|
-
const bond = PopoverBond.get();
|
|
10
|
-
const placement = $derived(bond?.state.props.placement);
|
|
11
|
-
const placements = $derived(bond?.state.props.placements);
|
|
12
|
-
const offsetValue = $derived(bond?.state.props.offset);
|
|
13
|
-
const portal = $derived(bond?.state.props.portal);
|
|
14
|
-
|
|
15
|
-
let {} = $props();
|
|
16
|
-
|
|
17
|
-
$effect.pre(() => {
|
|
18
|
-
if(!bond) {
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const trigger = bond.elements.trigger;
|
|
23
|
-
if(!trigger) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
const content = bond.elements.content;
|
|
27
|
-
if(!content) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
function popover(bond: PopoverBond) {
|
|
36
|
-
return (props: Record<string, unknown>, updater?: typeof autoUpdate) => {
|
|
37
|
-
const { offset: ofs, placements, placement } = bond.state.props;
|
|
38
|
-
|
|
39
|
-
// Guard: ensure required elements exist
|
|
40
|
-
if (!bond.elements.content || !bond.elements.trigger) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const { content, trigger, arrow: arrowElement } = bond.elements;
|
|
45
|
-
|
|
46
|
-
// Build middleware stack
|
|
47
|
-
const middleware: ComputePositionConfig['middleware'] = [
|
|
48
|
-
offset(ofs),
|
|
49
|
-
flip({
|
|
50
|
-
fallbackPlacements: placements,
|
|
51
|
-
padding: 8,
|
|
52
|
-
crossAxis: true,
|
|
53
|
-
fallbackStrategy: 'bestFit',
|
|
54
|
-
|
|
55
|
-
}),
|
|
56
|
-
shift({
|
|
57
|
-
padding: 8,
|
|
58
|
-
limiter: {
|
|
59
|
-
fn: (state) => {
|
|
60
|
-
const { x, y } = state;
|
|
61
|
-
return {
|
|
62
|
-
x,
|
|
63
|
-
y
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
})
|
|
68
|
-
];
|
|
69
|
-
|
|
70
|
-
// Add arrow middleware if element exists
|
|
71
|
-
if (arrowElement) {
|
|
72
|
-
middleware.push(arrow({ element: arrowElement }));
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Debounce position change callback
|
|
76
|
-
const onchangeCallback = props.onchange as PopoverParams['onchange'];
|
|
77
|
-
|
|
78
|
-
// Compute position and notify listeners
|
|
79
|
-
const compute = async () => {
|
|
80
|
-
// Wait for next frame to ensure DOM has settled and styles are applied
|
|
81
|
-
// Double requestAnimationFrame - This ensures the browser has completed both layout calculation AND painting, giving us accurate final dimensions
|
|
82
|
-
await new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve)));
|
|
83
|
-
|
|
84
|
-
const position = await computePosition(trigger, content, {
|
|
85
|
-
placement: placement ?? 'bottom',
|
|
86
|
-
middleware
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
// Round to 0.001 precision to avoid excessive updates from sub-pixel changes
|
|
90
|
-
const x = Math.round((position.x ?? 0) * 100) / 100;
|
|
91
|
-
const y = Math.round((position.y ?? 0) * 100) / 100;
|
|
92
|
-
|
|
93
|
-
bond.state.position = {
|
|
94
|
-
middlewareData: position.middlewareData,
|
|
95
|
-
placement: position.placement,
|
|
96
|
-
strategy: position.strategy,
|
|
97
|
-
x,
|
|
98
|
-
y
|
|
99
|
-
};
|
|
100
|
-
onchangeCallback?.(content, position);
|
|
101
|
-
|
|
102
|
-
// Set minimum width to match trigger
|
|
103
|
-
requestAnimationFrame(() => {
|
|
104
|
-
content.style.minWidth = `${trigger.clientWidth}px`;
|
|
105
|
-
});
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
// Use auto-update if provided, otherwise compute once
|
|
109
|
-
if (updater) {
|
|
110
|
-
return updater(trigger, content, compute, {
|
|
111
|
-
ancestorScroll: false
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
compute();
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
</script>
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { Bond, BondState, type BondStateProps } from '../../shared/bond.svelte';
|
|
2
|
-
export type ToastBondProps = BondStateProps & {
|
|
3
|
-
open: boolean;
|
|
4
|
-
disabled: boolean;
|
|
5
|
-
extend?: Record<string, unknown>;
|
|
6
|
-
};
|
|
7
|
-
export type ToastBondElements = {
|
|
8
|
-
root: HTMLElement;
|
|
9
|
-
title: HTMLElement;
|
|
10
|
-
description: HTMLElement;
|
|
11
|
-
};
|
|
12
|
-
export declare class ToastBond<Props extends ToastBondProps = ToastBondProps, State extends ToastBondState<Props> = ToastBondState<Props>> extends Bond<Props, State, ToastBondElements> {
|
|
13
|
-
static CONTEXT_KEY: string;
|
|
14
|
-
constructor(s: State);
|
|
15
|
-
share(): this;
|
|
16
|
-
root(props?: Record<string, unknown>): {
|
|
17
|
-
id: string;
|
|
18
|
-
'aria-labeledby': string;
|
|
19
|
-
'aria-describedby': string;
|
|
20
|
-
'aria-disabled': boolean;
|
|
21
|
-
};
|
|
22
|
-
title(props?: Record<string, unknown>): {
|
|
23
|
-
id: string;
|
|
24
|
-
};
|
|
25
|
-
description(props?: Record<string, unknown>): {
|
|
26
|
-
id: string;
|
|
27
|
-
};
|
|
28
|
-
static get(): ToastBond | undefined;
|
|
29
|
-
static set(atom: ToastBond): ToastBond;
|
|
30
|
-
}
|
|
31
|
-
export declare class ToastBondState<Props extends ToastBondProps> extends BondState<Props> {
|
|
32
|
-
constructor(props: () => Props);
|
|
33
|
-
open(): void;
|
|
34
|
-
close(): void;
|
|
35
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { Bond, BondState } from '../../shared/bond.svelte';
|
|
2
|
-
import { getContext, setContext } from 'svelte';
|
|
3
|
-
import { createAttachmentKey } from 'svelte/attachments';
|
|
4
|
-
export class ToastBond extends Bond {
|
|
5
|
-
static CONTEXT_KEY = '@atoms/context/toast';
|
|
6
|
-
constructor(s) {
|
|
7
|
-
super(s);
|
|
8
|
-
}
|
|
9
|
-
share() {
|
|
10
|
-
return ToastBond.set(this);
|
|
11
|
-
}
|
|
12
|
-
root(props = {}) {
|
|
13
|
-
return {
|
|
14
|
-
id: `toast-root-${this.id}`,
|
|
15
|
-
'aria-labeledby': `toast-title-${this.id}`,
|
|
16
|
-
'aria-describedby': `toast-description-${this.id}`,
|
|
17
|
-
'aria-disabled': this.state.props.disabled ?? false,
|
|
18
|
-
...props,
|
|
19
|
-
[createAttachmentKey()]: (node) => {
|
|
20
|
-
this.elements.root = node;
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
title(props = {}) {
|
|
25
|
-
return {
|
|
26
|
-
id: `toast-title-${this.id}`,
|
|
27
|
-
...props,
|
|
28
|
-
[createAttachmentKey()]: (node) => {
|
|
29
|
-
this.elements.title = node;
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
description(props = {}) {
|
|
34
|
-
return {
|
|
35
|
-
id: `toast-description-${this.id}`,
|
|
36
|
-
...props,
|
|
37
|
-
[createAttachmentKey()]: (node) => {
|
|
38
|
-
this.elements.description = node;
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
static get() {
|
|
43
|
-
return getContext(this.CONTEXT_KEY);
|
|
44
|
-
}
|
|
45
|
-
static set(atom) {
|
|
46
|
-
return setContext(this.CONTEXT_KEY, atom);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
export class ToastBondState extends BondState {
|
|
50
|
-
constructor(props) {
|
|
51
|
-
super(props);
|
|
52
|
-
}
|
|
53
|
-
open() {
|
|
54
|
-
this.props.open = true;
|
|
55
|
-
}
|
|
56
|
-
close() {
|
|
57
|
-
this.props.open = false;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { ToastBond } from './bond';
|
|
2
|
-
export type ToastType = 'info' | 'success' | 'error' | 'warning' | 'default';
|
|
3
|
-
export type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
|
|
4
|
-
export interface ToastItem {
|
|
5
|
-
id: string;
|
|
6
|
-
type: ToastType;
|
|
7
|
-
title?: string | undefined;
|
|
8
|
-
description?: string | undefined;
|
|
9
|
-
duration: number;
|
|
10
|
-
dismissible: boolean;
|
|
11
|
-
bond: ToastBond;
|
|
12
|
-
open: boolean;
|
|
13
|
-
}
|
|
14
|
-
export interface ToastOptions {
|
|
15
|
-
id?: string;
|
|
16
|
-
description?: string;
|
|
17
|
-
duration?: number;
|
|
18
|
-
dismissible?: boolean;
|
|
19
|
-
}
|
|
20
|
-
declare class ToastManager {
|
|
21
|
-
#private;
|
|
22
|
-
get toasts(): ToastItem[];
|
|
23
|
-
add(title: string, type?: ToastType, options?: ToastOptions): string;
|
|
24
|
-
dismiss(id: string): void;
|
|
25
|
-
dismissAll(): void;
|
|
26
|
-
remove(id: string): void;
|
|
27
|
-
}
|
|
28
|
-
export declare const toastManager: ToastManager;
|
|
29
|
-
export declare function toast(title: string, options?: ToastOptions): string;
|
|
30
|
-
export declare namespace toast {
|
|
31
|
-
var info: (title: string, options?: ToastOptions) => string;
|
|
32
|
-
var success: (title: string, options?: ToastOptions) => string;
|
|
33
|
-
var error: (title: string, options?: ToastOptions) => string;
|
|
34
|
-
var warning: (title: string, options?: ToastOptions) => string;
|
|
35
|
-
var dismiss: (id: string) => void;
|
|
36
|
-
var dismissAll: () => void;
|
|
37
|
-
}
|
|
38
|
-
export {};
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { nanoid } from 'nanoid';
|
|
2
|
-
import { ToastBond, ToastBondState } from './bond';
|
|
3
|
-
import { defineProperty, defineState } from '../../utils';
|
|
4
|
-
const DEFAULT_DURATION = 4000;
|
|
5
|
-
class ToastManager {
|
|
6
|
-
#toasts = $state([]);
|
|
7
|
-
get toasts() {
|
|
8
|
-
return this.#toasts;
|
|
9
|
-
}
|
|
10
|
-
add(title, type = 'default', options = {}) {
|
|
11
|
-
const id = options.id ?? nanoid(8);
|
|
12
|
-
// If a toast with this id already exists, update it
|
|
13
|
-
const existing = this.#toasts.find((t) => t.id === id);
|
|
14
|
-
if (existing) {
|
|
15
|
-
existing.title = title;
|
|
16
|
-
existing.type = type;
|
|
17
|
-
if (options.description !== undefined)
|
|
18
|
-
existing.description = options.description;
|
|
19
|
-
return id;
|
|
20
|
-
}
|
|
21
|
-
const duration = options.duration ?? DEFAULT_DURATION;
|
|
22
|
-
const dismissible = options.dismissible ?? true;
|
|
23
|
-
let open = $state(true);
|
|
24
|
-
const bondProps = defineState([
|
|
25
|
-
defineProperty('open', () => open, (v) => {
|
|
26
|
-
open = v;
|
|
27
|
-
if (!v) {
|
|
28
|
-
// Remove after exit animation completes
|
|
29
|
-
setTimeout(() => this.remove(id), 300);
|
|
30
|
-
}
|
|
31
|
-
})
|
|
32
|
-
], () => ({ disabled: false, extend: {} }));
|
|
33
|
-
const bondState = new ToastBondState(() => bondProps);
|
|
34
|
-
const bond = new ToastBond(bondState);
|
|
35
|
-
const item = {
|
|
36
|
-
id,
|
|
37
|
-
type,
|
|
38
|
-
title,
|
|
39
|
-
description: options.description,
|
|
40
|
-
duration,
|
|
41
|
-
dismissible,
|
|
42
|
-
bond,
|
|
43
|
-
get open() {
|
|
44
|
-
return open;
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
this.#toasts.push(item);
|
|
48
|
-
// Auto-dismiss
|
|
49
|
-
if (duration > 0) {
|
|
50
|
-
setTimeout(() => {
|
|
51
|
-
open = false;
|
|
52
|
-
}, duration);
|
|
53
|
-
}
|
|
54
|
-
return id;
|
|
55
|
-
}
|
|
56
|
-
dismiss(id) {
|
|
57
|
-
const item = this.#toasts.find((t) => t.id === id);
|
|
58
|
-
if (item) {
|
|
59
|
-
item.bond.state.close();
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
dismissAll() {
|
|
63
|
-
for (const item of this.#toasts) {
|
|
64
|
-
item.bond.state.close();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
remove(id) {
|
|
68
|
-
this.#toasts = this.#toasts.filter((t) => t.id !== id);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
// Singleton manager instance
|
|
72
|
-
export const toastManager = new ToastManager();
|
|
73
|
-
// Imperative API
|
|
74
|
-
export function toast(title, options) {
|
|
75
|
-
return toastManager.add(title, 'default', options);
|
|
76
|
-
}
|
|
77
|
-
toast.info = (title, options) => toastManager.add(title, 'info', options);
|
|
78
|
-
toast.success = (title, options) => toastManager.add(title, 'success', options);
|
|
79
|
-
toast.error = (title, options) => toastManager.add(title, 'error', options);
|
|
80
|
-
toast.warning = (title, options) => toastManager.add(title, 'warning', options);
|
|
81
|
-
toast.dismiss = (id) => toastManager.dismiss(id);
|
|
82
|
-
toast.dismissAll = () => toastManager.dismissAll();
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { HtmlAtom } from '../atom';
|
|
3
|
-
import type { ToastItem } from './manager.svelte';
|
|
4
|
-
|
|
5
|
-
let { item }: { item: ToastItem } = $props();
|
|
6
|
-
|
|
7
|
-
const typeClasses: Record<string, string> = {
|
|
8
|
-
default: 'border-border bg-card text-foreground',
|
|
9
|
-
info: 'border-blue-200 bg-blue-50 text-blue-900 dark:border-blue-800 dark:bg-blue-950 dark:text-blue-100',
|
|
10
|
-
success: 'border-green-200 bg-green-50 text-green-900 dark:border-green-800 dark:bg-green-950 dark:text-green-100',
|
|
11
|
-
error: 'border-red-200 bg-red-50 text-red-900 dark:border-red-800 dark:bg-red-950 dark:text-red-100',
|
|
12
|
-
warning: 'border-yellow-200 bg-yellow-50 text-yellow-900 dark:border-yellow-800 dark:bg-yellow-950 dark:text-yellow-100'
|
|
13
|
-
};
|
|
14
|
-
</script>
|
|
15
|
-
|
|
16
|
-
<HtmlAtom
|
|
17
|
-
as="li"
|
|
18
|
-
{...item.bond.root()}
|
|
19
|
-
preset="toast.item"
|
|
20
|
-
class={[
|
|
21
|
-
'pointer-events-auto flex w-80 max-w-sm flex-col gap-1 rounded-md border p-4 shadow-md transition-all duration-200',
|
|
22
|
-
typeClasses[item.type] ?? typeClasses.default,
|
|
23
|
-
!item.open && 'opacity-0 translate-y-2',
|
|
24
|
-
'$preset'
|
|
25
|
-
]}
|
|
26
|
-
role="status"
|
|
27
|
-
aria-live="polite"
|
|
28
|
-
>
|
|
29
|
-
{#if item.title}
|
|
30
|
-
<HtmlAtom
|
|
31
|
-
as="p"
|
|
32
|
-
{...item.bond.title()}
|
|
33
|
-
preset="toast.title"
|
|
34
|
-
class={['font-medium text-sm leading-tight', '$preset']}
|
|
35
|
-
>
|
|
36
|
-
{item.title}
|
|
37
|
-
</HtmlAtom>
|
|
38
|
-
{/if}
|
|
39
|
-
|
|
40
|
-
{#if item.description}
|
|
41
|
-
<HtmlAtom
|
|
42
|
-
as="p"
|
|
43
|
-
{...item.bond.description()}
|
|
44
|
-
preset="toast.description"
|
|
45
|
-
class={['text-sm opacity-80', '$preset']}
|
|
46
|
-
>
|
|
47
|
-
{item.description}
|
|
48
|
-
</HtmlAtom>
|
|
49
|
-
{/if}
|
|
50
|
-
|
|
51
|
-
{#if item.dismissible}
|
|
52
|
-
<button
|
|
53
|
-
class="absolute top-2 right-2 rounded p-1 opacity-50 hover:opacity-100 transition-opacity"
|
|
54
|
-
type="button"
|
|
55
|
-
aria-label="Dismiss notification"
|
|
56
|
-
onclick={() => item.bond.state.close()}
|
|
57
|
-
>
|
|
58
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
59
|
-
<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
60
|
-
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
61
|
-
</svg>
|
|
62
|
-
</button>
|
|
63
|
-
{/if}
|
|
64
|
-
</HtmlAtom>
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { ToastItem } from './manager.svelte';
|
|
2
|
-
type $$ComponentProps = {
|
|
3
|
-
item: ToastItem;
|
|
4
|
-
};
|
|
5
|
-
declare const ToastRootManaged: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
6
|
-
type ToastRootManaged = ReturnType<typeof ToastRootManaged>;
|
|
7
|
-
export default ToastRootManaged;
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { HtmlAtom } from '../atom';
|
|
3
|
-
import { toastManager, type ToastPosition } from './manager.svelte';
|
|
4
|
-
import type { ToasterProps } from './types';
|
|
5
|
-
import ToastRootManaged from './toast-root-managed.svelte';
|
|
6
|
-
|
|
7
|
-
let {
|
|
8
|
-
class: klass = '',
|
|
9
|
-
position = 'bottom-right' as ToastPosition,
|
|
10
|
-
gap = 8,
|
|
11
|
-
...restProps
|
|
12
|
-
}: ToasterProps = $props();
|
|
13
|
-
|
|
14
|
-
const positionClasses: Record<ToastPosition, string> = {
|
|
15
|
-
'top-left': 'top-0 left-0 items-start',
|
|
16
|
-
'top-center': 'top-0 left-1/2 -translate-x-1/2 items-center',
|
|
17
|
-
'top-right': 'top-0 right-0 items-end',
|
|
18
|
-
'bottom-left': 'bottom-0 left-0 items-start',
|
|
19
|
-
'bottom-center': 'bottom-0 left-1/2 -translate-x-1/2 items-center',
|
|
20
|
-
'bottom-right': 'bottom-0 right-0 items-end'
|
|
21
|
-
};
|
|
22
|
-
</script>
|
|
23
|
-
|
|
24
|
-
<HtmlAtom
|
|
25
|
-
as="ol"
|
|
26
|
-
class={[
|
|
27
|
-
'pointer-events-none fixed z-50 flex flex-col p-4',
|
|
28
|
-
positionClasses[position],
|
|
29
|
-
'$preset',
|
|
30
|
-
klass
|
|
31
|
-
]}
|
|
32
|
-
preset="toast.toaster"
|
|
33
|
-
style={`gap: ${gap}px`}
|
|
34
|
-
aria-label="Notifications"
|
|
35
|
-
aria-live="polite"
|
|
36
|
-
aria-atomic="false"
|
|
37
|
-
{...restProps}
|
|
38
|
-
>
|
|
39
|
-
{#each toastManager.toasts as item (item.id)}
|
|
40
|
-
<ToastRootManaged {item} />
|
|
41
|
-
{/each}
|
|
42
|
-
</HtmlAtom>
|
|
File without changes
|
|
File without changes
|