From 84fb4b209a2650b2a93f3208ee9a23a44d8283c7 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 8 Nov 2024 15:19:04 -0800 Subject: svelte 5 fixups --- src/components/Avatar.svelte | 22 +- src/components/InvoiceData.svelte | 2 - src/components/LocationsMap.svelte | 47 +-- src/components/Numpad.svelte | 55 ++-- src/components/Pin.svelte | 50 ++-- src/lib/settings.ts | 31 ++ src/lib/store.ts | 1 + src/routes/(app)/invoice/[id]/+layout.server.ts | 1 + src/routes/(app)/invoice/[id]/+page.svelte | 63 ++-- src/routes/(app)/send/[...text]/+page.svelte | 27 +- src/routes/(app)/settings/+layout.server.ts | 10 + src/routes/(app)/settings/+layout.svelte | 242 ++++++++++++++++ src/routes/(app)/settings/+page.svelte | 0 src/routes/(app)/settings/[...tab]/+page.server.ts | 36 --- src/routes/(app)/settings/[...tab]/+page.svelte | 266 ----------------- src/routes/(app)/settings/[...tab]/_account.svelte | 195 ------------- src/routes/(app)/settings/[...tab]/_pos.svelte | 273 ------------------ .../(app)/settings/[...tab]/_security.svelte | 317 -------------------- src/routes/(app)/settings/[...tab]/_shopify.svelte | 92 ------ src/routes/(app)/settings/account/+page.server.ts | 5 + src/routes/(app)/settings/account/+page.svelte | 190 ++++++++++++ .../(app)/settings/preferences/+page.server.ts | 5 + src/routes/(app)/settings/preferences/+page.svelte | 275 ++++++++++++++++++ src/routes/(app)/settings/security/+page.server.ts | 5 + src/routes/(app)/settings/security/+page.svelte | 318 +++++++++++++++++++++ src/routes/(app)/settings/shopify/+page.svelte | 92 ++++++ src/routes/+layout.ts | 6 + 27 files changed, 1290 insertions(+), 1336 deletions(-) create mode 100644 src/lib/settings.ts create mode 100644 src/routes/(app)/settings/+layout.server.ts create mode 100644 src/routes/(app)/settings/+layout.svelte create mode 100644 src/routes/(app)/settings/+page.svelte delete mode 100644 src/routes/(app)/settings/[...tab]/+page.server.ts delete mode 100644 src/routes/(app)/settings/[...tab]/+page.svelte delete mode 100644 src/routes/(app)/settings/[...tab]/_account.svelte delete mode 100644 src/routes/(app)/settings/[...tab]/_pos.svelte delete mode 100644 src/routes/(app)/settings/[...tab]/_security.svelte delete mode 100644 src/routes/(app)/settings/[...tab]/_shopify.svelte create mode 100644 src/routes/(app)/settings/account/+page.server.ts create mode 100644 src/routes/(app)/settings/account/+page.svelte create mode 100644 src/routes/(app)/settings/preferences/+page.server.ts create mode 100644 src/routes/(app)/settings/preferences/+page.svelte create mode 100644 src/routes/(app)/settings/security/+page.server.ts create mode 100644 src/routes/(app)/settings/security/+page.svelte create mode 100644 src/routes/(app)/settings/shopify/+page.svelte (limited to 'src') diff --git a/src/components/Avatar.svelte b/src/components/Avatar.svelte index 3007c3e7..04f346b1 100644 --- a/src/components/Avatar.svelte +++ b/src/components/Avatar.svelte @@ -1,5 +1,5 @@ - +{#snippet body()}
@@ -39,4 +43,12 @@ onerror={handle} />
-
+{/snippet} + +{#if disabled} + {@render body()} +{:else} + + {@render body()} + +{/if} diff --git a/src/components/InvoiceData.svelte b/src/components/InvoiceData.svelte index da1ea5d9..2298d150 100644 --- a/src/components/InvoiceData.svelte +++ b/src/components/InvoiceData.svelte @@ -4,7 +4,6 @@ showQr, src, link, - qr = $bindable(), txt, invoice, amount, @@ -21,7 +20,6 @@ {txt} diff --git a/src/components/LocationsMap.svelte b/src/components/LocationsMap.svelte index b04b8e98..36223b75 100644 --- a/src/components/LocationsMap.svelte +++ b/src/components/LocationsMap.svelte @@ -1,7 +1,6 @@
@@ -259,29 +260,29 @@ id="map-container" class="mx-auto h-full w-full z-0" bind:this={mapContainer} ->
+ >
{#if !showList}
-
+
{#if search} {:else} - + {/if}
@@ -300,19 +301,19 @@ {/if}
diff --git a/src/components/Numpad.svelte b/src/components/Numpad.svelte index 03c7c48f..07d1ef4c 100644 --- a/src/components/Numpad.svelte +++ b/src/components/Numpad.svelte @@ -1,33 +1,21 @@ -
@@ -225,17 +208,17 @@ use:focus contenteditable bind:innerHTML={html} - onfocus={select} - onblur={blur} - oninput={input} - onkeydown={keydown} + on:focus={select} + on:blur={blur} + on:input={input} + on:keydown={keydown} class="outline-none my-auto" bind:this={element} - >
+ />
{fiat ? "⚡️" + s(amount) : f(amountFiat, currency)}
@@ -247,7 +230,7 @@ @@ -255,7 +238,7 @@ {/if} diff --git a/src/components/Pin.svelte b/src/components/Pin.svelte index da53577e..fb17c612 100644 --- a/src/components/Pin.svelte +++ b/src/components/Pin.svelte @@ -1,36 +1,28 @@ - {#if loaded}
{$t("user.settings.rememberFor")} - @@ -86,7 +72,7 @@
-
diff --git a/src/lib/settings.ts b/src/lib/settings.ts new file mode 100644 index 00000000..b78d83fe --- /dev/null +++ b/src/lib/settings.ts @@ -0,0 +1,31 @@ +import { auth, fd, get, post } from "$lib/utils"; +import { fail } from "@sveltejs/kit"; + +type Error = { + message: string; +}; + +export default async ({ cookies, request }) => { + const form = await fd(request); + + if (form.tab === "pos") { + form.notify = form.notify === "on"; + form.push = form.push === "on"; + form.nip5 = form.nip5 === "on"; + form.prompt = form.prompt === "on"; + form.autowithdraw = form.autowithdraw === "on"; + } + + let user = { ...(await get("/me", auth(cookies))), ...form }; + + try { + ({ user } = await post("/user", user, auth(cookies))); + } catch (e) { + const { message } = e as Error; + return fail(400, { message }); + } + + if (user.language) cookies.set("lang", user.language, { path: "/" }); + + return { user, success: true }; +}; diff --git a/src/lib/store.ts b/src/lib/store.ts index 5c7a0957..e294329e 100644 --- a/src/lib/store.ts +++ b/src/lib/store.ts @@ -61,3 +61,4 @@ export const theme = writable("light"); export const token = persistSession("token"); export const ndef = writable(); export const showQr = persistLocal("showQr", true); +export const save = writable(); diff --git a/src/routes/(app)/invoice/[id]/+layout.server.ts b/src/routes/(app)/invoice/[id]/+layout.server.ts index e428d9fe..9b667c7b 100644 --- a/src/routes/(app)/invoice/[id]/+layout.server.ts +++ b/src/routes/(app)/invoice/[id]/+layout.server.ts @@ -35,6 +35,7 @@ export async function load({ cookies, depends, params, url, parent }) { } } + console.log("REDRAW", invoice?.text); const src = Qr.drawImg(invoice?.text || "", { size: 500 }); const theme = cookies.get("theme"); return { id, invoice, subject, src, user, token, theme }; diff --git a/src/routes/(app)/invoice/[id]/+page.svelte b/src/routes/(app)/invoice/[id]/+page.svelte index fef43e4d..ded42016 100644 --- a/src/routes/(app)/invoice/[id]/+page.svelte +++ b/src/routes/(app)/invoice/[id]/+page.svelte @@ -26,7 +26,8 @@ let readingerror = (e) => console.log("nfc error", e); - let { invoice, id, subject, user, src } = $state(data); + let { invoice, id, subject, user } = $state(data); + let src = $derived(data.src); let { aid, amount, @@ -38,32 +39,15 @@ user: { username, currency }, } = $state(invoice); - let qr = $state(); - let tipPercent = 0; - - let refresh = async (data) => { - ({ invoice, id, user, src } = data); - ({ - aid, - amount, - hash, - type, - rate, - text, - tip, - user: { username, currency }, - } = invoice); - - if (browser && !subbed[id]) - send("subscribe", invoice) - .then(() => (subbed[id] = true)) - .catch((e) => { - console.log("failed to subscribe to invoice notifications", invoice); - console.log(e); - }); + let tipPercent = $derived(tip ? (tip / amount) * 100 : 0); - tipPercent = (tip / amount) * 100; - }; + // if (browser && !subbed[id]) + // send("subscribe", invoice) + // .then(() => (subbed[id] = true)) + // .catch((e) => { + // console.log("failed to subscribe to invoice notifications", invoice); + // console.log(e); + // }); let subbed = {}; @@ -90,6 +74,7 @@ }; let setAmount = $state(async () => { + console.log("LALA", newAmount); if (typeof $amountPrompt === "undefined") $amountPrompt = true; settingAmount = false; amount = newAmount; @@ -104,6 +89,7 @@ if (subject?.prompt) url += "/tip"; else url += "?options=true"; + console.log("GO", url); goto(url, { invalidateAll: true, noScroll: true }); }); @@ -112,31 +98,20 @@ let toggleAmount = $state(() => (settingAmount = !settingAmount)); let fiat = $state(true); let submit = $state(); - run(() => { - refresh(data); - }); - let amountFiat; - run(() => { - amountFiat = parseFloat(((amount * rate) / sats).toFixed(2)); - }); + let amountFiat = $derived(parseFloat(((amount * rate) / sats).toFixed(2))); let tipAmount = $derived(((tip * rate) / sats).toFixed(2)); - let link; - run(() => { - link = [types.bitcoin, types.liquid].includes(type) - ? text - : `lightning:${text}`; - }); - let txt; - run(() => { - txt = [types.bitcoin, types.liquid].includes(type) ? hash : text; - }); + let link = $derived( + [types.bitcoin, types.liquid].includes(type) ? text : `lightning:${text}`, + ); + let txt = $derived( + [types.bitcoin, types.liquid].includes(type) ? hash : text, + );
- import { run } from 'svelte/legacy'; + import { run } from "svelte/legacy"; import { page } from "$app/stores"; import { fly } from "svelte/transition"; @@ -17,7 +17,10 @@ let { contacts } = data; - let el = $state(), text = $state(), pasted = $state(), w = $state(); + let el = $state(), + text = $state(), + pasted = $state(), + w = $state(); let keypress = (e) => e.key === "Enter" ? e.preventDefault() || el.click() : (pasted = false); @@ -60,7 +63,7 @@ bind:value={text} onpaste={() => (pasted = true)} autocapitalize="none" -> + >
@@ -95,18 +98,12 @@ {$t("user.send.contacts")}
- {#each contacts as c} - -
-
-
-
- -
-

{c.username}

-
-
-
+ {#each contacts as c, i} +
+
+ +
+

{c.username}

diff --git a/src/routes/(app)/settings/+layout.server.ts b/src/routes/(app)/settings/+layout.server.ts new file mode 100644 index 00000000..cd63d4f0 --- /dev/null +++ b/src/routes/(app)/settings/+layout.server.ts @@ -0,0 +1,10 @@ +import { auth, get } from "$lib/utils"; +import { redirect } from "@sveltejs/kit"; + +export async function load({ cookies, params, url }) { + const tab = url.pathname.split("/").filter(Boolean).pop(); + if (tab === "settings") redirect(307, `${url.pathname}/account`); + params.cookies = cookies.getAll(); + const subscriptions = await get("/subscriptions", auth(cookies)); + return { cookies: cookies.getAll(), subscriptions, tab }; +} diff --git a/src/routes/(app)/settings/+layout.svelte b/src/routes/(app)/settings/+layout.svelte new file mode 100644 index 00000000..edf256ab --- /dev/null +++ b/src/routes/(app)/settings/+layout.svelte @@ -0,0 +1,242 @@ + + +{#if user.haspin && $pin?.length !== 6} + +{/if} + +
+ + + +
+
+

+ {$t("user.settings.header")} +

+ +
+ {#each tabs.filter((t) => t.name !== "shopify") as { name, key }} + + + + {/each} +
+
+ + +
+ +
+ +
+
diff --git a/src/routes/(app)/settings/+page.svelte b/src/routes/(app)/settings/+page.svelte new file mode 100644 index 00000000..e69de29b diff --git a/src/routes/(app)/settings/[...tab]/+page.server.ts b/src/routes/(app)/settings/[...tab]/+page.server.ts deleted file mode 100644 index 39533426..00000000 --- a/src/routes/(app)/settings/[...tab]/+page.server.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { auth, fd, get, post } from "$lib/utils"; -import { fail, redirect } from "@sveltejs/kit"; - -export async function load({ cookies, params, url }) { - if (url.pathname.endsWith("settings")) - redirect(307, `${url.pathname}/account`); - params.cookies = cookies.getAll(); - const subscriptions = await get("/subscriptions", auth(cookies)); - return { cookies: cookies.getAll(), subscriptions, tab: params.tab }; -} - -export const actions = { - default: async ({ cookies, request }) => { - const form = await fd(request); - - if (form.tab === "pos") { - form.notify = form.notify === "on"; - form.push = form.push === "on"; - form.nip5 = form.nip5 === "on"; - form.prompt = form.prompt === "on"; - form.autowithdraw = form.autowithdraw === "on"; - } - - let user = { ...(await get("/me", auth(cookies))), ...form }; - - try { - ({ user } = await post("/user", user, auth(cookies))); - } catch (e: any) { - return fail(400, { message: e.message }); - } - - if (user.language) cookies.set("lang", user.language, { path: "/" }); - - return { user, success: true }; - }, -}; diff --git a/src/routes/(app)/settings/[...tab]/+page.svelte b/src/routes/(app)/settings/[...tab]/+page.svelte deleted file mode 100644 index 5b9e048d..00000000 --- a/src/routes/(app)/settings/[...tab]/+page.svelte +++ /dev/null @@ -1,266 +0,0 @@ - - -{#if user.haspin && $pin?.length !== 6} - -{/if} - -
- - - -
-
-

- {$t("user.settings.header")} -

- -
- {#each tabs.filter((t) => t.name !== "shopify") as { name, key }} - - - - {/each} -
-
- - -
- -
- -
-
diff --git a/src/routes/(app)/settings/[...tab]/_account.svelte b/src/routes/(app)/settings/[...tab]/_account.svelte deleted file mode 100644 index 54249265..00000000 --- a/src/routes/(app)/settings/[...tab]/_account.svelte +++ /dev/null @@ -1,195 +0,0 @@ - - -
- -
- -
-
- -
- - -
- -
- -

- {$t("user.settings.emailDescription")} -

- - -
- -
- {$t("user.settings.profileImage")} - -
- {#if $avatar || user.profile} -
- {user.username} -
- {:else} -
- - -
- {/if} -
- - - handleFile(e, "profile")} - /> -
-
- - {#if tooLarge["avatar"]} -
Max file size 10MB
- {/if} -
- -
-
- {$t("user.settings.bannerImage")} -
- - {#if $banner || user.banner} - Banner - {:else} -
- {/if} - - - handleFile(e, "banner")} - /> - - {#if tooLarge["banner"]} -
Max file size 10MB
- {/if} -
- -
- - -
diff --git a/src/routes/(app)/settings/[...tab]/_pos.svelte b/src/routes/(app)/settings/[...tab]/_pos.svelte deleted file mode 100644 index 3f68eebc..00000000 --- a/src/routes/(app)/settings/[...tab]/_pos.svelte +++ /dev/null @@ -1,273 +0,0 @@ - - -
- - -
- -
- - -
- -
-
- {$t("user.settings.notifications")} - -
-

- {$t("user.settings.notificationsDesc")} -

-
- -
-
- {$t("user.settings.pushNotifications")} - {#if permission !== "denied"} - - {/if} -
-

- {#if permission === "denied"} - {$t("user.settings.pushNotificationsDisabled")} - {:else} - {$t("user.settings.pushNotificationsDesc")} - {/if} -

-
- -
-
- {$t("user.settings.tipPrompt")} - -
-

- {$t("user.settings.tipPromptDescription")} -

-
- -
-
- {$t("user.settings.autoWithdraw")} - -
-

- {$t("user.settings.autoWithdrawDescription")} -

-
- -{#if user.autowithdraw} -
- - -
- -
- - -

- {$t("user.settings.thresholdDesc")} -

-
- -
- - -

- {$t("user.settings.reserveDesc")} -

-
-{/if} - -{#if editingThreshold} -
-
-

- {$t("user.settings.threshold")} -

- - - -
-
-{/if} - -{#if editingReserve} -
-
-

- {$t("user.settings.reserve")} -

- - -
-
-{/if} - - - - diff --git a/src/routes/(app)/settings/[...tab]/_security.svelte b/src/routes/(app)/settings/[...tab]/_security.svelte deleted file mode 100644 index 8bb8a3fa..00000000 --- a/src/routes/(app)/settings/[...tab]/_security.svelte +++ /dev/null @@ -1,317 +0,0 @@ - - - - - -
- - {#if revealPassword} - - {:else} - - {/if} - -
- -
- {verifying - ? $t("user.settings.verifyPIN") - : $t("user.settings.securityPIN")} -

- {$t("user.settings.securityPINDescription")} -

- {#if verifying} - - {:else if settingPin} - - {:else} - - {/if} -
- -
- {$t("user.settings.twofa")} -

- {$t("user.settings.twofaDescription")} -

- - {#if setting2fa} - - - - -
- {$t("user.settings.accountId")}
- {otp.secret} -
- - - {:else if user.twofa} - - {:else} - - {/if} - - {#if confirming2fa || disabling2fa} - - {/if} -
- -
- - -

- {$t("user.settings.nostrDescription")} -

- -
- - - -
- - {#if importing} - - {/if} - - {#if revealNsec} -
- {nsec} -
- - - {/if} -
diff --git a/src/routes/(app)/settings/[...tab]/_shopify.svelte b/src/routes/(app)/settings/[...tab]/_shopify.svelte deleted file mode 100644 index cc746c49..00000000 --- a/src/routes/(app)/settings/[...tab]/_shopify.svelte +++ /dev/null @@ -1,92 +0,0 @@ - - -
- -
-
- admin.shopify.com/store/ -
- -
-

- Add Bitcoin under Payments > Manual payment methods with a description like "Pay with Bitcoin". -

-
- -
- -

- Copy this into Checkout -> Additional scripts -

- -
- -
- -

- Coinos can automatically mark orders as Paid if you provide an API token. - -

-

- Create a new app in Apps > App Development -

- -

- Edit the Admin API scopes to enable write_orders permission then install the app into your store and copy the Admin API access - token here. -

-
- - diff --git a/src/routes/(app)/settings/account/+page.server.ts b/src/routes/(app)/settings/account/+page.server.ts new file mode 100644 index 00000000..4145935e --- /dev/null +++ b/src/routes/(app)/settings/account/+page.server.ts @@ -0,0 +1,5 @@ +import updateUser from "$lib/settings"; + +export const actions = { + default: updateUser, +}; diff --git a/src/routes/(app)/settings/account/+page.svelte b/src/routes/(app)/settings/account/+page.svelte new file mode 100644 index 00000000..77860948 --- /dev/null +++ b/src/routes/(app)/settings/account/+page.svelte @@ -0,0 +1,190 @@ + + +
+ +
+ +
+
+ +
+ + +
+ +
+ +

+ {$t("user.settings.emailDescription")} +

+ + +
+ +
+ {$t("user.settings.profileImage")} + +
+ {#if $avatar || user.profile} +
+ {user.username} +
+ {:else} +
+ + +
+ {/if} +
+ + + handleFile(e, "profile")} + /> +
+
+ + {#if tooLarge["avatar"]} +
Max file size 10MB
+ {/if} +
+ +
+
+ {$t("user.settings.bannerImage")} +
+ + {#if $banner || user.banner} + Banner + {:else} +
+ {/if} + + + handleFile(e, "banner")} + /> + + {#if tooLarge["banner"]} +
Max file size 10MB
+ {/if} +
+ +
+ + +
diff --git a/src/routes/(app)/settings/preferences/+page.server.ts b/src/routes/(app)/settings/preferences/+page.server.ts new file mode 100644 index 00000000..4145935e --- /dev/null +++ b/src/routes/(app)/settings/preferences/+page.server.ts @@ -0,0 +1,5 @@ +import updateUser from "$lib/settings"; + +export const actions = { + default: updateUser, +}; diff --git a/src/routes/(app)/settings/preferences/+page.svelte b/src/routes/(app)/settings/preferences/+page.svelte new file mode 100644 index 00000000..762d25f5 --- /dev/null +++ b/src/routes/(app)/settings/preferences/+page.svelte @@ -0,0 +1,275 @@ + + +
+ + +
+ +
+ + +
+ +
+
+ {$t("user.settings.notifications")} + +
+

+ {$t("user.settings.notificationsDesc")} +

+
+ +
+
+ {$t("user.settings.pushNotifications")} + {#if permission !== "denied"} + + {/if} +
+

+ {#if permission === "denied"} + {$t("user.settings.pushNotificationsDisabled")} + {:else} + {$t("user.settings.pushNotificationsDesc")} + {/if} +

+
+ +
+
+ {$t("user.settings.tipPrompt")} + +
+

+ {$t("user.settings.tipPromptDescription")} +

+
+ +
+
+ {$t("user.settings.autoWithdraw")} + +
+

+ {$t("user.settings.autoWithdrawDescription")} +

+
+ +{#if user.autowithdraw} +
+ + +
+ +
+ + +

+ {$t("user.settings.thresholdDesc")} +

+
+ +
+ + +

+ {$t("user.settings.reserveDesc")} +

+
+{/if} + +{#if editingThreshold} +
+
+

+ {$t("user.settings.threshold")} +

+ + + +
+
+{/if} + +{#if editingReserve} +
+
+

+ {$t("user.settings.reserve")} +

+ + +
+
+{/if} + + + + diff --git a/src/routes/(app)/settings/security/+page.server.ts b/src/routes/(app)/settings/security/+page.server.ts new file mode 100644 index 00000000..4145935e --- /dev/null +++ b/src/routes/(app)/settings/security/+page.server.ts @@ -0,0 +1,5 @@ +import updateUser from "$lib/settings"; + +export const actions = { + default: updateUser, +}; diff --git a/src/routes/(app)/settings/security/+page.svelte b/src/routes/(app)/settings/security/+page.svelte new file mode 100644 index 00000000..d3f27ee6 --- /dev/null +++ b/src/routes/(app)/settings/security/+page.svelte @@ -0,0 +1,318 @@ + + +{console.log("SAVE", $save)} + + + +
+ + {#if revealPassword} + + {:else} + + {/if} + +
+ +
+ {verifying + ? $t("user.settings.verifyPIN") + : $t("user.settings.securityPIN")} +

+ {$t("user.settings.securityPINDescription")} +

+ {#if verifying} + + {:else if settingPin} + + {:else} + + {/if} +
+ +
+ {$t("user.settings.twofa")} +

+ {$t("user.settings.twofaDescription")} +

+ + {#if setting2fa} + + + + +
+ {$t("user.settings.accountId")}
+ {otp.secret} +
+ + + {:else if user.twofa} + + {:else} + + {/if} + + {#if confirming2fa || disabling2fa} + + {/if} +
+ +
+ + +

+ {$t("user.settings.nostrDescription")} +

+ +
+ + + +
+ + {#if importing} + + {/if} + + {#if revealNsec} +
+ {nsec} +
+ + + {/if} +
diff --git a/src/routes/(app)/settings/shopify/+page.svelte b/src/routes/(app)/settings/shopify/+page.svelte new file mode 100644 index 00000000..cc746c49 --- /dev/null +++ b/src/routes/(app)/settings/shopify/+page.svelte @@ -0,0 +1,92 @@ + + +
+ +
+
+ admin.shopify.com/store/ +
+ +
+

+ Add Bitcoin under Payments > Manual payment methods with a description like "Pay with Bitcoin". +

+
+ +
+ +

+ Copy this into Checkout -> Additional scripts +

+ +
+ +
+ +

+ Coinos can automatically mark orders as Paid if you provide an API token. + +

+

+ Create a new app in Apps > App Development +

+ +

+ Edit the Admin API scopes to enable write_orders permission then install the app into your store and copy the Admin API access + token here. +

+
+ + diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts index ee0ed70c..0de57279 100644 --- a/src/routes/+layout.ts +++ b/src/routes/+layout.ts @@ -47,3 +47,9 @@ addIcon("coinos:smile", { width: 112, height: 108, }); + +addIcon("coinos:symbol", { + body: ``, + width: 72, + height: 72, +}); -- cgit v1.2.3