claude-mux 0.30.0 → 0.30.2

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 (149) hide show
  1. package/CLAUDE.md +9 -1
  2. package/dist/commands/new-session.d.ts.map +1 -1
  3. package/dist/commands/new-session.js +2 -2
  4. package/dist/commands/new-session.js.map +1 -1
  5. package/dist/commands/service.d.ts.map +1 -1
  6. package/dist/commands/service.js +5 -4
  7. package/dist/commands/service.js.map +1 -1
  8. package/dist/commands/update.d.ts +7 -0
  9. package/dist/commands/update.d.ts.map +1 -1
  10. package/dist/commands/update.js +68 -25
  11. package/dist/commands/update.js.map +1 -1
  12. package/dist/tmux/server.d.ts +33 -0
  13. package/dist/tmux/server.d.ts.map +1 -0
  14. package/dist/tmux/server.js +75 -0
  15. package/dist/tmux/server.js.map +1 -0
  16. package/dist/utils/version.d.ts +1 -1
  17. package/dist/utils/version.js +1 -1
  18. package/dist/web/client/_app/immutable/chunks/{VmEtOaGT.js → BR0j6UP_.js} +2 -2
  19. package/{web/.svelte-kit/output/client/_app/immutable/chunks/VmEtOaGT.js.map → dist/web/client/_app/immutable/chunks/BR0j6UP_.js.map} +1 -1
  20. package/{web/.svelte-kit/output/client/_app/immutable/chunks/CwqQp6PF.js → dist/web/client/_app/immutable/chunks/BRwgrbZi.js} +2 -2
  21. package/{web/.svelte-kit/output/client/_app/immutable/chunks/CwqQp6PF.js.map → dist/web/client/_app/immutable/chunks/BRwgrbZi.js.map} +1 -1
  22. package/dist/web/client/_app/immutable/chunks/{BddLlazN.js → CJ5X49p2.js} +2 -2
  23. package/{web/.svelte-kit/output/client/_app/immutable/chunks/BddLlazN.js.map → dist/web/client/_app/immutable/chunks/CJ5X49p2.js.map} +1 -1
  24. package/dist/web/client/_app/immutable/chunks/Cb0yiQIh.js +3 -0
  25. package/dist/web/client/_app/immutable/chunks/{B2jaxV_u.js.map → Cb0yiQIh.js.map} +1 -1
  26. package/{web/.svelte-kit/output/client/_app/immutable/chunks/CLWK-3Sm.js → dist/web/client/_app/immutable/chunks/CmDdyjOR.js} +2 -2
  27. package/dist/web/client/_app/immutable/chunks/{CLWK-3Sm.js.map → CmDdyjOR.js.map} +1 -1
  28. package/dist/web/client/_app/immutable/chunks/{19820tOo.js → DiCsJZkB.js} +2 -2
  29. package/{web/.svelte-kit/output/client/_app/immutable/chunks/19820tOo.js.map → dist/web/client/_app/immutable/chunks/DiCsJZkB.js.map} +1 -1
  30. package/dist/web/client/_app/immutable/chunks/Dmt0dCmj.js +2 -0
  31. package/{web/.svelte-kit/output/client/_app/immutable/chunks/C_0O-5sL.js.map → dist/web/client/_app/immutable/chunks/Dmt0dCmj.js.map} +1 -1
  32. package/{web/.svelte-kit/output/client/_app/immutable/chunks/B0WiEFFI.js → dist/web/client/_app/immutable/chunks/juU6kBhv.js} +2 -2
  33. package/{web/.svelte-kit/output/client/_app/immutable/chunks/B0WiEFFI.js.map → dist/web/client/_app/immutable/chunks/juU6kBhv.js.map} +1 -1
  34. package/dist/web/client/_app/immutable/entry/{app.DLdHM347.js → app.BNsXYIeZ.js} +3 -3
  35. package/dist/web/client/_app/immutable/entry/{app.DLdHM347.js.map → app.BNsXYIeZ.js.map} +1 -1
  36. package/dist/web/client/_app/immutable/entry/start.BAAC0OQy.js +2 -0
  37. package/dist/web/client/_app/immutable/entry/start.BAAC0OQy.js.map +1 -0
  38. package/{web/.svelte-kit/output/client/_app/immutable/nodes/0.D339GFgp.js → dist/web/client/_app/immutable/nodes/0.Cga09Vlt.js} +2 -2
  39. package/dist/web/client/_app/immutable/nodes/{0.D339GFgp.js.map → 0.Cga09Vlt.js.map} +1 -1
  40. package/dist/web/client/_app/immutable/nodes/{1.BRq2Is_d.js → 1.C5UTjGXy.js} +2 -2
  41. package/dist/web/client/_app/immutable/nodes/{1.BRq2Is_d.js.map → 1.C5UTjGXy.js.map} +1 -1
  42. package/dist/web/client/_app/immutable/nodes/{2.qwnQbeHe.js → 2.C76yPG3X.js} +2 -2
  43. package/dist/web/client/_app/immutable/nodes/{2.qwnQbeHe.js.map → 2.C76yPG3X.js.map} +1 -1
  44. package/dist/web/client/_app/immutable/nodes/{3.BEc31Ipx.js → 3.Tbj29aAW.js} +2 -2
  45. package/{web/.svelte-kit/output/client/_app/immutable/nodes/3.BEc31Ipx.js.map → dist/web/client/_app/immutable/nodes/3.Tbj29aAW.js.map} +1 -1
  46. package/dist/web/client/_app/immutable/nodes/{4.CoOwQFxg.js → 4.D0z9Wo_G.js} +2 -2
  47. package/{web/.svelte-kit/output/client/_app/immutable/nodes/4.CoOwQFxg.js.map → dist/web/client/_app/immutable/nodes/4.D0z9Wo_G.js.map} +1 -1
  48. package/dist/web/client/_app/version.json +1 -1
  49. package/dist/web/server/chunks/{0-DHNN1AAT.js → 0-BZ0-GFAV.js} +10 -10
  50. package/dist/web/server/chunks/{0-DHNN1AAT.js.map → 0-BZ0-GFAV.js.map} +1 -1
  51. package/dist/web/server/chunks/{1-CbKniSlT.js → 1-DoI2jsEL.js} +3 -3
  52. package/dist/web/server/chunks/{1-CbKniSlT.js.map → 1-DoI2jsEL.js.map} +1 -1
  53. package/dist/web/server/chunks/{2-BdIitBN6.js → 2-6BGBaYuT.js} +8 -8
  54. package/dist/web/server/chunks/{2-BdIitBN6.js.map → 2-6BGBaYuT.js.map} +1 -1
  55. package/dist/web/server/chunks/{3-PW6mbTzY.js → 3-B9fgRoyO.js} +9 -9
  56. package/dist/web/server/chunks/{3-PW6mbTzY.js.map → 3-B9fgRoyO.js.map} +1 -1
  57. package/dist/web/server/chunks/{4-Cn_kJEG9.js → 4-CIa0l25T.js} +7 -7
  58. package/dist/web/server/chunks/{4-Cn_kJEG9.js.map → 4-CIa0l25T.js.map} +1 -1
  59. package/dist/web/server/chunks/{_layout.svelte-DuWAsRde.js → _layout.svelte-C2cdd9CG.js} +2 -2
  60. package/dist/web/server/chunks/{_layout.svelte-DuWAsRde.js.map → _layout.svelte-C2cdd9CG.js.map} +1 -1
  61. package/dist/web/server/chunks/{_page.svelte-BHyydDh6.js → _page.svelte-DZS6k2j-.js} +2 -2
  62. package/dist/web/server/chunks/{_page.svelte-BHyydDh6.js.map → _page.svelte-DZS6k2j-.js.map} +1 -1
  63. package/dist/web/server/chunks/{_server.ts-D5W_RgWh.js → _server.ts-rwgLlQ3t.js} +39 -8
  64. package/dist/web/server/chunks/_server.ts-rwgLlQ3t.js.map +1 -0
  65. package/dist/web/server/chunks/{panes-D3Xnw0Yz.js → panes-BQe6edic.js} +1713 -3
  66. package/dist/web/server/chunks/panes-BQe6edic.js.map +1 -0
  67. package/dist/web/server/index.js +13 -3
  68. package/dist/web/server/index.js.map +1 -1
  69. package/dist/web/server/manifest.js +12 -12
  70. package/dist/web/server/manifest.js.map +1 -1
  71. package/package.json +2 -2
  72. package/scripts/check-server-externals.ts +56 -0
  73. package/src/commands/new-session.ts +2 -2
  74. package/src/commands/service.ts +5 -4
  75. package/src/commands/update.ts +67 -26
  76. package/src/tmux/server.ts +80 -0
  77. package/src/utils/version.ts +1 -1
  78. package/tests/commands/update.test.ts +20 -1
  79. package/web/.svelte-kit/adapter-bun/chunks/internal2.js +1 -1
  80. package/web/.svelte-kit/adapter-bun/chunks/internal2.js.map +1 -1
  81. package/web/.svelte-kit/adapter-bun/chunks/utils.js +15 -1
  82. package/web/.svelte-kit/adapter-bun/chunks/utils.js.map +1 -1
  83. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/projects/new-session/_server.ts.js +21 -7
  84. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/projects/new-session/_server.ts.js.map +1 -1
  85. package/web/.svelte-kit/adapter-bun/manifest-full.js +1 -1
  86. package/web/.svelte-kit/adapter-bun/manifest.js +1 -1
  87. package/web/.svelte-kit/adapter-bun/nodes/0.js +1 -1
  88. package/web/.svelte-kit/adapter-bun/nodes/1.js +1 -1
  89. package/web/.svelte-kit/adapter-bun/nodes/2.js +1 -1
  90. package/web/.svelte-kit/adapter-bun/nodes/3.js +1 -1
  91. package/web/.svelte-kit/adapter-bun/nodes/4.js +1 -1
  92. package/web/.svelte-kit/generated/server/internal.js +1 -1
  93. package/web/.svelte-kit/output/client/.vite/manifest.json +103 -103
  94. package/web/.svelte-kit/output/client/_app/immutable/chunks/{VmEtOaGT.js → BR0j6UP_.js} +2 -2
  95. package/{dist/web/client/_app/immutable/chunks/VmEtOaGT.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/BR0j6UP_.js.map} +1 -1
  96. package/{dist/web/client/_app/immutable/chunks/CwqQp6PF.js → web/.svelte-kit/output/client/_app/immutable/chunks/BRwgrbZi.js} +2 -2
  97. package/{dist/web/client/_app/immutable/chunks/CwqQp6PF.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/BRwgrbZi.js.map} +1 -1
  98. package/web/.svelte-kit/output/client/_app/immutable/chunks/{BddLlazN.js → CJ5X49p2.js} +2 -2
  99. package/{dist/web/client/_app/immutable/chunks/BddLlazN.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/CJ5X49p2.js.map} +1 -1
  100. package/web/.svelte-kit/output/client/_app/immutable/chunks/Cb0yiQIh.js +3 -0
  101. package/web/.svelte-kit/output/client/_app/immutable/chunks/{B2jaxV_u.js.map → Cb0yiQIh.js.map} +1 -1
  102. package/{dist/web/client/_app/immutable/chunks/CLWK-3Sm.js → web/.svelte-kit/output/client/_app/immutable/chunks/CmDdyjOR.js} +2 -2
  103. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CLWK-3Sm.js.map → CmDdyjOR.js.map} +1 -1
  104. package/web/.svelte-kit/output/client/_app/immutable/chunks/{19820tOo.js → DiCsJZkB.js} +2 -2
  105. package/{dist/web/client/_app/immutable/chunks/19820tOo.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/DiCsJZkB.js.map} +1 -1
  106. package/web/.svelte-kit/output/client/_app/immutable/chunks/Dmt0dCmj.js +2 -0
  107. package/{dist/web/client/_app/immutable/chunks/C_0O-5sL.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/Dmt0dCmj.js.map} +1 -1
  108. package/{dist/web/client/_app/immutable/chunks/B0WiEFFI.js → web/.svelte-kit/output/client/_app/immutable/chunks/juU6kBhv.js} +2 -2
  109. package/{dist/web/client/_app/immutable/chunks/B0WiEFFI.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/juU6kBhv.js.map} +1 -1
  110. package/web/.svelte-kit/output/client/_app/immutable/entry/{app.DLdHM347.js → app.BNsXYIeZ.js} +3 -3
  111. package/web/.svelte-kit/output/client/_app/immutable/entry/{app.DLdHM347.js.map → app.BNsXYIeZ.js.map} +1 -1
  112. package/web/.svelte-kit/output/client/_app/immutable/entry/start.BAAC0OQy.js +2 -0
  113. package/web/.svelte-kit/output/client/_app/immutable/entry/start.BAAC0OQy.js.map +1 -0
  114. package/{dist/web/client/_app/immutable/nodes/0.D339GFgp.js → web/.svelte-kit/output/client/_app/immutable/nodes/0.Cga09Vlt.js} +2 -2
  115. package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.D339GFgp.js.map → 0.Cga09Vlt.js.map} +1 -1
  116. package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.BRq2Is_d.js → 1.C5UTjGXy.js} +2 -2
  117. package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.BRq2Is_d.js.map → 1.C5UTjGXy.js.map} +1 -1
  118. package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.qwnQbeHe.js → 2.C76yPG3X.js} +2 -2
  119. package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.qwnQbeHe.js.map → 2.C76yPG3X.js.map} +1 -1
  120. package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.BEc31Ipx.js → 3.Tbj29aAW.js} +2 -2
  121. package/{dist/web/client/_app/immutable/nodes/3.BEc31Ipx.js.map → web/.svelte-kit/output/client/_app/immutable/nodes/3.Tbj29aAW.js.map} +1 -1
  122. package/web/.svelte-kit/output/client/_app/immutable/nodes/{4.CoOwQFxg.js → 4.D0z9Wo_G.js} +2 -2
  123. package/{dist/web/client/_app/immutable/nodes/4.CoOwQFxg.js.map → web/.svelte-kit/output/client/_app/immutable/nodes/4.D0z9Wo_G.js.map} +1 -1
  124. package/web/.svelte-kit/output/client/_app/version.json +1 -1
  125. package/web/.svelte-kit/output/server/chunks/internal2.js +1 -1
  126. package/web/.svelte-kit/output/server/chunks/internal2.js.map +1 -1
  127. package/web/.svelte-kit/output/server/chunks/utils.js +15 -1
  128. package/web/.svelte-kit/output/server/chunks/utils.js.map +1 -1
  129. package/web/.svelte-kit/output/server/entries/endpoints/api/projects/new-session/_server.ts.js +21 -7
  130. package/web/.svelte-kit/output/server/entries/endpoints/api/projects/new-session/_server.ts.js.map +1 -1
  131. package/web/.svelte-kit/output/server/manifest-full.js +1 -1
  132. package/web/.svelte-kit/output/server/manifest.js +1 -1
  133. package/web/.svelte-kit/output/server/nodes/0.js +1 -1
  134. package/web/.svelte-kit/output/server/nodes/1.js +1 -1
  135. package/web/.svelte-kit/output/server/nodes/2.js +1 -1
  136. package/web/.svelte-kit/output/server/nodes/3.js +1 -1
  137. package/web/.svelte-kit/output/server/nodes/4.js +1 -1
  138. package/web/package.json +4 -6
  139. package/web/src/routes/api/projects/new-session/+server.ts +6 -6
  140. package/dist/web/client/_app/immutable/chunks/B2jaxV_u.js +0 -3
  141. package/dist/web/client/_app/immutable/chunks/C_0O-5sL.js +0 -2
  142. package/dist/web/client/_app/immutable/entry/start.DIhipajB.js +0 -2
  143. package/dist/web/client/_app/immutable/entry/start.DIhipajB.js.map +0 -1
  144. package/dist/web/server/chunks/_server.ts-D5W_RgWh.js.map +0 -1
  145. package/dist/web/server/chunks/panes-D3Xnw0Yz.js.map +0 -1
  146. package/web/.svelte-kit/output/client/_app/immutable/chunks/B2jaxV_u.js +0 -3
  147. package/web/.svelte-kit/output/client/_app/immutable/chunks/C_0O-5sL.js +0 -2
  148. package/web/.svelte-kit/output/client/_app/immutable/entry/start.DIhipajB.js +0 -2
  149. package/web/.svelte-kit/output/client/_app/immutable/entry/start.DIhipajB.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"0.D339GFgp.js","sources":["../../../../../../src/lib/wakeLock.svelte.ts","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/Loader.svelte","../../../../../../../node_modules/.bun/runed@0.28.0+fabb43e41e936932/node_modules/runed/dist/internal/configurable-globals.js","../../../../../../../node_modules/.bun/runed@0.28.0+fabb43e41e936932/node_modules/runed/dist/internal/utils/dom.js","../../../../../../../node_modules/.bun/runed@0.28.0+fabb43e41e936932/node_modules/runed/dist/utilities/active-element/active-element.svelte.js","../../../../../../../node_modules/.bun/runed@0.28.0+fabb43e41e936932/node_modules/runed/dist/utilities/context/context.js","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/internal/ctx.js","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/types.js","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/internal/use-document-hidden.svelte.js","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/Toast.svelte","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/icons/SuccessIcon.svelte","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/icons/ErrorIcon.svelte","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/icons/WarningIcon.svelte","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/icons/InfoIcon.svelte","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/icons/CloseIcon.svelte","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/Toaster.svelte","../../../../../../src/lib/components/SidebarAccordion.svelte","../../../../../../src/lib/components/ScreenshotsPanel.svelte","../../../../../../src/lib/notifications.ts","../../../../../../src/lib/push.ts","../../../../../../src/lib/components/SidebarMeters.svelte","../../../../../../src/lib/components/SplitView.svelte","../../../../../../src/lib/components/NotificationCoordinator.svelte","../../../../../../../node_modules/.bun/@lucide+svelte@0.561.0+fabb43e41e936932/node_modules/@lucide/svelte/dist/icons/loader-circle.svelte","../../../../../../../node_modules/.bun/@lucide+svelte@0.561.0+fabb43e41e936932/node_modules/@lucide/svelte/dist/icons/circle-check.svelte","../../../../../../../node_modules/.bun/@lucide+svelte@0.561.0+fabb43e41e936932/node_modules/@lucide/svelte/dist/icons/octagon-x.svelte","../../../../../../../node_modules/.bun/@lucide+svelte@0.561.0+fabb43e41e936932/node_modules/@lucide/svelte/dist/icons/info.svelte","../../../../../../../node_modules/.bun/@lucide+svelte@0.561.0+fabb43e41e936932/node_modules/@lucide/svelte/dist/icons/triangle-alert.svelte","../../../../../../src/lib/components/ui/sonner/sonner.svelte","../../../../../../src/routes/+layout.svelte"],"sourcesContent":["import { browser } from '$app/environment';\n\ninterface WakeLockSentinelLike {\n\treleased: boolean;\n\trelease(): Promise<void>;\n\taddEventListener(type: 'release', listener: () => void): void;\n}\n\nlet sentinel: WakeLockSentinelLike | null = null;\n\nexport function wakeLockSupported(): boolean {\n\treturn browser && 'wakeLock' in navigator;\n}\n\nexport async function acquireWakeLock(): Promise<void> {\n\tif (!wakeLockSupported() || sentinel) return;\n\ttry {\n\t\tconst s: WakeLockSentinelLike = await navigator.wakeLock.request('screen');\n\t\tsentinel = s;\n\t\ts.addEventListener('release', () => {\n\t\t\tsentinel = null;\n\t\t});\n\t} catch {\n\t\tsentinel = null;\n\t}\n}\n\nexport async function releaseWakeLock(): Promise<void> {\n\tif (!sentinel) return;\n\ttry {\n\t\tawait sentinel.release();\n\t} catch {\n\t\t// ignore\n\t}\n\tsentinel = null;\n}\n\nexport function hasWakeLock(): boolean {\n\treturn sentinel !== null;\n}\n","<script lang=\"ts\" module>\n\tconst bars = Array(12).fill(0);\n</script>\n\n<script lang=\"ts\">\n\tlet { visible, class: className }: { visible: boolean; class?: string } =\n\t\t$props();\n</script>\n\n<div\n\tclass={['sonner-loading-wrapper', className].filter(Boolean).join(' ')}\n\tdata-visible={visible}\n>\n\t<div class=\"sonner-spinner\">\n\t\t{#each bars as _, i (`spinner-bar-${i}`)}\n\t\t\t<div class=\"sonner-loading-bar\"></div>\n\t\t{/each}\n\t</div>\n</div>\n","import { BROWSER } from \"esm-env\";\nexport const defaultWindow = BROWSER && typeof window !== \"undefined\" ? window : undefined;\nexport const defaultDocument = BROWSER && typeof window !== \"undefined\" ? window.document : undefined;\nexport const defaultNavigator = BROWSER && typeof window !== \"undefined\" ? window.navigator : undefined;\nexport const defaultLocation = BROWSER && typeof window !== \"undefined\" ? window.location : undefined;\n","import { defaultDocument } from \"../configurable-globals.js\";\n/**\n * Handles getting the active element in a document or shadow root.\n * If the active element is within a shadow root, it will traverse the shadow root\n * to find the active element.\n * If not, it will return the active element in the document.\n *\n * @param document A document or shadow root to get the active element from.\n * @returns The active element in the document or shadow root.\n */\nexport function getActiveElement(document) {\n let activeElement = document.activeElement;\n while (activeElement?.shadowRoot) {\n const node = activeElement.shadowRoot.activeElement;\n if (node === activeElement)\n break;\n else\n activeElement = node;\n }\n return activeElement;\n}\n/**\n * Returns the owner document of a given element.\n *\n * @param node The element to get the owner document from.\n * @returns\n */\nexport function getOwnerDocument(node, fallback = defaultDocument) {\n return node?.ownerDocument ?? fallback;\n}\n/**\n * Checks if an element is or is contained by another element.\n *\n * @param node The element to check if it or its descendants contain the target element.\n * @param target The element to check if it is contained by the node.\n * @returns\n */\nexport function isOrContainsTarget(node, target) {\n return node === target || node.contains(target);\n}\n","import { defaultWindow, } from \"../../internal/configurable-globals.js\";\nimport { getActiveElement } from \"../../internal/utils/dom.js\";\nimport { on } from \"svelte/events\";\nimport { createSubscriber } from \"svelte/reactivity\";\nexport class ActiveElement {\n #document;\n #subscribe;\n constructor(options = {}) {\n const { window = defaultWindow, document = window?.document } = options;\n if (window === undefined)\n return;\n this.#document = document;\n this.#subscribe = createSubscriber((update) => {\n const cleanupFocusIn = on(window, \"focusin\", update);\n const cleanupFocusOut = on(window, \"focusout\", update);\n return () => {\n cleanupFocusIn();\n cleanupFocusOut();\n };\n });\n }\n get current() {\n this.#subscribe?.();\n if (!this.#document)\n return null;\n return getActiveElement(this.#document);\n }\n}\n/**\n * An object holding a reactive value that is equal to `document.activeElement`.\n * It automatically listens for changes, keeping the reference up to date.\n *\n * If you wish to use a custom document or shadowRoot, you should use\n * [useActiveElement](https://runed.dev/docs/utilities/active-element) instead.\n *\n * @see {@link https://runed.dev/docs/utilities/active-element}\n */\nexport const activeElement = new ActiveElement();\n","import { getContext, hasContext, setContext } from \"svelte\";\nexport class Context {\n #name;\n #key;\n /**\n * @param name The name of the context.\n * This is used for generating the context key and error messages.\n */\n constructor(name) {\n this.#name = name;\n this.#key = Symbol(name);\n }\n /**\n * The key used to get and set the context.\n *\n * It is not recommended to use this value directly.\n * Instead, use the methods provided by this class.\n */\n get key() {\n return this.#key;\n }\n /**\n * Checks whether this has been set in the context of a parent component.\n *\n * Must be called during component initialisation.\n */\n exists() {\n return hasContext(this.#key);\n }\n /**\n * Retrieves the context that belongs to the closest parent component.\n *\n * Must be called during component initialisation.\n *\n * @throws An error if the context does not exist.\n */\n get() {\n const context = getContext(this.#key);\n if (context === undefined) {\n throw new Error(`Context \"${this.#name}\" not found`);\n }\n return context;\n }\n /**\n * Retrieves the context that belongs to the closest parent component,\n * or the given fallback value if the context does not exist.\n *\n * Must be called during component initialisation.\n */\n getOr(fallback) {\n const context = getContext(this.#key);\n if (context === undefined) {\n return fallback;\n }\n return context;\n }\n /**\n * Associates the given value with the current component and returns it.\n *\n * Must be called during component initialisation.\n */\n set(context) {\n return setContext(this.#key, context);\n }\n}\n","import { SonnerState } from '../toast-state.svelte.js';\nimport { Context } from 'runed';\nexport const richColorsContext = new Context('richColorsContext');\nexport const sonnerContext = new Context('<Toaster/>');\n","export function isAction(action) {\n return action.label !== undefined;\n}\n","import { on } from 'svelte/events';\nexport function useDocumentHidden() {\n let current = $state(typeof document !== 'undefined' ? document.hidden : false);\n $effect(() => {\n return on(document, 'visibilitychange', () => {\n current = document.hidden;\n });\n });\n return {\n get current() {\n return current;\n }\n };\n}\n","<script lang=\"ts\" module>\n\t// Default lifetime of a toasts (in ms)\n\tconst TOAST_LIFETIME = 4000;\n\n\t// Default gap between toasts\n\tconst GAP = 14;\n\n\t// Threshold to dismiss a toast\n\tconst SWIPE_THRESHOLD = 45;\n\n\t// Equal to exit animation duration\n\tconst TIME_BEFORE_UNMOUNT = 200;\n\n\tconst SCALE_MULTIPLIER = 0.05;\n\n\tconst DEFAULT_TOAST_CLASSES: ToastClasses = {\n\t\ttoast: '',\n\t\ttitle: '',\n\t\tdescription: '',\n\t\tloader: '',\n\t\tcloseButton: '',\n\t\tcancelButton: '',\n\t\tactionButton: '',\n\t\taction: '',\n\t\twarning: '',\n\t\terror: '',\n\t\tsuccess: '',\n\t\tdefault: '',\n\t\tinfo: '',\n\t\tloading: ''\n\t};\n\n\tfunction getDefaultSwipeDirections(\n\t\tposition: string\n\t): Array<SwipeDirection> {\n\t\tconst [y, x] = position.split('-');\n\t\tconst directions: Array<SwipeDirection> = [];\n\n\t\tif (y) {\n\t\t\tdirections.push(y as SwipeDirection);\n\t\t}\n\n\t\tif (x) {\n\t\t\tdirections.push(x as SwipeDirection);\n\t\t}\n\n\t\treturn directions;\n\t}\n\n\tfunction getDampening(delta: number) {\n\t\tconst factor = Math.abs(delta) / 20;\n\n\t\treturn 1 / (1.5 + factor);\n\t}\n</script>\n\n<script lang=\"ts\">\n\timport { onMount, untrack } from 'svelte';\n\timport {\n\t\tisAction,\n\t\ttype SwipeDirection,\n\t\ttype ToastClasses,\n\t\ttype ToastProps\n\t} from './types.js';\n\timport { toastState } from './toast-state.svelte.js';\n\timport { cn } from './internal/helpers.js';\n\timport { useDocumentHidden } from './internal/use-document-hidden.svelte.js';\n\timport type {\n\t\tDragEventHandler,\n\t\tPointerEventHandler\n\t} from 'svelte/elements';\n\timport Loader from './Loader.svelte';\n\n\tlet {\n\t\ttoast,\n\t\tindex,\n\t\texpanded,\n\t\tinvert: invertFromToaster,\n\t\tposition,\n\t\tvisibleToasts,\n\t\texpandByDefault,\n\t\tcloseButton: closeButtonFromToaster,\n\t\tinteracting,\n\t\tcancelButtonStyle = '',\n\t\tactionButtonStyle = '',\n\t\tduration: durationFromToaster,\n\t\tdescriptionClass = '',\n\t\tclasses: classesProp,\n\t\tunstyled = false,\n\t\tloadingIcon,\n\t\tsuccessIcon,\n\t\terrorIcon,\n\t\twarningIcon,\n\t\tcloseIcon,\n\t\tinfoIcon,\n\t\tdefaultRichColors = false,\n\t\tgap = GAP,\n\t\tswipeDirections: swipeDirectionsProp,\n\t\tcloseButtonAriaLabel,\n\t\tpauseWhenPageIsHidden,\n\t\t...restProps\n\t}: ToastProps = $props();\n\n\tconst defaultClasses: ToastClasses = { ...DEFAULT_TOAST_CLASSES };\n\n\tlet mounted = $state(false);\n\tlet removed = $state(false);\n\tlet swiping = $state(false);\n\tlet swipeOut = $state(false);\n\tlet isSwiped = $state(false);\n\tlet offsetBeforeRemove = $state(0);\n\tlet initialHeight = $state(0);\n\tlet remainingTime = toast.duration || durationFromToaster || TOAST_LIFETIME;\n\tlet dragStartTime = $state<Date | null>(null);\n\tlet toastRef = $state<HTMLLIElement>();\n\tlet swipeDirection = $state<'x' | 'y' | null>(null);\n\tlet swipeOutDirection = $state<'left' | 'right' | 'up' | 'down' | null>(\n\t\tnull\n\t);\n\tconst isFront = $derived(index === 0);\n\tconst isVisible = $derived(index + 1 <= visibleToasts);\n\tconst toastType = $derived(toast.type);\n\tconst dismissible = $derived(\n\t\ttoast.dismissible !== undefined\n\t\t\t? toast.dismissible !== false\n\t\t\t: toast.dismissable !== false\n\t);\n\tconst toastClass = $derived(toast.class || '');\n\tconst toastDescriptionClass = $derived(toast.descriptionClass || '');\n\t// height index is used to calculate the offset as it gets updated before the toast array, which means we can calculate the new layout faster.\n\t// Only the heights of this toaster + position matter for the offset math,\n\t// otherwise toasts of another toaster (or another corner) push these around.\n\tconst relevantHeights = $derived(\n\t\ttoastState.heights.filter(\n\t\t\t(height) =>\n\t\t\t\theight.toasterId === toast.toasterId &&\n\t\t\t\theight.position === position\n\t\t)\n\t);\n\t// findIndex returns -1 when not yet measured; -1 is truthy, so `|| 0` left a negative index in the offset math.\n\tconst heightIndex = $derived.by(() => {\n\t\tconst idx = relevantHeights.findIndex(\n\t\t\t(height) => height.toastId === toast.id\n\t\t);\n\t\treturn idx === -1 ? 0 : idx;\n\t});\n\tconst closeButton = $derived(toast.closeButton ?? closeButtonFromToaster);\n\tconst duration = $derived(\n\t\ttoast.duration ?? durationFromToaster ?? TOAST_LIFETIME\n\t);\n\tlet pointerStart: { x: number; y: number } | null = null;\n\tconst coords = $derived(position.split('-'));\n\tconst swipeDirections = $derived(\n\t\tswipeDirectionsProp ?? getDefaultSwipeDirections(position)\n\t);\n\tconst toastsHeightBefore = $derived(\n\t\trelevantHeights.reduce((prev, curr, reducerIndex) => {\n\t\t\tif (reducerIndex >= heightIndex) return prev;\n\t\t\treturn prev + curr.height;\n\t\t}, 0)\n\t);\n\tconst isDocumentHidden = useDocumentHidden();\n\tconst invert = $derived(toast.invert || invertFromToaster);\n\tconst disabled = $derived(toastType === 'loading');\n\n\tconst classes = $derived({ ...defaultClasses, ...classesProp });\n\n\tconst toastTitle = $derived(toast.title);\n\tconst toastDescription = $derived(toast.description);\n\n\tlet closeTimerStartTime = $state(0);\n\tlet lastCloseTimerStartTime = $state(0);\n\n\tconst offset = $derived(Math.round(heightIndex * gap + toastsHeightBefore));\n\n\t$effect(() => {\n\t\ttoastTitle;\n\t\ttoastDescription;\n\t\tlet scale: number;\n\n\t\tif (expanded || expandByDefault) {\n\t\t\tscale = 1;\n\t\t} else {\n\t\t\tscale = 1 - index * SCALE_MULTIPLIER;\n\t\t}\n\n\t\tconst toastEl = untrack(() => toastRef);\n\t\tif (toastEl === undefined) return;\n\t\ttoastEl.style.setProperty('height', 'auto');\n\n\t\tconst offsetHeight = toastEl.offsetHeight;\n\t\tconst rectHeight = toastEl.getBoundingClientRect().height;\n\t\tconst scaledRectHeight =\n\t\t\tMath.round((rectHeight / scale + Number.EPSILON) * 100) / 100;\n\n\t\ttoastEl.style.removeProperty('height');\n\n\t\tlet finalHeight: number;\n\n\t\tif (Math.abs(scaledRectHeight - offsetHeight) < 1) {\n\t\t\t// use scaledRectHeight as it's more precise\n\t\t\tfinalHeight = scaledRectHeight;\n\t\t} else {\n\t\t\t// toast was transitioning its scale, so scaledRectHeight isn't accurate\n\t\t\tfinalHeight = offsetHeight;\n\t\t}\n\n\t\tinitialHeight = finalHeight;\n\n\t\ttoastState.setHeight({\n\t\t\ttoastId: toast.id,\n\t\t\theight: finalHeight,\n\t\t\ttoasterId: toast.toasterId,\n\t\t\tposition\n\t\t});\n\t});\n\n\tfunction deleteToast() {\n\t\tremoved = true;\n\t\t// save the offset for the exit swipe animation\n\t\toffsetBeforeRemove = offset;\n\n\t\ttoastState.removeHeight(toast.id);\n\t\ttoastState.markDismissed(toast.id);\n\t\ttoastState.scheduleRemoval(toast.id, TIME_BEFORE_UNMOUNT);\n\t}\n\n\tlet timeoutId: ReturnType<typeof setTimeout>;\n\n\tconst isPromiseLoadingOrInfiniteDuration = $derived(\n\t\t(toast.promise && toastType === 'loading') ||\n\t\t\ttoast.duration === Number.POSITIVE_INFINITY\n\t);\n\n\tfunction startTimer() {\n\t\t// Both the timer effect and the `updated` effect can start a timer in the\n\t\t// same flush (a recreated toast mounts with `updated` already set); clear\n\t\t// first so only one runs.\n\t\tclearTimeout(timeoutId);\n\t\tcloseTimerStartTime = new Date().getTime();\n\t\t// let the toast know it has started\n\t\ttimeoutId = setTimeout(() => {\n\t\t\ttoast.onAutoClose?.(toast);\n\t\t\tdeleteToast();\n\t\t}, remainingTime);\n\t}\n\n\tfunction pauseTimer() {\n\t\tif (lastCloseTimerStartTime < closeTimerStartTime) {\n\t\t\t// get the elapsed time since the timer started\n\t\t\tconst elapsedTime = new Date().getTime() - closeTimerStartTime;\n\t\t\tremainingTime = remainingTime - elapsedTime;\n\t\t}\n\n\t\tlastCloseTimerStartTime = new Date().getTime();\n\t}\n\n\t$effect(() => {\n\t\tif (toast.updated) {\n\t\t\t// if the toast has been updated after the initial render,\n\t\t\t// we want to reset the timer and set the remaining time to the\n\t\t\t// new duration\n\t\t\tclearTimeout(timeoutId);\n\t\t\tremainingTime = duration;\n\t\t\tif (!isPromiseLoadingOrInfiniteDuration) {\n\t\t\t\tstartTimer();\n\t\t\t}\n\t\t}\n\t});\n\n\t$effect(() => {\n\t\tif (!isPromiseLoadingOrInfiniteDuration) {\n\t\t\tif (\n\t\t\t\texpanded ||\n\t\t\t\tinteracting ||\n\t\t\t\t(pauseWhenPageIsHidden && isDocumentHidden.current)\n\t\t\t) {\n\t\t\t\tpauseTimer();\n\t\t\t} else {\n\t\t\t\tstartTimer();\n\t\t\t}\n\t\t}\n\n\t\treturn () => clearTimeout(timeoutId);\n\t});\n\n\tonMount(() => {\n\t\tmounted = true;\n\n\t\tconst height = toastRef?.getBoundingClientRect().height as number;\n\n\t\tinitialHeight = height;\n\t\ttoastState.setHeight({\n\t\t\ttoastId: toast.id,\n\t\t\theight,\n\t\t\ttoasterId: toast.toasterId,\n\t\t\tposition\n\t\t});\n\n\t\treturn () => {\n\t\t\ttoastState.removeHeight(toast.id);\n\t\t};\n\t});\n\n\t$effect(() => {\n\t\tif (toast.delete) {\n\t\t\tuntrack(() => {\n\t\t\t\t// `markDismissed` flips `delete` for dismissals that already ran\n\t\t\t\t// `deleteToast` themselves (close button, swipe, auto-close), so\n\t\t\t\t// don't re-enter and double-fire `onDismiss`.\n\t\t\t\tif (removed) return;\n\t\t\t\tdeleteToast();\n\t\t\t\ttoast.onDismiss?.(toast);\n\t\t\t});\n\t\t}\n\t});\n\n\t// The toast was recreated with the same id while this instance's exit animation\n\t// was running (`create` cancelled the pending removal). The keyed each reuses\n\t// this component instance, so revive its local exit state.\n\t$effect(() => {\n\t\tif (!toast.delete && !toast.dismiss && removed) {\n\t\t\tuntrack(() => {\n\t\t\t\tremoved = false;\n\t\t\t\tswipeOut = false;\n\t\t\t\tisSwiped = false;\n\t\t\t\tswiping = false;\n\t\t\t\tswipeDirection = null;\n\t\t\t\tswipeOutDirection = null;\n\t\t\t\tpointerStart = null;\n\t\t\t\tdragStartTime = null;\n\t\t\t\ttoastRef?.style.removeProperty('--swipe-amount-x');\n\t\t\t\ttoastRef?.style.removeProperty('--swipe-amount-y');\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tremainingTime = duration;\n\t\t\t\tif (!isPromiseLoadingOrInfiniteDuration) {\n\t\t\t\t\tstartTimer();\n\t\t\t\t}\n\t\t\t\ttoastState.setHeight({\n\t\t\t\t\ttoastId: toast.id,\n\t\t\t\t\theight: initialHeight,\n\t\t\t\t\ttoasterId: toast.toasterId,\n\t\t\t\t\tposition\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t});\n\n\tconst handlePointerDown: PointerEventHandler<HTMLLIElement> = (event) => {\n\t\tif (disabled) return;\n\n\t\tdragStartTime = new Date();\n\t\toffsetBeforeRemove = offset;\n\t\tconst target = event.target as HTMLElement;\n\n\t\t// ensure we maintain correct pointer capture even when going outside of the toast (e.g. when swiping)\n\t\ttarget.setPointerCapture(event.pointerId);\n\t\tif (target.tagName === 'BUTTON') return;\n\t\tswiping = true;\n\t\tpointerStart = { x: event.clientX, y: event.clientY };\n\t};\n\n\tconst handlePointerUp: PointerEventHandler<HTMLLIElement> = () => {\n\t\tif (swipeOut || !dismissible) return;\n\n\t\tpointerStart = null;\n\t\tconst swipeAmountX = Number(\n\t\t\ttoastRef?.style\n\t\t\t\t.getPropertyValue('--swipe-amount-x')\n\t\t\t\t.replace('px', '') || 0\n\t\t);\n\t\tconst swipeAmountY = Number(\n\t\t\ttoastRef?.style\n\t\t\t\t.getPropertyValue('--swipe-amount-y')\n\t\t\t\t.replace('px', '') || 0\n\t\t);\n\t\tconst timeTaken =\n\t\t\tnew Date().getTime() - (dragStartTime?.getTime() ?? 0);\n\n\t\tconst swipeAmount =\n\t\t\tswipeDirection === 'x' ? swipeAmountX : swipeAmountY;\n\t\tconst velocity = Math.abs(swipeAmount) / timeTaken;\n\n\t\t// Movement towards a direction that isn't allowed is dampened, not blocked,\n\t\t// so a fast flick can still pass the velocity check. Only dismiss if the\n\t\t// direction is allowed.\n\t\tconst isAllowedDirection =\n\t\t\tswipeDirection === 'x'\n\t\t\t\t? swipeDirections.includes(swipeAmountX > 0 ? 'right' : 'left')\n\t\t\t\t: swipeDirections.includes(swipeAmountY > 0 ? 'bottom' : 'top');\n\n\t\t// remove only if threshold is met\n\t\tif (\n\t\t\tisAllowedDirection &&\n\t\t\t(Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11)\n\t\t) {\n\t\t\toffsetBeforeRemove = offset;\n\t\t\ttoast.onDismiss?.(toast);\n\n\t\t\tif (swipeDirection === 'x') {\n\t\t\t\tswipeOutDirection = swipeAmountX > 0 ? 'right' : 'left';\n\t\t\t} else {\n\t\t\t\tswipeOutDirection = swipeAmountY > 0 ? 'down' : 'up';\n\t\t\t}\n\n\t\t\tdeleteToast();\n\t\t\tswipeOut = true;\n\t\t\treturn;\n\t\t} else {\n\t\t\ttoastRef?.style.setProperty('--swipe-amount-x', '0px');\n\t\t\ttoastRef?.style.setProperty('--swipe-amount-y', '0px');\n\t\t}\n\t\tisSwiped = false;\n\t\tswiping = false;\n\t\tswipeDirection = null;\n\t};\n\n\tconst handlePointerMove: PointerEventHandler<HTMLLIElement> = (event) => {\n\t\tif (!pointerStart || !dismissible) return;\n\n\t\tconst isHighlighted =\n\t\t\t(window.getSelection()?.toString().length ?? -1) > 0;\n\t\tif (isHighlighted) return;\n\n\t\tconst yDelta = event.clientY - pointerStart.y;\n\t\tconst xDelta = event.clientX - pointerStart.x;\n\n\t\t// Determine swipe direction if not already locked\n\t\tif (!swipeDirection && (Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1)) {\n\t\t\tswipeDirection = Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y';\n\t\t}\n\n\t\tlet swipeAmount = { x: 0, y: 0 };\n\n\t\tif (swipeDirection === 'y') {\n\t\t\t// handle vertical swipes\n\t\t\tif (\n\t\t\t\tswipeDirections.includes('top') ||\n\t\t\t\tswipeDirections.includes('bottom')\n\t\t\t) {\n\t\t\t\tif (\n\t\t\t\t\t(swipeDirections.includes('top') && yDelta < 0) ||\n\t\t\t\t\t(swipeDirections.includes('bottom') && yDelta > 0)\n\t\t\t\t) {\n\t\t\t\t\tswipeAmount.y = yDelta;\n\t\t\t\t} else {\n\t\t\t\t\t// smoothly transition to dampened movement\n\t\t\t\t\tconst dampenedDelta = yDelta * getDampening(yDelta);\n\t\t\t\t\t// ensure we don't jump when transition to dampened movement\n\t\t\t\t\tswipeAmount.y =\n\t\t\t\t\t\tMath.abs(dampenedDelta) < Math.abs(yDelta)\n\t\t\t\t\t\t\t? dampenedDelta\n\t\t\t\t\t\t\t: yDelta;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (swipeDirection === 'x') {\n\t\t\t// handle horizontal swipes\n\t\t\tif (\n\t\t\t\tswipeDirections.includes('left') ||\n\t\t\t\tswipeDirections.includes('right')\n\t\t\t) {\n\t\t\t\tif (\n\t\t\t\t\t(swipeDirections.includes('left') && xDelta < 0) ||\n\t\t\t\t\t(swipeDirections.includes('right') && xDelta > 0)\n\t\t\t\t) {\n\t\t\t\t\tswipeAmount.x = xDelta;\n\t\t\t\t} else {\n\t\t\t\t\t// Smoothly transition to dampened movement\n\t\t\t\t\tconst dampenedDelta = xDelta * getDampening(xDelta);\n\t\t\t\t\t// Ensure we don't jump when transitioning to dampened movement\n\t\t\t\t\tswipeAmount.x =\n\t\t\t\t\t\tMath.abs(dampenedDelta) < Math.abs(xDelta)\n\t\t\t\t\t\t\t? dampenedDelta\n\t\t\t\t\t\t\t: xDelta;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Math.abs(swipeAmount.x) > 0 || Math.abs(swipeAmount.y) > 0) {\n\t\t\tisSwiped = true;\n\t\t}\n\n\t\ttoastRef?.style.setProperty('--swipe-amount-x', `${swipeAmount.x}px`);\n\t\ttoastRef?.style.setProperty('--swipe-amount-y', `${swipeAmount.y}px`);\n\t};\n\n\tconst handleDragEnd: DragEventHandler<HTMLLIElement> = () => {\n\t\tswiping = false;\n\t\tswipeDirection = null;\n\t\tpointerStart = null;\n\t};\n\n\tconst icon = $derived.by(() => {\n\t\tif (toast.icon) return toast.icon;\n\t\tif (toastType === 'success') return successIcon;\n\t\tif (toastType === 'error') return errorIcon;\n\t\tif (toastType === 'warning') return warningIcon;\n\t\tif (toastType === 'info') return infoIcon;\n\t\tif (toastType === 'loading') return loadingIcon;\n\t\treturn null;\n\t});\n</script>\n\n{#snippet LoadingIcon()}\n\t{#if loadingIcon}\n\t\t<div\n\t\t\tclass={cn(classes?.loader, toast?.classes?.loader, 'sonner-loader')}\n\t\t\tdata-visible={toastType === 'loading'}\n\t\t>\n\t\t\t{@render loadingIcon()}\n\t\t</div>\n\t{:else}\n\t\t<Loader\n\t\t\tclass={cn(classes?.loader, toast.classes?.loader)}\n\t\t\tvisible={toastType === 'loading'}\n\t\t/>\n\t{/if}\n{/snippet}\n\n<!-- svelte-ignore a11y_no_noninteractive_tabindex -->\n<li\n\ttabindex={0}\n\tbind:this={toastRef}\n\tclass={cn(\n\t\trestProps.class,\n\t\ttoastClass,\n\t\tclasses?.toast,\n\t\ttoast?.classes?.toast,\n\t\tclasses?.[toastType],\n\t\ttoast?.classes?.[toastType]\n\t)}\n\taria-live={toast.important ? 'assertive' : 'polite'}\n\taria-atomic=\"true\"\n\tdata-sonner-toast=\"\"\n\tdata-rich-colors={toast.richColors ?? defaultRichColors}\n\tdata-styled={!(toast.component || toast.unstyled || unstyled)}\n\tdata-mounted={mounted}\n\tdata-promise={Boolean(toast.promise)}\n\tdata-swiped={isSwiped}\n\tdata-removed={removed}\n\tdata-visible={isVisible}\n\tdata-y-position={coords[0]}\n\tdata-x-position={coords[1]}\n\tdata-index={index}\n\tdata-front={isFront}\n\tdata-swiping={swiping}\n\tdata-dismissible={dismissible}\n\tdata-type={toastType}\n\tdata-invert={invert}\n\tdata-swipe-out={swipeOut}\n\tdata-swipe-direction={swipeOutDirection}\n\tdata-expanded={Boolean(expanded || (expandByDefault && mounted))}\n\tstyle:--index={index}\n\tstyle:--toasts-before={index}\n\tstyle:--z-index={toastState.toasts.length - index}\n\tstyle:--offset={`${removed ? offsetBeforeRemove : offset}px`}\n\tstyle:--initial-height={expandByDefault ? 'auto' : `${initialHeight}px`}\n\tstyle={`${restProps.style} ${toast.style}`}\n\tonpointermove={handlePointerMove}\n\tonpointerup={handlePointerUp}\n\tonpointerdown={handlePointerDown}\n\tondragend={handleDragEnd}\n>\n\t{#if closeButton && !toast.component && toastType !== 'loading' && closeIcon !== null}\n\t\t<button\n\t\t\taria-label={closeButtonAriaLabel}\n\t\t\tdata-disabled={disabled}\n\t\t\tdata-close-button\n\t\t\tonclick={() => {\n\t\t\t\tif (disabled || !dismissible) return;\n\t\t\t\tdeleteToast();\n\t\t\t\ttoast.onDismiss?.(toast);\n\t\t\t}}\n\t\t\tclass={cn(classes?.closeButton, toast?.classes?.closeButton)}\n\t\t>\n\t\t\t{@render closeIcon?.()}\n\t\t</button>\n\t{/if}\n\n\t{#if toast.component}\n\t\t{@const Component = toast.component}\n\t\t<Component {...toast.componentProps} closeToast={deleteToast} />\n\t{:else}\n\t\t{#if (toastType || toast.icon || toast.promise) && toast.icon !== null && (icon !== null || toast.icon)}\n\t\t\t<div data-icon=\"\" class={cn(classes?.icon, toast?.classes?.icon)}>\n\t\t\t\t<!-- Promise toasts keep the loader mounted after they settle so it can animate out -->\n\t\t\t\t{#if toastType === 'loading'}\n\t\t\t\t\t{#if toast.icon}\n\t\t\t\t\t\t<toast.icon />\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t{@render LoadingIcon()}\n\t\t\t\t\t{/if}\n\t\t\t\t{:else if toast.promise}\n\t\t\t\t\t{@render LoadingIcon()}\n\t\t\t\t{/if}\n\t\t\t\t{#if toastType !== 'loading'}\n\t\t\t\t\t{#if toast.icon}\n\t\t\t\t\t\t<toast.icon />\n\t\t\t\t\t{:else if toastType === 'success'}\n\t\t\t\t\t\t{@render successIcon?.()}\n\t\t\t\t\t{:else if toastType === 'error'}\n\t\t\t\t\t\t{@render errorIcon?.()}\n\t\t\t\t\t{:else if toastType === 'warning'}\n\t\t\t\t\t\t{@render warningIcon?.()}\n\t\t\t\t\t{:else if toastType === 'info'}\n\t\t\t\t\t\t{@render infoIcon?.()}\n\t\t\t\t\t{/if}\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t{/if}\n\t\t<div\n\t\t\tdata-content=\"\"\n\t\t\tclass={cn(classes?.content, toast?.classes?.content)}\n\t\t>\n\t\t\t<div\n\t\t\t\tdata-title=\"\"\n\t\t\t\tclass={cn(classes?.title, toast?.classes?.title)}\n\t\t\t>\n\t\t\t\t{#if toast.title}\n\t\t\t\t\t{#if typeof toast.title !== 'string'}\n\t\t\t\t\t\t{@const Title = toast.title}\n\t\t\t\t\t\t<Title {...toast.componentProps} />\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t{toast.title}\n\t\t\t\t\t{/if}\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t\t{#if toast.description}\n\t\t\t\t<div\n\t\t\t\t\tdata-description=\"\"\n\t\t\t\t\tclass={cn(\n\t\t\t\t\t\tdescriptionClass,\n\t\t\t\t\t\ttoastDescriptionClass,\n\t\t\t\t\t\tclasses?.description,\n\t\t\t\t\t\ttoast.classes?.description\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{#if typeof toast.description !== 'string'}\n\t\t\t\t\t\t{@const Description = toast.description}\n\t\t\t\t\t\t<Description {...toast.componentProps} />\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t{toast.description}\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t</div>\n\t\t{#if toast.cancel}\n\t\t\t{#if typeof toast.cancel === 'function'}\n\t\t\t\t<toast.cancel />\n\t\t\t{:else if isAction(toast.cancel)}\n\t\t\t\t<button\n\t\t\t\t\tdata-button\n\t\t\t\t\tdata-cancel\n\t\t\t\t\tstyle={toast.cancelButtonStyle ?? cancelButtonStyle}\n\t\t\t\t\tclass={cn(\n\t\t\t\t\t\tclasses?.cancelButton,\n\t\t\t\t\t\ttoast?.classes?.cancelButton\n\t\t\t\t\t)}\n\t\t\t\t\tonclick={(event) => {\n\t\t\t\t\t\tif (!isAction(toast.cancel)) return;\n\t\t\t\t\t\tif (!dismissible) return;\n\t\t\t\t\t\ttoast.cancel?.onClick?.(event);\n\t\t\t\t\t\tdeleteToast();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{toast.cancel.label}\n\t\t\t\t</button>\n\t\t\t{/if}\n\t\t{/if}\n\t\t{#if toast.action}\n\t\t\t{#if typeof toast.action === 'function'}\n\t\t\t\t<toast.action />\n\t\t\t{:else if isAction(toast.action)}\n\t\t\t\t<button\n\t\t\t\t\tdata-button=\"\"\n\t\t\t\t\tstyle={toast.actionButtonStyle ?? actionButtonStyle}\n\t\t\t\t\tclass={cn(\n\t\t\t\t\t\tclasses?.actionButton,\n\t\t\t\t\t\ttoast?.classes?.actionButton\n\t\t\t\t\t)}\n\t\t\t\t\tonclick={(event) => {\n\t\t\t\t\t\tif (!isAction(toast.action)) return;\n\t\t\t\t\t\ttoast.action?.onClick(event);\n\t\t\t\t\t\tif (event.defaultPrevented) return;\n\t\t\t\t\t\tdeleteToast();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{toast.action.label}\n\t\t\t\t</button>\n\t\t\t{/if}\n\t\t{/if}\n\t{/if}\n</li>\n","<svg\n\taria-hidden=\"true\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\tviewBox=\"0 0 20 20\"\n\tfill=\"currentColor\"\n\theight=\"20\"\n\twidth=\"20\"\n\tdata-sonner-success-icon\n>\n\t<path\n\t\tfill-rule=\"evenodd\"\n\t\td=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\"\n\t\tclip-rule=\"evenodd\"\n\t/>\n</svg>\n","<svg\n\taria-hidden=\"true\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\tviewBox=\"0 0 20 20\"\n\tfill=\"currentColor\"\n\theight=\"20\"\n\twidth=\"20\"\n\tdata-sonner-error-icon\n>\n\t<path\n\t\tfill-rule=\"evenodd\"\n\t\td=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\"\n\t\tclip-rule=\"evenodd\"\n\t/>\n</svg>\n","<svg\n\taria-hidden=\"true\"\n\tviewBox=\"0 0 64 64\"\n\tfill=\"currentColor\"\n\theight=\"20\"\n\twidth=\"20\"\n\tdata-sonner-warning-icon\n\txmlns=\"http://www.w3.org/2000/svg\"\n>\n\t<path\n\t\td=\"M32.427,7.987c2.183,0.124 4,1.165 5.096,3.281l17.936,36.208c1.739,3.66 -0.954,8.585 -5.373,8.656l-36.119,0c-4.022,-0.064 -7.322,-4.631 -5.352,-8.696l18.271,-36.207c0.342,-0.65 0.498,-0.838 0.793,-1.179c1.186,-1.375 2.483,-2.111 4.748,-2.063Zm-0.295,3.997c-0.687,0.034 -1.316,0.419 -1.659,1.017c-6.312,11.979 -12.397,24.081 -18.301,36.267c-0.546,1.225 0.391,2.797 1.762,2.863c12.06,0.195 24.125,0.195 36.185,0c1.325,-0.064 2.321,-1.584 1.769,-2.85c-5.793,-12.184 -11.765,-24.286 -17.966,-36.267c-0.366,-0.651 -0.903,-1.042 -1.79,-1.03Z\"\n\t/>\n\t<path\n\t\td=\"M33.631,40.581l-3.348,0l-0.368,-16.449l4.1,0l-0.384,16.449Zm-3.828,5.03c0,-0.609 0.197,-1.113 0.592,-1.514c0.396,-0.4 0.935,-0.601 1.618,-0.601c0.684,0 1.223,0.201 1.618,0.601c0.395,0.401 0.593,0.905 0.593,1.514c0,0.587 -0.193,1.078 -0.577,1.473c-0.385,0.395 -0.929,0.593 -1.634,0.593c-0.705,0 -1.249,-0.198 -1.634,-0.593c-0.384,-0.395 -0.576,-0.886 -0.576,-1.473Z\"\n\t/>\n</svg>\n","<svg\n\taria-hidden=\"true\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\tviewBox=\"0 0 20 20\"\n\tfill=\"currentColor\"\n\theight=\"20\"\n\twidth=\"20\"\n\tdata-sonner-info-icon\n>\n\t<path\n\t\tfill-rule=\"evenodd\"\n\t\td=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\"\n\t\tclip-rule=\"evenodd\"\n\t/>\n</svg>\n","<svg\n\taria-hidden=\"true\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\twidth=\"12\"\n\theight=\"12\"\n\tviewBox=\"0 0 24 24\"\n\tfill=\"none\"\n\tstroke=\"currentColor\"\n\tstroke-width=\"1.5\"\n\tstroke-linecap=\"round\"\n\tstroke-linejoin=\"round\"\n\tdata-sonner-close-icon\n>\n\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n</svg>\n","<script lang=\"ts\" module>\n\t// visible toasts amount\n\tconst VISIBLE_TOASTS_AMOUNT = 3;\n\n\t// Viewport padding\n\tconst VIEWPORT_OFFSET = '24px';\n\n\t// Mobile viewport padding\n\tconst MOBILE_VIEWPORT_OFFSET = '16px';\n\n\t// Default lifetime of a toasts (in ms)\n\tconst TOAST_LIFETIME = 4000;\n\n\t// Default toast width\n\tconst TOAST_WIDTH = 356;\n\n\t// Default gap between toasts\n\tconst GAP = 14;\n\n\tconst DARK = 'dark';\n\tconst LIGHT = 'light';\n\n\ttype OffsetObject = {\n\t\t'--offset-top': string;\n\t\t'--offset-right': string;\n\t\t'--offset-bottom': string;\n\t\t'--offset-left': string;\n\t\t'--mobile-offset-top': string;\n\t\t'--mobile-offset-right': string;\n\t\t'--mobile-offset-bottom': string;\n\t\t'--mobile-offset-left': string;\n\t};\n\n\tfunction getOffsetObject(\n\t\tdefaultOffset: ToasterProps['offset'],\n\t\tmobileOffset: ToasterProps['mobileOffset']\n\t) {\n\t\tconst styles = {} as OffsetObject;\n\n\t\t[defaultOffset, mobileOffset].forEach((offset, index) => {\n\t\t\tconst isMobile = index === 1;\n\t\t\tconst prefix = isMobile ? '--mobile-offset' : '--offset';\n\t\t\tconst defaultValue = isMobile\n\t\t\t\t? MOBILE_VIEWPORT_OFFSET\n\t\t\t\t: VIEWPORT_OFFSET;\n\n\t\t\tfunction assignAll(offset: string | number) {\n\t\t\t\t['top', 'right', 'bottom', 'left'].forEach((key) => {\n\t\t\t\t\tstyles[`${prefix}-${key}` as keyof OffsetObject] =\n\t\t\t\t\t\ttypeof offset === 'number' ? `${offset}px` : offset;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (typeof offset === 'number' || typeof offset === 'string') {\n\t\t\t\tassignAll(offset);\n\t\t\t} else if (typeof offset === 'object') {\n\t\t\t\t['top', 'right', 'bottom', 'left'].forEach((key) => {\n\t\t\t\t\tconst value = offset[key as keyof typeof offset];\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tstyles[`${prefix}-${key}` as keyof OffsetObject] =\n\t\t\t\t\t\t\tdefaultValue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstyles[`${prefix}-${key}` as keyof OffsetObject] =\n\t\t\t\t\t\t\ttypeof value === 'number' ? `${value}px` : value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tassignAll(defaultValue);\n\t\t\t}\n\t\t});\n\n\t\treturn styles;\n\t}\n</script>\n\n<script lang=\"ts\">\n\timport { onMount, untrack } from 'svelte';\n\timport { SonnerState, toastState } from './toast-state.svelte';\n\timport Toast from './Toast.svelte';\n\timport type { ToasterProps } from './types.js';\n\timport type { Position } from './types.js';\n\timport type {\n\t\tDragEventHandler,\n\t\tFocusEventHandler,\n\t\tMouseEventHandler,\n\t\tPointerEventHandler\n\t} from 'svelte/elements';\n\timport SuccessIcon from './icons/SuccessIcon.svelte';\n\timport ErrorIcon from './icons/ErrorIcon.svelte';\n\timport WarningIcon from './icons/WarningIcon.svelte';\n\timport InfoIcon from './icons/InfoIcon.svelte';\n\timport CloseIcon from './icons/CloseIcon.svelte';\n\timport { sonnerContext } from './internal/ctx.js';\n\timport { on } from 'svelte/events';\n\n\tfunction getInitialTheme(t: string) {\n\t\tif (t !== 'system') return t;\n\t\tif (typeof window !== 'undefined') {\n\t\t\tif (\n\t\t\t\twindow.matchMedia &&\n\t\t\t\twindow.matchMedia('(prefers-color-scheme: dark)').matches\n\t\t\t) {\n\t\t\t\treturn DARK;\n\t\t\t}\n\n\t\t\treturn LIGHT;\n\t\t}\n\n\t\treturn LIGHT;\n\t}\n\n\tlet {\n\t\tid,\n\t\tinvert = false,\n\t\tposition = 'bottom-right',\n\t\thotkey = ['altKey', 'KeyT'],\n\t\texpand = false,\n\t\tcloseButton = false,\n\t\toffset = VIEWPORT_OFFSET,\n\t\tmobileOffset = MOBILE_VIEWPORT_OFFSET,\n\t\ttheme = 'light',\n\t\trichColors = false,\n\t\tduration = TOAST_LIFETIME,\n\t\tvisibleToasts = VISIBLE_TOASTS_AMOUNT,\n\t\ttoastOptions = {},\n\t\tdir = 'auto',\n\t\tgap = GAP,\n\t\tswipeDirections,\n\t\tpauseWhenPageIsHidden = false,\n\t\tloadingIcon: loadingIconProp,\n\t\tsuccessIcon: successIconProp,\n\t\terrorIcon: errorIconProp,\n\t\twarningIcon: warningIconProp,\n\t\tcloseIcon: closeIconProp,\n\t\tinfoIcon: infoIconProp,\n\t\tcontainerAriaLabel = 'Notifications',\n\t\tclass: className,\n\t\tcloseButtonAriaLabel = 'Close toast',\n\t\tonblur,\n\t\tonfocus,\n\t\tonmouseenter,\n\t\tonmousemove,\n\t\tonmouseleave,\n\t\tondragend,\n\t\tonpointerdown,\n\t\tonpointerup,\n\t\t...restProps\n\t}: ToasterProps = $props();\n\n\tfunction getDocumentDirection(): ToasterProps['dir'] {\n\t\tif (dir !== 'auto') return dir;\n\t\tif (typeof window === 'undefined') return 'ltr';\n\t\tif (typeof document === 'undefined') return 'ltr'; // For Fresh purpose\n\n\t\tconst dirAttribute = document.documentElement.getAttribute(\n\t\t\t'dir'\n\t\t) as ToasterProps['dir'];\n\n\t\tif (dirAttribute === 'auto' || !dirAttribute) {\n\t\t\tuntrack(\n\t\t\t\t() =>\n\t\t\t\t\t(dir =\n\t\t\t\t\t\t(window.getComputedStyle(document.documentElement)\n\t\t\t\t\t\t\t.direction as ToasterProps['dir']) ?? 'ltr')\n\t\t\t);\n\t\t\treturn dir;\n\t\t}\n\n\t\tuntrack(() => (dir = dirAttribute));\n\t\treturn dirAttribute;\n\t}\n\n\t// The slice of the shared toast state this toaster renders: an id-less toaster\n\t// shows only toasts without a toasterId (upstream sonner semantics).\n\tconst filteredToasts = $derived(\n\t\tid\n\t\t\t? toastState.toasts.filter((toast) => toast.toasterId === id)\n\t\t\t: toastState.toasts.filter((toast) => !toast.toasterId)\n\t);\n\n\tconst possiblePositions = $derived(\n\t\tArray.from(\n\t\t\tnew Set(\n\t\t\t\t[\n\t\t\t\t\tposition,\n\t\t\t\t\t...filteredToasts\n\t\t\t\t\t\t.filter((toast) => toast.position)\n\t\t\t\t\t\t.map((toast) => toast.position)\n\t\t\t\t].filter(Boolean)\n\t\t\t)\n\t\t) as Position[]\n\t);\n\n\tlet expanded = $state(false);\n\tlet interacting = $state(false);\n\tlet actualTheme = $state(getInitialTheme(theme));\n\tlet listRef = $state<HTMLOListElement>();\n\tlet lastFocusedElementRef = $state<HTMLElement | null>(null);\n\tlet isFocusWithin = $state(false);\n\tlet lastMousePosition: { x: number; y: number } | null = null;\n\n\tconst hotkeyLabel = $derived(\n\t\thotkey.join('+').replace(/Key/g, '').replace(/Digit/g, '')\n\t);\n\n\t$effect(() => {\n\t\tif (filteredToasts.length <= 1) {\n\t\t\texpanded = false;\n\t\t}\n\t});\n\n\t// Check for dismissed toasts and remove them. We need to do this to have dismiss animation.\n\t$effect(() => {\n\t\tconst toastsToDismiss = filteredToasts.filter(\n\t\t\t(toast) => toast.dismiss && !toast.delete\n\t\t);\n\n\t\tif (toastsToDismiss.length > 0) {\n\t\t\tconst updatedToasts = toastState.toasts.map((toast) => {\n\t\t\t\tconst matchingToast = toastsToDismiss.find(\n\t\t\t\t\t(dismissToast) => dismissToast.id === toast.id\n\t\t\t\t);\n\n\t\t\t\tif (matchingToast) {\n\t\t\t\t\treturn { ...toast, delete: true };\n\t\t\t\t}\n\n\t\t\t\treturn toast;\n\t\t\t});\n\t\t\ttoastState.toasts = updatedToasts;\n\t\t}\n\t});\n\n\t$effect(() => {\n\t\treturn () => {\n\t\t\tif (listRef && lastFocusedElementRef) {\n\t\t\t\tlastFocusedElementRef.focus({ preventScroll: true });\n\t\t\t\tlastFocusedElementRef = null;\n\t\t\t\tisFocusWithin = false;\n\t\t\t}\n\t\t};\n\t});\n\n\tonMount(() => {\n\t\tconst handleKeydown = (event: KeyboardEvent) => {\n\t\t\tconst isHotkeyPressed = hotkey.every(\n\t\t\t\t(key) =>\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\t\t(event as any)[key] || event.code === key\n\t\t\t);\n\t\t\tif (isHotkeyPressed) {\n\t\t\t\texpanded = true;\n\t\t\t\tlistRef?.focus();\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tevent.code === 'Escape' &&\n\t\t\t\t(document.activeElement === listRef ||\n\t\t\t\t\tlistRef?.contains(document.activeElement))\n\t\t\t) {\n\t\t\t\texpanded = false;\n\t\t\t}\n\t\t};\n\n\t\treturn on(document, 'keydown', handleKeydown);\n\t});\n\n\t$effect(() => {\n\t\tif (theme !== 'system') {\n\t\t\tactualTheme = theme;\n\t\t}\n\n\t\tif (typeof window !== 'undefined') {\n\t\t\tif (theme === 'system') {\n\t\t\t\tif (\n\t\t\t\t\twindow.matchMedia &&\n\t\t\t\t\twindow.matchMedia('(prefers-color-scheme: dark)').matches\n\t\t\t\t) {\n\t\t\t\t\tactualTheme = DARK;\n\t\t\t\t} else {\n\t\t\t\t\tactualTheme = LIGHT;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst mediaQueryList = window.matchMedia(\n\t\t\t\t'(prefers-color-scheme: dark)'\n\t\t\t);\n\n\t\t\tconst changeHandler = ({ matches }: MediaQueryListEvent) => {\n\t\t\t\tif (theme !== 'system') return;\n\t\t\t\tactualTheme = matches ? DARK : LIGHT;\n\t\t\t};\n\n\t\t\tif ('addEventListener' in mediaQueryList) {\n\t\t\t\tmediaQueryList.addEventListener('change', changeHandler);\n\t\t\t} else {\n\t\t\t\t// @ts-expect-error deprecated API\n\t\t\t\tmediaQueryList.addListener(changeHandler);\n\t\t\t}\n\t\t}\n\t});\n\n\tconst handleBlur: FocusEventHandler<HTMLOListElement> = (event) => {\n\t\tonblur?.(event);\n\t\tif (\n\t\t\tisFocusWithin &&\n\t\t\t!event.currentTarget.contains(event.relatedTarget as HTMLElement)\n\t\t) {\n\t\t\tisFocusWithin = false;\n\t\t\tif (lastFocusedElementRef) {\n\t\t\t\tlastFocusedElementRef.focus({ preventScroll: true });\n\t\t\t\tlastFocusedElementRef = null;\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleFocus: FocusEventHandler<HTMLOListElement> = (event) => {\n\t\tonfocus?.(event);\n\t\tconst isNotDismissable =\n\t\t\tevent.target instanceof HTMLElement &&\n\t\t\tevent.target.dataset.dismissible === 'false';\n\n\t\tif (isNotDismissable) return;\n\n\t\tif (!isFocusWithin) {\n\t\t\tisFocusWithin = true;\n\t\t\tlastFocusedElementRef = event.relatedTarget as HTMLElement;\n\t\t}\n\t};\n\n\tconst handlePointerDown: PointerEventHandler<HTMLOListElement> = (\n\t\tevent\n\t) => {\n\t\tonpointerdown?.(event);\n\t\tconst isNotDismissable =\n\t\t\tevent.target instanceof HTMLElement &&\n\t\t\tevent.target.dataset.dismissible === 'false';\n\n\t\tif (isNotDismissable) return;\n\t\tinteracting = true;\n\t};\n\n\tconst handleMouseEnter: MouseEventHandler<HTMLOListElement> = (event) => {\n\t\tonmouseenter?.(event);\n\t\tlastMousePosition = { x: event.clientX, y: event.clientY };\n\t\texpanded = true;\n\t};\n\n\tconst handleMouseLeave: MouseEventHandler<HTMLOListElement> = (event) => {\n\t\tonmouseleave?.(event);\n\n\t\t// fix firefox firing mouseleave when the toast is closed by clicking\n\t\t// the close button and the toast leaves the mouse position. This doesn't\n\t\t// happen on other browsers, since the mouse wasn't moved by the user.\n\t\t// so we only collapse if mouse actually moved from last known position\n\t\tconst currentPosition = { x: event.clientX, y: event.clientY };\n\t\tconst mouseActuallyMoved =\n\t\t\t!lastMousePosition ||\n\t\t\tMath.abs(currentPosition.x - lastMousePosition.x) > 1 ||\n\t\t\tMath.abs(currentPosition.y - lastMousePosition.y) > 1;\n\n\t\tif (!interacting && mouseActuallyMoved) {\n\t\t\texpanded = false;\n\t\t}\n\t};\n\n\tconst handleMouseMove: MouseEventHandler<HTMLOListElement> = (event) => {\n\t\tonmousemove?.(event);\n\t\tlastMousePosition = { x: event.clientX, y: event.clientY };\n\t\texpanded = true;\n\t};\n\n\tconst handleDragEnd: DragEventHandler<HTMLOListElement> = (event) => {\n\t\tondragend?.(event);\n\t\texpanded = false;\n\t};\n\n\tconst handlePointerUp: PointerEventHandler<HTMLOListElement> = (event) => {\n\t\tonpointerup?.(event);\n\t\tinteracting = false;\n\t};\n\n\tsonnerContext.set(new SonnerState());\n</script>\n\n<!-- eslint-disable-next-line svelte/valid-compile -->\n<!-- svelte-ignore a11y_no_noninteractive_tabindex -->\n<section\n\taria-label=\"{containerAriaLabel} {hotkeyLabel}\"\n\ttabindex={-1}\n\taria-live=\"polite\"\n\taria-relevant=\"additions text\"\n\taria-atomic=\"false\"\n>\n\t{#if filteredToasts.length > 0}\n\t\t{#each possiblePositions as position, index (position)}\n\t\t\t{@const [y, x] = position.split('-')}\n\t\t\t{@const offsetObject = getOffsetObject(offset, mobileOffset)}\n\t\t\t{@const frontHeight =\n\t\t\t\ttoastState.heights.find(\n\t\t\t\t\t(height) =>\n\t\t\t\t\t\theight.toasterId === id && height.position === position\n\t\t\t\t)?.height ?? 0}\n\t\t\t<!-- eslint-disable-next-line svelte/valid-compile -->\n\t\t\t<!-- svelte-ignore a11y_no_noninteractive_tabindex -->\n\t\t\t<ol\n\t\t\t\ttabindex={-1}\n\t\t\t\tdir={getDocumentDirection()}\n\t\t\t\tbind:this={listRef}\n\t\t\t\tclass={className}\n\t\t\t\tdata-sonner-toaster\n\t\t\t\tdata-sonner-theme={actualTheme}\n\t\t\t\tdata-y-position={y}\n\t\t\t\tdata-x-position={x}\n\t\t\t\tstyle:--front-toast-height={`${frontHeight}px`}\n\t\t\t\tstyle:--width={`${TOAST_WIDTH}px`}\n\t\t\t\tstyle:--gap={`${gap}px`}\n\t\t\t\tstyle:--offset-top={offsetObject['--offset-top']}\n\t\t\t\tstyle:--offset-right={offsetObject['--offset-right']}\n\t\t\t\tstyle:--offset-bottom={offsetObject['--offset-bottom']}\n\t\t\t\tstyle:--offset-left={offsetObject['--offset-left']}\n\t\t\t\tstyle:--mobile-offset-top={offsetObject['--mobile-offset-top']}\n\t\t\t\tstyle:--mobile-offset-right={offsetObject[\n\t\t\t\t\t'--mobile-offset-right'\n\t\t\t\t]}\n\t\t\t\tstyle:--mobile-offset-bottom={offsetObject[\n\t\t\t\t\t'--mobile-offset-bottom'\n\t\t\t\t]}\n\t\t\t\tstyle:--mobile-offset-left={offsetObject[\n\t\t\t\t\t'--mobile-offset-left'\n\t\t\t\t]}\n\t\t\t\tstyle={restProps.style}\n\t\t\t\tonblur={handleBlur}\n\t\t\t\tonfocus={handleFocus}\n\t\t\t\tonmouseenter={handleMouseEnter}\n\t\t\t\tonmousemove={handleMouseMove}\n\t\t\t\tonmouseleave={handleMouseLeave}\n\t\t\t\tondragend={handleDragEnd}\n\t\t\t\tonpointerdown={handlePointerDown}\n\t\t\t\tonpointerup={handlePointerUp}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t{#each filteredToasts.filter((toast) => (!toast.position && index === 0) || toast.position === position) as toast, index (toast.id)}\n\t\t\t\t\t<Toast\n\t\t\t\t\t\t{index}\n\t\t\t\t\t\t{toast}\n\t\t\t\t\t\tdefaultRichColors={richColors}\n\t\t\t\t\t\tduration={toastOptions?.duration ?? duration}\n\t\t\t\t\t\tclass={toastOptions?.class ?? ''}\n\t\t\t\t\t\tdescriptionClass={toastOptions?.descriptionClass || ''}\n\t\t\t\t\t\t{invert}\n\t\t\t\t\t\t{visibleToasts}\n\t\t\t\t\t\tcloseButton={toastOptions?.closeButton ?? closeButton}\n\t\t\t\t\t\t{interacting}\n\t\t\t\t\t\t{position}\n\t\t\t\t\t\t{gap}\n\t\t\t\t\t\tstyle={toastOptions?.style ?? ''}\n\t\t\t\t\t\tclasses={toastOptions.classes || {}}\n\t\t\t\t\t\tunstyled={toastOptions.unstyled ?? false}\n\t\t\t\t\t\tcancelButtonStyle={toastOptions?.cancelButtonStyle ??\n\t\t\t\t\t\t\t''}\n\t\t\t\t\t\tactionButtonStyle={toastOptions?.actionButtonStyle ??\n\t\t\t\t\t\t\t''}\n\t\t\t\t\t\tcloseButtonAriaLabel={toastOptions?.closeButtonAriaLabel ??\n\t\t\t\t\t\t\tcloseButtonAriaLabel}\n\t\t\t\t\t\texpandByDefault={expand}\n\t\t\t\t\t\t{expanded}\n\t\t\t\t\t\t{swipeDirections}\n\t\t\t\t\t\t{pauseWhenPageIsHidden}\n\t\t\t\t\t\tloadingIcon={loadingIconProp}\n\t\t\t\t\t>\n\t\t\t\t\t\t{#snippet successIcon()}\n\t\t\t\t\t\t\t{#if successIconProp}\n\t\t\t\t\t\t\t\t{@render successIconProp?.()}\n\t\t\t\t\t\t\t{:else if successIconProp !== null}\n\t\t\t\t\t\t\t\t<SuccessIcon />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/snippet}\n\n\t\t\t\t\t\t{#snippet errorIcon()}\n\t\t\t\t\t\t\t{#if errorIconProp}\n\t\t\t\t\t\t\t\t{@render errorIconProp?.()}\n\t\t\t\t\t\t\t{:else if errorIconProp !== null}\n\t\t\t\t\t\t\t\t<ErrorIcon />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/snippet}\n\n\t\t\t\t\t\t{#snippet warningIcon()}\n\t\t\t\t\t\t\t{#if warningIconProp}\n\t\t\t\t\t\t\t\t{@render warningIconProp?.()}\n\t\t\t\t\t\t\t{:else if warningIconProp !== null}\n\t\t\t\t\t\t\t\t<WarningIcon />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/snippet}\n\n\t\t\t\t\t\t{#snippet infoIcon()}\n\t\t\t\t\t\t\t{#if infoIconProp}\n\t\t\t\t\t\t\t\t{@render infoIconProp?.()}\n\t\t\t\t\t\t\t{:else if infoIconProp !== null}\n\t\t\t\t\t\t\t\t<InfoIcon />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/snippet}\n\n\t\t\t\t\t\t{#snippet closeIcon()}\n\t\t\t\t\t\t\t{#if closeIconProp}\n\t\t\t\t\t\t\t\t{@render closeIconProp?.()}\n\t\t\t\t\t\t\t{:else if closeIconProp !== null}\n\t\t\t\t\t\t\t\t<CloseIcon />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/snippet}\n\t\t\t\t\t</Toast>\n\t\t\t\t{/each}\n\t\t\t</ol>\n\t\t{/each}\n\t{/if}\n</section>\n\n<style>\n\t:global {\n\t\thtml[dir='ltr'],\n\t\t[data-sonner-toaster][dir='ltr'] {\n\t\t\t--toast-icon-margin-start: -3px;\n\t\t\t--toast-icon-margin-end: 4px;\n\t\t\t--toast-svg-margin-start: -1px;\n\t\t\t--toast-svg-margin-end: 0px;\n\t\t\t--toast-button-margin-start: auto;\n\t\t\t--toast-button-margin-end: 0;\n\t\t\t--toast-close-button-start: 0;\n\t\t\t--toast-close-button-end: unset;\n\t\t\t--toast-close-button-transform: translate(-35%, -35%);\n\t\t}\n\n\t\thtml[dir='rtl'],\n\t\t[data-sonner-toaster][dir='rtl'] {\n\t\t\t--toast-icon-margin-start: 4px;\n\t\t\t--toast-icon-margin-end: -3px;\n\t\t\t--toast-svg-margin-start: 0px;\n\t\t\t--toast-svg-margin-end: -1px;\n\t\t\t--toast-button-margin-start: 0;\n\t\t\t--toast-button-margin-end: auto;\n\t\t\t--toast-close-button-start: unset;\n\t\t\t--toast-close-button-end: 0;\n\t\t\t--toast-close-button-transform: translate(35%, -35%);\n\t\t}\n\n\t\t[data-sonner-toaster] {\n\t\t\tposition: fixed;\n\t\t\twidth: var(--width);\n\t\t\tfont-family:\n\t\t\t\tui-sans-serif,\n\t\t\t\tsystem-ui,\n\t\t\t\t-apple-system,\n\t\t\t\tBlinkMacSystemFont,\n\t\t\t\tSegoe UI,\n\t\t\t\tRoboto,\n\t\t\t\tHelvetica Neue,\n\t\t\t\tArial,\n\t\t\t\tNoto Sans,\n\t\t\t\tsans-serif,\n\t\t\t\tApple Color Emoji,\n\t\t\t\tSegoe UI Emoji,\n\t\t\t\tSegoe UI Symbol,\n\t\t\t\tNoto Color Emoji;\n\t\t\t--gray1: hsl(0, 0%, 99%);\n\t\t\t--gray2: hsl(0, 0%, 97.3%);\n\t\t\t--gray3: hsl(0, 0%, 95.1%);\n\t\t\t--gray4: hsl(0, 0%, 93%);\n\t\t\t--gray5: hsl(0, 0%, 90.9%);\n\t\t\t--gray6: hsl(0, 0%, 88.7%);\n\t\t\t--gray7: hsl(0, 0%, 85.8%);\n\t\t\t--gray8: hsl(0, 0%, 78%);\n\t\t\t--gray9: hsl(0, 0%, 56.1%);\n\t\t\t--gray10: hsl(0, 0%, 52.3%);\n\t\t\t--gray11: hsl(0, 0%, 43.5%);\n\t\t\t--gray12: hsl(0, 0%, 9%);\n\t\t\t--border-radius: 8px;\n\t\t\tbox-sizing: border-box;\n\t\t\tpadding: 0;\n\t\t\tmargin: 0;\n\t\t\tlist-style: none;\n\t\t\toutline: none;\n\t\t\tz-index: 999999999;\n\t\t\ttransition: transform 400ms ease;\n\t\t}\n\n\t\t@media (hover: none) and (pointer: coarse) {\n\t\t\t[data-sonner-toaster][data-lifted='true'] {\n\t\t\t\ttransform: none;\n\t\t\t}\n\t\t}\n\n\t\t[data-sonner-toaster][data-x-position='right'] {\n\t\t\tright: var(--offset-right);\n\t\t}\n\n\t\t[data-sonner-toaster][data-x-position='left'] {\n\t\t\tleft: var(--offset-left);\n\t\t}\n\n\t\t[data-sonner-toaster][data-x-position='center'] {\n\t\t\tleft: 50%;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\n\t\t[data-sonner-toaster][data-y-position='top'] {\n\t\t\ttop: var(--offset-top);\n\t\t}\n\n\t\t[data-sonner-toaster][data-y-position='bottom'] {\n\t\t\tbottom: var(--offset-bottom);\n\t\t}\n\n\t\t[data-sonner-toast] {\n\t\t\t--y: translateY(100%);\n\t\t\t--lift-amount: calc(var(--lift) * var(--gap));\n\t\t\tz-index: var(--z-index);\n\t\t\tposition: absolute;\n\t\t\topacity: 0;\n\t\t\ttransform: var(--y);\n\t\t\ttouch-action: none;\n\t\t\ttransition:\n\t\t\t\ttransform 400ms,\n\t\t\t\topacity 400ms,\n\t\t\t\theight 400ms,\n\t\t\t\tbox-shadow 200ms;\n\t\t\tbox-sizing: border-box;\n\t\t\toutline: none;\n\t\t\toverflow-wrap: anywhere;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] {\n\t\t\tpadding: 16px;\n\t\t\tbackground: var(--normal-bg);\n\t\t\tborder: 1px solid var(--normal-border);\n\t\t\tcolor: var(--normal-text);\n\t\t\tborder-radius: var(--border-radius);\n\t\t\tbox-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);\n\t\t\twidth: var(--width);\n\t\t\tfont-size: 13px;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: 6px;\n\t\t}\n\n\t\t[data-sonner-toast]:focus-visible {\n\t\t\tbox-shadow:\n\t\t\t\t0px 4px 12px rgba(0, 0, 0, 0.1),\n\t\t\t\t0 0 0 2px rgba(0, 0, 0, 0.2);\n\t\t}\n\n\t\t[data-sonner-toast][data-y-position='top'] {\n\t\t\ttop: 0;\n\t\t\t--y: translateY(-100%);\n\t\t\t--lift: 1;\n\t\t\t--lift-amount: calc(1 * var(--gap));\n\t\t}\n\n\t\t[data-sonner-toast][data-y-position='bottom'] {\n\t\t\tbottom: 0;\n\t\t\t--y: translateY(100%);\n\t\t\t--lift: -1;\n\t\t\t--lift-amount: calc(var(--lift) * var(--gap));\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-description] {\n\t\t\tfont-weight: 400;\n\t\t\tline-height: 1.4;\n\t\t\tcolor: #3f3f3f;\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-styled='true']\n\t\t\t[data-description] {\n\t\t\tcolor: inherit;\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='dark'] [data-description] {\n\t\t\tcolor: hsl(0, 0%, 91%);\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-title] {\n\t\t\tfont-weight: 500;\n\t\t\tline-height: 1.5;\n\t\t\tcolor: inherit;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-icon] {\n\t\t\tdisplay: flex;\n\t\t\theight: 16px;\n\t\t\twidth: 16px;\n\t\t\tposition: relative;\n\t\t\tjustify-content: flex-start;\n\t\t\talign-items: center;\n\t\t\tflex-shrink: 0;\n\t\t\tmargin-left: var(--toast-icon-margin-start);\n\t\t\tmargin-right: var(--toast-icon-margin-end);\n\t\t}\n\n\t\t[data-sonner-toast][data-promise='true'] [data-icon] > svg {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.8);\n\t\t\ttransform-origin: center;\n\t\t\tanimation: sonner-fade-in 300ms ease forwards;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-icon] > * {\n\t\t\tflex-shrink: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-icon] svg {\n\t\t\tmargin-left: var(--toast-svg-margin-start);\n\t\t\tmargin-right: var(--toast-svg-margin-end);\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-content] {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 2px;\n\t\t\t/* Take the space the icon and the buttons leave, so a custom title or\n\t\t description isn't limited to the width of its text */\n\t\t\tflex: 1;\n\t\t\tmin-width: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-button] {\n\t\t\tborder-radius: 4px;\n\t\t\tpadding-left: 8px;\n\t\t\tpadding-right: 8px;\n\t\t\theight: 24px;\n\t\t\tfont-size: 12px;\n\t\t\tcolor: var(--normal-bg);\n\t\t\tbackground: var(--normal-text);\n\t\t\tmargin-left: var(--toast-button-margin-start);\n\t\t\tmargin-right: var(--toast-button-margin-end);\n\t\t\tborder: none;\n\t\t\tfont-weight: 500;\n\t\t\tcursor: pointer;\n\t\t\toutline: none;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tflex-shrink: 0;\n\t\t\ttransition:\n\t\t\t\topacity 400ms,\n\t\t\t\tbox-shadow 200ms;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-button]:focus-visible {\n\t\t\tbox-shadow: 0 0 0 2px rgba(0, 0, 0, 0.4);\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-button]:first-of-type {\n\t\t\tmargin-left: var(--toast-button-margin-start);\n\t\t\tmargin-right: var(--toast-button-margin-end);\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-cancel] {\n\t\t\tcolor: var(--normal-text);\n\t\t\tbackground: rgba(0, 0, 0, 0.08);\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='dark']\n\t\t\t[data-sonner-toast][data-styled='true']\n\t\t\t[data-cancel] {\n\t\t\tbackground: rgba(255, 255, 255, 0.3);\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-close-button] {\n\t\t\tposition: absolute;\n\t\t\tleft: var(--toast-close-button-start);\n\t\t\tright: var(--toast-close-button-end);\n\t\t\ttop: 0;\n\t\t\theight: 20px;\n\t\t\twidth: 20px;\n\t\t\tdisplay: flex;\n\t\t\tjustify-content: center;\n\t\t\talign-items: center;\n\t\t\tpadding: 0;\n\t\t\tcolor: var(--gray12);\n\t\t\tbackground: var(--normal-bg);\n\t\t\tborder: 1px solid var(--gray4);\n\t\t\ttransform: var(--toast-close-button-transform);\n\t\t\tborder-radius: 50%;\n\t\t\tcursor: pointer;\n\t\t\tz-index: 1;\n\t\t\ttransition:\n\t\t\t\topacity 100ms,\n\t\t\t\tbackground 200ms,\n\t\t\t\tborder-color 200ms;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true']\n\t\t\t[data-close-button]:focus-visible {\n\t\t\tbox-shadow:\n\t\t\t\t0px 4px 12px rgba(0, 0, 0, 0.1),\n\t\t\t\t0 0 0 2px rgba(0, 0, 0, 0.2);\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-disabled='true'] {\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true']:hover\n\t\t\t[data-close-button]:hover {\n\t\t\tbackground: var(--gray2);\n\t\t\tborder-color: var(--gray5);\n\t\t}\n\n\t\t[data-sonner-toast][data-swiping='true']::before {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tleft: -100%;\n\t\t\tright: -100%;\n\t\t\theight: 100%;\n\t\t\tz-index: -1;\n\t\t}\n\n\t\t[data-sonner-toast][data-y-position='top'][data-swiping='true']::before {\n\t\t\tbottom: 50%;\n\t\t\ttransform: scaleY(3) translateY(50%);\n\t\t}\n\n\t\t[data-sonner-toast][data-y-position='bottom'][data-swiping='true']::before {\n\t\t\ttop: 50%;\n\t\t\ttransform: scaleY(3) translateY(-50%);\n\t\t}\n\n\t\t[data-sonner-toast][data-swiping='false'][data-removed='true']::before {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tinset: 0;\n\t\t\ttransform: scaleY(2);\n\t\t}\n\n\t\t[data-sonner-toast][data-expanded='true']::after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tleft: 0;\n\t\t\theight: calc(var(--gap) + 1px);\n\t\t\tbottom: 100%;\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t[data-sonner-toast][data-mounted='true'] {\n\t\t\t--y: translateY(0);\n\t\t\topacity: 1;\n\t\t}\n\n\t\t[data-sonner-toast][data-expanded='false'][data-front='false'] {\n\t\t\t--scale: var(--toasts-before) * 0.05 + 1;\n\t\t\t--y: translateY(calc(var(--lift-amount) * var(--toasts-before)))\n\t\t\t\tscale(calc(-1 * var(--scale)));\n\t\t\theight: var(--front-toast-height);\n\t\t}\n\n\t\t[data-sonner-toast] > * {\n\t\t\ttransition: opacity 400ms;\n\t\t}\n\n\t\t[data-sonner-toast][data-x-position='right'] {\n\t\t\tright: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-x-position='left'] {\n\t\t\tleft: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-expanded='false'][data-front='false'][data-styled='true']\n\t\t\t> * {\n\t\t\topacity: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-visible='false'] {\n\t\t\topacity: 0;\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t[data-sonner-toast][data-mounted='true'][data-expanded='true'] {\n\t\t\t--y: translateY(calc(var(--lift) * var(--offset)));\n\t\t\theight: var(--initial-height);\n\t\t}\n\n\t\t[data-sonner-toast][data-removed='true'][data-front='true'][data-swipe-out='false'] {\n\t\t\t--y: translateY(calc(var(--lift) * -100%));\n\t\t\topacity: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-removed='true'][data-front='false'][data-swipe-out='false'][data-expanded='true'] {\n\t\t\t--y: translateY(\n\t\t\t\tcalc(var(--lift) * var(--offset) + var(--lift) * -100%)\n\t\t\t);\n\t\t\topacity: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-removed='true'][data-front='false'][data-swipe-out='false'][data-expanded='false'] {\n\t\t\t--y: translateY(40%);\n\t\t\topacity: 0;\n\t\t\ttransition:\n\t\t\t\ttransform 500ms,\n\t\t\t\topacity 200ms;\n\t\t}\n\n\t\t[data-sonner-toast][data-removed='true'][data-front='false']::before {\n\t\t\theight: calc(var(--initial-height) + 20%);\n\t\t}\n\n\t\t[data-sonner-toast][data-swiping='true'] {\n\t\t\ttransform: var(--y) translateY(var(--swipe-amount-y, 0px))\n\t\t\t\ttranslateX(var(--swipe-amount-x, 0px));\n\t\t\ttransition: none;\n\t\t}\n\n\t\t[data-sonner-toast][data-swiped='true'] {\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t[data-sonner-toast][data-swipe-out='true'][data-y-position='bottom'],\n\t\t[data-sonner-toast][data-swipe-out='true'][data-y-position='top'] {\n\t\t\tanimation-duration: 200ms;\n\t\t\tanimation-timing-function: ease-out;\n\t\t\tanimation-fill-mode: forwards;\n\t\t}\n\n\t\t[data-sonner-toast][data-swipe-out='true'][data-swipe-direction='left'] {\n\t\t\tanimation-name: swipe-out-left;\n\t\t}\n\n\t\t[data-sonner-toast][data-swipe-out='true'][data-swipe-direction='right'] {\n\t\t\tanimation-name: swipe-out-right;\n\t\t}\n\n\t\t[data-sonner-toast][data-swipe-out='true'][data-swipe-direction='up'] {\n\t\t\tanimation-name: swipe-out-up;\n\t\t}\n\n\t\t[data-sonner-toast][data-swipe-out='true'][data-swipe-direction='down'] {\n\t\t\tanimation-name: swipe-out-down;\n\t\t}\n\n\t\t@keyframes -global-swipe-out-left {\n\t\t\tfrom {\n\t\t\t\ttransform: var(--y) translateX(var(--swipe-amount-x));\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\tto {\n\t\t\t\ttransform: var(--y)\n\t\t\t\t\ttranslateX(calc(var(--swipe-amount-x) - 100%));\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\n\t\t@keyframes -global-swipe-out-right {\n\t\t\tfrom {\n\t\t\t\ttransform: var(--y) translateX(var(--swipe-amount-x));\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\tto {\n\t\t\t\ttransform: var(--y)\n\t\t\t\t\ttranslateX(calc(var(--swipe-amount-x) + 100%));\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\n\t\t@keyframes -global-swipe-out-up {\n\t\t\tfrom {\n\t\t\t\ttransform: var(--y) translateY(var(--swipe-amount-y));\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\tto {\n\t\t\t\ttransform: var(--y)\n\t\t\t\t\ttranslateY(calc(var(--swipe-amount-y) - 100%));\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\n\t\t@keyframes -global-swipe-out-down {\n\t\t\tfrom {\n\t\t\t\ttransform: var(--y) translateY(var(--swipe-amount-y));\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\tto {\n\t\t\t\ttransform: var(--y)\n\t\t\t\t\ttranslateY(calc(var(--swipe-amount-y) + 100%));\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\n\t\t@media (max-width: 600px) {\n\t\t\t[data-sonner-toaster] {\n\t\t\t\tposition: fixed;\n\t\t\t\tright: var(--mobile-offset-right);\n\t\t\t\tleft: var(--mobile-offset-left);\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t[data-sonner-toaster][dir='rtl'] {\n\t\t\t\tleft: calc(var(--mobile-offset-left) * -1);\n\t\t\t}\n\n\t\t\t[data-sonner-toaster] [data-sonner-toast] {\n\t\t\t\tleft: 0;\n\t\t\t\tright: 0;\n\t\t\t\twidth: calc(100% - var(--mobile-offset-left) * 2);\n\t\t\t}\n\n\t\t\t[data-sonner-toaster][data-x-position='left'] {\n\t\t\t\tleft: var(--mobile-offset-left);\n\t\t\t}\n\n\t\t\t[data-sonner-toaster][data-y-position='bottom'] {\n\t\t\t\tbottom: var(--mobile-offset-bottom);\n\t\t\t}\n\n\t\t\t[data-sonner-toaster][data-y-position='top'] {\n\t\t\t\ttop: var(--mobile-offset-top);\n\t\t\t}\n\n\t\t\t[data-sonner-toaster][data-x-position='center'] {\n\t\t\t\tleft: var(--mobile-offset-left);\n\t\t\t\tright: var(--mobile-offset-right);\n\t\t\t\ttransform: none;\n\t\t\t}\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='light'] {\n\t\t\t--normal-bg: #fff;\n\t\t\t--normal-border: var(--gray4);\n\t\t\t--normal-text: var(--gray12);\n\n\t\t\t--success-bg: hsl(143, 85%, 96%);\n\t\t\t--success-border: hsl(145, 92%, 87%);\n\t\t\t--success-text: hsl(140, 100%, 27%);\n\n\t\t\t--info-bg: hsl(208, 100%, 97%);\n\t\t\t--info-border: hsl(221, 91%, 93%);\n\t\t\t--info-text: hsl(210, 92%, 45%);\n\n\t\t\t--warning-bg: hsl(49, 100%, 97%);\n\t\t\t--warning-border: hsl(49, 91%, 84%);\n\t\t\t--warning-text: hsl(31, 92%, 45%);\n\n\t\t\t--error-bg: hsl(359, 100%, 97%);\n\t\t\t--error-border: hsl(359, 100%, 94%);\n\t\t\t--error-text: hsl(360, 100%, 45%);\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='light']\n\t\t\t[data-sonner-toast][data-invert='true'] {\n\t\t\t--normal-bg: #000;\n\t\t\t--normal-border: hsl(0, 0%, 20%);\n\t\t\t--normal-text: var(--gray1);\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='dark']\n\t\t\t[data-sonner-toast][data-invert='true'] {\n\t\t\t--normal-bg: #fff;\n\t\t\t--normal-border: var(--gray3);\n\t\t\t--normal-text: var(--gray12);\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='dark'] {\n\t\t\t--normal-bg: #000;\n\t\t\t--normal-bg-hover: hsl(0, 0%, 12%);\n\t\t\t--normal-border: hsl(0, 0%, 20%);\n\t\t\t--normal-border-hover: hsl(0, 0%, 25%);\n\t\t\t--normal-text: var(--gray1);\n\n\t\t\t--success-bg: hsl(150, 100%, 6%);\n\t\t\t--success-border: hsl(147, 100%, 12%);\n\t\t\t--success-text: hsl(150, 86%, 65%);\n\n\t\t\t--info-bg: hsl(215, 100%, 6%);\n\t\t\t--info-border: hsl(223, 43%, 17%);\n\t\t\t--info-text: hsl(216, 87%, 65%);\n\n\t\t\t--warning-bg: hsl(64, 100%, 6%);\n\t\t\t--warning-border: hsl(60, 100%, 9%);\n\t\t\t--warning-text: hsl(46, 87%, 65%);\n\n\t\t\t--error-bg: hsl(358, 76%, 10%);\n\t\t\t--error-border: hsl(357, 89%, 16%);\n\t\t\t--error-text: hsl(358, 100%, 81%);\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='dark']\n\t\t\t[data-sonner-toast][data-styled='true']\n\t\t\t[data-close-button] {\n\t\t\tbackground: var(--normal-bg);\n\t\t\tborder-color: var(--normal-border);\n\t\t\tcolor: var(--normal-text);\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='dark']\n\t\t\t[data-sonner-toast][data-styled='true']\n\t\t\t[data-close-button]:hover {\n\t\t\tbackground: var(--normal-bg-hover);\n\t\t\tborder-color: var(--normal-border-hover);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-type='success'] {\n\t\t\tbackground: var(--success-bg);\n\t\t\tborder-color: var(--success-border);\n\t\t\tcolor: var(--success-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-styled='true'][data-type='success']\n\t\t\t[data-close-button] {\n\t\t\tbackground: var(--success-bg);\n\t\t\tborder-color: var(--success-border);\n\t\t\tcolor: var(--success-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-type='info'] {\n\t\t\tbackground: var(--info-bg);\n\t\t\tborder-color: var(--info-border);\n\t\t\tcolor: var(--info-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-styled='true'][data-type='info']\n\t\t\t[data-close-button] {\n\t\t\tbackground: var(--info-bg);\n\t\t\tborder-color: var(--info-border);\n\t\t\tcolor: var(--info-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-type='warning'] {\n\t\t\tbackground: var(--warning-bg);\n\t\t\tborder-color: var(--warning-border);\n\t\t\tcolor: var(--warning-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-styled='true'][data-type='warning']\n\t\t\t[data-close-button] {\n\t\t\tbackground: var(--warning-bg);\n\t\t\tborder-color: var(--warning-border);\n\t\t\tcolor: var(--warning-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-type='error'] {\n\t\t\tbackground: var(--error-bg);\n\t\t\tborder-color: var(--error-border);\n\t\t\tcolor: var(--error-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-styled='true'][data-type='error']\n\t\t\t[data-close-button] {\n\t\t\tbackground: var(--error-bg);\n\t\t\tborder-color: var(--error-border);\n\t\t\tcolor: var(--error-text);\n\t\t}\n\n\t\t.sonner-loading-wrapper {\n\t\t\t--size: 16px;\n\t\t\theight: var(--size);\n\t\t\twidth: var(--size);\n\t\t\tposition: absolute;\n\t\t\tinset: 0;\n\t\t\tz-index: 10;\n\t\t}\n\n\t\t.sonner-loading-wrapper[data-visible='false'] {\n\t\t\ttransform-origin: center;\n\t\t\tanimation: sonner-fade-out 0.2s ease forwards;\n\t\t}\n\n\t\t.sonner-spinner {\n\t\t\tposition: relative;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\theight: var(--size);\n\t\t\twidth: var(--size);\n\t\t}\n\n\t\t.sonner-loading-bar {\n\t\t\tanimation: sonner-spin 1.2s linear infinite;\n\t\t\tbackground: var(--gray11);\n\t\t\tborder-radius: 6px;\n\t\t\theight: 8%;\n\t\t\tleft: -10%;\n\t\t\tposition: absolute;\n\t\t\ttop: -3.9%;\n\t\t\twidth: 24%;\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(1) {\n\t\t\tanimation-delay: -1.2s;\n\t\t\ttransform: rotate(0.0001deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(2) {\n\t\t\tanimation-delay: -1.1s;\n\t\t\ttransform: rotate(30deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(3) {\n\t\t\tanimation-delay: -1s;\n\t\t\ttransform: rotate(60deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(4) {\n\t\t\tanimation-delay: -0.9s;\n\t\t\ttransform: rotate(90deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(5) {\n\t\t\tanimation-delay: -0.8s;\n\t\t\ttransform: rotate(120deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(6) {\n\t\t\tanimation-delay: -0.7s;\n\t\t\ttransform: rotate(150deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(7) {\n\t\t\tanimation-delay: -0.6s;\n\t\t\ttransform: rotate(180deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(8) {\n\t\t\tanimation-delay: -0.5s;\n\t\t\ttransform: rotate(210deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(9) {\n\t\t\tanimation-delay: -0.4s;\n\t\t\ttransform: rotate(240deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(10) {\n\t\t\tanimation-delay: -0.3s;\n\t\t\ttransform: rotate(270deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(11) {\n\t\t\tanimation-delay: -0.2s;\n\t\t\ttransform: rotate(300deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(12) {\n\t\t\tanimation-delay: -0.1s;\n\t\t\ttransform: rotate(330deg) translate(146%);\n\t\t}\n\n\t\t@keyframes -global-sonner-fade-in {\n\t\t\t0% {\n\t\t\t\topacity: 0;\n\t\t\t\ttransform: scale(0.8);\n\t\t\t}\n\t\t\t100% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: scale(1);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes -global-sonner-fade-out {\n\t\t\t0% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: scale(1);\n\t\t\t}\n\t\t\t100% {\n\t\t\t\topacity: 0;\n\t\t\t\ttransform: scale(0.8);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes -global-sonner-spin {\n\t\t\t0% {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t\t100% {\n\t\t\t\topacity: 0.15;\n\t\t\t}\n\t\t}\n\n\t\t@media (prefers-reduced-motion) {\n\t\t\t[data-sonner-toast],\n\t\t\t[data-sonner-toast] > *,\n\t\t\t.sonner-loading-bar {\n\t\t\t\ttransition: none !important;\n\t\t\t\tanimation: none !important;\n\t\t\t}\n\t\t}\n\n\t\t.sonner-loader {\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\ttransform: translate(-50%, -50%);\n\t\t\ttransform-origin: center;\n\t\t\ttransition:\n\t\t\t\topacity 200ms,\n\t\t\t\ttransform 200ms;\n\t\t}\n\n\t\t.sonner-loader[data-visible='false'] {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.8) translate(-50%, -50%);\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { Badge } from '$lib/components/ui/badge';\n\timport type { Snippet } from 'svelte';\n\n\tinterface Props {\n\t\ticon: string;\n\t\ttitle: string;\n\t\tcount?: number | null;\n\t\tdefaultExpanded?: boolean;\n\t\tlazy?: boolean;\n\t\tonExpandChange?: (expanded: boolean) => void;\n\t\tchildren: Snippet;\n\t}\n\n\tlet {\n\t\ticon,\n\t\ttitle,\n\t\tcount = null,\n\t\tdefaultExpanded = false,\n\t\tlazy = false,\n\t\tonExpandChange,\n\t\tchildren\n\t}: Props = $props();\n\n\t// The prop is only the initial position; the accordion owns it afterwards.\n\t// svelte-ignore state_referenced_locally\n\tlet expanded = $state(defaultExpanded ?? false);\n\t// svelte-ignore state_referenced_locally\n\tlet hasBeenExpanded = $state(defaultExpanded ?? false);\n\n\tfunction toggle() {\n\t\texpanded = !expanded;\n\t\tif (expanded && !hasBeenExpanded) {\n\t\t\thasBeenExpanded = true;\n\t\t}\n\t\tonExpandChange?.(expanded);\n\t}\n\n\tconst shouldRender = $derived(lazy ? hasBeenExpanded : true);\n</script>\n\n<div class=\"accordion\" class:expanded>\n\t<button class=\"accordion-header\" onclick={toggle} type=\"button\">\n\t\t<iconify-icon {icon} class=\"header-icon\"></iconify-icon>\n\t\t<span class=\"accordion-title\">{title}</span>\n\t\t{#if count != null}\n\t\t\t<span class=\"count\">{count}</span>\n\t\t{/if}\n\t\t<iconify-icon\n\t\t\ticon={expanded ? 'mdi:chevron-down' : 'mdi:chevron-right'}\n\t\t\tclass=\"chevron\"\n\t\t></iconify-icon>\n\t</button>\n\n\t{#if expanded && shouldRender}\n\t\t<div class=\"accordion-content\">\n\t\t\t{@render children()}\n\t\t</div>\n\t{/if}\n</div>\n\n<style>\n\t.accordion {\n\t\tborder-top: 1px solid hsl(var(--border) / 0.5);\n\t}\n\n\t.accordion-header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\twidth: 100%;\n\t\tpadding: 5px 10px;\n\t\tborder: none;\n\t\tbackground: hsl(var(--muted) / 0.3);\n\t\tcolor: hsl(var(--muted-foreground));\n\t\tfont-family: inherit;\n\t\tfont-size: 11px;\n\t\tfont-weight: 500;\n\t\tcursor: pointer;\n\t\ttext-align: left;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.03em;\n\t}\n\n\t.accordion-header:hover {\n\t\tbackground: hsl(var(--muted) / 0.6);\n\t\tcolor: hsl(var(--foreground));\n\t}\n\n\t.accordion.expanded .accordion-header {\n\t\tcolor: hsl(var(--foreground));\n\t}\n\n\t.header-icon {\n\t\tfont-size: 13px;\n\t\topacity: 0.7;\n\t}\n\n\t.count {\n\t\tmargin-left: auto;\n\t\tfont-size: 10px;\n\t\tfont-weight: 600;\n\t\tcolor: hsl(var(--muted-foreground));\n\t\tmin-width: 14px;\n\t\ttext-align: center;\n\t}\n\n\t.accordion-title {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\n\t.chevron {\n\t\tfont-size: 14px;\n\t\topacity: 0.5;\n\t}\n\n\t.accordion-content {\n\t\tpadding: 6px 10px 8px 14px;\n\t\tborder-left: 2px solid hsl(var(--border) / 0.3);\n\t\tmargin-left: 10px;\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { Button } from '$lib/components/ui/button';\n\timport SidebarAccordion from './SidebarAccordion.svelte';\n\timport type { Screenshot } from '$lib/stores/sessions.svelte';\n\n\tinterface Props {\n\t\tsessionId: string;\n\t\tscreenshots: Screenshot[];\n\t}\n\n\tlet { sessionId, screenshots }: Props = $props();\n\n\tlet viewingScreenshot = $state<string | null>(null);\n\n\t// Swipe tracking\n\tlet touchStartX = $state(0);\n\tlet touchCurrentX = $state(0);\n\tlet isSwiping = $state(false);\n\n\tasync function dismissScreenshot(path: string) {\n\t\tawait fetch(`/api/sessions/${encodeURIComponent(sessionId)}/screenshots?path=${encodeURIComponent(path)}`, {\n\t\t\tmethod: 'DELETE'\n\t\t});\n\t\tif (viewingScreenshot === path) {\n\t\t\tviewingScreenshot = null;\n\t\t}\n\t}\n\n\tfunction openModal(path: string) {\n\t\tviewingScreenshot = path;\n\t}\n\n\tfunction closeModal() {\n\t\tviewingScreenshot = null;\n\t\tresetSwipe();\n\t}\n\n\tfunction getFilename(path: string): string {\n\t\treturn path.split('/').pop() || path;\n\t}\n\n\tfunction handleTouchStart(e: TouchEvent) {\n\t\ttouchStartX = e.touches[0].clientX;\n\t\ttouchCurrentX = touchStartX;\n\t\tisSwiping = true;\n\t}\n\n\tfunction handleTouchMove(e: TouchEvent) {\n\t\tif (!isSwiping) return;\n\t\ttouchCurrentX = e.touches[0].clientX;\n\t}\n\n\tfunction handleTouchEnd() {\n\t\tif (!isSwiping) return;\n\t\tconst deltaX = touchCurrentX - touchStartX;\n\t\tif (deltaX < -100) {\n\t\t\tcloseModal();\n\t\t}\n\t\tresetSwipe();\n\t}\n\n\tfunction resetSwipe() {\n\t\tisSwiping = false;\n\t\ttouchStartX = 0;\n\t\ttouchCurrentX = 0;\n\t}\n\n\tconst swipeOffset = $derived(isSwiping ? Math.min(0, touchCurrentX - touchStartX) : 0);\n</script>\n\n<SidebarAccordion\n\ticon=\"mdi:image-multiple\"\n\ttitle=\"Screenshots\"\n\tcount={screenshots.length}\n>\n\t{#if screenshots.length === 0}\n\t\t<p class=\"empty\">No screenshots</p>\n\t{:else}\n\t\t<div class=\"screenshots-grid\">\n\t\t\t{#each screenshots as screenshot, i (screenshot.path + ':' + i)}\n\t\t\t\t<div class=\"screenshot-item\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"thumbnail\"\n\t\t\t\t\t\tonclick={() => openModal(screenshot.path)}\n\t\t\t\t\t\ttitle={getFilename(screenshot.path)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc=\"/api/files/image?path={encodeURIComponent(screenshot.path)}\"\n\t\t\t\t\t\t\talt={getFilename(screenshot.path)}\n\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\tclass=\"dismiss-btn\"\n\t\t\t\t\t\tonclick={() => dismissScreenshot(screenshot.path)}\n\t\t\t\t\t\ttitle=\"Dismiss screenshot\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t{/each}\n\t\t</div>\n\t{/if}\n</SidebarAccordion>\n\n<!-- Fullscreen Modal -->\n{#if viewingScreenshot}\n\t<div\n\t\tclass=\"modal-overlay\"\n\t\tonclick={(e) => e.target === e.currentTarget && closeModal()}\n\t\tonkeydown={(e) => e.key === 'Escape' && closeModal()}\n\t\trole=\"dialog\"\n\t\taria-modal=\"true\"\n\t\ttabindex=\"-1\"\n\t>\n\t\t<div\n\t\t\tclass=\"modal-content\"\n\t\t\tstyle=\"transform: translateX({swipeOffset}px)\"\n\t\t\tontouchstart={handleTouchStart}\n\t\t\tontouchmove={handleTouchMove}\n\t\t\tontouchend={handleTouchEnd}\n\t\t\trole=\"document\"\n\t\t>\n\t\t\t<img\n\t\t\t\tsrc=\"/api/files/image?path={encodeURIComponent(viewingScreenshot)}\"\n\t\t\t\talt={getFilename(viewingScreenshot)}\n\t\t\t\tclass=\"modal-image\"\n\t\t\t/>\n\n\t\t\t<div class=\"modal-actions\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonclick={(e) => e.target === e.currentTarget && closeModal()}\n\t\t\t\t\tclass=\"modal-btn\"\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t\t\t\t<span>Close</span>\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonclick={() => dismissScreenshot(viewingScreenshot!)}\n\t\t\t\t\tclass=\"modal-btn\"\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon=\"mdi:delete\"></iconify-icon>\n\t\t\t\t\t<span>Delete</span>\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t<div class=\"swipe-hint\">\n\t\t\t\t<iconify-icon icon=\"mdi:gesture-swipe-left\"></iconify-icon>\n\t\t\t\t<span>Swipe left to close</span>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n{/if}\n\n<style>\n\t.screenshots-grid {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(2, 1fr);\n\t\tgap: 4px;\n\t}\n\n\t.screenshot-item {\n\t\tposition: relative;\n\t\taspect-ratio: 16 / 10;\n\t\tborder-radius: 4px;\n\t\toverflow: hidden;\n\t\tbackground: hsl(var(--muted));\n\t}\n\n\t.thumbnail {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcursor: pointer;\n\t}\n\n\t.thumbnail img {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tobject-fit: cover;\n\t}\n\n\t.thumbnail:hover {\n\t\topacity: 0.9;\n\t}\n\n\t.screenshot-item :global(.dismiss-btn) {\n\t\tposition: absolute;\n\t\ttop: 4px;\n\t\tright: 4px;\n\t\twidth: 24px;\n\t\theight: 24px;\n\t\tbackground: hsl(var(--background) / 0.8);\n\t\tborder-radius: 4px;\n\t\topacity: 0;\n\t\ttransition: opacity 0.15s;\n\t}\n\n\t.screenshot-item:hover :global(.dismiss-btn) {\n\t\topacity: 1;\n\t}\n\n\t.screenshot-item :global(.dismiss-btn:hover) {\n\t\tbackground: hsl(var(--destructive));\n\t\tcolor: hsl(var(--destructive-foreground));\n\t}\n\n\t.empty {\n\t\tcolor: hsl(var(--muted-foreground));\n\t\tfont-size: 11px;\n\t\tmargin: 0;\n\t}\n\n\t/* Modal styles */\n\t.modal-overlay {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tz-index: var(--z-modal);\n\t\tbackground: rgba(0, 0, 0, 0.9);\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpadding: 16px;\n\t}\n\n\t.modal-content {\n\t\tposition: relative;\n\t\tmax-width: 100%;\n\t\tmax-height: 100%;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: 16px;\n\t\ttransition: transform 0.1s ease-out;\n\t}\n\n\t.modal-image {\n\t\tmax-width: 100%;\n\t\tmax-height: calc(100vh - 120px);\n\t\tobject-fit: contain;\n\t\tborder-radius: 8px;\n\t\tbox-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);\n\t}\n\n\t.modal-actions {\n\t\tdisplay: flex;\n\t\tgap: 12px;\n\t}\n\n\t.modal-actions :global(.modal-btn) {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t}\n\n\t.swipe-hint {\n\t\tdisplay: none;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\tcolor: hsl(var(--muted-foreground));\n\t\tfont-size: 12px;\n\t}\n\n\t@media (max-width: 768px) {\n\t\t.swipe-hint {\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n</style>\n","/**\n * The browser's side of session alerts: the favicon badge and the two sounds.\n * Adapted from t3code's threadNotifications.ts (MIT, © T3 Tools Inc.).\n */\n\n/** How the browser alerts: system notifications, a sound, both, or neither. */\nexport type NotificationMode = 'off' | 'notifications' | 'sound' | 'both';\n\nexport function hasDesktopNotifications(mode: NotificationMode): boolean {\n\treturn mode === 'notifications' || mode === 'both';\n}\n\nexport function hasNotificationSound(mode: NotificationMode): boolean {\n\treturn mode === 'sound' || mode === 'both';\n}\n\nlet originalFavicon: HTMLLinkElement | undefined;\nlet badgeFavicon: HTMLLinkElement | undefined;\n/** Badge images by label; there are only ten (\"1\"-\"9\" and \"9+\"). */\nconst badges = new Map<string, string>();\n\nfunction badgeImage(label: string): string | null {\n\tconst cached = badges.get(label);\n\tif (cached) return cached;\n\tconst canvas = document.createElement('canvas');\n\tcanvas.width = canvas.height = 64;\n\tconst context = canvas.getContext('2d');\n\tif (!context) return null;\n\tcontext.fillStyle = '#e5484d';\n\tcontext.beginPath();\n\tcontext.arc(32, 32, 30, 0, Math.PI * 2);\n\tcontext.fill();\n\tcontext.fillStyle = 'white';\n\tcontext.font = `700 ${label.length > 1 ? 32 : 42}px system-ui, sans-serif`;\n\tcontext.textAlign = 'center';\n\tcontext.textBaseline = 'middle';\n\tcontext.fillText(label, 32, 35);\n\tconst url = canvas.toDataURL('image/png');\n\tbadges.set(label, url);\n\treturn url;\n}\n\n/** Swap the favicon for a red count while any session needs someone, and put it back after. */\nexport function setFaviconBadge(count: number): void {\n\tif (count <= 0) {\n\t\tif (!badgeFavicon) return;\n\t\tbadgeFavicon.remove();\n\t\tbadgeFavicon = undefined;\n\t\tif (originalFavicon) document.head.append(originalFavicon);\n\t\toriginalFavicon = undefined;\n\t\treturn;\n\t}\n\tconst image = badgeImage(count > 9 ? '9+' : String(count));\n\tif (!image) return;\n\tif (!badgeFavicon) {\n\t\toriginalFavicon = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]') ?? undefined;\n\t\toriginalFavicon?.remove();\n\t\tbadgeFavicon = document.createElement('link');\n\t\tbadgeFavicon.rel = 'icon';\n\t\tbadgeFavicon.type = 'image/png';\n\t\tdocument.head.append(badgeFavicon);\n\t}\n\tbadgeFavicon.href = image;\n}\n\nlet audio: AudioContext | undefined;\n\n/**\n * Browsers only let a page make sound after someone has interacted with it,\n * so this runs on the first gesture; later alerts reuse the running context.\n */\nexport function unlockNotificationAudio(): void {\n\tif (typeof AudioContext === 'undefined') return;\n\taudio ??= new AudioContext();\n\tif (audio.state === 'running') return;\n\tvoid audio.resume().catch(() => {});\n}\n\n/**\n * The sounds are synthesised rather than shipped, so there is no asset or\n * licence to carry: a rising two-note chime for a finished turn, and a pair\n * of brighter, repeated pings for a session that is waiting on someone.\n */\nconst TONES: Record<'completion' | 'needs-you', Array<[freq: number, at: number]>> = {\n\tcompletion: [\n\t\t[659.25, 0],\n\t\t[987.77, 0.12]\n\t],\n\t'needs-you': [\n\t\t[880, 0],\n\t\t[1174.66, 0.1],\n\t\t[880, 0.32],\n\t\t[1174.66, 0.42]\n\t]\n};\n\nexport function playNotificationSound(kind: 'completion' | 'needs-you'): void {\n\tif (!audio || audio.state !== 'running') return;\n\tconst now = audio.currentTime;\n\tfor (const [freq, at] of TONES[kind]) {\n\t\tconst osc = audio.createOscillator();\n\t\tconst gain = audio.createGain();\n\t\tosc.type = 'sine';\n\t\tosc.frequency.value = freq;\n\t\tgain.gain.setValueAtTime(0, now + at);\n\t\tgain.gain.linearRampToValueAtTime(0.18, now + at + 0.01);\n\t\tgain.gain.exponentialRampToValueAtTime(0.001, now + at + 0.35);\n\t\tosc.connect(gain).connect(audio.destination);\n\t\tosc.start(now + at);\n\t\tosc.stop(now + at + 0.4);\n\t}\n}\n","/**\n * This device's Web Push subscription, as the browser and the server each\n * hold it. The browser's PushManager owns the subscription itself; the server\n * keeps the events it should carry.\n */\nimport type { PushEvents } from '$shared/db/index.js';\n\nexport type { PushEvents };\n\n/** Why push cannot work here, or null when it can. */\nexport function pushUnavailable(): string | null {\n\tif (!window.isSecureContext) return 'Push needs HTTPS. Open claude-mux through tailscale serve.';\n\tconst ios = /iPhone|iPad|iPod/.test(navigator.userAgent);\n\tconst standalone = window.matchMedia('(display-mode: standalone)').matches;\n\tif (ios && !standalone) return 'On iPhone and iPad, add claude-mux to the Home Screen (Share → Add to Home Screen) and open it from there.';\n\tif (!('serviceWorker' in navigator) || !('PushManager' in window) || typeof Notification === 'undefined') {\n\t\treturn 'This browser has no Web Push.';\n\t}\n\treturn null;\n}\n\n/**\n * The running service worker. SvelteKit registers it on load and `ready`\n * waits for that, forever if registration failed, so it gets a deadline.\n */\nfunction worker(): Promise<ServiceWorkerRegistration> {\n\treturn Promise.race([\n\t\tnavigator.serviceWorker.ready,\n\t\tnew Promise<never>((_, reject) =>\n\t\t\tsetTimeout(() => reject(new Error('The service worker did not start. Reload the page and try again.')), 10_000)\n\t\t)\n\t]);\n}\n\n/** The browser's subscription for this device, if it has one. */\nexport async function currentSubscription(): Promise<PushSubscription | null> {\n\treturn (await worker()).pushManager.getSubscription();\n}\n\n/** The events the server sends this device, or null when the server does not know it. */\nexport async function serverEvents(subscription: PushSubscription): Promise<PushEvents | null> {\n\tconst res = await fetch(`/api/push/subscription?endpoint=${encodeURIComponent(subscription.endpoint)}`);\n\tif (!res.ok) return null;\n\treturn ((await res.json()) as { events: PushEvents }).events;\n}\n\nfunction toKey(base64url: string): Uint8Array<ArrayBuffer> {\n\tconst base64 = (base64url + '='.repeat((4 - (base64url.length % 4)) % 4)).replace(/-/g, '+').replace(/_/g, '/');\n\treturn Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));\n}\n\n/** Call a push route with a JSON body; rejects with the server's own error when it refuses. */\nasync function api<T>(path: string, method = 'GET', body?: unknown): Promise<T> {\n\tconst res = await fetch(path, {\n\t\tmethod,\n\t\theaders: body === undefined ? undefined : { 'Content-Type': 'application/json' },\n\t\tbody: body === undefined ? undefined : JSON.stringify(body)\n\t});\n\tconst data = (await res.json().catch(() => null)) as (T & { error?: string }) | null;\n\tif (!res.ok) throw new Error(data?.error ?? `The server answered ${res.status}`);\n\treturn data as T;\n}\n\n/** Tell the server about the subscription, or which events it now takes. */\nexport async function saveEvents(subscription: PushSubscription, events: PushEvents): Promise<PushEvents> {\n\treturn (await api<{ events: PushEvents }>('/api/push/subscription', 'POST', { ...subscription.toJSON(), events })).events;\n}\n\n/**\n * Ask for permission, subscribe with the server's key and register the\n * device. A subscription made under another key (the server's keys were\n * remade) is replaced, since the server could never reach it.\n */\nexport async function subscribe(events: PushEvents): Promise<PushSubscription> {\n\t// The key is fetched while the permission prompt is up; neither waits on the other.\n\tconst vapid = api<{ publicKey: string }>('/api/push');\n\tvapid.catch(() => {});\n\tif ((await Notification.requestPermission()) !== 'granted') {\n\t\tthrow new Error('Notifications are blocked. Allow them in the browser’s site settings, then try again.');\n\t}\n\tconst key = toKey((await vapid).publicKey);\n\tconst manager = (await worker()).pushManager;\n\tlet subscription = await manager.getSubscription();\n\tconst bound = subscription?.options.applicationServerKey;\n\tif (subscription && (!bound || !sameBytes(new Uint8Array(bound), key))) {\n\t\tawait subscription.unsubscribe();\n\t\tsubscription = null;\n\t}\n\tsubscription ??= await manager.subscribe({ userVisibleOnly: true, applicationServerKey: key });\n\tawait saveEvents(subscription, events);\n\treturn subscription;\n}\n\nfunction sameBytes(a: Uint8Array, b: Uint8Array): boolean {\n\treturn a.length === b.length && a.every((v, i) => v === b[i]);\n}\n\nexport async function unsubscribe(subscription: PushSubscription): Promise<void> {\n\tawait api('/api/push/subscription', 'DELETE', { endpoint: subscription.endpoint }).catch(() => {});\n\tawait subscription.unsubscribe();\n}\n\nexport async function sendTestPush(subscription: PushSubscription): Promise<void> {\n\tawait api('/api/push/test', 'POST', { endpoint: subscription.endpoint });\n}\n","<script lang=\"ts\">\n\timport { sessionStore } from '$lib/stores/sessions.svelte';\n\timport { usageStore } from '$lib/stores/usage.svelte';\n\timport { preferences } from '$lib/stores/preferences.svelte';\n\timport { wakeLockSupported } from '$lib/wakeLock.svelte';\n\timport { hostTimeZone, makeDayFormatter, money } from '$lib/format';\n\timport { SEVERITY, severityForPercent } from '$lib/severity';\n\timport {\n\t\thasDesktopNotifications,\n\t\thasNotificationSound,\n\t\tunlockNotificationAudio,\n\t\ttype NotificationMode\n\t} from '$lib/notifications';\n\timport {\n\t\tcurrentSubscription,\n\t\tpushUnavailable,\n\t\tsaveEvents,\n\t\tsendTestPush,\n\t\tserverEvents,\n\t\tsubscribe,\n\t\tunsubscribe,\n\t\ttype PushEvents\n\t} from '$lib/push';\n\n\tconst SPARK_DAYS = 14;\n\t/** Why the plan columns are missing, for the one place there is room to say it. */\n\tconst PLAN_UNAVAILABLE = 'Plan limits unavailable — open Usage for the reason.';\n\tconst SERIES = '#3987e5';\n\n\t// The store owns the polling, so the sidebar and the composer's key share\n\t// one pair of requests rather than each running their own timer.\n\t$effect(() => usageStore.subscribe());\n\n\tconst dayOf = makeDayFormatter(hostTimeZone());\n\tconst supported = wakeLockSupported();\n\n\tconst summary = $derived(usageStore.summary);\n\tconst quota = $derived(usageStore.quota);\n\tconst today = $derived(usageStore.today);\n\tconst stats = $derived(sessionStore.systemStats);\n\n\tinterface Meter {\n\t\tkey: string;\n\t\t/** Two or three characters — the column is only as wide as its bar. */\n\t\ttag: string;\n\t\tpercent: number;\n\t\tcolor: string;\n\t\ttitle: string;\n\t}\n\n\t/** Labels share a length so the columns can share a width. */\n\tfunction shortLabel(label: string): string {\n\t\tconst text = label.toLowerCase();\n\t\tif (text.includes('session')) return '5h';\n\t\tconst model = text.match(/(opus|sonnet|haiku|fable|mythos)/)?.[1];\n\t\tif (model) return model.slice(0, 3);\n\t\tif (text.includes('week')) return 'wk';\n\t\treturn text.replace(/\\s*limit$/, '').split(/\\s+/)[0];\n\t}\n\n\tconst meters = $derived.by(() => {\n\t\tconst out: Meter[] = [];\n\t\tfor (const limit of quota?.available ? quota.limits : []) {\n\t\t\tout.push({\n\t\t\t\tkey: limit.kind,\n\t\t\t\ttag: shortLabel(limit.label),\n\t\t\t\tpercent: limit.percent,\n\t\t\t\t// The server grades plan limits itself, and the sidebar shows that\n\t\t\t\t// grade — recomputing here is how the two start disagreeing.\n\t\t\t\tcolor: SEVERITY[limit.severity].color,\n\t\t\t\ttitle: `${limit.label}: ${Math.round(limit.percent)}%`\n\t\t\t});\n\t\t}\n\t\tconst system: Array<[string, string, number]> = [\n\t\t\t['cpu', 'cpu', stats.cpu],\n\t\t\t['ram', 'ram', stats.ram]\n\t\t];\n\t\tif (stats.swapTotal > 0) system.push(['swap', 'swp', stats.swap]);\n\t\tfor (const [key, tag, percent] of system) {\n\t\t\tout.push({\n\t\t\t\tkey,\n\t\t\t\ttag,\n\t\t\t\tpercent,\n\t\t\t\tcolor: SEVERITY[severityForPercent(percent)].color,\n\t\t\t\ttitle: `${tag.toUpperCase()}: ${Math.round(percent)}%`\n\t\t\t});\n\t\t}\n\t\treturn out;\n\t});\n\n\tfunction dayKey(offset: number): string {\n\t\treturn dayOf(Date.now() - offset * 86_400_000);\n\t}\n\n\t/** Last two weeks, oldest first, gaps included so the rhythm stays honest. */\n\tconst spark = $derived.by(() => {\n\t\tif (!summary) return [] as Array<{ date: string; cost: number }>;\n\t\tconst byDate = new Map(summary.days.map((d) => [d.date, d.costUsd]));\n\t\tconst out: Array<{ date: string; cost: number }> = [];\n\t\tfor (let i = SPARK_DAYS - 1; i >= 0; i--) {\n\t\t\tconst date = dayKey(i);\n\t\t\tout.push({ date, cost: byDate.get(date) ?? 0 });\n\t\t}\n\t\treturn out;\n\t});\n\n\tconst peak = $derived(Math.max(1e-9, ...spark.map((d) => d.cost)));\n\n\tconst MODES: Array<{ value: NotificationMode; label: string; title: string }> = [\n\t\t{ value: 'off', label: 'Off', title: 'No system notifications or sounds' },\n\t\t{ value: 'notifications', label: 'Notify', title: 'System notifications while this window is in the background' },\n\t\t{ value: 'sound', label: 'Sound', title: 'A sound when a session needs you or finishes' },\n\t\t{ value: 'both', label: 'Both', title: 'System notifications and sounds' }\n\t];\n\n\t/** Why the last choice did not take, shown under the control. */\n\tlet alertProblem = $state<string | null>(null);\n\t// A permission revoked since the choice was made silences the alerts, so say so.\n\t$effect(() => {\n\t\tif (\n\t\t\thasDesktopNotifications(preferences.notificationMode) &&\n\t\t\ttypeof Notification !== 'undefined' &&\n\t\t\tNotification.permission !== 'granted'\n\t\t)\n\t\t\talertProblem = 'Notifications are blocked. Allow them in the browser’s site settings, then choose again.';\n\t});\n\tlet requesting = $state(false);\n\n\tasync function chooseMode(value: NotificationMode): Promise<void> {\n\t\talertProblem = null;\n\t\tif (hasNotificationSound(value)) unlockNotificationAudio();\n\t\tif (hasDesktopNotifications(value)) {\n\t\t\tif (!window.isSecureContext) {\n\t\t\t\talertProblem =\n\t\t\t\t\t'System notifications need HTTPS. Open claude-mux through tailscale serve; sound works either way.';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (typeof Notification === 'undefined') {\n\t\t\t\talertProblem = 'This browser has no system notifications. Sound works either way.';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\trequesting = true;\n\t\t\ttry {\n\t\t\t\tif ((await Notification.requestPermission()) !== 'granted') {\n\t\t\t\t\talertProblem = 'Notifications are blocked. Allow them in the browser’s site settings, then choose again.';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\talertProblem = 'This browser refused to show notifications. Sound works either way.';\n\t\t\t\treturn;\n\t\t\t} finally {\n\t\t\t\trequesting = false;\n\t\t\t}\n\t\t}\n\t\tpreferences.notificationMode = value;\n\t}\n\n\t// Web Push reaches this device with every claude-mux tab closed. The\n\t// browser holds the subscription; the server holds which events it takes.\n\tlet pushSub = $state<PushSubscription | null>(null);\n\tlet pushEvents = $state<PushEvents>({ needsYou: true, done: true });\n\tlet pushBusy = $state(false);\n\t/** What the last push action said: a problem, or that the test went out. */\n\tlet pushNote = $state<{ text: string; problem: boolean } | null>(null);\n\tconst pushBlocked = typeof window === 'undefined' ? null : pushUnavailable();\n\n\t$effect(() => {\n\t\tif (pushBlocked) return;\n\t\tvoid (async () => {\n\t\t\tconst sub = await currentSubscription();\n\t\t\t// A subscription the server forgot (its push service said the device\n\t\t\t// was gone, or the file was cleared) cannot be reached, so it counts as off.\n\t\t\tconst events = sub ? await serverEvents(sub) : null;\n\t\t\tpushSub = events ? sub : null;\n\t\t\tif (events) pushEvents = events;\n\t\t})().catch(() => {});\n\t});\n\n\tasync function pushAction(run: () => Promise<string | void>): Promise<void> {\n\t\tpushBusy = true;\n\t\tpushNote = null;\n\t\ttry {\n\t\t\tconst done = await run();\n\t\t\tif (done) pushNote = { text: done, problem: false };\n\t\t} catch (err) {\n\t\t\tpushNote = { text: err instanceof Error ? err.message : String(err), problem: true };\n\t\t} finally {\n\t\t\tpushBusy = false;\n\t\t}\n\t}\n\n\tfunction setPush(on: boolean): Promise<void> {\n\t\treturn pushAction(async () => {\n\t\t\tif (on && !pushSub) pushSub = await subscribe(pushEvents);\n\t\t\telse if (!on && pushSub) {\n\t\t\t\tawait unsubscribe(pushSub);\n\t\t\t\tpushSub = null;\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction setPushEvent(key: keyof PushEvents, value: boolean): Promise<void> {\n\t\tconst sub = pushSub;\n\t\tif (!sub) return Promise.resolve();\n\t\treturn pushAction(async () => {\n\t\t\tpushEvents = await saveEvents(sub, { ...pushEvents, [key]: value });\n\t\t});\n\t}\n\n\tfunction testPush(): Promise<void> {\n\t\tconst sub = pushSub;\n\t\tif (!sub) return Promise.resolve();\n\t\treturn pushAction(async () => {\n\t\t\tawait sendTestPush(sub);\n\t\t\treturn 'Sent. It should arrive in a few seconds.';\n\t\t});\n\t}\n</script>\n\n<!--\n\tEvery sidebar number is a share of something, so every one of them is the\n\tsame column: a reading on top, a bar that fills upwards, a label under it.\n\tStanding them side by side costs one row of height for the whole set, where\n\ta stack of horizontal meters spent a row on each.\n-->\n<div class=\"sidebar-meters\">\n\t<a class=\"strip\" href=\"/usage\" title={quota && !quota.available ? PLAN_UNAVAILABLE : undefined}>\n\t\t{#if meters.length > 0}\n\t\t\t<span class=\"group\">\n\t\t\t\t{#each meters as meter (meter.key)}\n\t\t\t\t\t<span class=\"col\" title={meter.title}>\n\t\t\t\t\t\t<span class=\"val\" style=\"color: {meter.color}\">{Math.round(meter.percent)}%</span>\n\t\t\t\t\t\t<span class=\"track\" role=\"img\" aria-label={meter.title}>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"fill\"\n\t\t\t\t\t\t\t\tstyle=\"height: {Math.min(100, Math.max(0, meter.percent))}%; background: {meter.color}\"\n\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"tag\">{meter.tag}</span>\n\t\t\t\t\t</span>\n\t\t\t\t{/each}\n\t\t\t</span>\n\t\t{/if}\n\n\t\t{#if spark.length > 0}\n\t\t\t<span class=\"group spark\">\n\t\t\t\t<!-- The two figures frame the fortnight they are drawn from: today at\n\t\t\t\t the left, where the reading starts, the whole month's total at the\n\t\t\t\t right. The thirteen days between them stay a shape — fourteen\n\t\t\t\t numbers at this size would be a smear. -->\n\t\t\t\t<span class=\"line\">\n\t\t\t\t\t<span class=\"val spend\">{today === null ? '—' : money(today, true)}</span>\n\t\t\t\t\t<span class=\"val spend\">{summary === null ? '—' : money(summary.costUsd, true)}</span>\n\t\t\t\t</span>\n\t\t\t\t<span class=\"ticks\" aria-hidden=\"true\">\n\t\t\t\t\t{#each spark as day (day.date)}\n\t\t\t\t\t\t<span class=\"track\" title=\"{day.date}: {money(day.cost, true)}\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"fill\"\n\t\t\t\t\t\t\t\tstyle=\"height: {Math.max(3, (day.cost / peak) * 100)}%; background: {SERIES}\"\n\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t{/each}\n\t\t\t\t</span>\n\t\t\t\t<span class=\"line\">\n\t\t\t\t\t<span class=\"tag\">today</span>\n\t\t\t\t\t<span class=\"tag\">30d</span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t{/if}\n\t</a>\n\n\t<div class=\"alerts-row\">\n\t\t<span class=\"alerts-label\" id=\"alerts-label\">Alerts</span>\n\t\t<div class=\"segmented\" role=\"radiogroup\" aria-labelledby=\"alerts-label\">\n\t\t\t{#each MODES as m (m.value)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"radio\"\n\t\t\t\t\taria-checked={preferences.notificationMode === m.value}\n\t\t\t\t\tclass:on={preferences.notificationMode === m.value}\n\t\t\t\t\ttitle={m.title}\n\t\t\t\t\tdisabled={requesting}\n\t\t\t\t\tonclick={() => chooseMode(m.value)}\n\t\t\t\t>\n\t\t\t\t\t{m.label}\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t</div>\n\t</div>\n\t{#if alertProblem}\n\t\t<p class=\"alerts-problem\" role=\"status\">{alertProblem}</p>\n\t{/if}\n\n\t<div class=\"alerts-row\">\n\t\t<span\n\t\t\tclass=\"alerts-label\"\n\t\t\tid=\"push-label\"\n\t\t\ttitle=\"Notifications on this device with claude-mux closed, sent by the server\"\n\t\t>\n\t\t\tPush\n\t\t</span>\n\t\t<div class=\"segmented\" role=\"radiogroup\" aria-labelledby=\"push-label\">\n\t\t\t{#each [false, true] as on (on)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"radio\"\n\t\t\t\t\taria-checked={!!pushSub === on}\n\t\t\t\t\tclass:on={!!pushSub === on}\n\t\t\t\t\tdisabled={pushBusy || !!pushBlocked}\n\t\t\t\t\tonclick={() => setPush(on)}\n\t\t\t\t>\n\t\t\t\t\t{on ? 'This device' : 'Off'}\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t</div>\n\t</div>\n\t{#if pushBlocked}\n\t\t<p class=\"alerts-note\">{pushBlocked}</p>\n\t{:else if pushSub}\n\t\t<div class=\"toggles\">\n\t\t\t<label class=\"toggle-row\" title=\"A session asks a question or wants an approval\">\n\t\t\t\t<input\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tchecked={pushEvents.needsYou}\n\t\t\t\t\tdisabled={pushBusy}\n\t\t\t\t\tonchange={(e) => setPushEvent('needsYou', e.currentTarget.checked)}\n\t\t\t\t/>\n\t\t\t\t<span>Needs you</span>\n\t\t\t</label>\n\t\t\t<label class=\"toggle-row\" title=\"A session finished its turn\">\n\t\t\t\t<input\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tchecked={pushEvents.done}\n\t\t\t\t\tdisabled={pushBusy}\n\t\t\t\t\tonchange={(e) => setPushEvent('done', e.currentTarget.checked)}\n\t\t\t\t/>\n\t\t\t\t<span>Done</span>\n\t\t\t</label>\n\t\t\t<button type=\"button\" class=\"link-button\" disabled={pushBusy} onclick={testPush}>Send a test</button>\n\t\t</div>\n\t{/if}\n\t{#if pushNote}\n\t\t<p class={pushNote.problem ? 'alerts-problem' : 'alerts-note'} role=\"status\">{pushNote.text}</p>\n\t{/if}\n\n\t<div class=\"toggles\">\n\t\t<label class=\"toggle-row\" title=\"A toast in this page when another session needs you or finishes\">\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tchecked={preferences.inAppToasts}\n\t\t\t\tonchange={(e) => (preferences.inAppToasts = e.currentTarget.checked)}\n\t\t\t/>\n\t\t\t<span>In-page toasts</span>\n\t\t</label>\n\t\t{#if supported}\n\t\t\t<label class=\"toggle-row\">\n\t\t\t\t<input\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tchecked={preferences.keepAwake}\n\t\t\t\t\tonchange={(e) => (preferences.keepAwake = e.currentTarget.checked)}\n\t\t\t\t/>\n\t\t\t\t<span>Keep screen on</span>\n\t\t\t</label>\n\t\t{/if}\n\t</div>\n</div>\n\n<style>\n\t.sidebar-meters {\n\t\tpadding: 8px 12px;\n\t\tborder-top: 1px solid hsl(var(--border));\n\t\tbackground: hsl(var(--background));\n\t}\n\n\t.strip {\n\t\tdisplay: flex;\n\t\talign-items: flex-end;\n\t\tflex-wrap: wrap;\n\t\tgap: 6px 10px;\n\t\ttext-decoration: none;\n\t\tcolor: inherit;\n\t\tmargin: -4px -6px;\n\t\tpadding: 4px 6px;\n\t\tborder-radius: 6px;\n\t}\n\n\t.strip:hover {\n\t\tbackground: rgba(255, 255, 255, 0.03);\n\t}\n\n\t.group {\n\t\tdisplay: flex;\n\t\talign-items: flex-end;\n\t\tgap: 3px;\n\t\tmin-width: 0;\n\t}\n\n\t/* The spend history is the one group that can give up width: its bars are a\n\t shape, not a set of readings, so squeezing them loses nothing. */\n\t.spark {\n\t\tflex: 1 1 auto;\n\t\t/* Never narrower than the two figures it carries, and no wider a floor\n\t\t than that — one pixel more and the strip wraps at the default width. */\n\t\tmin-width: 96px;\n\t\tflex-direction: column;\n\t\talign-items: stretch;\n\t\tgap: 3px;\n\t}\n\n\t.ticks {\n\t\tdisplay: flex;\n\t\talign-items: flex-end;\n\t\tgap: 1px;\n\t\theight: 26px;\n\t}\n\n\t/* Spend has no ceiling, so its columns get no track: a groove behind them\n\t would promise a full mark that does not exist. */\n\t.ticks .track {\n\t\tflex: 1 1 0;\n\t\tmin-width: 2px;\n\t\tbackground: transparent;\n\t}\n\n\t.col {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: 3px;\n\t\t/* Wide enough for the widest thing above it — \"100%\" — so neither the\n\t\t readings nor the tags lean into their neighbours'. */\n\t\tmin-width: 21px;\n\t}\n\n\t.val {\n\t\tfont-size: 9px;\n\t\tline-height: 1;\n\t\tfont-weight: 600;\n\t\tfont-variant-numeric: tabular-nums;\n\t\twhite-space: nowrap;\n\t}\n\n\t.val.spend {\n\t\tfont-size: 11px;\n\t\tcolor: hsl(var(--foreground));\n\t}\n\n\t/* The figure and the label at each end of the sparkline. */\n\t.line {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: baseline;\n\t\tgap: 8px;\n\t}\n\n\t.track {\n\t\tposition: relative;\n\t\tdisplay: block;\n\t\twidth: 7px;\n\t\theight: 26px;\n\t\tborder-radius: 2px;\n\t\tbackground: rgba(255, 255, 255, 0.08);\n\t\toverflow: hidden;\n\t}\n\n\t.fill {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\tborder-radius: 2px;\n\t\ttransition: height 600ms ease;\n\t}\n\n\t.tag {\n\t\tfont-size: 9px;\n\t\tline-height: 1;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.04em;\n\t\tcolor: #a8a29e;\n\t\twhite-space: nowrap;\n\t}\n\n\t.alerts-row {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tgap: 8px;\n\t\tmargin-top: 8px;\n\t\tfont-size: 11px;\n\t\tcolor: hsl(var(--muted-foreground));\n\t}\n\n\t/* Four choices of one setting, so one control rather than four checkboxes. */\n\t.segmented {\n\t\tdisplay: inline-flex;\n\t\tpadding: 2px;\n\t\tgap: 2px;\n\t\tborder-radius: 7px;\n\t\tbackground: rgba(255, 255, 255, 0.04);\n\t\tborder: 1px solid #2a2a2c;\n\t}\n\n\t.segmented button {\n\t\tborder: 0;\n\t\tbackground: transparent;\n\t\tcolor: inherit;\n\t\tfont: inherit;\n\t\tfont-size: 11px;\n\t\tline-height: 1;\n\t\tpadding: 4px 7px;\n\t\tborder-radius: 5px;\n\t\tcursor: pointer;\n\t}\n\n\t.segmented button:hover:not(.on) {\n\t\tcolor: hsl(var(--foreground));\n\t}\n\n\t.segmented button.on {\n\t\tbackground: rgba(255, 255, 255, 0.1);\n\t\tcolor: hsl(var(--foreground));\n\t}\n\n\t.segmented button:focus-visible {\n\t\toutline: 1px solid #818cf8;\n\t\toutline-offset: 1px;\n\t}\n\n\t.segmented button:disabled {\n\t\tcursor: progress;\n\t}\n\n\t.alerts-problem {\n\t\tmargin: 6px 0 0;\n\t\tfont-size: 11px;\n\t\tline-height: 1.35;\n\t\tcolor: #fbbf24;\n\t}\n\n\t.alerts-note {\n\t\tmargin: 6px 0 0;\n\t\tfont-size: 11px;\n\t\tline-height: 1.35;\n\t\tcolor: hsl(var(--muted-foreground));\n\t}\n\n\t.link-button {\n\t\tmargin-left: auto;\n\t\tborder: 0;\n\t\tpadding: 0;\n\t\tbackground: none;\n\t\tfont: inherit;\n\t\tfont-size: 11px;\n\t\tcolor: hsl(var(--muted-foreground));\n\t\ttext-decoration: underline;\n\t\ttext-underline-offset: 2px;\n\t\tcursor: pointer;\n\t}\n\n\t.link-button:hover:not(:disabled) {\n\t\tcolor: hsl(var(--foreground));\n\t}\n\n\t.link-button:disabled {\n\t\tcursor: progress;\n\t}\n\n\t.toggles {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 4px 14px;\n\t\tmargin-top: 6px;\n\t}\n\n\t.toggle-row {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\tfont-size: 11px;\n\t\tcolor: hsl(var(--muted-foreground));\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t}\n\n\t.toggle-row input {\n\t\tmargin: 0;\n\t\tcursor: pointer;\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * Two session pages side by side, each in an iframe on its own host.\n\t *\n\t * The page inside a pane draws its own composer, and that composer carries\n\t * the pane's controls — swap, zoom, close — so this component draws nothing\n\t * but the two frames and the divider. The frame asks for those actions with\n\t * postMessage; this side answers only with whether the frame has focus.\n\t * Dropping a sidebar row on a pane replaces what the pane shows.\n\t */\n\timport { onMount } from 'svelte';\n\timport { splitStore, type PaneSide, MIN_PANE_PX } from '$lib/stores/split.svelte';\n\timport { serverStore } from '$lib/stores/servers.svelte';\n\timport { paneUrl, parseRef, type PaneRef } from '$lib/split-refs';\n\timport ResizeDivider from './ResizeDivider.svelte';\n\n\tlet { a, b }: { a: PaneRef; b: PaneRef } = $props();\n\n\tlet frameA = $state<HTMLIFrameElement | null>(null);\n\tlet frameB = $state<HTMLIFrameElement | null>(null);\n\tlet root = $state<HTMLElement | null>(null);\n\n\tconst urlA = $derived(paneUrl(a, serverStore.servers, serverStore.self));\n\tconst urlB = $derived(paneUrl(b, serverStore.servers, serverStore.self));\n\n\t/** Grid columns from the ratio, unless a pane is zoomed. */\n\tconst columns = $derived.by(() => {\n\t\tif (splitStore.zoom === 'a') return '1fr 0 0';\n\t\tif (splitStore.zoom === 'b') return '0 0 1fr';\n\t\tconst pct = Math.round(splitStore.ratio * 1000) / 10;\n\t\treturn `${pct}fr 6px ${100 - pct}fr`;\n\t});\n\n\tfunction frameOf(side: PaneSide): HTMLIFrameElement | null {\n\t\treturn side === 'a' ? frameA : frameB;\n\t}\n\n\tfunction sideOf(source: MessageEventSource | null): PaneSide | null {\n\t\tif (source && frameA?.contentWindow === source) return 'a';\n\t\tif (source && frameB?.contentWindow === source) return 'b';\n\t\treturn null;\n\t}\n\n\t/** Tell each frame whether it holds the focus. */\n\tfunction announceFocus() {\n\t\tfor (const side of ['a', 'b'] as PaneSide[]) {\n\t\t\tconst ref = side === 'a' ? a : b;\n\t\t\tframeOf(side)?.contentWindow?.postMessage(\n\t\t\t\t{ type: 'claude-mux:focus', focused: splitStore.focus === side, side, local: ref.host === null },\n\t\t\t\t'*'\n\t\t\t);\n\t\t}\n\t}\n\n\t$effect(() => {\n\t\tvoid splitStore.focus;\n\t\tannounceFocus();\n\t});\n\n\tfunction onMessage(e: MessageEvent) {\n\t\tconst side = sideOf(e.source);\n\t\tif (!side) return;\n\t\tconst msg = e.data as { type?: string; action?: string; side?: string } | null;\n\t\tif (!msg || msg.type !== 'claude-mux:pane') return;\n\t\tswitch (msg.action) {\n\t\t\tcase 'focus':\n\t\t\t\tsplitStore.setFocus(side);\n\t\t\t\tbreak;\n\t\t\tcase 'focus-other':\n\t\t\t\tsplitStore.setFocus(splitStore.other(side));\n\t\t\t\tbreak;\n\t\t\tcase 'swap':\n\t\t\t\tsplitStore.swap();\n\t\t\t\tbreak;\n\t\t\tcase 'zoom':\n\t\t\t\tsplitStore.toggleZoom(side);\n\t\t\t\tbreak;\n\t\t\tcase 'close':\n\t\t\t\tsplitStore.close(side);\n\t\t\t\tbreak;\n\t\t\tcase 'ready':\n\t\t\t\tannounceFocus();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// ── divider ──────────────────────────────────────────────────────────────\n\tlet resizing = $state(false);\n\tfunction moveResize(e: PointerEvent) {\n\t\tif (!root) return;\n\t\tconst rect = root.getBoundingClientRect();\n\t\tconst min = MIN_PANE_PX / rect.width;\n\t\tsplitStore.setRatio(Math.min(1 - min, Math.max(min, (e.clientX - rect.left) / rect.width)));\n\t}\n\n\t// ── drop targets ─────────────────────────────────────────────────────────\n\tfunction onDrop(side: PaneSide, e: DragEvent) {\n\t\te.preventDefault();\n\t\tconst text = e.dataTransfer?.getData('text/claude-mux-session') ?? '';\n\t\tconst ref = parseRef(text);\n\t\tsplitStore.dragging = false;\n\t\tif (ref) splitStore.openIn(side, ref, null);\n\t}\n\n\tonMount(() => {\n\t\twindow.addEventListener('message', onMessage);\n\t\treturn () => window.removeEventListener('message', onMessage);\n\t});\n</script>\n\n<div\n\tclass=\"split\"\n\tclass:dragging={splitStore.dragging}\n\tstyle=\"grid-template-columns: {columns}\"\n\tbind:this={root}\n>\n\t{#snippet pane(side: PaneSide, ref: PaneRef, url: string | null, frame: 'a' | 'b')}\n\t\t<section class=\"pane\" class:hidden={splitStore.zoom !== null && splitStore.zoom !== side}>\n\t\t\t{#if url}\n\t\t\t\t{#if frame === 'a'}\n\t\t\t\t\t<iframe bind:this={frameA} src={url} title={ref.target} allow=\"microphone; clipboard-read; clipboard-write\"></iframe>\n\t\t\t\t{:else}\n\t\t\t\t\t<iframe bind:this={frameB} src={url} title={ref.target} allow=\"microphone; clipboard-read; clipboard-write\"></iframe>\n\t\t\t\t{/if}\n\t\t\t{:else}\n\t\t\t\t<div class=\"unreachable\">\n\t\t\t\t\t<iconify-icon icon=\"mdi:lan-disconnect\"></iconify-icon>\n\t\t\t\t\t<p><b>{ref.host}</b> is not on the tailnet right now.</p>\n\t\t\t\t\t<button type=\"button\" onclick={() => splitStore.close(side)}>Close this pane</button>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t\t{#if splitStore.dragging}\n\t\t\t\t<!-- Frames swallow drag events; the overlay is where a drop lands. -->\n\t\t\t\t<div\n\t\t\t\t\tclass=\"drop\"\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-label=\"Drop a session here\"\n\t\t\t\t\tondragover={(e) => e.preventDefault()}\n\t\t\t\t\tondrop={(e) => onDrop(side, e)}\n\t\t\t\t>\n\t\t\t\t\tReplace this pane\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t\t{#if resizing}\n\t\t\t\t<!-- Same reason: the frame must not eat the pointer mid-drag. -->\n\t\t\t\t<div class=\"shield\"></div>\n\t\t\t{/if}\n\t\t</section>\n\t{/snippet}\n\n\t{@render pane('a', a, urlA, 'a')}\n\t<div class=\"divider-slot\" class:hidden={splitStore.zoom !== null}>\n\t\t<ResizeDivider\n\t\t\tbind:resizing\n\t\t\ttitle=\"Drag to resize · double-click for 50/50\"\n\t\t\tonmove={moveResize}\n\t\t\tonreset={() => splitStore.setRatio(0.5)}\n\t\t/>\n\t</div>\n\t{@render pane('b', b, urlB, 'b')}\n</div>\n\n<style>\n\t.split {\n\t\tdisplay: grid;\n\t\theight: 100%;\n\t\tmin-height: 0;\n\t\tmin-width: 0;\n\t}\n\t.pane {\n\t\tposition: relative;\n\t\tmin-width: 0;\n\t\tmin-height: 0;\n\t\toverflow: hidden;\n\t}\n\t.pane.hidden {\n\t\tdisplay: none;\n\t}\n\tiframe {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tborder: 0;\n\t\tbackground: #0a0a0a;\n\t}\n\t.divider-slot {\n\t\tmin-width: 0;\n\t}\n\t.divider-slot.hidden {\n\t\tdisplay: none;\n\t}\n\t.shield {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t}\n\t.drop {\n\t\tposition: absolute;\n\t\tinset: 10px 10px 110px;\n\t\tdisplay: grid;\n\t\tplace-items: center;\n\t\tborder: 2px dashed #818cf8;\n\t\tborder-radius: 12px;\n\t\tbackground: rgba(129, 140, 248, 0.1);\n\t\tcolor: #a5b4fc;\n\t\tfont: 500 13px system-ui, sans-serif;\n\t}\n\t.unreachable {\n\t\theight: 100%;\n\t\tdisplay: grid;\n\t\tplace-content: center;\n\t\tjustify-items: center;\n\t\tgap: 8px;\n\t\tcolor: #a8a29e;\n\t\tfont: 14px system-ui, sans-serif;\n\t}\n\t.unreachable iconify-icon {\n\t\tfont-size: 28px;\n\t\tcolor: #6b6764;\n\t}\n\t.unreachable b {\n\t\tcolor: #e7e5e4;\n\t\tfont-weight: 500;\n\t}\n\t.unreachable button {\n\t\theight: 30px;\n\t\tpadding: 0 12px;\n\t\tborder: 1px solid #2a2a2c;\n\t\tborder-radius: 8px;\n\t\tbackground: #151516;\n\t\tcolor: #d6d3d1;\n\t\tcursor: pointer;\n\t}\n</style>\n","<!--\n\tTurns session changes into alerts: a system notification while the window\n\tis in the background, a toast while it is in front, an optional sound, and\n\ta count on the favicon. Draws nothing itself. Adapted from t3code's\n\tThreadNotificationCoordinator (MIT, © T3 Tools Inc.).\n-->\n<script lang=\"ts\">\n\timport { untrack } from 'svelte';\n\timport { goto } from '$app/navigation';\n\timport { toast } from 'svelte-sonner';\n\timport {\n\t\tdetectNotifications,\n\t\tNOTIFICATION_TITLES,\n\t\ttype SeenSession,\n\t\ttype SessionNotification\n\t} from '$shared/session-notifications.js';\n\timport {\n\t\tsessionStore,\n\t\tasking,\n\t\tgetSessionDisplayName,\n\t\twantsHuman,\n\t\ttype Session\n\t} from '$lib/stores/sessions.svelte';\n\timport { preferences } from '$lib/stores/preferences.svelte';\n\timport {\n\t\thasDesktopNotifications,\n\t\thasNotificationSound,\n\t\tplayNotificationSound,\n\t\tsetFaviconBadge,\n\t\tunlockNotificationAudio\n\t} from '$lib/notifications';\n\n\t/** The tmux targets of the sessions on screen; a split shows two. */\n\tlet { viewing }: { viewing: string[] } = $props();\n\n\tconst mode = $derived(preferences.notificationMode);\n\n\t/** Open notifications by session id, so focus can close them and a newer one replaces the older. */\n\tconst open = new Map<string, Notification>();\n\n\tfunction closeAll(): void {\n\t\tfor (const n of open.values()) n.close();\n\t\topen.clear();\n\t}\n\n\tfunction windowInFront(): boolean {\n\t\treturn document.visibilityState === 'visible' && document.hasFocus();\n\t}\n\n\tfunction openSession(target: string): void {\n\t\tvoid goto(`/session/${encodeURIComponent(target)}`);\n\t}\n\n\tfunction alert({ session: s, kind }: SessionNotification<Session>): void {\n\t\tconst inFront = windowInFront();\n\t\t// The session you are looking at needs no alert: you can see it.\n\t\tif (inFront && viewing.some((t) => t === s.tmux_target || t === s.id)) return;\n\n\t\tif (hasNotificationSound(mode)) playNotificationSound(kind === 'completion' ? 'completion' : 'needs-you');\n\n\t\tconst title = NOTIFICATION_TITLES[kind];\n\t\tconst name = getSessionDisplayName(s);\n\t\tconst more = kind === 'completion' ? null : asking(s);\n\t\tconst target = s.tmux_target ?? s.id;\n\n\t\tif (inFront) {\n\t\t\tif (!preferences.inAppToasts) return;\n\t\t\tconst show = kind === 'completion' ? toast.success : toast.warning;\n\t\t\tshow(title, {\n\t\t\t\tid: `session-${s.id}`,\n\t\t\t\tdescription: more ? `${name} · ${more}` : name,\n\t\t\t\taction: { label: 'Open', onClick: () => openSession(target) }\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\t!hasDesktopNotifications(mode) ||\n\t\t\ttypeof Notification === 'undefined' ||\n\t\t\tNotification.permission !== 'granted'\n\t\t)\n\t\t\treturn;\n\t\ttry {\n\t\t\topen.get(s.id)?.close();\n\t\t\tconst n = new Notification(title, {\n\t\t\t\tbody: more ? `${name}\\n${more}` : name,\n\t\t\t\ttag: s.id,\n\t\t\t\ticon: '/icon-192.png'\n\t\t\t});\n\t\t\topen.set(s.id, n);\n\t\t\tn.addEventListener('click', () => {\n\t\t\t\tn.close();\n\t\t\t\twindow.focus();\n\t\t\t\topenSession(target);\n\t\t\t});\n\t\t\tn.addEventListener('close', () => {\n\t\t\t\tif (open.get(s.id) === n) open.delete(s.id);\n\t\t\t});\n\t\t} catch {\n\t\t\t// Some browsers expose Notification but refuse to show one from a page.\n\t\t}\n\t}\n\n\tlet seen = new Map<string, SeenSession>();\n\t$effect(() => {\n\t\tconst out = detectNotifications(seen, sessionStore.sessions);\n\t\tseen = out.seen;\n\t\t// Only a new broadcast should re-run detection, not a preference or a navigation.\n\t\tuntrack(() => {\n\t\t\tfor (const event of out.events) alert(event);\n\t\t});\n\t});\n\n\t// Coming back to the window is reading what the notifications said.\n\t$effect(() => {\n\t\twindow.addEventListener('focus', closeAll);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('focus', closeAll);\n\t\t\tcloseAll();\n\t\t};\n\t});\n\n\t// A tapped push notification hands an open page the session to show (see service-worker.ts).\n\t$effect(() => {\n\t\tif (!('serviceWorker' in navigator)) return;\n\t\tconst onMessage = (event: MessageEvent) => {\n\t\t\tconst data = event.data as { type?: string; url?: string } | null;\n\t\t\tif (data?.type === 'open' && data.url) void goto(data.url);\n\t\t};\n\t\tnavigator.serviceWorker.addEventListener('message', onMessage);\n\t\treturn () => navigator.serviceWorker.removeEventListener('message', onMessage);\n\t});\n\n\t$effect(() => {\n\t\tif (!hasNotificationSound(mode)) return;\n\t\tdocument.addEventListener('pointerdown', unlockNotificationAudio);\n\t\tdocument.addEventListener('keydown', unlockNotificationAudio);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('pointerdown', unlockNotificationAudio);\n\t\t\tdocument.removeEventListener('keydown', unlockNotificationAudio);\n\t\t};\n\t});\n\n\tconst needingYou = $derived(sessionStore.sessions.filter((s) => s.pane_alive !== false && wantsHuman(s)).length);\n\t$effect(() => setFaviconBadge(needingYou));\n</script>\n","<script lang=\"ts\">/**\n * @license @lucide/svelte v0.561.0 - ISC\n *\n * ISC License\n *\n * Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The MIT License (MIT) (for portions derived from Feather)\n *\n * Copyright (c) 2013-2023 Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nlet props = $props();\nconst iconNode = [[\"path\", { \"d\": \"M21 12a9 9 0 1 1-6.219-8.56\" }]];\n/**\n * @component @name LoaderCircle\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTJhOSA5IDAgMSAxLTYuMjE5LTguNTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/loader-circle\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"loader-circle\" {...props} iconNode={iconNode}>\n {@render props.children?.()}\n</Icon>\n","<script lang=\"ts\">/**\n * @license @lucide/svelte v0.561.0 - ISC\n *\n * ISC License\n *\n * Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The MIT License (MIT) (for portions derived from Feather)\n *\n * Copyright (c) 2013-2023 Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nlet props = $props();\nconst iconNode = [[\"circle\", { \"cx\": \"12\", \"cy\": \"12\", \"r\": \"10\" }], [\"path\", { \"d\": \"m9 12 2 2 4-4\" }]];\n/**\n * @component @name CircleCheck\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJtOSAxMiAyIDIgNC00IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/circle-check\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"circle-check\" {...props} iconNode={iconNode}>\n {@render props.children?.()}\n</Icon>\n","<script lang=\"ts\">/**\n * @license @lucide/svelte v0.561.0 - ISC\n *\n * ISC License\n *\n * Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The MIT License (MIT) (for portions derived from Feather)\n *\n * Copyright (c) 2013-2023 Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nlet props = $props();\nconst iconNode = [[\"path\", { \"d\": \"m15 9-6 6\" }], [\"path\", { \"d\": \"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z\" }], [\"path\", { \"d\": \"m9 9 6 6\" }]];\n/**\n * @component @name OctagonX\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgOS02IDYiIC8+CiAgPHBhdGggZD0iTTIuNTg2IDE2LjcyNkEyIDIgMCAwIDEgMiAxNS4zMTJWOC42ODhhMiAyIDAgMCAxIC41ODYtMS40MTRsNC42ODgtNC42ODhBMiAyIDAgMCAxIDguNjg4IDJoNi42MjRhMiAyIDAgMCAxIDEuNDE0LjU4Nmw0LjY4OCA0LjY4OEEyIDIgMCAwIDEgMjIgOC42ODh2Ni42MjRhMiAyIDAgMCAxLS41ODYgMS40MTRsLTQuNjg4IDQuNjg4YTIgMiAwIDAgMS0xLjQxNC41ODZIOC42ODhhMiAyIDAgMCAxLTEuNDE0LS41ODZ6IiAvPgogIDxwYXRoIGQ9Im05IDkgNiA2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/octagon-x\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"octagon-x\" {...props} iconNode={iconNode}>\n {@render props.children?.()}\n</Icon>\n","<script lang=\"ts\">/**\n * @license @lucide/svelte v0.561.0 - ISC\n *\n * ISC License\n *\n * Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The MIT License (MIT) (for portions derived from Feather)\n *\n * Copyright (c) 2013-2023 Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nlet props = $props();\nconst iconNode = [[\"circle\", { \"cx\": \"12\", \"cy\": \"12\", \"r\": \"10\" }], [\"path\", { \"d\": \"M12 16v-4\" }], [\"path\", { \"d\": \"M12 8h.01\" }]];\n/**\n * @component @name Info\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNMTIgMTZ2LTQiIC8+CiAgPHBhdGggZD0iTTEyIDhoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/info\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"info\" {...props} iconNode={iconNode}>\n {@render props.children?.()}\n</Icon>\n","<script lang=\"ts\">/**\n * @license @lucide/svelte v0.561.0 - ISC\n *\n * ISC License\n *\n * Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The MIT License (MIT) (for portions derived from Feather)\n *\n * Copyright (c) 2013-2023 Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nlet props = $props();\nconst iconNode = [[\"path\", { \"d\": \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" }], [\"path\", { \"d\": \"M12 9v4\" }], [\"path\", { \"d\": \"M12 17h.01\" }]];\n/**\n * @component @name TriangleAlert\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEuNzMgMTgtOC0xNGEyIDIgMCAwIDAtMy40OCAwbC04IDE0QTIgMiAwIDAgMCA0IDIxaDE2YTIgMiAwIDAgMCAxLjczLTMiIC8+CiAgPHBhdGggZD0iTTEyIDl2NCIgLz4KICA8cGF0aCBkPSJNMTIgMTdoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/triangle-alert\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"triangle-alert\" {...props} iconNode={iconNode}>\n {@render props.children?.()}\n</Icon>\n","<script lang=\"ts\">\n\timport { Toaster as Sonner, type ToasterProps as SonnerProps } from \"svelte-sonner\";\n\timport Loader2Icon from '@lucide/svelte/icons/loader-2';\n\timport CircleCheckIcon from '@lucide/svelte/icons/circle-check';\n\timport OctagonXIcon from '@lucide/svelte/icons/octagon-x';\n\timport InfoIcon from '@lucide/svelte/icons/info';\n\timport TriangleAlertIcon from '@lucide/svelte/icons/triangle-alert';\n\n\tlet { ...restProps }: SonnerProps = $props();\n</script>\n\n<!-- The app is dark only, so the theme is fixed rather than read from mode-watcher. -->\n<Sonner\n\ttheme=\"dark\"\n\tclass=\"toaster group\"\n\tstyle=\"--normal-bg: #151516; --normal-text: hsl(var(--foreground)); --normal-border: #2a2a2c; --border-radius: 14px;\"\n\t{...restProps}\n>\n\t{#snippet loadingIcon()}\n\t\t<Loader2Icon class=\"size-4 animate-spin\" />\n\t{/snippet}\n\t{#snippet successIcon()}\n\t\t<CircleCheckIcon class=\"size-4 text-emerald-400\" />\n\t{/snippet}\n\t{#snippet errorIcon()}\n\t\t<OctagonXIcon class=\"size-4\" />\n\t{/snippet}\n\t{#snippet infoIcon()}\n\t\t<InfoIcon class=\"size-4\" />\n\t{/snippet}\n\t{#snippet warningIcon()}\n\t\t<TriangleAlertIcon class=\"size-4 text-amber-400\" />\n\t{/snippet}\n</Sonner>\n","<script lang=\"ts\">\n\timport '../app.css';\n\timport { page } from '$app/stores';\n\timport { browser } from '$app/environment';\n\timport { afterNavigate } from '$app/navigation';\n\timport { reportClient, watchClientErrors } from '$lib/client-log';\n\timport { onMount, onDestroy } from 'svelte';\n\timport { drawer } from '$lib/stores/drawer.svelte';\n\timport { sessionStore } from '$lib/stores/sessions.svelte';\n\timport { preferences } from '$lib/stores/preferences.svelte';\n\timport { acquireWakeLock, releaseWakeLock } from '$lib/wakeLock.svelte';\n\timport { voiceStore } from '$lib/stores/voice.svelte';\n\timport AllSessionsPanel from '$lib/components/AllSessionsPanel.svelte';\n\timport ScreenshotsPanel from '$lib/components/ScreenshotsPanel.svelte';\n\timport SidebarMeters from '$lib/components/SidebarMeters.svelte';\n\timport { STORAGE_KEYS } from '$lib/constants';\n\timport SplitView from '$lib/components/SplitView.svelte';\n\timport { splitStore } from '$lib/stores/split.svelte';\n\timport { parseRef } from '$lib/split-refs';\n\timport NotificationCoordinator from '$lib/components/NotificationCoordinator.svelte';\n\timport { Toaster } from '$lib/components/ui/sonner';\n\n\tlet { children } = $props();\n\n\t/**\n\t * Embedded: this page is one pane of a split, drawn inside another page's\n\t * iframe. No shell — the sidebar and its drawer belong to the page outside.\n\t */\n\tconst embed = $derived($page.url.searchParams.has('embed'));\n\n\t/** The two panes of a split, read off `/session/A?with=B`. */\n\tconst splitA = $derived(\n\t\t$page.url.pathname.startsWith('/session/')\n\t\t\t? parseRef(decodeURIComponent($page.url.pathname.split('/session/')[1]))\n\t\t\t: null\n\t);\n\tconst splitB = $derived.by(() => {\n\t\tconst raw = $page.url.searchParams.get('with');\n\t\treturn raw ? parseRef(raw) : null;\n\t});\n\tconst splitOn = $derived(!embed && splitA !== null && splitB !== null);\n\t$effect(() => {\n\t\tsplitStore.setPanes(splitOn ? splitA : null, splitOn ? splitB : null);\n\t});\n\n\t/** Dropping a sidebar row here starts a split with the session on the page. */\n\tfunction dropToSplit(e: DragEvent) {\n\t\te.preventDefault();\n\t\tconst ref = parseRef(e.dataTransfer?.getData('text/claude-mux-session') ?? '');\n\t\tsplitStore.dragging = false;\n\t\tif (ref && splitA) splitStore.splitWith(ref, splitA);\n\t}\n\n\t/** Driven from the session composer's status line, which carries the toggle. */\n\tconst drawerOpen = $derived(drawer.open);\n\tlet sidebarElement: HTMLElement | null = $state(null);\n\tlet touchStartX = 0;\n\tlet touchCurrentX = 0;\n\tlet isDragging = false;\n\n\t// Resizable sidebar state\n\tconst SIDEBAR_WIDTH_KEY = STORAGE_KEYS.sidebarWidth;\n\tconst MIN_WIDTH = 200;\n\tconst MAX_WIDTH = 500;\n\tconst DEFAULT_WIDTH = 300;\n\n\tlet sidebarWidth = $state(DEFAULT_WIDTH);\n\tlet isResizing = $state(false);\n\n\t// Show sidebar only on session detail pages (not on main page)\n\tconst showSidebar = $derived($page.url.pathname.startsWith('/session/'));\n\n\t// Current session for screenshots panel\n\tconst currentTarget = $derived(\n\t\t$page.url.pathname.startsWith('/session/')\n\t\t\t? decodeURIComponent($page.url.pathname.split('/session/')[1])\n\t\t\t: null\n\t);\n\n\t/** The sessions on screen, which need no alert while the window is in front. */\n\tconst viewing = $derived(\n\t\tsplitOn\n\t\t\t? [splitA, splitB].filter((r) => r && !r.host).map((r) => r!.target)\n\t\t\t: currentTarget\n\t\t\t\t? [currentTarget]\n\t\t\t\t: []\n\t);\n\n\tconst currentSession = $derived(\n\t\tsessionStore.sessions.find((s) => s.tmux_target === currentTarget || s.id === currentTarget)\n\t);\n\n\t// Connect session store at layout level so sidebar always has data\n\tonMount(() => watchClientErrors());\n\n\tafterNavigate((nav) => {\n\t\treportClient('nav', {\n\t\t\ttype: nav.type,\n\t\t\tfrom: nav.from?.url?.pathname ?? null,\n\t\t\tto: nav.to?.url?.pathname ?? null\n\t\t});\n\t});\n\n\tonMount(() => {\n\t\tsessionStore.connect();\n\n\t\tif (browser) {\n\t\t\t// Load saved sidebar width\n\t\t\tconst saved = localStorage.getItem(SIDEBAR_WIDTH_KEY);\n\t\t\tif (saved) {\n\t\t\t\tconst width = parseInt(saved, 10);\n\t\t\t\tif (width >= MIN_WIDTH && width <= MAX_WIDTH) {\n\t\t\t\t\tsidebarWidth = width;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\tonDestroy(() => {\n\t\tsessionStore.disconnect();\n\t\tif (browser) void releaseWakeLock();\n\t});\n\n\t/**\n\t * The screen stays on when asked to, and always while you dictate: a phone\n\t * that dims mid-sentence suspends the page, and the recording with it.\n\t */\n\tconst wantAwake = $derived(\n\t\tpreferences.keepAwake || voiceStore.status === 'recording' || voiceStore.status === 'transcribing'\n\t);\n\n\tfunction handleVisibility() {\n\t\t// The browser drops the lock whenever the page is hidden; take it back.\n\t\tif (document.visibilityState === 'visible' && wantAwake) {\n\t\t\tvoid acquireWakeLock();\n\t\t}\n\t}\n\n\t$effect(() => {\n\t\tif (!browser) return;\n\t\tif (wantAwake) void acquireWakeLock();\n\t\telse void releaseWakeLock();\n\t});\n\n\t$effect(() => {\n\t\tif (!browser) return;\n\t\tdocument.addEventListener('visibilitychange', handleVisibility);\n\t\treturn () => document.removeEventListener('visibilitychange', handleVisibility);\n\t});\n\n\t// Resize handlers\n\tfunction handleResizeStart(e: MouseEvent) {\n\t\te.preventDefault();\n\t\tisResizing = true;\n\t\tdocument.addEventListener('mousemove', handleResizeMove);\n\t\tdocument.addEventListener('mouseup', handleResizeEnd);\n\t}\n\n\tfunction handleResizeMove(e: MouseEvent) {\n\t\tif (!isResizing) return;\n\t\tconst newWidth = Math.min(MAX_WIDTH, Math.max(MIN_WIDTH, e.clientX));\n\t\tsidebarWidth = newWidth;\n\t}\n\n\tfunction handleResizeEnd() {\n\t\tisResizing = false;\n\t\tdocument.removeEventListener('mousemove', handleResizeMove);\n\t\tdocument.removeEventListener('mouseup', handleResizeEnd);\n\t\tif (browser) {\n\t\t\tlocalStorage.setItem(SIDEBAR_WIDTH_KEY, sidebarWidth.toString());\n\t\t}\n\t}\n\n\t/** The sidebar's own shortcut, the one VS Code taught everyone. */\n\tfunction handleSidebarKey(e: KeyboardEvent) {\n\t\tif (!(e.ctrlKey || e.metaKey) || e.altKey || e.shiftKey) return;\n\t\tif (e.key.toLowerCase() !== 'b') return;\n\t\te.preventDefault();\n\t\tdrawer.toggle();\n\t}\n\n\tfunction closeDrawer() {\n\t\tdrawer.close();\n\t}\n\n\tfunction handleTouchStart(e: TouchEvent) {\n\t\ttouchStartX = e.touches[0].clientX;\n\t\ttouchCurrentX = touchStartX;\n\t\tisDragging = true;\n\t}\n\n\tfunction handleTouchMove(e: TouchEvent) {\n\t\tif (!isDragging || !sidebarElement) return;\n\t\ttouchCurrentX = e.touches[0].clientX;\n\t\tconst diff = touchCurrentX - touchStartX;\n\t\tif (diff < 0) {\n\t\t\tsidebarElement.style.transform = `translateX(${diff}px)`;\n\t\t}\n\t}\n\n\tfunction handleTouchEnd() {\n\t\tif (!isDragging || !sidebarElement) return;\n\t\tisDragging = false;\n\t\tconst diff = touchCurrentX - touchStartX;\n\t\tif (diff < -80) {\n\t\t\tcloseDrawer();\n\t\t}\n\t\tsidebarElement.style.transform = '';\n\t}\n</script>\n\n<svelte:head>\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no, viewport-fit=cover\" />\n\t<script src=\"https://code.iconify.design/iconify-icon/2.1.0/iconify-icon.min.js\"></script>\n</svelte:head>\n\n<svelte:window onkeydown={handleSidebarKey} />\n\n{#if !embed}\n\t<!-- A split's panes are this layout in frames; only the outer page alerts. -->\n\t<NotificationCoordinator {viewing} />\n\t<Toaster position=\"top-right\" closeButton />\n{/if}\n\n{#if showSidebar && !embed}\n\t<div class=\"app-shell\" class:resizing-any={isResizing}>\n\t\t<aside\n\t\t\tclass=\"sidebar\"\n\t\t\tclass:open={drawerOpen}\n\t\t\tclass:resizing={isResizing}\n\t\t\tstyle=\"--sidebar-width: {sidebarWidth}px\"\n\t\t\tbind:this={sidebarElement}\n\t\t\tontouchstart={handleTouchStart}\n\t\t\tontouchmove={handleTouchMove}\n\t\t\tontouchend={handleTouchEnd}\n\t\t>\n\t\t\t<div class=\"sidebar-content\">\n\t\t\t\t<AllSessionsPanel compact onSessionSelect={closeDrawer} />\n\t\t\t</div>\n\t\t\t<!-- The foot is one card, the way the composer is: what belongs to the\n\t\t\t session you are on (its screenshots), then the meters. -->\n\t\t\t<div class=\"sidebar-foot\">\n\t\t\t\t{#if currentSession}\n\t\t\t\t\t<div class=\"sidebar-panel\">\n\t\t\t\t\t\t<ScreenshotsPanel\n\t\t\t\t\t\t\tsessionId={currentSession.id}\n\t\t\t\t\t\t\tscreenshots={currentSession.screenshots ?? []}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\t\t\t\t<SidebarMeters />\n\t\t\t</div>\n\t\t\t<!-- svelte-ignore a11y_no_noninteractive_element_interactions -->\n\t\t\t<div\n\t\t\t\tclass=\"resize-handle\"\n\t\t\t\tonmousedown={handleResizeStart}\n\t\t\t\trole=\"separator\"\n\t\t\t\taria-orientation=\"vertical\"\n\t\t\t></div>\n\t\t</aside>\n\n\t\t<main class=\"content\">\n\t\t\t{#if splitOn && splitA && splitB}\n\t\t\t\t<SplitView a={splitA} b={splitB} />\n\t\t\t{:else}\n\t\t\t\t{@render children()}\n\t\t\t\t{#if splitStore.dragging && splitA}\n\t\t\t\t\t<!-- Shown only while a sidebar row is in flight: the right\n\t\t\t\t\t edge is where dropping it opens a second pane. -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"split-drop\"\n\t\t\t\t\t\trole=\"region\"\n\t\t\t\t\t\taria-label=\"Drop to open side by side\"\n\t\t\t\t\t\tondragover={(e) => e.preventDefault()}\n\t\t\t\t\t\tondrop={dropToSplit}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>Open side by side</span>\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\t\t\t{/if}\n\t\t</main>\n\n\t\t{#if drawerOpen}\n\t\t\t<button class=\"backdrop\" onclick={closeDrawer} aria-label=\"Close menu\"></button>\n\t\t{/if}\n\t</div>\n{:else if embed}\n\t<!-- One pane of a split: the page alone, held to the frame's height the\n\t way .content holds it inside the shell, so its composer stays put. -->\n\t<div class=\"embed-shell\">\n\t\t{@render children()}\n\t</div>\n{:else}\n\t{@render children()}\n{/if}\n\n<style>\n\t:global(body) {\n\t\tmargin: 0;\n\t\tmin-height: 100dvh;\n\t\t/* Matches the header/toolbar so the iOS status-bar & home-indicator areas blend in */\n\t\tbackground: #111;\n\t}\n\n\t:global(iconify-icon) {\n\t\tfont-size: 18px;\n\t}\n\n\t:global(iconify-icon.spin) {\n\t\tanimation: spin 1s linear infinite;\n\t}\n\n\t@keyframes spin {\n\t\tfrom { transform: rotate(0deg); }\n\t\tto { transform: rotate(360deg); }\n\t}\n\n\t.app-shell {\n\t\tdisplay: flex;\n\t\theight: 100dvh;\n\t\toverflow: hidden;\n\t\tbox-sizing: border-box;\n\t\t/* Keep UI out from under the notch / home indicator in standalone (PWA) mode */\n\t\tpadding-top: env(safe-area-inset-top);\n\t\tpadding-bottom: env(safe-area-inset-bottom);\n\t\tpadding-left: env(safe-area-inset-left);\n\t\tpadding-right: env(safe-area-inset-right);\n\t}\n\n\t.app-shell.resizing-any {\n\t\tcursor: col-resize;\n\t\tuser-select: none;\n\t}\n\n\t.sidebar {\n\t\twidth: var(--sidebar-width, 300px);\n\t\tflex-shrink: 0;\n\t\tbackground: hsl(var(--background));\n\t\tborder-right: 1px solid hsl(var(--border));\n\t\toverflow: hidden;\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t.sidebar.resizing {\n\t\tuser-select: none;\n\t}\n\n\t.sidebar-content {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tflex: 1;\n\t\tmin-height: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: hidden;\n\t\t/* Reaching the end of the list must not scroll whatever sits behind\n\t\t the drawer on a phone. */\n\t\toverscroll-behavior: contain;\n\t}\n\n\t.sidebar-panel {\n\t\tflex-shrink: 0;\n\t}\n\n\t/* The right edge of the page while a session is being dragged. */\n\t.split-drop {\n\t\tposition: absolute;\n\t\ttop: 12px;\n\t\tright: 12px;\n\t\tbottom: 12px;\n\t\twidth: min(38%, 420px);\n\t\tdisplay: grid;\n\t\tplace-items: center;\n\t\tborder: 2px dashed #818cf8;\n\t\tborder-radius: 12px;\n\t\tbackground: rgba(129, 140, 248, 0.1);\n\t\tcolor: #a5b4fc;\n\t\tfont: 500 13px system-ui, sans-serif;\n\t\tz-index: var(--z-overlay);\n\t}\n\n\t/* The composer's card, at the foot of the sidebar. */\n\t.sidebar-foot {\n\t\tflex-shrink: 0;\n\t\tmargin: 0 10px 10px;\n\t\tbackground: #151516;\n\t\tborder: 1px solid #2a2a2c;\n\t\tborder-radius: 14px;\n\t\toverflow: hidden;\n\t}\n\t.sidebar-foot .sidebar-panel + :global(*) {\n\t\tborder-top: 1px solid #1f1f21;\n\t}\n\n\t.resize-handle {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: 0;\n\t\twidth: 4px;\n\t\theight: 100%;\n\t\tcursor: col-resize;\n\t\tbackground: transparent;\n\t\ttransition: background 0.15s;\n\t}\n\n\t.resize-handle:hover,\n\t.sidebar.resizing .resize-handle {\n\t\tbackground: color-mix(in oklch, var(--primary), transparent 50%);\n\t}\n\n\t.content {\n\t\tflex: 1;\n\t\toverflow: hidden;\n\t\tposition: relative;\n\t}\n\t.embed-shell {\n\t\theight: 100dvh;\n\t\toverflow: hidden;\n\t\tposition: relative;\n\t}\n\n\n\t.backdrop {\n\t\tdisplay: none;\n\t}\n\n\t/* Mobile responsive */\n\t@media (max-width: 768px) {\n\t\t.sidebar {\n\t\t\tposition: fixed;\n\t\t\tleft: 0;\n\t\t\ttop: 0;\n\t\t\tbottom: 0;\n\t\t\twidth: 100% !important;\n\t\t\tbox-sizing: border-box;\n\t\t\tpadding-top: env(safe-area-inset-top);\n\t\t\tpadding-bottom: env(safe-area-inset-bottom);\n\t\t\tz-index: var(--z-drawer);\n\t\t\ttransform: translateX(-100%);\n\t\t\ttransition: transform 0.2s ease;\n\t\t\tbackground: hsl(var(--background) / 0.85);\n\t\t\tbackdrop-filter: blur(12px);\n\t\t\t-webkit-backdrop-filter: blur(12px);\n\t\t}\n\n\t\t/* Closed drawer is off-screen but still composited — without this its\n\t\t busy dots keep animating behind the blur. */\n\t\t.sidebar:not(.open) {\n\t\t\tcontent-visibility: hidden;\n\t\t}\n\n\t\t.sidebar.open {\n\t\t\ttransform: translateX(0);\n\t\t}\n\n\t\t.resize-handle {\n\t\t\tdisplay: none;\n\t\t}\n\n\n\n\t\t.backdrop {\n\t\t\tdisplay: block;\n\t\t\tposition: fixed;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tbottom: 0;\n\t\t\tbackground: rgba(0, 0, 0, 0.4);\n\t\t\tz-index: var(--z-drawer-backdrop);\n\t\t\tborder: none;\n\t\t\tcursor: pointer;\n\t\t\ttouch-action: none;\n\t\t}\n\t}\n</style>\n"],"names":["sentinel","wakeLockSupported","acquireWakeLock","s","releaseWakeLock","bars","div","root_1","div_1","$.child","_","i","$$anchor","div_2","root","$.append","$.reset","$.set_class","$0","$.set_attribute","$$props","defaultWindow","getActiveElement","document","activeElement","node","ActiveElement","#document","#subscribe","options","window","createSubscriber","update","cleanupFocusIn","on","cleanupFocusOut","Context","#name","#key","name","hasContext","context","getContext","fallback","setContext","sonnerContext","isAction","action","useDocumentHidden","current","$.state","$.user_effect","$.set","$.get","TOAST_LIFETIME","GAP","SWIPE_THRESHOLD","TIME_BEFORE_UNMOUNT","SCALE_MULTIPLIER","DEFAULT_TOAST_CLASSES","getDefaultSwipeDirections","position","y","x","directions","getDampening","delta","LoadingIcon","node_1","toastType","cn","classes","$1","$.derived","Loader","cancelButtonStyle","$.prop","actionButtonStyle","descriptionClass","unstyled","defaultRichColors","gap","defaultClasses","mounted","removed","swiping","swipeOut","isSwiped","offsetBeforeRemove","initialHeight","remainingTime","dragStartTime","toastRef","swipeDirection","swipeOutDirection","isFront","isVisible","dismissible","toastClass","toastDescriptionClass","relevantHeights","toastState","height","heightIndex","idx","closeButton","duration","pointerStart","coords","swipeDirections","toastsHeightBefore","prev","curr","reducerIndex","isDocumentHidden","invert","disabled","toastTitle","toastDescription","closeTimerStartTime","lastCloseTimerStartTime","offset","scale","toastEl","untrack","offsetHeight","rectHeight","scaledRectHeight","finalHeight","deleteToast","timeoutId","isPromiseLoadingOrInfiniteDuration","startTimer","pauseTimer","elapsedTime","onMount","handlePointerDown","event","target","handlePointerUp","swipeAmountX","swipeAmountY","timeTaken","swipeAmount","velocity","handlePointerMove","yDelta","xDelta","dampenedDelta","handleDragEnd","icon","li","root_7","node_2","button","node_3","$.delegated","$$render","consequent_1","Component","Component_1","$.spread_props","root_2","node_7","toast_icon","consequent_3","alternate_1","consequent_4","consequent_5","toast_icon_1","consequent_6","consequent_8","consequent_9","consequent_10","consequent_11","$.template_effect","consequent_12","$.sibling","node_6","div_3","node_17","Title","Title_1","$.set_text","text","consequent_13","alternate_2","consequent_14","node_20","div_4","root_3","node_21","Description","Description_1","text_1","consequent_15","alternate_3","$.clsx","consequent_16","node_23","toast_cancel","button_1","root_4","text_2","$.only_child","consequent_17","d","consequent_18","consequent_19","toast_action","button_2","root_5","text_3","consequent_20","d_1","consequent_21","consequent_22","consequent_2","alternate_4","$$value","$2","styles","$.set_style","$.event","svg","VISIBLE_TOASTS_AMOUNT","VIEWPORT_OFFSET","MOBILE_VIEWPORT_OFFSET","TOAST_WIDTH","DARK","LIGHT","getOffsetObject","defaultOffset","mobileOffset","index","isMobile","prefix","defaultValue","assignAll","key","value","getInitialTheme","t","hotkey","expand","theme","richColors","visibleToasts","toastOptions","dir","pauseWhenPageIsHidden","containerAriaLabel","closeButtonAriaLabel","restProps","$.rest_props","rest_excludes","getDocumentDirection","dirAttribute","filteredToasts","toast","possiblePositions","expanded","interacting","actualTheme","listRef","lastFocusedElementRef","isFocusWithin","lastMousePosition","hotkeyLabel","toastsToDismiss","updatedToasts","dismissToast","mediaQueryList","changeHandler","matches","handleBlur","handleFocus","handleMouseEnter","handleMouseLeave","currentPosition","mouseActuallyMoved","handleMouseMove","SonnerState","section","$.each","$$array","offsetObject","frontHeight","ol","$$array_1","successIcon","SuccessIcon","consequent","errorIcon","ErrorIcon","warningIcon","WarningIcon","infoIcon","InfoIcon","consequent_7","closeIcon","CloseIcon","Toast","count","defaultExpanded","lazy","$.proxy","hasBeenExpanded","toggle","shouldRender","iconify_icon","span","span_1","iconify_icon_1","$.set_custom_element_data","viewingScreenshot","touchStartX","touchCurrentX","isSwiping","dismissScreenshot","path","openModal","closeModal","resetSwipe","getFilename","handleTouchStart","e","handleTouchMove","handleTouchEnd","swipeOffset","SidebarAccordion","p","screenshot","img","Button","alternate","root_6","img_1","node_4","$.first_child","fragment_2","node_5","iconify_icon_2","fragment_3","div_5","iconify_icon_3","hasDesktopNotifications","mode","hasNotificationSound","originalFavicon","badgeFavicon","badges","badgeImage","label","cached","canvas","url","setFaviconBadge","image","audio","unlockNotificationAudio","TONES","playNotificationSound","kind","now","freq","at","osc","gain","pushUnavailable","ios","standalone","worker","reject","currentSubscription","serverEvents","subscription","res","toKey","base64url","base64","c","api","method","body","data","saveEvents","events","subscribe","vapid","manager","bound","sameBytes","b","v","unsubscribe","sendTestPush","SPARK_DAYS","PLAN_UNAVAILABLE","usageStore","dayOf","makeDayFormatter","hostTimeZone","supported","summary","quota","today","stats","sessionStore","shortLabel","model","meters","out","limit","SEVERITY","system","tag","percent","severityForPercent","dayKey","spark","byDate","date","peak","MODES","alertProblem","preferences","requesting","chooseMode","pushSub","pushEvents","pushBusy","pushNote","pushBlocked","sub","pushAction","run","done","err","setPush","setPushEvent","testPush","root_10","a","meter","span_2","span_3","span_4","span_5","span_6","span_7","span_8","span_9","text_4","span_10","day","span_11","span_12","money","m","text_5","text_7","classes_1","p_1","text_8","label_1","input","$.remove_input_defaults","label_2","input_1","p_2","root_8","text_9","div_6","label_3","input_2","label_4","root_9","input_3","frameA","frameB","urlA","paneUrl","serverStore","urlB","columns","splitStore","pct","frameOf","side","sideOf","source","announceFocus","ref","onMessage","msg","resizing","moveResize","rect","min","MIN_PANE_PX","onDrop","parseRef","pane","$.noop","frame","iframe","iframe_1","$.bind_this","b_1","ResizeDivider","classes_2","open","closeAll","n","windowInFront","openSession","goto","alert","inFront","title","NOTIFICATION_TITLES","getSessionDisplayName","more","asking","seen","detectNotifications","needingYou","wantsHuman","props","iconNode","Icon","$.snippet","Sonner","Loader2Icon","CircleCheckIcon","OctagonXIcon","TriangleAlertIcon","embed","$page","splitA","splitB","raw","splitOn","dropToSplit","drawerOpen","drawer","sidebarElement","isDragging","SIDEBAR_WIDTH_KEY","STORAGE_KEYS","MIN_WIDTH","MAX_WIDTH","sidebarWidth","isResizing","showSidebar","currentTarget","viewing","r","currentSession","watchClientErrors","afterNavigate","nav","reportClient","saved","width","onDestroy","wantAwake","voiceStore","handleVisibility","handleResizeStart","handleResizeMove","handleResizeEnd","newWidth","handleSidebarKey","closeDrawer","diff","$.head","NotificationCoordinator","Toaster","aside","AllSessionsPanel","ScreenshotsPanel","SidebarMeters","main","SplitView","node_12"],"mappings":"mmCAQA,IAAIA,GAAwC,KAErC,SAASC,IAA6B,CAC5C,MAAkB,aAAc,SACjC,CAEA,eAAsBC,IAAiC,CACtD,GAAI,GAACD,GAAA,GAAuBD,IAC5B,GAAI,CACH,MAAMG,EAA0B,MAAM,UAAU,SAAS,QAAQ,QAAQ,EACzEH,GAAWG,EACXA,EAAE,iBAAiB,UAAW,IAAM,CACnCH,GAAW,IACZ,CAAC,CACF,MAAQ,CACPA,GAAW,IACZ,CACD,CAEA,eAAsBI,IAAiC,CACtD,GAAKJ,GACL,IAAI,CACH,MAAMA,GAAS,QAAA,CAChB,MAAQ,CAAA,CAGRA,GAAW,KACZ,CClCC,MAAMK,GAAO,MAAM,EAAE,EAAE,KAAK,CAAC,2HAG9B,UAKC,IAAAC,EAAAC,GAAA,EAICC,EAAGC,EAJJH,CAAA,KAICE,EAAG,GAAA,IACIH,GAAI,CAAIK,MAAM,eAAeC,CAAC,GAAE,CAAAC,EAAxB,IAAC,CACd,IAAAC,EAAGC,GAAA,EAAHC,EAAAH,EAAAC,CAAI,IAFNG,EAAAR,CAAI,EAJLQ,EAAAV,CAAA,QAAAW,GAAAX,EAAA,EAAAY,CAAA,EAAAC,EAAAb,EAAA,eAAAc,EAAA,OAAA,WACO,CAAC,yBAAwBA,EAAA,KAAA,EAAa,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC,IADtEL,EAAAH,EAAAN,CAAA,MAFO,CCND,MAAMe,GAA2B,OAAO,OAAW,IAAc,OAAS,OCS1E,SAASC,GAAiBC,EAAU,CACvC,IAAIC,EAAgBD,EAAS,cAC7B,KAAOC,GAAe,YAAY,CAC9B,MAAMC,EAAOD,EAAc,WAAW,cACtC,GAAIC,IAASD,EACT,MAEAA,EAAgBC,CACxB,CACA,OAAOD,CACX,CChBO,MAAME,EAAc,CACvBC,GACAC,GACA,YAAYC,EAAU,GAAI,CACtB,KAAM,CAAE,OAAAC,EAAST,GAAe,SAAAE,EAAWO,GAAQ,QAAQ,EAAKD,EAC5DC,IAAW,SAEf,KAAKH,GAAYJ,EACjB,KAAKK,GAAaG,GAAkBC,GAAW,CAC3C,MAAMC,EAAiBC,GAAGJ,EAAQ,UAAWE,CAAM,EAC7CG,EAAkBD,GAAGJ,EAAQ,WAAYE,CAAM,EACrD,MAAO,IAAM,CACTC,EAAc,EACdE,EAAe,CACnB,CACJ,CAAC,EACL,CACA,IAAI,SAAU,CAEV,OADA,KAAKP,KAAU,EACV,KAAKD,GAEHL,GAAiB,KAAKK,EAAS,EAD3B,IAEf,CACJ,CAU6B,IAAID,GCpC1B,MAAMU,EAAQ,CACjBC,GACAC,GAKA,YAAYC,EAAM,CACd,KAAKF,GAAQE,EACb,KAAKD,GAAO,OAAOC,CAAI,CAC3B,CAOA,IAAI,KAAM,CACN,OAAO,KAAKD,EAChB,CAMA,QAAS,CACL,OAAOE,GAAW,KAAKF,EAAI,CAC/B,CAQA,KAAM,CACF,MAAMG,EAAUC,GAAW,KAAKJ,EAAI,EACpC,GAAIG,IAAY,OACZ,MAAM,IAAI,MAAM,YAAY,KAAKJ,EAAK,aAAa,EAEvD,OAAOI,CACX,CAOA,MAAME,EAAU,CACZ,MAAMF,EAAUC,GAAW,KAAKJ,EAAI,EACpC,OAAIG,IAAY,OACLE,EAEJF,CACX,CAMA,IAAIA,EAAS,CACT,OAAOG,GAAW,KAAKN,GAAMG,CAAO,CACxC,CACJ,CC7DO,MAAMI,GAAgB,IAAIT,GAAQ,YAAY,ECH9C,SAASU,GAASC,EAAQ,CAC7B,OAAOA,EAAO,QAAU,MAC5B,CCDO,SAASC,IAAoB,CAChC,IAAIC,EAAUC,KAAO,OAAO,SAAa,IAAc,SAAS,OAAS,EAAK,CAAA,EAC9EC,OAAAA,GAAQ,IACGjB,GAAG,SAAU,mBAAoB,IAAM,CAC1CkB,EAAAH,EAAU,SAAS,OAAM,EAAA,CAC7B,CAAC,CACJ,EACM,CACH,IAAI,SAAU,CACV,OAAMI,EAACJ,CAAO,CAClB,EAER,CCXC,MAAMK,GAAiB,IAGjBC,GAAM,GAGNC,GAAkB,GAGlBC,GAAsB,IAEtBC,GAAmB,IAEnBC,GAAsC,CAC3C,MAAO,GACP,MAAO,GACP,YAAa,GACb,OAAQ,GACR,YAAa,GACb,aAAc,GACd,aAAc,GACd,OAAQ,GACR,QAAS,GACT,MAAO,GACP,QAAS,GACT,QAAS,GACT,KAAM,GACN,QAAS,EACT,EAED,SAASC,GACRC,EACwB,CACxB,KAAM,CAACC,EAAGC,CAAC,EAAIF,EAAS,MAAM,GAAG,EAC3BG,EAAoC,CAAA,EAE1C,OAAIF,GACHE,EAAW,KAAKF,CAAC,EAGdC,GACHC,EAAW,KAAKD,CAAC,EAGXC,CACR,CAEA,SAASC,GAAaC,EAAe,CAGpC,MAAO,IAAK,IAFG,KAAK,IAAIA,CAAK,EAAI,GAGlC,uaAGD,gBA+bUC,EAAWvD,GAAA,+BAElB,IAAAN,GAAAQ,GAAA,EAAAsD,GAAA3D,EAAAH,EAAA,2BAAAU,EAAAV,EAAA,SAAAW,GAAAX,GAAA,EAAAY,EAAA,IAAAZ,GAAA,eAEc+C,EAAAgB,CAAS,IAAK,SAAS,WAD9BC,GAAGjB,EAAAkB,EAAO,GAAE,OAAQnD,EAAA,OAAO,SAAS,OAAQ,eAAe,CAAC,IADnEL,EAAAH,GAAAN,EAAA,yBAQOgE,GAAGjB,IAAO,GAAE,OAAQjC,EAAA,MAAM,SAAS,MAAM,CAAC,EACxCoD,GAAAC,EAAA,IAAApB,EAAAgB,CAAS,IAAK,SAAS,EAFhCK,GAAA9D,GAAA,6GAvbC,IAUF+D,EAAiBC,GAAAxD,EAAA,oBAAA,EAAG,EAAE,EACtByD,6BAAoB,EAAE,EAEtBC,4BAAmB,EAAE,EAErBC,oBAAW,EAAK,EAOhBC,6BAAoB,EAAK,EACzBC,eAAM1B,EAAG,EAOV,MAAM2B,EAA+B,CAAE,GAAGvB,EAAqB,EAE/D,IAAIwB,EAAUjC,EAAO,EAAK,EACtBkC,EAAUlC,EAAO,EAAK,EACtBmC,EAAUnC,EAAO,EAAK,EACtBoC,GAAWpC,EAAO,EAAK,EACvBqC,EAAWrC,EAAO,EAAK,EACvBsC,EAAqBtC,EAAO,CAAC,EAC7BuC,EAAgBvC,EAAO,CAAC,EACxBwC,EAAgBtE,QAAM,UAAQA,EAAA,UAA2BkC,GACzDqC,GAAgBzC,EAAoB,IAAI,EACxC0C,EAAW1C,EAAM,MAAA,EACjB2C,EAAiB3C,EAAyB,IAAI,EAC9C4C,EAAoB5C,EACvB,IAAA,EAED,MAAM6C,EAAOtB,EAAA,IAAYrD,EAAA,QAAU,CAAC,EAC9B4E,EAASvB,EAAA,IAAYrD,EAAA,MAAQ,kBAAkB,EAC/CiD,EAASI,EAAA,IAAYrD,EAAA,MAAM,IAAI,EAC/B6E,GAAWxB,EAAA,IAChBrD,EAAA,MAAM,cAAgB,OACnBA,EAAA,MAAM,cAAgB,GACtBA,EAAA,MAAM,cAAgB,EAAA,EAEpB8E,GAAUzB,EAAA,IAAYrD,QAAM,OAAS,EAAE,EACvC+E,GAAqB1B,EAAA,IAAYrD,QAAM,kBAAoB,EAAE,EAI7DgF,EAAe3B,EAAA,IACpB4B,GAAW,QAAQ,OACjBC,GACAA,EAAO,YAAclF,EAAA,MAAM,WAC3BkF,EAAO,WAAQlF,EAAA,QAAK,CACtB,EAGKmF,GAAW9B,EAAe,IAAM,CACrC,MAAM+B,EAAMnD,EAAA+C,CAAe,EAAC,UAC1BE,GAAWA,EAAO,UAAYlF,QAAM,EAAA,EAEtC,OAAOoF,IAAQ,GAAK,EAAIA,CACzB,CAAC,EACKC,GAAWhC,EAAA,IAAYrD,EAAA,MAAM,0BAAqC,EAClEsF,GAAQjC,EAAA,IACbrD,QAAM,UAAQA,EAAA,UAA2BkC,EAAA,EAE1C,IAAIqD,GAAgD,KACpD,MAAMC,GAAMnC,EAAA,IAAYrD,EAAA,SAAS,MAAM,GAAG,CAAC,EACrCyF,GAAepC,EAAA,IACpBrD,EAAA,iBAAuBwC,cAAkC,EAEpDkD,GAAkBrC,EAAA,IACvBpB,EAAA+C,CAAe,EAAC,OAAO,CAACW,EAAMC,EAAMC,IAC/BA,GAAY5D,EAAIkD,EAAW,EAASQ,EACjCA,EAAOC,EAAK,OACjB,EAAC,EAECE,GAAmBlE,GAAiB,EACpCmE,GAAM1C,EAAA,IAAYrD,EAAA,MAAM,gBAA2B,EACnDgG,GAAQ3C,EAAA,IAAYpB,EAAAgB,CAAS,IAAK,SAAS,EAE3CE,GAAOE,EAAA,KAAY,CAAE,GAAGS,EAAgB,GAAA9D,EAAA,OAAc,EAAE,EAExDiG,GAAU5C,EAAA,IAAYrD,EAAA,MAAM,KAAK,EACjCkG,GAAgB7C,EAAA,IAAYrD,EAAA,MAAM,WAAW,EAEnD,IAAImG,EAAsBrE,EAAO,CAAC,EAC9BsE,EAA0BtE,EAAO,CAAC,EAEtC,MAAMuE,EAAMhD,EAAA,IAAY,KAAK,MAAMpB,EAAAkD,EAAW,EAAGtB,EAAG,EAAA5B,EAAGyD,EAAkB,EAAC,EAE1E3D,GAAQ,IAAM,CACbE,EAAAgE,EAAU,EACVhE,EAAAiE,EAAgB,EAChB,IAAII,EAEAtG,8BACHsG,EAAQ,EAERA,EAAQ,EAAItG,EAAA,MAAQsC,GAGrB,MAAMiE,EAAUC,GAAQ,IAAAvE,EAAMuC,CAAQ,CAAA,EACtC,GAAI+B,IAAY,OAAW,OAC3BA,EAAQ,MAAM,YAAY,SAAU,MAAM,EAE1C,MAAME,EAAeF,EAAQ,aACvBG,GAAaH,EAAQ,sBAAqB,EAAG,OAC7CI,GACL,KAAK,OAAOD,GAAaJ,EAAQ,OAAO,SAAW,GAAG,EAAI,IAE3DC,EAAQ,MAAM,eAAe,QAAQ,EAErC,IAAIK,GAEA,KAAK,IAAID,GAAmBF,CAAY,EAAI,EAE/CG,GAAcD,GAGdC,GAAcH,EAGfzE,EAAAqC,EAAgBuC,GAAW,EAAA,EAE3B3B,GAAW,UAAU,CACpB,QAASjF,QAAM,GACf,OAAQ4G,GACR,UAAW5G,QAAM,UACjB,SAAAA,EAAA,SACA,CACF,CAAC,EAED,SAAS6G,GAAc,CACtB7E,EAAAgC,EAAU,EAAI,EAEdhC,EAAAoC,IAAqBiC,CAAM,EAAA,EAAA,EAE3BpB,GAAW,aAAajF,EAAA,MAAM,EAAE,EAChCiF,GAAW,cAAcjF,EAAA,MAAM,EAAE,EACjCiF,GAAW,gBAAgBjF,QAAM,GAAIqC,EAAmB,CACzD,CAEA,IAAIyE,GAEJ,MAAMC,GAAkC1D,EAAA,IACvCrD,EAAC,MAAM,SAAWiC,EAAAgB,CAAS,IAAK,WAC/BjD,EAAA,MAAM,WAAa,OAAO,iBAAA,EAG5B,SAASgH,IAAa,CAIrB,aAAaF,EAAS,EACtB9E,EAAAmE,EAAsB,IAAI,KAAI,EAAG,QAAO,EAAE,EAAA,EAE1CW,GAAY,WAAW,IAAM,CAC5B9G,EAAA,MAAM,cAAWA,EAAA,KAAA,EACjB6G,EAAW,CACZ,EAAGvC,CAAc,CAClB,CAEA,SAAS2C,IAAa,CACrB,GAAIhF,EAAAmE,CAAuB,EAAAnE,EAAGkE,CAAmB,EAAE,CAElD,MAAMe,EAAc,IAAI,KAAI,EAAG,QAAO,EAAEjF,EAAGkE,CAAmB,EAC9D7B,EAAgBA,EAAgB4C,CACjC,CAEAlF,EAAAoE,EAA0B,IAAI,KAAI,EAAG,QAAO,EAAE,EAAA,CAC/C,CAEArE,GAAQ,IAAM,CACT/B,EAAA,MAAM,UAIT,aAAa8G,EAAS,EACtBxC,IAAgBgB,EAAQ,EACnBrD,EAAA8E,EAAkC,GACtCC,GAAU,EAGb,CAAC,EAEDjF,GAAQ,KACFE,EAAA8E,EAAkC,IAErC/G,EAAA,UAAAA,EAAA,aAECA,yBAAyB8F,GAAiB,QAE3CmB,GAAU,EAEVD,GAAU,GAIL,IAAM,aAAaF,EAAS,EACnC,EAEDK,GAAQ,IAAM,CACbnF,EAAA+B,EAAU,EAAI,EAEd,MAAMmB,EAASjD,EAAAuC,CAAQ,GAAE,sBAAqB,EAAG,OAEjDxC,OAAAA,EAAAqC,EAAgBa,EAAM,EAAA,EACtBD,GAAW,UAAU,CACpB,QAASjF,QAAM,GACf,OAAAkF,EACA,UAAWlF,QAAM,UACjB,SAAAA,EAAA,SACA,EAEM,IAAM,CACZiF,GAAW,aAAajF,EAAA,MAAM,EAAE,CACjC,CACD,CAAC,EAED+B,GAAQ,IAAM,CACT/B,EAAA,MAAM,QACTwG,GAAQ,IAAM,CAIXvE,EAAE+B,CAAO,IACX6C,EAAW,EACX7G,EAAA,MAAM,YAASA,EAAA,KAAA,EAChB,CAAC,CAEH,CAAC,EAKD+B,GAAQ,IAAM,CACT,CAAC/B,EAAA,MAAM,QAAU,CAACA,EAAA,MAAM,SAAOiC,EAAI+B,CAAO,GAC7CwC,GAAQ,IAAM,CACbxE,EAAAgC,EAAU,EAAK,EACfhC,EAAAkC,GAAW,EAAK,EAChBlC,EAAAmC,EAAW,EAAK,EAChBnC,EAAAiC,EAAU,EAAK,EACfjC,EAAAyC,EAAiB,IAAI,EACrBzC,EAAA0C,EAAoB,IAAI,EACxBa,GAAe,KACfvD,EAAAuC,GAAgB,IAAI,EACpBtC,EAAAuC,CAAQ,GAAE,MAAM,eAAe,kBAAkB,EACjDvC,EAAAuC,CAAQ,GAAE,MAAM,eAAe,kBAAkB,EACjD,aAAasC,EAAS,EACtBxC,IAAgBgB,EAAQ,EACnBrD,EAAA8E,EAAkC,GACtCC,GAAU,EAEX/B,GAAW,UAAU,CACpB,QAASjF,QAAM,GACf,SAAQqE,CAAa,EACrB,UAAWrE,QAAM,UACjB,SAAAA,EAAA,SACA,CACF,CAAC,CAEH,CAAC,EAED,MAAMoH,EAAyDC,GAAU,CACxE,GAAEpF,EAAE+D,EAAQ,EAAE,OAEdhE,EAAAuC,GAAgB,IAAI,KAAM,EAAA,EAC1BvC,EAAAoC,IAAqBiC,CAAM,EAAA,EAAA,EAC3B,MAAMiB,EAASD,EAAM,OAGrBC,EAAO,kBAAkBD,EAAM,SAAS,EACpCC,EAAO,UAAY,WACvBtF,EAAAiC,EAAU,EAAI,EACdsB,GAAe,CAAE,EAAG8B,EAAM,QAAS,EAAGA,EAAM,OAAO,EACpD,EAEME,EAAsD,IAAM,CACjE,GAAItF,EAAAiC,EAAQ,GAAI,CAACjC,EAAA4C,EAAW,EAAE,OAE9BU,GAAe,KACf,MAAMiC,EAAe,OACpBvF,EAAAuC,CAAQ,GAAE,MACR,iBAAiB,kBAAkB,EACnC,QAAQ,KAAM,EAAE,GAAK,CAAA,EAElBiD,EAAe,OACpBxF,EAAAuC,CAAQ,GAAE,MACR,iBAAiB,kBAAkB,EACnC,QAAQ,KAAM,EAAE,GAAK,CAAA,EAElBkD,EACL,IAAI,KAAI,EAAG,QAAO,GAAMzF,EAAAsC,EAAa,GAAE,QAAO,GAAM,GAE/CoD,GACL1F,EAAAwC,CAAc,IAAK,IAAM+C,EAAeC,EACnCG,GAAW,KAAK,IAAID,EAAW,EAAID,EAWzC,IALCzF,EAAAwC,CAAc,IAAK,IAChBxC,EAAAwD,EAAe,EAAC,SAAS+B,EAAe,EAAI,QAAU,MAAM,EAC5DvF,EAAAwD,EAAe,EAAC,SAASgC,EAAe,EAAI,SAAW,KAAK,KAK9D,KAAK,IAAIE,EAAW,GAAKvF,IAAmBwF,GAAW,KACvD,CACD5F,EAAAoC,IAAqBiC,CAAM,EAAA,EAAA,EAC3BrG,EAAA,MAAM,YAASA,EAAA,KAAA,EAEXiC,EAAAwC,CAAc,IAAK,IACtBzC,EAAA0C,EAAoB8C,EAAe,EAAI,QAAU,OAAM,EAAA,EAEvDxF,EAAA0C,EAAoB+C,EAAe,EAAI,OAAS,KAAI,EAAA,EAGrDZ,EAAW,EACX7E,EAAAkC,GAAW,EAAI,EACf,MACD,MACCjC,EAAAuC,CAAQ,GAAE,MAAM,YAAY,mBAAoB,KAAK,EACrDvC,EAAAuC,CAAQ,GAAE,MAAM,YAAY,mBAAoB,KAAK,EAEtDxC,EAAAmC,EAAW,EAAK,EAChBnC,EAAAiC,EAAU,EAAK,EACfjC,EAAAyC,EAAiB,IAAI,CACtB,EAEMoD,EAAyDR,GAAU,CAKxE,GAJI,CAAC9B,IAAgB,CAACtD,EAAA4C,EAAW,IAG/B,OAAO,aAAY,GAAI,WAAW,QAAU,IAAM,EACjC,OAEnB,MAAMiD,EAAST,EAAM,QAAU9B,GAAa,EACtCwC,GAASV,EAAM,QAAU9B,GAAa,EAGxC,CAACtD,EAAAwC,CAAc,SAAU,IAAIsD,EAAM,EAAI,GAAK,KAAK,IAAID,CAAM,EAAI,IAClE9F,EAAAyC,EAAiB,KAAK,IAAIsD,EAAM,EAAI,KAAK,IAAID,CAAM,EAAI,IAAM,IAAG,EAAA,EAGjE,IAAIH,GAAc,CAAE,EAAG,EAAG,EAAG,CAAC,EAE9B,GAAI1F,EAAAwC,CAAc,IAAK,KAEtB,GACCxC,EAAAwD,EAAe,EAAC,SAAS,KAAK,GAC9BxD,EAAAwD,EAAe,EAAC,SAAS,QAAQ,EAEjC,GACCxD,EAACwD,EAAe,EAAC,SAAS,KAAK,GAAKqC,EAAS,GAC5C7F,EAAAwD,EAAe,EAAC,SAAS,QAAQ,GAAKqC,EAAS,EAEhDH,GAAY,EAAIG,MACV,CAEN,MAAME,GAAgBF,EAASjF,GAAaiF,CAAM,EAElDH,GAAY,EACX,KAAK,IAAIK,EAAa,EAAI,KAAK,IAAIF,CAAM,EACtCE,GACAF,CACL,UAES7F,EAAAwC,CAAc,IAAK,MAG5BxC,EAAAwD,EAAe,EAAC,SAAS,MAAM,GAC/BxD,EAAAwD,EAAe,EAAC,SAAS,OAAO,GAEhC,GACCxD,EAACwD,EAAe,EAAC,SAAS,MAAM,GAAKsC,GAAS,GAC7C9F,EAAAwD,EAAe,EAAC,SAAS,OAAO,GAAKsC,GAAS,EAE/CJ,GAAY,EAAII,OACV,CAEN,MAAMC,GAAgBD,GAASlF,GAAakF,EAAM,EAElDJ,GAAY,EACX,KAAK,IAAIK,EAAa,EAAI,KAAK,IAAID,EAAM,EACtCC,GACAD,EACL,EAIE,KAAK,IAAIJ,GAAY,CAAC,EAAI,GAAK,KAAK,IAAIA,GAAY,CAAC,EAAI,IAC5D3F,EAAAmC,EAAW,EAAI,EAGhBlC,EAAAuC,CAAQ,GAAE,MAAM,YAAY,mBAAoB,GAAGmD,GAAY,CAAC,IAAI,EACpE1F,EAAAuC,CAAQ,GAAE,MAAM,YAAY,mBAAoB,GAAGmD,GAAY,CAAC,IAAI,CACrE,EAEMM,EAAiD,IAAM,CAC5DjG,EAAAiC,EAAU,EAAK,EACfjC,EAAAyC,EAAiB,IAAI,EACrBc,GAAe,IAChB,EAEM2C,EAAI7E,EAAe,IACpBrD,EAAA,MAAM,KAAaA,QAAM,KACzBiC,EAAAgB,CAAS,IAAK,UAAiBjD,EAAA,YAC/BiC,EAAAgB,CAAS,IAAK,QAAejD,EAAA,UAC7BiC,EAAAgB,CAAS,IAAK,UAAiBjD,EAAA,YAC/BiC,EAAAgB,CAAS,IAAK,OAAcjD,EAAA,SAC5BiC,EAAAgB,CAAS,IAAK,UAAiBjD,EAAA,YAC5B,IACP,EAoBD,IAAAmI,EAAAC,GAAA,EAAArI,EAAAoI,EAAA,WACU,CAAC,SADX,IAAAE,GAAAhJ,EAAA8I,CAAA,cA4CE,IAAAG,EAAAnJ,GAAA,EAAAoJ,EAAAlJ,EAAAiJ,CAAA,4BAAA1I,EAAA0I,CAAA,SAAAvI,EAAAuI,EAAA,aAAAtI,EAAA,oBAAA,EAAAD,EAAAuI,EAAA,gBAAArG,EAEe+D,EAAQ,CAAA,EAFvBnG,GAAAyI,EAAA,EAAAxI,EAAA,WASOoD,GAAGjB,IAAO,GAAE,YAAajC,EAAA,OAAO,SAAS,WAAW,CAAC,IAT5DwI,GAAA,QAAAF,EAIS,IAAM,CACVrG,EAAA+D,EAAQ,GAAI,CAAC/D,EAAA4C,EAAW,IAC5BgC,EAAW,EACX7G,EAAA,MAAM,YAASA,EAAA,KAAA,EAChB,CAAC,EARDL,EAAAH,EAAA8I,CAAA,YADGrG,EAAAoD,EAAW,GAAI,CAACrF,EAAA,MAAM,WAAaiC,GAAS,IAAK,WAAajC,EAAA,YAAc,MAAIyI,EAAAC,EAAA,qCAiB5EC,EAAStF,EAAA,IAAGrD,QAAM,SAAS,6CAClC4I,GAASpJ,GAAAqJ,GAAA,IAAK7I,EAAA,MAAM,2BAA4B6G,CAAW,CAAA,CAAA,iDAG1D,IAAAzH,GAAG0J,GAAA,EAAHC,EAAA1J,EAAAD,EAAI,oGAID4J,GAAUxJ,GAAA,EAAA,sBAEFuD,EAAWvD,EAAA,aAHhBQ,EAAA,MAAM,KAAIyI,GAAAQ,EAAA,EAAAR,GAAAS,GAAA,EAAA,oBAMNnG,EAAWvD,CAAA,WAPhByC,EAAAgB,CAAS,IAAK,UAASwF,EAAAU,EAAA,EAMlBnJ,EAAA,MAAM,SAAOyI,EAAAW,GAAA,CAAA,oHAKpBC,GAAU7J,GAAA,EAAA,+RADPQ,EAAA,MAAM,KAAIyI,GAAAa,EAAA,EAELrH,EAAAgB,CAAS,IAAK,mBAEdhB,EAAAgB,CAAS,IAAK,QAAOwF,GAAAc,GAAA,CAAA,EAErBtH,GAAS,IAAK,UAASwG,GAAAe,GAAA,CAAA,EAEvBvH,EAAAgB,CAAS,IAAK,QAAMwF,GAAAgB,GAAA,CAAA,sBAT1BxH,EAAAgB,CAAS,IAAK,WAASwF,EAAAiB,EAAA,IAX5B9J,EAAAR,EAAI,EAAJuK,EAAA7J,GAAAD,GAAAT,GAAG,EAAAU,CAAA,EAAA,QAAqBoD,GAAGjB,IAAO,GAAE,KAAMjC,EAAA,OAAO,SAAS,IAAI,CAAC,IAA/DL,EAAAH,EAAAJ,EAAI,eADS,GAAIY,EAAA,MAAM,MAAQA,EAAA,MAAM,UAAYA,EAAA,MAAM,OAAS,OAASiC,EAAAiG,CAAI,IAAK,MAAQlI,EAAA,MAAM,OAAKyI,EAAAmB,EAAA,IA2BtG,IAAAnK,GAAAoK,EAAAC,EAAA,CAAA,EAICC,GAAA1K,EAJDI,EAAA,EAICuK,GAAA3K,EAAA0K,EAAA,oDAMUE,GAAK5G,EAAA,IAAGrD,QAAM,KAAK,8CAC1BkK,GAAK1K,GAAAqJ,GAAA,IAAK7I,EAAA,MAAM,cAAc,CAAA,iCAE9B2J,EAAA,IAAAQ,GAAAC,GAAApK,EAAA,MAAM,KAAK,CAAA,qBAJR,OAAOA,EAAA,MAAM,OAAU,SAAQyI,GAAA4B,EAAA,EAAA5B,GAAA6B,GAAA,EAAA,sBADhCtK,EAAA,MAAM,OAAKyI,EAAA8B,EAAA,IAJhB3K,EAAAmK,EAAA,EAAA,IAAAS,GAAAX,EAAAE,GAAA,CAAA,cAcC,IAAAU,GAAAC,GAAA,EAAAC,EAAAtL,EAAAoL,EAAA,qBAUSG,GAAWvH,EAAA,IAAGrD,QAAM,WAAW,8CACtC6K,GAAWrL,GAAAqJ,GAAA,IAAK7I,EAAA,MAAM,cAAc,CAAA,iCAEpC2J,EAAA,IAAAQ,GAAAW,GAAA9K,EAAA,MAAM,WAAW,CAAA,qBAJd,OAAOA,EAAA,MAAM,aAAgB,SAAQyI,GAAAsC,EAAA,EAAAtC,GAAAuC,GAAA,EAAA,IAT1CpL,EAAA6K,EAAA,EAAAd,EAAA7J,IAAAD,GAAA4K,GAAA,EAAA3K,EAAA,EAAA,CAEO,IAAAmL,GAAA/H,GACNQ,EAAgB,EAAAzB,EAChB8C,EAAqB,EACrB9C,EAAAkB,EAAO,GAAE,YACTnD,EAAA,MAAM,SAAS,WAAA,CACf,IAPDL,EAAAH,EAAAiL,EAAA,YADGzK,EAAA,MAAM,aAAWyI,EAAAyC,EAAA,IAjBtBtL,EAAAH,EAAA,EAAA,IAAA0L,GAAAtB,EAAApK,GAAA,CAAA,mGAsCE2L,GAAY5L,GAAA,EAAA,qBAEZ,IAAA6L,EAAAC,GAAA,EAAAC,GAAAC,GAAAH,EAAA,EAAA,YAAAA,EAGOrL,EAAA,MAAM,mBAAqBuD,EAAiB,CAAA,EAHnD1D,GAAAwL,EAAA,EAAAvL,EAAA,QAeCE,EAAA,MAAM,OAAO,KAAK,WAXZkD,GACNjB,IAAO,GAAE,aACTjC,EAAA,OAAO,SAAS,YAAA,CAChB,eAPDqL,EAQUhE,IAAU,CACd3F,GAAS1B,QAAM,MAAM,GACrBiC,EAAA4C,EAAW,IAChB7E,EAAA,MAAM,QAAQ,UAAUqH,EAAK,EAC7BR,EAAW,EACZ,CAAC,EAbDlH,EAAAH,GAAA6L,CAAA,YADQ3J,GAAS1B,EAAA,MAAM,MAAM,CAAC,WAF3B,OAAOA,EAAA,MAAM,QAAW,WAAUyI,GAAAgD,EAAA,EAAAxJ,EAAAyJ,EAAA,GAAAjD,GAAAkD,GAAA,CAAA,sBADnC3L,EAAA,MAAM,QAAMyI,EAAAmD,EAAA,oHAyBdC,GAAYrM,GAAA,EAAA,qBAEZ,IAAAsM,EAAAC,GAAA,EAAAC,GAAAR,GAAAM,EAAA,EAAA,YAAAA,EAEO9L,EAAA,MAAM,mBAAqByD,EAAiB,CAAA,EAFnD5D,GAAAiM,EAAA,EAAAhM,EAAA,QAcCE,EAAA,MAAM,OAAO,KAAK,WAXZkD,GACNjB,IAAO,GAAE,aACTjC,EAAA,OAAO,SAAS,YAAA,CAChB,eAND8L,EAOUzE,IAAU,CACd3F,GAAS1B,QAAM,MAAM,IAC1BA,EAAA,MAAM,QAAQ,QAAQqH,EAAK,EACvB,CAAAA,GAAM,kBACVR,EAAW,EACZ,CAAC,EAZDlH,EAAAH,GAAAsM,CAAA,YADQpK,GAAS1B,EAAA,MAAM,MAAM,CAAC,WAF3B,OAAOA,EAAA,MAAM,QAAW,WAAUyI,GAAAwD,EAAA,EAAAhK,EAAAiK,EAAA,GAAAzD,GAAA0D,GAAA,CAAA,sBADnCnM,EAAA,MAAM,QAAMyI,EAAA2D,EAAA,eA3DhBvM,GAAAJ,GAAA,EAAAK,CAAA,EAICD,GAAAkK,GAAA,EAAA3G,EAAA,WAFMF,GAAGjB,IAAO,GAAE,QAASjC,EAAA,OAAO,SAAS,OAAO,CAAC,SAI5CkD,GAAGjB,IAAO,GAAE,MAAOjC,EAAA,OAAO,SAAS,KAAK,CAAC,qBArC9CA,EAAA,MAAM,UAASyI,EAAA4D,EAAA,EAAA5D,EAAA6D,GAAA,EAAA,IA3DpB1M,EAAAuI,CAAA,KAAAA,EAAAoE,GAAAvK,EAEWwC,WAAAA,CAAQ,CAAA,cAFnB3E,GAAAsI,EAAA,EAAArI,CAAA,EAAAC,EAAAoI,EAAA,YAWWnI,EAAA,MAAM,UAAY,YAAc,QAAQ,IAXnDmI,EAAA,mBAckBnI,EAAA,MAAM,YAAc4D,GAAiB,IAdvDuE,EAAA,cAea,EAAEnI,EAAA,MAAM,WAAaA,EAAA,MAAM,UAAY2D,EAAQ,EAAC,EAf7D5D,EAAAoI,EAAA,eAAAlG,EAgBc8B,CAAO,CAAA,EAhBrBhE,EAAAoI,EAAA,eAAA/E,CAAA,EAAArD,EAAAoI,EAAA,cAAAlG,EAkBakC,CAAQ,CAAA,EAlBrBpE,EAAAoI,EAAA,eAAAlG,EAmBc+B,CAAO,CAAA,EAnBrBjE,EAAAoI,EAAA,eAAAlG,EAoBc2C,CAAS,CAAA,IApBvBuD,EAAA,kBAqBiBlG,EAAAuD,EAAM,EAAC,CAAC,CAAC,IArB1B2C,EAAA,kBAsBiBlG,EAAAuD,EAAM,EAAC,CAAC,CAAC,EAtB1BzF,EAAAoI,EAAA,aAAAnI,EAAA,KAAA,EAAAD,EAAAoI,EAAA,aAAAlG,EAwBY0C,CAAO,CAAA,EAxBnB5E,EAAAoI,EAAA,eAAAlG,EAyBcgC,CAAO,CAAA,EAzBrBlE,EAAAoI,EAAA,mBAAAlG,EA0BkB4C,EAAW,CAAA,EA1B7B9E,EAAAoI,EAAA,YAAAlG,EA2BWgB,CAAS,CAAA,EA3BpBlD,EAAAoI,EAAA,cAAAlG,EA4Ba8D,EAAM,CAAA,EA5BnBhG,EAAAoI,EAAA,iBAAAlG,EA6BgBiC,EAAQ,CAAA,EA7BxBnE,EAAAoI,EAAA,uBAAAlG,EA8BsByC,CAAiB,CAAA,EA9BvC3E,EAAAoI,EAAA,gBAAAqE,CAAA,EAAAC,GAAAC,GAAAvE,EAqCO,GAAGnI,EAAU,KAAK,IAAIA,EAAA,MAAM,KAAK,GAAEyM,GAAA,6CAHzB,YAAAxH,GAAW,OAAO,OAAMjF,EAAA,MACzB,WAAA,GAAGiC,EAAA+B,CAAO,EAAA/B,EAAGmC,CAAkB,EAAAnC,EAAGoE,CAAM,CAAA,KAChC,mBAAArG,EAAA,gBAAkB,OAAS,GAAAiC,EAAGoC,CAAa,CAAA,gBAjC5DnB,GACNlD,EAAU,MAAKiC,EACf6C,EAAU,EACV7C,EAAAkB,EAAO,GAAE,MACTnD,EAAA,OAAO,SAAS,MAChBiC,EAAAkB,EAAO,IAAAlB,EAAGgB,CAAS,CAAA,EACnBjD,EAAA,OAAO,UAAOiC,EAAGgB,CAAS,CAAA,CAAA,CAC1B,MAOa,EAAQjD,EAAA,MAAM,QAcb,IAAA,GAAQA,EAAA,UAAaA,EAAA,iBAAAiC,EAAmB8B,CAAO,KA/B9DyE,GAAA,cAAAL,EAsCeN,CAAiB,EAtChCW,GAAA,YAAAL,EAuCaZ,CAAe,EAvC5BiB,GAAA,cAAAL,EAwCef,CAAiB,EAxChCuF,GAAA,UAAAxE,EAyCWF,CAAa,EAzCxBtI,EAAAH,EAAA2I,CAAA,MAnBO,gcCrfP,IAAAyE,EAAAlN,GAAA,EAAAC,EAAAH,EAAAoN,CAAA,sXCAA,IAAAA,EAAAlN,GAAA,EAAAC,EAAAH,EAAAoN,CAAA,imCCAA,IAAAA,EAAAlN,GAAA,EAAAC,EAAAH,EAAAoN,CAAA,ydCAA,IAAAA,EAAAlN,GAAA,EAAAC,EAAAH,EAAAoN,CAAA,+VCAA,IAAAA,EAAAlN,GAAA,EAAAC,EAAAH,EAAAoN,CAAA,ECEA,MAAMC,GAAwB,EAGxBC,GAAkB,OAGlBC,GAAyB,OAGzB7K,GAAiB,IAGjB8K,GAAc,IAGd7K,GAAM,GAEN8K,GAAO,OACPC,GAAQ,QAad,SAASC,GACRC,EACAC,EACC,CACD,MAAMZ,EAAS,CAAA,EAEf,OAACW,EAAeC,CAAY,EAAE,QAAQ,CAAChH,EAAQiH,IAAU,CACxD,MAAMC,EAAWD,IAAU,EACrBE,EAASD,EAAW,kBAAoB,WACxCE,EAAeF,EAClBR,GACAD,GAEH,SAASY,EAAUrH,EAAyB,CAC3C,CAAC,MAAO,QAAS,SAAU,MAAM,EAAE,QAASsH,GAAQ,CACnDlB,EAAO,GAAGe,CAAM,IAAIG,CAAG,EAAE,EACxB,OAAOtH,GAAW,SAAW,GAAGA,CAAM,KAAOA,CAC/C,CAAC,CACF,CAEI,OAAOA,GAAW,UAAY,OAAOA,GAAW,SACnDqH,EAAUrH,CAAM,EACN,OAAOA,GAAW,SAC5B,CAAC,MAAO,QAAS,SAAU,MAAM,EAAE,QAASsH,GAAQ,CACnD,MAAMC,EAAQvH,EAAOsH,CAAG,EACpBC,IAAU,OACbnB,EAAO,GAAGe,CAAM,IAAIG,CAAG,EAAE,EACxBF,EAEDhB,EAAO,GAAGe,CAAM,IAAIG,CAAG,EAAE,EACxB,OAAOC,GAAU,SAAW,GAAGA,CAAK,KAAOA,CAE9C,CAAC,EAEDF,EAAUD,CAAY,CAExB,CAAC,EAEMhB,CACR,0mBAGD,UAoBC,SAASoB,EAAgBC,EAAW,CACnC,OAAIA,IAAM,SAAiBA,EACvB,OAAO,OAAW,KAEpB,OAAO,YACP,OAAO,WAAW,8BAA8B,EAAE,QAE3Cb,GAMFC,EACR,CAEA,IAECnH,EAAMvC,GAAAxD,EAAA,SAAA,EAAG,EAAK,EACdyC,oBAAW,cAAc,EACzBsL,EAAMvK,GAAAxD,EAAA,SAAA,GAAA,IAAG,CAAC,SAAU,MAAM,CAAC,EAC3BgO,kBAAS,EAAK,EACd3I,uBAAc,EAAK,EACnBgB,kBAASyG,EAAe,EACxBO,wBAAeN,EAAsB,EACrCkB,iBAAQ,OAAO,EACfC,sBAAa,EAAK,EAClB5I,oBAAWpD,EAAc,EACzBiM,0BAAgBtB,EAAqB,EACrCuB,8BAAe,CAAA,EAAE,EACjBC,eAAM,MAAM,EACZxK,eAAM1B,EAAG,EAETmM,iCAAwB,EAAK,EAO7BC,+BAAqB,eAAe,EAEpCC,gCAAuB,aAAa,EASjCC,EAAAC,GAAA1O,EAAA2O,EAAA,EAGJ,SAASC,GAA4C,CACpD,GAAIP,EAAG,IAAK,OAAQ,OAAOA,EAAG,EAE9B,GADI,OAAO,OAAW,KAClB,OAAO,SAAa,IAAa,MAAO,MAE5C,MAAMQ,EAAe,SAAS,gBAAgB,aAC7C,KAAI,EAGL,OAAIA,IAAiB,QAAU,CAACA,GAC/BrI,GACC,IACE6H,EACC,OAAO,iBAAiB,SAAS,eAAe,EAC/C,WAAqC,KAAK,CAAA,EAExCA,EAAG,IAGX7H,GAAQ,IAAO6H,EAAMQ,CAAY,CAAC,EAC3BA,EACR,CAIA,MAAMC,EAAczL,EAAA,IACnBrD,EAAA,GACGiF,GAAW,OAAO,OAAQ8J,GAAUA,EAAM,YAAS/O,EAAA,EAAO,EAC1DiF,GAAW,OAAO,OAAQ8J,GAAU,CAACA,EAAM,SAAS,CAAA,EAGlDC,EAAiB3L,EAAA,IACtB,MAAM,KACL,IAAI,IACH,CACCZ,EAAQ,EACR,GAAGR,KACD,OAAQ8M,GAAUA,EAAM,QAAQ,EAChC,IAAKA,GAAUA,EAAM,QAAQ,CAC/B,EAAC,OAAO,OAAO,CAAA,CACjB,CACA,EAGF,IAAIE,EAAWnN,EAAO,EAAK,EACvBoN,GAAcpN,EAAO,EAAK,EAC1BqN,GAAcrN,KAAO+L,EAAgBI,EAAK,CAAA,CAAC,CAAA,EAC3CmB,GAAUtN,EAAM,MAAA,EAChBuN,EAAwBvN,EAA2B,IAAI,EACvDwN,GAAgBxN,EAAO,EAAK,EAC5ByN,GAAqD,KAEzD,MAAMC,GAAWnM,EAAA,IAChB0K,EAAM,EAAC,KAAK,GAAG,EAAE,QAAQ,OAAQ,EAAE,EAAE,QAAQ,SAAU,EAAE,CAAA,EAG1DhM,GAAQ,IAAM,CACTE,EAAA6M,CAAc,EAAC,QAAU,GAC5B9M,EAAAiN,EAAW,EAAK,CAElB,CAAC,EAGDlN,GAAQ,IAAM,CACb,MAAM0N,EAAkBxN,EAAA6M,CAAc,EAAC,OACrCC,GAAUA,EAAM,SAAW,CAACA,EAAM,MAAA,EAGpC,GAAIU,EAAgB,OAAS,EAAG,CAC/B,MAAMC,EAAgBzK,GAAW,OAAO,IAAK8J,GACtBU,EAAgB,KACpCE,IAAiBA,GAAa,KAAOZ,EAAM,EAAA,EAIrC,CAAE,GAAGA,EAAO,OAAQ,EAAI,EAGzBA,CACP,EACD9J,GAAW,OAASyK,CACrB,CACD,CAAC,EAED3N,GAAQ,IACA,IAAM,CACRE,EAAAmN,EAAO,GAAAnN,EAAIoN,CAAqB,IACnCpN,EAAAoN,CAAqB,EAAC,MAAM,CAAE,cAAe,EAAI,CAAE,EACnDrN,EAAAqN,EAAwB,IAAI,EAC5BrN,EAAAsN,GAAgB,EAAK,EAEvB,CACA,EAEDnI,GAAQ,IAqBArG,GAAG,SAAU,UApBGuG,GAAyB,CACvB0G,IAAO,MAC7BJ,IAEAtG,EAAesG,EAAG,GAAKtG,EAAM,OAASsG,EAAA,IAGvC3L,EAAAiN,EAAW,EAAI,EACfhN,EAAAmN,EAAO,GAAE,MAAK,GAId/H,EAAM,OAAS,oBACL,kBAAkB+H,EAAO,GAClCnN,IAAO,GAAE,SAAS,SAAS,aAAa,IAEzCD,EAAAiN,EAAW,EAAK,CAElB,CAE4C,CAC5C,EAEDlN,GAAQ,IAAM,CAKb,GAJIkM,EAAK,IAAK,UACbjM,EAAAmN,GAAclB,GAAK,EAGhB,OAAO,OAAW,IAAa,CAC9BA,EAAK,IAAK,WAEZ,OAAO,YACP,OAAO,WAAW,8BAA8B,EAAE,QAElDjM,EAAAmN,GAAclC,EAAI,EAElBjL,EAAAmN,GAAcjC,EAAK,GAIrB,MAAM0C,EAAiB,OAAO,WAC7B,8BAA6B,EAGxBC,EAAgB,CAAC,CAAE,QAAAC,KAAmC,CACvD7B,EAAK,IAAK,UACdjM,EAAAmN,GAAcW,EAAU7C,GAAOC,GAAK,EAAA,CACrC,EAEI,qBAAsB0C,EACzBA,EAAe,iBAAiB,SAAUC,CAAa,EAGvDD,EAAe,YAAYC,CAAa,CAE1C,CACD,CAAC,EAED,MAAME,GAAmD1I,GAAU,CAClErH,EAAA,SAASqH,CAAK,EAEbpF,EAAAqN,EAAa,GACb,CAACjI,EAAM,cAAc,SAASA,EAAM,aAAa,IAEjDrF,EAAAsN,GAAgB,EAAK,EACnBrN,EAAEoN,CAAqB,IACxBpN,EAAAoN,CAAqB,EAAC,MAAM,CAAE,cAAe,EAAI,CAAE,EACnDrN,EAAAqN,EAAwB,IAAI,GAG/B,EAEMW,GAAoD3I,GAAU,CACnErH,EAAA,UAAUqH,CAAK,EAEd,EAAAA,EAAM,kBAAkB,aACxBA,EAAM,OAAO,QAAQ,cAAgB,WAIjCpF,EAAAqN,EAAa,IACjBtN,EAAAsN,GAAgB,EAAI,EACpBtN,EAAAqN,EAAwBhI,EAAM,cAAa,EAAA,GAE7C,EAEMD,GACLC,GACI,CACJrH,EAAA,gBAAgBqH,CAAK,EAEpB,EAAAA,EAAM,kBAAkB,aACxBA,EAAM,OAAO,QAAQ,cAAgB,UAGtCrF,EAAAkN,GAAc,EAAI,CACnB,EAEMe,GAAyD5I,GAAU,CACxErH,EAAA,eAAeqH,CAAK,EACpBkI,GAAoB,CAAE,EAAGlI,EAAM,QAAS,EAAGA,EAAM,OAAO,EACxDrF,EAAAiN,EAAW,EAAI,CAChB,EAEMiB,GAAyD7I,GAAU,CACxErH,EAAA,eAAeqH,CAAK,EAMpB,MAAM8I,EAAkB,CAAE,EAAG9I,EAAM,QAAS,EAAGA,EAAM,OAAO,EACtD+I,EACL,CAACb,IACD,KAAK,IAAIY,EAAgB,EAAIZ,GAAkB,CAAC,EAAI,GACpD,KAAK,IAAIY,EAAgB,EAAIZ,GAAkB,CAAC,EAAI,EAEjD,CAACtN,EAAAiN,EAAW,GAAIkB,GACnBpO,EAAAiN,EAAW,EAAK,CAElB,EAEMoB,GAAwDhJ,GAAU,CACvErH,EAAA,cAAcqH,CAAK,EACnBkI,GAAoB,CAAE,EAAGlI,EAAM,QAAS,EAAGA,EAAM,OAAO,EACxDrF,EAAAiN,EAAW,EAAI,CAChB,EAEMhH,GAAqDZ,GAAU,CACpErH,EAAA,YAAYqH,CAAK,EACjBrF,EAAAiN,EAAW,EAAK,CACjB,EAEM1H,GAA0DF,GAAU,CACzErH,EAAA,cAAcqH,CAAK,EACnBrF,EAAAkN,GAAc,EAAK,CACpB,EAEAzN,GAAc,IAAI,IAAI6O,EAAa,EAKnC,IAAAC,GAAApR,GAAA,EAAAY,EAAAwQ,GAAA,WAEU,EAAE,EAFZ,IAAAlQ,GAAAhB,EAAAkR,EAAA,8BAQQC,GAAAxN,EAAA,GAAA,IAAAf,EAAA+M,CAAiB,EAAIvM,IAAiBA,OAAjBA,GAAQ6K,GAAAmD,KAAA,qBAC3B,CAAC/N,EAAGC,CAAC,EAAIF,GAAS,MAAM,GAAG,EAA1B,MAAA,CAAA,EAAAC,EAAG,EAAAC,CAAC,IACL+N,QAAevD,GAAgB9G,EAAM,EAAEgH,EAAY,CAAA,CAAC,EACpDsD,EAAWtN,EAAA,IAClB4B,GAAW,QAAQ,KACjBC,GACAA,EAAO,YAASlF,EAAA,IAAWkF,EAAO,WAAazC,EAAA,GAC9C,QAAU,CAAC,EAGd,IAAAmO,EAAAlR,GAAA,KAAAkR,OACU,SAAA,sEAKSzB,EAAW,yBACb,yBACA,EAkBV,MAAAnP,EAAU,aACT+P,WACCC,gBACKC,eACDI,gBACCH,aACHjI,iBACIb,eACFG,MACTkH,QA1BwB,uBAAA,GAAAxM,EAAG0O,CAAW,CAAA,KAC3B,UAAA,GAAG3D,EAAW,KAChB,QAAA,GAAGnJ,EAAG,CAAA,oBACC5B,EAAAyO,CAAY,EAAC,cAAc,mBACzBzO,EAAAyO,CAAY,EAAC,gBAAgB,oBAC5BzO,EAAAyO,CAAY,EAAC,iBAAiB,kBAChCzO,EAAAyO,CAAY,EAAC,eAAe,wBACtBzO,EAAAyO,CAAY,EAAC,qBAAqB,0BAChCzO,EAAAyO,CAAY,EACxC,uBAAsB,2BAEOzO,EAAAyO,CAAY,EACzC,wBAAuB,yBAEIzO,EAAAyO,CAAY,EACvC,sBAAqB,KAtBjB,CAAA,IAAA9B,EAAoB,CAAE,GAF3B4B,GAAAI,EAAA,GAAA,IAqCO3O,EAAA6M,CAAc,EAAC,OAAQC,GAAW,CAACA,EAAM,UAAY9M,EAAAqL,EAAK,IAAK,GAAMyB,EAAM,WAAatM,EAAQ,EAAKsM,GAAcA,EAAM,MAApBA,EAAKzB,GAAAuD,KAAA,QA6BrGC,GAAWtR,IAAA,iGAIlBuR,GAAWvR,CAAA,YADHQ,EAAA,YAAAyI,EAAAuI,CAAA,EAAAhR,EAAA,cAAoB,MAAIyI,EAAAC,GAAA,CAAA,cAKzBuI,GAASzR,IAAA,+FAIhB0R,GAAS1R,CAAA,YADDQ,EAAA,UAAAyI,EAAA4D,CAAA,EAAArM,EAAA,YAAkB,MAAIyI,EAAAQ,GAAA,CAAA,cAKvBkI,GAAW3R,IAAA,iGAIlB4R,GAAW5R,CAAA,YADHQ,EAAA,YAAAyI,EAAAU,CAAA,EAAAnJ,EAAA,cAAoB,MAAIyI,EAAAW,GAAA,CAAA,cAKzBiI,GAAQ7R,IAAA,8FAIf8R,GAAQ9R,CAAA,YADAQ,EAAA,SAAAyI,EAAAa,CAAA,EAAAtJ,EAAA,WAAiB,MAAIyI,EAAA8I,GAAA,CAAA,cAKtBC,EAAShS,IAAA,+FAIhBiS,GAASjS,CAAA,YADDQ,EAAA,UAAAyI,EAAAc,CAAA,EAAAvJ,EAAA,YAAkB,MAAIyI,EAAAe,GAAA,CAAA,0BA3DvB4E,EAAY,GAAE,UAAY9I,GAAQ,UACrC8I,EAAY,GAAE,OAAS,EAAE,WACdA,EAAY,GAAE,kBAAoB,EAAE,WAGzCA,EAAY,GAAE,aAAe/I,GAAW,WAI9C+I,EAAY,GAAE,OAAS,EAAE,WACvBA,EAAY,EAAC,SAAW,CAAA,CAAE,WACzBA,EAAY,EAAC,UAAY,EAAK,WACrBA,EAAY,GAAE,mBAChC,EAAE,WACgBA,EAAY,GAAE,mBAChC,EAAE,WACmBA,EAAY,GAAE,sBACnCI,GAAoB,EArBrBkD,GAAAlS,EAAA,sBACC8N,EAAK,wBACLyB,CAAK,kCACab,EAAU,iHAI5BnI,EAAM,8BACNoI,GAAa,8DAEbe,EAAW,yBACXzM,qBACAoB,EAAG,wOAUamK,EAAM,2BACtBiB,CAAQ,sFAERX,EAAqB,2CAGZ,YAAAwC,GAQA,UAAAG,GAQA,YAAAE,GAQA,SAAAE,GAQA,UAAAG,qFAlGZ5R,EAAAgR,CAAA,KAAAA,EAAArE,GAAAvK,EAGWoN,YAAAA,EAAO,CAAA,EAHlBzF,EAAA,IAAAiH,EAAA,IAAAA,EAAA,GAAA,EAAAjR,EAAAH,GAAAoR,CAAA,qBAXE3O,EAAA6M,CAAc,EAAC,OAAS,GAACrG,EAAAgB,CAAA,IAP9B7J,EAAA2Q,EAAA,UAAAA,GAAA,aAAA,GACahC,GAAkB,WAAGiB,EAAW,GAAA,EAAA,EAAA,CAAA,EAD7C7P,EAAAH,EAAA+Q,EAAA,MAJO,+VC/XR,UAcC,IAGCoB,EAAKnO,GAAAxD,EAAA,QAAA,EAAG,IAAI,EACZ4R,2BAAkB,EAAK,EACvBC,EAAIrO,GAAAxD,EAAA,OAAA,EAAG,EAAK,EAOTiP,EAAWnN,EAAMgQ,GAACF,EAAe,GAAI,EAAK,CAAA,EAE1CG,EAAkBjQ,EAAMgQ,GAACF,EAAe,GAAI,EAAK,CAAA,EAErD,SAASI,GAAS,CACjBhQ,EAAAiN,EAAW,CAAChN,EAAAgN,CAAQ,CAAA,EAChBhN,EAAAgN,CAAQ,GAAI,CAAChN,GAAe,GAC/BD,EAAA+P,EAAkB,EAAI,EAEvB/R,EAAA,iBAAAiC,EAAiBgN,CAAQ,CAAA,CAC1B,CAEA,MAAMgD,EAAY5O,EAAA,IAAYwO,EAAI,IAAGE,CAAe,EAAG,EAAI,MAG3D7S,EAAG4J,GAAA,QACF,IAAAR,IADDpJ,CAAG,EAEDgT,IADD5J,CAAM,WACL4J,EAAY,OAAAlS,EAAA,IAAA,CAAA,KAAZkS,EAAY,EAAA,4BAAA,EACZ,IAAAC,KADAD,EAAY,CAAA,OACZC,GAAI,EAAA,MAAJA,GAAI,CAAA,aAEH,IAAAC,EAAI1S,GAAA,EAAJoL,EAAAU,GAAA4G,EAAI,EAAA,aAAgBT,EAAK,CAAA,CAAA,EAAzBhS,EAAAH,EAAA4S,CAAK,WADFT,EAAK,GAAI,MAAIlJ,EAAAuI,CAAA,QAGjBqB,EAAQxI,EAAAxJ,EAAA,CAAA,EAARsJ,EAAA,IAAA2I,GAAAD,EAAQ,OACFpQ,EAAAgN,CAAQ,EAAG,mBAAqB,mBAAmB,CAAA,KADzDoD,EAAQ,EAAA,wBAAA,IANT/J,CAAM,WAANA,EAAM,CAAA,aAaL,IAAAlJ,EAAGD,GAAA,EAAHkJ,EAAAhJ,EAAAD,CAAI,uBAAJQ,EAAAR,CAAI,EAAJO,EAAAH,EAAAJ,CAAI,YADD6C,EAAAgN,CAAQ,KAAIgD,CAAY,GAAAxJ,EAAAC,CAAA,MAb7BxJ,CAAG,cAAHA,EAAG,EAAA,2BAAA,KAAAiE,EAAA,CAAA,SAAAlB,EAAAgN,CAAA,CAAA,CAAA,kBACFzG,GAAA,QAAAF,EAAyC0J,CAAM,MADhD9S,CAAG,MAFI,o1BCvCR,UAYC,IAAIqT,EAAoBzQ,EAAsB,IAAI,EAG9C0Q,EAAc1Q,EAAO,CAAC,EACtB2Q,EAAgB3Q,EAAO,CAAC,EACxB4Q,EAAY5Q,EAAO,EAAK,EAE5B,eAAe6Q,EAAkBC,EAAc,CAC9C,MAAM,MAAM,iBAAiB,mBAAkB5S,EAAA,SAAA,CAAW,qBAAqB,mBAAmB4S,CAAI,CAAC,GAAI,CAC1G,OAAQ,QAAO,CACf,EACG3Q,EAAAsQ,CAAiB,IAAKK,GACzB5Q,EAAAuQ,EAAoB,IAAI,CAE1B,CAEA,SAASM,EAAUD,EAAc,CAChC5Q,EAAAuQ,EAAoBK,EAAI,EAAA,CACzB,CAEA,SAASE,GAAa,CACrB9Q,EAAAuQ,EAAoB,IAAI,EACxBQ,GAAU,CACX,CAEA,SAASC,EAAYJ,EAAsB,CAC1C,OAAOA,EAAK,MAAM,GAAG,EAAE,IAAG,GAAMA,CACjC,CAEA,SAASK,EAAiBC,EAAe,CACxClR,EAAAwQ,EAAcU,EAAE,QAAQ,CAAC,EAAE,QAAO,EAAA,EAClClR,EAAAyQ,IAAgBD,CAAW,EAAA,EAAA,EAC3BxQ,EAAA0Q,EAAY,EAAI,CACjB,CAEA,SAASS,EAAgBD,EAAe,CAClCjR,EAAAyQ,CAAS,GACd1Q,EAAAyQ,EAAgBS,EAAE,QAAQ,CAAC,EAAE,QAAO,EAAA,CACrC,CAEA,SAASE,GAAiB,CACzB,GAAI,CAACnR,EAAAyQ,CAAS,EAAE,OACDzQ,EAAAwQ,CAAa,IAAGD,CAAW,EAC7B,MACZM,EAAU,EAEXC,GAAU,CACX,CAEA,SAASA,IAAa,CACrB/Q,EAAA0Q,EAAY,EAAK,EACjB1Q,EAAAwQ,EAAc,CAAC,EACfxQ,EAAAyQ,EAAgB,CAAC,CAClB,CAEA,MAAMY,EAAWhQ,EAAA,IAAYpB,EAAAyQ,CAAS,EAAG,KAAK,IAAI,EAAGzQ,EAAAwQ,CAAa,EAAAxQ,EAAGuQ,CAAW,CAAA,EAAI,CAAC,oBAGrFc,GAAAjT,EAAA,2DAGO,OAAAL,EAAA,YAAY,0DAGjBuT,GAAC7T,GAAA,OAAD6T,EAAC,cAEDrU,GAAGwL,GAAA,KAAHxL,GAAG,GAAA,IAAAc,EAAA,YAAA,CACmBwT,GAAUjU,IAAKiU,GAAW,KAAO,IAAMjU,EAAC,CAAAC,GAAxCgU,IAAU,CAC9B,IAAApU,GAAG0J,GAAA,EACFR,GAAAjJ,EADDD,EAAI,EAMFqU,GAAAjI,GALDlD,EAAA,EAAAD,GAAAwB,EAAAvB,GAAA,CAAA,EAWAoL,GAAArL,GAAA,oDAIS,QAAA,IAAMsK,EAAkB1Q,EAAAuR,CAAU,EAAC,IAAI,oDAG/CtB,GAAY/S,GAAA,KAAZ+S,GAAY,OAAA,WAAA,OAAZA,EAAY,0BAnBdtS,EAAAR,EAAI,iBACHW,EAAAuI,GAAA,QAAAxI,EAAA,EAKCC,EAAA0T,GAAA,MAAA,yBAAArQ,IAAA,EAAA,EAAA,EAAArD,EAAA0T,GAAA,MAAAjH,EAAA,IAFM,IAAAwG,EAAY/Q,EAAAuR,CAAU,EAAC,IAAI,EAGL,IAAA,mBAAmBvR,EAAAuR,CAAU,EAAC,IAAI,EACzD,IAAAR,EAAY/Q,EAAAuR,CAAU,EAAC,IAAI,IAPjChL,GAAA,QAAAF,GAES,IAAMuK,EAAU5Q,EAAAuR,CAAU,EAAC,IAAI,CAAC,EAH1C7T,EAAAH,GAAAJ,EAAI,MAFNF,EAAG,OAAHA,EAAG,YAHAc,EAAA,YAAY,SAAW,EAACyI,GAAAuI,CAAA,EAAAvI,GAAAkL,EAAA,EAAA,4DAkC5B,IAAAlU,EAAAmU,GAAA,EAQC7J,EAAA1K,EARDI,CAAA,EAgBEoU,EAAAxU,EARD0K,CAAA,EAcCU,EAAGZ,EANHgK,EAAA,CAAA,EAMAC,EAAAzU,EAAAoL,CAAI,EACHiJ,GAAAI,EAAA,uCAGUZ,GAAMA,EAAE,SAAWA,EAAE,eAAiBJ,EAAU,kDAGzDT,GAAY0B,EAAAC,EAAA,EAAZ1B,GAAAD,GAAY,OAAA,WAAA,sDAGbqB,GAAAO,GAAA,yCAGS,IAAMtB,EAAiB1Q,EAACsQ,CAAiB,CAAA,kDAGjD2B,GAAYH,EAAAI,EAAA,EAAZ7B,GAAA4B,GAAY,OAAA,YAAA,wCAhBdtU,EAAA6K,CAAI,MAqBJ2J,GAAGvK,EArBHY,EAAG,CAAA,EAsBF4J,GAAYhV,EADb+U,EAAI,EACH9B,GAAA+B,GAAY,OAAA,wBAAA,QADbzU,EAAAwU,EAAI,EAnCLxU,EAAAmK,CAAA,EARDnK,EAAAH,CAAA,aAQCiN,GAAA3C,EAAA,yBAAA9H,EAE8BoR,CAAW,GAAA,EAAA,KAAA,EAMxCtT,EAAA8T,EAAA,MAAA,yBAAA/T,GAAA,EAAA,EAAA,EAAAC,EAAA8T,EAAA,MAAAzQ,EAAA,QAC4B,mBAAkBnB,EAACsQ,CAAiB,CAAA,MAC3DS,EAAW/Q,EAACsQ,CAAiB,CAAA,IAlBpC/J,GAAA,QAAA/I,EAEUyT,GAAMA,EAAE,SAAWA,EAAE,eAAiBJ,GAAY,eAF5DrT,EAGYyT,GAAMA,EAAE,MAAQ,UAAYJ,GAAY,EAKnDtK,GAAA,aAAAuB,EAGckJ,CAAgB,EAH9BzK,GAAA,YAAAuB,EAIaoJ,CAAe,EAJ5B3K,GAAA,WAAAuB,EAKYqJ,CAAc,EAb3BzT,EAAAH,EAAAC,CAAA,aADG8S,CAAiB,GAAA9J,EAAAC,EAAA,eAxCd,6DC5DD,SAAS4L,GAAwBC,EAAiC,CACxE,OAAOA,IAAS,iBAAmBA,IAAS,MAC7C,CAEO,SAASC,GAAqBD,EAAiC,CACrE,OAAOA,IAAS,SAAWA,IAAS,MACrC,CAEA,IAAIE,GACAC,GAEJ,MAAMC,OAAa,IAEnB,SAASC,GAAWC,EAA8B,CACjD,MAAMC,EAASH,GAAO,IAAIE,CAAK,EAC/B,GAAIC,EAAQ,OAAOA,EACnB,MAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAQA,EAAO,OAAS,GAC/B,MAAM1T,EAAU0T,EAAO,WAAW,IAAI,EACtC,GAAI,CAAC1T,EAAS,OAAO,KACrBA,EAAQ,UAAY,UACpBA,EAAQ,UAAA,EACRA,EAAQ,IAAI,GAAI,GAAI,GAAI,EAAG,KAAK,GAAK,CAAC,EACtCA,EAAQ,KAAA,EACRA,EAAQ,UAAY,QACpBA,EAAQ,KAAO,OAAOwT,EAAM,OAAS,EAAI,GAAK,EAAE,2BAChDxT,EAAQ,UAAY,SACpBA,EAAQ,aAAe,SACvBA,EAAQ,SAASwT,EAAO,GAAI,EAAE,EAC9B,MAAMG,EAAMD,EAAO,UAAU,WAAW,EACxC,OAAAJ,GAAO,IAAIE,EAAOG,CAAG,EACdA,CACR,CAGO,SAASC,GAAgBtD,EAAqB,CACpD,GAAIA,GAAS,EAAG,CACf,GAAI,CAAC+C,GAAc,OACnBA,GAAa,OAAA,EACbA,GAAe,OACXD,IAAiB,SAAS,KAAK,OAAOA,EAAe,EACzDA,GAAkB,OAClB,MACD,CACA,MAAMS,EAAQN,GAAWjD,EAAQ,EAAI,KAAO,OAAOA,CAAK,CAAC,EACpDuD,IACAR,KACJD,GAAkB,SAAS,cAA+B,kBAAkB,GAAK,OACjFA,IAAiB,OAAA,EACjBC,GAAe,SAAS,cAAc,MAAM,EAC5CA,GAAa,IAAM,OACnBA,GAAa,KAAO,YACpB,SAAS,KAAK,OAAOA,EAAY,GAElCA,GAAa,KAAOQ,EACrB,CAEA,IAAIC,GAMG,SAASC,IAAgC,CAC3C,OAAO,aAAiB,MAC5BD,KAAU,IAAI,aACVA,GAAM,QAAU,WACfA,GAAM,SAAS,MAAM,IAAM,CAAC,CAAC,EACnC,CAOA,MAAME,GAA+E,CACpF,WAAY,CACX,CAAC,OAAQ,CAAC,EACV,CAAC,OAAQ,GAAI,CAAA,EAEd,YAAa,CACZ,CAAC,IAAK,CAAC,EACP,CAAC,QAAS,EAAG,EACb,CAAC,IAAK,GAAI,EACV,CAAC,QAAS,GAAI,CAAA,CAEhB,EAEO,SAASC,GAAsBC,EAAwC,CAC7E,GAAI,CAACJ,IAASA,GAAM,QAAU,UAAW,OACzC,MAAMK,EAAML,GAAM,YAClB,SAAW,CAACM,EAAMC,CAAE,IAAKL,GAAME,CAAI,EAAG,CACrC,MAAMI,EAAMR,GAAM,iBAAA,EACZS,EAAOT,GAAM,WAAA,EACnBQ,EAAI,KAAO,OACXA,EAAI,UAAU,MAAQF,EACtBG,EAAK,KAAK,eAAe,EAAGJ,EAAME,CAAE,EACpCE,EAAK,KAAK,wBAAwB,IAAMJ,EAAME,EAAK,GAAI,EACvDE,EAAK,KAAK,6BAA6B,KAAOJ,EAAME,EAAK,GAAI,EAC7DC,EAAI,QAAQC,CAAI,EAAE,QAAQT,GAAM,WAAW,EAC3CQ,EAAI,MAAMH,EAAME,CAAE,EAClBC,EAAI,KAAKH,EAAME,EAAK,EAAG,CACxB,CACD,CCrGO,SAASG,IAAiC,CAChD,GAAI,CAAC,OAAO,gBAAiB,MAAO,6DACpC,MAAMC,EAAM,mBAAmB,KAAK,UAAU,SAAS,EACjDC,EAAa,OAAO,WAAW,4BAA4B,EAAE,QACnE,OAAID,GAAO,CAACC,EAAmB,6GAC3B,EAAE,kBAAmB,YAAc,EAAE,gBAAiB,SAAW,OAAO,aAAiB,IACrF,gCAED,IACR,CAMA,SAASC,IAA6C,CACrD,OAAO,QAAQ,KAAK,CACnB,UAAU,cAAc,MACxB,IAAI,QAAe,CAAC1W,EAAG2W,IACtB,WAAW,IAAMA,EAAO,IAAI,MAAM,kEAAkE,CAAC,EAAG,GAAM,CAAA,CAC/G,CACA,CACF,CAGA,eAAsBC,IAAwD,CAC7E,OAAQ,MAAMF,MAAU,YAAY,gBAAA,CACrC,CAGA,eAAsBG,GAAaC,EAA4D,CAC9F,MAAMC,EAAM,MAAM,MAAM,mCAAmC,mBAAmBD,EAAa,QAAQ,CAAC,EAAE,EACtG,OAAKC,EAAI,IACA,MAAMA,EAAI,KAAA,GAAmC,OADlC,IAErB,CAEA,SAASC,GAAMC,EAA4C,CAC1D,MAAMC,GAAUD,EAAY,IAAI,QAAQ,EAAKA,EAAU,OAAS,GAAM,CAAC,GAAG,QAAQ,KAAM,GAAG,EAAE,QAAQ,KAAM,GAAG,EAC9G,OAAO,WAAW,KAAK,KAAKC,CAAM,EAAIC,GAAMA,EAAE,WAAW,CAAC,CAAC,CAC5D,CAGA,eAAeC,GAAO9D,EAAc+D,EAAS,MAAOC,EAA4B,CAC/E,MAAMP,EAAM,MAAM,MAAMzD,EAAM,CAC7B,OAAA+D,EACA,QAASC,IAAS,OAAY,OAAY,CAAE,eAAgB,kBAAA,EAC5D,KAAMA,IAAS,OAAY,OAAY,KAAK,UAAUA,CAAI,CAAA,CAC1D,EACKC,EAAQ,MAAMR,EAAI,OAAO,MAAM,IAAM,IAAI,EAC/C,GAAI,CAACA,EAAI,GAAI,MAAM,IAAI,MAAMQ,GAAM,OAAS,uBAAuBR,EAAI,MAAM,EAAE,EAC/E,OAAOQ,CACR,CAGA,eAAsBC,GAAWV,EAAgCW,EAAyC,CACzG,OAAQ,MAAML,GAA4B,yBAA0B,OAAQ,CAAE,GAAGN,EAAa,OAAA,EAAU,OAAAW,CAAA,CAAQ,GAAG,MACpH,CAOA,eAAsBC,GAAUD,EAA+C,CAE9E,MAAME,EAAQP,GAA2B,WAAW,EAEpD,GADAO,EAAM,MAAM,IAAM,CAAC,CAAC,EACf,MAAM,aAAa,kBAAA,IAAyB,UAChD,MAAM,IAAI,MAAM,uFAAuF,EAExG,MAAMtJ,EAAM2I,IAAO,MAAMW,GAAO,SAAS,EACnCC,GAAW,MAAMlB,GAAA,GAAU,YACjC,IAAII,EAAe,MAAMc,EAAQ,gBAAA,EACjC,MAAMC,EAAQf,GAAc,QAAQ,qBACpC,OAAIA,IAAiB,CAACe,GAAS,CAACC,GAAU,IAAI,WAAWD,CAAK,EAAGxJ,CAAG,KACnE,MAAMyI,EAAa,YAAA,EACnBA,EAAe,MAEhBA,IAAiB,MAAMc,EAAQ,UAAU,CAAE,gBAAiB,GAAM,qBAAsBvJ,EAAK,EAC7F,MAAMmJ,GAAWV,EAAcW,CAAM,EAC9BX,CACR,CAEA,SAASgB,GAAU,EAAeC,EAAwB,CACzD,OAAO,EAAE,SAAWA,EAAE,QAAU,EAAE,MAAM,CAACC,EAAG/X,IAAM+X,IAAMD,EAAE9X,CAAC,CAAC,CAC7D,CAEA,eAAsBgY,GAAYnB,EAA+C,CAChF,MAAMM,GAAI,yBAA0B,SAAU,CAAE,SAAUN,EAAa,QAAA,CAAU,EAAE,MAAM,IAAM,CAAC,CAAC,EACjG,MAAMA,EAAa,YAAA,CACpB,CAEA,eAAsBoB,GAAapB,EAA+C,CACjF,MAAMM,GAAI,iBAAkB,OAAQ,CAAE,SAAUN,EAAa,SAAU,CACxE,u0ECxGA,UAwBC,MAAMqB,EAAa,GAEbC,EAAmB,uDAKzB3V,GAAQ,IAAM4V,GAAW,WAAW,EAEpC,MAAMC,EAAQC,GAAiBC,IAAc,EACvCC,EAAYlZ,GAAiB,EAE7BmZ,EAAO3U,EAAA,IAAYsU,GAAW,OAAO,EACrCM,EAAK5U,EAAA,IAAYsU,GAAW,KAAK,EACjCO,EAAK7U,EAAA,IAAYsU,GAAW,KAAK,EACjCQ,EAAK9U,EAAA,IAAY+U,GAAa,WAAW,EAY/C,SAASC,EAAWxD,EAAuB,CAC1C,MAAMzK,EAAOyK,EAAM,YAAW,EAC9B,GAAIzK,EAAK,SAAS,SAAS,EAAG,MAAO,KACrC,MAAMkO,EAAQlO,EAAK,MAAM,kCAAkC,IAAI,CAAC,EAChE,OAAIkO,EAAcA,EAAM,MAAM,EAAG,CAAC,EAC9BlO,EAAK,SAAS,MAAM,EAAU,KAC3BA,EAAK,QAAQ,YAAa,EAAE,EAAE,MAAM,KAAK,EAAE,CAAC,CACpD,CAEA,MAAMmO,EAAMlV,EAAe,IAAM,CAChC,MAAMmV,EAAe,CAAA,EACrB,UAAWC,KAASxW,EAAAgW,CAAK,GAAE,UAAYhW,EAAAgW,CAAK,EAAC,OAAS,GACrDO,EAAI,KAAK,CACR,IAAKC,EAAM,KACX,IAAKJ,EAAWI,EAAM,KAAK,EAC3B,QAASA,EAAM,QAGf,MAAOC,GAASD,EAAM,QAAQ,EAAE,MAChC,MAAO,GAAGA,EAAM,KAAK,KAAK,KAAK,MAAMA,EAAM,OAAO,CAAC,IACnD,EAEF,MAAME,EAA0C,CAC/C,CAAC,MAAO,MAAO1W,EAAAkW,CAAK,EAAC,GAAG,EACxB,CAAC,MAAO,MAAOlW,EAAAkW,CAAK,EAAC,GAAG,CACxB,EACGlW,GAAK,EAAC,UAAY,GAAG0W,EAAO,KAAK,CAAC,OAAQ,MAAO1W,GAAK,EAAC,IAAI,CAAC,EAChE,SAAW,CAAC0L,EAAKiL,EAAKC,CAAO,IAAKF,EACjCH,EAAI,KAAK,CACR,IAAA7K,EACA,IAAAiL,EACA,QAAAC,EACA,MAAOH,GAASI,GAAmBD,CAAO,CAAC,EAAE,MAC7C,MAAO,GAAGD,EAAI,YAAW,CAAE,KAAK,KAAK,MAAMC,CAAO,CAAC,IACnD,EAEF,OAAOL,CACR,CAAC,EAED,SAASO,EAAO1S,EAAwB,CACvC,OAAOuR,EAAM,KAAK,IAAG,EAAKvR,EAAS,KAAU,CAC9C,CAGA,MAAM2S,GAAK3V,EAAe,IAAM,CAC/B,GAAI,CAACpB,EAAA+V,CAAO,EAAE,MAAO,CAAA,EACrB,MAAMiB,EAAS,IAAI,IAAIhX,EAAA+V,CAAO,EAAC,KAAK,IAAKtM,GAAM,CAACA,EAAE,KAAMA,EAAE,OAAO,CAAC,CAAC,EAC7D8M,EAA6C,CAAA,EACnD,QAASjZ,EAAIkY,EAAa,EAAGlY,GAAK,EAAGA,IAAK,CACzC,MAAM2Z,EAAOH,EAAOxZ,CAAC,EACrBiZ,EAAI,KAAK,CAAE,KAAAU,EAAM,KAAMD,EAAO,IAAIC,CAAI,GAAK,EAAG,CAC/C,CACA,OAAOV,CACR,CAAC,EAEKW,EAAI9V,EAAA,IAAY,KAAK,IAAI,KAAM,GAAGpB,EAAA+W,EAAK,EAAC,IAAKtN,GAAMA,EAAE,IAAI,CAAC,CAAC,EAE3D0N,EAA0E,CAC/E,CAAE,MAAO,MAAO,MAAO,MAAO,MAAO,mCAAqC,EAC1E,CAAE,MAAO,gBAAiB,MAAO,SAAU,MAAO,6DAA+D,EACjH,CAAE,MAAO,QAAS,MAAO,QAAS,MAAO,8CAAgD,EACzF,CAAE,MAAO,OAAQ,MAAO,OAAQ,MAAO,iCAAkC,CACzE,EAGD,IAAIC,EAAevX,EAAsB,IAAI,EAE7CC,GAAQ,IAAM,CAEZuS,GAAwBgF,GAAY,gBAAgB,GACpD,OAAO,aAAiB,KACxB,aAAa,aAAe,WAE5BtX,EAAAqX,EAAe,0FAA0F,CAC3G,CAAC,EACD,IAAIE,EAAazX,EAAO,EAAK,EAE7B,eAAe0X,GAAW5L,EAAwC,CAGjE,GAFA5L,EAAAqX,EAAe,IAAI,EACf7E,GAAqB5G,CAAK,GAAGwH,GAAuB,EACpDd,GAAwB1G,CAAK,EAAG,CACnC,GAAI,CAAC,OAAO,gBAAiB,CAC5B5L,EAAAqX,EACC,mGAAmG,EACpG,MACD,CACA,GAAI,OAAO,aAAiB,IAAa,CACxCrX,EAAAqX,EAAe,mEAAmE,EAClF,MACD,CACArX,EAAAuX,EAAa,EAAI,EACjB,GAAI,CACH,GAAI,MAAO,aAAa,kBAAiB,IAAQ,UAAW,CAC3DvX,EAAAqX,EAAe,0FAA0F,EACzG,MACD,CACD,MAAQ,CACPrX,EAAAqX,EAAe,qEAAqE,EACpF,MACD,QAAC,CACArX,EAAAuX,EAAa,EAAK,CACnB,CACD,CACAD,GAAY,iBAAmB1L,CAChC,CAIA,IAAI6L,EAAU3X,EAAgC,IAAI,EAC9C4X,EAAa5X,EAAMgQ,GAAa,CAAE,SAAU,GAAM,KAAM,EAAI,CAAE,CAAA,EAC9D6H,EAAW7X,EAAO,EAAK,EAEvB8X,EAAW9X,EAAkD,IAAI,EACrE,MAAM+X,EAAc,OAAO,OAAW,IAAc,KAAOhE,GAAe,EAE1E9T,GAAQ,IAAM,CACT8X,IACE,SAAY,CACjB,MAAMC,EAAM,MAAM5D,GAAmB,EAG/Ba,EAAS+C,EAAM,MAAM3D,GAAa2D,CAAG,EAAI,KAC/C9X,EAAAyX,EAAU1C,EAAS+C,EAAM,KAAI,EAAA,EACzB/C,GAAQ/U,EAAA0X,EAAa3C,EAAM,EAAA,CAChC,KAAK,MAAM,IAAM,CAAC,CAAC,CACpB,CAAC,EAED,eAAegD,EAAWC,EAAkD,CAC3EhY,EAAA2X,EAAW,EAAI,EACf3X,EAAA4X,EAAW,IAAI,EACf,GAAI,CACH,MAAMK,EAAO,MAAMD,EAAG,EAClBC,GAAMjY,EAAA4X,EAAW,CAAE,KAAMK,EAAM,QAAS,EAAK,EAAE,EAAA,CACpD,OAASC,EAAK,CACblY,EAAA4X,EAAW,CAAE,KAAMM,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,EAAG,QAAS,EAAM,IAAA,CACrF,QAAC,CACAlY,EAAA2X,EAAW,EAAK,CACjB,CACD,CAEA,SAASQ,GAAQrZ,EAA4B,CAC5C,OAAOiZ,EAAW,SAAY,CACzBjZ,GAAM,CAACmB,GAAO,EAAED,EAAAyX,EAAU,MAAMzC,GAAS/U,EAACyX,CAAU,GAAC,EAAA,EAChD,CAAC5Y,GAAEmB,EAAIwX,CAAO,IACtB,MAAMlC,GAAWtV,EAACwX,CAAO,CAAA,EACzBzX,EAAAyX,EAAU,IAAI,EAEhB,CAAC,CACF,CAEA,SAASW,GAAazM,EAAuBC,EAA+B,CAC3E,MAAMkM,EAAG7X,EAAGwX,CAAO,EACnB,OAAKK,EACEC,EAAW,SAAY,CAC7B/X,EAAA0X,EAAa,MAAM5C,GAAWgD,EAAK,CAAE,GAAA7X,EAAGyX,CAAU,EAAE,CAAC/L,CAAG,EAAGC,CAAK,CAAE,EAAC,EAAA,CACpE,CAAC,EAHgB,QAAQ,QAAO,CAIjC,CAEA,SAASyM,IAA0B,CAClC,MAAMP,EAAG7X,EAAGwX,CAAO,EACnB,OAAKK,EACEC,EAAW,UACjB,MAAMvC,GAAasC,CAAG,EACf,2CACP,EAJgB,QAAQ,QAAO,CAKjC,KASA5a,EAAGob,GAAA,EACFC,KADDrb,CAAG,OACFqb,EAAC,kBAECpI,EAAIhT,GAAA,KAAJgT,EAAI,GAAA,IAAAlQ,EACGsW,CAAM,EAAIiC,GAAOA,EAAM,IAAG,CAAAhb,EAAhBgb,IAAK,CACpB,IAAApI,EAAI1S,GAAA,EACH+a,EAAIpb,EADL+S,CAAK,EACJtH,GAAAU,GAAAiP,CAAK,EACLC,GAAI7Q,EADJ4Q,EAAI,CAAA,EAEHE,GAAAnP,GADDkP,EAAK,EAMLE,GAAI/Q,EANJ6Q,GAAI,CAAA,EAMJnP,GAAAC,GAAAoP,GAAI,EAAA,EARLhb,EAAAwS,CAAK,aAALrS,EAAAqS,EAAI,QAAoBnQ,EAAAuY,CAAK,EAAC,KAAK,EAClC9N,GAAA+N,EAAI,UAA4BxY,EAAAuY,CAAK,EAAC,OAAK,EAAA,EAAA,sBAC3Cza,EAAA2a,GAAI,aAAsCzY,EAAAuY,CAAK,EAAC,KAAK,KACpDG,GAAA,WAAAvX,GAAA,EAAA,kBAE0EnB,EAAAuY,CAAK,EAAC,OAAK,EAAA,EAAA,EAGpErQ,GAAAoB,GAAAtJ,EAAAuY,CAAK,EAAC,GAAG,IAPoB,IAAA,KAAK,MAAMvY,EAAAuY,CAAK,EAAC,OAAO,EAItD,IAAA,KAAK,IAAI,IAAK,KAAK,IAAI,EAAGvY,EAAAuY,CAAK,EAAC,OAAO,CAAC,IAL1D7a,EAAAH,EAAA4S,CAAK,MAFPD,CAAI,MAAJA,CAAI,YADDlQ,EAAAsW,CAAM,EAAC,OAAS,GAAC9P,EAAAuI,EAAA,+BAkBpB,IAAA6J,EAAInQ,GAAA,EAKHoQ,EAAIzb,EALLwb,CAAK,EAMHE,EAAI1b,EADLyb,CAAK,EACJ9O,EAAAR,GAAAuP,EAAI,EAAA,EACJC,EAAInR,EADJkR,EAAI,CAAA,EACJE,GAAAzP,GAAAwP,EAAI,EAAA,EAFLpb,EAAAkb,CAAK,MAILI,GAAIrR,EAJJiR,EAAI,CAAA,KAIJI,GAAI,GAAA,IAAAjZ,EACG+W,EAAK,EAAImC,IAAKA,GAAI,KAAI,CAAA3b,GAAb2b,KAAG,CACjB,IAAAC,GAAItS,GAAA,EACHuS,GAAA7P,GADD4P,EAAK,YAALrb,EAAAqb,GAAI,QAAA,GAAuBnZ,EAAAkZ,EAAG,EAAC,MAAI,EAAA,KAAArb,GAAA,EAAA,EAAA,EAClC4M,GAAA2O,GAAA,WAAAjY,GAAA,EAAA,wBAAA,IADsC,IAAAkY,GAAMrZ,EAAAkZ,EAAG,EAAC,KAAM,EAAI,EAG1C,IAAA,KAAK,IAAI,EAAIlZ,EAAAkZ,EAAG,EAAC,KAAIlZ,EAAGkX,CAAI,EAAI,GAAG,IAHpDxZ,EAAAH,GAAA4b,EAAK,IAFPxb,EAAAsb,EAAK,QATNtb,EAAAib,CAAK,uCAMqB5Y,EAAAiW,CAAK,IAAK,KAAO,IAAMoD,GAAKrZ,EAACiW,CAAK,EAAE,EAAI,EACxC,IAAAjW,EAAA+V,CAAO,IAAK,KAAO,IAAMsD,GAAMrZ,EAAA+V,CAAO,EAAC,QAAS,EAAI,IAP9ErY,EAAAH,EAAAqb,CAAK,YADF5Y,EAAA+W,EAAK,EAAC,OAAS,GAACvQ,EAAAC,EAAA,MAlBrB6R,EAAC,MA8CDnb,KA9CAmb,GAAC,CAAA,EAgDA9a,GAAGoK,EAAAxK,EAFJD,EAAI,EAAD,CAAA,KAEFK,GAAG,GAAA,IACI2Z,EAASmC,GAAGA,EAAE,MAAK,CAAA/b,EAAV+b,IAAC,CACf,IAAAjT,EAAAgD,GAAA,QAAA,IAAAkQ,EAAAhQ,GAAAlD,EAAA,EAAA,SAAAvI,EAAAuI,EAAA,eAGcgR,GAAY,mBAAqBrX,EAAAsZ,CAAC,EAAC,KAAK,IAHtDjT,EAAA,QAKOrG,EAAAsZ,CAAC,EAAC,KAAK,EALdjT,EAAA,SAAArG,EAMUsX,CAAU,EANpBpW,EAAAtD,GAAAyI,EAAA,EAAA,gBAAA,KAAAnF,EAAA,CAAA,GAIUmW,GAAY,mBAAqBrX,EAAAsZ,CAAC,EAAC,KAAK,CAAA,EAKjDpR,GAAAqR,EAAAvZ,EAAAsZ,CAAC,EAAC,KAAK,IATR/S,GAAA,QAAAF,EAOS,IAAMkR,GAAWvX,EAAAsZ,CAAC,EAAC,KAAK,CAAC,EAPlC5b,EAAAH,EAAA8I,CAAA,IAFF1I,EAAAH,EAAI,EAFLG,EAAAR,EAAI,EAAJ,IAAAiJ,GAAAwB,EAAAzK,GAAG,CAAA,kBAmBFmU,EAACxH,GAAA,OAADwH,EAAC,EAAA,eAAuC8F,CAAY,CAAA,CAAA,MAApD9F,CAAC,cADE8F,CAAY,GAAA5Q,EAAA4D,EAAA,IAIhB,IAAAtC,GAAGF,EAAAxB,GAAA,CAAA,EAQFoC,GAAGZ,EAAAxK,EARJ0K,EAAI,EAAD,CAAA,EAQFyG,GAAA/F,GAAG,GAAA,IACI,CAAC,GAAO,EAAI,EAAK3J,GAAIA,EAAE,CAAAtB,EAANsB,IAAE,CACxB,IAAAuK,EAAAC,GAAA,QAAA,IAAAmQ,EAAAjQ,GAAAH,EAAA,EAAA,SAAAtL,EAAAsL,EAAA,eAGc,CAAC,CAACpJ,EAAAwX,CAAO,IAAK3Y,CAAE,EAH9BuK,EAAA,SAKUpJ,EAAA0X,CAAQ,GAAI,CAAC,CAACE,EALxB6B,EAAA7b,GAAAwL,EAAA,EAAA,gBAAA,KAAAqQ,EAAA,CAAA,GAIU,CAAC,CAACzZ,EAAAwX,CAAO,IAAK3Y,CAAE,CAAA,OAIzBA,EAAK,cAAgB,KAAK,IAR3B0H,GAAA,QAAA6C,EAMS,IAAM8O,GAAQrZ,CAAE,CAAC,EAN1BnB,EAAAH,EAAA6L,CAAA,IAFFzL,EAAA6K,EAAI,EARL7K,EAAAmK,EAAI,EAAJ,IAAAxB,GAAAsB,EAAAE,GAAG,CAAA,cAwBF,IAAA4R,EAAC/H,GAAA,EAADgI,EAAApQ,GAAAmQ,EAAC,EAAA,aAAsB9B,CAAW,CAAA,EAAlCla,EAAAH,EAAAmc,CAAE,SAEF,IAAAvH,EAAGhM,GAAA,EACFyT,EAAKxc,EADN+U,CAAI,EAEF0H,EAAAzc,EADDwc,CAAM,EACLE,GAAAD,CAAA,QADDlc,EAAAic,CAAM,MASNG,EAAKnS,EATLgS,EAAK,CAAA,EAUJI,EAAA5c,EADD2c,CAAM,EACLD,GAAAE,CAAA,QADDrc,EAAAoc,CAAM,MASNlQ,GAAMjC,EATNmS,EAAK,CAAA,EAVNpc,EAAAwU,CAAI,YAEF0H,EAES7Z,EAAAyX,CAAU,EAAC,QAAQ,EAF5BoC,EAAA,SAAA7Z,EAGU0X,CAAQ,KAMlBsC,EAESha,EAAAyX,CAAU,EAAC,IAAI,EAFxBuC,EAAA,SAAAha,EAGU0X,CAAQ,EAKnB7N,cAAmD6N,CAAQ,IAjB1DnR,GAAA,SAAAsT,EAIW5I,IAAMkH,GAAa,WAAYlH,GAAE,cAAc,OAAO,CAAC,EAKlE1K,GAAA,SAAAyT,EAIW/I,IAAMkH,GAAa,OAAQlH,GAAE,cAAc,OAAO,CAAC,aAI/DpH,GAAsEuO,EAAQ,EAnB/E1a,EAAAH,EAAA4U,CAAI,YAHDyF,UAEKJ,CAAO,GAAAhR,EAAAU,EAAA,CAAA,6BAwBf,IAAA+S,EAACC,GAAA,EAADC,EAAA5Q,GAAA0Q,EAAC,EAAA,YAADA,OAASja,EAAA2X,CAAQ,EAAC,QAAU,iBAAmB,aAAa,EAAA,eAAA,EAAiBzP,GAAAiS,EAAAna,EAAA2X,CAAQ,EAAC,IAAI,IAA1Fja,EAAAH,EAAA0c,CAAE,aADCtC,CAAQ,GAAAnR,EAAAW,CAAA,IAIZ,IAAAiT,EAAGxS,EAAAiK,EAAA,CAAA,EACFwI,GAAKjd,EADNgd,CAAI,EAEFE,GAAAld,EADDid,EAAM,EACLP,GAAAQ,EAAA,QADD3c,EAAA0c,EAAM,EAAN,IAAArI,GAAApK,EAAAyS,GAAK,CAAA,cASJ,IAAAE,EAAKC,GAAA,EACJC,EAAArd,EADDmd,CAAM,EACLT,GAAAW,CAAA,QADD9c,EAAA4c,CAAM,WACLE,EAESpD,GAAY,SAAS,CAAA,EAF9B9Q,GAAA,SAAAkU,EAGWxJ,GAAOoG,GAAY,UAAYpG,EAAE,cAAc,OAAO,EAJlEvT,EAAAH,EAAAgd,CAAM,YADHzE,GAAStP,EAAAa,EAAA,IATd1J,EAAAyc,CAAI,IAzHLnd,CAAG,WACFqb,GAAC,QAAoCtY,EAAAgW,CAAK,GAAI,CAAChW,EAAAgW,CAAK,EAAC,UAAYP,EAAmB,MAAS,KA0H3F6E,GAESjD,GAAY,WAAW,IAFhC9Q,GAAA,SAAA+T,GAGWrJ,GAAOoG,GAAY,YAAcpG,EAAE,cAAc,OAAO,MA9HtEhU,CAAG,MARI,kmBCzNR,UAkBC,IAAIyd,EAAS7a,EAAiC,IAAI,EAC9C8a,EAAS9a,EAAiC,IAAI,EAC9CpC,EAAOoC,EAA2B,IAAI,EAE1C,MAAM+a,EAAIxZ,EAAA,IAAYyZ,GAAO9c,EAAA,EAAI+c,GAAY,QAASA,GAAY,IAAI,CAAC,EACjEC,EAAI3Z,EAAA,IAAYyZ,GAAO9c,EAAA,EAAI+c,GAAY,QAASA,GAAY,IAAI,CAAC,EAGjEE,EAAO5Z,EAAe,IAAM,CACjC,GAAI6Z,GAAW,OAAS,IAAK,MAAO,UACpC,GAAIA,GAAW,OAAS,IAAK,MAAO,UACpC,MAAMC,EAAM,KAAK,MAAMD,GAAW,MAAQ,GAAI,EAAI,GAClD,MAAO,GAAGC,CAAG,UAAU,IAAMA,CAAG,IACjC,CAAC,EAED,SAASC,EAAQC,EAA0C,CAC1D,OAAOA,IAAS,IAAGpb,EAAG0a,CAAM,IAAGC,CAAM,CACtC,CAEA,SAASU,EAAOC,EAAoD,CACnE,OAAIA,GAAUtb,EAAA0a,CAAM,GAAE,gBAAkBY,EAAe,IACnDA,GAAUtb,EAAA2a,CAAM,GAAE,gBAAkBW,EAAe,IAChD,IACR,CAGA,SAASC,GAAgB,CACxB,UAAWH,IAAQ,CAAC,IAAK,GAAG,EAAiB,CAC5C,MAAMI,EAAMJ,IAAS,IAAGrd,EAAA,EAAAA,EAAA,EACxBod,EAAQC,CAAI,GAAG,eAAe,YAC7B,CAAE,KAAM,mBAAoB,QAASH,GAAW,QAAUG,EAAM,KAAAA,EAAM,MAAOI,EAAI,OAAS,IAAM,EAChG,GACA,CACF,CACD,CAEA1b,GAAQ,IAAM,CACRmb,GAAW,MAChBM,EAAa,CACd,CAAC,EAED,SAASE,EAAUxK,EAAiB,CACnC,MAAMmK,EAAOC,EAAOpK,EAAE,MAAM,EAC5B,GAAI,CAACmK,EAAM,OACX,MAAMM,EAAMzK,EAAE,KACd,GAAI,GAACyK,GAAOA,EAAI,OAAS,mBACzB,OAAQA,EAAI,OAAM,CACjB,IAAK,QACJT,GAAW,SAASG,CAAI,EACxB,MACD,IAAK,cACJH,GAAW,SAASA,GAAW,MAAMG,CAAI,CAAC,EAC1C,MACD,IAAK,OACJH,GAAW,KAAI,EACf,MACD,IAAK,OACJA,GAAW,WAAWG,CAAI,EAC1B,MACD,IAAK,QACJH,GAAW,MAAMG,CAAI,EACrB,MACD,IAAK,QACJG,EAAa,EACb,KACF,CACD,CAGA,IAAII,EAAW9b,EAAO,EAAK,EAC3B,SAAS+b,GAAW3K,EAAiB,CACpC,GAAI,CAACjR,EAAAvC,CAAI,EAAE,OACX,MAAMoe,EAAO7b,EAAAvC,CAAI,EAAC,sBAAqB,EACjCqe,EAAMC,GAAcF,EAAK,MAC/BZ,GAAW,SAAS,KAAK,IAAI,EAAIa,EAAK,KAAK,IAAIA,GAAM7K,EAAE,QAAU4K,EAAK,MAAQA,EAAK,KAAK,CAAC,CAAC,CAC3F,CAGA,SAASG,EAAOZ,EAAgBnK,EAAc,CAC7CA,EAAE,eAAc,EAChB,MAAM9I,EAAO8I,EAAE,cAAc,QAAQ,yBAAyB,GAAK,GAC7DuK,EAAMS,GAAS9T,CAAI,EACzB8S,GAAW,SAAW,GAClBO,GAAKP,GAAW,OAAOG,EAAMI,EAAK,IAAI,CAC3C,CAEAtW,GAAQ,KACP,OAAO,iBAAiB,UAAWuW,CAAS,EACrC,IAAM,OAAO,oBAAoB,UAAWA,CAAS,EAC5D,EAGD,IAAAxe,EAAA0U,GAAA,eAMUuK,EAAI,GAACd,EAAce,GAAEX,GAAYW,GAAEpJ,GAAkBoJ,GAAEC,GAAgBD,UAC/E7N,EAAOxE,GAAA,kBAAPwE,CAAO,mDAGJ+N,EAAMnf,GAAA,KAANmf,EAAM/R,GAAAvK,EAAY2a,EAAMpQ,CAAA,EAAA,IAAAtK,EAAN0a,CAAM,CAAA,SAAxB5c,EAAAue,QAA+BtJ,IAAG,IAAlCsJ,EAAM,QAAqCb,GAAG,EAAC,MAAM,QAArDa,CAAM,UAEN,IAAAC,EAAMpf,GAAA,EAANqf,GAAAD,EAAMhS,GAAAvK,EAAY4a,EAAMrQ,CAAA,EAAA,IAAAtK,EAAN2a,CAAM,CAAA,WAAxB2B,QAA+BvJ,IAAG,EAAlCjV,EAAAwe,EAAM,QAAqCd,GAAG,EAAC,MAAM,IAArD9d,EAAAH,EAAA+e,CAAO,YAHJF,GAAK,IAAK,IAAG5V,EAAAuI,EAAA,EAAAvI,EAAAkL,GAAA,EAAA,sBAMjB,IAAAvU,GAAG0J,GAAA,EACFoJ,GAAY7S,EADbD,EAAI,KACH8S,GAAY,OAAA,oBAAA,KAAZA,GAAY,EAAA,eAAA,EACZ,IAAAqB,KADArB,GAAY,CAAA,EACTuM,KAAHlL,EAAC,EAAEzI,EAAAU,GAAAiT,GAAC,EAAA,SAAJlL,EAAC,EACD,IAAAjL,IADAiL,GAAC,CAAA,EAFF3T,EAAAR,EAAI,EAEGuK,EAAA,IAAAQ,GAAAW,EAAA2S,GAAG,EAAC,IAAI,CAAA,EACdjV,GAAA,QAAAF,EAA8B,IAAM4U,GAAW,MAAMG,EAAI,CAAA,CAAC,EAH3D1d,EAAAH,GAAAJ,EAAI,aAPD4V,GAAG,EAAAvM,GAAAC,EAAA,EAAAD,GAAAS,GAAA,EAAA,gCAeN,IAAAzJ,GAAAiL,GAAA,EAAAiC,GAAA,WAAAlN,GAIayT,IAAMA,GAAE,gBAAgB,YAJrCzT,GAKSyT,IAAM+K,EAAOZ,EAAI,EAAEnK,EAAC,CAAC,EAL9BvT,EAAAH,GAAAC,EAAA,aAFGyd,GAAW,UAAQzU,GAAA4D,EAAA,gCActB,IAAAtC,GAAGuB,GAAA,EAAH3L,EAAAH,GAAAuK,EAAI,eAFD6T,CAAQ,GAAAnV,GAAAQ,EAAA,MA1BbsH,CAAO,cAAPA,EAAO,EAAA,qBAAA,KAAAmL,GAAA,QAA4BwB,GAAW,OAAS,MAAQA,GAAW,OAASG,EAAI,SAAvF9M,CAAO,GAPT,IAAAuD,EAAAzU,EAAAH,CAAA,EAwCSif,EAAIrK,EAAA,IAAC,IAAG,IAAA9T,EAAA,EAAA,IAAAiC,EAAK4a,CAAI,MAAE,GAAG,EAC9B,IAAApS,GAAGZ,EAAAiK,EAAA,CAAA,QAAH,IAAAG,EAAA5U,EAAAoL,EAAI,EACHiU,GAAAzK,EAAA,wDAGQ4J,GACC,QAAA,IAAMX,GAAW,SAAS,EAAG,MAHtC,UAAK,kBAAL,SAAK3Q,EAAA,cAFN3M,EAAA6K,EAAI,EAAJ,IAAAX,EAAAD,EAAAY,GAAG,CAAA,EAQK0T,EAAIrU,EAAA,IAAC,IAAG,IAAA9J,EAAA,EAAA,IAAAiC,EAAK+a,CAAI,MAAE,GAAG,EAjD/Bpd,EAAAV,CAAA,KAAAA,EAAAqN,GAAAvK,EAIWtC,WAAAA,CAAI,CAAA,EAqCdiK,EAAA,IAAAgV,EAAA9e,GAAA4K,GAAG,EAAA,6BAAA,KAAAkU,EAAA,CAAA,OAAoCzB,GAAW,OAAS,IAAI,CAAA,CAAA,cAzChEhe,EAAA,EAAA,sBAAA,KAAAiE,EAAA,CAAA,SAEgB+Z,GAAW,QAAQ,CAAA,EAFnCxQ,GAAAxN,EAAA,0BAAA+C,EAG+Bgb,CAAO,GAAA,EAAA,EAAA,IAHtCtd,EAAAH,EAAAN,CAAA,MAFO,+BCtGR,UA6BC,MAAMqV,EAAIlR,EAAA,IAAYiW,GAAY,gBAAgB,EAG5CsF,EAAO,IAAI,IAEjB,SAASC,GAAiB,CACzB,UAAWC,KAAKF,EAAK,OAAM,EAAIE,EAAE,MAAK,EACtCF,EAAK,MAAK,CACX,CAEA,SAASG,GAAyB,CACjC,OAAO,SAAS,kBAAoB,WAAa,SAAS,SAAQ,CACnE,CAEA,SAASC,EAAY1X,EAAsB,CACrC2X,GAAK,YAAY,mBAAmB3X,CAAM,CAAC,EAAE,CACnD,CAEA,SAAS4X,EAAM,CAAE,QAASngB,EAAG,KAAAwW,CAAI,EAAwC,CACxE,MAAM4J,EAAUJ,EAAa,EAE7B,GAAII,GAAWnf,EAAA,QAAQ,KAAM8N,GAAMA,IAAM/O,EAAE,aAAe+O,IAAM/O,EAAE,EAAE,EAAG,OAEnEyV,GAAoBvS,EAACsS,CAAI,IAAGe,GAAsBC,IAAS,aAAe,aAAe,WAAW,EAExG,MAAM6J,GAAQC,GAAoB9J,CAAI,EAChCpU,EAAOme,GAAsBvgB,CAAC,EAC9BwgB,EAAOhK,IAAS,aAAe,KAAOiK,GAAOzgB,CAAC,EAC9CuI,EAASvI,EAAE,aAAeA,EAAE,GAElC,GAAIogB,EAAS,CACZ,GAAI,CAAC7F,GAAY,YAAa,QACjB/D,IAAS,aAAexG,GAAM,QAAUA,GAAM,SACtDqQ,GAAO,CACX,GAAI,WAAWrgB,EAAE,EAAE,GACnB,YAAawgB,EAAO,GAAGpe,CAAI,MAAMoe,CAAI,GAAKpe,EAC1C,OAAQ,CAAE,MAAO,OAAQ,QAAS,IAAM6d,EAAY1X,CAAM,CAAC,EAC3D,EACD,MACD,CAEA,GACC,GAACgN,KAAwBC,CAAI,CAAA,GAC7B,OAAO,aAAiB,KACxB,aAAa,aAAe,WAG7B,GAAI,CACHqK,EAAK,IAAI7f,EAAE,EAAE,GAAG,MAAK,EACrB,MAAM+f,EAAI,IAAI,aAAaM,GAAO,CACjC,KAAMG,EAAO,GAAGpe,CAAI;AAAA,EAAKoe,CAAI,GAAKpe,EAClC,IAAKpC,EAAE,GACP,KAAM,gBACN,EACD6f,EAAK,IAAI7f,EAAE,GAAI+f,CAAC,EAChBA,EAAE,iBAAiB,QAAS,IAAM,CACjCA,EAAE,MAAK,EACP,OAAO,MAAK,EACZE,EAAY1X,CAAM,CACnB,CAAC,EACDwX,EAAE,iBAAiB,QAAS,IAAM,CAC7BF,EAAK,IAAI7f,EAAE,EAAE,IAAM+f,GAAGF,EAAK,OAAO7f,EAAE,EAAE,CAC3C,CAAC,CACF,MAAQ,CAER,CACD,CAEA,IAAI0gB,EAAO,IAAI,IACf1d,GAAQ,IAAM,CACb,MAAMyW,EAAMkH,GAAoBD,EAAMrH,GAAa,QAAQ,EAC3DqH,EAAOjH,EAAI,KAEXhS,GAAQ,IAAM,CACb,UAAWa,KAASmR,EAAI,OAAQ0G,EAAM7X,CAAK,CAC5C,CAAC,CACF,CAAC,EAGDtF,GAAQ,KACP,OAAO,iBAAiB,QAAS8c,CAAQ,EAClC,IAAM,CACZ,OAAO,oBAAoB,QAASA,CAAQ,EAC5CA,EAAQ,CACT,EACA,EAGD9c,GAAQ,IAAM,CACb,GAAI,EAAE,kBAAmB,WAAY,OACrC,MAAM2b,EAAarW,GAAwB,CAC1C,MAAMwP,EAAOxP,EAAM,KACfwP,GAAM,OAAS,QAAUA,EAAK,KAAUoI,GAAKpI,EAAK,GAAG,CAC1D,EACA,iBAAU,cAAc,iBAAiB,UAAW6G,CAAS,EACtD,IAAM,UAAU,cAAc,oBAAoB,UAAWA,CAAS,CAC9E,CAAC,EAED3b,GAAQ,IAAM,CACb,GAAKyS,KAAqBD,CAAI,CAAA,EAC9B,gBAAS,iBAAiB,cAAea,EAAuB,EAChE,SAAS,iBAAiB,UAAWA,EAAuB,EACrD,IAAM,CACZ,SAAS,oBAAoB,cAAeA,EAAuB,EACnE,SAAS,oBAAoB,UAAWA,EAAuB,CAChE,CACD,CAAC,EAED,MAAMuK,EAAUtc,EAAA,IAAY+U,GAAa,SAAS,OAAQrZ,GAAMA,EAAE,aAAe,IAAS6gB,GAAW7gB,CAAC,CAAC,EAAE,MAAM,EAC/GgD,GAAQ,IAAMkT,GAAehT,EAAC0d,CAAU,EAAC,MAClC,mECjJR,UA6CA,IAAIE,EAAKnR,GAAA1O,EAAA2O,EAAA,EACT,MAAMmR,EAAW,CAAC,CAAC,OAAQ,CAAE,EAAK,6BAA6B,CAAE,CAAC,EAcjEC,mCAA8BF,EAAK,uBAAYC,qCACrCE,GAAA3f,EAAA,IAAAL,EAAM,UAAQoe,EAAA,sCAHjB,mEC1DR,UA6CA,IAAIyB,EAAKnR,GAAA1O,EAAA2O,EAAA,EACT,MAAMmR,EAAW,CAAC,CAAC,SAAU,CAAE,GAAM,KAAM,GAAM,KAAM,EAAK,KAAM,EAAG,CAAC,OAAQ,CAAE,EAAK,eAAe,CAAE,CAAE,EAcvGC,kCAA6BF,EAAK,uBAAYC,qCACpCE,GAAA3f,EAAA,IAAAL,EAAM,UAAQoe,EAAA,sCAHjB,mEC1DR,UA6CA,IAAIyB,EAAKnR,GAAA1O,EAAA2O,EAAA,EACT,MAAMmR,EAAW,CAAC,CAAC,OAAQ,CAAE,EAAK,YAAa,EAAG,CAAC,OAAQ,CAAE,EAAK,4OAA8O,CAAC,EAAE,CAAC,OAAQ,CAAE,EAAK,UAAU,CAAE,CAAE,EAchVC,+BAA0BF,EAAK,uBAAYC,qCACjCE,GAAA3f,EAAA,IAAAL,EAAM,UAAQoe,EAAA,sCAHjB,mEC1DR,UA6CA,IAAIyB,EAAKnR,GAAA1O,EAAA2O,EAAA,EACT,MAAMmR,EAAW,CAAC,CAAC,SAAU,CAAE,GAAM,KAAM,GAAM,KAAM,EAAK,KAAM,EAAG,CAAC,OAAQ,CAAE,EAAK,YAAa,EAAG,CAAC,OAAQ,CAAE,EAAK,WAAW,CAAE,CAAE,EAcnIC,0BAAqBF,EAAK,uBAAYC,qCAC5BE,GAAA3f,EAAA,IAAAL,EAAM,UAAQoe,EAAA,sCAHjB,mEC1DR,UA6CA,IAAIyB,EAAKnR,GAAA1O,EAAA2O,EAAA,EACT,MAAMmR,EAAW,CAAC,CAAC,OAAQ,CAAE,EAAK,0EAA4E,CAAC,EAAE,CAAC,OAAQ,CAAE,EAAK,UAAW,EAAG,CAAC,OAAQ,CAAE,EAAK,YAAY,CAAE,CAAE,EAc9KC,oCAA+BF,EAAK,uBAAYC,qCACtCE,GAAA3f,EAAA,IAAAL,EAAM,UAAQoe,EAAA,sCAHjB,mEC1DR,CAQC,IAAS3P,EAASC,GAAA1O,EAAA2O,EAAA,EAIlBsR,GAAAzgB,EAAAqJ,kKAII4F,GAEM,YAAWjP,GAAA,CACnB0gB,GAAW1gB,EAAA,CAAA,MAAA,qBAAA,CAAA,GAEH,YAAWA,GAAA,CACnB2gB,GAAe3gB,EAAA,CAAA,MAAA,yBAAA,CAAA,GAEP,UAASA,GAAA,CACjB4gB,GAAY5gB,EAAA,CAAA,MAAA,QAAA,CAAA,GAEJ,SAAQA,GAAA,CAChB8R,GAAQ9R,EAAA,CAAA,MAAA,QAAA,CAAA,GAEA,YAAWA,GAAA,CACnB6gB,GAAiB7gB,EAAA,CAAA,MAAA,uBAAA,CAAA,qFAtBZ,+2BCTR,kDA4BO8gB,EAAKjd,EAAA,IAAYkd,EAAK,EAAC,IAAI,aAAa,IAAI,OAAO,CAAC,EAGpDC,EAAMnd,EAAA,IACXkd,EAAK,EAAC,IAAI,SAAS,WAAW,WAAW,EACtCrC,GAAS,mBAAmBqC,EAAK,EAAC,IAAI,SAAS,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC,EACrE,IAAA,EAEEE,EAAMpd,EAAe,IAAM,CAChC,MAAMqd,EAAMH,EAAK,EAAC,IAAI,aAAa,IAAI,MAAM,EAC7C,OAAOG,EAAMxC,GAASwC,CAAG,EAAI,IAC9B,CAAC,EACKC,EAAOtd,EAAA,IAAY,CAACpB,EAAAqe,CAAK,GAAIre,EAAAue,CAAM,IAAK,MAAQve,EAAAwe,CAAM,IAAK,IAAI,EACrE1e,GAAQ,IAAM,CACbmb,GAAW,SAASjb,EAAA0e,CAAO,IAAGH,CAAM,EAAG,KAAMve,EAAA0e,CAAO,EAAA1e,EAAGwe,CAAM,EAAG,IAAI,CACrE,CAAC,EAGD,SAASG,EAAY1N,EAAc,CAClCA,EAAE,eAAc,EAChB,MAAMuK,EAAMS,GAAShL,EAAE,cAAc,QAAQ,yBAAyB,GAAK,EAAE,EAC7EgK,GAAW,SAAW,GAClBO,GAAGxb,EAAIue,CAAM,GAAEtD,GAAW,UAAUO,EAAGxb,EAAEue,CAAM,CAAA,CACpD,CAGA,MAAMK,EAAUxd,EAAA,IAAYyd,GAAO,IAAI,EACvC,IAAIC,EAAqCjf,EAAO,IAAI,EAChD0Q,EAAc,EACdC,GAAgB,EAChBuO,EAAa,GAGjB,MAAMC,EAAoBC,GAAa,aACjCC,EAAY,IACZC,EAAY,IAGlB,IAAIC,EAAevf,EAFG,GAEiB,EACnCwf,EAAaxf,EAAO,EAAK,EAG7B,MAAMyf,EAAWle,EAAA,IAAYkd,EAAK,EAAC,IAAI,SAAS,WAAW,WAAW,CAAC,EAGjEiB,EAAane,EAAA,IAClBkd,EAAK,EAAC,IAAI,SAAS,WAAW,WAAW,EACtC,mBAAmBA,EAAK,EAAC,IAAI,SAAS,MAAM,WAAW,EAAE,CAAC,CAAC,EAC3D,IAAA,EAIEkB,EAAOpe,EAAA,IACZpB,EAAA0e,CAAA,EACG,CAAA1e,EAACue,CAAM,EAAAve,EAAEwe,CAAM,CAAA,EAAE,OAAQiB,GAAMA,GAAK,CAACA,EAAE,IAAI,EAAE,IAAKA,GAAMA,EAAG,MAAM,EACjEzf,EAAAuf,CAAA,EACC,CAAAvf,EAACuf,CAAa,CAAA,EACd,EAAC,EAGAG,EAActe,EAAA,IACnB+U,GAAa,SAAS,KAAMrZ,GAAMA,EAAE,cAAWkD,EAAKuf,CAAa,GAAIziB,EAAE,KAAEkD,EAAKuf,CAAa,CAAA,CAAA,EAI5Fra,GAAQ,IAAMya,IAAmB,EAEjCC,GAAeC,GAAQ,CACtBC,GAAa,MAAO,CACnB,KAAMD,EAAI,KACV,KAAMA,EAAI,MAAM,KAAK,UAAY,KACjC,GAAIA,EAAI,IAAI,KAAK,UAAY,KAC7B,CACF,CAAC,EAED3a,GAAQ,IAAM,CACbiR,GAAa,QAAO,EAEP,CAEZ,MAAM4J,EAAQ,aAAa,QAAQf,CAAiB,EACpD,GAAIe,EAAO,CACV,MAAMC,EAAQ,SAASD,EAAO,EAAE,EAC5BC,GAASd,GAAac,GAASb,GAClCpf,EAAAqf,EAAeY,EAAK,EAAA,CAEtB,CACD,CACD,CAAC,EAEDC,GAAU,IAAM,CACf9J,GAAa,WAAU,EACLpZ,GAAe,CAClC,CAAC,EAMD,MAAMmjB,GAAS9e,EAAA,IACdiW,GAAY,WAAa8I,GAAW,SAAW,aAAeA,GAAW,SAAW,cAAa,EAGlG,SAASC,IAAmB,CAEvB,SAAS,kBAAoB,WAASpgB,EAAIkgB,EAAS,GACjDrjB,GAAe,CAEtB,CAEAiD,GAAQ,IAAM,CAEXE,EAAEkgB,EAAS,EAAOrjB,GAAe,EACzBE,GAAe,CAC1B,CAAC,EAED+C,GAAQ,KAEP,SAAS,iBAAiB,mBAAoBsgB,EAAgB,EACvD,IAAM,SAAS,oBAAoB,mBAAoBA,EAAgB,EAC9E,EAGD,SAASC,GAAkBpP,EAAe,CACzCA,EAAE,eAAc,EAChBlR,EAAAsf,EAAa,EAAI,EACjB,SAAS,iBAAiB,YAAaiB,CAAgB,EACvD,SAAS,iBAAiB,UAAWC,EAAe,CACrD,CAEA,SAASD,EAAiBrP,EAAe,CACxC,GAAI,CAACjR,EAAAqf,CAAU,EAAE,OACjB,MAAMmB,EAAW,KAAK,IAAIrB,EAAW,KAAK,IAAID,EAAWjO,EAAE,OAAO,CAAC,EACnElR,EAAAqf,EAAeoB,EAAQ,EAAA,CACxB,CAEA,SAASD,IAAkB,CAC1BxgB,EAAAsf,EAAa,EAAK,EAClB,SAAS,oBAAoB,YAAaiB,CAAgB,EAC1D,SAAS,oBAAoB,UAAWC,EAAe,EAEtD,aAAa,QAAQvB,EAAmBhf,EAAAof,CAAY,EAAC,UAAU,CAEjE,CAGA,SAASqB,GAAiBxP,EAAkB,CACvC,EAAEA,EAAE,SAAWA,EAAE,UAAYA,EAAE,QAAUA,EAAE,UAC3CA,EAAE,IAAI,YAAW,IAAO,MAC5BA,EAAE,eAAc,EAChB4N,GAAO,OAAM,EACd,CAEA,SAAS6B,IAAc,CACtB7B,GAAO,MAAK,CACb,CAEA,SAAS7N,GAAiBC,EAAe,CACxCV,EAAcU,EAAE,QAAQ,CAAC,EAAE,QAC3BT,GAAgBD,EAChBwO,EAAa,EACd,CAEA,SAAS7N,GAAgBD,EAAe,CACvC,GAAI,CAAC8N,GAAc,CAAC/e,EAAA8e,CAAc,EAAE,OACpCtO,GAAgBS,EAAE,QAAQ,CAAC,EAAE,QAC7B,MAAM0P,EAAOnQ,GAAgBD,EACzBoQ,EAAO,IACV3gB,EAAA8e,CAAc,EAAC,MAAM,UAAY,cAAc6B,CAAI,MAErD,CAEA,SAASxP,IAAiB,CACzB,GAAI,CAAC4N,GAAc,CAAC/e,EAAA8e,CAAc,EAAE,OACpCC,EAAa,GACAvO,GAAgBD,EAClB,KACVmQ,GAAW,EAEZ1gB,EAAA8e,CAAc,EAAC,MAAM,UAAY,EAClC,aAGA8B,GAAW,UAAArjB,GAAA,2CAKckjB,EAAgB,6CAIxCI,GAAuB9f,EAAA,wBAAEye,CAAO,kBAChCsB,GAAO1a,EAAA,CAAA,SAAA,YAAA,YAAA,GAAA,mBAHHpG,EAAAqe,CAAK,GAAA7X,EAAAuI,EAAA,mCAOT9R,EAAG6M,GAAA,QACF,IAAAiX,EAAA3jB,EADDH,CAAG,SAWD,IAAAE,GAAGC,EAVJ2jB,CAAA,EAUClP,GAAAzU,EAAAD,EAAI,EACH6jB,kCAA0CN,GAAW,EADtD/iB,EAAAR,EAAI,MAKJK,GAAGoK,EALHzK,GAAG,CAAA,EAKH6U,EAAA5U,EAAAI,EAAI,cAEF,IAAAsK,GAAGjB,GAAA,EAAHgB,EAAAzK,EAAA0K,EAAI,eAGU9H,EAAA0f,CAAc,EAAC,aAAe,EAAE,EAF7CuB,GAAApZ,EAAA,iBACW,OAAA7H,EAAA0f,CAAc,EAAC,qCAF3B/hB,EAAAmK,EAAI,EAAJpK,EAAAH,GAAAuK,EAAI,cADD4X,CAAc,GAAAlZ,GAAAC,CAAA,iBAQlBya,GAAapa,EAAA,EAAA,EATdnJ,EAAAH,EAAI,EAYJ,IAAAgL,EAAAZ,EAZApK,GAAG,CAAA,EAfJG,EAAAojB,CAAA,KAAAA,EAAAzW,IAAAvK,EAKW+e,YAAAA,CAAc,CAAA,EA8BzB,IAAAqC,EAAIvZ,EAnCJmZ,EAAA,CAAA,MAmCAI,CAAI,eAEFC,GAAS7jB,GAAA,kBAAIghB,CAAM,oBAAKC,CAAM,gFAM7B,IAAArM,GAAA1J,GAAA,EAAAiC,GAAA,WAAAyH,GAIalB,IAAMA,GAAE,gBAAgB,EAJrCvG,GAAA,OAAAyH,GAKQwM,CAAW,EALnBjhB,EAAAH,GAAA4U,EAAA,YAHG8I,GAAW,UAAQjb,EAAIue,CAAM,GAAA/X,GAAAQ,CAAA,uBAJ9BhH,EAAA0e,CAAO,GAAA1e,EAAIue,CAAM,GAAAve,EAAIwe,CAAM,EAAAhY,GAAA4D,EAAA,EAAA5D,GAAAkL,GAAA,EAAA,MADhCyP,CAAI,WAAJA,EAAI,CAAA,mBAsBH9a,GAAMgD,GAAA,EAAN9C,GAAA,QAAAF,GAAiCqa,EAAW,OAA5Cra,EAAM,eADHuY,CAAU,GAAApY,GAAAU,EAAA,MAzDfjK,CAAG,SAAHiE,EAAAtD,GAAAX,wDAA0CoiB,CAAU,CAAA,CAAA,QACnD0B,EAAA,EAAA,yBAAA,KAAAtH,GAAA,CAAA,KAAAzZ,EAEY4e,CAAU,aACNS,CAAU,EAAA,EAH1B5U,GAAAsW,EAAA,oBAAA/gB,EAIyBof,CAAY,GAAA,EAAA,IAAA,IAJrC7Y,GAAA,aAAAwa,EAMc/P,EAAgB,EAN9BzK,GAAA,YAAAwa,EAOa7P,EAAe,EAP5B3K,GAAA,WAAAwa,EAQY5P,EAAc,EAmBzB5K,GAAA,YAAAiC,EAEa6X,EAAiB,MA9BhCpjB,CAAG,UAgEH,IAAAmd,EAAGzI,GAAA,EAAH0P,EAAAjkB,EAAAgd,CAAI,uBAAJzc,EAAAyc,CAAI,EAAJ1c,EAAAH,EAAA6c,CAAI,iEAjEDpa,EAAAsf,CAAW,GAAI,CAACtf,EAAAqe,CAAK,EAAA7X,EAAAW,EAAA,EAAAnH,EA8DhBqe,CAAK,EAAA7X,EAAAa,GAAA,CAAA,EAAAb,EAAAS,GAAA,EAAA,oBA7EP","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,23,24,25,26,27]}
1
+ {"version":3,"file":"0.Cga09Vlt.js","sources":["../../../../../../src/lib/wakeLock.svelte.ts","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/Loader.svelte","../../../../../../../node_modules/.bun/runed@0.28.0+fabb43e41e936932/node_modules/runed/dist/internal/configurable-globals.js","../../../../../../../node_modules/.bun/runed@0.28.0+fabb43e41e936932/node_modules/runed/dist/internal/utils/dom.js","../../../../../../../node_modules/.bun/runed@0.28.0+fabb43e41e936932/node_modules/runed/dist/utilities/active-element/active-element.svelte.js","../../../../../../../node_modules/.bun/runed@0.28.0+fabb43e41e936932/node_modules/runed/dist/utilities/context/context.js","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/internal/ctx.js","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/types.js","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/internal/use-document-hidden.svelte.js","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/Toast.svelte","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/icons/SuccessIcon.svelte","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/icons/ErrorIcon.svelte","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/icons/WarningIcon.svelte","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/icons/InfoIcon.svelte","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/icons/CloseIcon.svelte","../../../../../../../node_modules/.bun/svelte-sonner@1.2.1+fabb43e41e936932/node_modules/svelte-sonner/dist/Toaster.svelte","../../../../../../src/lib/components/SidebarAccordion.svelte","../../../../../../src/lib/components/ScreenshotsPanel.svelte","../../../../../../src/lib/notifications.ts","../../../../../../src/lib/push.ts","../../../../../../src/lib/components/SidebarMeters.svelte","../../../../../../src/lib/components/SplitView.svelte","../../../../../../src/lib/components/NotificationCoordinator.svelte","../../../../../../../node_modules/.bun/@lucide+svelte@0.561.0+fabb43e41e936932/node_modules/@lucide/svelte/dist/icons/loader-circle.svelte","../../../../../../../node_modules/.bun/@lucide+svelte@0.561.0+fabb43e41e936932/node_modules/@lucide/svelte/dist/icons/circle-check.svelte","../../../../../../../node_modules/.bun/@lucide+svelte@0.561.0+fabb43e41e936932/node_modules/@lucide/svelte/dist/icons/octagon-x.svelte","../../../../../../../node_modules/.bun/@lucide+svelte@0.561.0+fabb43e41e936932/node_modules/@lucide/svelte/dist/icons/info.svelte","../../../../../../../node_modules/.bun/@lucide+svelte@0.561.0+fabb43e41e936932/node_modules/@lucide/svelte/dist/icons/triangle-alert.svelte","../../../../../../src/lib/components/ui/sonner/sonner.svelte","../../../../../../src/routes/+layout.svelte"],"sourcesContent":["import { browser } from '$app/environment';\n\ninterface WakeLockSentinelLike {\n\treleased: boolean;\n\trelease(): Promise<void>;\n\taddEventListener(type: 'release', listener: () => void): void;\n}\n\nlet sentinel: WakeLockSentinelLike | null = null;\n\nexport function wakeLockSupported(): boolean {\n\treturn browser && 'wakeLock' in navigator;\n}\n\nexport async function acquireWakeLock(): Promise<void> {\n\tif (!wakeLockSupported() || sentinel) return;\n\ttry {\n\t\tconst s: WakeLockSentinelLike = await navigator.wakeLock.request('screen');\n\t\tsentinel = s;\n\t\ts.addEventListener('release', () => {\n\t\t\tsentinel = null;\n\t\t});\n\t} catch {\n\t\tsentinel = null;\n\t}\n}\n\nexport async function releaseWakeLock(): Promise<void> {\n\tif (!sentinel) return;\n\ttry {\n\t\tawait sentinel.release();\n\t} catch {\n\t\t// ignore\n\t}\n\tsentinel = null;\n}\n\nexport function hasWakeLock(): boolean {\n\treturn sentinel !== null;\n}\n","<script lang=\"ts\" module>\n\tconst bars = Array(12).fill(0);\n</script>\n\n<script lang=\"ts\">\n\tlet { visible, class: className }: { visible: boolean; class?: string } =\n\t\t$props();\n</script>\n\n<div\n\tclass={['sonner-loading-wrapper', className].filter(Boolean).join(' ')}\n\tdata-visible={visible}\n>\n\t<div class=\"sonner-spinner\">\n\t\t{#each bars as _, i (`spinner-bar-${i}`)}\n\t\t\t<div class=\"sonner-loading-bar\"></div>\n\t\t{/each}\n\t</div>\n</div>\n","import { BROWSER } from \"esm-env\";\nexport const defaultWindow = BROWSER && typeof window !== \"undefined\" ? window : undefined;\nexport const defaultDocument = BROWSER && typeof window !== \"undefined\" ? window.document : undefined;\nexport const defaultNavigator = BROWSER && typeof window !== \"undefined\" ? window.navigator : undefined;\nexport const defaultLocation = BROWSER && typeof window !== \"undefined\" ? window.location : undefined;\n","import { defaultDocument } from \"../configurable-globals.js\";\n/**\n * Handles getting the active element in a document or shadow root.\n * If the active element is within a shadow root, it will traverse the shadow root\n * to find the active element.\n * If not, it will return the active element in the document.\n *\n * @param document A document or shadow root to get the active element from.\n * @returns The active element in the document or shadow root.\n */\nexport function getActiveElement(document) {\n let activeElement = document.activeElement;\n while (activeElement?.shadowRoot) {\n const node = activeElement.shadowRoot.activeElement;\n if (node === activeElement)\n break;\n else\n activeElement = node;\n }\n return activeElement;\n}\n/**\n * Returns the owner document of a given element.\n *\n * @param node The element to get the owner document from.\n * @returns\n */\nexport function getOwnerDocument(node, fallback = defaultDocument) {\n return node?.ownerDocument ?? fallback;\n}\n/**\n * Checks if an element is or is contained by another element.\n *\n * @param node The element to check if it or its descendants contain the target element.\n * @param target The element to check if it is contained by the node.\n * @returns\n */\nexport function isOrContainsTarget(node, target) {\n return node === target || node.contains(target);\n}\n","import { defaultWindow, } from \"../../internal/configurable-globals.js\";\nimport { getActiveElement } from \"../../internal/utils/dom.js\";\nimport { on } from \"svelte/events\";\nimport { createSubscriber } from \"svelte/reactivity\";\nexport class ActiveElement {\n #document;\n #subscribe;\n constructor(options = {}) {\n const { window = defaultWindow, document = window?.document } = options;\n if (window === undefined)\n return;\n this.#document = document;\n this.#subscribe = createSubscriber((update) => {\n const cleanupFocusIn = on(window, \"focusin\", update);\n const cleanupFocusOut = on(window, \"focusout\", update);\n return () => {\n cleanupFocusIn();\n cleanupFocusOut();\n };\n });\n }\n get current() {\n this.#subscribe?.();\n if (!this.#document)\n return null;\n return getActiveElement(this.#document);\n }\n}\n/**\n * An object holding a reactive value that is equal to `document.activeElement`.\n * It automatically listens for changes, keeping the reference up to date.\n *\n * If you wish to use a custom document or shadowRoot, you should use\n * [useActiveElement](https://runed.dev/docs/utilities/active-element) instead.\n *\n * @see {@link https://runed.dev/docs/utilities/active-element}\n */\nexport const activeElement = new ActiveElement();\n","import { getContext, hasContext, setContext } from \"svelte\";\nexport class Context {\n #name;\n #key;\n /**\n * @param name The name of the context.\n * This is used for generating the context key and error messages.\n */\n constructor(name) {\n this.#name = name;\n this.#key = Symbol(name);\n }\n /**\n * The key used to get and set the context.\n *\n * It is not recommended to use this value directly.\n * Instead, use the methods provided by this class.\n */\n get key() {\n return this.#key;\n }\n /**\n * Checks whether this has been set in the context of a parent component.\n *\n * Must be called during component initialisation.\n */\n exists() {\n return hasContext(this.#key);\n }\n /**\n * Retrieves the context that belongs to the closest parent component.\n *\n * Must be called during component initialisation.\n *\n * @throws An error if the context does not exist.\n */\n get() {\n const context = getContext(this.#key);\n if (context === undefined) {\n throw new Error(`Context \"${this.#name}\" not found`);\n }\n return context;\n }\n /**\n * Retrieves the context that belongs to the closest parent component,\n * or the given fallback value if the context does not exist.\n *\n * Must be called during component initialisation.\n */\n getOr(fallback) {\n const context = getContext(this.#key);\n if (context === undefined) {\n return fallback;\n }\n return context;\n }\n /**\n * Associates the given value with the current component and returns it.\n *\n * Must be called during component initialisation.\n */\n set(context) {\n return setContext(this.#key, context);\n }\n}\n","import { SonnerState } from '../toast-state.svelte.js';\nimport { Context } from 'runed';\nexport const richColorsContext = new Context('richColorsContext');\nexport const sonnerContext = new Context('<Toaster/>');\n","export function isAction(action) {\n return action.label !== undefined;\n}\n","import { on } from 'svelte/events';\nexport function useDocumentHidden() {\n let current = $state(typeof document !== 'undefined' ? document.hidden : false);\n $effect(() => {\n return on(document, 'visibilitychange', () => {\n current = document.hidden;\n });\n });\n return {\n get current() {\n return current;\n }\n };\n}\n","<script lang=\"ts\" module>\n\t// Default lifetime of a toasts (in ms)\n\tconst TOAST_LIFETIME = 4000;\n\n\t// Default gap between toasts\n\tconst GAP = 14;\n\n\t// Threshold to dismiss a toast\n\tconst SWIPE_THRESHOLD = 45;\n\n\t// Equal to exit animation duration\n\tconst TIME_BEFORE_UNMOUNT = 200;\n\n\tconst SCALE_MULTIPLIER = 0.05;\n\n\tconst DEFAULT_TOAST_CLASSES: ToastClasses = {\n\t\ttoast: '',\n\t\ttitle: '',\n\t\tdescription: '',\n\t\tloader: '',\n\t\tcloseButton: '',\n\t\tcancelButton: '',\n\t\tactionButton: '',\n\t\taction: '',\n\t\twarning: '',\n\t\terror: '',\n\t\tsuccess: '',\n\t\tdefault: '',\n\t\tinfo: '',\n\t\tloading: ''\n\t};\n\n\tfunction getDefaultSwipeDirections(\n\t\tposition: string\n\t): Array<SwipeDirection> {\n\t\tconst [y, x] = position.split('-');\n\t\tconst directions: Array<SwipeDirection> = [];\n\n\t\tif (y) {\n\t\t\tdirections.push(y as SwipeDirection);\n\t\t}\n\n\t\tif (x) {\n\t\t\tdirections.push(x as SwipeDirection);\n\t\t}\n\n\t\treturn directions;\n\t}\n\n\tfunction getDampening(delta: number) {\n\t\tconst factor = Math.abs(delta) / 20;\n\n\t\treturn 1 / (1.5 + factor);\n\t}\n</script>\n\n<script lang=\"ts\">\n\timport { onMount, untrack } from 'svelte';\n\timport {\n\t\tisAction,\n\t\ttype SwipeDirection,\n\t\ttype ToastClasses,\n\t\ttype ToastProps\n\t} from './types.js';\n\timport { toastState } from './toast-state.svelte.js';\n\timport { cn } from './internal/helpers.js';\n\timport { useDocumentHidden } from './internal/use-document-hidden.svelte.js';\n\timport type {\n\t\tDragEventHandler,\n\t\tPointerEventHandler\n\t} from 'svelte/elements';\n\timport Loader from './Loader.svelte';\n\n\tlet {\n\t\ttoast,\n\t\tindex,\n\t\texpanded,\n\t\tinvert: invertFromToaster,\n\t\tposition,\n\t\tvisibleToasts,\n\t\texpandByDefault,\n\t\tcloseButton: closeButtonFromToaster,\n\t\tinteracting,\n\t\tcancelButtonStyle = '',\n\t\tactionButtonStyle = '',\n\t\tduration: durationFromToaster,\n\t\tdescriptionClass = '',\n\t\tclasses: classesProp,\n\t\tunstyled = false,\n\t\tloadingIcon,\n\t\tsuccessIcon,\n\t\terrorIcon,\n\t\twarningIcon,\n\t\tcloseIcon,\n\t\tinfoIcon,\n\t\tdefaultRichColors = false,\n\t\tgap = GAP,\n\t\tswipeDirections: swipeDirectionsProp,\n\t\tcloseButtonAriaLabel,\n\t\tpauseWhenPageIsHidden,\n\t\t...restProps\n\t}: ToastProps = $props();\n\n\tconst defaultClasses: ToastClasses = { ...DEFAULT_TOAST_CLASSES };\n\n\tlet mounted = $state(false);\n\tlet removed = $state(false);\n\tlet swiping = $state(false);\n\tlet swipeOut = $state(false);\n\tlet isSwiped = $state(false);\n\tlet offsetBeforeRemove = $state(0);\n\tlet initialHeight = $state(0);\n\tlet remainingTime = toast.duration || durationFromToaster || TOAST_LIFETIME;\n\tlet dragStartTime = $state<Date | null>(null);\n\tlet toastRef = $state<HTMLLIElement>();\n\tlet swipeDirection = $state<'x' | 'y' | null>(null);\n\tlet swipeOutDirection = $state<'left' | 'right' | 'up' | 'down' | null>(\n\t\tnull\n\t);\n\tconst isFront = $derived(index === 0);\n\tconst isVisible = $derived(index + 1 <= visibleToasts);\n\tconst toastType = $derived(toast.type);\n\tconst dismissible = $derived(\n\t\ttoast.dismissible !== undefined\n\t\t\t? toast.dismissible !== false\n\t\t\t: toast.dismissable !== false\n\t);\n\tconst toastClass = $derived(toast.class || '');\n\tconst toastDescriptionClass = $derived(toast.descriptionClass || '');\n\t// height index is used to calculate the offset as it gets updated before the toast array, which means we can calculate the new layout faster.\n\t// Only the heights of this toaster + position matter for the offset math,\n\t// otherwise toasts of another toaster (or another corner) push these around.\n\tconst relevantHeights = $derived(\n\t\ttoastState.heights.filter(\n\t\t\t(height) =>\n\t\t\t\theight.toasterId === toast.toasterId &&\n\t\t\t\theight.position === position\n\t\t)\n\t);\n\t// findIndex returns -1 when not yet measured; -1 is truthy, so `|| 0` left a negative index in the offset math.\n\tconst heightIndex = $derived.by(() => {\n\t\tconst idx = relevantHeights.findIndex(\n\t\t\t(height) => height.toastId === toast.id\n\t\t);\n\t\treturn idx === -1 ? 0 : idx;\n\t});\n\tconst closeButton = $derived(toast.closeButton ?? closeButtonFromToaster);\n\tconst duration = $derived(\n\t\ttoast.duration ?? durationFromToaster ?? TOAST_LIFETIME\n\t);\n\tlet pointerStart: { x: number; y: number } | null = null;\n\tconst coords = $derived(position.split('-'));\n\tconst swipeDirections = $derived(\n\t\tswipeDirectionsProp ?? getDefaultSwipeDirections(position)\n\t);\n\tconst toastsHeightBefore = $derived(\n\t\trelevantHeights.reduce((prev, curr, reducerIndex) => {\n\t\t\tif (reducerIndex >= heightIndex) return prev;\n\t\t\treturn prev + curr.height;\n\t\t}, 0)\n\t);\n\tconst isDocumentHidden = useDocumentHidden();\n\tconst invert = $derived(toast.invert || invertFromToaster);\n\tconst disabled = $derived(toastType === 'loading');\n\n\tconst classes = $derived({ ...defaultClasses, ...classesProp });\n\n\tconst toastTitle = $derived(toast.title);\n\tconst toastDescription = $derived(toast.description);\n\n\tlet closeTimerStartTime = $state(0);\n\tlet lastCloseTimerStartTime = $state(0);\n\n\tconst offset = $derived(Math.round(heightIndex * gap + toastsHeightBefore));\n\n\t$effect(() => {\n\t\ttoastTitle;\n\t\ttoastDescription;\n\t\tlet scale: number;\n\n\t\tif (expanded || expandByDefault) {\n\t\t\tscale = 1;\n\t\t} else {\n\t\t\tscale = 1 - index * SCALE_MULTIPLIER;\n\t\t}\n\n\t\tconst toastEl = untrack(() => toastRef);\n\t\tif (toastEl === undefined) return;\n\t\ttoastEl.style.setProperty('height', 'auto');\n\n\t\tconst offsetHeight = toastEl.offsetHeight;\n\t\tconst rectHeight = toastEl.getBoundingClientRect().height;\n\t\tconst scaledRectHeight =\n\t\t\tMath.round((rectHeight / scale + Number.EPSILON) * 100) / 100;\n\n\t\ttoastEl.style.removeProperty('height');\n\n\t\tlet finalHeight: number;\n\n\t\tif (Math.abs(scaledRectHeight - offsetHeight) < 1) {\n\t\t\t// use scaledRectHeight as it's more precise\n\t\t\tfinalHeight = scaledRectHeight;\n\t\t} else {\n\t\t\t// toast was transitioning its scale, so scaledRectHeight isn't accurate\n\t\t\tfinalHeight = offsetHeight;\n\t\t}\n\n\t\tinitialHeight = finalHeight;\n\n\t\ttoastState.setHeight({\n\t\t\ttoastId: toast.id,\n\t\t\theight: finalHeight,\n\t\t\ttoasterId: toast.toasterId,\n\t\t\tposition\n\t\t});\n\t});\n\n\tfunction deleteToast() {\n\t\tremoved = true;\n\t\t// save the offset for the exit swipe animation\n\t\toffsetBeforeRemove = offset;\n\n\t\ttoastState.removeHeight(toast.id);\n\t\ttoastState.markDismissed(toast.id);\n\t\ttoastState.scheduleRemoval(toast.id, TIME_BEFORE_UNMOUNT);\n\t}\n\n\tlet timeoutId: ReturnType<typeof setTimeout>;\n\n\tconst isPromiseLoadingOrInfiniteDuration = $derived(\n\t\t(toast.promise && toastType === 'loading') ||\n\t\t\ttoast.duration === Number.POSITIVE_INFINITY\n\t);\n\n\tfunction startTimer() {\n\t\t// Both the timer effect and the `updated` effect can start a timer in the\n\t\t// same flush (a recreated toast mounts with `updated` already set); clear\n\t\t// first so only one runs.\n\t\tclearTimeout(timeoutId);\n\t\tcloseTimerStartTime = new Date().getTime();\n\t\t// let the toast know it has started\n\t\ttimeoutId = setTimeout(() => {\n\t\t\ttoast.onAutoClose?.(toast);\n\t\t\tdeleteToast();\n\t\t}, remainingTime);\n\t}\n\n\tfunction pauseTimer() {\n\t\tif (lastCloseTimerStartTime < closeTimerStartTime) {\n\t\t\t// get the elapsed time since the timer started\n\t\t\tconst elapsedTime = new Date().getTime() - closeTimerStartTime;\n\t\t\tremainingTime = remainingTime - elapsedTime;\n\t\t}\n\n\t\tlastCloseTimerStartTime = new Date().getTime();\n\t}\n\n\t$effect(() => {\n\t\tif (toast.updated) {\n\t\t\t// if the toast has been updated after the initial render,\n\t\t\t// we want to reset the timer and set the remaining time to the\n\t\t\t// new duration\n\t\t\tclearTimeout(timeoutId);\n\t\t\tremainingTime = duration;\n\t\t\tif (!isPromiseLoadingOrInfiniteDuration) {\n\t\t\t\tstartTimer();\n\t\t\t}\n\t\t}\n\t});\n\n\t$effect(() => {\n\t\tif (!isPromiseLoadingOrInfiniteDuration) {\n\t\t\tif (\n\t\t\t\texpanded ||\n\t\t\t\tinteracting ||\n\t\t\t\t(pauseWhenPageIsHidden && isDocumentHidden.current)\n\t\t\t) {\n\t\t\t\tpauseTimer();\n\t\t\t} else {\n\t\t\t\tstartTimer();\n\t\t\t}\n\t\t}\n\n\t\treturn () => clearTimeout(timeoutId);\n\t});\n\n\tonMount(() => {\n\t\tmounted = true;\n\n\t\tconst height = toastRef?.getBoundingClientRect().height as number;\n\n\t\tinitialHeight = height;\n\t\ttoastState.setHeight({\n\t\t\ttoastId: toast.id,\n\t\t\theight,\n\t\t\ttoasterId: toast.toasterId,\n\t\t\tposition\n\t\t});\n\n\t\treturn () => {\n\t\t\ttoastState.removeHeight(toast.id);\n\t\t};\n\t});\n\n\t$effect(() => {\n\t\tif (toast.delete) {\n\t\t\tuntrack(() => {\n\t\t\t\t// `markDismissed` flips `delete` for dismissals that already ran\n\t\t\t\t// `deleteToast` themselves (close button, swipe, auto-close), so\n\t\t\t\t// don't re-enter and double-fire `onDismiss`.\n\t\t\t\tif (removed) return;\n\t\t\t\tdeleteToast();\n\t\t\t\ttoast.onDismiss?.(toast);\n\t\t\t});\n\t\t}\n\t});\n\n\t// The toast was recreated with the same id while this instance's exit animation\n\t// was running (`create` cancelled the pending removal). The keyed each reuses\n\t// this component instance, so revive its local exit state.\n\t$effect(() => {\n\t\tif (!toast.delete && !toast.dismiss && removed) {\n\t\t\tuntrack(() => {\n\t\t\t\tremoved = false;\n\t\t\t\tswipeOut = false;\n\t\t\t\tisSwiped = false;\n\t\t\t\tswiping = false;\n\t\t\t\tswipeDirection = null;\n\t\t\t\tswipeOutDirection = null;\n\t\t\t\tpointerStart = null;\n\t\t\t\tdragStartTime = null;\n\t\t\t\ttoastRef?.style.removeProperty('--swipe-amount-x');\n\t\t\t\ttoastRef?.style.removeProperty('--swipe-amount-y');\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tremainingTime = duration;\n\t\t\t\tif (!isPromiseLoadingOrInfiniteDuration) {\n\t\t\t\t\tstartTimer();\n\t\t\t\t}\n\t\t\t\ttoastState.setHeight({\n\t\t\t\t\ttoastId: toast.id,\n\t\t\t\t\theight: initialHeight,\n\t\t\t\t\ttoasterId: toast.toasterId,\n\t\t\t\t\tposition\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t});\n\n\tconst handlePointerDown: PointerEventHandler<HTMLLIElement> = (event) => {\n\t\tif (disabled) return;\n\n\t\tdragStartTime = new Date();\n\t\toffsetBeforeRemove = offset;\n\t\tconst target = event.target as HTMLElement;\n\n\t\t// ensure we maintain correct pointer capture even when going outside of the toast (e.g. when swiping)\n\t\ttarget.setPointerCapture(event.pointerId);\n\t\tif (target.tagName === 'BUTTON') return;\n\t\tswiping = true;\n\t\tpointerStart = { x: event.clientX, y: event.clientY };\n\t};\n\n\tconst handlePointerUp: PointerEventHandler<HTMLLIElement> = () => {\n\t\tif (swipeOut || !dismissible) return;\n\n\t\tpointerStart = null;\n\t\tconst swipeAmountX = Number(\n\t\t\ttoastRef?.style\n\t\t\t\t.getPropertyValue('--swipe-amount-x')\n\t\t\t\t.replace('px', '') || 0\n\t\t);\n\t\tconst swipeAmountY = Number(\n\t\t\ttoastRef?.style\n\t\t\t\t.getPropertyValue('--swipe-amount-y')\n\t\t\t\t.replace('px', '') || 0\n\t\t);\n\t\tconst timeTaken =\n\t\t\tnew Date().getTime() - (dragStartTime?.getTime() ?? 0);\n\n\t\tconst swipeAmount =\n\t\t\tswipeDirection === 'x' ? swipeAmountX : swipeAmountY;\n\t\tconst velocity = Math.abs(swipeAmount) / timeTaken;\n\n\t\t// Movement towards a direction that isn't allowed is dampened, not blocked,\n\t\t// so a fast flick can still pass the velocity check. Only dismiss if the\n\t\t// direction is allowed.\n\t\tconst isAllowedDirection =\n\t\t\tswipeDirection === 'x'\n\t\t\t\t? swipeDirections.includes(swipeAmountX > 0 ? 'right' : 'left')\n\t\t\t\t: swipeDirections.includes(swipeAmountY > 0 ? 'bottom' : 'top');\n\n\t\t// remove only if threshold is met\n\t\tif (\n\t\t\tisAllowedDirection &&\n\t\t\t(Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11)\n\t\t) {\n\t\t\toffsetBeforeRemove = offset;\n\t\t\ttoast.onDismiss?.(toast);\n\n\t\t\tif (swipeDirection === 'x') {\n\t\t\t\tswipeOutDirection = swipeAmountX > 0 ? 'right' : 'left';\n\t\t\t} else {\n\t\t\t\tswipeOutDirection = swipeAmountY > 0 ? 'down' : 'up';\n\t\t\t}\n\n\t\t\tdeleteToast();\n\t\t\tswipeOut = true;\n\t\t\treturn;\n\t\t} else {\n\t\t\ttoastRef?.style.setProperty('--swipe-amount-x', '0px');\n\t\t\ttoastRef?.style.setProperty('--swipe-amount-y', '0px');\n\t\t}\n\t\tisSwiped = false;\n\t\tswiping = false;\n\t\tswipeDirection = null;\n\t};\n\n\tconst handlePointerMove: PointerEventHandler<HTMLLIElement> = (event) => {\n\t\tif (!pointerStart || !dismissible) return;\n\n\t\tconst isHighlighted =\n\t\t\t(window.getSelection()?.toString().length ?? -1) > 0;\n\t\tif (isHighlighted) return;\n\n\t\tconst yDelta = event.clientY - pointerStart.y;\n\t\tconst xDelta = event.clientX - pointerStart.x;\n\n\t\t// Determine swipe direction if not already locked\n\t\tif (!swipeDirection && (Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1)) {\n\t\t\tswipeDirection = Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y';\n\t\t}\n\n\t\tlet swipeAmount = { x: 0, y: 0 };\n\n\t\tif (swipeDirection === 'y') {\n\t\t\t// handle vertical swipes\n\t\t\tif (\n\t\t\t\tswipeDirections.includes('top') ||\n\t\t\t\tswipeDirections.includes('bottom')\n\t\t\t) {\n\t\t\t\tif (\n\t\t\t\t\t(swipeDirections.includes('top') && yDelta < 0) ||\n\t\t\t\t\t(swipeDirections.includes('bottom') && yDelta > 0)\n\t\t\t\t) {\n\t\t\t\t\tswipeAmount.y = yDelta;\n\t\t\t\t} else {\n\t\t\t\t\t// smoothly transition to dampened movement\n\t\t\t\t\tconst dampenedDelta = yDelta * getDampening(yDelta);\n\t\t\t\t\t// ensure we don't jump when transition to dampened movement\n\t\t\t\t\tswipeAmount.y =\n\t\t\t\t\t\tMath.abs(dampenedDelta) < Math.abs(yDelta)\n\t\t\t\t\t\t\t? dampenedDelta\n\t\t\t\t\t\t\t: yDelta;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (swipeDirection === 'x') {\n\t\t\t// handle horizontal swipes\n\t\t\tif (\n\t\t\t\tswipeDirections.includes('left') ||\n\t\t\t\tswipeDirections.includes('right')\n\t\t\t) {\n\t\t\t\tif (\n\t\t\t\t\t(swipeDirections.includes('left') && xDelta < 0) ||\n\t\t\t\t\t(swipeDirections.includes('right') && xDelta > 0)\n\t\t\t\t) {\n\t\t\t\t\tswipeAmount.x = xDelta;\n\t\t\t\t} else {\n\t\t\t\t\t// Smoothly transition to dampened movement\n\t\t\t\t\tconst dampenedDelta = xDelta * getDampening(xDelta);\n\t\t\t\t\t// Ensure we don't jump when transitioning to dampened movement\n\t\t\t\t\tswipeAmount.x =\n\t\t\t\t\t\tMath.abs(dampenedDelta) < Math.abs(xDelta)\n\t\t\t\t\t\t\t? dampenedDelta\n\t\t\t\t\t\t\t: xDelta;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Math.abs(swipeAmount.x) > 0 || Math.abs(swipeAmount.y) > 0) {\n\t\t\tisSwiped = true;\n\t\t}\n\n\t\ttoastRef?.style.setProperty('--swipe-amount-x', `${swipeAmount.x}px`);\n\t\ttoastRef?.style.setProperty('--swipe-amount-y', `${swipeAmount.y}px`);\n\t};\n\n\tconst handleDragEnd: DragEventHandler<HTMLLIElement> = () => {\n\t\tswiping = false;\n\t\tswipeDirection = null;\n\t\tpointerStart = null;\n\t};\n\n\tconst icon = $derived.by(() => {\n\t\tif (toast.icon) return toast.icon;\n\t\tif (toastType === 'success') return successIcon;\n\t\tif (toastType === 'error') return errorIcon;\n\t\tif (toastType === 'warning') return warningIcon;\n\t\tif (toastType === 'info') return infoIcon;\n\t\tif (toastType === 'loading') return loadingIcon;\n\t\treturn null;\n\t});\n</script>\n\n{#snippet LoadingIcon()}\n\t{#if loadingIcon}\n\t\t<div\n\t\t\tclass={cn(classes?.loader, toast?.classes?.loader, 'sonner-loader')}\n\t\t\tdata-visible={toastType === 'loading'}\n\t\t>\n\t\t\t{@render loadingIcon()}\n\t\t</div>\n\t{:else}\n\t\t<Loader\n\t\t\tclass={cn(classes?.loader, toast.classes?.loader)}\n\t\t\tvisible={toastType === 'loading'}\n\t\t/>\n\t{/if}\n{/snippet}\n\n<!-- svelte-ignore a11y_no_noninteractive_tabindex -->\n<li\n\ttabindex={0}\n\tbind:this={toastRef}\n\tclass={cn(\n\t\trestProps.class,\n\t\ttoastClass,\n\t\tclasses?.toast,\n\t\ttoast?.classes?.toast,\n\t\tclasses?.[toastType],\n\t\ttoast?.classes?.[toastType]\n\t)}\n\taria-live={toast.important ? 'assertive' : 'polite'}\n\taria-atomic=\"true\"\n\tdata-sonner-toast=\"\"\n\tdata-rich-colors={toast.richColors ?? defaultRichColors}\n\tdata-styled={!(toast.component || toast.unstyled || unstyled)}\n\tdata-mounted={mounted}\n\tdata-promise={Boolean(toast.promise)}\n\tdata-swiped={isSwiped}\n\tdata-removed={removed}\n\tdata-visible={isVisible}\n\tdata-y-position={coords[0]}\n\tdata-x-position={coords[1]}\n\tdata-index={index}\n\tdata-front={isFront}\n\tdata-swiping={swiping}\n\tdata-dismissible={dismissible}\n\tdata-type={toastType}\n\tdata-invert={invert}\n\tdata-swipe-out={swipeOut}\n\tdata-swipe-direction={swipeOutDirection}\n\tdata-expanded={Boolean(expanded || (expandByDefault && mounted))}\n\tstyle:--index={index}\n\tstyle:--toasts-before={index}\n\tstyle:--z-index={toastState.toasts.length - index}\n\tstyle:--offset={`${removed ? offsetBeforeRemove : offset}px`}\n\tstyle:--initial-height={expandByDefault ? 'auto' : `${initialHeight}px`}\n\tstyle={`${restProps.style} ${toast.style}`}\n\tonpointermove={handlePointerMove}\n\tonpointerup={handlePointerUp}\n\tonpointerdown={handlePointerDown}\n\tondragend={handleDragEnd}\n>\n\t{#if closeButton && !toast.component && toastType !== 'loading' && closeIcon !== null}\n\t\t<button\n\t\t\taria-label={closeButtonAriaLabel}\n\t\t\tdata-disabled={disabled}\n\t\t\tdata-close-button\n\t\t\tonclick={() => {\n\t\t\t\tif (disabled || !dismissible) return;\n\t\t\t\tdeleteToast();\n\t\t\t\ttoast.onDismiss?.(toast);\n\t\t\t}}\n\t\t\tclass={cn(classes?.closeButton, toast?.classes?.closeButton)}\n\t\t>\n\t\t\t{@render closeIcon?.()}\n\t\t</button>\n\t{/if}\n\n\t{#if toast.component}\n\t\t{@const Component = toast.component}\n\t\t<Component {...toast.componentProps} closeToast={deleteToast} />\n\t{:else}\n\t\t{#if (toastType || toast.icon || toast.promise) && toast.icon !== null && (icon !== null || toast.icon)}\n\t\t\t<div data-icon=\"\" class={cn(classes?.icon, toast?.classes?.icon)}>\n\t\t\t\t<!-- Promise toasts keep the loader mounted after they settle so it can animate out -->\n\t\t\t\t{#if toastType === 'loading'}\n\t\t\t\t\t{#if toast.icon}\n\t\t\t\t\t\t<toast.icon />\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t{@render LoadingIcon()}\n\t\t\t\t\t{/if}\n\t\t\t\t{:else if toast.promise}\n\t\t\t\t\t{@render LoadingIcon()}\n\t\t\t\t{/if}\n\t\t\t\t{#if toastType !== 'loading'}\n\t\t\t\t\t{#if toast.icon}\n\t\t\t\t\t\t<toast.icon />\n\t\t\t\t\t{:else if toastType === 'success'}\n\t\t\t\t\t\t{@render successIcon?.()}\n\t\t\t\t\t{:else if toastType === 'error'}\n\t\t\t\t\t\t{@render errorIcon?.()}\n\t\t\t\t\t{:else if toastType === 'warning'}\n\t\t\t\t\t\t{@render warningIcon?.()}\n\t\t\t\t\t{:else if toastType === 'info'}\n\t\t\t\t\t\t{@render infoIcon?.()}\n\t\t\t\t\t{/if}\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t{/if}\n\t\t<div\n\t\t\tdata-content=\"\"\n\t\t\tclass={cn(classes?.content, toast?.classes?.content)}\n\t\t>\n\t\t\t<div\n\t\t\t\tdata-title=\"\"\n\t\t\t\tclass={cn(classes?.title, toast?.classes?.title)}\n\t\t\t>\n\t\t\t\t{#if toast.title}\n\t\t\t\t\t{#if typeof toast.title !== 'string'}\n\t\t\t\t\t\t{@const Title = toast.title}\n\t\t\t\t\t\t<Title {...toast.componentProps} />\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t{toast.title}\n\t\t\t\t\t{/if}\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t\t{#if toast.description}\n\t\t\t\t<div\n\t\t\t\t\tdata-description=\"\"\n\t\t\t\t\tclass={cn(\n\t\t\t\t\t\tdescriptionClass,\n\t\t\t\t\t\ttoastDescriptionClass,\n\t\t\t\t\t\tclasses?.description,\n\t\t\t\t\t\ttoast.classes?.description\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{#if typeof toast.description !== 'string'}\n\t\t\t\t\t\t{@const Description = toast.description}\n\t\t\t\t\t\t<Description {...toast.componentProps} />\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t{toast.description}\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t</div>\n\t\t{#if toast.cancel}\n\t\t\t{#if typeof toast.cancel === 'function'}\n\t\t\t\t<toast.cancel />\n\t\t\t{:else if isAction(toast.cancel)}\n\t\t\t\t<button\n\t\t\t\t\tdata-button\n\t\t\t\t\tdata-cancel\n\t\t\t\t\tstyle={toast.cancelButtonStyle ?? cancelButtonStyle}\n\t\t\t\t\tclass={cn(\n\t\t\t\t\t\tclasses?.cancelButton,\n\t\t\t\t\t\ttoast?.classes?.cancelButton\n\t\t\t\t\t)}\n\t\t\t\t\tonclick={(event) => {\n\t\t\t\t\t\tif (!isAction(toast.cancel)) return;\n\t\t\t\t\t\tif (!dismissible) return;\n\t\t\t\t\t\ttoast.cancel?.onClick?.(event);\n\t\t\t\t\t\tdeleteToast();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{toast.cancel.label}\n\t\t\t\t</button>\n\t\t\t{/if}\n\t\t{/if}\n\t\t{#if toast.action}\n\t\t\t{#if typeof toast.action === 'function'}\n\t\t\t\t<toast.action />\n\t\t\t{:else if isAction(toast.action)}\n\t\t\t\t<button\n\t\t\t\t\tdata-button=\"\"\n\t\t\t\t\tstyle={toast.actionButtonStyle ?? actionButtonStyle}\n\t\t\t\t\tclass={cn(\n\t\t\t\t\t\tclasses?.actionButton,\n\t\t\t\t\t\ttoast?.classes?.actionButton\n\t\t\t\t\t)}\n\t\t\t\t\tonclick={(event) => {\n\t\t\t\t\t\tif (!isAction(toast.action)) return;\n\t\t\t\t\t\ttoast.action?.onClick(event);\n\t\t\t\t\t\tif (event.defaultPrevented) return;\n\t\t\t\t\t\tdeleteToast();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{toast.action.label}\n\t\t\t\t</button>\n\t\t\t{/if}\n\t\t{/if}\n\t{/if}\n</li>\n","<svg\n\taria-hidden=\"true\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\tviewBox=\"0 0 20 20\"\n\tfill=\"currentColor\"\n\theight=\"20\"\n\twidth=\"20\"\n\tdata-sonner-success-icon\n>\n\t<path\n\t\tfill-rule=\"evenodd\"\n\t\td=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\"\n\t\tclip-rule=\"evenodd\"\n\t/>\n</svg>\n","<svg\n\taria-hidden=\"true\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\tviewBox=\"0 0 20 20\"\n\tfill=\"currentColor\"\n\theight=\"20\"\n\twidth=\"20\"\n\tdata-sonner-error-icon\n>\n\t<path\n\t\tfill-rule=\"evenodd\"\n\t\td=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\"\n\t\tclip-rule=\"evenodd\"\n\t/>\n</svg>\n","<svg\n\taria-hidden=\"true\"\n\tviewBox=\"0 0 64 64\"\n\tfill=\"currentColor\"\n\theight=\"20\"\n\twidth=\"20\"\n\tdata-sonner-warning-icon\n\txmlns=\"http://www.w3.org/2000/svg\"\n>\n\t<path\n\t\td=\"M32.427,7.987c2.183,0.124 4,1.165 5.096,3.281l17.936,36.208c1.739,3.66 -0.954,8.585 -5.373,8.656l-36.119,0c-4.022,-0.064 -7.322,-4.631 -5.352,-8.696l18.271,-36.207c0.342,-0.65 0.498,-0.838 0.793,-1.179c1.186,-1.375 2.483,-2.111 4.748,-2.063Zm-0.295,3.997c-0.687,0.034 -1.316,0.419 -1.659,1.017c-6.312,11.979 -12.397,24.081 -18.301,36.267c-0.546,1.225 0.391,2.797 1.762,2.863c12.06,0.195 24.125,0.195 36.185,0c1.325,-0.064 2.321,-1.584 1.769,-2.85c-5.793,-12.184 -11.765,-24.286 -17.966,-36.267c-0.366,-0.651 -0.903,-1.042 -1.79,-1.03Z\"\n\t/>\n\t<path\n\t\td=\"M33.631,40.581l-3.348,0l-0.368,-16.449l4.1,0l-0.384,16.449Zm-3.828,5.03c0,-0.609 0.197,-1.113 0.592,-1.514c0.396,-0.4 0.935,-0.601 1.618,-0.601c0.684,0 1.223,0.201 1.618,0.601c0.395,0.401 0.593,0.905 0.593,1.514c0,0.587 -0.193,1.078 -0.577,1.473c-0.385,0.395 -0.929,0.593 -1.634,0.593c-0.705,0 -1.249,-0.198 -1.634,-0.593c-0.384,-0.395 -0.576,-0.886 -0.576,-1.473Z\"\n\t/>\n</svg>\n","<svg\n\taria-hidden=\"true\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\tviewBox=\"0 0 20 20\"\n\tfill=\"currentColor\"\n\theight=\"20\"\n\twidth=\"20\"\n\tdata-sonner-info-icon\n>\n\t<path\n\t\tfill-rule=\"evenodd\"\n\t\td=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\"\n\t\tclip-rule=\"evenodd\"\n\t/>\n</svg>\n","<svg\n\taria-hidden=\"true\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\twidth=\"12\"\n\theight=\"12\"\n\tviewBox=\"0 0 24 24\"\n\tfill=\"none\"\n\tstroke=\"currentColor\"\n\tstroke-width=\"1.5\"\n\tstroke-linecap=\"round\"\n\tstroke-linejoin=\"round\"\n\tdata-sonner-close-icon\n>\n\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n</svg>\n","<script lang=\"ts\" module>\n\t// visible toasts amount\n\tconst VISIBLE_TOASTS_AMOUNT = 3;\n\n\t// Viewport padding\n\tconst VIEWPORT_OFFSET = '24px';\n\n\t// Mobile viewport padding\n\tconst MOBILE_VIEWPORT_OFFSET = '16px';\n\n\t// Default lifetime of a toasts (in ms)\n\tconst TOAST_LIFETIME = 4000;\n\n\t// Default toast width\n\tconst TOAST_WIDTH = 356;\n\n\t// Default gap between toasts\n\tconst GAP = 14;\n\n\tconst DARK = 'dark';\n\tconst LIGHT = 'light';\n\n\ttype OffsetObject = {\n\t\t'--offset-top': string;\n\t\t'--offset-right': string;\n\t\t'--offset-bottom': string;\n\t\t'--offset-left': string;\n\t\t'--mobile-offset-top': string;\n\t\t'--mobile-offset-right': string;\n\t\t'--mobile-offset-bottom': string;\n\t\t'--mobile-offset-left': string;\n\t};\n\n\tfunction getOffsetObject(\n\t\tdefaultOffset: ToasterProps['offset'],\n\t\tmobileOffset: ToasterProps['mobileOffset']\n\t) {\n\t\tconst styles = {} as OffsetObject;\n\n\t\t[defaultOffset, mobileOffset].forEach((offset, index) => {\n\t\t\tconst isMobile = index === 1;\n\t\t\tconst prefix = isMobile ? '--mobile-offset' : '--offset';\n\t\t\tconst defaultValue = isMobile\n\t\t\t\t? MOBILE_VIEWPORT_OFFSET\n\t\t\t\t: VIEWPORT_OFFSET;\n\n\t\t\tfunction assignAll(offset: string | number) {\n\t\t\t\t['top', 'right', 'bottom', 'left'].forEach((key) => {\n\t\t\t\t\tstyles[`${prefix}-${key}` as keyof OffsetObject] =\n\t\t\t\t\t\ttypeof offset === 'number' ? `${offset}px` : offset;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (typeof offset === 'number' || typeof offset === 'string') {\n\t\t\t\tassignAll(offset);\n\t\t\t} else if (typeof offset === 'object') {\n\t\t\t\t['top', 'right', 'bottom', 'left'].forEach((key) => {\n\t\t\t\t\tconst value = offset[key as keyof typeof offset];\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tstyles[`${prefix}-${key}` as keyof OffsetObject] =\n\t\t\t\t\t\t\tdefaultValue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstyles[`${prefix}-${key}` as keyof OffsetObject] =\n\t\t\t\t\t\t\ttypeof value === 'number' ? `${value}px` : value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tassignAll(defaultValue);\n\t\t\t}\n\t\t});\n\n\t\treturn styles;\n\t}\n</script>\n\n<script lang=\"ts\">\n\timport { onMount, untrack } from 'svelte';\n\timport { SonnerState, toastState } from './toast-state.svelte';\n\timport Toast from './Toast.svelte';\n\timport type { ToasterProps } from './types.js';\n\timport type { Position } from './types.js';\n\timport type {\n\t\tDragEventHandler,\n\t\tFocusEventHandler,\n\t\tMouseEventHandler,\n\t\tPointerEventHandler\n\t} from 'svelte/elements';\n\timport SuccessIcon from './icons/SuccessIcon.svelte';\n\timport ErrorIcon from './icons/ErrorIcon.svelte';\n\timport WarningIcon from './icons/WarningIcon.svelte';\n\timport InfoIcon from './icons/InfoIcon.svelte';\n\timport CloseIcon from './icons/CloseIcon.svelte';\n\timport { sonnerContext } from './internal/ctx.js';\n\timport { on } from 'svelte/events';\n\n\tfunction getInitialTheme(t: string) {\n\t\tif (t !== 'system') return t;\n\t\tif (typeof window !== 'undefined') {\n\t\t\tif (\n\t\t\t\twindow.matchMedia &&\n\t\t\t\twindow.matchMedia('(prefers-color-scheme: dark)').matches\n\t\t\t) {\n\t\t\t\treturn DARK;\n\t\t\t}\n\n\t\t\treturn LIGHT;\n\t\t}\n\n\t\treturn LIGHT;\n\t}\n\n\tlet {\n\t\tid,\n\t\tinvert = false,\n\t\tposition = 'bottom-right',\n\t\thotkey = ['altKey', 'KeyT'],\n\t\texpand = false,\n\t\tcloseButton = false,\n\t\toffset = VIEWPORT_OFFSET,\n\t\tmobileOffset = MOBILE_VIEWPORT_OFFSET,\n\t\ttheme = 'light',\n\t\trichColors = false,\n\t\tduration = TOAST_LIFETIME,\n\t\tvisibleToasts = VISIBLE_TOASTS_AMOUNT,\n\t\ttoastOptions = {},\n\t\tdir = 'auto',\n\t\tgap = GAP,\n\t\tswipeDirections,\n\t\tpauseWhenPageIsHidden = false,\n\t\tloadingIcon: loadingIconProp,\n\t\tsuccessIcon: successIconProp,\n\t\terrorIcon: errorIconProp,\n\t\twarningIcon: warningIconProp,\n\t\tcloseIcon: closeIconProp,\n\t\tinfoIcon: infoIconProp,\n\t\tcontainerAriaLabel = 'Notifications',\n\t\tclass: className,\n\t\tcloseButtonAriaLabel = 'Close toast',\n\t\tonblur,\n\t\tonfocus,\n\t\tonmouseenter,\n\t\tonmousemove,\n\t\tonmouseleave,\n\t\tondragend,\n\t\tonpointerdown,\n\t\tonpointerup,\n\t\t...restProps\n\t}: ToasterProps = $props();\n\n\tfunction getDocumentDirection(): ToasterProps['dir'] {\n\t\tif (dir !== 'auto') return dir;\n\t\tif (typeof window === 'undefined') return 'ltr';\n\t\tif (typeof document === 'undefined') return 'ltr'; // For Fresh purpose\n\n\t\tconst dirAttribute = document.documentElement.getAttribute(\n\t\t\t'dir'\n\t\t) as ToasterProps['dir'];\n\n\t\tif (dirAttribute === 'auto' || !dirAttribute) {\n\t\t\tuntrack(\n\t\t\t\t() =>\n\t\t\t\t\t(dir =\n\t\t\t\t\t\t(window.getComputedStyle(document.documentElement)\n\t\t\t\t\t\t\t.direction as ToasterProps['dir']) ?? 'ltr')\n\t\t\t);\n\t\t\treturn dir;\n\t\t}\n\n\t\tuntrack(() => (dir = dirAttribute));\n\t\treturn dirAttribute;\n\t}\n\n\t// The slice of the shared toast state this toaster renders: an id-less toaster\n\t// shows only toasts without a toasterId (upstream sonner semantics).\n\tconst filteredToasts = $derived(\n\t\tid\n\t\t\t? toastState.toasts.filter((toast) => toast.toasterId === id)\n\t\t\t: toastState.toasts.filter((toast) => !toast.toasterId)\n\t);\n\n\tconst possiblePositions = $derived(\n\t\tArray.from(\n\t\t\tnew Set(\n\t\t\t\t[\n\t\t\t\t\tposition,\n\t\t\t\t\t...filteredToasts\n\t\t\t\t\t\t.filter((toast) => toast.position)\n\t\t\t\t\t\t.map((toast) => toast.position)\n\t\t\t\t].filter(Boolean)\n\t\t\t)\n\t\t) as Position[]\n\t);\n\n\tlet expanded = $state(false);\n\tlet interacting = $state(false);\n\tlet actualTheme = $state(getInitialTheme(theme));\n\tlet listRef = $state<HTMLOListElement>();\n\tlet lastFocusedElementRef = $state<HTMLElement | null>(null);\n\tlet isFocusWithin = $state(false);\n\tlet lastMousePosition: { x: number; y: number } | null = null;\n\n\tconst hotkeyLabel = $derived(\n\t\thotkey.join('+').replace(/Key/g, '').replace(/Digit/g, '')\n\t);\n\n\t$effect(() => {\n\t\tif (filteredToasts.length <= 1) {\n\t\t\texpanded = false;\n\t\t}\n\t});\n\n\t// Check for dismissed toasts and remove them. We need to do this to have dismiss animation.\n\t$effect(() => {\n\t\tconst toastsToDismiss = filteredToasts.filter(\n\t\t\t(toast) => toast.dismiss && !toast.delete\n\t\t);\n\n\t\tif (toastsToDismiss.length > 0) {\n\t\t\tconst updatedToasts = toastState.toasts.map((toast) => {\n\t\t\t\tconst matchingToast = toastsToDismiss.find(\n\t\t\t\t\t(dismissToast) => dismissToast.id === toast.id\n\t\t\t\t);\n\n\t\t\t\tif (matchingToast) {\n\t\t\t\t\treturn { ...toast, delete: true };\n\t\t\t\t}\n\n\t\t\t\treturn toast;\n\t\t\t});\n\t\t\ttoastState.toasts = updatedToasts;\n\t\t}\n\t});\n\n\t$effect(() => {\n\t\treturn () => {\n\t\t\tif (listRef && lastFocusedElementRef) {\n\t\t\t\tlastFocusedElementRef.focus({ preventScroll: true });\n\t\t\t\tlastFocusedElementRef = null;\n\t\t\t\tisFocusWithin = false;\n\t\t\t}\n\t\t};\n\t});\n\n\tonMount(() => {\n\t\tconst handleKeydown = (event: KeyboardEvent) => {\n\t\t\tconst isHotkeyPressed = hotkey.every(\n\t\t\t\t(key) =>\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\t\t(event as any)[key] || event.code === key\n\t\t\t);\n\t\t\tif (isHotkeyPressed) {\n\t\t\t\texpanded = true;\n\t\t\t\tlistRef?.focus();\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tevent.code === 'Escape' &&\n\t\t\t\t(document.activeElement === listRef ||\n\t\t\t\t\tlistRef?.contains(document.activeElement))\n\t\t\t) {\n\t\t\t\texpanded = false;\n\t\t\t}\n\t\t};\n\n\t\treturn on(document, 'keydown', handleKeydown);\n\t});\n\n\t$effect(() => {\n\t\tif (theme !== 'system') {\n\t\t\tactualTheme = theme;\n\t\t}\n\n\t\tif (typeof window !== 'undefined') {\n\t\t\tif (theme === 'system') {\n\t\t\t\tif (\n\t\t\t\t\twindow.matchMedia &&\n\t\t\t\t\twindow.matchMedia('(prefers-color-scheme: dark)').matches\n\t\t\t\t) {\n\t\t\t\t\tactualTheme = DARK;\n\t\t\t\t} else {\n\t\t\t\t\tactualTheme = LIGHT;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst mediaQueryList = window.matchMedia(\n\t\t\t\t'(prefers-color-scheme: dark)'\n\t\t\t);\n\n\t\t\tconst changeHandler = ({ matches }: MediaQueryListEvent) => {\n\t\t\t\tif (theme !== 'system') return;\n\t\t\t\tactualTheme = matches ? DARK : LIGHT;\n\t\t\t};\n\n\t\t\tif ('addEventListener' in mediaQueryList) {\n\t\t\t\tmediaQueryList.addEventListener('change', changeHandler);\n\t\t\t} else {\n\t\t\t\t// @ts-expect-error deprecated API\n\t\t\t\tmediaQueryList.addListener(changeHandler);\n\t\t\t}\n\t\t}\n\t});\n\n\tconst handleBlur: FocusEventHandler<HTMLOListElement> = (event) => {\n\t\tonblur?.(event);\n\t\tif (\n\t\t\tisFocusWithin &&\n\t\t\t!event.currentTarget.contains(event.relatedTarget as HTMLElement)\n\t\t) {\n\t\t\tisFocusWithin = false;\n\t\t\tif (lastFocusedElementRef) {\n\t\t\t\tlastFocusedElementRef.focus({ preventScroll: true });\n\t\t\t\tlastFocusedElementRef = null;\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleFocus: FocusEventHandler<HTMLOListElement> = (event) => {\n\t\tonfocus?.(event);\n\t\tconst isNotDismissable =\n\t\t\tevent.target instanceof HTMLElement &&\n\t\t\tevent.target.dataset.dismissible === 'false';\n\n\t\tif (isNotDismissable) return;\n\n\t\tif (!isFocusWithin) {\n\t\t\tisFocusWithin = true;\n\t\t\tlastFocusedElementRef = event.relatedTarget as HTMLElement;\n\t\t}\n\t};\n\n\tconst handlePointerDown: PointerEventHandler<HTMLOListElement> = (\n\t\tevent\n\t) => {\n\t\tonpointerdown?.(event);\n\t\tconst isNotDismissable =\n\t\t\tevent.target instanceof HTMLElement &&\n\t\t\tevent.target.dataset.dismissible === 'false';\n\n\t\tif (isNotDismissable) return;\n\t\tinteracting = true;\n\t};\n\n\tconst handleMouseEnter: MouseEventHandler<HTMLOListElement> = (event) => {\n\t\tonmouseenter?.(event);\n\t\tlastMousePosition = { x: event.clientX, y: event.clientY };\n\t\texpanded = true;\n\t};\n\n\tconst handleMouseLeave: MouseEventHandler<HTMLOListElement> = (event) => {\n\t\tonmouseleave?.(event);\n\n\t\t// fix firefox firing mouseleave when the toast is closed by clicking\n\t\t// the close button and the toast leaves the mouse position. This doesn't\n\t\t// happen on other browsers, since the mouse wasn't moved by the user.\n\t\t// so we only collapse if mouse actually moved from last known position\n\t\tconst currentPosition = { x: event.clientX, y: event.clientY };\n\t\tconst mouseActuallyMoved =\n\t\t\t!lastMousePosition ||\n\t\t\tMath.abs(currentPosition.x - lastMousePosition.x) > 1 ||\n\t\t\tMath.abs(currentPosition.y - lastMousePosition.y) > 1;\n\n\t\tif (!interacting && mouseActuallyMoved) {\n\t\t\texpanded = false;\n\t\t}\n\t};\n\n\tconst handleMouseMove: MouseEventHandler<HTMLOListElement> = (event) => {\n\t\tonmousemove?.(event);\n\t\tlastMousePosition = { x: event.clientX, y: event.clientY };\n\t\texpanded = true;\n\t};\n\n\tconst handleDragEnd: DragEventHandler<HTMLOListElement> = (event) => {\n\t\tondragend?.(event);\n\t\texpanded = false;\n\t};\n\n\tconst handlePointerUp: PointerEventHandler<HTMLOListElement> = (event) => {\n\t\tonpointerup?.(event);\n\t\tinteracting = false;\n\t};\n\n\tsonnerContext.set(new SonnerState());\n</script>\n\n<!-- eslint-disable-next-line svelte/valid-compile -->\n<!-- svelte-ignore a11y_no_noninteractive_tabindex -->\n<section\n\taria-label=\"{containerAriaLabel} {hotkeyLabel}\"\n\ttabindex={-1}\n\taria-live=\"polite\"\n\taria-relevant=\"additions text\"\n\taria-atomic=\"false\"\n>\n\t{#if filteredToasts.length > 0}\n\t\t{#each possiblePositions as position, index (position)}\n\t\t\t{@const [y, x] = position.split('-')}\n\t\t\t{@const offsetObject = getOffsetObject(offset, mobileOffset)}\n\t\t\t{@const frontHeight =\n\t\t\t\ttoastState.heights.find(\n\t\t\t\t\t(height) =>\n\t\t\t\t\t\theight.toasterId === id && height.position === position\n\t\t\t\t)?.height ?? 0}\n\t\t\t<!-- eslint-disable-next-line svelte/valid-compile -->\n\t\t\t<!-- svelte-ignore a11y_no_noninteractive_tabindex -->\n\t\t\t<ol\n\t\t\t\ttabindex={-1}\n\t\t\t\tdir={getDocumentDirection()}\n\t\t\t\tbind:this={listRef}\n\t\t\t\tclass={className}\n\t\t\t\tdata-sonner-toaster\n\t\t\t\tdata-sonner-theme={actualTheme}\n\t\t\t\tdata-y-position={y}\n\t\t\t\tdata-x-position={x}\n\t\t\t\tstyle:--front-toast-height={`${frontHeight}px`}\n\t\t\t\tstyle:--width={`${TOAST_WIDTH}px`}\n\t\t\t\tstyle:--gap={`${gap}px`}\n\t\t\t\tstyle:--offset-top={offsetObject['--offset-top']}\n\t\t\t\tstyle:--offset-right={offsetObject['--offset-right']}\n\t\t\t\tstyle:--offset-bottom={offsetObject['--offset-bottom']}\n\t\t\t\tstyle:--offset-left={offsetObject['--offset-left']}\n\t\t\t\tstyle:--mobile-offset-top={offsetObject['--mobile-offset-top']}\n\t\t\t\tstyle:--mobile-offset-right={offsetObject[\n\t\t\t\t\t'--mobile-offset-right'\n\t\t\t\t]}\n\t\t\t\tstyle:--mobile-offset-bottom={offsetObject[\n\t\t\t\t\t'--mobile-offset-bottom'\n\t\t\t\t]}\n\t\t\t\tstyle:--mobile-offset-left={offsetObject[\n\t\t\t\t\t'--mobile-offset-left'\n\t\t\t\t]}\n\t\t\t\tstyle={restProps.style}\n\t\t\t\tonblur={handleBlur}\n\t\t\t\tonfocus={handleFocus}\n\t\t\t\tonmouseenter={handleMouseEnter}\n\t\t\t\tonmousemove={handleMouseMove}\n\t\t\t\tonmouseleave={handleMouseLeave}\n\t\t\t\tondragend={handleDragEnd}\n\t\t\t\tonpointerdown={handlePointerDown}\n\t\t\t\tonpointerup={handlePointerUp}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t{#each filteredToasts.filter((toast) => (!toast.position && index === 0) || toast.position === position) as toast, index (toast.id)}\n\t\t\t\t\t<Toast\n\t\t\t\t\t\t{index}\n\t\t\t\t\t\t{toast}\n\t\t\t\t\t\tdefaultRichColors={richColors}\n\t\t\t\t\t\tduration={toastOptions?.duration ?? duration}\n\t\t\t\t\t\tclass={toastOptions?.class ?? ''}\n\t\t\t\t\t\tdescriptionClass={toastOptions?.descriptionClass || ''}\n\t\t\t\t\t\t{invert}\n\t\t\t\t\t\t{visibleToasts}\n\t\t\t\t\t\tcloseButton={toastOptions?.closeButton ?? closeButton}\n\t\t\t\t\t\t{interacting}\n\t\t\t\t\t\t{position}\n\t\t\t\t\t\t{gap}\n\t\t\t\t\t\tstyle={toastOptions?.style ?? ''}\n\t\t\t\t\t\tclasses={toastOptions.classes || {}}\n\t\t\t\t\t\tunstyled={toastOptions.unstyled ?? false}\n\t\t\t\t\t\tcancelButtonStyle={toastOptions?.cancelButtonStyle ??\n\t\t\t\t\t\t\t''}\n\t\t\t\t\t\tactionButtonStyle={toastOptions?.actionButtonStyle ??\n\t\t\t\t\t\t\t''}\n\t\t\t\t\t\tcloseButtonAriaLabel={toastOptions?.closeButtonAriaLabel ??\n\t\t\t\t\t\t\tcloseButtonAriaLabel}\n\t\t\t\t\t\texpandByDefault={expand}\n\t\t\t\t\t\t{expanded}\n\t\t\t\t\t\t{swipeDirections}\n\t\t\t\t\t\t{pauseWhenPageIsHidden}\n\t\t\t\t\t\tloadingIcon={loadingIconProp}\n\t\t\t\t\t>\n\t\t\t\t\t\t{#snippet successIcon()}\n\t\t\t\t\t\t\t{#if successIconProp}\n\t\t\t\t\t\t\t\t{@render successIconProp?.()}\n\t\t\t\t\t\t\t{:else if successIconProp !== null}\n\t\t\t\t\t\t\t\t<SuccessIcon />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/snippet}\n\n\t\t\t\t\t\t{#snippet errorIcon()}\n\t\t\t\t\t\t\t{#if errorIconProp}\n\t\t\t\t\t\t\t\t{@render errorIconProp?.()}\n\t\t\t\t\t\t\t{:else if errorIconProp !== null}\n\t\t\t\t\t\t\t\t<ErrorIcon />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/snippet}\n\n\t\t\t\t\t\t{#snippet warningIcon()}\n\t\t\t\t\t\t\t{#if warningIconProp}\n\t\t\t\t\t\t\t\t{@render warningIconProp?.()}\n\t\t\t\t\t\t\t{:else if warningIconProp !== null}\n\t\t\t\t\t\t\t\t<WarningIcon />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/snippet}\n\n\t\t\t\t\t\t{#snippet infoIcon()}\n\t\t\t\t\t\t\t{#if infoIconProp}\n\t\t\t\t\t\t\t\t{@render infoIconProp?.()}\n\t\t\t\t\t\t\t{:else if infoIconProp !== null}\n\t\t\t\t\t\t\t\t<InfoIcon />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/snippet}\n\n\t\t\t\t\t\t{#snippet closeIcon()}\n\t\t\t\t\t\t\t{#if closeIconProp}\n\t\t\t\t\t\t\t\t{@render closeIconProp?.()}\n\t\t\t\t\t\t\t{:else if closeIconProp !== null}\n\t\t\t\t\t\t\t\t<CloseIcon />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/snippet}\n\t\t\t\t\t</Toast>\n\t\t\t\t{/each}\n\t\t\t</ol>\n\t\t{/each}\n\t{/if}\n</section>\n\n<style>\n\t:global {\n\t\thtml[dir='ltr'],\n\t\t[data-sonner-toaster][dir='ltr'] {\n\t\t\t--toast-icon-margin-start: -3px;\n\t\t\t--toast-icon-margin-end: 4px;\n\t\t\t--toast-svg-margin-start: -1px;\n\t\t\t--toast-svg-margin-end: 0px;\n\t\t\t--toast-button-margin-start: auto;\n\t\t\t--toast-button-margin-end: 0;\n\t\t\t--toast-close-button-start: 0;\n\t\t\t--toast-close-button-end: unset;\n\t\t\t--toast-close-button-transform: translate(-35%, -35%);\n\t\t}\n\n\t\thtml[dir='rtl'],\n\t\t[data-sonner-toaster][dir='rtl'] {\n\t\t\t--toast-icon-margin-start: 4px;\n\t\t\t--toast-icon-margin-end: -3px;\n\t\t\t--toast-svg-margin-start: 0px;\n\t\t\t--toast-svg-margin-end: -1px;\n\t\t\t--toast-button-margin-start: 0;\n\t\t\t--toast-button-margin-end: auto;\n\t\t\t--toast-close-button-start: unset;\n\t\t\t--toast-close-button-end: 0;\n\t\t\t--toast-close-button-transform: translate(35%, -35%);\n\t\t}\n\n\t\t[data-sonner-toaster] {\n\t\t\tposition: fixed;\n\t\t\twidth: var(--width);\n\t\t\tfont-family:\n\t\t\t\tui-sans-serif,\n\t\t\t\tsystem-ui,\n\t\t\t\t-apple-system,\n\t\t\t\tBlinkMacSystemFont,\n\t\t\t\tSegoe UI,\n\t\t\t\tRoboto,\n\t\t\t\tHelvetica Neue,\n\t\t\t\tArial,\n\t\t\t\tNoto Sans,\n\t\t\t\tsans-serif,\n\t\t\t\tApple Color Emoji,\n\t\t\t\tSegoe UI Emoji,\n\t\t\t\tSegoe UI Symbol,\n\t\t\t\tNoto Color Emoji;\n\t\t\t--gray1: hsl(0, 0%, 99%);\n\t\t\t--gray2: hsl(0, 0%, 97.3%);\n\t\t\t--gray3: hsl(0, 0%, 95.1%);\n\t\t\t--gray4: hsl(0, 0%, 93%);\n\t\t\t--gray5: hsl(0, 0%, 90.9%);\n\t\t\t--gray6: hsl(0, 0%, 88.7%);\n\t\t\t--gray7: hsl(0, 0%, 85.8%);\n\t\t\t--gray8: hsl(0, 0%, 78%);\n\t\t\t--gray9: hsl(0, 0%, 56.1%);\n\t\t\t--gray10: hsl(0, 0%, 52.3%);\n\t\t\t--gray11: hsl(0, 0%, 43.5%);\n\t\t\t--gray12: hsl(0, 0%, 9%);\n\t\t\t--border-radius: 8px;\n\t\t\tbox-sizing: border-box;\n\t\t\tpadding: 0;\n\t\t\tmargin: 0;\n\t\t\tlist-style: none;\n\t\t\toutline: none;\n\t\t\tz-index: 999999999;\n\t\t\ttransition: transform 400ms ease;\n\t\t}\n\n\t\t@media (hover: none) and (pointer: coarse) {\n\t\t\t[data-sonner-toaster][data-lifted='true'] {\n\t\t\t\ttransform: none;\n\t\t\t}\n\t\t}\n\n\t\t[data-sonner-toaster][data-x-position='right'] {\n\t\t\tright: var(--offset-right);\n\t\t}\n\n\t\t[data-sonner-toaster][data-x-position='left'] {\n\t\t\tleft: var(--offset-left);\n\t\t}\n\n\t\t[data-sonner-toaster][data-x-position='center'] {\n\t\t\tleft: 50%;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\n\t\t[data-sonner-toaster][data-y-position='top'] {\n\t\t\ttop: var(--offset-top);\n\t\t}\n\n\t\t[data-sonner-toaster][data-y-position='bottom'] {\n\t\t\tbottom: var(--offset-bottom);\n\t\t}\n\n\t\t[data-sonner-toast] {\n\t\t\t--y: translateY(100%);\n\t\t\t--lift-amount: calc(var(--lift) * var(--gap));\n\t\t\tz-index: var(--z-index);\n\t\t\tposition: absolute;\n\t\t\topacity: 0;\n\t\t\ttransform: var(--y);\n\t\t\ttouch-action: none;\n\t\t\ttransition:\n\t\t\t\ttransform 400ms,\n\t\t\t\topacity 400ms,\n\t\t\t\theight 400ms,\n\t\t\t\tbox-shadow 200ms;\n\t\t\tbox-sizing: border-box;\n\t\t\toutline: none;\n\t\t\toverflow-wrap: anywhere;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] {\n\t\t\tpadding: 16px;\n\t\t\tbackground: var(--normal-bg);\n\t\t\tborder: 1px solid var(--normal-border);\n\t\t\tcolor: var(--normal-text);\n\t\t\tborder-radius: var(--border-radius);\n\t\t\tbox-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);\n\t\t\twidth: var(--width);\n\t\t\tfont-size: 13px;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: 6px;\n\t\t}\n\n\t\t[data-sonner-toast]:focus-visible {\n\t\t\tbox-shadow:\n\t\t\t\t0px 4px 12px rgba(0, 0, 0, 0.1),\n\t\t\t\t0 0 0 2px rgba(0, 0, 0, 0.2);\n\t\t}\n\n\t\t[data-sonner-toast][data-y-position='top'] {\n\t\t\ttop: 0;\n\t\t\t--y: translateY(-100%);\n\t\t\t--lift: 1;\n\t\t\t--lift-amount: calc(1 * var(--gap));\n\t\t}\n\n\t\t[data-sonner-toast][data-y-position='bottom'] {\n\t\t\tbottom: 0;\n\t\t\t--y: translateY(100%);\n\t\t\t--lift: -1;\n\t\t\t--lift-amount: calc(var(--lift) * var(--gap));\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-description] {\n\t\t\tfont-weight: 400;\n\t\t\tline-height: 1.4;\n\t\t\tcolor: #3f3f3f;\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-styled='true']\n\t\t\t[data-description] {\n\t\t\tcolor: inherit;\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='dark'] [data-description] {\n\t\t\tcolor: hsl(0, 0%, 91%);\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-title] {\n\t\t\tfont-weight: 500;\n\t\t\tline-height: 1.5;\n\t\t\tcolor: inherit;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-icon] {\n\t\t\tdisplay: flex;\n\t\t\theight: 16px;\n\t\t\twidth: 16px;\n\t\t\tposition: relative;\n\t\t\tjustify-content: flex-start;\n\t\t\talign-items: center;\n\t\t\tflex-shrink: 0;\n\t\t\tmargin-left: var(--toast-icon-margin-start);\n\t\t\tmargin-right: var(--toast-icon-margin-end);\n\t\t}\n\n\t\t[data-sonner-toast][data-promise='true'] [data-icon] > svg {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.8);\n\t\t\ttransform-origin: center;\n\t\t\tanimation: sonner-fade-in 300ms ease forwards;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-icon] > * {\n\t\t\tflex-shrink: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-icon] svg {\n\t\t\tmargin-left: var(--toast-svg-margin-start);\n\t\t\tmargin-right: var(--toast-svg-margin-end);\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-content] {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 2px;\n\t\t\t/* Take the space the icon and the buttons leave, so a custom title or\n\t\t description isn't limited to the width of its text */\n\t\t\tflex: 1;\n\t\t\tmin-width: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-button] {\n\t\t\tborder-radius: 4px;\n\t\t\tpadding-left: 8px;\n\t\t\tpadding-right: 8px;\n\t\t\theight: 24px;\n\t\t\tfont-size: 12px;\n\t\t\tcolor: var(--normal-bg);\n\t\t\tbackground: var(--normal-text);\n\t\t\tmargin-left: var(--toast-button-margin-start);\n\t\t\tmargin-right: var(--toast-button-margin-end);\n\t\t\tborder: none;\n\t\t\tfont-weight: 500;\n\t\t\tcursor: pointer;\n\t\t\toutline: none;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tflex-shrink: 0;\n\t\t\ttransition:\n\t\t\t\topacity 400ms,\n\t\t\t\tbox-shadow 200ms;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-button]:focus-visible {\n\t\t\tbox-shadow: 0 0 0 2px rgba(0, 0, 0, 0.4);\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-button]:first-of-type {\n\t\t\tmargin-left: var(--toast-button-margin-start);\n\t\t\tmargin-right: var(--toast-button-margin-end);\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-cancel] {\n\t\t\tcolor: var(--normal-text);\n\t\t\tbackground: rgba(0, 0, 0, 0.08);\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='dark']\n\t\t\t[data-sonner-toast][data-styled='true']\n\t\t\t[data-cancel] {\n\t\t\tbackground: rgba(255, 255, 255, 0.3);\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-close-button] {\n\t\t\tposition: absolute;\n\t\t\tleft: var(--toast-close-button-start);\n\t\t\tright: var(--toast-close-button-end);\n\t\t\ttop: 0;\n\t\t\theight: 20px;\n\t\t\twidth: 20px;\n\t\t\tdisplay: flex;\n\t\t\tjustify-content: center;\n\t\t\talign-items: center;\n\t\t\tpadding: 0;\n\t\t\tcolor: var(--gray12);\n\t\t\tbackground: var(--normal-bg);\n\t\t\tborder: 1px solid var(--gray4);\n\t\t\ttransform: var(--toast-close-button-transform);\n\t\t\tborder-radius: 50%;\n\t\t\tcursor: pointer;\n\t\t\tz-index: 1;\n\t\t\ttransition:\n\t\t\t\topacity 100ms,\n\t\t\t\tbackground 200ms,\n\t\t\t\tborder-color 200ms;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true']\n\t\t\t[data-close-button]:focus-visible {\n\t\t\tbox-shadow:\n\t\t\t\t0px 4px 12px rgba(0, 0, 0, 0.1),\n\t\t\t\t0 0 0 2px rgba(0, 0, 0, 0.2);\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true'] [data-disabled='true'] {\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t[data-sonner-toast][data-styled='true']:hover\n\t\t\t[data-close-button]:hover {\n\t\t\tbackground: var(--gray2);\n\t\t\tborder-color: var(--gray5);\n\t\t}\n\n\t\t[data-sonner-toast][data-swiping='true']::before {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tleft: -100%;\n\t\t\tright: -100%;\n\t\t\theight: 100%;\n\t\t\tz-index: -1;\n\t\t}\n\n\t\t[data-sonner-toast][data-y-position='top'][data-swiping='true']::before {\n\t\t\tbottom: 50%;\n\t\t\ttransform: scaleY(3) translateY(50%);\n\t\t}\n\n\t\t[data-sonner-toast][data-y-position='bottom'][data-swiping='true']::before {\n\t\t\ttop: 50%;\n\t\t\ttransform: scaleY(3) translateY(-50%);\n\t\t}\n\n\t\t[data-sonner-toast][data-swiping='false'][data-removed='true']::before {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tinset: 0;\n\t\t\ttransform: scaleY(2);\n\t\t}\n\n\t\t[data-sonner-toast][data-expanded='true']::after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tleft: 0;\n\t\t\theight: calc(var(--gap) + 1px);\n\t\t\tbottom: 100%;\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t[data-sonner-toast][data-mounted='true'] {\n\t\t\t--y: translateY(0);\n\t\t\topacity: 1;\n\t\t}\n\n\t\t[data-sonner-toast][data-expanded='false'][data-front='false'] {\n\t\t\t--scale: var(--toasts-before) * 0.05 + 1;\n\t\t\t--y: translateY(calc(var(--lift-amount) * var(--toasts-before)))\n\t\t\t\tscale(calc(-1 * var(--scale)));\n\t\t\theight: var(--front-toast-height);\n\t\t}\n\n\t\t[data-sonner-toast] > * {\n\t\t\ttransition: opacity 400ms;\n\t\t}\n\n\t\t[data-sonner-toast][data-x-position='right'] {\n\t\t\tright: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-x-position='left'] {\n\t\t\tleft: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-expanded='false'][data-front='false'][data-styled='true']\n\t\t\t> * {\n\t\t\topacity: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-visible='false'] {\n\t\t\topacity: 0;\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t[data-sonner-toast][data-mounted='true'][data-expanded='true'] {\n\t\t\t--y: translateY(calc(var(--lift) * var(--offset)));\n\t\t\theight: var(--initial-height);\n\t\t}\n\n\t\t[data-sonner-toast][data-removed='true'][data-front='true'][data-swipe-out='false'] {\n\t\t\t--y: translateY(calc(var(--lift) * -100%));\n\t\t\topacity: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-removed='true'][data-front='false'][data-swipe-out='false'][data-expanded='true'] {\n\t\t\t--y: translateY(\n\t\t\t\tcalc(var(--lift) * var(--offset) + var(--lift) * -100%)\n\t\t\t);\n\t\t\topacity: 0;\n\t\t}\n\n\t\t[data-sonner-toast][data-removed='true'][data-front='false'][data-swipe-out='false'][data-expanded='false'] {\n\t\t\t--y: translateY(40%);\n\t\t\topacity: 0;\n\t\t\ttransition:\n\t\t\t\ttransform 500ms,\n\t\t\t\topacity 200ms;\n\t\t}\n\n\t\t[data-sonner-toast][data-removed='true'][data-front='false']::before {\n\t\t\theight: calc(var(--initial-height) + 20%);\n\t\t}\n\n\t\t[data-sonner-toast][data-swiping='true'] {\n\t\t\ttransform: var(--y) translateY(var(--swipe-amount-y, 0px))\n\t\t\t\ttranslateX(var(--swipe-amount-x, 0px));\n\t\t\ttransition: none;\n\t\t}\n\n\t\t[data-sonner-toast][data-swiped='true'] {\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t[data-sonner-toast][data-swipe-out='true'][data-y-position='bottom'],\n\t\t[data-sonner-toast][data-swipe-out='true'][data-y-position='top'] {\n\t\t\tanimation-duration: 200ms;\n\t\t\tanimation-timing-function: ease-out;\n\t\t\tanimation-fill-mode: forwards;\n\t\t}\n\n\t\t[data-sonner-toast][data-swipe-out='true'][data-swipe-direction='left'] {\n\t\t\tanimation-name: swipe-out-left;\n\t\t}\n\n\t\t[data-sonner-toast][data-swipe-out='true'][data-swipe-direction='right'] {\n\t\t\tanimation-name: swipe-out-right;\n\t\t}\n\n\t\t[data-sonner-toast][data-swipe-out='true'][data-swipe-direction='up'] {\n\t\t\tanimation-name: swipe-out-up;\n\t\t}\n\n\t\t[data-sonner-toast][data-swipe-out='true'][data-swipe-direction='down'] {\n\t\t\tanimation-name: swipe-out-down;\n\t\t}\n\n\t\t@keyframes -global-swipe-out-left {\n\t\t\tfrom {\n\t\t\t\ttransform: var(--y) translateX(var(--swipe-amount-x));\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\tto {\n\t\t\t\ttransform: var(--y)\n\t\t\t\t\ttranslateX(calc(var(--swipe-amount-x) - 100%));\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\n\t\t@keyframes -global-swipe-out-right {\n\t\t\tfrom {\n\t\t\t\ttransform: var(--y) translateX(var(--swipe-amount-x));\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\tto {\n\t\t\t\ttransform: var(--y)\n\t\t\t\t\ttranslateX(calc(var(--swipe-amount-x) + 100%));\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\n\t\t@keyframes -global-swipe-out-up {\n\t\t\tfrom {\n\t\t\t\ttransform: var(--y) translateY(var(--swipe-amount-y));\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\tto {\n\t\t\t\ttransform: var(--y)\n\t\t\t\t\ttranslateY(calc(var(--swipe-amount-y) - 100%));\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\n\t\t@keyframes -global-swipe-out-down {\n\t\t\tfrom {\n\t\t\t\ttransform: var(--y) translateY(var(--swipe-amount-y));\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\tto {\n\t\t\t\ttransform: var(--y)\n\t\t\t\t\ttranslateY(calc(var(--swipe-amount-y) + 100%));\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\n\t\t@media (max-width: 600px) {\n\t\t\t[data-sonner-toaster] {\n\t\t\t\tposition: fixed;\n\t\t\t\tright: var(--mobile-offset-right);\n\t\t\t\tleft: var(--mobile-offset-left);\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t[data-sonner-toaster][dir='rtl'] {\n\t\t\t\tleft: calc(var(--mobile-offset-left) * -1);\n\t\t\t}\n\n\t\t\t[data-sonner-toaster] [data-sonner-toast] {\n\t\t\t\tleft: 0;\n\t\t\t\tright: 0;\n\t\t\t\twidth: calc(100% - var(--mobile-offset-left) * 2);\n\t\t\t}\n\n\t\t\t[data-sonner-toaster][data-x-position='left'] {\n\t\t\t\tleft: var(--mobile-offset-left);\n\t\t\t}\n\n\t\t\t[data-sonner-toaster][data-y-position='bottom'] {\n\t\t\t\tbottom: var(--mobile-offset-bottom);\n\t\t\t}\n\n\t\t\t[data-sonner-toaster][data-y-position='top'] {\n\t\t\t\ttop: var(--mobile-offset-top);\n\t\t\t}\n\n\t\t\t[data-sonner-toaster][data-x-position='center'] {\n\t\t\t\tleft: var(--mobile-offset-left);\n\t\t\t\tright: var(--mobile-offset-right);\n\t\t\t\ttransform: none;\n\t\t\t}\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='light'] {\n\t\t\t--normal-bg: #fff;\n\t\t\t--normal-border: var(--gray4);\n\t\t\t--normal-text: var(--gray12);\n\n\t\t\t--success-bg: hsl(143, 85%, 96%);\n\t\t\t--success-border: hsl(145, 92%, 87%);\n\t\t\t--success-text: hsl(140, 100%, 27%);\n\n\t\t\t--info-bg: hsl(208, 100%, 97%);\n\t\t\t--info-border: hsl(221, 91%, 93%);\n\t\t\t--info-text: hsl(210, 92%, 45%);\n\n\t\t\t--warning-bg: hsl(49, 100%, 97%);\n\t\t\t--warning-border: hsl(49, 91%, 84%);\n\t\t\t--warning-text: hsl(31, 92%, 45%);\n\n\t\t\t--error-bg: hsl(359, 100%, 97%);\n\t\t\t--error-border: hsl(359, 100%, 94%);\n\t\t\t--error-text: hsl(360, 100%, 45%);\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='light']\n\t\t\t[data-sonner-toast][data-invert='true'] {\n\t\t\t--normal-bg: #000;\n\t\t\t--normal-border: hsl(0, 0%, 20%);\n\t\t\t--normal-text: var(--gray1);\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='dark']\n\t\t\t[data-sonner-toast][data-invert='true'] {\n\t\t\t--normal-bg: #fff;\n\t\t\t--normal-border: var(--gray3);\n\t\t\t--normal-text: var(--gray12);\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='dark'] {\n\t\t\t--normal-bg: #000;\n\t\t\t--normal-bg-hover: hsl(0, 0%, 12%);\n\t\t\t--normal-border: hsl(0, 0%, 20%);\n\t\t\t--normal-border-hover: hsl(0, 0%, 25%);\n\t\t\t--normal-text: var(--gray1);\n\n\t\t\t--success-bg: hsl(150, 100%, 6%);\n\t\t\t--success-border: hsl(147, 100%, 12%);\n\t\t\t--success-text: hsl(150, 86%, 65%);\n\n\t\t\t--info-bg: hsl(215, 100%, 6%);\n\t\t\t--info-border: hsl(223, 43%, 17%);\n\t\t\t--info-text: hsl(216, 87%, 65%);\n\n\t\t\t--warning-bg: hsl(64, 100%, 6%);\n\t\t\t--warning-border: hsl(60, 100%, 9%);\n\t\t\t--warning-text: hsl(46, 87%, 65%);\n\n\t\t\t--error-bg: hsl(358, 76%, 10%);\n\t\t\t--error-border: hsl(357, 89%, 16%);\n\t\t\t--error-text: hsl(358, 100%, 81%);\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='dark']\n\t\t\t[data-sonner-toast][data-styled='true']\n\t\t\t[data-close-button] {\n\t\t\tbackground: var(--normal-bg);\n\t\t\tborder-color: var(--normal-border);\n\t\t\tcolor: var(--normal-text);\n\t\t}\n\n\t\t[data-sonner-toaster][data-sonner-theme='dark']\n\t\t\t[data-sonner-toast][data-styled='true']\n\t\t\t[data-close-button]:hover {\n\t\t\tbackground: var(--normal-bg-hover);\n\t\t\tborder-color: var(--normal-border-hover);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-type='success'] {\n\t\t\tbackground: var(--success-bg);\n\t\t\tborder-color: var(--success-border);\n\t\t\tcolor: var(--success-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-styled='true'][data-type='success']\n\t\t\t[data-close-button] {\n\t\t\tbackground: var(--success-bg);\n\t\t\tborder-color: var(--success-border);\n\t\t\tcolor: var(--success-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-type='info'] {\n\t\t\tbackground: var(--info-bg);\n\t\t\tborder-color: var(--info-border);\n\t\t\tcolor: var(--info-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-styled='true'][data-type='info']\n\t\t\t[data-close-button] {\n\t\t\tbackground: var(--info-bg);\n\t\t\tborder-color: var(--info-border);\n\t\t\tcolor: var(--info-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-type='warning'] {\n\t\t\tbackground: var(--warning-bg);\n\t\t\tborder-color: var(--warning-border);\n\t\t\tcolor: var(--warning-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-styled='true'][data-type='warning']\n\t\t\t[data-close-button] {\n\t\t\tbackground: var(--warning-bg);\n\t\t\tborder-color: var(--warning-border);\n\t\t\tcolor: var(--warning-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-type='error'] {\n\t\t\tbackground: var(--error-bg);\n\t\t\tborder-color: var(--error-border);\n\t\t\tcolor: var(--error-text);\n\t\t}\n\n\t\t[data-rich-colors='true'][data-sonner-toast][data-styled='true'][data-type='error']\n\t\t\t[data-close-button] {\n\t\t\tbackground: var(--error-bg);\n\t\t\tborder-color: var(--error-border);\n\t\t\tcolor: var(--error-text);\n\t\t}\n\n\t\t.sonner-loading-wrapper {\n\t\t\t--size: 16px;\n\t\t\theight: var(--size);\n\t\t\twidth: var(--size);\n\t\t\tposition: absolute;\n\t\t\tinset: 0;\n\t\t\tz-index: 10;\n\t\t}\n\n\t\t.sonner-loading-wrapper[data-visible='false'] {\n\t\t\ttransform-origin: center;\n\t\t\tanimation: sonner-fade-out 0.2s ease forwards;\n\t\t}\n\n\t\t.sonner-spinner {\n\t\t\tposition: relative;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\theight: var(--size);\n\t\t\twidth: var(--size);\n\t\t}\n\n\t\t.sonner-loading-bar {\n\t\t\tanimation: sonner-spin 1.2s linear infinite;\n\t\t\tbackground: var(--gray11);\n\t\t\tborder-radius: 6px;\n\t\t\theight: 8%;\n\t\t\tleft: -10%;\n\t\t\tposition: absolute;\n\t\t\ttop: -3.9%;\n\t\t\twidth: 24%;\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(1) {\n\t\t\tanimation-delay: -1.2s;\n\t\t\ttransform: rotate(0.0001deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(2) {\n\t\t\tanimation-delay: -1.1s;\n\t\t\ttransform: rotate(30deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(3) {\n\t\t\tanimation-delay: -1s;\n\t\t\ttransform: rotate(60deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(4) {\n\t\t\tanimation-delay: -0.9s;\n\t\t\ttransform: rotate(90deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(5) {\n\t\t\tanimation-delay: -0.8s;\n\t\t\ttransform: rotate(120deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(6) {\n\t\t\tanimation-delay: -0.7s;\n\t\t\ttransform: rotate(150deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(7) {\n\t\t\tanimation-delay: -0.6s;\n\t\t\ttransform: rotate(180deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(8) {\n\t\t\tanimation-delay: -0.5s;\n\t\t\ttransform: rotate(210deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(9) {\n\t\t\tanimation-delay: -0.4s;\n\t\t\ttransform: rotate(240deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(10) {\n\t\t\tanimation-delay: -0.3s;\n\t\t\ttransform: rotate(270deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(11) {\n\t\t\tanimation-delay: -0.2s;\n\t\t\ttransform: rotate(300deg) translate(146%);\n\t\t}\n\n\t\t.sonner-loading-bar:nth-child(12) {\n\t\t\tanimation-delay: -0.1s;\n\t\t\ttransform: rotate(330deg) translate(146%);\n\t\t}\n\n\t\t@keyframes -global-sonner-fade-in {\n\t\t\t0% {\n\t\t\t\topacity: 0;\n\t\t\t\ttransform: scale(0.8);\n\t\t\t}\n\t\t\t100% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: scale(1);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes -global-sonner-fade-out {\n\t\t\t0% {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: scale(1);\n\t\t\t}\n\t\t\t100% {\n\t\t\t\topacity: 0;\n\t\t\t\ttransform: scale(0.8);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes -global-sonner-spin {\n\t\t\t0% {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t\t100% {\n\t\t\t\topacity: 0.15;\n\t\t\t}\n\t\t}\n\n\t\t@media (prefers-reduced-motion) {\n\t\t\t[data-sonner-toast],\n\t\t\t[data-sonner-toast] > *,\n\t\t\t.sonner-loading-bar {\n\t\t\t\ttransition: none !important;\n\t\t\t\tanimation: none !important;\n\t\t\t}\n\t\t}\n\n\t\t.sonner-loader {\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\ttransform: translate(-50%, -50%);\n\t\t\ttransform-origin: center;\n\t\t\ttransition:\n\t\t\t\topacity 200ms,\n\t\t\t\ttransform 200ms;\n\t\t}\n\n\t\t.sonner-loader[data-visible='false'] {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.8) translate(-50%, -50%);\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { Badge } from '$lib/components/ui/badge';\n\timport type { Snippet } from 'svelte';\n\n\tinterface Props {\n\t\ticon: string;\n\t\ttitle: string;\n\t\tcount?: number | null;\n\t\tdefaultExpanded?: boolean;\n\t\tlazy?: boolean;\n\t\tonExpandChange?: (expanded: boolean) => void;\n\t\tchildren: Snippet;\n\t}\n\n\tlet {\n\t\ticon,\n\t\ttitle,\n\t\tcount = null,\n\t\tdefaultExpanded = false,\n\t\tlazy = false,\n\t\tonExpandChange,\n\t\tchildren\n\t}: Props = $props();\n\n\t// The prop is only the initial position; the accordion owns it afterwards.\n\t// svelte-ignore state_referenced_locally\n\tlet expanded = $state(defaultExpanded ?? false);\n\t// svelte-ignore state_referenced_locally\n\tlet hasBeenExpanded = $state(defaultExpanded ?? false);\n\n\tfunction toggle() {\n\t\texpanded = !expanded;\n\t\tif (expanded && !hasBeenExpanded) {\n\t\t\thasBeenExpanded = true;\n\t\t}\n\t\tonExpandChange?.(expanded);\n\t}\n\n\tconst shouldRender = $derived(lazy ? hasBeenExpanded : true);\n</script>\n\n<div class=\"accordion\" class:expanded>\n\t<button class=\"accordion-header\" onclick={toggle} type=\"button\">\n\t\t<iconify-icon {icon} class=\"header-icon\"></iconify-icon>\n\t\t<span class=\"accordion-title\">{title}</span>\n\t\t{#if count != null}\n\t\t\t<span class=\"count\">{count}</span>\n\t\t{/if}\n\t\t<iconify-icon\n\t\t\ticon={expanded ? 'mdi:chevron-down' : 'mdi:chevron-right'}\n\t\t\tclass=\"chevron\"\n\t\t></iconify-icon>\n\t</button>\n\n\t{#if expanded && shouldRender}\n\t\t<div class=\"accordion-content\">\n\t\t\t{@render children()}\n\t\t</div>\n\t{/if}\n</div>\n\n<style>\n\t.accordion {\n\t\tborder-top: 1px solid hsl(var(--border) / 0.5);\n\t}\n\n\t.accordion-header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\twidth: 100%;\n\t\tpadding: 5px 10px;\n\t\tborder: none;\n\t\tbackground: hsl(var(--muted) / 0.3);\n\t\tcolor: hsl(var(--muted-foreground));\n\t\tfont-family: inherit;\n\t\tfont-size: 11px;\n\t\tfont-weight: 500;\n\t\tcursor: pointer;\n\t\ttext-align: left;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.03em;\n\t}\n\n\t.accordion-header:hover {\n\t\tbackground: hsl(var(--muted) / 0.6);\n\t\tcolor: hsl(var(--foreground));\n\t}\n\n\t.accordion.expanded .accordion-header {\n\t\tcolor: hsl(var(--foreground));\n\t}\n\n\t.header-icon {\n\t\tfont-size: 13px;\n\t\topacity: 0.7;\n\t}\n\n\t.count {\n\t\tmargin-left: auto;\n\t\tfont-size: 10px;\n\t\tfont-weight: 600;\n\t\tcolor: hsl(var(--muted-foreground));\n\t\tmin-width: 14px;\n\t\ttext-align: center;\n\t}\n\n\t.accordion-title {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\n\t.chevron {\n\t\tfont-size: 14px;\n\t\topacity: 0.5;\n\t}\n\n\t.accordion-content {\n\t\tpadding: 6px 10px 8px 14px;\n\t\tborder-left: 2px solid hsl(var(--border) / 0.3);\n\t\tmargin-left: 10px;\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { Button } from '$lib/components/ui/button';\n\timport SidebarAccordion from './SidebarAccordion.svelte';\n\timport type { Screenshot } from '$lib/stores/sessions.svelte';\n\n\tinterface Props {\n\t\tsessionId: string;\n\t\tscreenshots: Screenshot[];\n\t}\n\n\tlet { sessionId, screenshots }: Props = $props();\n\n\tlet viewingScreenshot = $state<string | null>(null);\n\n\t// Swipe tracking\n\tlet touchStartX = $state(0);\n\tlet touchCurrentX = $state(0);\n\tlet isSwiping = $state(false);\n\n\tasync function dismissScreenshot(path: string) {\n\t\tawait fetch(`/api/sessions/${encodeURIComponent(sessionId)}/screenshots?path=${encodeURIComponent(path)}`, {\n\t\t\tmethod: 'DELETE'\n\t\t});\n\t\tif (viewingScreenshot === path) {\n\t\t\tviewingScreenshot = null;\n\t\t}\n\t}\n\n\tfunction openModal(path: string) {\n\t\tviewingScreenshot = path;\n\t}\n\n\tfunction closeModal() {\n\t\tviewingScreenshot = null;\n\t\tresetSwipe();\n\t}\n\n\tfunction getFilename(path: string): string {\n\t\treturn path.split('/').pop() || path;\n\t}\n\n\tfunction handleTouchStart(e: TouchEvent) {\n\t\ttouchStartX = e.touches[0].clientX;\n\t\ttouchCurrentX = touchStartX;\n\t\tisSwiping = true;\n\t}\n\n\tfunction handleTouchMove(e: TouchEvent) {\n\t\tif (!isSwiping) return;\n\t\ttouchCurrentX = e.touches[0].clientX;\n\t}\n\n\tfunction handleTouchEnd() {\n\t\tif (!isSwiping) return;\n\t\tconst deltaX = touchCurrentX - touchStartX;\n\t\tif (deltaX < -100) {\n\t\t\tcloseModal();\n\t\t}\n\t\tresetSwipe();\n\t}\n\n\tfunction resetSwipe() {\n\t\tisSwiping = false;\n\t\ttouchStartX = 0;\n\t\ttouchCurrentX = 0;\n\t}\n\n\tconst swipeOffset = $derived(isSwiping ? Math.min(0, touchCurrentX - touchStartX) : 0);\n</script>\n\n<SidebarAccordion\n\ticon=\"mdi:image-multiple\"\n\ttitle=\"Screenshots\"\n\tcount={screenshots.length}\n>\n\t{#if screenshots.length === 0}\n\t\t<p class=\"empty\">No screenshots</p>\n\t{:else}\n\t\t<div class=\"screenshots-grid\">\n\t\t\t{#each screenshots as screenshot, i (screenshot.path + ':' + i)}\n\t\t\t\t<div class=\"screenshot-item\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"thumbnail\"\n\t\t\t\t\t\tonclick={() => openModal(screenshot.path)}\n\t\t\t\t\t\ttitle={getFilename(screenshot.path)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc=\"/api/files/image?path={encodeURIComponent(screenshot.path)}\"\n\t\t\t\t\t\t\talt={getFilename(screenshot.path)}\n\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\tclass=\"dismiss-btn\"\n\t\t\t\t\t\tonclick={() => dismissScreenshot(screenshot.path)}\n\t\t\t\t\t\ttitle=\"Dismiss screenshot\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t{/each}\n\t\t</div>\n\t{/if}\n</SidebarAccordion>\n\n<!-- Fullscreen Modal -->\n{#if viewingScreenshot}\n\t<div\n\t\tclass=\"modal-overlay\"\n\t\tonclick={(e) => e.target === e.currentTarget && closeModal()}\n\t\tonkeydown={(e) => e.key === 'Escape' && closeModal()}\n\t\trole=\"dialog\"\n\t\taria-modal=\"true\"\n\t\ttabindex=\"-1\"\n\t>\n\t\t<div\n\t\t\tclass=\"modal-content\"\n\t\t\tstyle=\"transform: translateX({swipeOffset}px)\"\n\t\t\tontouchstart={handleTouchStart}\n\t\t\tontouchmove={handleTouchMove}\n\t\t\tontouchend={handleTouchEnd}\n\t\t\trole=\"document\"\n\t\t>\n\t\t\t<img\n\t\t\t\tsrc=\"/api/files/image?path={encodeURIComponent(viewingScreenshot)}\"\n\t\t\t\talt={getFilename(viewingScreenshot)}\n\t\t\t\tclass=\"modal-image\"\n\t\t\t/>\n\n\t\t\t<div class=\"modal-actions\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonclick={(e) => e.target === e.currentTarget && closeModal()}\n\t\t\t\t\tclass=\"modal-btn\"\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t\t\t\t<span>Close</span>\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonclick={() => dismissScreenshot(viewingScreenshot!)}\n\t\t\t\t\tclass=\"modal-btn\"\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon=\"mdi:delete\"></iconify-icon>\n\t\t\t\t\t<span>Delete</span>\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t<div class=\"swipe-hint\">\n\t\t\t\t<iconify-icon icon=\"mdi:gesture-swipe-left\"></iconify-icon>\n\t\t\t\t<span>Swipe left to close</span>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n{/if}\n\n<style>\n\t.screenshots-grid {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(2, 1fr);\n\t\tgap: 4px;\n\t}\n\n\t.screenshot-item {\n\t\tposition: relative;\n\t\taspect-ratio: 16 / 10;\n\t\tborder-radius: 4px;\n\t\toverflow: hidden;\n\t\tbackground: hsl(var(--muted));\n\t}\n\n\t.thumbnail {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcursor: pointer;\n\t}\n\n\t.thumbnail img {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tobject-fit: cover;\n\t}\n\n\t.thumbnail:hover {\n\t\topacity: 0.9;\n\t}\n\n\t.screenshot-item :global(.dismiss-btn) {\n\t\tposition: absolute;\n\t\ttop: 4px;\n\t\tright: 4px;\n\t\twidth: 24px;\n\t\theight: 24px;\n\t\tbackground: hsl(var(--background) / 0.8);\n\t\tborder-radius: 4px;\n\t\topacity: 0;\n\t\ttransition: opacity 0.15s;\n\t}\n\n\t.screenshot-item:hover :global(.dismiss-btn) {\n\t\topacity: 1;\n\t}\n\n\t.screenshot-item :global(.dismiss-btn:hover) {\n\t\tbackground: hsl(var(--destructive));\n\t\tcolor: hsl(var(--destructive-foreground));\n\t}\n\n\t.empty {\n\t\tcolor: hsl(var(--muted-foreground));\n\t\tfont-size: 11px;\n\t\tmargin: 0;\n\t}\n\n\t/* Modal styles */\n\t.modal-overlay {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tz-index: var(--z-modal);\n\t\tbackground: rgba(0, 0, 0, 0.9);\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpadding: 16px;\n\t}\n\n\t.modal-content {\n\t\tposition: relative;\n\t\tmax-width: 100%;\n\t\tmax-height: 100%;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: 16px;\n\t\ttransition: transform 0.1s ease-out;\n\t}\n\n\t.modal-image {\n\t\tmax-width: 100%;\n\t\tmax-height: calc(100vh - 120px);\n\t\tobject-fit: contain;\n\t\tborder-radius: 8px;\n\t\tbox-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);\n\t}\n\n\t.modal-actions {\n\t\tdisplay: flex;\n\t\tgap: 12px;\n\t}\n\n\t.modal-actions :global(.modal-btn) {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t}\n\n\t.swipe-hint {\n\t\tdisplay: none;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\tcolor: hsl(var(--muted-foreground));\n\t\tfont-size: 12px;\n\t}\n\n\t@media (max-width: 768px) {\n\t\t.swipe-hint {\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n</style>\n","/**\n * The browser's side of session alerts: the favicon badge and the two sounds.\n * Adapted from t3code's threadNotifications.ts (MIT, © T3 Tools Inc.).\n */\n\n/** How the browser alerts: system notifications, a sound, both, or neither. */\nexport type NotificationMode = 'off' | 'notifications' | 'sound' | 'both';\n\nexport function hasDesktopNotifications(mode: NotificationMode): boolean {\n\treturn mode === 'notifications' || mode === 'both';\n}\n\nexport function hasNotificationSound(mode: NotificationMode): boolean {\n\treturn mode === 'sound' || mode === 'both';\n}\n\nlet originalFavicon: HTMLLinkElement | undefined;\nlet badgeFavicon: HTMLLinkElement | undefined;\n/** Badge images by label; there are only ten (\"1\"-\"9\" and \"9+\"). */\nconst badges = new Map<string, string>();\n\nfunction badgeImage(label: string): string | null {\n\tconst cached = badges.get(label);\n\tif (cached) return cached;\n\tconst canvas = document.createElement('canvas');\n\tcanvas.width = canvas.height = 64;\n\tconst context = canvas.getContext('2d');\n\tif (!context) return null;\n\tcontext.fillStyle = '#e5484d';\n\tcontext.beginPath();\n\tcontext.arc(32, 32, 30, 0, Math.PI * 2);\n\tcontext.fill();\n\tcontext.fillStyle = 'white';\n\tcontext.font = `700 ${label.length > 1 ? 32 : 42}px system-ui, sans-serif`;\n\tcontext.textAlign = 'center';\n\tcontext.textBaseline = 'middle';\n\tcontext.fillText(label, 32, 35);\n\tconst url = canvas.toDataURL('image/png');\n\tbadges.set(label, url);\n\treturn url;\n}\n\n/** Swap the favicon for a red count while any session needs someone, and put it back after. */\nexport function setFaviconBadge(count: number): void {\n\tif (count <= 0) {\n\t\tif (!badgeFavicon) return;\n\t\tbadgeFavicon.remove();\n\t\tbadgeFavicon = undefined;\n\t\tif (originalFavicon) document.head.append(originalFavicon);\n\t\toriginalFavicon = undefined;\n\t\treturn;\n\t}\n\tconst image = badgeImage(count > 9 ? '9+' : String(count));\n\tif (!image) return;\n\tif (!badgeFavicon) {\n\t\toriginalFavicon = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]') ?? undefined;\n\t\toriginalFavicon?.remove();\n\t\tbadgeFavicon = document.createElement('link');\n\t\tbadgeFavicon.rel = 'icon';\n\t\tbadgeFavicon.type = 'image/png';\n\t\tdocument.head.append(badgeFavicon);\n\t}\n\tbadgeFavicon.href = image;\n}\n\nlet audio: AudioContext | undefined;\n\n/**\n * Browsers only let a page make sound after someone has interacted with it,\n * so this runs on the first gesture; later alerts reuse the running context.\n */\nexport function unlockNotificationAudio(): void {\n\tif (typeof AudioContext === 'undefined') return;\n\taudio ??= new AudioContext();\n\tif (audio.state === 'running') return;\n\tvoid audio.resume().catch(() => {});\n}\n\n/**\n * The sounds are synthesised rather than shipped, so there is no asset or\n * licence to carry: a rising two-note chime for a finished turn, and a pair\n * of brighter, repeated pings for a session that is waiting on someone.\n */\nconst TONES: Record<'completion' | 'needs-you', Array<[freq: number, at: number]>> = {\n\tcompletion: [\n\t\t[659.25, 0],\n\t\t[987.77, 0.12]\n\t],\n\t'needs-you': [\n\t\t[880, 0],\n\t\t[1174.66, 0.1],\n\t\t[880, 0.32],\n\t\t[1174.66, 0.42]\n\t]\n};\n\nexport function playNotificationSound(kind: 'completion' | 'needs-you'): void {\n\tif (!audio || audio.state !== 'running') return;\n\tconst now = audio.currentTime;\n\tfor (const [freq, at] of TONES[kind]) {\n\t\tconst osc = audio.createOscillator();\n\t\tconst gain = audio.createGain();\n\t\tosc.type = 'sine';\n\t\tosc.frequency.value = freq;\n\t\tgain.gain.setValueAtTime(0, now + at);\n\t\tgain.gain.linearRampToValueAtTime(0.18, now + at + 0.01);\n\t\tgain.gain.exponentialRampToValueAtTime(0.001, now + at + 0.35);\n\t\tosc.connect(gain).connect(audio.destination);\n\t\tosc.start(now + at);\n\t\tosc.stop(now + at + 0.4);\n\t}\n}\n","/**\n * This device's Web Push subscription, as the browser and the server each\n * hold it. The browser's PushManager owns the subscription itself; the server\n * keeps the events it should carry.\n */\nimport type { PushEvents } from '$shared/db/index.js';\n\nexport type { PushEvents };\n\n/** Why push cannot work here, or null when it can. */\nexport function pushUnavailable(): string | null {\n\tif (!window.isSecureContext) return 'Push needs HTTPS. Open claude-mux through tailscale serve.';\n\tconst ios = /iPhone|iPad|iPod/.test(navigator.userAgent);\n\tconst standalone = window.matchMedia('(display-mode: standalone)').matches;\n\tif (ios && !standalone) return 'On iPhone and iPad, add claude-mux to the Home Screen (Share → Add to Home Screen) and open it from there.';\n\tif (!('serviceWorker' in navigator) || !('PushManager' in window) || typeof Notification === 'undefined') {\n\t\treturn 'This browser has no Web Push.';\n\t}\n\treturn null;\n}\n\n/**\n * The running service worker. SvelteKit registers it on load and `ready`\n * waits for that, forever if registration failed, so it gets a deadline.\n */\nfunction worker(): Promise<ServiceWorkerRegistration> {\n\treturn Promise.race([\n\t\tnavigator.serviceWorker.ready,\n\t\tnew Promise<never>((_, reject) =>\n\t\t\tsetTimeout(() => reject(new Error('The service worker did not start. Reload the page and try again.')), 10_000)\n\t\t)\n\t]);\n}\n\n/** The browser's subscription for this device, if it has one. */\nexport async function currentSubscription(): Promise<PushSubscription | null> {\n\treturn (await worker()).pushManager.getSubscription();\n}\n\n/** The events the server sends this device, or null when the server does not know it. */\nexport async function serverEvents(subscription: PushSubscription): Promise<PushEvents | null> {\n\tconst res = await fetch(`/api/push/subscription?endpoint=${encodeURIComponent(subscription.endpoint)}`);\n\tif (!res.ok) return null;\n\treturn ((await res.json()) as { events: PushEvents }).events;\n}\n\nfunction toKey(base64url: string): Uint8Array<ArrayBuffer> {\n\tconst base64 = (base64url + '='.repeat((4 - (base64url.length % 4)) % 4)).replace(/-/g, '+').replace(/_/g, '/');\n\treturn Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));\n}\n\n/** Call a push route with a JSON body; rejects with the server's own error when it refuses. */\nasync function api<T>(path: string, method = 'GET', body?: unknown): Promise<T> {\n\tconst res = await fetch(path, {\n\t\tmethod,\n\t\theaders: body === undefined ? undefined : { 'Content-Type': 'application/json' },\n\t\tbody: body === undefined ? undefined : JSON.stringify(body)\n\t});\n\tconst data = (await res.json().catch(() => null)) as (T & { error?: string }) | null;\n\tif (!res.ok) throw new Error(data?.error ?? `The server answered ${res.status}`);\n\treturn data as T;\n}\n\n/** Tell the server about the subscription, or which events it now takes. */\nexport async function saveEvents(subscription: PushSubscription, events: PushEvents): Promise<PushEvents> {\n\treturn (await api<{ events: PushEvents }>('/api/push/subscription', 'POST', { ...subscription.toJSON(), events })).events;\n}\n\n/**\n * Ask for permission, subscribe with the server's key and register the\n * device. A subscription made under another key (the server's keys were\n * remade) is replaced, since the server could never reach it.\n */\nexport async function subscribe(events: PushEvents): Promise<PushSubscription> {\n\t// The key is fetched while the permission prompt is up; neither waits on the other.\n\tconst vapid = api<{ publicKey: string }>('/api/push');\n\tvapid.catch(() => {});\n\tif ((await Notification.requestPermission()) !== 'granted') {\n\t\tthrow new Error('Notifications are blocked. Allow them in the browser’s site settings, then try again.');\n\t}\n\tconst key = toKey((await vapid).publicKey);\n\tconst manager = (await worker()).pushManager;\n\tlet subscription = await manager.getSubscription();\n\tconst bound = subscription?.options.applicationServerKey;\n\tif (subscription && (!bound || !sameBytes(new Uint8Array(bound), key))) {\n\t\tawait subscription.unsubscribe();\n\t\tsubscription = null;\n\t}\n\tsubscription ??= await manager.subscribe({ userVisibleOnly: true, applicationServerKey: key });\n\tawait saveEvents(subscription, events);\n\treturn subscription;\n}\n\nfunction sameBytes(a: Uint8Array, b: Uint8Array): boolean {\n\treturn a.length === b.length && a.every((v, i) => v === b[i]);\n}\n\nexport async function unsubscribe(subscription: PushSubscription): Promise<void> {\n\tawait api('/api/push/subscription', 'DELETE', { endpoint: subscription.endpoint }).catch(() => {});\n\tawait subscription.unsubscribe();\n}\n\nexport async function sendTestPush(subscription: PushSubscription): Promise<void> {\n\tawait api('/api/push/test', 'POST', { endpoint: subscription.endpoint });\n}\n","<script lang=\"ts\">\n\timport { sessionStore } from '$lib/stores/sessions.svelte';\n\timport { usageStore } from '$lib/stores/usage.svelte';\n\timport { preferences } from '$lib/stores/preferences.svelte';\n\timport { wakeLockSupported } from '$lib/wakeLock.svelte';\n\timport { hostTimeZone, makeDayFormatter, money } from '$lib/format';\n\timport { SEVERITY, severityForPercent } from '$lib/severity';\n\timport {\n\t\thasDesktopNotifications,\n\t\thasNotificationSound,\n\t\tunlockNotificationAudio,\n\t\ttype NotificationMode\n\t} from '$lib/notifications';\n\timport {\n\t\tcurrentSubscription,\n\t\tpushUnavailable,\n\t\tsaveEvents,\n\t\tsendTestPush,\n\t\tserverEvents,\n\t\tsubscribe,\n\t\tunsubscribe,\n\t\ttype PushEvents\n\t} from '$lib/push';\n\n\tconst SPARK_DAYS = 14;\n\t/** Why the plan columns are missing, for the one place there is room to say it. */\n\tconst PLAN_UNAVAILABLE = 'Plan limits unavailable — open Usage for the reason.';\n\tconst SERIES = '#3987e5';\n\n\t// The store owns the polling, so the sidebar and the composer's key share\n\t// one pair of requests rather than each running their own timer.\n\t$effect(() => usageStore.subscribe());\n\n\tconst dayOf = makeDayFormatter(hostTimeZone());\n\tconst supported = wakeLockSupported();\n\n\tconst summary = $derived(usageStore.summary);\n\tconst quota = $derived(usageStore.quota);\n\tconst today = $derived(usageStore.today);\n\tconst stats = $derived(sessionStore.systemStats);\n\n\tinterface Meter {\n\t\tkey: string;\n\t\t/** Two or three characters — the column is only as wide as its bar. */\n\t\ttag: string;\n\t\tpercent: number;\n\t\tcolor: string;\n\t\ttitle: string;\n\t}\n\n\t/** Labels share a length so the columns can share a width. */\n\tfunction shortLabel(label: string): string {\n\t\tconst text = label.toLowerCase();\n\t\tif (text.includes('session')) return '5h';\n\t\tconst model = text.match(/(opus|sonnet|haiku|fable|mythos)/)?.[1];\n\t\tif (model) return model.slice(0, 3);\n\t\tif (text.includes('week')) return 'wk';\n\t\treturn text.replace(/\\s*limit$/, '').split(/\\s+/)[0];\n\t}\n\n\tconst meters = $derived.by(() => {\n\t\tconst out: Meter[] = [];\n\t\tfor (const limit of quota?.available ? quota.limits : []) {\n\t\t\tout.push({\n\t\t\t\tkey: limit.kind,\n\t\t\t\ttag: shortLabel(limit.label),\n\t\t\t\tpercent: limit.percent,\n\t\t\t\t// The server grades plan limits itself, and the sidebar shows that\n\t\t\t\t// grade — recomputing here is how the two start disagreeing.\n\t\t\t\tcolor: SEVERITY[limit.severity].color,\n\t\t\t\ttitle: `${limit.label}: ${Math.round(limit.percent)}%`\n\t\t\t});\n\t\t}\n\t\tconst system: Array<[string, string, number]> = [\n\t\t\t['cpu', 'cpu', stats.cpu],\n\t\t\t['ram', 'ram', stats.ram]\n\t\t];\n\t\tif (stats.swapTotal > 0) system.push(['swap', 'swp', stats.swap]);\n\t\tfor (const [key, tag, percent] of system) {\n\t\t\tout.push({\n\t\t\t\tkey,\n\t\t\t\ttag,\n\t\t\t\tpercent,\n\t\t\t\tcolor: SEVERITY[severityForPercent(percent)].color,\n\t\t\t\ttitle: `${tag.toUpperCase()}: ${Math.round(percent)}%`\n\t\t\t});\n\t\t}\n\t\treturn out;\n\t});\n\n\tfunction dayKey(offset: number): string {\n\t\treturn dayOf(Date.now() - offset * 86_400_000);\n\t}\n\n\t/** Last two weeks, oldest first, gaps included so the rhythm stays honest. */\n\tconst spark = $derived.by(() => {\n\t\tif (!summary) return [] as Array<{ date: string; cost: number }>;\n\t\tconst byDate = new Map(summary.days.map((d) => [d.date, d.costUsd]));\n\t\tconst out: Array<{ date: string; cost: number }> = [];\n\t\tfor (let i = SPARK_DAYS - 1; i >= 0; i--) {\n\t\t\tconst date = dayKey(i);\n\t\t\tout.push({ date, cost: byDate.get(date) ?? 0 });\n\t\t}\n\t\treturn out;\n\t});\n\n\tconst peak = $derived(Math.max(1e-9, ...spark.map((d) => d.cost)));\n\n\tconst MODES: Array<{ value: NotificationMode; label: string; title: string }> = [\n\t\t{ value: 'off', label: 'Off', title: 'No system notifications or sounds' },\n\t\t{ value: 'notifications', label: 'Notify', title: 'System notifications while this window is in the background' },\n\t\t{ value: 'sound', label: 'Sound', title: 'A sound when a session needs you or finishes' },\n\t\t{ value: 'both', label: 'Both', title: 'System notifications and sounds' }\n\t];\n\n\t/** Why the last choice did not take, shown under the control. */\n\tlet alertProblem = $state<string | null>(null);\n\t// A permission revoked since the choice was made silences the alerts, so say so.\n\t$effect(() => {\n\t\tif (\n\t\t\thasDesktopNotifications(preferences.notificationMode) &&\n\t\t\ttypeof Notification !== 'undefined' &&\n\t\t\tNotification.permission !== 'granted'\n\t\t)\n\t\t\talertProblem = 'Notifications are blocked. Allow them in the browser’s site settings, then choose again.';\n\t});\n\tlet requesting = $state(false);\n\n\tasync function chooseMode(value: NotificationMode): Promise<void> {\n\t\talertProblem = null;\n\t\tif (hasNotificationSound(value)) unlockNotificationAudio();\n\t\tif (hasDesktopNotifications(value)) {\n\t\t\tif (!window.isSecureContext) {\n\t\t\t\talertProblem =\n\t\t\t\t\t'System notifications need HTTPS. Open claude-mux through tailscale serve; sound works either way.';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (typeof Notification === 'undefined') {\n\t\t\t\talertProblem = 'This browser has no system notifications. Sound works either way.';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\trequesting = true;\n\t\t\ttry {\n\t\t\t\tif ((await Notification.requestPermission()) !== 'granted') {\n\t\t\t\t\talertProblem = 'Notifications are blocked. Allow them in the browser’s site settings, then choose again.';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\talertProblem = 'This browser refused to show notifications. Sound works either way.';\n\t\t\t\treturn;\n\t\t\t} finally {\n\t\t\t\trequesting = false;\n\t\t\t}\n\t\t}\n\t\tpreferences.notificationMode = value;\n\t}\n\n\t// Web Push reaches this device with every claude-mux tab closed. The\n\t// browser holds the subscription; the server holds which events it takes.\n\tlet pushSub = $state<PushSubscription | null>(null);\n\tlet pushEvents = $state<PushEvents>({ needsYou: true, done: true });\n\tlet pushBusy = $state(false);\n\t/** What the last push action said: a problem, or that the test went out. */\n\tlet pushNote = $state<{ text: string; problem: boolean } | null>(null);\n\tconst pushBlocked = typeof window === 'undefined' ? null : pushUnavailable();\n\n\t$effect(() => {\n\t\tif (pushBlocked) return;\n\t\tvoid (async () => {\n\t\t\tconst sub = await currentSubscription();\n\t\t\t// A subscription the server forgot (its push service said the device\n\t\t\t// was gone, or the file was cleared) cannot be reached, so it counts as off.\n\t\t\tconst events = sub ? await serverEvents(sub) : null;\n\t\t\tpushSub = events ? sub : null;\n\t\t\tif (events) pushEvents = events;\n\t\t})().catch(() => {});\n\t});\n\n\tasync function pushAction(run: () => Promise<string | void>): Promise<void> {\n\t\tpushBusy = true;\n\t\tpushNote = null;\n\t\ttry {\n\t\t\tconst done = await run();\n\t\t\tif (done) pushNote = { text: done, problem: false };\n\t\t} catch (err) {\n\t\t\tpushNote = { text: err instanceof Error ? err.message : String(err), problem: true };\n\t\t} finally {\n\t\t\tpushBusy = false;\n\t\t}\n\t}\n\n\tfunction setPush(on: boolean): Promise<void> {\n\t\treturn pushAction(async () => {\n\t\t\tif (on && !pushSub) pushSub = await subscribe(pushEvents);\n\t\t\telse if (!on && pushSub) {\n\t\t\t\tawait unsubscribe(pushSub);\n\t\t\t\tpushSub = null;\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction setPushEvent(key: keyof PushEvents, value: boolean): Promise<void> {\n\t\tconst sub = pushSub;\n\t\tif (!sub) return Promise.resolve();\n\t\treturn pushAction(async () => {\n\t\t\tpushEvents = await saveEvents(sub, { ...pushEvents, [key]: value });\n\t\t});\n\t}\n\n\tfunction testPush(): Promise<void> {\n\t\tconst sub = pushSub;\n\t\tif (!sub) return Promise.resolve();\n\t\treturn pushAction(async () => {\n\t\t\tawait sendTestPush(sub);\n\t\t\treturn 'Sent. It should arrive in a few seconds.';\n\t\t});\n\t}\n</script>\n\n<!--\n\tEvery sidebar number is a share of something, so every one of them is the\n\tsame column: a reading on top, a bar that fills upwards, a label under it.\n\tStanding them side by side costs one row of height for the whole set, where\n\ta stack of horizontal meters spent a row on each.\n-->\n<div class=\"sidebar-meters\">\n\t<a class=\"strip\" href=\"/usage\" title={quota && !quota.available ? PLAN_UNAVAILABLE : undefined}>\n\t\t{#if meters.length > 0}\n\t\t\t<span class=\"group\">\n\t\t\t\t{#each meters as meter (meter.key)}\n\t\t\t\t\t<span class=\"col\" title={meter.title}>\n\t\t\t\t\t\t<span class=\"val\" style=\"color: {meter.color}\">{Math.round(meter.percent)}%</span>\n\t\t\t\t\t\t<span class=\"track\" role=\"img\" aria-label={meter.title}>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"fill\"\n\t\t\t\t\t\t\t\tstyle=\"height: {Math.min(100, Math.max(0, meter.percent))}%; background: {meter.color}\"\n\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"tag\">{meter.tag}</span>\n\t\t\t\t\t</span>\n\t\t\t\t{/each}\n\t\t\t</span>\n\t\t{/if}\n\n\t\t{#if spark.length > 0}\n\t\t\t<span class=\"group spark\">\n\t\t\t\t<!-- The two figures frame the fortnight they are drawn from: today at\n\t\t\t\t the left, where the reading starts, the whole month's total at the\n\t\t\t\t right. The thirteen days between them stay a shape — fourteen\n\t\t\t\t numbers at this size would be a smear. -->\n\t\t\t\t<span class=\"line\">\n\t\t\t\t\t<span class=\"val spend\">{today === null ? '—' : money(today, true)}</span>\n\t\t\t\t\t<span class=\"val spend\">{summary === null ? '—' : money(summary.costUsd, true)}</span>\n\t\t\t\t</span>\n\t\t\t\t<span class=\"ticks\" aria-hidden=\"true\">\n\t\t\t\t\t{#each spark as day (day.date)}\n\t\t\t\t\t\t<span class=\"track\" title=\"{day.date}: {money(day.cost, true)}\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"fill\"\n\t\t\t\t\t\t\t\tstyle=\"height: {Math.max(3, (day.cost / peak) * 100)}%; background: {SERIES}\"\n\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t{/each}\n\t\t\t\t</span>\n\t\t\t\t<span class=\"line\">\n\t\t\t\t\t<span class=\"tag\">today</span>\n\t\t\t\t\t<span class=\"tag\">30d</span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t{/if}\n\t</a>\n\n\t<div class=\"alerts-row\">\n\t\t<span class=\"alerts-label\" id=\"alerts-label\">Alerts</span>\n\t\t<div class=\"segmented\" role=\"radiogroup\" aria-labelledby=\"alerts-label\">\n\t\t\t{#each MODES as m (m.value)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"radio\"\n\t\t\t\t\taria-checked={preferences.notificationMode === m.value}\n\t\t\t\t\tclass:on={preferences.notificationMode === m.value}\n\t\t\t\t\ttitle={m.title}\n\t\t\t\t\tdisabled={requesting}\n\t\t\t\t\tonclick={() => chooseMode(m.value)}\n\t\t\t\t>\n\t\t\t\t\t{m.label}\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t</div>\n\t</div>\n\t{#if alertProblem}\n\t\t<p class=\"alerts-problem\" role=\"status\">{alertProblem}</p>\n\t{/if}\n\n\t<div class=\"alerts-row\">\n\t\t<span\n\t\t\tclass=\"alerts-label\"\n\t\t\tid=\"push-label\"\n\t\t\ttitle=\"Notifications on this device with claude-mux closed, sent by the server\"\n\t\t>\n\t\t\tPush\n\t\t</span>\n\t\t<div class=\"segmented\" role=\"radiogroup\" aria-labelledby=\"push-label\">\n\t\t\t{#each [false, true] as on (on)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"radio\"\n\t\t\t\t\taria-checked={!!pushSub === on}\n\t\t\t\t\tclass:on={!!pushSub === on}\n\t\t\t\t\tdisabled={pushBusy || !!pushBlocked}\n\t\t\t\t\tonclick={() => setPush(on)}\n\t\t\t\t>\n\t\t\t\t\t{on ? 'This device' : 'Off'}\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t</div>\n\t</div>\n\t{#if pushBlocked}\n\t\t<p class=\"alerts-note\">{pushBlocked}</p>\n\t{:else if pushSub}\n\t\t<div class=\"toggles\">\n\t\t\t<label class=\"toggle-row\" title=\"A session asks a question or wants an approval\">\n\t\t\t\t<input\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tchecked={pushEvents.needsYou}\n\t\t\t\t\tdisabled={pushBusy}\n\t\t\t\t\tonchange={(e) => setPushEvent('needsYou', e.currentTarget.checked)}\n\t\t\t\t/>\n\t\t\t\t<span>Needs you</span>\n\t\t\t</label>\n\t\t\t<label class=\"toggle-row\" title=\"A session finished its turn\">\n\t\t\t\t<input\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tchecked={pushEvents.done}\n\t\t\t\t\tdisabled={pushBusy}\n\t\t\t\t\tonchange={(e) => setPushEvent('done', e.currentTarget.checked)}\n\t\t\t\t/>\n\t\t\t\t<span>Done</span>\n\t\t\t</label>\n\t\t\t<button type=\"button\" class=\"link-button\" disabled={pushBusy} onclick={testPush}>Send a test</button>\n\t\t</div>\n\t{/if}\n\t{#if pushNote}\n\t\t<p class={pushNote.problem ? 'alerts-problem' : 'alerts-note'} role=\"status\">{pushNote.text}</p>\n\t{/if}\n\n\t<div class=\"toggles\">\n\t\t<label class=\"toggle-row\" title=\"A toast in this page when another session needs you or finishes\">\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tchecked={preferences.inAppToasts}\n\t\t\t\tonchange={(e) => (preferences.inAppToasts = e.currentTarget.checked)}\n\t\t\t/>\n\t\t\t<span>In-page toasts</span>\n\t\t</label>\n\t\t{#if supported}\n\t\t\t<label class=\"toggle-row\">\n\t\t\t\t<input\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tchecked={preferences.keepAwake}\n\t\t\t\t\tonchange={(e) => (preferences.keepAwake = e.currentTarget.checked)}\n\t\t\t\t/>\n\t\t\t\t<span>Keep screen on</span>\n\t\t\t</label>\n\t\t{/if}\n\t</div>\n</div>\n\n<style>\n\t.sidebar-meters {\n\t\tpadding: 8px 12px;\n\t\tborder-top: 1px solid hsl(var(--border));\n\t\tbackground: hsl(var(--background));\n\t}\n\n\t.strip {\n\t\tdisplay: flex;\n\t\talign-items: flex-end;\n\t\tflex-wrap: wrap;\n\t\tgap: 6px 10px;\n\t\ttext-decoration: none;\n\t\tcolor: inherit;\n\t\tmargin: -4px -6px;\n\t\tpadding: 4px 6px;\n\t\tborder-radius: 6px;\n\t}\n\n\t.strip:hover {\n\t\tbackground: rgba(255, 255, 255, 0.03);\n\t}\n\n\t.group {\n\t\tdisplay: flex;\n\t\talign-items: flex-end;\n\t\tgap: 3px;\n\t\tmin-width: 0;\n\t}\n\n\t/* The spend history is the one group that can give up width: its bars are a\n\t shape, not a set of readings, so squeezing them loses nothing. */\n\t.spark {\n\t\tflex: 1 1 auto;\n\t\t/* Never narrower than the two figures it carries, and no wider a floor\n\t\t than that — one pixel more and the strip wraps at the default width. */\n\t\tmin-width: 96px;\n\t\tflex-direction: column;\n\t\talign-items: stretch;\n\t\tgap: 3px;\n\t}\n\n\t.ticks {\n\t\tdisplay: flex;\n\t\talign-items: flex-end;\n\t\tgap: 1px;\n\t\theight: 26px;\n\t}\n\n\t/* Spend has no ceiling, so its columns get no track: a groove behind them\n\t would promise a full mark that does not exist. */\n\t.ticks .track {\n\t\tflex: 1 1 0;\n\t\tmin-width: 2px;\n\t\tbackground: transparent;\n\t}\n\n\t.col {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: 3px;\n\t\t/* Wide enough for the widest thing above it — \"100%\" — so neither the\n\t\t readings nor the tags lean into their neighbours'. */\n\t\tmin-width: 21px;\n\t}\n\n\t.val {\n\t\tfont-size: 9px;\n\t\tline-height: 1;\n\t\tfont-weight: 600;\n\t\tfont-variant-numeric: tabular-nums;\n\t\twhite-space: nowrap;\n\t}\n\n\t.val.spend {\n\t\tfont-size: 11px;\n\t\tcolor: hsl(var(--foreground));\n\t}\n\n\t/* The figure and the label at each end of the sparkline. */\n\t.line {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: baseline;\n\t\tgap: 8px;\n\t}\n\n\t.track {\n\t\tposition: relative;\n\t\tdisplay: block;\n\t\twidth: 7px;\n\t\theight: 26px;\n\t\tborder-radius: 2px;\n\t\tbackground: rgba(255, 255, 255, 0.08);\n\t\toverflow: hidden;\n\t}\n\n\t.fill {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\tborder-radius: 2px;\n\t\ttransition: height 600ms ease;\n\t}\n\n\t.tag {\n\t\tfont-size: 9px;\n\t\tline-height: 1;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.04em;\n\t\tcolor: #a8a29e;\n\t\twhite-space: nowrap;\n\t}\n\n\t.alerts-row {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tgap: 8px;\n\t\tmargin-top: 8px;\n\t\tfont-size: 11px;\n\t\tcolor: hsl(var(--muted-foreground));\n\t}\n\n\t/* Four choices of one setting, so one control rather than four checkboxes. */\n\t.segmented {\n\t\tdisplay: inline-flex;\n\t\tpadding: 2px;\n\t\tgap: 2px;\n\t\tborder-radius: 7px;\n\t\tbackground: rgba(255, 255, 255, 0.04);\n\t\tborder: 1px solid #2a2a2c;\n\t}\n\n\t.segmented button {\n\t\tborder: 0;\n\t\tbackground: transparent;\n\t\tcolor: inherit;\n\t\tfont: inherit;\n\t\tfont-size: 11px;\n\t\tline-height: 1;\n\t\tpadding: 4px 7px;\n\t\tborder-radius: 5px;\n\t\tcursor: pointer;\n\t}\n\n\t.segmented button:hover:not(.on) {\n\t\tcolor: hsl(var(--foreground));\n\t}\n\n\t.segmented button.on {\n\t\tbackground: rgba(255, 255, 255, 0.1);\n\t\tcolor: hsl(var(--foreground));\n\t}\n\n\t.segmented button:focus-visible {\n\t\toutline: 1px solid #818cf8;\n\t\toutline-offset: 1px;\n\t}\n\n\t.segmented button:disabled {\n\t\tcursor: progress;\n\t}\n\n\t.alerts-problem {\n\t\tmargin: 6px 0 0;\n\t\tfont-size: 11px;\n\t\tline-height: 1.35;\n\t\tcolor: #fbbf24;\n\t}\n\n\t.alerts-note {\n\t\tmargin: 6px 0 0;\n\t\tfont-size: 11px;\n\t\tline-height: 1.35;\n\t\tcolor: hsl(var(--muted-foreground));\n\t}\n\n\t.link-button {\n\t\tmargin-left: auto;\n\t\tborder: 0;\n\t\tpadding: 0;\n\t\tbackground: none;\n\t\tfont: inherit;\n\t\tfont-size: 11px;\n\t\tcolor: hsl(var(--muted-foreground));\n\t\ttext-decoration: underline;\n\t\ttext-underline-offset: 2px;\n\t\tcursor: pointer;\n\t}\n\n\t.link-button:hover:not(:disabled) {\n\t\tcolor: hsl(var(--foreground));\n\t}\n\n\t.link-button:disabled {\n\t\tcursor: progress;\n\t}\n\n\t.toggles {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 4px 14px;\n\t\tmargin-top: 6px;\n\t}\n\n\t.toggle-row {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\tfont-size: 11px;\n\t\tcolor: hsl(var(--muted-foreground));\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t}\n\n\t.toggle-row input {\n\t\tmargin: 0;\n\t\tcursor: pointer;\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * Two session pages side by side, each in an iframe on its own host.\n\t *\n\t * The page inside a pane draws its own composer, and that composer carries\n\t * the pane's controls — swap, zoom, close — so this component draws nothing\n\t * but the two frames and the divider. The frame asks for those actions with\n\t * postMessage; this side answers only with whether the frame has focus.\n\t * Dropping a sidebar row on a pane replaces what the pane shows.\n\t */\n\timport { onMount } from 'svelte';\n\timport { splitStore, type PaneSide, MIN_PANE_PX } from '$lib/stores/split.svelte';\n\timport { serverStore } from '$lib/stores/servers.svelte';\n\timport { paneUrl, parseRef, type PaneRef } from '$lib/split-refs';\n\timport ResizeDivider from './ResizeDivider.svelte';\n\n\tlet { a, b }: { a: PaneRef; b: PaneRef } = $props();\n\n\tlet frameA = $state<HTMLIFrameElement | null>(null);\n\tlet frameB = $state<HTMLIFrameElement | null>(null);\n\tlet root = $state<HTMLElement | null>(null);\n\n\tconst urlA = $derived(paneUrl(a, serverStore.servers, serverStore.self));\n\tconst urlB = $derived(paneUrl(b, serverStore.servers, serverStore.self));\n\n\t/** Grid columns from the ratio, unless a pane is zoomed. */\n\tconst columns = $derived.by(() => {\n\t\tif (splitStore.zoom === 'a') return '1fr 0 0';\n\t\tif (splitStore.zoom === 'b') return '0 0 1fr';\n\t\tconst pct = Math.round(splitStore.ratio * 1000) / 10;\n\t\treturn `${pct}fr 6px ${100 - pct}fr`;\n\t});\n\n\tfunction frameOf(side: PaneSide): HTMLIFrameElement | null {\n\t\treturn side === 'a' ? frameA : frameB;\n\t}\n\n\tfunction sideOf(source: MessageEventSource | null): PaneSide | null {\n\t\tif (source && frameA?.contentWindow === source) return 'a';\n\t\tif (source && frameB?.contentWindow === source) return 'b';\n\t\treturn null;\n\t}\n\n\t/** Tell each frame whether it holds the focus. */\n\tfunction announceFocus() {\n\t\tfor (const side of ['a', 'b'] as PaneSide[]) {\n\t\t\tconst ref = side === 'a' ? a : b;\n\t\t\tframeOf(side)?.contentWindow?.postMessage(\n\t\t\t\t{ type: 'claude-mux:focus', focused: splitStore.focus === side, side, local: ref.host === null },\n\t\t\t\t'*'\n\t\t\t);\n\t\t}\n\t}\n\n\t$effect(() => {\n\t\tvoid splitStore.focus;\n\t\tannounceFocus();\n\t});\n\n\tfunction onMessage(e: MessageEvent) {\n\t\tconst side = sideOf(e.source);\n\t\tif (!side) return;\n\t\tconst msg = e.data as { type?: string; action?: string; side?: string } | null;\n\t\tif (!msg || msg.type !== 'claude-mux:pane') return;\n\t\tswitch (msg.action) {\n\t\t\tcase 'focus':\n\t\t\t\tsplitStore.setFocus(side);\n\t\t\t\tbreak;\n\t\t\tcase 'focus-other':\n\t\t\t\tsplitStore.setFocus(splitStore.other(side));\n\t\t\t\tbreak;\n\t\t\tcase 'swap':\n\t\t\t\tsplitStore.swap();\n\t\t\t\tbreak;\n\t\t\tcase 'zoom':\n\t\t\t\tsplitStore.toggleZoom(side);\n\t\t\t\tbreak;\n\t\t\tcase 'close':\n\t\t\t\tsplitStore.close(side);\n\t\t\t\tbreak;\n\t\t\tcase 'ready':\n\t\t\t\tannounceFocus();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// ── divider ──────────────────────────────────────────────────────────────\n\tlet resizing = $state(false);\n\tfunction moveResize(e: PointerEvent) {\n\t\tif (!root) return;\n\t\tconst rect = root.getBoundingClientRect();\n\t\tconst min = MIN_PANE_PX / rect.width;\n\t\tsplitStore.setRatio(Math.min(1 - min, Math.max(min, (e.clientX - rect.left) / rect.width)));\n\t}\n\n\t// ── drop targets ─────────────────────────────────────────────────────────\n\tfunction onDrop(side: PaneSide, e: DragEvent) {\n\t\te.preventDefault();\n\t\tconst text = e.dataTransfer?.getData('text/claude-mux-session') ?? '';\n\t\tconst ref = parseRef(text);\n\t\tsplitStore.dragging = false;\n\t\tif (ref) splitStore.openIn(side, ref, null);\n\t}\n\n\tonMount(() => {\n\t\twindow.addEventListener('message', onMessage);\n\t\treturn () => window.removeEventListener('message', onMessage);\n\t});\n</script>\n\n<div\n\tclass=\"split\"\n\tclass:dragging={splitStore.dragging}\n\tstyle=\"grid-template-columns: {columns}\"\n\tbind:this={root}\n>\n\t{#snippet pane(side: PaneSide, ref: PaneRef, url: string | null, frame: 'a' | 'b')}\n\t\t<section class=\"pane\" class:hidden={splitStore.zoom !== null && splitStore.zoom !== side}>\n\t\t\t{#if url}\n\t\t\t\t{#if frame === 'a'}\n\t\t\t\t\t<iframe bind:this={frameA} src={url} title={ref.target} allow=\"microphone; clipboard-read; clipboard-write\"></iframe>\n\t\t\t\t{:else}\n\t\t\t\t\t<iframe bind:this={frameB} src={url} title={ref.target} allow=\"microphone; clipboard-read; clipboard-write\"></iframe>\n\t\t\t\t{/if}\n\t\t\t{:else}\n\t\t\t\t<div class=\"unreachable\">\n\t\t\t\t\t<iconify-icon icon=\"mdi:lan-disconnect\"></iconify-icon>\n\t\t\t\t\t<p><b>{ref.host}</b> is not on the tailnet right now.</p>\n\t\t\t\t\t<button type=\"button\" onclick={() => splitStore.close(side)}>Close this pane</button>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t\t{#if splitStore.dragging}\n\t\t\t\t<!-- Frames swallow drag events; the overlay is where a drop lands. -->\n\t\t\t\t<div\n\t\t\t\t\tclass=\"drop\"\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-label=\"Drop a session here\"\n\t\t\t\t\tondragover={(e) => e.preventDefault()}\n\t\t\t\t\tondrop={(e) => onDrop(side, e)}\n\t\t\t\t>\n\t\t\t\t\tReplace this pane\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t\t{#if resizing}\n\t\t\t\t<!-- Same reason: the frame must not eat the pointer mid-drag. -->\n\t\t\t\t<div class=\"shield\"></div>\n\t\t\t{/if}\n\t\t</section>\n\t{/snippet}\n\n\t{@render pane('a', a, urlA, 'a')}\n\t<div class=\"divider-slot\" class:hidden={splitStore.zoom !== null}>\n\t\t<ResizeDivider\n\t\t\tbind:resizing\n\t\t\ttitle=\"Drag to resize · double-click for 50/50\"\n\t\t\tonmove={moveResize}\n\t\t\tonreset={() => splitStore.setRatio(0.5)}\n\t\t/>\n\t</div>\n\t{@render pane('b', b, urlB, 'b')}\n</div>\n\n<style>\n\t.split {\n\t\tdisplay: grid;\n\t\theight: 100%;\n\t\tmin-height: 0;\n\t\tmin-width: 0;\n\t}\n\t.pane {\n\t\tposition: relative;\n\t\tmin-width: 0;\n\t\tmin-height: 0;\n\t\toverflow: hidden;\n\t}\n\t.pane.hidden {\n\t\tdisplay: none;\n\t}\n\tiframe {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tborder: 0;\n\t\tbackground: #0a0a0a;\n\t}\n\t.divider-slot {\n\t\tmin-width: 0;\n\t}\n\t.divider-slot.hidden {\n\t\tdisplay: none;\n\t}\n\t.shield {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t}\n\t.drop {\n\t\tposition: absolute;\n\t\tinset: 10px 10px 110px;\n\t\tdisplay: grid;\n\t\tplace-items: center;\n\t\tborder: 2px dashed #818cf8;\n\t\tborder-radius: 12px;\n\t\tbackground: rgba(129, 140, 248, 0.1);\n\t\tcolor: #a5b4fc;\n\t\tfont: 500 13px system-ui, sans-serif;\n\t}\n\t.unreachable {\n\t\theight: 100%;\n\t\tdisplay: grid;\n\t\tplace-content: center;\n\t\tjustify-items: center;\n\t\tgap: 8px;\n\t\tcolor: #a8a29e;\n\t\tfont: 14px system-ui, sans-serif;\n\t}\n\t.unreachable iconify-icon {\n\t\tfont-size: 28px;\n\t\tcolor: #6b6764;\n\t}\n\t.unreachable b {\n\t\tcolor: #e7e5e4;\n\t\tfont-weight: 500;\n\t}\n\t.unreachable button {\n\t\theight: 30px;\n\t\tpadding: 0 12px;\n\t\tborder: 1px solid #2a2a2c;\n\t\tborder-radius: 8px;\n\t\tbackground: #151516;\n\t\tcolor: #d6d3d1;\n\t\tcursor: pointer;\n\t}\n</style>\n","<!--\n\tTurns session changes into alerts: a system notification while the window\n\tis in the background, a toast while it is in front, an optional sound, and\n\ta count on the favicon. Draws nothing itself. Adapted from t3code's\n\tThreadNotificationCoordinator (MIT, © T3 Tools Inc.).\n-->\n<script lang=\"ts\">\n\timport { untrack } from 'svelte';\n\timport { goto } from '$app/navigation';\n\timport { toast } from 'svelte-sonner';\n\timport {\n\t\tdetectNotifications,\n\t\tNOTIFICATION_TITLES,\n\t\ttype SeenSession,\n\t\ttype SessionNotification\n\t} from '$shared/session-notifications.js';\n\timport {\n\t\tsessionStore,\n\t\tasking,\n\t\tgetSessionDisplayName,\n\t\twantsHuman,\n\t\ttype Session\n\t} from '$lib/stores/sessions.svelte';\n\timport { preferences } from '$lib/stores/preferences.svelte';\n\timport {\n\t\thasDesktopNotifications,\n\t\thasNotificationSound,\n\t\tplayNotificationSound,\n\t\tsetFaviconBadge,\n\t\tunlockNotificationAudio\n\t} from '$lib/notifications';\n\n\t/** The tmux targets of the sessions on screen; a split shows two. */\n\tlet { viewing }: { viewing: string[] } = $props();\n\n\tconst mode = $derived(preferences.notificationMode);\n\n\t/** Open notifications by session id, so focus can close them and a newer one replaces the older. */\n\tconst open = new Map<string, Notification>();\n\n\tfunction closeAll(): void {\n\t\tfor (const n of open.values()) n.close();\n\t\topen.clear();\n\t}\n\n\tfunction windowInFront(): boolean {\n\t\treturn document.visibilityState === 'visible' && document.hasFocus();\n\t}\n\n\tfunction openSession(target: string): void {\n\t\tvoid goto(`/session/${encodeURIComponent(target)}`);\n\t}\n\n\tfunction alert({ session: s, kind }: SessionNotification<Session>): void {\n\t\tconst inFront = windowInFront();\n\t\t// The session you are looking at needs no alert: you can see it.\n\t\tif (inFront && viewing.some((t) => t === s.tmux_target || t === s.id)) return;\n\n\t\tif (hasNotificationSound(mode)) playNotificationSound(kind === 'completion' ? 'completion' : 'needs-you');\n\n\t\tconst title = NOTIFICATION_TITLES[kind];\n\t\tconst name = getSessionDisplayName(s);\n\t\tconst more = kind === 'completion' ? null : asking(s);\n\t\tconst target = s.tmux_target ?? s.id;\n\n\t\tif (inFront) {\n\t\t\tif (!preferences.inAppToasts) return;\n\t\t\tconst show = kind === 'completion' ? toast.success : toast.warning;\n\t\t\tshow(title, {\n\t\t\t\tid: `session-${s.id}`,\n\t\t\t\tdescription: more ? `${name} · ${more}` : name,\n\t\t\t\taction: { label: 'Open', onClick: () => openSession(target) }\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\t!hasDesktopNotifications(mode) ||\n\t\t\ttypeof Notification === 'undefined' ||\n\t\t\tNotification.permission !== 'granted'\n\t\t)\n\t\t\treturn;\n\t\ttry {\n\t\t\topen.get(s.id)?.close();\n\t\t\tconst n = new Notification(title, {\n\t\t\t\tbody: more ? `${name}\\n${more}` : name,\n\t\t\t\ttag: s.id,\n\t\t\t\ticon: '/icon-192.png'\n\t\t\t});\n\t\t\topen.set(s.id, n);\n\t\t\tn.addEventListener('click', () => {\n\t\t\t\tn.close();\n\t\t\t\twindow.focus();\n\t\t\t\topenSession(target);\n\t\t\t});\n\t\t\tn.addEventListener('close', () => {\n\t\t\t\tif (open.get(s.id) === n) open.delete(s.id);\n\t\t\t});\n\t\t} catch {\n\t\t\t// Some browsers expose Notification but refuse to show one from a page.\n\t\t}\n\t}\n\n\tlet seen = new Map<string, SeenSession>();\n\t$effect(() => {\n\t\tconst out = detectNotifications(seen, sessionStore.sessions);\n\t\tseen = out.seen;\n\t\t// Only a new broadcast should re-run detection, not a preference or a navigation.\n\t\tuntrack(() => {\n\t\t\tfor (const event of out.events) alert(event);\n\t\t});\n\t});\n\n\t// Coming back to the window is reading what the notifications said.\n\t$effect(() => {\n\t\twindow.addEventListener('focus', closeAll);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('focus', closeAll);\n\t\t\tcloseAll();\n\t\t};\n\t});\n\n\t// A tapped push notification hands an open page the session to show (see service-worker.ts).\n\t$effect(() => {\n\t\tif (!('serviceWorker' in navigator)) return;\n\t\tconst onMessage = (event: MessageEvent) => {\n\t\t\tconst data = event.data as { type?: string; url?: string } | null;\n\t\t\tif (data?.type === 'open' && data.url) void goto(data.url);\n\t\t};\n\t\tnavigator.serviceWorker.addEventListener('message', onMessage);\n\t\treturn () => navigator.serviceWorker.removeEventListener('message', onMessage);\n\t});\n\n\t$effect(() => {\n\t\tif (!hasNotificationSound(mode)) return;\n\t\tdocument.addEventListener('pointerdown', unlockNotificationAudio);\n\t\tdocument.addEventListener('keydown', unlockNotificationAudio);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('pointerdown', unlockNotificationAudio);\n\t\t\tdocument.removeEventListener('keydown', unlockNotificationAudio);\n\t\t};\n\t});\n\n\tconst needingYou = $derived(sessionStore.sessions.filter((s) => s.pane_alive !== false && wantsHuman(s)).length);\n\t$effect(() => setFaviconBadge(needingYou));\n</script>\n","<script lang=\"ts\">/**\n * @license @lucide/svelte v0.561.0 - ISC\n *\n * ISC License\n *\n * Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The MIT License (MIT) (for portions derived from Feather)\n *\n * Copyright (c) 2013-2023 Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nlet props = $props();\nconst iconNode = [[\"path\", { \"d\": \"M21 12a9 9 0 1 1-6.219-8.56\" }]];\n/**\n * @component @name LoaderCircle\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTJhOSA5IDAgMSAxLTYuMjE5LTguNTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/loader-circle\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"loader-circle\" {...props} iconNode={iconNode}>\n {@render props.children?.()}\n</Icon>\n","<script lang=\"ts\">/**\n * @license @lucide/svelte v0.561.0 - ISC\n *\n * ISC License\n *\n * Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The MIT License (MIT) (for portions derived from Feather)\n *\n * Copyright (c) 2013-2023 Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nlet props = $props();\nconst iconNode = [[\"circle\", { \"cx\": \"12\", \"cy\": \"12\", \"r\": \"10\" }], [\"path\", { \"d\": \"m9 12 2 2 4-4\" }]];\n/**\n * @component @name CircleCheck\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJtOSAxMiAyIDIgNC00IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/circle-check\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"circle-check\" {...props} iconNode={iconNode}>\n {@render props.children?.()}\n</Icon>\n","<script lang=\"ts\">/**\n * @license @lucide/svelte v0.561.0 - ISC\n *\n * ISC License\n *\n * Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The MIT License (MIT) (for portions derived from Feather)\n *\n * Copyright (c) 2013-2023 Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nlet props = $props();\nconst iconNode = [[\"path\", { \"d\": \"m15 9-6 6\" }], [\"path\", { \"d\": \"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z\" }], [\"path\", { \"d\": \"m9 9 6 6\" }]];\n/**\n * @component @name OctagonX\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgOS02IDYiIC8+CiAgPHBhdGggZD0iTTIuNTg2IDE2LjcyNkEyIDIgMCAwIDEgMiAxNS4zMTJWOC42ODhhMiAyIDAgMCAxIC41ODYtMS40MTRsNC42ODgtNC42ODhBMiAyIDAgMCAxIDguNjg4IDJoNi42MjRhMiAyIDAgMCAxIDEuNDE0LjU4Nmw0LjY4OCA0LjY4OEEyIDIgMCAwIDEgMjIgOC42ODh2Ni42MjRhMiAyIDAgMCAxLS41ODYgMS40MTRsLTQuNjg4IDQuNjg4YTIgMiAwIDAgMS0xLjQxNC41ODZIOC42ODhhMiAyIDAgMCAxLTEuNDE0LS41ODZ6IiAvPgogIDxwYXRoIGQ9Im05IDkgNiA2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/octagon-x\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"octagon-x\" {...props} iconNode={iconNode}>\n {@render props.children?.()}\n</Icon>\n","<script lang=\"ts\">/**\n * @license @lucide/svelte v0.561.0 - ISC\n *\n * ISC License\n *\n * Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The MIT License (MIT) (for portions derived from Feather)\n *\n * Copyright (c) 2013-2023 Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nlet props = $props();\nconst iconNode = [[\"circle\", { \"cx\": \"12\", \"cy\": \"12\", \"r\": \"10\" }], [\"path\", { \"d\": \"M12 16v-4\" }], [\"path\", { \"d\": \"M12 8h.01\" }]];\n/**\n * @component @name Info\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNMTIgMTZ2LTQiIC8+CiAgPHBhdGggZD0iTTEyIDhoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/info\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"info\" {...props} iconNode={iconNode}>\n {@render props.children?.()}\n</Icon>\n","<script lang=\"ts\">/**\n * @license @lucide/svelte v0.561.0 - ISC\n *\n * ISC License\n *\n * Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The MIT License (MIT) (for portions derived from Feather)\n *\n * Copyright (c) 2013-2023 Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nlet props = $props();\nconst iconNode = [[\"path\", { \"d\": \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" }], [\"path\", { \"d\": \"M12 9v4\" }], [\"path\", { \"d\": \"M12 17h.01\" }]];\n/**\n * @component @name TriangleAlert\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEuNzMgMTgtOC0xNGEyIDIgMCAwIDAtMy40OCAwbC04IDE0QTIgMiAwIDAgMCA0IDIxaDE2YTIgMiAwIDAgMCAxLjczLTMiIC8+CiAgPHBhdGggZD0iTTEyIDl2NCIgLz4KICA8cGF0aCBkPSJNMTIgMTdoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/triangle-alert\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"triangle-alert\" {...props} iconNode={iconNode}>\n {@render props.children?.()}\n</Icon>\n","<script lang=\"ts\">\n\timport { Toaster as Sonner, type ToasterProps as SonnerProps } from \"svelte-sonner\";\n\timport Loader2Icon from '@lucide/svelte/icons/loader-2';\n\timport CircleCheckIcon from '@lucide/svelte/icons/circle-check';\n\timport OctagonXIcon from '@lucide/svelte/icons/octagon-x';\n\timport InfoIcon from '@lucide/svelte/icons/info';\n\timport TriangleAlertIcon from '@lucide/svelte/icons/triangle-alert';\n\n\tlet { ...restProps }: SonnerProps = $props();\n</script>\n\n<!-- The app is dark only, so the theme is fixed rather than read from mode-watcher. -->\n<Sonner\n\ttheme=\"dark\"\n\tclass=\"toaster group\"\n\tstyle=\"--normal-bg: #151516; --normal-text: hsl(var(--foreground)); --normal-border: #2a2a2c; --border-radius: 14px;\"\n\t{...restProps}\n>\n\t{#snippet loadingIcon()}\n\t\t<Loader2Icon class=\"size-4 animate-spin\" />\n\t{/snippet}\n\t{#snippet successIcon()}\n\t\t<CircleCheckIcon class=\"size-4 text-emerald-400\" />\n\t{/snippet}\n\t{#snippet errorIcon()}\n\t\t<OctagonXIcon class=\"size-4\" />\n\t{/snippet}\n\t{#snippet infoIcon()}\n\t\t<InfoIcon class=\"size-4\" />\n\t{/snippet}\n\t{#snippet warningIcon()}\n\t\t<TriangleAlertIcon class=\"size-4 text-amber-400\" />\n\t{/snippet}\n</Sonner>\n","<script lang=\"ts\">\n\timport '../app.css';\n\timport { page } from '$app/stores';\n\timport { browser } from '$app/environment';\n\timport { afterNavigate } from '$app/navigation';\n\timport { reportClient, watchClientErrors } from '$lib/client-log';\n\timport { onMount, onDestroy } from 'svelte';\n\timport { drawer } from '$lib/stores/drawer.svelte';\n\timport { sessionStore } from '$lib/stores/sessions.svelte';\n\timport { preferences } from '$lib/stores/preferences.svelte';\n\timport { acquireWakeLock, releaseWakeLock } from '$lib/wakeLock.svelte';\n\timport { voiceStore } from '$lib/stores/voice.svelte';\n\timport AllSessionsPanel from '$lib/components/AllSessionsPanel.svelte';\n\timport ScreenshotsPanel from '$lib/components/ScreenshotsPanel.svelte';\n\timport SidebarMeters from '$lib/components/SidebarMeters.svelte';\n\timport { STORAGE_KEYS } from '$lib/constants';\n\timport SplitView from '$lib/components/SplitView.svelte';\n\timport { splitStore } from '$lib/stores/split.svelte';\n\timport { parseRef } from '$lib/split-refs';\n\timport NotificationCoordinator from '$lib/components/NotificationCoordinator.svelte';\n\timport { Toaster } from '$lib/components/ui/sonner';\n\n\tlet { children } = $props();\n\n\t/**\n\t * Embedded: this page is one pane of a split, drawn inside another page's\n\t * iframe. No shell — the sidebar and its drawer belong to the page outside.\n\t */\n\tconst embed = $derived($page.url.searchParams.has('embed'));\n\n\t/** The two panes of a split, read off `/session/A?with=B`. */\n\tconst splitA = $derived(\n\t\t$page.url.pathname.startsWith('/session/')\n\t\t\t? parseRef(decodeURIComponent($page.url.pathname.split('/session/')[1]))\n\t\t\t: null\n\t);\n\tconst splitB = $derived.by(() => {\n\t\tconst raw = $page.url.searchParams.get('with');\n\t\treturn raw ? parseRef(raw) : null;\n\t});\n\tconst splitOn = $derived(!embed && splitA !== null && splitB !== null);\n\t$effect(() => {\n\t\tsplitStore.setPanes(splitOn ? splitA : null, splitOn ? splitB : null);\n\t});\n\n\t/** Dropping a sidebar row here starts a split with the session on the page. */\n\tfunction dropToSplit(e: DragEvent) {\n\t\te.preventDefault();\n\t\tconst ref = parseRef(e.dataTransfer?.getData('text/claude-mux-session') ?? '');\n\t\tsplitStore.dragging = false;\n\t\tif (ref && splitA) splitStore.splitWith(ref, splitA);\n\t}\n\n\t/** Driven from the session composer's status line, which carries the toggle. */\n\tconst drawerOpen = $derived(drawer.open);\n\tlet sidebarElement: HTMLElement | null = $state(null);\n\tlet touchStartX = 0;\n\tlet touchCurrentX = 0;\n\tlet isDragging = false;\n\n\t// Resizable sidebar state\n\tconst SIDEBAR_WIDTH_KEY = STORAGE_KEYS.sidebarWidth;\n\tconst MIN_WIDTH = 200;\n\tconst MAX_WIDTH = 500;\n\tconst DEFAULT_WIDTH = 300;\n\n\tlet sidebarWidth = $state(DEFAULT_WIDTH);\n\tlet isResizing = $state(false);\n\n\t// Show sidebar only on session detail pages (not on main page)\n\tconst showSidebar = $derived($page.url.pathname.startsWith('/session/'));\n\n\t// Current session for screenshots panel\n\tconst currentTarget = $derived(\n\t\t$page.url.pathname.startsWith('/session/')\n\t\t\t? decodeURIComponent($page.url.pathname.split('/session/')[1])\n\t\t\t: null\n\t);\n\n\t/** The sessions on screen, which need no alert while the window is in front. */\n\tconst viewing = $derived(\n\t\tsplitOn\n\t\t\t? [splitA, splitB].filter((r) => r && !r.host).map((r) => r!.target)\n\t\t\t: currentTarget\n\t\t\t\t? [currentTarget]\n\t\t\t\t: []\n\t);\n\n\tconst currentSession = $derived(\n\t\tsessionStore.sessions.find((s) => s.tmux_target === currentTarget || s.id === currentTarget)\n\t);\n\n\t// Connect session store at layout level so sidebar always has data\n\tonMount(() => watchClientErrors());\n\n\tafterNavigate((nav) => {\n\t\treportClient('nav', {\n\t\t\ttype: nav.type,\n\t\t\tfrom: nav.from?.url?.pathname ?? null,\n\t\t\tto: nav.to?.url?.pathname ?? null\n\t\t});\n\t});\n\n\tonMount(() => {\n\t\tsessionStore.connect();\n\n\t\tif (browser) {\n\t\t\t// Load saved sidebar width\n\t\t\tconst saved = localStorage.getItem(SIDEBAR_WIDTH_KEY);\n\t\t\tif (saved) {\n\t\t\t\tconst width = parseInt(saved, 10);\n\t\t\t\tif (width >= MIN_WIDTH && width <= MAX_WIDTH) {\n\t\t\t\t\tsidebarWidth = width;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\tonDestroy(() => {\n\t\tsessionStore.disconnect();\n\t\tif (browser) void releaseWakeLock();\n\t});\n\n\t/**\n\t * The screen stays on when asked to, and always while you dictate: a phone\n\t * that dims mid-sentence suspends the page, and the recording with it.\n\t */\n\tconst wantAwake = $derived(\n\t\tpreferences.keepAwake || voiceStore.status === 'recording' || voiceStore.status === 'transcribing'\n\t);\n\n\tfunction handleVisibility() {\n\t\t// The browser drops the lock whenever the page is hidden; take it back.\n\t\tif (document.visibilityState === 'visible' && wantAwake) {\n\t\t\tvoid acquireWakeLock();\n\t\t}\n\t}\n\n\t$effect(() => {\n\t\tif (!browser) return;\n\t\tif (wantAwake) void acquireWakeLock();\n\t\telse void releaseWakeLock();\n\t});\n\n\t$effect(() => {\n\t\tif (!browser) return;\n\t\tdocument.addEventListener('visibilitychange', handleVisibility);\n\t\treturn () => document.removeEventListener('visibilitychange', handleVisibility);\n\t});\n\n\t// Resize handlers\n\tfunction handleResizeStart(e: MouseEvent) {\n\t\te.preventDefault();\n\t\tisResizing = true;\n\t\tdocument.addEventListener('mousemove', handleResizeMove);\n\t\tdocument.addEventListener('mouseup', handleResizeEnd);\n\t}\n\n\tfunction handleResizeMove(e: MouseEvent) {\n\t\tif (!isResizing) return;\n\t\tconst newWidth = Math.min(MAX_WIDTH, Math.max(MIN_WIDTH, e.clientX));\n\t\tsidebarWidth = newWidth;\n\t}\n\n\tfunction handleResizeEnd() {\n\t\tisResizing = false;\n\t\tdocument.removeEventListener('mousemove', handleResizeMove);\n\t\tdocument.removeEventListener('mouseup', handleResizeEnd);\n\t\tif (browser) {\n\t\t\tlocalStorage.setItem(SIDEBAR_WIDTH_KEY, sidebarWidth.toString());\n\t\t}\n\t}\n\n\t/** The sidebar's own shortcut, the one VS Code taught everyone. */\n\tfunction handleSidebarKey(e: KeyboardEvent) {\n\t\tif (!(e.ctrlKey || e.metaKey) || e.altKey || e.shiftKey) return;\n\t\tif (e.key.toLowerCase() !== 'b') return;\n\t\te.preventDefault();\n\t\tdrawer.toggle();\n\t}\n\n\tfunction closeDrawer() {\n\t\tdrawer.close();\n\t}\n\n\tfunction handleTouchStart(e: TouchEvent) {\n\t\ttouchStartX = e.touches[0].clientX;\n\t\ttouchCurrentX = touchStartX;\n\t\tisDragging = true;\n\t}\n\n\tfunction handleTouchMove(e: TouchEvent) {\n\t\tif (!isDragging || !sidebarElement) return;\n\t\ttouchCurrentX = e.touches[0].clientX;\n\t\tconst diff = touchCurrentX - touchStartX;\n\t\tif (diff < 0) {\n\t\t\tsidebarElement.style.transform = `translateX(${diff}px)`;\n\t\t}\n\t}\n\n\tfunction handleTouchEnd() {\n\t\tif (!isDragging || !sidebarElement) return;\n\t\tisDragging = false;\n\t\tconst diff = touchCurrentX - touchStartX;\n\t\tif (diff < -80) {\n\t\t\tcloseDrawer();\n\t\t}\n\t\tsidebarElement.style.transform = '';\n\t}\n</script>\n\n<svelte:head>\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no, viewport-fit=cover\" />\n\t<script src=\"https://code.iconify.design/iconify-icon/2.1.0/iconify-icon.min.js\"></script>\n</svelte:head>\n\n<svelte:window onkeydown={handleSidebarKey} />\n\n{#if !embed}\n\t<!-- A split's panes are this layout in frames; only the outer page alerts. -->\n\t<NotificationCoordinator {viewing} />\n\t<Toaster position=\"top-right\" closeButton />\n{/if}\n\n{#if showSidebar && !embed}\n\t<div class=\"app-shell\" class:resizing-any={isResizing}>\n\t\t<aside\n\t\t\tclass=\"sidebar\"\n\t\t\tclass:open={drawerOpen}\n\t\t\tclass:resizing={isResizing}\n\t\t\tstyle=\"--sidebar-width: {sidebarWidth}px\"\n\t\t\tbind:this={sidebarElement}\n\t\t\tontouchstart={handleTouchStart}\n\t\t\tontouchmove={handleTouchMove}\n\t\t\tontouchend={handleTouchEnd}\n\t\t>\n\t\t\t<div class=\"sidebar-content\">\n\t\t\t\t<AllSessionsPanel compact onSessionSelect={closeDrawer} />\n\t\t\t</div>\n\t\t\t<!-- The foot is one card, the way the composer is: what belongs to the\n\t\t\t session you are on (its screenshots), then the meters. -->\n\t\t\t<div class=\"sidebar-foot\">\n\t\t\t\t{#if currentSession}\n\t\t\t\t\t<div class=\"sidebar-panel\">\n\t\t\t\t\t\t<ScreenshotsPanel\n\t\t\t\t\t\t\tsessionId={currentSession.id}\n\t\t\t\t\t\t\tscreenshots={currentSession.screenshots ?? []}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\t\t\t\t<SidebarMeters />\n\t\t\t</div>\n\t\t\t<!-- svelte-ignore a11y_no_noninteractive_element_interactions -->\n\t\t\t<div\n\t\t\t\tclass=\"resize-handle\"\n\t\t\t\tonmousedown={handleResizeStart}\n\t\t\t\trole=\"separator\"\n\t\t\t\taria-orientation=\"vertical\"\n\t\t\t></div>\n\t\t</aside>\n\n\t\t<main class=\"content\">\n\t\t\t{#if splitOn && splitA && splitB}\n\t\t\t\t<SplitView a={splitA} b={splitB} />\n\t\t\t{:else}\n\t\t\t\t{@render children()}\n\t\t\t\t{#if splitStore.dragging && splitA}\n\t\t\t\t\t<!-- Shown only while a sidebar row is in flight: the right\n\t\t\t\t\t edge is where dropping it opens a second pane. -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"split-drop\"\n\t\t\t\t\t\trole=\"region\"\n\t\t\t\t\t\taria-label=\"Drop to open side by side\"\n\t\t\t\t\t\tondragover={(e) => e.preventDefault()}\n\t\t\t\t\t\tondrop={dropToSplit}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>Open side by side</span>\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\t\t\t{/if}\n\t\t</main>\n\n\t\t{#if drawerOpen}\n\t\t\t<button class=\"backdrop\" onclick={closeDrawer} aria-label=\"Close menu\"></button>\n\t\t{/if}\n\t</div>\n{:else if embed}\n\t<!-- One pane of a split: the page alone, held to the frame's height the\n\t way .content holds it inside the shell, so its composer stays put. -->\n\t<div class=\"embed-shell\">\n\t\t{@render children()}\n\t</div>\n{:else}\n\t{@render children()}\n{/if}\n\n<style>\n\t:global(body) {\n\t\tmargin: 0;\n\t\tmin-height: 100dvh;\n\t\t/* Matches the header/toolbar so the iOS status-bar & home-indicator areas blend in */\n\t\tbackground: #111;\n\t}\n\n\t:global(iconify-icon) {\n\t\tfont-size: 18px;\n\t}\n\n\t:global(iconify-icon.spin) {\n\t\tanimation: spin 1s linear infinite;\n\t}\n\n\t@keyframes spin {\n\t\tfrom { transform: rotate(0deg); }\n\t\tto { transform: rotate(360deg); }\n\t}\n\n\t.app-shell {\n\t\tdisplay: flex;\n\t\theight: 100dvh;\n\t\toverflow: hidden;\n\t\tbox-sizing: border-box;\n\t\t/* Keep UI out from under the notch / home indicator in standalone (PWA) mode */\n\t\tpadding-top: env(safe-area-inset-top);\n\t\tpadding-bottom: env(safe-area-inset-bottom);\n\t\tpadding-left: env(safe-area-inset-left);\n\t\tpadding-right: env(safe-area-inset-right);\n\t}\n\n\t.app-shell.resizing-any {\n\t\tcursor: col-resize;\n\t\tuser-select: none;\n\t}\n\n\t.sidebar {\n\t\twidth: var(--sidebar-width, 300px);\n\t\tflex-shrink: 0;\n\t\tbackground: hsl(var(--background));\n\t\tborder-right: 1px solid hsl(var(--border));\n\t\toverflow: hidden;\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t.sidebar.resizing {\n\t\tuser-select: none;\n\t}\n\n\t.sidebar-content {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tflex: 1;\n\t\tmin-height: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: hidden;\n\t\t/* Reaching the end of the list must not scroll whatever sits behind\n\t\t the drawer on a phone. */\n\t\toverscroll-behavior: contain;\n\t}\n\n\t.sidebar-panel {\n\t\tflex-shrink: 0;\n\t}\n\n\t/* The right edge of the page while a session is being dragged. */\n\t.split-drop {\n\t\tposition: absolute;\n\t\ttop: 12px;\n\t\tright: 12px;\n\t\tbottom: 12px;\n\t\twidth: min(38%, 420px);\n\t\tdisplay: grid;\n\t\tplace-items: center;\n\t\tborder: 2px dashed #818cf8;\n\t\tborder-radius: 12px;\n\t\tbackground: rgba(129, 140, 248, 0.1);\n\t\tcolor: #a5b4fc;\n\t\tfont: 500 13px system-ui, sans-serif;\n\t\tz-index: var(--z-overlay);\n\t}\n\n\t/* The composer's card, at the foot of the sidebar. */\n\t.sidebar-foot {\n\t\tflex-shrink: 0;\n\t\tmargin: 0 10px 10px;\n\t\tbackground: #151516;\n\t\tborder: 1px solid #2a2a2c;\n\t\tborder-radius: 14px;\n\t\toverflow: hidden;\n\t}\n\t.sidebar-foot .sidebar-panel + :global(*) {\n\t\tborder-top: 1px solid #1f1f21;\n\t}\n\n\t.resize-handle {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: 0;\n\t\twidth: 4px;\n\t\theight: 100%;\n\t\tcursor: col-resize;\n\t\tbackground: transparent;\n\t\ttransition: background 0.15s;\n\t}\n\n\t.resize-handle:hover,\n\t.sidebar.resizing .resize-handle {\n\t\tbackground: color-mix(in oklch, var(--primary), transparent 50%);\n\t}\n\n\t.content {\n\t\tflex: 1;\n\t\toverflow: hidden;\n\t\tposition: relative;\n\t}\n\t.embed-shell {\n\t\theight: 100dvh;\n\t\toverflow: hidden;\n\t\tposition: relative;\n\t}\n\n\n\t.backdrop {\n\t\tdisplay: none;\n\t}\n\n\t/* Mobile responsive */\n\t@media (max-width: 768px) {\n\t\t.sidebar {\n\t\t\tposition: fixed;\n\t\t\tleft: 0;\n\t\t\ttop: 0;\n\t\t\tbottom: 0;\n\t\t\twidth: 100% !important;\n\t\t\tbox-sizing: border-box;\n\t\t\tpadding-top: env(safe-area-inset-top);\n\t\t\tpadding-bottom: env(safe-area-inset-bottom);\n\t\t\tz-index: var(--z-drawer);\n\t\t\ttransform: translateX(-100%);\n\t\t\ttransition: transform 0.2s ease;\n\t\t\tbackground: hsl(var(--background) / 0.85);\n\t\t\tbackdrop-filter: blur(12px);\n\t\t\t-webkit-backdrop-filter: blur(12px);\n\t\t}\n\n\t\t/* Closed drawer is off-screen but still composited — without this its\n\t\t busy dots keep animating behind the blur. */\n\t\t.sidebar:not(.open) {\n\t\t\tcontent-visibility: hidden;\n\t\t}\n\n\t\t.sidebar.open {\n\t\t\ttransform: translateX(0);\n\t\t}\n\n\t\t.resize-handle {\n\t\t\tdisplay: none;\n\t\t}\n\n\n\n\t\t.backdrop {\n\t\t\tdisplay: block;\n\t\t\tposition: fixed;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tbottom: 0;\n\t\t\tbackground: rgba(0, 0, 0, 0.4);\n\t\t\tz-index: var(--z-drawer-backdrop);\n\t\t\tborder: none;\n\t\t\tcursor: pointer;\n\t\t\ttouch-action: none;\n\t\t}\n\t}\n</style>\n"],"names":["sentinel","wakeLockSupported","acquireWakeLock","s","releaseWakeLock","bars","div","root_1","div_1","$.child","_","i","$$anchor","div_2","root","$.append","$.reset","$.set_class","$0","$.set_attribute","$$props","defaultWindow","getActiveElement","document","activeElement","node","ActiveElement","#document","#subscribe","options","window","createSubscriber","update","cleanupFocusIn","on","cleanupFocusOut","Context","#name","#key","name","hasContext","context","getContext","fallback","setContext","sonnerContext","isAction","action","useDocumentHidden","current","$.state","$.user_effect","$.set","$.get","TOAST_LIFETIME","GAP","SWIPE_THRESHOLD","TIME_BEFORE_UNMOUNT","SCALE_MULTIPLIER","DEFAULT_TOAST_CLASSES","getDefaultSwipeDirections","position","y","x","directions","getDampening","delta","LoadingIcon","node_1","toastType","cn","classes","$1","$.derived","Loader","cancelButtonStyle","$.prop","actionButtonStyle","descriptionClass","unstyled","defaultRichColors","gap","defaultClasses","mounted","removed","swiping","swipeOut","isSwiped","offsetBeforeRemove","initialHeight","remainingTime","dragStartTime","toastRef","swipeDirection","swipeOutDirection","isFront","isVisible","dismissible","toastClass","toastDescriptionClass","relevantHeights","toastState","height","heightIndex","idx","closeButton","duration","pointerStart","coords","swipeDirections","toastsHeightBefore","prev","curr","reducerIndex","isDocumentHidden","invert","disabled","toastTitle","toastDescription","closeTimerStartTime","lastCloseTimerStartTime","offset","scale","toastEl","untrack","offsetHeight","rectHeight","scaledRectHeight","finalHeight","deleteToast","timeoutId","isPromiseLoadingOrInfiniteDuration","startTimer","pauseTimer","elapsedTime","onMount","handlePointerDown","event","target","handlePointerUp","swipeAmountX","swipeAmountY","timeTaken","swipeAmount","velocity","handlePointerMove","yDelta","xDelta","dampenedDelta","handleDragEnd","icon","li","root_7","node_2","button","node_3","$.delegated","$$render","consequent_1","Component","Component_1","$.spread_props","root_2","node_7","toast_icon","consequent_3","alternate_1","consequent_4","consequent_5","toast_icon_1","consequent_6","consequent_8","consequent_9","consequent_10","consequent_11","$.template_effect","consequent_12","$.sibling","node_6","div_3","node_17","Title","Title_1","$.set_text","text","consequent_13","alternate_2","consequent_14","node_20","div_4","root_3","node_21","Description","Description_1","text_1","consequent_15","alternate_3","$.clsx","consequent_16","node_23","toast_cancel","button_1","root_4","text_2","$.only_child","consequent_17","d","consequent_18","consequent_19","toast_action","button_2","root_5","text_3","consequent_20","d_1","consequent_21","consequent_22","consequent_2","alternate_4","$$value","$2","styles","$.set_style","$.event","svg","VISIBLE_TOASTS_AMOUNT","VIEWPORT_OFFSET","MOBILE_VIEWPORT_OFFSET","TOAST_WIDTH","DARK","LIGHT","getOffsetObject","defaultOffset","mobileOffset","index","isMobile","prefix","defaultValue","assignAll","key","value","getInitialTheme","t","hotkey","expand","theme","richColors","visibleToasts","toastOptions","dir","pauseWhenPageIsHidden","containerAriaLabel","closeButtonAriaLabel","restProps","$.rest_props","rest_excludes","getDocumentDirection","dirAttribute","filteredToasts","toast","possiblePositions","expanded","interacting","actualTheme","listRef","lastFocusedElementRef","isFocusWithin","lastMousePosition","hotkeyLabel","toastsToDismiss","updatedToasts","dismissToast","mediaQueryList","changeHandler","matches","handleBlur","handleFocus","handleMouseEnter","handleMouseLeave","currentPosition","mouseActuallyMoved","handleMouseMove","SonnerState","section","$.each","$$array","offsetObject","frontHeight","ol","$$array_1","successIcon","SuccessIcon","consequent","errorIcon","ErrorIcon","warningIcon","WarningIcon","infoIcon","InfoIcon","consequent_7","closeIcon","CloseIcon","Toast","count","defaultExpanded","lazy","$.proxy","hasBeenExpanded","toggle","shouldRender","iconify_icon","span","span_1","iconify_icon_1","$.set_custom_element_data","viewingScreenshot","touchStartX","touchCurrentX","isSwiping","dismissScreenshot","path","openModal","closeModal","resetSwipe","getFilename","handleTouchStart","e","handleTouchMove","handleTouchEnd","swipeOffset","SidebarAccordion","p","screenshot","img","Button","alternate","root_6","img_1","node_4","$.first_child","fragment_2","node_5","iconify_icon_2","fragment_3","div_5","iconify_icon_3","hasDesktopNotifications","mode","hasNotificationSound","originalFavicon","badgeFavicon","badges","badgeImage","label","cached","canvas","url","setFaviconBadge","image","audio","unlockNotificationAudio","TONES","playNotificationSound","kind","now","freq","at","osc","gain","pushUnavailable","ios","standalone","worker","reject","currentSubscription","serverEvents","subscription","res","toKey","base64url","base64","c","api","method","body","data","saveEvents","events","subscribe","vapid","manager","bound","sameBytes","b","v","unsubscribe","sendTestPush","SPARK_DAYS","PLAN_UNAVAILABLE","usageStore","dayOf","makeDayFormatter","hostTimeZone","supported","summary","quota","today","stats","sessionStore","shortLabel","model","meters","out","limit","SEVERITY","system","tag","percent","severityForPercent","dayKey","spark","byDate","date","peak","MODES","alertProblem","preferences","requesting","chooseMode","pushSub","pushEvents","pushBusy","pushNote","pushBlocked","sub","pushAction","run","done","err","setPush","setPushEvent","testPush","root_10","a","meter","span_2","span_3","span_4","span_5","span_6","span_7","span_8","span_9","text_4","span_10","day","span_11","span_12","money","m","text_5","text_7","classes_1","p_1","text_8","label_1","input","$.remove_input_defaults","label_2","input_1","p_2","root_8","text_9","div_6","label_3","input_2","label_4","root_9","input_3","frameA","frameB","urlA","paneUrl","serverStore","urlB","columns","splitStore","pct","frameOf","side","sideOf","source","announceFocus","ref","onMessage","msg","resizing","moveResize","rect","min","MIN_PANE_PX","onDrop","parseRef","pane","$.noop","frame","iframe","iframe_1","$.bind_this","b_1","ResizeDivider","classes_2","open","closeAll","n","windowInFront","openSession","goto","alert","inFront","title","NOTIFICATION_TITLES","getSessionDisplayName","more","asking","seen","detectNotifications","needingYou","wantsHuman","props","iconNode","Icon","$.snippet","Sonner","Loader2Icon","CircleCheckIcon","OctagonXIcon","TriangleAlertIcon","embed","$page","splitA","splitB","raw","splitOn","dropToSplit","drawerOpen","drawer","sidebarElement","isDragging","SIDEBAR_WIDTH_KEY","STORAGE_KEYS","MIN_WIDTH","MAX_WIDTH","sidebarWidth","isResizing","showSidebar","currentTarget","viewing","r","currentSession","watchClientErrors","afterNavigate","nav","reportClient","saved","width","onDestroy","wantAwake","voiceStore","handleVisibility","handleResizeStart","handleResizeMove","handleResizeEnd","newWidth","handleSidebarKey","closeDrawer","diff","$.head","NotificationCoordinator","Toaster","aside","AllSessionsPanel","ScreenshotsPanel","SidebarMeters","main","SplitView","node_12"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,23,24,25,26,27]}