@axium/server 0.19.7 → 0.19.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 (171) hide show
  1. package/build/client/_app/immutable/assets/3.B53jfNY9.css +1 -0
  2. package/build/client/_app/immutable/assets/3.B53jfNY9.css.br +0 -0
  3. package/build/client/_app/immutable/assets/3.B53jfNY9.css.gz +0 -0
  4. package/build/client/_app/immutable/assets/_page.dJj6MsMM.css +1 -0
  5. package/build/client/_app/immutable/assets/_page.dJj6MsMM.css.br +0 -0
  6. package/build/client/_app/immutable/assets/_page.dJj6MsMM.css.gz +0 -0
  7. package/build/client/_app/immutable/chunks/BJss2F7v.js +31 -0
  8. package/build/client/_app/immutable/chunks/BJss2F7v.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/BJss2F7v.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/{BYEtX5Az.js → BK1-xGGj.js} +1 -1
  11. package/build/client/_app/immutable/chunks/BK1-xGGj.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/BK1-xGGj.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/{IgiyYk6u.js → BZOe2Jko.js} +1 -1
  14. package/build/client/_app/immutable/chunks/BZOe2Jko.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/BZOe2Jko.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/{DY1x3fBx.js → DEcO6BQR.js} +1 -1
  17. package/build/client/_app/immutable/chunks/DEcO6BQR.js.br +5 -0
  18. package/build/client/_app/immutable/chunks/DEcO6BQR.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/{FWeOBoAM.js → DGhIdZ_j.js} +1 -1
  20. package/build/client/_app/immutable/chunks/DGhIdZ_j.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/DGhIdZ_j.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/DQaZ7GJF.js +3 -0
  23. package/build/client/_app/immutable/chunks/DQaZ7GJF.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/DQaZ7GJF.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/{p-F-zYzk.js → sfKJ2mhH.js} +1 -1
  26. package/build/client/_app/immutable/chunks/sfKJ2mhH.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/sfKJ2mhH.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/uU8Mt6Mg.js +1 -0
  29. package/build/client/_app/immutable/chunks/uU8Mt6Mg.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/uU8Mt6Mg.js.gz +0 -0
  31. package/build/client/_app/immutable/entry/{app.CAgyUG0l.js → app.CtLxdB3j.js} +2 -2
  32. package/build/client/_app/immutable/entry/app.CtLxdB3j.js.br +0 -0
  33. package/build/client/_app/immutable/entry/app.CtLxdB3j.js.gz +0 -0
  34. package/build/client/_app/immutable/entry/start.BHoGWGCr.js +1 -0
  35. package/build/client/_app/immutable/entry/start.BHoGWGCr.js.br +0 -0
  36. package/build/client/_app/immutable/entry/start.BHoGWGCr.js.gz +0 -0
  37. package/build/client/_app/immutable/nodes/{0.fU2Fkia3.js → 0.DuvLHQ5N.js} +1 -1
  38. package/build/client/_app/immutable/nodes/0.DuvLHQ5N.js.br +0 -0
  39. package/build/client/_app/immutable/nodes/0.DuvLHQ5N.js.gz +0 -0
  40. package/build/client/_app/immutable/nodes/{1.DuyZ1f2y.js → 1.wyN-TXT3.js} +1 -1
  41. package/build/client/_app/immutable/nodes/1.wyN-TXT3.js.br +0 -0
  42. package/build/client/_app/immutable/nodes/1.wyN-TXT3.js.gz +0 -0
  43. package/build/client/_app/immutable/nodes/{2.Cczp5_pl.js → 2.CiWhhaCq.js} +1 -1
  44. package/build/client/_app/immutable/nodes/2.CiWhhaCq.js.br +0 -0
  45. package/build/client/_app/immutable/nodes/2.CiWhhaCq.js.gz +0 -0
  46. package/build/client/_app/immutable/nodes/3.Cs-6XQLG.js +1 -0
  47. package/build/client/_app/immutable/nodes/3.Cs-6XQLG.js.br +0 -0
  48. package/build/client/_app/immutable/nodes/3.Cs-6XQLG.js.gz +0 -0
  49. package/build/client/_app/immutable/nodes/{4.DFZa97F0.js → 4.CYhOOrTZ.js} +1 -1
  50. package/build/client/_app/immutable/nodes/4.CYhOOrTZ.js.br +0 -0
  51. package/build/client/_app/immutable/nodes/4.CYhOOrTZ.js.gz +0 -0
  52. package/build/client/_app/immutable/nodes/5.CZtEsvvr.js +1 -0
  53. package/build/client/_app/immutable/nodes/5.CZtEsvvr.js.br +0 -0
  54. package/build/client/_app/immutable/nodes/5.CZtEsvvr.js.gz +0 -0
  55. package/build/client/_app/immutable/nodes/{6.ezb4muQm.js → 6.DpkTCLEe.js} +1 -1
  56. package/build/client/_app/immutable/nodes/6.DpkTCLEe.js.br +0 -0
  57. package/build/client/_app/immutable/nodes/6.DpkTCLEe.js.gz +0 -0
  58. package/build/client/_app/version.json +1 -1
  59. package/build/client/_app/version.json.br +0 -0
  60. package/build/client/_app/version.json.gz +0 -0
  61. package/build/server/chunks/{0-BwO1RCtn.js → 0-B8fDicB8.js} +2 -2
  62. package/build/server/chunks/{0-BwO1RCtn.js.map → 0-B8fDicB8.js.map} +1 -1
  63. package/build/server/chunks/1-CZaQz0kM.js +9 -0
  64. package/build/server/chunks/{1-CHeaiyyB.js.map → 1-CZaQz0kM.js.map} +1 -1
  65. package/build/server/chunks/{2-BwMXZ3uH.js → 2-CVTt4PZM.js} +2 -2
  66. package/build/server/chunks/{2-BwMXZ3uH.js.map → 2-CVTt4PZM.js.map} +1 -1
  67. package/build/server/chunks/3-CYzzOoBn.js +13 -0
  68. package/build/server/chunks/3-CYzzOoBn.js.map +1 -0
  69. package/build/server/chunks/4-jbfAhnSm.js +9 -0
  70. package/build/server/chunks/4-jbfAhnSm.js.map +1 -0
  71. package/build/server/chunks/5-CfXowMzQ.js +9 -0
  72. package/build/server/chunks/5-CfXowMzQ.js.map +1 -0
  73. package/build/server/chunks/6-BRekt1OA.js +9 -0
  74. package/build/server/chunks/6-BRekt1OA.js.map +1 -0
  75. package/build/server/chunks/{user-BxKya_IG.js → FormDialog-qGzPcWE3.js} +779 -806
  76. package/build/server/chunks/FormDialog-qGzPcWE3.js.map +1 -0
  77. package/build/server/chunks/{Logout-Bn4ION8s.js → Logout-DWwALPvt.js} +3 -3
  78. package/build/server/chunks/Logout-DWwALPvt.js.map +1 -0
  79. package/build/server/chunks/{_page.svelte-C5WDLp_N.js → _page.svelte-BypU2Yzj.js} +3 -3
  80. package/build/server/chunks/_page.svelte-BypU2Yzj.js.map +1 -0
  81. package/build/server/chunks/{_page.svelte-Cajk6qyo.js → _page.svelte-CYPwBw0g.js} +3 -3
  82. package/build/server/chunks/_page.svelte-CYPwBw0g.js.map +1 -0
  83. package/build/server/chunks/_page.svelte-Dz_KPYcN.js +299 -0
  84. package/build/server/chunks/_page.svelte-Dz_KPYcN.js.map +1 -0
  85. package/build/server/chunks/_page.svelte-Fe_xIcJF.js +11 -0
  86. package/build/server/chunks/{_page.svelte-DfGguJ-z.js.map → _page.svelte-Fe_xIcJF.js.map} +1 -1
  87. package/build/server/chunks/{error.svelte-DkJRpKga.js → error.svelte-CZg-BdYa.js} +3 -3
  88. package/build/server/chunks/error.svelte-CZg-BdYa.js.map +1 -0
  89. package/build/server/chunks/{exports-Cc9yggiy.js → exports-Cy4FWdYs.js} +27 -4
  90. package/build/server/chunks/exports-Cy4FWdYs.js.map +1 -0
  91. package/build/server/chunks/{hooks.server-B6C3vGPN.js → hooks.server-Cpa72VJw.js} +3 -3
  92. package/build/server/chunks/{hooks.server-B6C3vGPN.js.map → hooks.server-Cpa72VJw.js.map} +1 -1
  93. package/build/server/chunks/{index-CBVFb-Fk.js → index-CNBqpMEu.js} +4 -42
  94. package/build/server/chunks/index-CNBqpMEu.js.map +1 -0
  95. package/build/server/index.js +3206 -2745
  96. package/build/server/index.js.map +1 -1
  97. package/build/server/manifest.js +11 -8
  98. package/build/server/manifest.js.map +1 -1
  99. package/dist/requests.d.ts +1 -2
  100. package/package.json +1 -1
  101. package/routes/account/+page.svelte +156 -177
  102. package/routes/account/+page.ts +20 -0
  103. package/web/lib/WithContextMenu.svelte +56 -15
  104. package/build/client/_app/immutable/assets/3.C2J9FN5q.css +0 -1
  105. package/build/client/_app/immutable/assets/3.C2J9FN5q.css.br +0 -0
  106. package/build/client/_app/immutable/assets/3.C2J9FN5q.css.gz +0 -0
  107. package/build/client/_app/immutable/assets/_page.CAgJ6UBm.css +0 -1
  108. package/build/client/_app/immutable/assets/_page.CAgJ6UBm.css.br +0 -0
  109. package/build/client/_app/immutable/assets/_page.CAgJ6UBm.css.gz +0 -0
  110. package/build/client/_app/immutable/chunks/BYEtX5Az.js.br +0 -0
  111. package/build/client/_app/immutable/chunks/BYEtX5Az.js.gz +0 -0
  112. package/build/client/_app/immutable/chunks/D9BNd75C.js +0 -3
  113. package/build/client/_app/immutable/chunks/D9BNd75C.js.br +0 -0
  114. package/build/client/_app/immutable/chunks/D9BNd75C.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/DCUM25og.js +0 -1
  116. package/build/client/_app/immutable/chunks/DCUM25og.js.br +0 -0
  117. package/build/client/_app/immutable/chunks/DCUM25og.js.gz +0 -0
  118. package/build/client/_app/immutable/chunks/DY1x3fBx.js.br +0 -0
  119. package/build/client/_app/immutable/chunks/DY1x3fBx.js.gz +0 -0
  120. package/build/client/_app/immutable/chunks/DYZBB-Ix.js +0 -31
  121. package/build/client/_app/immutable/chunks/DYZBB-Ix.js.br +0 -0
  122. package/build/client/_app/immutable/chunks/DYZBB-Ix.js.gz +0 -0
  123. package/build/client/_app/immutable/chunks/FWeOBoAM.js.br +0 -0
  124. package/build/client/_app/immutable/chunks/FWeOBoAM.js.gz +0 -0
  125. package/build/client/_app/immutable/chunks/IgiyYk6u.js.br +0 -0
  126. package/build/client/_app/immutable/chunks/IgiyYk6u.js.gz +0 -0
  127. package/build/client/_app/immutable/chunks/p-F-zYzk.js.br +0 -0
  128. package/build/client/_app/immutable/chunks/p-F-zYzk.js.gz +0 -0
  129. package/build/client/_app/immutable/entry/app.CAgyUG0l.js.br +0 -0
  130. package/build/client/_app/immutable/entry/app.CAgyUG0l.js.gz +0 -0
  131. package/build/client/_app/immutable/entry/start.CxTr3r7v.js +0 -1
  132. package/build/client/_app/immutable/entry/start.CxTr3r7v.js.br +0 -2
  133. package/build/client/_app/immutable/entry/start.CxTr3r7v.js.gz +0 -0
  134. package/build/client/_app/immutable/nodes/0.fU2Fkia3.js.br +0 -0
  135. package/build/client/_app/immutable/nodes/0.fU2Fkia3.js.gz +0 -0
  136. package/build/client/_app/immutable/nodes/1.DuyZ1f2y.js.br +0 -0
  137. package/build/client/_app/immutable/nodes/1.DuyZ1f2y.js.gz +0 -0
  138. package/build/client/_app/immutable/nodes/2.Cczp5_pl.js.br +0 -0
  139. package/build/client/_app/immutable/nodes/2.Cczp5_pl.js.gz +0 -0
  140. package/build/client/_app/immutable/nodes/3.BwwptDiR.js +0 -1
  141. package/build/client/_app/immutable/nodes/3.BwwptDiR.js.br +0 -0
  142. package/build/client/_app/immutable/nodes/3.BwwptDiR.js.gz +0 -0
  143. package/build/client/_app/immutable/nodes/4.DFZa97F0.js.br +0 -0
  144. package/build/client/_app/immutable/nodes/4.DFZa97F0.js.gz +0 -0
  145. package/build/client/_app/immutable/nodes/5.CObFvODa.js +0 -1
  146. package/build/client/_app/immutable/nodes/5.CObFvODa.js.br +0 -0
  147. package/build/client/_app/immutable/nodes/5.CObFvODa.js.gz +0 -0
  148. package/build/client/_app/immutable/nodes/6.ezb4muQm.js.br +0 -0
  149. package/build/client/_app/immutable/nodes/6.ezb4muQm.js.gz +0 -0
  150. package/build/server/chunks/1-CHeaiyyB.js +0 -9
  151. package/build/server/chunks/3-BI9EEPQX.js +0 -9
  152. package/build/server/chunks/3-BI9EEPQX.js.map +0 -1
  153. package/build/server/chunks/4-B4PHWuxx.js +0 -9
  154. package/build/server/chunks/4-B4PHWuxx.js.map +0 -1
  155. package/build/server/chunks/5-CIWzJq4D.js +0 -9
  156. package/build/server/chunks/5-CIWzJq4D.js.map +0 -1
  157. package/build/server/chunks/6-BQsBMa_q.js +0 -9
  158. package/build/server/chunks/6-BQsBMa_q.js.map +0 -1
  159. package/build/server/chunks/Logout-Bn4ION8s.js.map +0 -1
  160. package/build/server/chunks/_page.svelte-C5WDLp_N.js.map +0 -1
  161. package/build/server/chunks/_page.svelte-Cajk6qyo.js.map +0 -1
  162. package/build/server/chunks/_page.svelte-DfGguJ-z.js +0 -11
  163. package/build/server/chunks/_page.svelte-WTcgrDKD.js +0 -312
  164. package/build/server/chunks/_page.svelte-WTcgrDKD.js.map +0 -1
  165. package/build/server/chunks/error.svelte-DkJRpKga.js.map +0 -1
  166. package/build/server/chunks/exports-Cc9yggiy.js.map +0 -1
  167. package/build/server/chunks/index-CBVFb-Fk.js.map +0 -1
  168. package/build/server/chunks/user-BxKya_IG.js.map +0 -1
  169. /package/build/client/_app/immutable/assets/{user.Cbakz6hh.css → FormDialog.Cbakz6hh.css} +0 -0
  170. /package/build/client/_app/immutable/assets/{user.Cbakz6hh.css.br → FormDialog.Cbakz6hh.css.br} +0 -0
  171. /package/build/client/_app/immutable/assets/{user.Cbakz6hh.css.gz → FormDialog.Cbakz6hh.css.gz} +0 -0
@@ -10,16 +10,19 @@ return {
10
10
  assets: new Set(["icons/brands.svg","icons/light.svg","icons/regular.svg","icons/solid.svg","styles.css"]),
11
11
  mimeTypes: {".svg":"image/svg+xml",".css":"text/css"},
12
12
  _: {
13
- client: {start:"_app/immutable/entry/start.CxTr3r7v.js",app:"_app/immutable/entry/app.CAgyUG0l.js",imports:["_app/immutable/entry/start.CxTr3r7v.js","_app/immutable/chunks/D9BNd75C.js","_app/immutable/chunks/IgiyYk6u.js","_app/immutable/chunks/DCUM25og.js","_app/immutable/chunks/BYEtX5Az.js","_app/immutable/chunks/p-F-zYzk.js","_app/immutable/entry/app.CAgyUG0l.js","_app/immutable/chunks/DCUM25og.js","_app/immutable/chunks/BYEtX5Az.js","_app/immutable/chunks/DsnmJJEf.js","_app/immutable/chunks/IgiyYk6u.js","_app/immutable/chunks/p-F-zYzk.js","_app/immutable/chunks/FWeOBoAM.js"],stylesheets:[],fonts:[],uses_env_dynamic_public:false},
13
+ client: {start:"_app/immutable/entry/start.BHoGWGCr.js",app:"_app/immutable/entry/app.CtLxdB3j.js",imports:["_app/immutable/entry/start.BHoGWGCr.js","_app/immutable/chunks/DQaZ7GJF.js","_app/immutable/chunks/BZOe2Jko.js","_app/immutable/chunks/uU8Mt6Mg.js","_app/immutable/chunks/BK1-xGGj.js","_app/immutable/chunks/sfKJ2mhH.js","_app/immutable/entry/app.CtLxdB3j.js","_app/immutable/chunks/uU8Mt6Mg.js","_app/immutable/chunks/BK1-xGGj.js","_app/immutable/chunks/DsnmJJEf.js","_app/immutable/chunks/BZOe2Jko.js","_app/immutable/chunks/sfKJ2mhH.js","_app/immutable/chunks/DGhIdZ_j.js"],stylesheets:[],fonts:[],uses_env_dynamic_public:false},
14
14
  nodes: [
15
- __memo(() => import('./chunks/0-BwO1RCtn.js')),
16
- __memo(() => import('./chunks/1-CHeaiyyB.js')),
17
- __memo(() => import('./chunks/2-BwMXZ3uH.js')),
18
- __memo(() => import('./chunks/3-BI9EEPQX.js')),
19
- __memo(() => import('./chunks/4-B4PHWuxx.js')),
20
- __memo(() => import('./chunks/5-CIWzJq4D.js')),
21
- __memo(() => import('./chunks/6-BQsBMa_q.js'))
15
+ __memo(() => import('./chunks/0-B8fDicB8.js')),
16
+ __memo(() => import('./chunks/1-CZaQz0kM.js')),
17
+ __memo(() => import('./chunks/2-CVTt4PZM.js')),
18
+ __memo(() => import('./chunks/3-CYzzOoBn.js')),
19
+ __memo(() => import('./chunks/4-jbfAhnSm.js')),
20
+ __memo(() => import('./chunks/5-CfXowMzQ.js')),
21
+ __memo(() => import('./chunks/6-BRekt1OA.js'))
22
22
  ],
23
+ remotes: {
24
+
25
+ },
23
26
  routes: [
24
27
  {
25
28
  id: "/_axium/default",
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sources":["../../.svelte-kit/adapter-node/manifest.js"],"sourcesContent":["export const manifest = (() => {\nfunction __memo(fn) {\n\tlet value;\n\treturn () => value ??= (value = fn());\n}\n\nreturn {\n\tappDir: \"_app\",\n\tappPath: \"_app\",\n\tassets: new Set([\"icons/brands.svg\",\"icons/light.svg\",\"icons/regular.svg\",\"icons/solid.svg\",\"styles.css\"]),\n\tmimeTypes: {\".svg\":\"image/svg+xml\",\".css\":\"text/css\"},\n\t_: {\n\t\tclient: {start:\"_app/immutable/entry/start.CxTr3r7v.js\",app:\"_app/immutable/entry/app.CAgyUG0l.js\",imports:[\"_app/immutable/entry/start.CxTr3r7v.js\",\"_app/immutable/chunks/D9BNd75C.js\",\"_app/immutable/chunks/IgiyYk6u.js\",\"_app/immutable/chunks/DCUM25og.js\",\"_app/immutable/chunks/BYEtX5Az.js\",\"_app/immutable/chunks/p-F-zYzk.js\",\"_app/immutable/entry/app.CAgyUG0l.js\",\"_app/immutable/chunks/DCUM25og.js\",\"_app/immutable/chunks/BYEtX5Az.js\",\"_app/immutable/chunks/DsnmJJEf.js\",\"_app/immutable/chunks/IgiyYk6u.js\",\"_app/immutable/chunks/p-F-zYzk.js\",\"_app/immutable/chunks/FWeOBoAM.js\"],stylesheets:[],fonts:[],uses_env_dynamic_public:false},\n\t\tnodes: [\n\t\t\t__memo(() => import('./nodes/0.js')),\n\t\t\t__memo(() => import('./nodes/1.js')),\n\t\t\t__memo(() => import('./nodes/2.js')),\n\t\t\t__memo(() => import('./nodes/3.js')),\n\t\t\t__memo(() => import('./nodes/4.js')),\n\t\t\t__memo(() => import('./nodes/5.js')),\n\t\t\t__memo(() => import('./nodes/6.js'))\n\t\t],\n\t\troutes: [\n\t\t\t{\n\t\t\t\tid: \"/_axium/default\",\n\t\t\t\tpattern: /^\\/_axium\\/default\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 2 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/account\",\n\t\t\t\tpattern: /^\\/account\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 3 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/login\",\n\t\t\t\tpattern: /^\\/login\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 4 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/logout\",\n\t\t\t\tpattern: /^\\/logout\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 5 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/register\",\n\t\t\t\tpattern: /^\\/register\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 6 },\n\t\t\t\tendpoint: null\n\t\t\t}\n\t\t],\n\t\tprerendered_routes: new Set([]),\n\t\tmatchers: async () => {\n\t\t\t\n\t\t\treturn { };\n\t\t},\n\t\tserver_assets: {}\n\t}\n}\n})();\n\nexport const prerendered = new Set([]);\n\nexport const base = \"\";"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.js","sources":["../../.svelte-kit/adapter-node/manifest.js"],"sourcesContent":["export const manifest = (() => {\nfunction __memo(fn) {\n\tlet value;\n\treturn () => value ??= (value = fn());\n}\n\nreturn {\n\tappDir: \"_app\",\n\tappPath: \"_app\",\n\tassets: new Set([\"icons/brands.svg\",\"icons/light.svg\",\"icons/regular.svg\",\"icons/solid.svg\",\"styles.css\"]),\n\tmimeTypes: {\".svg\":\"image/svg+xml\",\".css\":\"text/css\"},\n\t_: {\n\t\tclient: {start:\"_app/immutable/entry/start.BHoGWGCr.js\",app:\"_app/immutable/entry/app.CtLxdB3j.js\",imports:[\"_app/immutable/entry/start.BHoGWGCr.js\",\"_app/immutable/chunks/DQaZ7GJF.js\",\"_app/immutable/chunks/BZOe2Jko.js\",\"_app/immutable/chunks/uU8Mt6Mg.js\",\"_app/immutable/chunks/BK1-xGGj.js\",\"_app/immutable/chunks/sfKJ2mhH.js\",\"_app/immutable/entry/app.CtLxdB3j.js\",\"_app/immutable/chunks/uU8Mt6Mg.js\",\"_app/immutable/chunks/BK1-xGGj.js\",\"_app/immutable/chunks/DsnmJJEf.js\",\"_app/immutable/chunks/BZOe2Jko.js\",\"_app/immutable/chunks/sfKJ2mhH.js\",\"_app/immutable/chunks/DGhIdZ_j.js\"],stylesheets:[],fonts:[],uses_env_dynamic_public:false},\n\t\tnodes: [\n\t\t\t__memo(() => import('./nodes/0.js')),\n\t\t\t__memo(() => import('./nodes/1.js')),\n\t\t\t__memo(() => import('./nodes/2.js')),\n\t\t\t__memo(() => import('./nodes/3.js')),\n\t\t\t__memo(() => import('./nodes/4.js')),\n\t\t\t__memo(() => import('./nodes/5.js')),\n\t\t\t__memo(() => import('./nodes/6.js'))\n\t\t],\n\t\tremotes: {\n\t\t\t\n\t\t},\n\t\troutes: [\n\t\t\t{\n\t\t\t\tid: \"/_axium/default\",\n\t\t\t\tpattern: /^\\/_axium\\/default\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 2 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/account\",\n\t\t\t\tpattern: /^\\/account\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 3 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/login\",\n\t\t\t\tpattern: /^\\/login\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 4 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/logout\",\n\t\t\t\tpattern: /^\\/logout\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 5 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/register\",\n\t\t\t\tpattern: /^\\/register\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 6 },\n\t\t\t\tendpoint: null\n\t\t\t}\n\t\t],\n\t\tprerendered_routes: new Set([]),\n\t\tmatchers: async () => {\n\t\t\t\n\t\t\treturn { };\n\t\t},\n\t\tserver_assets: {}\n\t}\n}\n})();\n\nexport const prerendered = new Set([]);\n\nexport const base = \"\";"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { type User } from '@axium/core/user';
2
- import type { Cookies as SK_Cookies } from '@sveltejs/kit';
3
2
  import * as z from 'zod';
4
3
  import { type UserInternal } from './auth.js';
5
4
  import type { ServerRoute } from './routes.js';
@@ -14,7 +13,7 @@ export interface RequestEvent<Params extends Partial<Record<string, string>> = P
14
13
  request: Request;
15
14
  url: URL;
16
15
  params: Params;
17
- cookies: SK_Cookies;
16
+ cookies: any;
18
17
  }
19
18
  export interface ResponseError extends Error {
20
19
  status: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axium/server",
3
- "version": "0.19.7",
3
+ "version": "0.19.9",
4
4
  "author": "James Prevett <axium@jamespre.dev> (https://jamespre.dev)",
5
5
  "funding": {
6
6
  "type": "individual",
@@ -1,44 +1,28 @@
1
1
  <script lang="ts">
2
- import { ClipboardCopy, FormDialog, Icon, Logout } from '@axium/server/components';
3
2
  import {
4
3
  createPasskey,
5
4
  deletePasskey,
6
5
  deleteUser,
7
- emailVerificationEnabled,
8
- getCurrentSession,
9
- getPasskeys,
10
- getSessions,
11
6
  logout,
12
7
  logoutAll,
13
8
  sendVerificationEmail,
14
9
  updatePasskey,
15
10
  updateUser,
16
11
  } from '@axium/client/user';
17
- import type { Passkey, Session } from '@axium/core/api';
18
- import { getUserImage, type User } from '@axium/core/user';
12
+ import { getUserImage } from '@axium/core/user';
13
+ import { ClipboardCopy, FormDialog, Icon, Logout } from '@axium/server/components';
14
+ import type { PageProps } from './$types';
15
+
16
+ const { data }: PageProps = $props();
17
+ const { canVerify } = data;
19
18
 
20
19
  const dialogs = $state<Record<string, HTMLDialogElement>>({});
21
20
 
22
21
  let verificationSent = $state(false);
23
- let currentSession = $state<Session & { user: User }>();
24
- let user = $state<User>();
25
- let canVerify = $state(false);
26
- let passkeys = $state<Passkey[]>([]);
27
- let sessions = $state<Session[]>([]);
28
-
29
- async function ready() {
30
- currentSession = await getCurrentSession().catch(() => {
31
- window.location.href = '/login?after=/account';
32
- return null;
33
- })!;
34
- user = currentSession.user;
35
-
36
- passkeys = await getPasskeys(user.id);
37
-
38
- sessions = await getSessions(user.id);
39
-
40
- canVerify = await emailVerificationEnabled(user.id);
41
- }
22
+ let currentSession = $state(data.currentSession);
23
+ let user = $state(data.user);
24
+ let passkeys = $state(data.passkeys);
25
+ let sessions = $state(data.sessions);
42
26
 
43
27
  async function _editUser(data) {
44
28
  const result = await updateUser(user.id, data);
@@ -56,171 +40,164 @@
56
40
  </button>
57
41
  {/snippet}
58
42
 
59
- {#await ready() then}
60
- <div class="Account flex-content">
61
- <div id="pfp-container">
62
- <img id="pfp" src={getUserImage(user)} alt="User profile" width="100px" height="100px" />
63
- </div>
64
- <p class="greeting">Welcome, {user.name}</p>
43
+ <div class="Account flex-content">
44
+ <div id="pfp-container">
45
+ <img id="pfp" src={getUserImage(user)} alt="User profile" width="100px" height="100px" />
46
+ </div>
47
+ <p class="greeting">Welcome, {user.name}</p>
65
48
 
66
- <div class="section main">
67
- <h3>Personal Information</h3>
68
- <div class="item info">
69
- <p class="subtle">Name</p>
70
- <p>{user.name}</p>
71
- {@render action('edit_name')}
49
+ <div class="section main">
50
+ <h3>Personal Information</h3>
51
+ <div class="item info">
52
+ <p class="subtle">Name</p>
53
+ <p>{user.name}</p>
54
+ {@render action('edit_name')}
55
+ </div>
56
+ <FormDialog bind:dialog={dialogs.edit_name} submit={_editUser} submitText="Change">
57
+ <div>
58
+ <label for="name">What do you want to be called?</label>
59
+ <input name="name" type="text" value={user.name || ''} required />
72
60
  </div>
73
- <FormDialog bind:dialog={dialogs.edit_name} submit={_editUser} submitText="Change">
74
- <div>
75
- <label for="name">What do you want to be called?</label>
76
- <input name="name" type="text" value={user.name || ''} required />
77
- </div>
61
+ </FormDialog>
62
+ <div class="item info">
63
+ <p class="subtle">Email</p>
64
+ <p>
65
+ {user.email}
66
+ {#if user.emailVerified}
67
+ <dfn title="Email verified on {user.emailVerified.toLocaleDateString()}">
68
+ <Icon i="regular/circle-check" />
69
+ </dfn>
70
+ {:else if canVerify}
71
+ <button onclick={() => sendVerificationEmail(user.id).then(() => (verificationSent = true))}>
72
+ {verificationSent ? 'Verification email sent' : 'Verify'}
73
+ </button>
74
+ {/if}
75
+ </p>
76
+ {@render action('edit_email')}
77
+ </div>
78
+ <FormDialog bind:dialog={dialogs.edit_email} submit={_editUser} submitText="Change">
79
+ <div>
80
+ <label for="email">Email Address</label>
81
+ <input name="email" type="email" value={user.email || ''} required />
82
+ </div>
83
+ </FormDialog>
84
+
85
+ <div class="item info">
86
+ <p class="subtle">User ID <dfn title="This is your UUID. It can't be changed."><Icon i="regular/circle-info" /></dfn></p>
87
+ <p>{user.id}</p>
88
+ <ClipboardCopy value={user.id} --size="16px" />
89
+ </div>
90
+ <span>
91
+ <button class="signout" onclick={() => dialogs.logout.showModal()}>Sign Out</button>
92
+ <button style:cursor="pointer" onclick={() => dialogs.delete.showModal()} class="danger">Delete Account</button>
93
+ <Logout bind:dialog={dialogs.logout} />
94
+ <FormDialog
95
+ bind:dialog={dialogs.delete}
96
+ submit={() => deleteUser(user.id).then(() => (window.location.href = '/'))}
97
+ submitText="Delete Account"
98
+ submitDanger
99
+ >
100
+ <p>Are you sure you want to delete your account?<br />This action can't be undone.</p>
78
101
  </FormDialog>
79
- <div class="item info">
80
- <p class="subtle">Email</p>
81
- <p>
82
- {user.email}
83
- {#if user.emailVerified}
84
- <dfn title="Email verified on {user.emailVerified.toLocaleDateString()}">
85
- <Icon i="regular/circle-check" />
86
- </dfn>
87
- {:else if canVerify}
88
- <button onclick={() => sendVerificationEmail(user.id).then(() => (verificationSent = true))}>
89
- {verificationSent ? 'Verification email sent' : 'Verify'}
90
- </button>
91
- {/if}
92
- </p>
93
- {@render action('edit_email')}
102
+ </span>
103
+ </div>
104
+
105
+ <div class="section main">
106
+ <h3>Passkeys</h3>
107
+ {#each passkeys as passkey}
108
+ <div class="item passkey">
109
+ <dfn title={passkey.deviceType == 'multiDevice' ? 'Multiple devices' : 'Single device'}>
110
+ <Icon i={passkey.deviceType == 'multiDevice' ? 'laptop-mobile' : 'mobile'} --size="16px" />
111
+ </dfn>
112
+ <dfn title="This passkey is {passkey.backedUp ? '' : 'not '}backed up">
113
+ <Icon i={passkey.backedUp ? 'circle-check' : 'circle-xmark'} --size="16px" />
114
+ </dfn>
115
+ {#if passkey.name}
116
+ <p>{passkey.name}</p>
117
+ {:else}
118
+ <p class="subtle"><i>Unnamed</i></p>
119
+ {/if}
120
+ <p>Created {passkey.createdAt.toLocaleString()}</p>
121
+ {@render action('edit_passkey#' + passkey.id)}
122
+ {#if passkeys.length > 1}
123
+ {@render action('delete_passkey#' + passkey.id, 'trash')}
124
+ {:else}
125
+ <dfn title="You must have at least one passkey" class="disabled">
126
+ <Icon i="trash-slash" --fill="#888" --size="16px" />
127
+ </dfn>
128
+ {/if}
94
129
  </div>
95
- <FormDialog bind:dialog={dialogs.edit_email} submit={_editUser} submitText="Change">
130
+ <FormDialog
131
+ bind:dialog={dialogs['edit_passkey#' + passkey.id]}
132
+ submit={data => {
133
+ if (typeof data.name != 'string') throw 'Passkey name must be a string';
134
+ passkey.name = data.name;
135
+ return updatePasskey(passkey.id, data);
136
+ }}
137
+ submitText="Change"
138
+ >
96
139
  <div>
97
- <label for="email">Email Address</label>
98
- <input name="email" type="email" value={user.email || ''} required />
140
+ <label for="name">Passkey Name</label>
141
+ <input name="name" type="text" value={passkey.name || ''} />
99
142
  </div>
100
143
  </FormDialog>
144
+ <FormDialog
145
+ bind:dialog={dialogs['delete_passkey#' + passkey.id]}
146
+ submit={() => deletePasskey(passkey.id).then(() => passkeys.splice(passkeys.indexOf(passkey), 1))}
147
+ submitText="Delete"
148
+ submitDanger={true}
149
+ >
150
+ <p>Are you sure you want to delete this passkey?<br />This action can't be undone.</p>
151
+ </FormDialog>
152
+ {/each}
153
+ <span>
154
+ <button onclick={() => createPasskey(user.id).then(passkeys.push.bind(passkeys))}><Icon i="plus" /> Create</button>
155
+ </span>
156
+ </div>
101
157
 
102
- <div class="item info">
103
- <p class="subtle">User ID <dfn title="This is your UUID. It can't be changed."><Icon i="regular/circle-info" /></dfn></p>
104
- <p>{user.id}</p>
105
- <ClipboardCopy value={user.id} --size="16px" />
106
- </div>
107
- <span>
108
- <button class="signout" onclick={() => dialogs.logout.showModal()}>Sign Out</button>
109
- <button style:cursor="pointer" onclick={() => dialogs.delete.showModal()} class="danger">Delete Account</button>
110
- <Logout bind:dialog={dialogs.logout} />
111
- <FormDialog
112
- bind:dialog={dialogs.delete}
113
- submit={() => deleteUser(user.id).then(() => (window.location.href = '/'))}
114
- submitText="Delete Account"
115
- submitDanger
116
- >
117
- <p>Are you sure you want to delete your account?<br />This action can't be undone.</p>
118
- </FormDialog>
119
- </span>
120
- </div>
121
-
122
- <div class="section main">
123
- <h3>Passkeys</h3>
124
- {#each passkeys as passkey}
125
- <div class="item passkey">
126
- <dfn title={passkey.deviceType == 'multiDevice' ? 'Multiple devices' : 'Single device'}>
127
- <Icon i={passkey.deviceType == 'multiDevice' ? 'laptop-mobile' : 'mobile'} --size="16px" />
128
- </dfn>
129
- <dfn title="This passkey is {passkey.backedUp ? '' : 'not '}backed up">
130
- <Icon i={passkey.backedUp ? 'circle-check' : 'circle-xmark'} --size="16px" />
131
- </dfn>
132
- {#if passkey.name}
133
- <p>{passkey.name}</p>
134
- {:else}
135
- <p class="subtle"><i>Unnamed</i></p>
158
+ <div class="section main">
159
+ <h3>Sessions</h3>
160
+ {#each sessions as session}
161
+ <div class="item session">
162
+ <p>
163
+ {session.id.slice(0, 4)}...{session.id.slice(-4)}
164
+ {#if session.id == currentSession.id}
165
+ <span class="current">Current</span>
136
166
  {/if}
137
- <p>Created {passkey.createdAt.toLocaleString()}</p>
138
- {@render action('edit_passkey#' + passkey.id)}
139
- {#if passkeys.length > 1}
140
- {@render action('delete_passkey#' + passkey.id, 'trash')}
141
- {:else}
142
- <dfn title="You must have at least one passkey" class="disabled">
143
- <Icon i="trash-slash" --fill="#888" --size="16px" />
144
- </dfn>
167
+ {#if session.elevated}
168
+ <span class="elevated">Elevated</span>
145
169
  {/if}
146
- </div>
147
- <FormDialog
148
- bind:dialog={dialogs['edit_passkey#' + passkey.id]}
149
- submit={data => {
150
- if (typeof data.name != 'string') throw 'Passkey name must be a string';
151
- passkey.name = data.name;
152
- return updatePasskey(passkey.id, data);
153
- }}
154
- submitText="Change"
155
- >
156
- <div>
157
- <label for="name">Passkey Name</label>
158
- <input name="name" type="text" value={passkey.name || ''} />
159
- </div>
160
- </FormDialog>
161
- <FormDialog
162
- bind:dialog={dialogs['delete_passkey#' + passkey.id]}
163
- submit={() => deletePasskey(passkey.id).then(() => passkeys.splice(passkeys.indexOf(passkey), 1))}
164
- submitText="Delete"
165
- submitDanger={true}
166
- >
167
- <p>Are you sure you want to delete this passkey?<br />This action can't be undone.</p>
168
- </FormDialog>
169
- {/each}
170
- <span>
171
- <button onclick={() => createPasskey(user.id).then(passkeys.push.bind(passkeys))}><Icon i="plus" /> Create</button>
172
- </span>
173
- </div>
174
-
175
- <div class="section main">
176
- <h3>Sessions</h3>
177
- {#each sessions as session}
178
- <div class="item session">
179
- <p>
180
- {session.id.slice(0, 4)}...{session.id.slice(-4)}
181
- {#if session.id == currentSession.id}
182
- <span class="current">Current</span>
183
- {/if}
184
- {#if session.elevated}
185
- <span class="elevated">Elevated</span>
186
- {/if}
187
- </p>
188
- <p>Created {session.created.toLocaleString()}</p>
189
- <p>Expires {session.expires.toLocaleString()}</p>
190
- {@render action('logout#' + session.id, 'right-from-bracket')}
191
- </div>
192
- <FormDialog
193
- bind:dialog={dialogs['logout#' + session.id]}
194
- submit={async () => {
195
- await logout(user.id, session.id);
196
- dialogs['logout#' + session.id].remove();
197
- sessions.splice(sessions.indexOf(session), 1);
198
- if (session.id == currentSession.id) window.location.href = '/';
199
- }}
200
- submitText="Logout"
201
- >
202
- <p>Are you sure you want to log out this session?</p>
203
- </FormDialog>
204
- {/each}
205
- <span>
206
- <button onclick={() => dialogs.logout_all.showModal()} class="danger">Logout All</button>
207
- </span>
170
+ </p>
171
+ <p>Created {session.created.toLocaleString()}</p>
172
+ <p>Expires {session.expires.toLocaleString()}</p>
173
+ {@render action('logout#' + session.id, 'right-from-bracket')}
174
+ </div>
208
175
  <FormDialog
209
- bind:dialog={dialogs['logout_all']}
210
- submit={() => logoutAll(user.id).then(() => (window.location.href = '/'))}
211
- submitText="Logout All Sessions"
212
- submitDanger
176
+ bind:dialog={dialogs['logout#' + session.id]}
177
+ submit={async () => {
178
+ await logout(user.id, session.id);
179
+ dialogs['logout#' + session.id].remove();
180
+ sessions.splice(sessions.indexOf(session), 1);
181
+ if (session.id == currentSession.id) window.location.href = '/';
182
+ }}
183
+ submitText="Logout"
213
184
  >
214
- <p>Are you sure you want to log out all sessions?</p>
185
+ <p>Are you sure you want to log out this session?</p>
215
186
  </FormDialog>
216
- </div>
217
- </div>
218
- {:catch error}
219
- <div class="error">
220
- <h3>Failed to load account</h3>
221
- <p>{'message' in error ? error.message : error}</p>
187
+ {/each}
188
+ <span>
189
+ <button onclick={() => dialogs.logout_all.showModal()} class="danger">Logout All</button>
190
+ </span>
191
+ <FormDialog
192
+ bind:dialog={dialogs['logout_all']}
193
+ submit={() => logoutAll(user.id).then(() => (window.location.href = '/'))}
194
+ submitText="Logout All Sessions"
195
+ submitDanger
196
+ >
197
+ <p>Are you sure you want to log out all sessions?</p>
198
+ </FormDialog>
222
199
  </div>
223
- {/await}
200
+ </div>
224
201
 
225
202
  <style>
226
203
  #pfp-container {
@@ -254,9 +231,11 @@
254
231
  width: 50%;
255
232
  padding-top: 4em;
256
233
 
234
+ /* This is causing duplicate separators when removing sessions/passkeys
257
235
  > div:has(+ div) {
258
236
  border-bottom: 1px solid #8888;
259
237
  }
238
+ */
260
239
  }
261
240
 
262
241
  .section .item {
@@ -0,0 +1,20 @@
1
+ import { emailVerificationEnabled, getCurrentSession, getPasskeys, getSessions } from '@axium/client/user';
2
+
3
+ export const ssr = false;
4
+
5
+ export async function load() {
6
+ const currentSession = await getCurrentSession().catch(() => {
7
+ window.location.href = '/login?after=/account';
8
+ return null;
9
+ })!;
10
+
11
+ const user = currentSession.user;
12
+
13
+ return {
14
+ currentSession,
15
+ user,
16
+ passkeys: await getPasskeys(user.id),
17
+ sessions: await getSessions(user.id),
18
+ canVerify: await emailVerificationEnabled(user.id),
19
+ };
20
+ }
@@ -1,32 +1,73 @@
1
1
  <script lang="ts">
2
- let { children, menu }: { children(): any; menu(): any } = $props();
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import Icon from './Icon.svelte';
3
4
 
4
- let active = $state(false);
5
+ interface Props extends HTMLAttributes<HTMLDivElement> {
6
+ children(): any;
7
+ menu(
8
+ /**
9
+ * Shortcut to quickly create a generic action in the context menu.
10
+ */
11
+ action: (icon: string, text: string, action: (event: MouseEvent) => void) => any
12
+ ): any;
13
+ actions: Record<string, () => void>;
14
+ }
15
+
16
+ let { children, menu, actions, ...rest }: Props = $props();
17
+
18
+ let popover = $state<HTMLDivElement>();
5
19
 
6
- function oncontextmenu(event: MouseEvent) {
7
- event.preventDefault();
8
- active = true;
20
+ function oncontextmenu(e: MouseEvent) {
21
+ e.preventDefault();
22
+ e.stopPropagation();
23
+ popover!.togglePopover();
24
+ _forcePopover = true;
9
25
  }
10
26
 
11
- function onblur() {
12
- active = false;
27
+ let _forcePopover = false;
28
+
29
+ /**
30
+ * Workaround for https://github.com/whatwg/html/issues/10905
31
+ * @todo Remove when the problem is fixed.
32
+ */
33
+ function onpointerup(e: PointerEvent) {
34
+ if (!_forcePopover) return;
35
+ e.stopPropagation();
36
+ e.preventDefault();
37
+ popover!.togglePopover();
38
+ _forcePopover = false;
13
39
  }
14
40
  </script>
15
41
 
16
- <div class="WithContextMenu" {oncontextmenu} tabindex="-1">
17
- {@render children()}
42
+ {#snippet action(i: string, text: string, action: (event: MouseEvent) => void)}
43
+ <div
44
+ onclick={e => {
45
+ e.stopPropagation();
46
+ e.preventDefault();
47
+ action(e);
48
+ }}
49
+ class="action"
50
+ >
51
+ {#if i}<Icon {i} --size="14px" />{/if}
52
+ {text}
53
+ </div>
54
+ {/snippet}
18
55
 
19
- {#if active}
20
- <div class="menu" {onblur} tabindex="-1">{@render menu()}</div>
21
- {/if}
56
+ <div data-axium-context-menu {oncontextmenu} {onpointerup} {...rest}>
57
+ {@render children()}
58
+ <div popover bind:this={popover}>
59
+ {@render menu(action)}
60
+ </div>
22
61
  </div>
23
62
 
24
63
  <style>
25
- .WithContextMenu {
64
+ [data-axium-context-menu] {
26
65
  display: contents;
27
66
  }
28
67
 
29
- .menu {
30
- position: absolute;
68
+ div.action:hover {
69
+ cursor: pointer;
70
+ background-color: #223;
71
+ border-radius: 0.25em;
31
72
  }
32
73
  </style>
@@ -1 +0,0 @@
1
- svg.svelte-ylmrta{width:var(--size, 1em);height:var(--size, 1em);display:inline-block;fill:var(--fill, #bbb)}button.svelte-g409dh{position:relative;display:inline-block;width:1em;height:1em;border:none;background:transparent}span.svelte-g409dh{position:absolute;inset:0}#pfp-container.svelte-11mz0yj{width:100px;height:100px;margin-top:3em}#pfp-container.svelte-11mz0yj .MenuToggle{float:right;position:relative;top:-24px}#pfp.svelte-11mz0yj{width:100px;height:100px;border-radius:50%;border:1px solid #8888}.greeting.svelte-11mz0yj{font-size:2em}.signout.svelte-11mz0yj{margin-top:2em}.section.svelte-11mz0yj{width:50%;padding-top:4em}.section.svelte-11mz0yj>div:where(.svelte-11mz0yj):has(+div:where(.svelte-11mz0yj)){border-bottom:1px solid #8888}.section.svelte-11mz0yj .item:where(.svelte-11mz0yj){display:grid;align-items:center;width:100%;gap:1em;text-wrap:nowrap;border-top:1px solid #8888;padding-bottom:1em}.info.svelte-11mz0yj{grid-template-columns:10em 1fr 2em}.info.svelte-11mz0yj>:where(.svelte-11mz0yj):first-child{margin-left:1em}.info.svelte-11mz0yj>:where(.svelte-11mz0yj):nth-child(2){text-overflow:ellipsis;overflow:hidden}.passkey.svelte-11mz0yj{grid-template-columns:1em 1em 1fr 1fr 1em 1em}.passkey.svelte-11mz0yj dfn:where(.svelte-11mz0yj):not(.disabled){cursor:help}.session.svelte-11mz0yj{grid-template-columns:1fr 1fr 1fr 1em}.session.svelte-11mz0yj .current:where(.svelte-11mz0yj){border-radius:2em;padding:0 .5em;background-color:#337}.session.svelte-11mz0yj .elevated:where(.svelte-11mz0yj){border-radius:2em;padding:0 .5em;background-color:#733}
@@ -1 +0,0 @@
1
- svg.svelte-ylmrta{width:var(--size, 1em);height:var(--size, 1em);display:inline-block;fill:var(--fill, #bbb)}button.svelte-g409dh{position:relative;display:inline-block;width:1em;height:1em;border:none;background:transparent}span.svelte-g409dh{position:absolute;inset:0}#pfp-container.svelte-11mz0yj{width:100px;height:100px;margin-top:3em;.MenuToggle{float:right;position:relative;top:-24px}}#pfp.svelte-11mz0yj{width:100px;height:100px;border-radius:50%;border:1px solid #8888}.greeting.svelte-11mz0yj{font-size:2em}.signout.svelte-11mz0yj{margin-top:2em}.section.svelte-11mz0yj{width:50%;padding-top:4em;>div:where(.svelte-11mz0yj):has(+div:where(.svelte-11mz0yj)){border-bottom:1px solid #8888}}.section.svelte-11mz0yj .item:where(.svelte-11mz0yj){display:grid;align-items:center;width:100%;gap:1em;text-wrap:nowrap;border-top:1px solid #8888;padding-bottom:1em}.info.svelte-11mz0yj{grid-template-columns:10em 1fr 2em;>:where(.svelte-11mz0yj):first-child{margin-left:1em}>:where(.svelte-11mz0yj):nth-child(2){text-overflow:ellipsis;overflow:hidden}}.passkey.svelte-11mz0yj{grid-template-columns:1em 1em 1fr 1fr 1em 1em;dfn:where(.svelte-11mz0yj):not(.disabled){cursor:help}}.session.svelte-11mz0yj{grid-template-columns:1fr 1fr 1fr 1em;.current:where(.svelte-11mz0yj){border-radius:2em;padding:0 .5em;background-color:#337}.elevated:where(.svelte-11mz0yj){border-radius:2em;padding:0 .5em;background-color:#733}}