Spaces:
Build error
Build error
Thomas G. Lopes
commited on
Commit
·
f33fa43
1
Parent(s):
9104321
use melt for local toasts
Browse files- package.json +1 -1
- pnpm-lock.yaml +5 -5
- src/lib/components/local-toasts.svelte +14 -27
- src/lib/components/share-modal.svelte +2 -2
package.json
CHANGED
@@ -37,7 +37,7 @@
|
|
37 |
"globals": "^16.0.0",
|
38 |
"highlight.js": "^11.10.0",
|
39 |
"jiti": "^2.4.2",
|
40 |
-
"melt": "^0.
|
41 |
"postcss": "^8.4.38",
|
42 |
"prettier": "^3.1.1",
|
43 |
"prettier-plugin-svelte": "^3.2.6",
|
|
|
37 |
"globals": "^16.0.0",
|
38 |
"highlight.js": "^11.10.0",
|
39 |
"jiti": "^2.4.2",
|
40 |
+
"melt": "^0.21.0",
|
41 |
"postcss": "^8.4.38",
|
42 |
"prettier": "^3.1.1",
|
43 |
"prettier-plugin-svelte": "^3.2.6",
|
pnpm-lock.yaml
CHANGED
@@ -85,8 +85,8 @@ importers:
|
|
85 |
specifier: ^2.4.2
|
86 |
version: 2.4.2
|
87 |
melt:
|
88 |
-
specifier: ^0.
|
89 |
-
version: 0.
|
90 |
postcss:
|
91 |
specifier: ^8.4.38
|
92 |
version: 8.5.3
|
@@ -1548,8 +1548,8 @@ packages:
|
|
1548 | |
1549 |
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
|
1550 |
|
1551 |
-
melt@0.
|
1552 |
-
resolution: {integrity: sha512-
|
1553 |
peerDependencies:
|
1554 |
'@floating-ui/dom': ^1.6.0
|
1555 |
svelte: ^5.0.0
|
@@ -3474,7 +3474,7 @@ snapshots:
|
|
3474 |
dependencies:
|
3475 |
'@jridgewell/sourcemap-codec': 1.5.0
|
3476 |
|
3477 |
-
melt@0.
|
3478 |
dependencies:
|
3479 |
'@floating-ui/dom': 1.6.13
|
3480 |
jest-axe: 9.0.0
|
|
|
85 |
specifier: ^2.4.2
|
86 |
version: 2.4.2
|
87 |
melt:
|
88 |
+
specifier: ^0.21.0
|
89 |
+
version: 0.21.0(@floating-ui/[email protected])([email protected])
|
90 |
postcss:
|
91 |
specifier: ^8.4.38
|
92 |
version: 8.5.3
|
|
|
1548 | |
1549 |
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
|
1550 |
|
1551 |
+
melt@0.21.0:
|
1552 |
+
resolution: {integrity: sha512-eD0gGaer3CDB8vklec8KWx9X8Gi5BqufZo4eEvRc3GNPpBvAi3i0ZCuziG+/C1jkL+a+Mi6tSKqiBMfyOdJskg==}
|
1553 |
peerDependencies:
|
1554 |
'@floating-ui/dom': ^1.6.0
|
1555 |
svelte: ^5.0.0
|
|
|
3474 |
dependencies:
|
3475 |
'@jridgewell/sourcemap-codec': 1.5.0
|
3476 |
|
3477 |
+
melt@0.21.0(@floating-ui/[email protected])([email protected]):
|
3478 |
dependencies:
|
3479 |
'@floating-ui/dom': 1.6.13
|
3480 |
jest-axe: 9.0.0
|
src/lib/components/local-toasts.svelte
CHANGED
@@ -1,10 +1,11 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import {
|
3 |
-
import {
|
|
|
4 |
import { fly } from "svelte/transition";
|
5 |
|
6 |
interface Props {
|
7 |
-
children: Snippet<[{ addToast: typeof addToast; trigger: typeof trigger }]>;
|
8 |
closeDelay?: number;
|
9 |
}
|
10 |
const { children, closeDelay = 2000 }: Props = $props();
|
@@ -15,28 +16,14 @@
|
|
15 |
id,
|
16 |
} as const;
|
17 |
|
18 |
-
type
|
19 |
content: string;
|
20 |
variant: "info" | "danger";
|
21 |
-
id: string;
|
22 |
};
|
23 |
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
function addToast(content: string, variant?: Toast["variant"]) {
|
28 |
-
const id = crypto.randomUUID();
|
29 |
-
const timeout = setTimeout(() => {
|
30 |
-
toasts = toasts.filter(t => t.id !== id);
|
31 |
-
timeouts = timeouts.filter(t => t !== timeout);
|
32 |
-
}, closeDelay);
|
33 |
-
|
34 |
-
toasts.push({ content, id, variant: variant ?? "info" });
|
35 |
-
timeouts.push(timeout);
|
36 |
-
}
|
37 |
-
|
38 |
-
onDestroy(() => {
|
39 |
-
timeouts.forEach(t => clearTimeout(t));
|
40 |
});
|
41 |
|
42 |
function float(node: HTMLElement) {
|
@@ -59,25 +46,25 @@
|
|
59 |
};
|
60 |
}
|
61 |
|
62 |
-
const classMap: Record<
|
63 |
info: "border border-blue-400 bg-gradient-to-b from-blue-500 to-blue-600",
|
64 |
|
65 |
danger: "border border-red-400 bg-gradient-to-b from-red-500 to-red-600",
|
66 |
};
|
67 |
</script>
|
68 |
|
69 |
-
{@render children({ trigger, addToast })}
|
70 |
|
71 |
-
{#each toasts as toast (toast.id)}
|
72 |
<div
|
73 |
data-local-toast
|
74 |
-
data-variant={toast.variant}
|
75 |
-
class="rounded-full px-2 py-1 text-xs {classMap[toast.variant]}"
|
76 |
in:fly={{ y: 10 }}
|
77 |
out:fly={{ y: -4 }}
|
78 |
use:float
|
79 |
>
|
80 |
-
{toast.content}
|
81 |
</div>
|
82 |
{/each}
|
83 |
|
|
|
1 |
<script lang="ts">
|
2 |
+
import { autoUpdate, computePosition } from "@floating-ui/dom";
|
3 |
+
import { Toaster } from "melt/builders";
|
4 |
+
import { type Snippet } from "svelte";
|
5 |
import { fly } from "svelte/transition";
|
6 |
|
7 |
interface Props {
|
8 |
+
children: Snippet<[{ addToast: typeof toaster.addToast; trigger: typeof trigger }]>;
|
9 |
closeDelay?: number;
|
10 |
}
|
11 |
const { children, closeDelay = 2000 }: Props = $props();
|
|
|
16 |
id,
|
17 |
} as const;
|
18 |
|
19 |
+
type ToastData = {
|
20 |
content: string;
|
21 |
variant: "info" | "danger";
|
|
|
22 |
};
|
23 |
|
24 |
+
const toaster = new Toaster<ToastData>({
|
25 |
+
hover: null,
|
26 |
+
closeDelay: () => closeDelay,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
});
|
28 |
|
29 |
function float(node: HTMLElement) {
|
|
|
46 |
};
|
47 |
}
|
48 |
|
49 |
+
const classMap: Record<ToastData["variant"], string> = {
|
50 |
info: "border border-blue-400 bg-gradient-to-b from-blue-500 to-blue-600",
|
51 |
|
52 |
danger: "border border-red-400 bg-gradient-to-b from-red-500 to-red-600",
|
53 |
};
|
54 |
</script>
|
55 |
|
56 |
+
{@render children({ trigger, addToast: toaster.addToast })}
|
57 |
|
58 |
+
{#each toaster.toasts as toast (toast.id)}
|
59 |
<div
|
60 |
data-local-toast
|
61 |
+
data-variant={toast.data.variant}
|
62 |
+
class="rounded-full px-2 py-1 text-xs {classMap[toast.data.variant]}"
|
63 |
in:fly={{ y: 10 }}
|
64 |
out:fly={{ y: -4 }}
|
65 |
use:float
|
66 |
>
|
67 |
+
{toast.data.content}
|
68 |
</div>
|
69 |
{/each}
|
70 |
|
src/lib/components/share-modal.svelte
CHANGED
@@ -88,7 +88,7 @@
|
|
88 |
class="btn flex items-center gap-2"
|
89 |
onclick={() => {
|
90 |
copyToClipboard(encoded);
|
91 |
-
addToast("Copied to clipboard");
|
92 |
}}
|
93 |
>
|
94 |
<IconCopy />
|
@@ -114,7 +114,7 @@
|
|
114 |
e.preventDefault();
|
115 |
const decoded = decodeString(pasted);
|
116 |
if (!isProject(decoded)) {
|
117 |
-
addToast("String isn't valid", "danger");
|
118 |
return;
|
119 |
}
|
120 |
session.addProject({ ...decoded, name: `Saved - ${decoded.name}`, id: crypto.randomUUID() });
|
|
|
88 |
class="btn flex items-center gap-2"
|
89 |
onclick={() => {
|
90 |
copyToClipboard(encoded);
|
91 |
+
addToast({ data: { content: "Copied to clipboard", variant: "info" } });
|
92 |
}}
|
93 |
>
|
94 |
<IconCopy />
|
|
|
114 |
e.preventDefault();
|
115 |
const decoded = decodeString(pasted);
|
116 |
if (!isProject(decoded)) {
|
117 |
+
addToast({ data: { content: "String isn't valid", variant: "danger" } });
|
118 |
return;
|
119 |
}
|
120 |
session.addProject({ ...decoded, name: `Saved - ${decoded.name}`, id: crypto.randomUUID() });
|