@powerhousedao/connect 6.2.2-dev.76 → 6.2.2-dev.78

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 (88) hide show
  1. package/dist/{AddDriveModal-Bw0YuxZg.js → AddDriveModal-Q-Ffh5XA.js} +4 -4
  2. package/dist/{AddDriveModal-Bw0YuxZg.js.map → AddDriveModal-Q-Ffh5XA.js.map} +1 -1
  3. package/dist/{ClearStorageModal-tXyJ2dGV.js → ClearStorageModal-rKAE3cvA.js} +4 -4
  4. package/dist/{ClearStorageModal-tXyJ2dGV.js.map → ClearStorageModal-rKAE3cvA.js.map} +1 -1
  5. package/dist/{ConfirmDocumentUpgradeModal-9AaaQJTs.js → ConfirmDocumentUpgradeModal-FUOhZsk7.js} +4 -4
  6. package/dist/{ConfirmDocumentUpgradeModal-9AaaQJTs.js.map → ConfirmDocumentUpgradeModal-FUOhZsk7.js.map} +1 -1
  7. package/dist/{CookiesPolicyModal-CQ-zHJdw.js → CookiesPolicyModal-BpyPPyxS.js} +3 -3
  8. package/dist/{CookiesPolicyModal-CQ-zHJdw.js.map → CookiesPolicyModal-BpyPPyxS.js.map} +1 -1
  9. package/dist/{CreateDocumentModal-NNi4p6EI.js → CreateDocumentModal-C45W8J0V.js} +3 -3
  10. package/dist/{CreateDocumentModal-NNi4p6EI.js.map → CreateDocumentModal-C45W8J0V.js.map} +1 -1
  11. package/dist/{DebugSettingsModal-CE3uHISS.js → DebugSettingsModal-f7mphH92.js} +6 -6
  12. package/dist/{DebugSettingsModal-CE3uHISS.js.map → DebugSettingsModal-f7mphH92.js.map} +1 -1
  13. package/dist/{DeleteDriveModal-C7fnXMsR.js → DeleteDriveModal-Dug84t1j.js} +4 -4
  14. package/dist/{DeleteDriveModal-C7fnXMsR.js.map → DeleteDriveModal-Dug84t1j.js.map} +1 -1
  15. package/dist/{DeleteItemModal-BK_Y8Thj.js → DeleteItemModal-mMzy3V8o.js} +4 -4
  16. package/dist/{DeleteItemModal-BK_Y8Thj.js.map → DeleteItemModal-mMzy3V8o.js.map} +1 -1
  17. package/dist/{DisclaimerModal-DJPHCnFY.js → DisclaimerModal-DvpD5dPM.js} +3 -3
  18. package/dist/{DisclaimerModal-DJPHCnFY.js.map → DisclaimerModal-DvpD5dPM.js.map} +1 -1
  19. package/dist/{DocumentVersionUnsupportedModal-tBHLK6b1.js → DocumentVersionUnsupportedModal-C3Q0V75l.js} +3 -3
  20. package/dist/{DocumentVersionUnsupportedModal-tBHLK6b1.js.map → DocumentVersionUnsupportedModal-C3Q0V75l.js.map} +1 -1
  21. package/dist/{DownloadDocumentWithErrorsModal-sWu46HVB.js → DownloadDocumentWithErrorsModal-IKl0ljQb.js} +3 -3
  22. package/dist/{DownloadDocumentWithErrorsModal-sWu46HVB.js.map → DownloadDocumentWithErrorsModal-IKl0ljQb.js.map} +1 -1
  23. package/dist/{DriveAuthRequiredModal-D3IPAst0.js → DriveAuthRequiredModal-Cw9eCAQ_.js} +4 -4
  24. package/dist/{DriveAuthRequiredModal-D3IPAst0.js.map → DriveAuthRequiredModal-Cw9eCAQ_.js.map} +1 -1
  25. package/dist/{DriveSettingsModal-7OKx8foy.js → DriveSettingsModal-C6-mRQiv.js} +3 -3
  26. package/dist/{DriveSettingsModal-7OKx8foy.js.map → DriveSettingsModal-C6-mRQiv.js.map} +1 -1
  27. package/dist/{InspectorModal-BV9QR1MZ.js → InspectorModal-C2usotS-.js} +6 -6
  28. package/dist/{InspectorModal-BV9QR1MZ.js.map → InspectorModal-C2usotS-.js.map} +1 -1
  29. package/dist/{LoginModal-Cd2wGgG4.js → LoginModal-CybbOm3N.js} +4 -4
  30. package/dist/{LoginModal-Cd2wGgG4.js.map → LoginModal-CybbOm3N.js.map} +1 -1
  31. package/dist/{MissingPackageModal-DyP2-Ojb.js → MissingPackageModal-C7usWVHQ.js} +3 -3
  32. package/dist/{MissingPackageModal-DyP2-Ojb.js.map → MissingPackageModal-C7usWVHQ.js.map} +1 -1
  33. package/dist/{OpenFileDocumentsModal-DQ0Slw9y.js → OpenFileDocumentsModal-e_TKIuB4.js} +4 -4
  34. package/dist/{OpenFileDocumentsModal-DQ0Slw9y.js.map → OpenFileDocumentsModal-e_TKIuB4.js.map} +1 -1
  35. package/dist/{SettingsModal-Dk-Kp4kl.js → SettingsModal-DbIlDH70.js} +274 -8
  36. package/dist/SettingsModal-DbIlDH70.js.map +1 -0
  37. package/dist/{UpgradeDriveModal-wo5oO9mg.js → UpgradeDriveModal-_8t9slxQ.js} +3 -3
  38. package/dist/{UpgradeDriveModal-wo5oO9mg.js.map → UpgradeDriveModal-_8t9slxQ.js.map} +1 -1
  39. package/dist/{app-loader-VDeDZD5T.js → app-loader-Cl4p5jBL.js} +302 -408
  40. package/dist/app-loader-Cl4p5jBL.js.map +1 -0
  41. package/dist/app-loader-x1CpaZj-.js +4 -0
  42. package/dist/build-info-BIPBq41n.js +28 -0
  43. package/dist/build-info-BIPBq41n.js.map +1 -0
  44. package/dist/components-DYfZ0Q9B.js +4 -0
  45. package/dist/{connect.config-C-b_Yhd6.js → connect.config-ZWoeCSit.js} +6 -5
  46. package/dist/connect.config-ZWoeCSit.js.map +1 -0
  47. package/dist/{connection-state-KCa1yljA.js → connection-state-CedmAXd-.js} +4 -4
  48. package/dist/{connection-state-KCa1yljA.js.map → connection-state-CedmAXd-.js.map} +1 -1
  49. package/dist/cookie-banner-CTxjAKt4.js +70 -0
  50. package/dist/cookie-banner-CTxjAKt4.js.map +1 -0
  51. package/dist/{reload-connect-toast-DDQEupCN.js → i18n-CWO0vYVd.js} +5 -30
  52. package/dist/i18n-CWO0vYVd.js.map +1 -0
  53. package/dist/load-D_5q8fky.js +131 -0
  54. package/dist/load-D_5q8fky.js.map +1 -0
  55. package/dist/main.js +1 -1
  56. package/dist/{pglite-seed-DRXPe7p-.js → pglite-seed-B7bWZwVg.js} +4 -4
  57. package/dist/{pglite-seed-DRXPe7p-.js.map → pglite-seed-B7bWZwVg.js.map} +1 -1
  58. package/dist/preferences-store-CUBzmf5F.js +104 -0
  59. package/dist/preferences-store-CUBzmf5F.js.map +1 -0
  60. package/dist/{pwa-manifest-link-CG8UajMz.js → pwa-manifest-link-DIgOSo2Q.js} +3 -3
  61. package/dist/{pwa-manifest-link-CG8UajMz.js.map → pwa-manifest-link-DIgOSo2Q.js.map} +1 -1
  62. package/dist/{reactor-Dn5J8dOX.js → reactor-Dp-5PAKA.js} +8 -8
  63. package/dist/{reactor-Dn5J8dOX.js.map → reactor-Dp-5PAKA.js.map} +1 -1
  64. package/dist/{registerServiceWorker-Bn1KWmk0.js → registerServiceWorker-lSZgPKiH.js} +5 -5
  65. package/dist/{registerServiceWorker-Bn1KWmk0.js.map → registerServiceWorker-lSZgPKiH.js.map} +1 -1
  66. package/dist/sentry-QXKgQmr2.js +15 -0
  67. package/dist/sentry-QXKgQmr2.js.map +1 -0
  68. package/dist/start-connect.js +1 -1
  69. package/dist/style.css +143 -0
  70. package/dist/{toast-CO6ChlzE.js → toast-BXIGd4Eb.js} +3 -3
  71. package/dist/{toast-CO6ChlzE.js.map → toast-BXIGd4Eb.js.map} +1 -1
  72. package/dist/{use-renown-login-BtGljnB4.js → use-renown-login-Cf3va6u_.js} +3 -3
  73. package/dist/{use-renown-login-BtGljnB4.js.map → use-renown-login-Cf3va6u_.js.map} +1 -1
  74. package/package.json +12 -11
  75. package/public/powerhouse.config.json +9 -1
  76. package/style.css +1 -0
  77. package/dist/SettingsModal-Dk-Kp4kl.js.map +0 -1
  78. package/dist/app-loader-BffxIMi7.js +0 -4
  79. package/dist/app-loader-VDeDZD5T.js.map +0 -1
  80. package/dist/build-info-B8kMAY35.js +0 -18
  81. package/dist/build-info-B8kMAY35.js.map +0 -1
  82. package/dist/components-jBXd290x.js +0 -5
  83. package/dist/connect.config-C-b_Yhd6.js.map +0 -1
  84. package/dist/load-DUCtfMW3.js +0 -100
  85. package/dist/load-DUCtfMW3.js.map +0 -1
  86. package/dist/package-ZLxXINym.js +0 -132
  87. package/dist/package-ZLxXINym.js.map +0 -1
  88. package/dist/reload-connect-toast-DDQEupCN.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"registerServiceWorker-Bn1KWmk0.js","sources":["../src/utils/registerServiceWorker.ts"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { refreshPwaManifestLink } from \"./pwa-manifest-link.js\";\n\nconst basePath = connectConfig.routerBasename;\n\nconst serviceWorkerScriptPath = [basePath, \"service-worker.js\"]\n .join(\"/\")\n .replace(/\\/{2,}/gm, \"/\");\n\n// External store backing the refresh prompt: our hand-written service worker\n// (injectManifest, registerType: prompt) parks a new worker as \"waiting\" by not\n// calling skipWaiting on install; we flag that here so\n// service-worker-update-prompt.tsx can offer a Refresh instead of reloading\n// from under the user.\nlet updateAvailable = false;\nconst updateListeners = new Set<() => void>();\n\nfunction setUpdateAvailable(value: boolean) {\n if (updateAvailable === value) return;\n updateAvailable = value;\n for (const listener of updateListeners) listener();\n}\n\nexport function subscribeServiceWorkerUpdate(cb: () => void): () => void {\n updateListeners.add(cb);\n return () => {\n updateListeners.delete(cb);\n };\n}\n\nexport function getServiceWorkerUpdateAvailable(): boolean {\n return updateAvailable;\n}\n\nclass ServiceWorkerManager {\n ready = false;\n debug = false;\n registration: ServiceWorkerRegistration | null = null;\n // Only reload on controllerchange when the user actually accepted an update.\n // clientsClaim fires controllerchange on the very first install too, and we\n // must not reload then.\n #updateAccepted = false;\n #reloading = false;\n\n constructor(debug = false) {\n this.debug = debug;\n }\n\n setDebug(debug: boolean) {\n this.debug = debug;\n }\n\n #log(...args: unknown[]) {\n if (this.debug) console.log(\"[ServiceWorker]\", ...args);\n }\n\n // Watch an installing worker; once it reaches \"installed\" while another\n // worker already controls the page, a new version is waiting → prompt.\n #trackInstalling(worker: ServiceWorker | null) {\n if (!worker) return;\n worker.addEventListener(\"statechange\", () => {\n if (worker.state === \"installed\" && navigator.serviceWorker.controller) {\n this.#log(\"New version installed and waiting\");\n setUpdateAvailable(true);\n }\n });\n }\n\n #handleRegistration(registration: ServiceWorkerRegistration) {\n this.registration = registration;\n this.ready = true;\n this.#log(\"registered\", registration);\n\n // A worker installed by a previous page load may already be waiting.\n if (registration.waiting && navigator.serviceWorker.controller) {\n setUpdateAvailable(true);\n }\n\n this.#trackInstalling(registration.installing);\n registration.addEventListener(\"updatefound\", () => {\n this.#trackInstalling(registration.installing);\n });\n }\n\n async #register() {\n try {\n navigator.serviceWorker.addEventListener(\"controllerchange\", () => {\n // First visit: boot fetches the runtime config before this SW controls\n // the page, so it never lands in the cache. Warm it now (clientsClaim\n // just gave us control) so a single online load is enough to go offline.\n this.#warmRuntimeConfigCache();\n // The SW only serves the dynamic manifest.webmanifest once it controls\n // the page. A package installed before that (its fragment already in\n // IndexedDB) was re-consumed against the static base manifest; now that\n // the dynamic route is live, re-attach the link so it picks up the\n // package's PWA config without a manual reload.\n refreshPwaManifestLink();\n // Reload once the worker we activated via applyUpdate() takes control.\n if (!this.#updateAccepted || this.#reloading) return;\n this.#reloading = true;\n window.location.reload();\n });\n\n const existing = await navigator.serviceWorker.getRegistration();\n if (existing) {\n this.#handleRegistration(existing);\n // Force an immediate check so a deploy that happened while the tab was\n // closed surfaces a prompt on the next load.\n await existing.update();\n } else {\n const registration = await navigator.serviceWorker.register(\n serviceWorkerScriptPath,\n );\n this.#handleRegistration(registration);\n }\n\n // Periodically poll for a new version while the tab stays open.\n const intervalId = setInterval(() => {\n void (async () => {\n const reg = await navigator.serviceWorker.getRegistration();\n if (!reg) {\n clearInterval(intervalId);\n return;\n }\n // Skip while a worker is mid-install or the browser is offline —\n // updating then would only fire a doomed network fetch (per the\n // vite-plugin-pwa periodic-update guidance).\n if (reg.installing || !navigator.onLine) return;\n await reg.update();\n })();\n }, connectConfig.appVersionCheckInterval);\n } catch (error) {\n console.error(\"ServiceWorker registration failed: \", error);\n }\n }\n\n registerServiceWorker(debug = false) {\n this.debug = debug;\n\n if (!(\"serviceWorker\" in navigator)) {\n console.warn(\"Service Worker not available\");\n return;\n }\n const start = () => {\n this.#register().catch(console.error);\n };\n // This runs from a React effect, which usually fires *after* the window\n // `load` event has already happened — so adding a load listener would never\n // fire. Register immediately when the page is already loaded; otherwise wait\n // for load to avoid contending with initial page resource fetches.\n if (document.readyState === \"complete\") {\n start();\n } else {\n window.addEventListener(\"load\", start, { once: true });\n }\n }\n\n // Fire-and-forget re-fetch so the controlling SW's NetworkFirst rule caches\n // the config (see controllerchange). The URL MUST match runtime-config.ts's\n // loader (`${import.meta.env.BASE_URL}powerhouse.config.json`) or the cache\n // keys won't line up.\n #warmRuntimeConfigCache() {\n void fetch(`${import.meta.env.BASE_URL}powerhouse.config.json`).catch(\n () => {},\n );\n }\n\n // Activate the waiting worker; the controllerchange handler then reloads.\n applyUpdate() {\n setUpdateAvailable(false);\n const waiting = this.registration?.waiting;\n if (!waiting) {\n // Nothing waiting (or already activated) — reload to pick up whatever\n // the active worker now serves.\n this.#reloading = true;\n window.location.reload();\n return;\n }\n this.#updateAccepted = true;\n waiting.postMessage({ type: \"SKIP_WAITING\" });\n }\n\n sendMessage(message: unknown) {\n const target =\n this.registration?.active ??\n this.registration?.waiting ??\n navigator.serviceWorker.controller;\n target?.postMessage(message);\n }\n\n // Drop any worker controlling this scope — used when offline support is\n // disabled (a disabled build also ships a self-destroying worker).\n async unregisterAll() {\n if (!(\"serviceWorker\" in navigator)) return;\n const registrations = await navigator.serviceWorker.getRegistrations();\n await Promise.all(registrations.map((r) => r.unregister()));\n }\n}\n\nexport const serviceWorkerManager = new ServiceWorkerManager();\n"],"names":["#log","#trackInstalling","#register","#warmRuntimeConfigCache","#updateAccepted","#reloading","#handleRegistration"],"mappings":"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","debug_id":"6228ba39-f39a-580d-836c-d01174316972"}
1
+ {"version":3,"file":"registerServiceWorker-lSZgPKiH.js","sources":["../src/utils/registerServiceWorker.ts"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { refreshPwaManifestLink } from \"./pwa-manifest-link.js\";\n\nconst basePath = connectConfig.routerBasename;\n\nconst serviceWorkerScriptPath = [basePath, \"service-worker.js\"]\n .join(\"/\")\n .replace(/\\/{2,}/gm, \"/\");\n\n// External store backing the refresh prompt: our hand-written service worker\n// (injectManifest, registerType: prompt) parks a new worker as \"waiting\" by not\n// calling skipWaiting on install; we flag that here so\n// service-worker-update-prompt.tsx can offer a Refresh instead of reloading\n// from under the user.\nlet updateAvailable = false;\nconst updateListeners = new Set<() => void>();\n\nfunction setUpdateAvailable(value: boolean) {\n if (updateAvailable === value) return;\n updateAvailable = value;\n for (const listener of updateListeners) listener();\n}\n\nexport function subscribeServiceWorkerUpdate(cb: () => void): () => void {\n updateListeners.add(cb);\n return () => {\n updateListeners.delete(cb);\n };\n}\n\nexport function getServiceWorkerUpdateAvailable(): boolean {\n return updateAvailable;\n}\n\nclass ServiceWorkerManager {\n ready = false;\n debug = false;\n registration: ServiceWorkerRegistration | null = null;\n // Only reload on controllerchange when the user actually accepted an update.\n // clientsClaim fires controllerchange on the very first install too, and we\n // must not reload then.\n #updateAccepted = false;\n #reloading = false;\n\n constructor(debug = false) {\n this.debug = debug;\n }\n\n setDebug(debug: boolean) {\n this.debug = debug;\n }\n\n #log(...args: unknown[]) {\n if (this.debug) console.log(\"[ServiceWorker]\", ...args);\n }\n\n // Watch an installing worker; once it reaches \"installed\" while another\n // worker already controls the page, a new version is waiting → prompt.\n #trackInstalling(worker: ServiceWorker | null) {\n if (!worker) return;\n worker.addEventListener(\"statechange\", () => {\n if (worker.state === \"installed\" && navigator.serviceWorker.controller) {\n this.#log(\"New version installed and waiting\");\n setUpdateAvailable(true);\n }\n });\n }\n\n #handleRegistration(registration: ServiceWorkerRegistration) {\n this.registration = registration;\n this.ready = true;\n this.#log(\"registered\", registration);\n\n // A worker installed by a previous page load may already be waiting.\n if (registration.waiting && navigator.serviceWorker.controller) {\n setUpdateAvailable(true);\n }\n\n this.#trackInstalling(registration.installing);\n registration.addEventListener(\"updatefound\", () => {\n this.#trackInstalling(registration.installing);\n });\n }\n\n async #register() {\n try {\n navigator.serviceWorker.addEventListener(\"controllerchange\", () => {\n // First visit: boot fetches the runtime config before this SW controls\n // the page, so it never lands in the cache. Warm it now (clientsClaim\n // just gave us control) so a single online load is enough to go offline.\n this.#warmRuntimeConfigCache();\n // The SW only serves the dynamic manifest.webmanifest once it controls\n // the page. A package installed before that (its fragment already in\n // IndexedDB) was re-consumed against the static base manifest; now that\n // the dynamic route is live, re-attach the link so it picks up the\n // package's PWA config without a manual reload.\n refreshPwaManifestLink();\n // Reload once the worker we activated via applyUpdate() takes control.\n if (!this.#updateAccepted || this.#reloading) return;\n this.#reloading = true;\n window.location.reload();\n });\n\n const existing = await navigator.serviceWorker.getRegistration();\n if (existing) {\n this.#handleRegistration(existing);\n // Force an immediate check so a deploy that happened while the tab was\n // closed surfaces a prompt on the next load.\n await existing.update();\n } else {\n const registration = await navigator.serviceWorker.register(\n serviceWorkerScriptPath,\n );\n this.#handleRegistration(registration);\n }\n\n // Periodically poll for a new version while the tab stays open.\n const intervalId = setInterval(() => {\n void (async () => {\n const reg = await navigator.serviceWorker.getRegistration();\n if (!reg) {\n clearInterval(intervalId);\n return;\n }\n // Skip while a worker is mid-install or the browser is offline —\n // updating then would only fire a doomed network fetch (per the\n // vite-plugin-pwa periodic-update guidance).\n if (reg.installing || !navigator.onLine) return;\n await reg.update();\n })();\n }, connectConfig.appVersionCheckInterval);\n } catch (error) {\n console.error(\"ServiceWorker registration failed: \", error);\n }\n }\n\n registerServiceWorker(debug = false) {\n this.debug = debug;\n\n if (!(\"serviceWorker\" in navigator)) {\n console.warn(\"Service Worker not available\");\n return;\n }\n const start = () => {\n this.#register().catch(console.error);\n };\n // This runs from a React effect, which usually fires *after* the window\n // `load` event has already happened — so adding a load listener would never\n // fire. Register immediately when the page is already loaded; otherwise wait\n // for load to avoid contending with initial page resource fetches.\n if (document.readyState === \"complete\") {\n start();\n } else {\n window.addEventListener(\"load\", start, { once: true });\n }\n }\n\n // Fire-and-forget re-fetch so the controlling SW's NetworkFirst rule caches\n // the config (see controllerchange). The URL MUST match runtime-config.ts's\n // loader (`${import.meta.env.BASE_URL}powerhouse.config.json`) or the cache\n // keys won't line up.\n #warmRuntimeConfigCache() {\n void fetch(`${import.meta.env.BASE_URL}powerhouse.config.json`).catch(\n () => {},\n );\n }\n\n // Activate the waiting worker; the controllerchange handler then reloads.\n applyUpdate() {\n setUpdateAvailable(false);\n const waiting = this.registration?.waiting;\n if (!waiting) {\n // Nothing waiting (or already activated) — reload to pick up whatever\n // the active worker now serves.\n this.#reloading = true;\n window.location.reload();\n return;\n }\n this.#updateAccepted = true;\n waiting.postMessage({ type: \"SKIP_WAITING\" });\n }\n\n sendMessage(message: unknown) {\n const target =\n this.registration?.active ??\n this.registration?.waiting ??\n navigator.serviceWorker.controller;\n target?.postMessage(message);\n }\n\n // Drop any worker controlling this scope — used when offline support is\n // disabled (a disabled build also ships a self-destroying worker).\n async unregisterAll() {\n if (!(\"serviceWorker\" in navigator)) return;\n const registrations = await navigator.serviceWorker.getRegistrations();\n await Promise.all(registrations.map((r) => r.unregister()));\n }\n}\n\nexport const serviceWorkerManager = new ServiceWorkerManager();\n"],"names":["#log","#trackInstalling","#register","#warmRuntimeConfigCache","#updateAccepted","#reloading","#handleRegistration"],"mappings":"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","debug_id":"c2396c99-5b27-53e6-95a6-3a7f74da7398"}
@@ -0,0 +1,15 @@
1
+ //#region src/services/sentry.ts
2
+
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="6563a098-6466-5831-a4ee-4a1569073e78")}catch(e){}}();
4
+ let sentry;
5
+ function setSentryModule(mod) {
6
+ sentry = mod;
7
+ }
8
+ function setUser(...args) {
9
+ sentry?.setUser(...args);
10
+ }
11
+ //#endregion
12
+ export { setUser as n, setSentryModule as t };
13
+
14
+ //# sourceMappingURL=sentry-QXKgQmr2.js.map
15
+ //# debugId=6563a098-6466-5831-a4ee-4a1569073e78
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry-QXKgQmr2.js","sources":["../src/services/sentry.ts"],"sourcesContent":["// Lazy Sentry accessors: the SDK (and rrweb replay) stays off the boot path\n// until useInitSentry dynamically loads it. No-ops while Sentry is disabled.\nimport type * as SentryModule from \"@sentry/react\";\n\nlet sentry: typeof SentryModule | undefined;\n\nexport function setSentryModule(mod: typeof SentryModule | undefined): void {\n sentry = mod;\n}\n\nexport function captureException(\n ...args: Parameters<typeof SentryModule.captureException>\n): void {\n sentry?.captureException(...args);\n}\n\nexport function setUser(\n ...args: Parameters<typeof SentryModule.setUser>\n): void {\n sentry?.setUser(...args);\n}\n"],"names":[],"mappings":";;;AAIA,IAAI;AAEJ,SAAgB,gBAAgB,KAA4C;AAC1E,UAAS;;AASX,SAAgB,QACd,GAAG,MACG;AACN,SAAQ,QAAQ,GAAG,KAAK","debug_id":"6563a098-6466-5831-a4ee-4a1569073e78"}
@@ -5,7 +5,7 @@ import { createRoot } from "react-dom/client";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region start-connect.tsx
7
7
  await loadRuntimeConfig();
8
- const { AppLoader } = await import("./components-jBXd290x.js");
8
+ const { AppLoader } = await import("./components-DYfZ0Q9B.js");
9
9
  function updateLocalPackage(pkg) {
10
10
  window.ph?.vetraPackageManager?.updateLocalPackage(pkg);
11
11
  }
package/dist/style.css CHANGED
@@ -427,6 +427,9 @@
427
427
  .right-5 {
428
428
  right: calc(var(--spacing) * 5);
429
429
  }
430
+ .right-6 {
431
+ right: calc(var(--spacing) * 6);
432
+ }
430
433
  .right-8 {
431
434
  right: calc(var(--spacing) * 8);
432
435
  }
@@ -442,6 +445,12 @@
442
445
  .bottom-5 {
443
446
  bottom: calc(var(--spacing) * 5);
444
447
  }
448
+ .bottom-6 {
449
+ bottom: calc(var(--spacing) * 6);
450
+ }
451
+ .bottom-24 {
452
+ bottom: calc(var(--spacing) * 24);
453
+ }
445
454
  .bottom-\[-2px\] {
446
455
  bottom: -2px;
447
456
  }
@@ -544,6 +553,9 @@
544
553
  .my-1 {
545
554
  margin-block: calc(var(--spacing) * 1);
546
555
  }
556
+ .my-1\.5 {
557
+ margin-block: calc(var(--spacing) * 1.5);
558
+ }
547
559
  .my-2 {
548
560
  margin-block: calc(var(--spacing) * 2);
549
561
  }
@@ -580,6 +592,9 @@
580
592
  .mt-2 {
581
593
  margin-top: calc(var(--spacing) * 2);
582
594
  }
595
+ .mt-2\.5 {
596
+ margin-top: calc(var(--spacing) * 2.5);
597
+ }
583
598
  .mt-3 {
584
599
  margin-top: calc(var(--spacing) * 3);
585
600
  }
@@ -749,10 +764,18 @@
749
764
  width: calc(var(--spacing) * 8);
750
765
  height: calc(var(--spacing) * 8);
751
766
  }
767
+ .size-9 {
768
+ width: calc(var(--spacing) * 9);
769
+ height: calc(var(--spacing) * 9);
770
+ }
752
771
  .size-10 {
753
772
  width: calc(var(--spacing) * 10);
754
773
  height: calc(var(--spacing) * 10);
755
774
  }
775
+ .size-12 {
776
+ width: calc(var(--spacing) * 12);
777
+ height: calc(var(--spacing) * 12);
778
+ }
756
779
  .size-\[3px\] {
757
780
  width: 3px;
758
781
  height: 3px;
@@ -895,6 +918,12 @@
895
918
  .max-h-6 {
896
919
  max-height: calc(var(--spacing) * 6);
897
920
  }
921
+ .max-h-32 {
922
+ max-height: calc(var(--spacing) * 32);
923
+ }
924
+ .max-h-40 {
925
+ max-height: calc(var(--spacing) * 40);
926
+ }
898
927
  .max-h-48 {
899
928
  max-height: calc(var(--spacing) * 48);
900
929
  }
@@ -922,6 +951,9 @@
922
951
  .max-h-\[calc\(100dvh-14rem\)\] {
923
952
  max-height: calc(100dvh - 14rem);
924
953
  }
954
+ .max-h-\[min\(28rem\,calc\(100vh-8rem\)\)\] {
955
+ max-height: min(28rem, calc(100vh - 8rem));
956
+ }
925
957
  .max-h-full {
926
958
  max-height: 100%;
927
959
  }
@@ -943,6 +975,9 @@
943
975
  .min-h-12 {
944
976
  min-height: calc(var(--spacing) * 12);
945
977
  }
978
+ .min-h-\[2\.5rem\] {
979
+ min-height: 2.5rem;
980
+ }
946
981
  .min-h-\[32px\] {
947
982
  min-height: 32px;
948
983
  }
@@ -1123,6 +1158,9 @@
1123
1158
  .w-\[700px\] {
1124
1159
  width: 700px;
1125
1160
  }
1161
+ .w-\[min\(24rem\,calc\(100vw-3rem\)\)\] {
1162
+ width: min(24rem, calc(100vw - 3rem));
1163
+ }
1126
1164
  .w-fit {
1127
1165
  width: fit-content;
1128
1166
  }
@@ -1153,6 +1191,9 @@
1153
1191
  .max-w-\[80\%\] {
1154
1192
  max-width: 80%;
1155
1193
  }
1194
+ .max-w-\[85\%\] {
1195
+ max-width: 85%;
1196
+ }
1156
1197
  .max-w-\[90vw\] {
1157
1198
  max-width: 90vw;
1158
1199
  }
@@ -1317,6 +1358,9 @@
1317
1358
  .resize-none {
1318
1359
  resize: none;
1319
1360
  }
1361
+ .list-decimal {
1362
+ list-style-type: decimal;
1363
+ }
1320
1364
  .list-disc {
1321
1365
  list-style-type: disc;
1322
1366
  }
@@ -1392,6 +1436,9 @@
1392
1436
  .gap-1 {
1393
1437
  gap: calc(var(--spacing) * 1);
1394
1438
  }
1439
+ .gap-1\.5 {
1440
+ gap: calc(var(--spacing) * 1.5);
1441
+ }
1395
1442
  .gap-2 {
1396
1443
  gap: calc(var(--spacing) * 2);
1397
1444
  }
@@ -1413,6 +1460,13 @@
1413
1460
  .gap-\[-2px\] {
1414
1461
  gap: -2px;
1415
1462
  }
1463
+ .space-y-0\.5 {
1464
+ :where(& > :not(:last-child)) {
1465
+ --tw-space-y-reverse: 0;
1466
+ margin-block-start: calc(calc(var(--spacing) * 0.5) * var(--tw-space-y-reverse));
1467
+ margin-block-end: calc(calc(var(--spacing) * 0.5) * calc(1 - var(--tw-space-y-reverse)));
1468
+ }
1469
+ }
1416
1470
  .space-y-1 {
1417
1471
  :where(& > :not(:last-child)) {
1418
1472
  --tw-space-y-reverse: 0;
@@ -1427,6 +1481,20 @@
1427
1481
  margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));
1428
1482
  }
1429
1483
  }
1484
+ .space-y-3 {
1485
+ :where(& > :not(:last-child)) {
1486
+ --tw-space-y-reverse: 0;
1487
+ margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));
1488
+ margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));
1489
+ }
1490
+ }
1491
+ .space-y-4 {
1492
+ :where(& > :not(:last-child)) {
1493
+ --tw-space-y-reverse: 0;
1494
+ margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));
1495
+ margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));
1496
+ }
1497
+ }
1430
1498
  .space-y-6 {
1431
1499
  :where(& > :not(:last-child)) {
1432
1500
  --tw-space-y-reverse: 0;
@@ -1625,6 +1693,10 @@
1625
1693
  border-left-style: var(--tw-border-style);
1626
1694
  border-left-width: 1px;
1627
1695
  }
1696
+ .border-l-2 {
1697
+ border-left-style: var(--tw-border-style);
1698
+ border-left-width: 2px;
1699
+ }
1628
1700
  .border-dashed {
1629
1701
  --tw-border-style: dashed;
1630
1702
  border-style: dashed;
@@ -1643,6 +1715,12 @@
1643
1715
  .border-destructive {
1644
1716
  border-color: var(--destructive);
1645
1717
  }
1718
+ .border-destructive\/40 {
1719
+ border-color: var(--destructive);
1720
+ @supports (color: color-mix(in lab, red, red)) {
1721
+ border-color: color-mix(in oklab, var(--destructive) 40%, transparent);
1722
+ }
1723
+ }
1646
1724
  .border-foreground {
1647
1725
  border-color: var(--foreground);
1648
1726
  }
@@ -1724,6 +1802,12 @@
1724
1802
  background-color: color-mix(in oklab, var(--muted-foreground) 20%, transparent);
1725
1803
  }
1726
1804
  }
1805
+ .bg-muted\/40 {
1806
+ background-color: var(--muted);
1807
+ @supports (color: color-mix(in lab, red, red)) {
1808
+ background-color: color-mix(in oklab, var(--muted) 40%, transparent);
1809
+ }
1810
+ }
1727
1811
  .bg-popover {
1728
1812
  background-color: var(--popover);
1729
1813
  }
@@ -1796,6 +1880,9 @@
1796
1880
  .p-2 {
1797
1881
  padding: calc(var(--spacing) * 2);
1798
1882
  }
1883
+ .p-2\.5 {
1884
+ padding: calc(var(--spacing) * 2.5);
1885
+ }
1799
1886
  .p-3 {
1800
1887
  padding: calc(var(--spacing) * 3);
1801
1888
  }
@@ -1979,12 +2066,18 @@
1979
2066
  .pl-2 {
1980
2067
  padding-left: calc(var(--spacing) * 2);
1981
2068
  }
2069
+ .pl-2\.5 {
2070
+ padding-left: calc(var(--spacing) * 2.5);
2071
+ }
1982
2072
  .pl-3 {
1983
2073
  padding-left: calc(var(--spacing) * 3);
1984
2074
  }
1985
2075
  .pl-4 {
1986
2076
  padding-left: calc(var(--spacing) * 4);
1987
2077
  }
2078
+ .pl-5 {
2079
+ padding-left: calc(var(--spacing) * 5);
2080
+ }
1988
2081
  .pl-6 {
1989
2082
  padding-left: calc(var(--spacing) * 6);
1990
2083
  }
@@ -2012,6 +2105,9 @@
2012
2105
  .indent-\[-1ch\] {
2013
2106
  text-indent: -1ch;
2014
2107
  }
2108
+ .align-top {
2109
+ vertical-align: top;
2110
+ }
2015
2111
  .font-mono {
2016
2112
  font-family: var(--font-mono);
2017
2113
  }
@@ -2082,6 +2178,9 @@
2082
2178
  font-size: var(--text-xs);
2083
2179
  line-height: calc(var(--spacing) * 5);
2084
2180
  }
2181
+ .text-\[0\.8125rem\] {
2182
+ font-size: 0.8125rem;
2183
+ }
2085
2184
  .text-\[10px\] {
2086
2185
  font-size: 10px;
2087
2186
  }
@@ -2105,6 +2204,10 @@
2105
2204
  --tw-leading: 1;
2106
2205
  line-height: 1;
2107
2206
  }
2207
+ .leading-relaxed {
2208
+ --tw-leading: var(--leading-relaxed);
2209
+ line-height: var(--leading-relaxed);
2210
+ }
2108
2211
  .font-bold {
2109
2212
  --tw-font-weight: var(--font-weight-bold);
2110
2213
  font-weight: var(--font-weight-bold);
@@ -2153,6 +2256,9 @@
2153
2256
  .whitespace-nowrap {
2154
2257
  white-space: nowrap;
2155
2258
  }
2259
+ .whitespace-pre-wrap {
2260
+ white-space: pre-wrap;
2261
+ }
2156
2262
  .text-background {
2157
2263
  color: var(--background);
2158
2264
  }
@@ -2881,6 +2987,11 @@
2881
2987
  }
2882
2988
  }
2883
2989
  }
2990
+ .first\:mt-0 {
2991
+ &:first-child {
2992
+ margin-top: calc(var(--spacing) * 0);
2993
+ }
2994
+ }
2884
2995
  .first\:group-first\/sidebar-item-wrapper\:after\:hidden {
2885
2996
  &:first-child {
2886
2997
  &:is(:where(.group\/sidebar-item-wrapper):first-child *) {
@@ -2891,6 +3002,11 @@
2891
3002
  }
2892
3003
  }
2893
3004
  }
3005
+ .last\:mb-0 {
3006
+ &:last-child {
3007
+ margin-bottom: calc(var(--spacing) * 0);
3008
+ }
3009
+ }
2894
3010
  .odd\:bg-card {
2895
3011
  &:nth-child(odd) {
2896
3012
  background-color: var(--card);
@@ -2943,6 +3059,16 @@
2943
3059
  background-color: var(--accent);
2944
3060
  }
2945
3061
  }
3062
+ .hover\:scale-105 {
3063
+ &:hover {
3064
+ @media (hover: hover) {
3065
+ --tw-scale-x: 105%;
3066
+ --tw-scale-y: 105%;
3067
+ --tw-scale-z: 105%;
3068
+ scale: var(--tw-scale-x) var(--tw-scale-y);
3069
+ }
3070
+ }
3071
+ }
2946
3072
  .hover\:hover-effect {
2947
3073
  &:hover {
2948
3074
  @media (hover: hover) {
@@ -2994,6 +3120,16 @@
2994
3120
  }
2995
3121
  }
2996
3122
  }
3123
+ .hover\:bg-primary\/90 {
3124
+ &:hover {
3125
+ @media (hover: hover) {
3126
+ background-color: var(--primary);
3127
+ @supports (color: color-mix(in lab, red, red)) {
3128
+ background-color: color-mix(in oklab, var(--primary) 90%, transparent);
3129
+ }
3130
+ }
3131
+ }
3132
+ }
2997
3133
  .hover\:pr-6 {
2998
3134
  &:hover {
2999
3135
  @media (hover: hover) {
@@ -3008,6 +3144,13 @@
3008
3144
  }
3009
3145
  }
3010
3146
  }
3147
+ .hover\:text-foreground {
3148
+ &:hover {
3149
+ @media (hover: hover) {
3150
+ color: var(--foreground);
3151
+ }
3152
+ }
3153
+ }
3011
3154
  .hover\:text-muted-foreground {
3012
3155
  &:hover {
3013
3156
  @media (hover: hover) {
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="d22e5acd-014d-560f-a589-64e7fe7b7685")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="299f02e1-bb03-5d49-87ef-cdb65f5cff79")}catch(e){}}();
3
3
  import { createElement } from "react";
4
4
  import { ToastContainer, dismiss, toast } from "@powerhousedao/design-system/connect/toast";
5
5
  //#region src/services/toast.ts
@@ -22,5 +22,5 @@ function dismissToast(toastId) {
22
22
  //#endregion
23
23
  export { dismissToast as n, toast$1 as r, ToastContainer$1 as t };
24
24
 
25
- //# sourceMappingURL=toast-CO6ChlzE.js.map
26
- //# debugId=d22e5acd-014d-560f-a589-64e7fe7b7685
25
+ //# sourceMappingURL=toast-BXIGd4Eb.js.map
26
+ //# debugId=299f02e1-bb03-5d49-87ef-cdb65f5cff79
@@ -1 +1 @@
1
- {"version":3,"file":"toast-CO6ChlzE.js","sources":["../src/services/toast.ts"],"sourcesContent":["import type { ConnectToastOptions } from \"@powerhousedao/design-system/connect/toast\";\nimport {\n ToastContainer as BaseToastContainer,\n dismiss as baseDismiss,\n toast as baseToast,\n} from \"@powerhousedao/design-system/connect/toast\";\nimport { createElement, type ComponentProps } from \"react\";\n\nexport const CONNECT_TOAST_CONTAINER_ID = \"connect\";\n\ntype BaseToastContainerProps = ComponentProps<typeof BaseToastContainer>;\n\nexport const ToastContainer = (\n props: Omit<BaseToastContainerProps, \"containerId\"> = {},\n) =>\n createElement(BaseToastContainer, {\n containerId: CONNECT_TOAST_CONTAINER_ID,\n ...props,\n });\n\ntype ToastArgs = Parameters<typeof baseToast>;\nexport function toast(content: ToastArgs[0], options?: ConnectToastOptions) {\n const {\n type = \"default\",\n containerId = CONNECT_TOAST_CONTAINER_ID,\n ...restOptions\n } = options || {};\n return baseToast(content, { type, containerId, ...restOptions });\n}\n\nexport function dismissToast(toastId: string | number) {\n return baseDismiss(toastId);\n}\n"],"names":["ToastContainer","BaseToastContainer","toast","baseToast","baseDismiss"],"mappings":";;;;;AAQA,MAAa,6BAA6B;AAI1C,MAAaA,oBACX,QAAsD,EAAE,KAExD,cAAcC,gBAAoB;CAChC,aAAa;CACb,GAAG;CACJ,CAAC;AAGJ,SAAgBC,QAAM,SAAuB,SAA+B;CAC1E,MAAM,EACJ,OAAO,WACP,cAAc,4BACd,GAAG,gBACD,WAAW,EAAE;AACjB,QAAOC,MAAU,SAAS;EAAE;EAAM;EAAa,GAAG;EAAa,CAAC;;AAGlE,SAAgB,aAAa,SAA0B;AACrD,QAAOC,QAAY,QAAQ","debug_id":"d22e5acd-014d-560f-a589-64e7fe7b7685"}
1
+ {"version":3,"file":"toast-BXIGd4Eb.js","sources":["../src/services/toast.ts"],"sourcesContent":["import type { ConnectToastOptions } from \"@powerhousedao/design-system/connect/toast\";\nimport {\n ToastContainer as BaseToastContainer,\n dismiss as baseDismiss,\n toast as baseToast,\n} from \"@powerhousedao/design-system/connect/toast\";\nimport { createElement, type ComponentProps } from \"react\";\n\nexport const CONNECT_TOAST_CONTAINER_ID = \"connect\";\n\ntype BaseToastContainerProps = ComponentProps<typeof BaseToastContainer>;\n\nexport const ToastContainer = (\n props: Omit<BaseToastContainerProps, \"containerId\"> = {},\n) =>\n createElement(BaseToastContainer, {\n containerId: CONNECT_TOAST_CONTAINER_ID,\n ...props,\n });\n\ntype ToastArgs = Parameters<typeof baseToast>;\nexport function toast(content: ToastArgs[0], options?: ConnectToastOptions) {\n const {\n type = \"default\",\n containerId = CONNECT_TOAST_CONTAINER_ID,\n ...restOptions\n } = options || {};\n return baseToast(content, { type, containerId, ...restOptions });\n}\n\nexport function dismissToast(toastId: string | number) {\n return baseDismiss(toastId);\n}\n"],"names":["ToastContainer","BaseToastContainer","toast","baseToast","baseDismiss"],"mappings":";;;;;AAQA,MAAa,6BAA6B;AAI1C,MAAaA,oBACX,QAAsD,EAAE,KAExD,cAAcC,gBAAoB;CAChC,aAAa;CACb,GAAG;CACJ,CAAC;AAGJ,SAAgBC,QAAM,SAAuB,SAA+B;CAC1E,MAAM,EACJ,OAAO,WACP,cAAc,4BACd,GAAG,gBACD,WAAW,EAAE;AACjB,QAAOC,MAAU,SAAS;EAAE;EAAM;EAAa,GAAG;EAAa,CAAC;;AAGlE,SAAgB,aAAa,SAA0B;AACrD,QAAOC,QAAY,QAAQ","debug_id":"299f02e1-bb03-5d49-87ef-cdb65f5cff79"}
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a9c447f4-bb72-553a-9b6f-82cb39a7bd7e")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="332dac71-8640-5e21-bc4a-cc92ffcf31f8")}catch(e){}}();
3
3
  import { useCallback, useMemo } from "react";
4
4
  import { openRenown, showPHModal, useRenownAuth, useRenownLoginMethods } from "@powerhousedao/reactor-browser";
5
5
  //#region src/hooks/use-renown-login.ts
@@ -48,5 +48,5 @@ function useRenownLoginProps() {
48
48
  //#endregion
49
49
  export { useRenownLoginProps as n, useOpenRenownLogin as t };
50
50
 
51
- //# sourceMappingURL=use-renown-login-BtGljnB4.js.map
52
- //# debugId=a9c447f4-bb72-553a-9b6f-82cb39a7bd7e
51
+ //# sourceMappingURL=use-renown-login-Cf3va6u_.js.map
52
+ //# debugId=332dac71-8640-5e21-bc4a-cc92ffcf31f8
@@ -1 +1 @@
1
- {"version":3,"file":"use-renown-login-BtGljnB4.js","sources":["../src/hooks/use-renown-login.ts"],"sourcesContent":["import type { RenownLoginOption } from \"@powerhousedao/design-system/connect\";\nimport {\n openRenown,\n showPHModal,\n useRenownAuth,\n useRenownLoginMethods,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\n// Opens the in-page login modal when wallet adapters are configured; otherwise\n// redirects straight to the Renown portal (no modal with only a redirect button).\nexport function useOpenRenownLogin(): () => void {\n const methods = useRenownLoginMethods();\n return useCallback(() => {\n if (methods.length > 0) {\n showPHModal({ type: \"login\" });\n } else {\n openRenown();\n }\n }, [methods]);\n}\n\nexport interface RenownLoginProps {\n onLogin: () => void;\n // One option per configured login method (wallet, Google, email, …). Empty\n // only when no adapters are configured (the redirect Connect button is used).\n methods: RenownLoginOption[];\n loading: boolean;\n error: string | null;\n}\n\nconst LAST_METHOD_KEY = \"renown:last-login-method\";\n\nfunction getLastLoginMethod(): string | null {\n try {\n return localStorage.getItem(LAST_METHOD_KEY);\n } catch {\n return null;\n }\n}\n\nfunction setLastLoginMethod(method: string): void {\n try {\n localStorage.setItem(LAST_METHOD_KEY, method);\n } catch {\n // localStorage unavailable (private mode / SSR) — the badge is optional.\n }\n}\n\n// Single source of the login wiring shared by every Connect CTA: in-page\n// sign-in (with redirect fallback) plus pending/error feedback.\nexport function useRenownLoginProps(): RenownLoginProps {\n const { login, pending, error } = useRenownAuth();\n const onLogin = useCallback(() => login(), [login]);\n\n // Method list (labels) comes from the shared primitive; Connect adds the\n // last-used badge + the onSelect wiring for its design-system card.\n const baseMethods = useRenownLoginMethods();\n\n const methods = useMemo<RenownLoginOption[]>(() => {\n const lastUsed = getLastLoginMethod();\n return baseMethods.map((method) => ({\n id: method.id,\n label: method.label,\n lastUsed: lastUsed === method.id,\n onSelect: () => {\n setLastLoginMethod(method.id);\n login(undefined, method.id);\n },\n }));\n }, [baseMethods, login]);\n\n return { onLogin, methods, loading: pending, error: error?.message ?? null };\n}\n"],"names":[],"mappings":";;;;;AAWA,SAAgB,qBAAiC;CAC/C,MAAM,UAAU,uBAAuB;AACvC,QAAO,kBAAkB;AACvB,MAAI,QAAQ,SAAS,EACnB,aAAY,EAAE,MAAM,SAAS,CAAC;MAE9B,aAAY;IAEb,CAAC,QAAQ,CAAC;;AAYf,MAAM,kBAAkB;AAExB,SAAS,qBAAoC;AAC3C,KAAI;AACF,SAAO,aAAa,QAAQ,gBAAgB;SACtC;AACN,SAAO;;;AAIX,SAAS,mBAAmB,QAAsB;AAChD,KAAI;AACF,eAAa,QAAQ,iBAAiB,OAAO;SACvC;;AAOV,SAAgB,sBAAwC;CACtD,MAAM,EAAE,OAAO,SAAS,UAAU,eAAe;CACjD,MAAM,UAAU,kBAAkB,OAAO,EAAE,CAAC,MAAM,CAAC;CAInD,MAAM,cAAc,uBAAuB;AAe3C,QAAO;EAAE;EAAS,SAbF,cAAmC;GACjD,MAAM,WAAW,oBAAoB;AACrC,UAAO,YAAY,KAAK,YAAY;IAClC,IAAI,OAAO;IACX,OAAO,OAAO;IACd,UAAU,aAAa,OAAO;IAC9B,gBAAgB;AACd,wBAAmB,OAAO,GAAG;AAC7B,WAAM,KAAA,GAAW,OAAO,GAAG;;IAE9B,EAAE;KACF,CAAC,aAAa,MAAM,CAAC;EAEG,SAAS;EAAS,OAAO,OAAO,WAAW;EAAM","debug_id":"a9c447f4-bb72-553a-9b6f-82cb39a7bd7e"}
1
+ {"version":3,"file":"use-renown-login-Cf3va6u_.js","sources":["../src/hooks/use-renown-login.ts"],"sourcesContent":["import type { RenownLoginOption } from \"@powerhousedao/design-system/connect\";\nimport {\n openRenown,\n showPHModal,\n useRenownAuth,\n useRenownLoginMethods,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\n// Opens the in-page login modal when wallet adapters are configured; otherwise\n// redirects straight to the Renown portal (no modal with only a redirect button).\nexport function useOpenRenownLogin(): () => void {\n const methods = useRenownLoginMethods();\n return useCallback(() => {\n if (methods.length > 0) {\n showPHModal({ type: \"login\" });\n } else {\n openRenown();\n }\n }, [methods]);\n}\n\nexport interface RenownLoginProps {\n onLogin: () => void;\n // One option per configured login method (wallet, Google, email, …). Empty\n // only when no adapters are configured (the redirect Connect button is used).\n methods: RenownLoginOption[];\n loading: boolean;\n error: string | null;\n}\n\nconst LAST_METHOD_KEY = \"renown:last-login-method\";\n\nfunction getLastLoginMethod(): string | null {\n try {\n return localStorage.getItem(LAST_METHOD_KEY);\n } catch {\n return null;\n }\n}\n\nfunction setLastLoginMethod(method: string): void {\n try {\n localStorage.setItem(LAST_METHOD_KEY, method);\n } catch {\n // localStorage unavailable (private mode / SSR) — the badge is optional.\n }\n}\n\n// Single source of the login wiring shared by every Connect CTA: in-page\n// sign-in (with redirect fallback) plus pending/error feedback.\nexport function useRenownLoginProps(): RenownLoginProps {\n const { login, pending, error } = useRenownAuth();\n const onLogin = useCallback(() => login(), [login]);\n\n // Method list (labels) comes from the shared primitive; Connect adds the\n // last-used badge + the onSelect wiring for its design-system card.\n const baseMethods = useRenownLoginMethods();\n\n const methods = useMemo<RenownLoginOption[]>(() => {\n const lastUsed = getLastLoginMethod();\n return baseMethods.map((method) => ({\n id: method.id,\n label: method.label,\n lastUsed: lastUsed === method.id,\n onSelect: () => {\n setLastLoginMethod(method.id);\n login(undefined, method.id);\n },\n }));\n }, [baseMethods, login]);\n\n return { onLogin, methods, loading: pending, error: error?.message ?? null };\n}\n"],"names":[],"mappings":";;;;;AAWA,SAAgB,qBAAiC;CAC/C,MAAM,UAAU,uBAAuB;AACvC,QAAO,kBAAkB;AACvB,MAAI,QAAQ,SAAS,EACnB,aAAY,EAAE,MAAM,SAAS,CAAC;MAE9B,aAAY;IAEb,CAAC,QAAQ,CAAC;;AAYf,MAAM,kBAAkB;AAExB,SAAS,qBAAoC;AAC3C,KAAI;AACF,SAAO,aAAa,QAAQ,gBAAgB;SACtC;AACN,SAAO;;;AAIX,SAAS,mBAAmB,QAAsB;AAChD,KAAI;AACF,eAAa,QAAQ,iBAAiB,OAAO;SACvC;;AAOV,SAAgB,sBAAwC;CACtD,MAAM,EAAE,OAAO,SAAS,UAAU,eAAe;CACjD,MAAM,UAAU,kBAAkB,OAAO,EAAE,CAAC,MAAM,CAAC;CAInD,MAAM,cAAc,uBAAuB;AAe3C,QAAO;EAAE;EAAS,SAbF,cAAmC;GACjD,MAAM,WAAW,oBAAoB;AACrC,UAAO,YAAY,KAAK,YAAY;IAClC,IAAI,OAAO;IACX,OAAO,OAAO;IACd,UAAU,aAAa,OAAO;IAC9B,gBAAgB;AACd,wBAAmB,OAAO,GAAG;AAC7B,WAAM,KAAA,GAAW,OAAO,GAAG;;IAE9B,EAAE;KACF,CAAC,aAAa,MAAM,CAAC;EAEG,SAAS;EAAS,OAAO,OAAO,WAAW;EAAM","debug_id":"332dac71-8640-5e21-bc4a-cc92ffcf31f8"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@powerhousedao/connect",
3
3
  "productName": "Powerhouse-Connect",
4
- "version": "6.2.2-dev.76",
4
+ "version": "6.2.2-dev.78",
5
5
  "description": "Powerhouse Connect",
6
6
  "main": "dist/index.html",
7
7
  "type": "module",
@@ -55,21 +55,22 @@
55
55
  "@openfeature/core": "1.9.1",
56
56
  "@openfeature/web-sdk": "1.6.2",
57
57
  "@openpanel/web": "^1.4.1",
58
- "@powerhousedao/config": "6.2.2-dev.76",
59
- "@powerhousedao/design-system": "6.2.2-dev.76",
58
+ "@powerhousedao/config": "6.2.2-dev.78",
59
+ "@powerhousedao/design-system": "6.2.2-dev.78",
60
60
  "@powerhousedao/document-engineering": "1.40.5",
61
- "@powerhousedao/powerhouse-vetra-packages": "6.2.2-dev.76",
62
- "@powerhousedao/reactor": "6.2.2-dev.76",
63
- "@powerhousedao/reactor-attachments": "6.2.2-dev.76",
64
- "@powerhousedao/reactor-browser": "6.2.2-dev.76",
65
- "@powerhousedao/shared": "6.2.2-dev.76",
66
- "@powerhousedao/vetra": "6.2.2-dev.76",
61
+ "@powerhousedao/powerhouse-vetra-packages": "6.2.2-dev.78",
62
+ "@powerhousedao/reactor": "6.2.2-dev.78",
63
+ "@powerhousedao/reactor-attachments": "6.2.2-dev.78",
64
+ "@powerhousedao/reactor-browser": "6.2.2-dev.78",
65
+ "@powerhousedao/reactor-mcp": "6.2.2-dev.78",
66
+ "@powerhousedao/shared": "6.2.2-dev.78",
67
+ "@powerhousedao/vetra": "6.2.2-dev.78",
67
68
  "@privy-io/react-auth": "3.35.0",
68
69
  "@rainbow-me/rainbowkit": "^2.2.11",
69
- "@renown/sdk": "6.2.2-dev.76",
70
+ "@renown/sdk": "6.2.2-dev.78",
70
71
  "@sentry/react": "^10.17.0",
71
72
  "@tanstack/react-query": "^5.90.2",
72
- "document-model": "6.2.2-dev.76",
73
+ "document-model": "6.2.2-dev.78",
73
74
  "i18next": "^25.5.3",
74
75
  "kysely": "0.28.16",
75
76
  "kysely-pglite-dialect": "1.2.0",
@@ -10,7 +10,12 @@
10
10
  },
11
11
  "drives": {
12
12
  "allowAddDrive": true,
13
- "defaultDrives": [],
13
+ "defaultDrives": [
14
+ {
15
+ "url": "https://flank.tail45cd22.ts.net/d/powerhouse",
16
+ "name": "Demo switchboard"
17
+ }
18
+ ],
14
19
  "sections": {
15
20
  "remote": {
16
21
  "enabled": true,
@@ -28,6 +33,9 @@
28
33
  "url": "https://www.renown.id",
29
34
  "networkId": "eip155",
30
35
  "chainId": 1
36
+ },
37
+ "ai": {
38
+ "assistantEnabled": true
31
39
  }
32
40
  }
33
41
  }
package/style.css CHANGED
@@ -16,6 +16,7 @@
16
16
  their classes are included in the compiled output. Tailwind does not scan
17
17
  node_modules by default, so each workspace package needs an explicit @source. */
18
18
  @source "../../packages/design-system/src/**/*.{tsx,ts}";
19
+ @source "../../packages/reactor-browser/src/ai/**/*.{tsx,ts}";
19
20
  @source "../../packages/powerhouse-vetra-packages/**/*.{tsx,ts}";
20
21
  @source "../../packages/vetra/**/*.{tsx,ts}";
21
22
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"SettingsModal-Dk-Kp4kl.js","sources":["../src/components/modal/modals/settings/about.tsx","../src/components/modal/modals/settings/danger-zone.tsx","../src/components/modal/modals/settings/default-editor.tsx","../src/components/modal/modals/settings/package-manager.tsx","../src/components/modal/modals/SettingsModal.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport {\n getGitSha,\n getGitUrl,\n packageJson,\n shortGitSha,\n} from \"@powerhousedao/connect/utils\";\nimport { Icon } from \"@powerhousedao/design-system\";\nimport { About as BaseAbout } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n DriveCollectionId,\n showPHModal,\n useDrives,\n useDriveSystemInfo,\n useSyncList,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport { useMemo } from \"react\";\n\nexport const About: React.FC = () => {\n const onOpenInspector = () => {\n closePHModal();\n showPHModal({ type: \"inspector\" });\n };\n\n return (\n <div>\n <BaseAbout\n packageJson={packageJson}\n phCliVersion={\n typeof connectConfig.phCliVersion === \"string\"\n ? connectConfig.phCliVersion\n : undefined\n }\n />\n <AppGitHash />\n <ConnectedDrives />\n <div className=\"bg-background p-3\">\n <h2 className=\"mb-2 font-semibold text-foreground\">Inspector</h2>\n <p className=\"mb-3 text-sm font-normal text-foreground\">\n Explore the local database and sync state for debugging.\n </p>\n <button\n className=\"flex items-center gap-x-2 rounded-md border border-border bg-transparent px-3 py-1 text-sm font-medium text-foreground transition-colors hover:hover-effect\"\n onClick={onOpenInspector}\n type=\"button\"\n >\n Open Inspector <Icon name=\"CircleInfo\" size={16} />\n </button>\n </div>\n </div>\n );\n};\n\nfunction AppGitHash() {\n const sha = getGitSha();\n if (sha === \"unknown\") return null;\n const url = getGitUrl();\n const label = shortGitSha(sha);\n return (\n <div className=\"bg-background p-3 text-sm\">\n <span className=\"font-semibold\">Git hash: </span>\n {url ? (\n <a\n className=\"font-mono underline\"\n href={url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n title={sha}\n >\n {label}\n </a>\n ) : (\n <span className=\"font-mono\" title={sha}>\n {label}\n </span>\n )}\n </div>\n );\n}\n\nfunction ConnectedDrives() {\n const drives = useDrives() ?? [];\n const remotes = useSyncList();\n\n const remoteDrives = useMemo(\n () =>\n drives.filter((d) =>\n remotes.some((r) =>\n r.meta.collectionId.equals(DriveCollectionId.forDrive(d.header.id)),\n ),\n ),\n [drives, remotes],\n );\n\n return (\n <div className=\"my-4 bg-background p-3\">\n <h2 className=\"mb-2 font-semibold text-foreground\">Connected drives</h2>\n {remoteDrives.length === 0 ? (\n <p className=\"text-sm font-normal text-foreground\">\n No connected remote drives.\n </p>\n ) : (\n <ul className=\"flex flex-col gap-3\">\n {remoteDrives.map((drive) => (\n <DriveAboutEntry key={drive.header.id} drive={drive} />\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nfunction DriveAboutEntry({ drive }: { drive: DocumentDriveDocument }) {\n const info = useDriveSystemInfo(drive);\n const name = drive.state.global.name || drive.header.name;\n\n return (\n <li className=\"text-sm text-foreground\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"font-medium\">{name}</span>\n {info.status === \"ready\" && (\n <span className=\"text-xs text-muted-foreground\">{info.host}</span>\n )}\n </div>\n {info.status === \"loading\" && (\n <div className=\"mt-1 text-xs text-muted-foreground\">Loading…</div>\n )}\n {info.status === \"error\" && (\n <div className=\"mt-1 text-xs text-destructive\">\n Could not load system info\n </div>\n )}\n {info.status === \"ready\" && (\n <div className=\"mt-1 text-xs text-foreground\">\n <div>\n <span className=\"font-medium\">Version:</span> {info.version}\n </div>\n <div>\n <span className=\"font-medium\">Git hash: </span>\n {info.gitUrl ? (\n <a\n className=\"font-mono hover:underline\"\n href={info.gitUrl}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n title={info.gitHash}\n >\n {shortGitSha(info.gitHash)}\n </a>\n ) : (\n <span className=\"font-mono\" title={info.gitHash}>\n {shortGitSha(info.gitHash)}\n </span>\n )}\n </div>\n </div>\n )}\n {info.status === \"local\" && (\n <div className=\"mt-1 text-xs text-muted-foreground\">\n Local drive — N/A\n </div>\n )}\n </li>\n );\n}\n","import { DangerZone as BaseDangerZone } from \"@powerhousedao/design-system/connect\";\nimport {\n deleteDrive,\n setSelectedDrive,\n showPHModal,\n useDrives,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\n\nexport const DangerZone: React.FC = () => {\n const drives = useDrives();\n\n const handleDeleteDrive = async (drive: DocumentDriveDocument) => {\n await deleteDrive(drive.header.id);\n setSelectedDrive(undefined);\n };\n\n const handleClearStorage = () => {\n showPHModal({ type: \"clearStorage\" });\n };\n\n return (\n <BaseDangerZone\n drives={drives ?? []}\n onDeleteDrive={(drive) => {\n void handleDeleteDrive(drive);\n }}\n onClearStorage={handleClearStorage}\n />\n );\n};\n","import { DefaultEditor as BaseDefaultEditor } from \"@powerhousedao/design-system/connect\";\nimport { useCallback, useState } from \"react\";\n\nconst documentModelEditorOptions = [\n { label: \"V1\", value: \"document-model-editor\" },\n { label: \"V2\", value: \"document-model-editor-v2\" },\n] as const;\n\nexport const DefaultEditor: React.FC = () => {\n const [documentModelEditor, setDocumentModelEditor] = useState<\n (typeof documentModelEditorOptions)[number]\n >(documentModelEditorOptions[1]);\n\n const handleSetDocumentEditor = useCallback((value: string) => {\n const option = documentModelEditorOptions.find((dm) => dm.value == value);\n if (option) {\n setDocumentModelEditor(option);\n }\n }, []);\n\n return (\n <BaseDefaultEditor\n documentModelEditor={documentModelEditor.value}\n setDocumentModelEditor={handleSetDocumentEditor}\n documentModelEditorOptions={\n documentModelEditorOptions as unknown as {\n value: string;\n label: string;\n }[]\n }\n />\n );\n};\n","import { useRegistryPackages } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { PackageManager } from \"@powerhousedao/design-system/connect\";\nimport { useVetraPackageManager } from \"@powerhousedao/reactor-browser\";\nimport React from \"react\";\n\n/**\n * Split a `name@tag` spec into its bare package name. Mirrors the design-system's\n * `parsePackageSpec` — duplicated here to avoid reaching into a deep subpath\n * export. Scoped names split on the LAST `@`, unscoped on the first.\n */\nfunction parseBareName(spec: string): string {\n const trimmed = spec.trim();\n const at = trimmed.startsWith(\"@\")\n ? trimmed.lastIndexOf(\"@\")\n : trimmed.indexOf(\"@\");\n return at > 0 ? trimmed.slice(0, at) : trimmed;\n}\n\nexport const ConnectPackageManager: React.FC = () => {\n const packageManager = useVetraPackageManager();\n const {\n registryPackageList,\n installedPackages,\n availablePackages,\n availableHasMore,\n isLoadingAvailable,\n isLoadingMoreAvailable,\n availableError,\n ensureAvailableLoaded,\n fetchAvailablePage,\n loadMoreAvailable,\n setAvailableSearch,\n updateRegistryPackageStatus,\n registerFallbackRegistryPackage,\n } = useRegistryPackages();\n\n async function handleInstall(packageSpec: string) {\n if (!packageManager) return;\n\n // The spec may include an explicit `@tag` / `@version` suffix from the\n // search input. Pass it through to the package manager as-is (the CDN\n // route already handles `name@tag` specs), but track status under the\n // bare name so the Settings list doesn't fragment.\n const bareName = parseBareName(packageSpec);\n // Packages that were in `/packages` when the user clicked Install go\n // through `updateRegistryPackageStatus` and hit an existing entry.\n // Packages that landed via the npm-uplink fallback weren't in the list,\n // so we register them explicitly rather than silently upserting a\n // placeholder — keeping the \"does not exist\" error as a signal for any\n // other code path that reaches update without a matching entry.\n const wasKnownToRegistry = registryPackageList.some(\n (p) => p.name === bareName,\n );\n const result = await packageManager.addPackage(packageSpec);\n if (result.type === \"success\") {\n if (wasKnownToRegistry) {\n updateRegistryPackageStatus(bareName, \"registry-install\");\n } else {\n registerFallbackRegistryPackage(\n bareName,\n result.package,\n packageManager.getPackageVersion(bareName) ??\n packageManager.getPackageVersion(packageSpec),\n \"registry-install\",\n );\n }\n toast(`Package \"${packageSpec}\" installed successfully`, {\n type: \"connect-success\",\n });\n } else {\n const message = result.error.message;\n console.error(\n `[Connect][PackageManager] Install failed for \"${packageSpec}\":`,\n result.error,\n );\n // `BrowserPackageManager` raises a generic \"Failed to fetch dynamically\n // imported module\" when the registry CDN returns an error. That covers\n // both \"the name exists nowhere (not on this registry AND not on the\n // npmjs uplink)\" and \"the tarball is there but doesn't look like a\n // Powerhouse package\". Map to plain-language copy — never dump the raw\n // API / loader message into the toast.\n const isLikelyNotFound = /failed to fetch|404|not found/i.test(message);\n const userMessage = isLikelyNotFound\n ? `Couldn't install \"${packageSpec}\". It isn't available on this registry or via npm.`\n : `Couldn't install \"${packageSpec}\". Please try again.`;\n toast(userMessage, { type: \"error\" });\n }\n }\n\n function handleUninstall(packageName: string) {\n if (!packageManager) return;\n try {\n packageManager.removePackage(packageName);\n updateRegistryPackageStatus(packageName, \"available\");\n\n toast(`Package \"${packageName}\" uninstalled successfully`, {\n type: \"connect-success\",\n });\n } catch (error) {\n console.error(\n `[Connect][PackageManager] Uninstall failed for \"${packageName}\":`,\n error,\n );\n toast(`Couldn't uninstall \"${packageName}\". Please try again.`, {\n type: \"error\",\n });\n }\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <PackageManager\n mutable={true}\n installedPackages={installedPackages}\n availablePackages={availablePackages}\n isAvailableLoading={isLoadingAvailable}\n isLoadingMoreAvailable={isLoadingMoreAvailable}\n hasMoreAvailable={availableHasMore}\n onLoadMoreAvailable={loadMoreAvailable}\n availableError={availableError}\n onAvailableRetry={() => {\n void fetchAvailablePage({ reset: true });\n }}\n onAvailableSearchChange={setAvailableSearch}\n onAvailableTabOpen={ensureAvailableLoaded}\n onInstall={handleInstall}\n onUninstall={handleUninstall}\n />\n </div>\n );\n};\n","import {\n SettingsModal as SettingsModalV2,\n ThemeSwitch,\n} from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { t } from \"i18next\";\nimport { CircleHelp, Package, PenLine, TriangleAlert } from \"lucide-react\";\nimport React, { useMemo } from \"react\";\nimport { About } from \"./settings/about.js\";\nimport { DangerZone } from \"./settings/danger-zone.js\";\nimport { DefaultEditor } from \"./settings/default-editor.js\";\nimport { ConnectPackageManager } from \"./settings/package-manager.js\";\n\nconst iconProps = { size: 16 } as const;\n\nexport const SettingsModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"settings\";\n\n const tabs = useMemo(\n () => [\n {\n id: \"package-manager\",\n icon: <Package {...iconProps} />,\n label: \"Package Manager\",\n content: ConnectPackageManager,\n },\n {\n id: \"default-editors\",\n icon: <PenLine {...iconProps} />,\n label: \"Default Editors\",\n content: DefaultEditor,\n },\n {\n id: \"danger-zone\",\n icon: <TriangleAlert {...iconProps} className=\"text-destructive\" />,\n label: <span className=\"text-destructive\">Danger Zone</span>,\n content: () => <DangerZone />,\n },\n {\n id: \"about\",\n icon: <CircleHelp {...iconProps} />,\n label: \"About\",\n content: About,\n },\n ],\n [],\n );\n\n return (\n <SettingsModalV2\n open={open}\n title={t(\"modals.connectSettings.title\")}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n tabs={tabs}\n navFooter={<ThemeSwitch horizontal />}\n />\n );\n};\n"],"names":["About","BaseAbout","packageJson","DangerZone","BaseDangerZone","DefaultEditor","BaseDefaultEditor","DefaultEditor","DangerZone","About","SettingsModalV2"],"mappings":"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","debug_id":"0eb5728e-98bf-5bee-883b-043438d8af98"}
@@ -1,4 +0,0 @@
1
- import { t as AppLoader } from "./app-loader-VDeDZD5T.js";
2
- export { AppLoader };
3
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3c7f3735-da74-5e6a-a28a-77a6ddd3fea7")}catch(e){}}();
4
- //# debugId=3c7f3735-da74-5e6a-a28a-77a6ddd3fea7