@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.
Files changed (118) hide show
  1. package/build/client/_app/immutable/chunks/{B4jrgZ2v.js → CV6aJBRA.js} +1 -1
  2. package/build/client/_app/immutable/chunks/CV6aJBRA.js.br +0 -0
  3. package/build/client/_app/immutable/chunks/CV6aJBRA.js.gz +0 -0
  4. package/build/client/_app/immutable/chunks/{CyaTInFC.js → CuRH3mnc.js} +1 -1
  5. package/build/client/_app/immutable/chunks/CuRH3mnc.js.br +0 -0
  6. package/build/client/_app/immutable/chunks/CuRH3mnc.js.gz +0 -0
  7. package/build/client/_app/immutable/chunks/{BB26zgjv.js → D3N9NXka.js} +12 -12
  8. package/build/client/_app/immutable/chunks/D3N9NXka.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/{BB26zgjv.js.gz → D3N9NXka.js.gz} +0 -0
  10. package/build/client/_app/immutable/entry/{app.CI36K0Ii.js → app.D7YMAAqT.js} +2 -2
  11. package/build/client/_app/immutable/entry/app.D7YMAAqT.js.br +0 -0
  12. package/build/client/_app/immutable/entry/app.D7YMAAqT.js.gz +0 -0
  13. package/build/client/_app/immutable/entry/start.CCYA4gbZ.js +1 -0
  14. package/build/client/_app/immutable/entry/start.CCYA4gbZ.js.br +2 -0
  15. package/build/client/_app/immutable/entry/start.CCYA4gbZ.js.gz +0 -0
  16. package/build/client/_app/immutable/nodes/{1.C41FMzGJ.js → 1.B48R4hTL.js} +1 -1
  17. package/build/client/_app/immutable/nodes/1.B48R4hTL.js.br +0 -0
  18. package/build/client/_app/immutable/nodes/1.B48R4hTL.js.gz +0 -0
  19. package/build/client/_app/immutable/nodes/{3.Bx9a_cbp.js → 3.jHOFxZjh.js} +1 -1
  20. package/build/client/_app/immutable/nodes/3.jHOFxZjh.js.br +0 -0
  21. package/build/client/_app/immutable/nodes/3.jHOFxZjh.js.gz +0 -0
  22. package/build/client/_app/immutable/nodes/{4.Bv7tqhIp.js → 4.Chs3ZlQq.js} +1 -1
  23. package/build/client/_app/immutable/nodes/4.Chs3ZlQq.js.br +0 -0
  24. package/build/client/_app/immutable/nodes/4.Chs3ZlQq.js.gz +0 -0
  25. package/build/client/_app/immutable/nodes/5.eFtGuF8y.js +1 -0
  26. package/build/client/_app/immutable/nodes/5.eFtGuF8y.js.br +2 -0
  27. package/build/client/_app/immutable/nodes/5.eFtGuF8y.js.gz +0 -0
  28. package/build/client/_app/immutable/nodes/{6.BJG5gZTX.js → 6.2qXwWTTQ.js} +1 -1
  29. package/build/client/_app/immutable/nodes/6.2qXwWTTQ.js.br +0 -0
  30. package/build/client/_app/immutable/nodes/6.2qXwWTTQ.js.gz +0 -0
  31. package/build/client/_app/version.json +1 -1
  32. package/build/client/_app/version.json.br +0 -0
  33. package/build/client/_app/version.json.gz +0 -0
  34. package/build/client/styles.css +22 -21
  35. package/build/client/styles.css.br +0 -0
  36. package/build/client/styles.css.gz +0 -0
  37. package/build/client/theme.css +41 -0
  38. package/build/client/theme.css.br +0 -0
  39. package/build/client/theme.css.gz +0 -0
  40. package/build/server/chunks/{1-DLB141jg.js → 1-DgpDfXPt.js} +2 -2
  41. package/build/server/chunks/{1-DLB141jg.js.map → 1-DgpDfXPt.js.map} +1 -1
  42. package/build/server/chunks/{3-BLvjl1b0.js → 3-6GCmTvSE.js} +3 -3
  43. package/build/server/chunks/{3-BLvjl1b0.js.map → 3-6GCmTvSE.js.map} +1 -1
  44. package/build/server/chunks/{4-_Z3XM2ZU.js → 4-CTFpM_SP.js} +3 -3
  45. package/build/server/chunks/{4-_Z3XM2ZU.js.map → 4-CTFpM_SP.js.map} +1 -1
  46. package/build/server/chunks/{5-CGj2cpNi.js → 5-BpCB8dc9.js} +3 -3
  47. package/build/server/chunks/{5-CGj2cpNi.js.map → 5-BpCB8dc9.js.map} +1 -1
  48. package/build/server/chunks/{6-DxwYDhel.js → 6-BcoKkoJ_.js} +3 -3
  49. package/build/server/chunks/{6-DxwYDhel.js.map → 6-BcoKkoJ_.js.map} +1 -1
  50. package/build/server/chunks/{FormDialog-CieDuaGR.js → FormDialog-B3fXC6M4.js} +4 -4
  51. package/build/server/chunks/{FormDialog-CieDuaGR.js.map → FormDialog-B3fXC6M4.js.map} +1 -1
  52. package/build/server/chunks/{Logout-BuFlzVUY.js → Logout-naelGSrR.js} +2 -2
  53. package/build/server/chunks/{Logout-BuFlzVUY.js.map → Logout-naelGSrR.js.map} +1 -1
  54. package/build/server/chunks/{_page.svelte-C0BGwZCw.js → _page.svelte-BLt1Vm33.js} +6 -6
  55. package/build/server/chunks/_page.svelte-BLt1Vm33.js.map +1 -0
  56. package/build/server/chunks/{_page.svelte-tm2MwH-6.js → _page.svelte-Y6ezsJUw.js} +2 -2
  57. package/build/server/chunks/{_page.svelte-tm2MwH-6.js.map → _page.svelte-Y6ezsJUw.js.map} +1 -1
  58. package/build/server/chunks/{_page.svelte-pr5d_b15.js → _page.svelte-cU3u-tVN.js} +3 -3
  59. package/build/server/chunks/{_page.svelte-pr5d_b15.js.map → _page.svelte-cU3u-tVN.js.map} +1 -1
  60. package/build/server/chunks/{_page.svelte-Diva26gb.js → _page.svelte-oKnc0uuc.js} +2 -2
  61. package/build/server/chunks/{_page.svelte-Diva26gb.js.map → _page.svelte-oKnc0uuc.js.map} +1 -1
  62. package/build/server/chunks/{hooks.server-DUHg5UuJ.js → hooks.server-CFWOVtwo.js} +2 -2
  63. package/build/server/chunks/{hooks.server-DUHg5UuJ.js.map → hooks.server-CFWOVtwo.js.map} +1 -1
  64. package/build/server/index.js +3 -3
  65. package/build/server/index.js.map +1 -1
  66. package/build/server/manifest.js +7 -7
  67. package/build/server/manifest.js.map +1 -1
  68. package/package.json +2 -4
  69. package/routes/account/+page.svelte +1 -1
  70. package/routes/login/+page.svelte +1 -1
  71. package/routes/logout/+page.svelte +1 -1
  72. package/routes/register/+page.svelte +1 -1
  73. package/svelte.config.js +2 -2
  74. package/web/template.html +1 -0
  75. package/assets/icons/brands.svg +0 -1493
  76. package/assets/icons/light.svg +0 -9977
  77. package/assets/icons/regular.svg +0 -9977
  78. package/assets/icons/solid.svg +0 -9977
  79. package/assets/styles.css +0 -119
  80. package/build/client/_app/immutable/chunks/B4jrgZ2v.js.br +0 -0
  81. package/build/client/_app/immutable/chunks/B4jrgZ2v.js.gz +0 -0
  82. package/build/client/_app/immutable/chunks/BB26zgjv.js.br +0 -0
  83. package/build/client/_app/immutable/chunks/CyaTInFC.js.br +0 -0
  84. package/build/client/_app/immutable/chunks/CyaTInFC.js.gz +0 -0
  85. package/build/client/_app/immutable/entry/app.CI36K0Ii.js.br +0 -0
  86. package/build/client/_app/immutable/entry/app.CI36K0Ii.js.gz +0 -0
  87. package/build/client/_app/immutable/entry/start.CChz4wnJ.js +0 -1
  88. package/build/client/_app/immutable/entry/start.CChz4wnJ.js.br +0 -0
  89. package/build/client/_app/immutable/entry/start.CChz4wnJ.js.gz +0 -0
  90. package/build/client/_app/immutable/nodes/1.C41FMzGJ.js.br +0 -0
  91. package/build/client/_app/immutable/nodes/1.C41FMzGJ.js.gz +0 -0
  92. package/build/client/_app/immutable/nodes/3.Bx9a_cbp.js.br +0 -0
  93. package/build/client/_app/immutable/nodes/3.Bx9a_cbp.js.gz +0 -0
  94. package/build/client/_app/immutable/nodes/4.Bv7tqhIp.js.br +0 -0
  95. package/build/client/_app/immutable/nodes/4.Bv7tqhIp.js.gz +0 -0
  96. package/build/client/_app/immutable/nodes/5._SsovuZL.js +0 -1
  97. package/build/client/_app/immutable/nodes/5._SsovuZL.js.br +0 -0
  98. package/build/client/_app/immutable/nodes/5._SsovuZL.js.gz +0 -0
  99. package/build/client/_app/immutable/nodes/6.BJG5gZTX.js.br +0 -0
  100. package/build/client/_app/immutable/nodes/6.BJG5gZTX.js.gz +0 -0
  101. package/build/server/chunks/_page.svelte-C0BGwZCw.js.map +0 -1
  102. package/web/lib/AccessControl.svelte +0 -37
  103. package/web/lib/AccessControlDialog.svelte +0 -12
  104. package/web/lib/AppMenu.svelte +0 -34
  105. package/web/lib/ClipboardCopy.svelte +0 -42
  106. package/web/lib/Dialog.svelte +0 -51
  107. package/web/lib/FormDialog.svelte +0 -96
  108. package/web/lib/Icon.svelte +0 -18
  109. package/web/lib/Login.svelte +0 -36
  110. package/web/lib/Logout.svelte +0 -24
  111. package/web/lib/NumberBar.svelte +0 -31
  112. package/web/lib/Popover.svelte +0 -46
  113. package/web/lib/Register.svelte +0 -32
  114. package/web/lib/Toast.svelte +0 -35
  115. package/web/lib/Upload.svelte +0 -60
  116. package/web/lib/UserCard.svelte +0 -48
  117. package/web/lib/WithContextMenu.svelte +0 -73
  118. 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
- }
@@ -1 +0,0 @@
1
- import{l as o,a as r}from"../chunks/B4jrgZ2v.js";export{o as load_css,r as start};
@@ -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};
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>