@axium/server 0.22.7 → 0.22.9
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/build/client/_app/immutable/chunks/{B4jrgZ2v.js → CV6aJBRA.js} +1 -1
- package/build/client/_app/immutable/chunks/CV6aJBRA.js.br +0 -0
- package/build/client/_app/immutable/chunks/CV6aJBRA.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CyaTInFC.js → CuRH3mnc.js} +1 -1
- package/build/client/_app/immutable/chunks/CuRH3mnc.js.br +0 -0
- package/build/client/_app/immutable/chunks/CuRH3mnc.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BB26zgjv.js → D3N9NXka.js} +12 -12
- package/build/client/_app/immutable/chunks/D3N9NXka.js.br +0 -0
- package/build/client/_app/immutable/chunks/{BB26zgjv.js.gz → D3N9NXka.js.gz} +0 -0
- package/build/client/_app/immutable/entry/{app.CI36K0Ii.js → app.D7YMAAqT.js} +2 -2
- package/build/client/_app/immutable/entry/app.D7YMAAqT.js.br +0 -0
- package/build/client/_app/immutable/entry/app.D7YMAAqT.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.CCYA4gbZ.js +1 -0
- package/build/client/_app/immutable/entry/start.CCYA4gbZ.js.br +2 -0
- package/build/client/_app/immutable/entry/start.CCYA4gbZ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.C41FMzGJ.js → 1.B48R4hTL.js} +1 -1
- package/build/client/_app/immutable/nodes/1.B48R4hTL.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.B48R4hTL.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{3.Bx9a_cbp.js → 3.jHOFxZjh.js} +1 -1
- package/build/client/_app/immutable/nodes/3.jHOFxZjh.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.jHOFxZjh.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{4.Bv7tqhIp.js → 4.Chs3ZlQq.js} +1 -1
- package/build/client/_app/immutable/nodes/4.Chs3ZlQq.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.Chs3ZlQq.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.eFtGuF8y.js +1 -0
- package/build/client/_app/immutable/nodes/5.eFtGuF8y.js.br +2 -0
- package/build/client/_app/immutable/nodes/5.eFtGuF8y.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{6.BJG5gZTX.js → 6.2qXwWTTQ.js} +1 -1
- package/build/client/_app/immutable/nodes/6.2qXwWTTQ.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.2qXwWTTQ.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/client/styles.css +22 -21
- package/build/client/styles.css.br +0 -0
- package/build/client/styles.css.gz +0 -0
- package/build/client/theme.css +41 -0
- package/build/client/theme.css.br +0 -0
- package/build/client/theme.css.gz +0 -0
- package/build/server/chunks/{1-DLB141jg.js → 1-DgpDfXPt.js} +2 -2
- package/build/server/chunks/{1-DLB141jg.js.map → 1-DgpDfXPt.js.map} +1 -1
- package/build/server/chunks/{3-BLvjl1b0.js → 3-6GCmTvSE.js} +3 -3
- package/build/server/chunks/{3-BLvjl1b0.js.map → 3-6GCmTvSE.js.map} +1 -1
- package/build/server/chunks/{4-_Z3XM2ZU.js → 4-CTFpM_SP.js} +3 -3
- package/build/server/chunks/{4-_Z3XM2ZU.js.map → 4-CTFpM_SP.js.map} +1 -1
- package/build/server/chunks/{5-CGj2cpNi.js → 5-BpCB8dc9.js} +3 -3
- package/build/server/chunks/{5-CGj2cpNi.js.map → 5-BpCB8dc9.js.map} +1 -1
- package/build/server/chunks/{6-DxwYDhel.js → 6-BcoKkoJ_.js} +3 -3
- package/build/server/chunks/{6-DxwYDhel.js.map → 6-BcoKkoJ_.js.map} +1 -1
- package/build/server/chunks/{FormDialog-CieDuaGR.js → FormDialog-B3fXC6M4.js} +4 -4
- package/build/server/chunks/{FormDialog-CieDuaGR.js.map → FormDialog-B3fXC6M4.js.map} +1 -1
- package/build/server/chunks/{Logout-BuFlzVUY.js → Logout-naelGSrR.js} +2 -2
- package/build/server/chunks/{Logout-BuFlzVUY.js.map → Logout-naelGSrR.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-C0BGwZCw.js → _page.svelte-BLt1Vm33.js} +6 -6
- package/build/server/chunks/_page.svelte-BLt1Vm33.js.map +1 -0
- package/build/server/chunks/{_page.svelte-tm2MwH-6.js → _page.svelte-Y6ezsJUw.js} +2 -2
- package/build/server/chunks/{_page.svelte-tm2MwH-6.js.map → _page.svelte-Y6ezsJUw.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-pr5d_b15.js → _page.svelte-cU3u-tVN.js} +3 -3
- package/build/server/chunks/{_page.svelte-pr5d_b15.js.map → _page.svelte-cU3u-tVN.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-Diva26gb.js → _page.svelte-oKnc0uuc.js} +2 -2
- package/build/server/chunks/{_page.svelte-Diva26gb.js.map → _page.svelte-oKnc0uuc.js.map} +1 -1
- package/build/server/chunks/{hooks.server-DUHg5UuJ.js → hooks.server-CFWOVtwo.js} +2 -2
- package/build/server/chunks/{hooks.server-DUHg5UuJ.js.map → hooks.server-CFWOVtwo.js.map} +1 -1
- package/build/server/index.js +3 -3
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +7 -7
- package/build/server/manifest.js.map +1 -1
- package/package.json +2 -4
- package/routes/account/+page.svelte +1 -1
- package/routes/login/+page.svelte +1 -1
- package/routes/logout/+page.svelte +1 -1
- package/routes/register/+page.svelte +1 -1
- package/svelte.config.js +2 -2
- package/web/template.html +1 -0
- package/assets/icons/brands.svg +0 -1493
- package/assets/icons/light.svg +0 -9977
- package/assets/icons/regular.svg +0 -9977
- package/assets/icons/solid.svg +0 -9977
- package/assets/styles.css +0 -119
- package/build/client/_app/immutable/chunks/B4jrgZ2v.js.br +0 -0
- package/build/client/_app/immutable/chunks/B4jrgZ2v.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BB26zgjv.js.br +0 -0
- package/build/client/_app/immutable/chunks/CyaTInFC.js.br +0 -0
- package/build/client/_app/immutable/chunks/CyaTInFC.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.CI36K0Ii.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CI36K0Ii.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.CChz4wnJ.js +0 -1
- package/build/client/_app/immutable/entry/start.CChz4wnJ.js.br +0 -0
- package/build/client/_app/immutable/entry/start.CChz4wnJ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.C41FMzGJ.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.C41FMzGJ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.Bx9a_cbp.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.Bx9a_cbp.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.Bv7tqhIp.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.Bv7tqhIp.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5._SsovuZL.js +0 -1
- package/build/client/_app/immutable/nodes/5._SsovuZL.js.br +0 -0
- package/build/client/_app/immutable/nodes/5._SsovuZL.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BJG5gZTX.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BJG5gZTX.js.gz +0 -0
- package/build/server/chunks/_page.svelte-C0BGwZCw.js.map +0 -1
- package/web/lib/AccessControl.svelte +0 -37
- package/web/lib/AccessControlDialog.svelte +0 -12
- package/web/lib/AppMenu.svelte +0 -34
- package/web/lib/ClipboardCopy.svelte +0 -42
- package/web/lib/Dialog.svelte +0 -51
- package/web/lib/FormDialog.svelte +0 -96
- package/web/lib/Icon.svelte +0 -18
- package/web/lib/Login.svelte +0 -36
- package/web/lib/Logout.svelte +0 -24
- package/web/lib/NumberBar.svelte +0 -31
- package/web/lib/Popover.svelte +0 -46
- package/web/lib/Register.svelte +0 -32
- package/web/lib/Toast.svelte +0 -35
- package/web/lib/Upload.svelte +0 -60
- package/web/lib/UserCard.svelte +0 -48
- package/web/lib/WithContextMenu.svelte +0 -73
- package/web/lib/index.ts +0 -16
package/assets/styles.css
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
body {
|
|
2
|
-
font-family: sans-serif;
|
|
3
|
-
font-size: 16px;
|
|
4
|
-
background-color: #222;
|
|
5
|
-
color: #bbb;
|
|
6
|
-
accent-color: #bbb;
|
|
7
|
-
overflow-y: scroll;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
.main {
|
|
11
|
-
padding: 2em;
|
|
12
|
-
border-radius: 1em;
|
|
13
|
-
background-color: #111;
|
|
14
|
-
display: flex;
|
|
15
|
-
flex-direction: column;
|
|
16
|
-
gap: 1em;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
.main-container:has(form.main) {
|
|
20
|
-
position: absolute;
|
|
21
|
-
inset: 0;
|
|
22
|
-
display: flex;
|
|
23
|
-
justify-content: center;
|
|
24
|
-
align-items: center;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
form.main {
|
|
28
|
-
width: max-content;
|
|
29
|
-
height: max-content;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
form {
|
|
33
|
-
div:has(label ~ input) {
|
|
34
|
-
display: flex;
|
|
35
|
-
flex-direction: column;
|
|
36
|
-
gap: 0;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
input,
|
|
41
|
-
button {
|
|
42
|
-
border-radius: 0.5em;
|
|
43
|
-
border: 1px solid #aaa;
|
|
44
|
-
background-color: #222;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
input {
|
|
48
|
-
padding: 0.5em 1em;
|
|
49
|
-
outline: none;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
button {
|
|
53
|
-
padding: 0.5em 1em;
|
|
54
|
-
cursor: pointer;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
button:hover {
|
|
58
|
-
background-color: #334;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
.error {
|
|
62
|
-
padding: 1em;
|
|
63
|
-
border-radius: 0.5em;
|
|
64
|
-
background-color: #733;
|
|
65
|
-
color: #ccc;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
.success {
|
|
69
|
-
padding: 1em;
|
|
70
|
-
border-radius: 0.5em;
|
|
71
|
-
background-color: #373;
|
|
72
|
-
color: #ccc;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
.subtle {
|
|
76
|
-
color: #bbbb;
|
|
77
|
-
font-size: 0.9em;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
.flex-content {
|
|
81
|
-
display: flex;
|
|
82
|
-
align-items: center;
|
|
83
|
-
flex-direction: column;
|
|
84
|
-
gap: 1em;
|
|
85
|
-
overflow-y: scroll;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
.danger {
|
|
89
|
-
border: 1px solid #d99;
|
|
90
|
-
background-color: #322;
|
|
91
|
-
color: #dbb;
|
|
92
|
-
accent-color: #dbb;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
.danger:hover {
|
|
96
|
-
background-color: #633;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
:disabled,
|
|
100
|
-
.disabled {
|
|
101
|
-
cursor: not-allowed;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
:popover-open {
|
|
105
|
-
border: 1px solid #99a;
|
|
106
|
-
background-color: #111e;
|
|
107
|
-
border-radius: 0.5em;
|
|
108
|
-
padding: 0.25em;
|
|
109
|
-
inset: unset;
|
|
110
|
-
display: flex;
|
|
111
|
-
flex-direction: column;
|
|
112
|
-
gap: 0.1em;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
.icon-text {
|
|
116
|
-
display: inline-flex;
|
|
117
|
-
align-items: center;
|
|
118
|
-
gap: 1em;
|
|
119
|
-
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{l as o,a as r}from"../chunks/B4jrgZ2v.js";export{o as load_css,r as start};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"../chunks/DsnmJJEf.js";import{L as t}from"../chunks/CyaTInFC.js";function r(o){t(o,{fullPage:!0})}export{r as component};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_page.svelte-C0BGwZCw.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/account/_page.svelte.js"],"sourcesContent":["import { u as push, z as spread_attributes, F as attr, w as pop, G as copy_payload, J as assign_payload, K as ensure_array_like, N as head, y as escape_html, O as stringify, P as css_props, Q as attr_style } from \"../../../chunks/index.js\";\nimport { g as getUserImage, d as deleteUser, u as updatePasskey, a as deletePasskey, l as logout, b as logoutAll, c as updateUser } from \"../../../chunks/user.js\";\nimport \"mime\";\nimport { F as FormDialog } from \"../../../chunks/FormDialog.js\";\nimport \"clsx\";\nimport \"utilium\";\nimport { L as Logout } from \"../../../chunks/Logout.js\";\nconst $$css$2 = {\n hash: \"svelte-ylmrta\",\n code: \"svg.svelte-ylmrta {width:var(--size, 1em);height:var(--size, 1em);display:inline-block;fill:var(--fill, #bbb);}\"\n};\nfunction Icon($$payload, $$props) {\n $$payload.css.add($$css$2);\n push();\n const { i, $$slots, $$events, ...rest } = $$props;\n const [style, id] = i.includes(\"/\") ? i.split(\"/\") : [\"solid\", i];\n const href = `/icons/${style}.svg#${id}`;\n $$payload.out.push(`<svg${spread_attributes(\n {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 512 512\",\n width: \"1em\",\n height: \"1em\",\n ...rest\n },\n \"svelte-ylmrta\",\n void 0,\n void 0,\n 3\n )}><use${attr(\"href\", href)}></use></svg>`);\n pop();\n}\nconst $$css$1 = {\n hash: \"svelte-g409dh\",\n code: \"button.svelte-g409dh {position:relative;display:inline-block;width:1em;height:1em;border:none;background:transparent;}span.svelte-g409dh {position:absolute;inset:0;}\"\n};\nfunction ClipboardCopy($$payload, $$props) {\n $$payload.css.add($$css$1);\n push();\n $$payload.out.push(`<button class=\"svelte-g409dh\">`);\n {\n $$payload.out.push(\"<!--[!-->\");\n $$payload.out.push(`<span class=\"svelte-g409dh\">`);\n Icon($$payload, { i: \"copy\" });\n $$payload.out.push(`<!----></span>`);\n }\n $$payload.out.push(`<!--]--></button>`);\n pop();\n}\nconst $$css = {\n hash: \"svelte-c74k6c\",\n code: \"#pfp-container.svelte-c74k6c {width:100px;height:100px;margin-top:3em;.MenuToggle {float:right;position:relative;top:-24px;}}#pfp.svelte-c74k6c {width:100px;height:100px;border-radius:50%;border:1px solid #8888;}.greeting.svelte-c74k6c {font-size:2em;}.signout.svelte-c74k6c {margin-top:2em;}.section.svelte-c74k6c {width:50%;padding-top:4em;\\n\\n\t\t/* This is causing duplicate separators when removing sessions/passkeys\\n\t\t> div:has(+ div) {\\n\t\t\tborder-bottom: 1px solid #8888;\\n\t\t}\\n\t\t*/}.section.svelte-c74k6c .item:where(.svelte-c74k6c) {display:grid;align-items:center;width:100%;gap:1em;text-wrap:nowrap;border-top:1px solid #8888;padding-bottom:1em;}.info.svelte-c74k6c {grid-template-columns:10em 1fr 2em;> :where(.svelte-c74k6c):first-child {margin-left:1em;}> :where(.svelte-c74k6c):nth-child(2) {text-overflow:ellipsis;overflow:hidden;}}.passkey.svelte-c74k6c {grid-template-columns:1em 1em 1fr 1fr 1em 1em;dfn:where(.svelte-c74k6c):not(.disabled) {cursor:help;}}.session.svelte-c74k6c {grid-template-columns:1fr 1fr 1fr 1em;.current:where(.svelte-c74k6c) {border-radius:2em;padding:0 0.5em;background-color:#337;}.elevated:where(.svelte-c74k6c) {border-radius:2em;padding:0 0.5em;background-color:#733;}}\"\n};\nfunction _page($$payload, $$props) {\n $$payload.css.add($$css);\n push();\n const { data } = $$props;\n const { canVerify } = data;\n const dialogs = {};\n let currentSession = data.currentSession;\n let user = data.user;\n let passkeys = data.passkeys;\n let sessions = data.sessions;\n async function _editUser(data2) {\n const result = await updateUser(user.id, data2);\n user = result;\n }\n function action($$payload2, name, i = \"pen\") {\n $$payload2.out.push(`<button class=\"svelte-c74k6c\"${attr_style(\"\", { display: \"contents\" })}>`);\n css_props($$payload2, true, { \"--size\": \"16px\" }, () => {\n Icon($$payload2, { i });\n });\n $$payload2.out.push(`</button>`);\n }\n let $$settled = true;\n let $$inner_payload;\n function $$render_inner($$payload2) {\n const each_array = ensure_array_like(passkeys);\n const each_array_1 = ensure_array_like(sessions);\n head($$payload2, ($$payload3) => {\n $$payload3.title = `<title>Account</title>`;\n });\n $$payload2.out.push(`<div class=\"Account flex-content\"><div id=\"pfp-container\" class=\"svelte-c74k6c\"><img id=\"pfp\"${attr(\"src\", getUserImage(user))} alt=\"User profile\" width=\"100px\" height=\"100px\" class=\"svelte-c74k6c\"/></div> <p class=\"greeting svelte-c74k6c\">Welcome, ${escape_html(user.name)}</p> <div class=\"section main svelte-c74k6c\"><h3>Personal Information</h3> <div class=\"item info svelte-c74k6c\"><p class=\"subtle svelte-c74k6c\">Name</p> <p class=\"svelte-c74k6c\">${escape_html(user.name)}</p> `);\n action($$payload2);\n $$payload2.out.push(`<!----></div> `);\n FormDialog($$payload2, {\n submit: _editUser,\n submitText: \"Change\",\n get dialog() {\n return dialogs.edit_name;\n },\n set dialog($$value) {\n dialogs.edit_name = $$value;\n $$settled = false;\n },\n children: ($$payload3) => {\n $$payload3.out.push(`<div><label for=\"name\">What do you want to be called?</label> <input name=\"name\" type=\"text\"${attr(\"value\", user.name || \"\")} required/></div>`);\n },\n $$slots: { default: true }\n });\n $$payload2.out.push(`<!----> <div class=\"item info svelte-c74k6c\"><p class=\"subtle svelte-c74k6c\">Email</p> <p class=\"svelte-c74k6c\">${escape_html(user.email)} `);\n if (user.emailVerified) {\n $$payload2.out.push(\"<!--[-->\");\n $$payload2.out.push(`<dfn${attr(\"title\", `Email verified on ${stringify(user.emailVerified.toLocaleDateString())}`)}>`);\n Icon($$payload2, { i: \"regular/circle-check\" });\n $$payload2.out.push(`<!----></dfn>`);\n } else {\n $$payload2.out.push(\"<!--[!-->\");\n if (canVerify) {\n $$payload2.out.push(\"<!--[-->\");\n $$payload2.out.push(`<button>${escape_html(\"Verify\")}</button>`);\n } else {\n $$payload2.out.push(\"<!--[!-->\");\n }\n $$payload2.out.push(`<!--]-->`);\n }\n $$payload2.out.push(`<!--]--></p> `);\n action($$payload2);\n $$payload2.out.push(`<!----></div> `);\n FormDialog($$payload2, {\n submit: _editUser,\n submitText: \"Change\",\n get dialog() {\n return dialogs.edit_email;\n },\n set dialog($$value) {\n dialogs.edit_email = $$value;\n $$settled = false;\n },\n children: ($$payload3) => {\n $$payload3.out.push(`<div><label for=\"email\">Email Address</label> <input name=\"email\" type=\"email\"${attr(\"value\", user.email || \"\")} required/></div>`);\n },\n $$slots: { default: true }\n });\n $$payload2.out.push(`<!----> <div class=\"item info svelte-c74k6c\"><p class=\"subtle svelte-c74k6c\">User ID <dfn title=\"This is your UUID. It can't be changed.\">`);\n Icon($$payload2, { i: \"regular/circle-info\" });\n $$payload2.out.push(`<!----></dfn></p> <p class=\"svelte-c74k6c\">${escape_html(user.id)}</p> `);\n css_props($$payload2, true, { \"--size\": \"16px\" }, () => {\n ClipboardCopy($$payload2, { value: user.id });\n });\n $$payload2.out.push(`</div> <span><button class=\"signout svelte-c74k6c\">Sign Out</button> <button class=\"danger\"${attr_style(\"\", { cursor: \"pointer\" })}>Delete Account</button> `);\n Logout($$payload2, {\n get dialog() {\n return dialogs.logout;\n },\n set dialog($$value) {\n dialogs.logout = $$value;\n $$settled = false;\n }\n });\n $$payload2.out.push(`<!----> `);\n FormDialog($$payload2, {\n submit: () => deleteUser(user.id).then(() => window.location.href = \"/\"),\n submitText: \"Delete Account\",\n submitDanger: true,\n get dialog() {\n return dialogs.delete;\n },\n set dialog($$value) {\n dialogs.delete = $$value;\n $$settled = false;\n },\n children: ($$payload3) => {\n $$payload3.out.push(`<p>Are you sure you want to delete your account?<br/>This action can't be undone.</p>`);\n },\n $$slots: { default: true }\n });\n $$payload2.out.push(`<!----></span></div> <div class=\"section main svelte-c74k6c\"><h3>Passkeys</h3> <!--[-->`);\n for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {\n let passkey = each_array[$$index];\n $$payload2.out.push(`<div class=\"item passkey svelte-c74k6c\"><dfn${attr(\"title\", passkey.deviceType == \"multiDevice\" ? \"Multiple devices\" : \"Single device\")} class=\"svelte-c74k6c\">`);\n css_props($$payload2, true, { \"--size\": \"16px\" }, () => {\n Icon($$payload2, {\n i: passkey.deviceType == \"multiDevice\" ? \"laptop-mobile\" : \"mobile\"\n });\n });\n $$payload2.out.push(`</dfn> <dfn${attr(\"title\", `This passkey is ${stringify(passkey.backedUp ? \"\" : \"not \")}backed up`)} class=\"svelte-c74k6c\">`);\n css_props($$payload2, true, { \"--size\": \"16px\" }, () => {\n Icon($$payload2, { i: passkey.backedUp ? \"circle-check\" : \"circle-xmark\" });\n });\n $$payload2.out.push(`</dfn> `);\n if (passkey.name) {\n $$payload2.out.push(\"<!--[-->\");\n $$payload2.out.push(`<p>${escape_html(passkey.name)}</p>`);\n } else {\n $$payload2.out.push(\"<!--[!-->\");\n $$payload2.out.push(`<p class=\"subtle\"><i>Unnamed</i></p>`);\n }\n $$payload2.out.push(`<!--]--> <p>Created ${escape_html(passkey.createdAt.toLocaleString())}</p> `);\n action($$payload2, \"edit_passkey#\" + passkey.id);\n $$payload2.out.push(`<!----> `);\n if (passkeys.length > 1) {\n $$payload2.out.push(\"<!--[-->\");\n action($$payload2, \"delete_passkey#\" + passkey.id, \"trash\");\n } else {\n $$payload2.out.push(\"<!--[!-->\");\n $$payload2.out.push(`<dfn title=\"You must have at least one passkey\" class=\"disabled svelte-c74k6c\">`);\n css_props($$payload2, true, { \"--fill\": \"#888\", \"--size\": \"16px\" }, () => {\n Icon($$payload2, { i: \"trash-slash\" });\n });\n $$payload2.out.push(`</dfn>`);\n }\n $$payload2.out.push(`<!--]--></div> `);\n FormDialog($$payload2, {\n submit: (data2) => {\n if (typeof data2.name != \"string\") throw \"Passkey name must be a string\";\n passkey.name = data2.name;\n return updatePasskey(passkey.id, data2);\n },\n submitText: \"Change\",\n get dialog() {\n return dialogs[\"edit_passkey#\" + passkey.id];\n },\n set dialog($$value) {\n dialogs[\"edit_passkey#\" + passkey.id] = $$value;\n $$settled = false;\n },\n children: ($$payload3) => {\n $$payload3.out.push(`<div><label for=\"name\">Passkey Name</label> <input name=\"name\" type=\"text\"${attr(\"value\", passkey.name || \"\")}/></div>`);\n },\n $$slots: { default: true }\n });\n $$payload2.out.push(`<!----> `);\n FormDialog($$payload2, {\n submit: () => deletePasskey(passkey.id).then(() => passkeys.splice(passkeys.indexOf(passkey), 1)),\n submitText: \"Delete\",\n submitDanger: true,\n get dialog() {\n return dialogs[\"delete_passkey#\" + passkey.id];\n },\n set dialog($$value) {\n dialogs[\"delete_passkey#\" + passkey.id] = $$value;\n $$settled = false;\n },\n children: ($$payload3) => {\n $$payload3.out.push(`<p>Are you sure you want to delete this passkey?<br/>This action can't be undone.</p>`);\n },\n $$slots: { default: true }\n });\n $$payload2.out.push(`<!---->`);\n }\n $$payload2.out.push(`<!--]--> <span><button class=\"icon-text\">`);\n Icon($$payload2, { i: \"plus\" });\n $$payload2.out.push(`<!----> Create</button></span></div> <div class=\"section main svelte-c74k6c\"><h3>Sessions</h3> <!--[-->`);\n for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {\n let session = each_array_1[$$index_1];\n $$payload2.out.push(`<div class=\"item session svelte-c74k6c\"><p>${escape_html(session.id.slice(0, 4))}...${escape_html(session.id.slice(-4))} `);\n if (session.id == currentSession.id) {\n $$payload2.out.push(\"<!--[-->\");\n $$payload2.out.push(`<span class=\"current svelte-c74k6c\">Current</span>`);\n } else {\n $$payload2.out.push(\"<!--[!-->\");\n }\n $$payload2.out.push(`<!--]--> `);\n if (session.elevated) {\n $$payload2.out.push(\"<!--[-->\");\n $$payload2.out.push(`<span class=\"elevated svelte-c74k6c\">Elevated</span>`);\n } else {\n $$payload2.out.push(\"<!--[!-->\");\n }\n $$payload2.out.push(`<!--]--></p> <p>Created ${escape_html(session.created.toLocaleString())}</p> <p>Expires ${escape_html(session.expires.toLocaleString())}</p> `);\n action($$payload2, \"logout#\" + session.id, \"right-from-bracket\");\n $$payload2.out.push(`<!----></div> `);\n FormDialog($$payload2, {\n submit: async () => {\n await logout(user.id, session.id);\n dialogs[\"logout#\" + session.id].remove();\n sessions.splice(sessions.indexOf(session), 1);\n if (session.id == currentSession.id) window.location.href = \"/\";\n },\n submitText: \"Logout\",\n get dialog() {\n return dialogs[\"logout#\" + session.id];\n },\n set dialog($$value) {\n dialogs[\"logout#\" + session.id] = $$value;\n $$settled = false;\n },\n children: ($$payload3) => {\n $$payload3.out.push(`<p>Are you sure you want to log out this session?</p>`);\n },\n $$slots: { default: true }\n });\n $$payload2.out.push(`<!---->`);\n }\n $$payload2.out.push(`<!--]--> <span><button class=\"danger\">Logout All</button></span> `);\n FormDialog($$payload2, {\n submit: () => logoutAll(user.id).then(() => window.location.href = \"/\"),\n submitText: \"Logout All Sessions\",\n submitDanger: true,\n get dialog() {\n return dialogs[\"logout_all\"];\n },\n set dialog($$value) {\n dialogs[\"logout_all\"] = $$value;\n $$settled = false;\n },\n children: ($$payload3) => {\n $$payload3.out.push(`<p>Are you sure you want to log out all sessions?</p>`);\n },\n $$slots: { default: true }\n });\n $$payload2.out.push(`<!----></div></div>`);\n }\n do {\n $$settled = true;\n $$inner_payload = copy_payload($$payload);\n $$render_inner($$inner_payload);\n } while (!$$settled);\n assign_payload($$payload, $$inner_payload);\n pop();\n}\nexport {\n _page as default\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import UserCard from './UserCard.svelte';
|
|
3
|
-
import type { Permission, AccessControl } from '@axium/core/access';
|
|
4
|
-
import { permissionNames } from '@axium/core/access';
|
|
5
|
-
import type { Entries } from 'utilium';
|
|
6
|
-
|
|
7
|
-
const { control, editable }: { control: AccessControl; editable: boolean } = $props();
|
|
8
|
-
|
|
9
|
-
const perm = $derived(permissionNames[control.permission as Permission]);
|
|
10
|
-
|
|
11
|
-
const permEntries = Object.entries(permissionNames) as any as Entries<typeof permissionNames>;
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
<div class="AccessControl">
|
|
15
|
-
{#if !control.user}<i>Unknown</i>
|
|
16
|
-
{:else}
|
|
17
|
-
<UserCard user={control.user} />
|
|
18
|
-
{#if editable}
|
|
19
|
-
<input type="hidden" name="userId" value={control.user.id} />
|
|
20
|
-
<select name="permission">
|
|
21
|
-
{#each permEntries as [key, name]}
|
|
22
|
-
<option value={key} selected={key == control.permission}>{name}</option>
|
|
23
|
-
{/each}
|
|
24
|
-
</select>
|
|
25
|
-
{:else}
|
|
26
|
-
<span>{perm}</span>
|
|
27
|
-
{/if}
|
|
28
|
-
{/if}
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
<style>
|
|
32
|
-
.AccessControl {
|
|
33
|
-
display: flex;
|
|
34
|
-
gap: 1em;
|
|
35
|
-
padding: 1em 2em;
|
|
36
|
-
}
|
|
37
|
-
</style>
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import FormDialog from './FormDialog.svelte';
|
|
3
|
-
import AccessControl from './AccessControl.svelte';
|
|
4
|
-
|
|
5
|
-
let { item, editable } = $props();
|
|
6
|
-
</script>
|
|
7
|
-
|
|
8
|
-
<FormDialog submitText="Save">
|
|
9
|
-
{#each item.acl as control}
|
|
10
|
-
<AccessControl {control} {editable} />
|
|
11
|
-
{/each}
|
|
12
|
-
</FormDialog>
|
package/web/lib/AppMenu.svelte
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { fetchAPI } from '@axium/client/requests';
|
|
3
|
-
import Icon from './Icon.svelte';
|
|
4
|
-
import Popover from './Popover.svelte';
|
|
5
|
-
</script>
|
|
6
|
-
|
|
7
|
-
<Popover>
|
|
8
|
-
{#snippet toggle()}
|
|
9
|
-
<button style:display="contents">
|
|
10
|
-
<Icon i="grid" --size="1.5em" />
|
|
11
|
-
</button>
|
|
12
|
-
{/snippet}
|
|
13
|
-
|
|
14
|
-
{#await fetchAPI('GET', 'apps')}
|
|
15
|
-
<i>Loading...</i>
|
|
16
|
-
{:then apps}
|
|
17
|
-
{#each apps as app}
|
|
18
|
-
<a class="menu-item" href="/{app.id}">
|
|
19
|
-
{#if app.image}
|
|
20
|
-
<img src={app.image} alt={app.name} width="1em" height="1em" />
|
|
21
|
-
{:else if app.icon}
|
|
22
|
-
<Icon i={app.icon} --size="1.5em" />
|
|
23
|
-
{:else}
|
|
24
|
-
<Icon i="image-circle-xmark" --size="1.5em" />
|
|
25
|
-
{/if}
|
|
26
|
-
<span>{app.name}</span>
|
|
27
|
-
</a>
|
|
28
|
-
{:else}
|
|
29
|
-
<i>No apps available.</i>
|
|
30
|
-
{/each}
|
|
31
|
-
{:catch}
|
|
32
|
-
<i>Couldn't load apps.</i>
|
|
33
|
-
{/await}
|
|
34
|
-
</Popover>
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { fade } from 'svelte/transition';
|
|
3
|
-
import { wait } from 'utilium';
|
|
4
|
-
import Icon from './Icon.svelte';
|
|
5
|
-
|
|
6
|
-
const { value, type = 'text/plain' }: { value: BlobPart; type?: string } = $props();
|
|
7
|
-
|
|
8
|
-
let success = $state(false);
|
|
9
|
-
|
|
10
|
-
async function onclick() {
|
|
11
|
-
const blob = new Blob([value], { type });
|
|
12
|
-
const item = new ClipboardItem({ [type]: blob });
|
|
13
|
-
await navigator.clipboard.write([item]);
|
|
14
|
-
success = true;
|
|
15
|
-
await wait(3000);
|
|
16
|
-
success = false;
|
|
17
|
-
}
|
|
18
|
-
</script>
|
|
19
|
-
|
|
20
|
-
<button {onclick}>
|
|
21
|
-
{#if success}
|
|
22
|
-
<span transition:fade><Icon i="check" /></span>
|
|
23
|
-
{:else}
|
|
24
|
-
<span transition:fade><Icon i="copy" /></span>
|
|
25
|
-
{/if}
|
|
26
|
-
</button>
|
|
27
|
-
|
|
28
|
-
<style>
|
|
29
|
-
button {
|
|
30
|
-
position: relative;
|
|
31
|
-
display: inline-block;
|
|
32
|
-
width: 1em;
|
|
33
|
-
height: 1em;
|
|
34
|
-
border: none;
|
|
35
|
-
background: transparent;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
span {
|
|
39
|
-
position: absolute;
|
|
40
|
-
inset: 0;
|
|
41
|
-
}
|
|
42
|
-
</style>
|
package/web/lib/Dialog.svelte
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
let { children, dialog = $bindable(), ...rest } = $props();
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<dialog bind:this={dialog} {...rest}>
|
|
6
|
-
{@render children()}
|
|
7
|
-
</dialog>
|
|
8
|
-
|
|
9
|
-
<!-- svelte-ignore css_unused_selector -->
|
|
10
|
-
<style>
|
|
11
|
-
dialog {
|
|
12
|
-
border-radius: 1em;
|
|
13
|
-
background: #111;
|
|
14
|
-
border: 1px solid #8888;
|
|
15
|
-
padding: 1em;
|
|
16
|
-
|
|
17
|
-
form {
|
|
18
|
-
display: contents;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
dialog::backdrop {
|
|
23
|
-
background: #0003;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
dialog[open] {
|
|
27
|
-
animation: zoom 0.25s cubic-bezier(0.35, 1.55, 0.65, 1);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
@keyframes zoom {
|
|
31
|
-
from {
|
|
32
|
-
transform: scale(0.95);
|
|
33
|
-
}
|
|
34
|
-
to {
|
|
35
|
-
transform: scale(1);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
dialog[open]::backdrop {
|
|
40
|
-
animation: fade 0.25s ease-out;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
@keyframes fade {
|
|
44
|
-
from {
|
|
45
|
-
opacity: 0;
|
|
46
|
-
}
|
|
47
|
-
to {
|
|
48
|
-
opacity: 1;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
</style>
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import Dialog from './Dialog.svelte';
|
|
3
|
-
|
|
4
|
-
function resolveRedirectAfter() {
|
|
5
|
-
const url = new URL(location.href);
|
|
6
|
-
const maybe = url.searchParams.get('after');
|
|
7
|
-
if (!maybe || maybe == url.pathname) return '/';
|
|
8
|
-
for (const prefix of ['/api/']) if (maybe.startsWith(prefix)) return '/';
|
|
9
|
-
return maybe || '/';
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
let {
|
|
13
|
-
children,
|
|
14
|
-
dialog = $bindable(),
|
|
15
|
-
submitText = 'Submit',
|
|
16
|
-
cancel = () => {},
|
|
17
|
-
submit = (data: object): Promise<any> => Promise.resolve(),
|
|
18
|
-
pageMode = false,
|
|
19
|
-
submitDanger = false,
|
|
20
|
-
header,
|
|
21
|
-
footer,
|
|
22
|
-
...rest
|
|
23
|
-
}: {
|
|
24
|
-
children(): any;
|
|
25
|
-
dialog?: HTMLDialogElement;
|
|
26
|
-
/** Change the text displayed for the submit button */
|
|
27
|
-
submitText?: string;
|
|
28
|
-
/** Basically a callback for when the dialog is canceled */
|
|
29
|
-
cancel?(): unknown;
|
|
30
|
-
/** Called on submission, this should do the actual submission */
|
|
31
|
-
submit?(data: Record<string, FormDataEntryValue>): Promise<any>;
|
|
32
|
-
/** Whether to display the dialog as a full-page form */
|
|
33
|
-
pageMode?: boolean;
|
|
34
|
-
submitDanger?: boolean;
|
|
35
|
-
header?(): any;
|
|
36
|
-
footer?(): any;
|
|
37
|
-
} = $props();
|
|
38
|
-
|
|
39
|
-
let error = $state<string>();
|
|
40
|
-
|
|
41
|
-
$effect(() => {
|
|
42
|
-
if (pageMode) dialog!.showModal();
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
function onclose(e: MouseEvent) {
|
|
46
|
-
e.preventDefault();
|
|
47
|
-
cancel();
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function onsubmit(e: SubmitEvent & { currentTarget: HTMLFormElement }) {
|
|
51
|
-
e.preventDefault();
|
|
52
|
-
const data = Object.fromEntries(new FormData(e.currentTarget));
|
|
53
|
-
submit(data)
|
|
54
|
-
.then(result => {
|
|
55
|
-
if (pageMode) window.location.href = resolveRedirectAfter();
|
|
56
|
-
else dialog!.close();
|
|
57
|
-
})
|
|
58
|
-
.catch((e: any) => {
|
|
59
|
-
if (!e) error = 'An unknown error occurred';
|
|
60
|
-
else if (typeof e == 'object' && 'message' in e) error = e.message;
|
|
61
|
-
else error = e;
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
</script>
|
|
65
|
-
|
|
66
|
-
{#snippet submitButton()}
|
|
67
|
-
<button type="submit" class={['submit', submitDanger && 'danger']}>{submitText}</button>
|
|
68
|
-
{/snippet}
|
|
69
|
-
|
|
70
|
-
<Dialog bind:dialog {onclose} {...rest}>
|
|
71
|
-
{@render header?.()}
|
|
72
|
-
<form {onsubmit} class="main" method="dialog">
|
|
73
|
-
{#if error}
|
|
74
|
-
<div class="error">{error}</div>
|
|
75
|
-
{/if}
|
|
76
|
-
{@render children()}
|
|
77
|
-
{#if pageMode}
|
|
78
|
-
{@render submitButton()}
|
|
79
|
-
{:else}
|
|
80
|
-
<div class="actions">
|
|
81
|
-
<button type="button" onclick={() => dialog!.close()}>Cancel</button>
|
|
82
|
-
{@render submitButton()}
|
|
83
|
-
</div>
|
|
84
|
-
{/if}
|
|
85
|
-
</form>
|
|
86
|
-
{@render footer?.()}
|
|
87
|
-
</Dialog>
|
|
88
|
-
|
|
89
|
-
<style>
|
|
90
|
-
.actions {
|
|
91
|
-
display: flex;
|
|
92
|
-
gap: 1em;
|
|
93
|
-
flex-direction: row;
|
|
94
|
-
justify-content: space-between;
|
|
95
|
-
}
|
|
96
|
-
</style>
|
package/web/lib/Icon.svelte
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
const { i, ...rest } = $props();
|
|
3
|
-
const [style, id] = $derived(i.includes('/') ? i.split('/') : ['solid', i]);
|
|
4
|
-
const href = $derived(`/icons/${style}.svg#${id}`);
|
|
5
|
-
</script>
|
|
6
|
-
|
|
7
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" {...rest}>
|
|
8
|
-
<use {href} />
|
|
9
|
-
</svg>
|
|
10
|
-
|
|
11
|
-
<style>
|
|
12
|
-
svg {
|
|
13
|
-
width: var(--size, 1em);
|
|
14
|
-
height: var(--size, 1em);
|
|
15
|
-
display: inline-block;
|
|
16
|
-
fill: var(--fill, #bbb);
|
|
17
|
-
}
|
|
18
|
-
</style>
|
package/web/lib/Login.svelte
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { loginByEmail } from '@axium/client/user';
|
|
3
|
-
import FormDialog from './FormDialog.svelte';
|
|
4
|
-
|
|
5
|
-
let { dialog = $bindable(), fullPage = false }: { dialog?: HTMLDialogElement; fullPage?: boolean } = $props();
|
|
6
|
-
|
|
7
|
-
function submit(data: { email: string }) {
|
|
8
|
-
if (typeof data.email != 'string') {
|
|
9
|
-
throw 'Tried to upload a file for an email. Huh?!';
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
return loginByEmail(data.email);
|
|
13
|
-
}
|
|
14
|
-
</script>
|
|
15
|
-
|
|
16
|
-
<FormDialog bind:dialog submitText="Login" {submit} pageMode={fullPage}>
|
|
17
|
-
<div>
|
|
18
|
-
<label for="email">Email</label>
|
|
19
|
-
<input name="email" type="email" required />
|
|
20
|
-
</div>
|
|
21
|
-
{#snippet footer()}
|
|
22
|
-
{#if fullPage}
|
|
23
|
-
<div class="footer">
|
|
24
|
-
<a href="/register">Register instead</a>
|
|
25
|
-
</div>
|
|
26
|
-
{/if}
|
|
27
|
-
{/snippet}
|
|
28
|
-
</FormDialog>
|
|
29
|
-
|
|
30
|
-
<style>
|
|
31
|
-
.footer {
|
|
32
|
-
margin-bottom: 1em;
|
|
33
|
-
text-align: center;
|
|
34
|
-
background: none;
|
|
35
|
-
}
|
|
36
|
-
</style>
|
package/web/lib/Logout.svelte
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { logoutCurrentSession } from '@axium/client/user';
|
|
3
|
-
import FormDialog from './FormDialog.svelte';
|
|
4
|
-
|
|
5
|
-
let { dialog = $bindable(), fullPage = false }: { dialog?: HTMLDialogElement; fullPage?: boolean } = $props();
|
|
6
|
-
</script>
|
|
7
|
-
|
|
8
|
-
<FormDialog
|
|
9
|
-
pageMode={fullPage}
|
|
10
|
-
bind:dialog
|
|
11
|
-
submitText="Log Out"
|
|
12
|
-
submit={() => logoutCurrentSession().then(() => (window.location.href = '/'))}
|
|
13
|
-
>
|
|
14
|
-
<p>Are you sure you want to log out?</p>
|
|
15
|
-
{#if fullPage}
|
|
16
|
-
<button
|
|
17
|
-
onclick={e => {
|
|
18
|
-
e.preventDefault();
|
|
19
|
-
dialog!.close();
|
|
20
|
-
history.back();
|
|
21
|
-
}}>Take me back</button
|
|
22
|
-
>
|
|
23
|
-
{/if}
|
|
24
|
-
</FormDialog>
|
package/web/lib/NumberBar.svelte
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
const { min = 0, max, value, text } = $props();
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<div class="Bar">
|
|
6
|
-
<div class="fill" style="width: {((value - min) / (max - min)) * 100}%"></div>
|
|
7
|
-
{#if text}<span class="text">{text}</span>{/if}
|
|
8
|
-
</div>
|
|
9
|
-
|
|
10
|
-
<style>
|
|
11
|
-
.Bar {
|
|
12
|
-
position: relative;
|
|
13
|
-
border-radius: calc(var(--height, 2em) / 2);
|
|
14
|
-
height: var(--height, 2em);
|
|
15
|
-
background-color: #444;
|
|
16
|
-
overflow: hidden;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
.text {
|
|
20
|
-
position: absolute;
|
|
21
|
-
inset: calc(calc(var(--height, 2em) - 1em) / 2) 1em;
|
|
22
|
-
width: fit-content;
|
|
23
|
-
line-height: 1;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
.fill {
|
|
27
|
-
border-radius: calc(var(--height, 2em) / 2);
|
|
28
|
-
height: 100%;
|
|
29
|
-
background-color: var(--fill, #465);
|
|
30
|
-
}
|
|
31
|
-
</style>
|