@powerhousedao/connect 6.0.0-dev.125 → 6.0.0-dev.126
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ClearStorageModal-QaXlzOUj.js → ClearStorageModal-Cdq-bPvv.js} +2 -2
- package/dist/{ClearStorageModal-QaXlzOUj.js.map → ClearStorageModal-Cdq-bPvv.js.map} +1 -1
- package/dist/{SettingsModal-CB-8odVq.js → SettingsModal-rNEeEyNO.js} +2 -2
- package/dist/{SettingsModal-CB-8odVq.js.map → SettingsModal-rNEeEyNO.js.map} +1 -1
- package/dist/{load-Dfj1viyV.js → load-CWYw130N.js} +3 -3
- package/dist/{load-Dfj1viyV.js.map → load-CWYw130N.js.map} +1 -1
- package/dist/main.js +1 -1
- package/dist/{package-CmSTDors.js → package-CvSLnKns.js} +2 -2
- package/dist/package-CvSLnKns.js.map +1 -0
- package/dist/{reactor-0ePhFy1l.js → reactor-iR_6EJyf.js} +20 -2
- package/dist/reactor-iR_6EJyf.js.map +1 -0
- package/dist/{sidebar-Bhnmtf8R.js → sidebar-CP_Du6Zs.js} +4 -4
- package/dist/{sidebar-Bhnmtf8R.js.map → sidebar-CP_Du6Zs.js.map} +1 -1
- package/dist/start-connect.js +1 -1
- package/package.json +9 -9
- package/public/ph-packages.json +3 -0
- package/dist/package-CmSTDors.js.map +0 -1
- package/dist/reactor-0ePhFy1l.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as clearReactorStorage } from "./reactor-
|
|
1
|
+
import { t as clearReactorStorage } from "./reactor-iR_6EJyf.js";
|
|
2
2
|
import { closePHModal, setSelectedDrive, setSelectedNode, showPHModal, usePHModal } from "@powerhousedao/reactor-browser";
|
|
3
3
|
import { childLogger } from "document-model";
|
|
4
4
|
import { useState } from "react";
|
|
@@ -41,4 +41,4 @@ function ClearStorageModal() {
|
|
|
41
41
|
//#endregion
|
|
42
42
|
export { ClearStorageModal };
|
|
43
43
|
|
|
44
|
-
//# sourceMappingURL=ClearStorageModal-
|
|
44
|
+
//# sourceMappingURL=ClearStorageModal-Cdq-bPvv.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClearStorageModal-
|
|
1
|
+
{"version":3,"file":"ClearStorageModal-Cdq-bPvv.js","names":["logger"],"sources":["../src/components/modal/modals/ClearStorageModal.tsx"],"sourcesContent":["import { clearReactorStorage } from \"@powerhousedao/connect/store\";\nimport { ConnectConfirmationModal } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n setSelectedDrive,\n setSelectedNode,\n showPHModal,\n usePHModal,\n} from \"@powerhousedao/reactor-browser\";\nimport { childLogger } from \"document-model\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nconst logger = childLogger([\"ClearStorage\"]);\n\nexport function ClearStorageModal() {\n const phModal = usePHModal();\n const open = phModal?.type === \"clearStorage\";\n const { t } = useTranslation();\n const [loading, setLoading] = useState(false);\n\n function clearStorage() {\n setLoading(true);\n clearReactorStorage()\n .then(() => {\n logger.info(\"Storage cleared\");\n setSelectedDrive(undefined);\n setSelectedNode(undefined);\n window.location.reload();\n })\n .catch((error) => {\n logger.error(\"Error clearing storage: @error\", error);\n setLoading(false);\n });\n }\n\n return (\n <ConnectConfirmationModal\n open={open}\n header={t(\"modals.connectSettings.clearStorage.confirmation.title\")}\n title={t(\"modals.connectSettings.clearStorage.confirmation.title\")}\n body={t(\"modals.connectSettings.clearStorage.confirmation.body\")}\n cancelLabel={t(\"common.cancel\")}\n continueLabel={t(\n \"modals.connectSettings.clearStorage.confirmation.clearButton\",\n )}\n onCancel={() => showPHModal({ type: \"settings\" })}\n onContinue={clearStorage}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n continueButtonProps={{\n disabled: loading,\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;AAaA,MAAMA,WAAS,YAAY,CAAC,eAAe,CAAC;AAE5C,SAAgB,oBAAoB;CAElC,MAAM,OADU,YAAY,EACN,SAAS;CAC/B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAE7C,SAAS,eAAe;AACtB,aAAW,KAAK;AAChB,uBAAqB,CAClB,WAAW;AACV,YAAO,KAAK,kBAAkB;AAC9B,oBAAiB,KAAA,EAAU;AAC3B,mBAAgB,KAAA,EAAU;AAC1B,UAAO,SAAS,QAAQ;IACxB,CACD,OAAO,UAAU;AAChB,YAAO,MAAM,kCAAkC,MAAM;AACrD,cAAW,MAAM;IACjB;;AAGN,QACE,oBAAC,0BAAD;EACQ;EACN,QAAQ,EAAE,yDAAyD;EACnE,OAAO,EAAE,yDAAyD;EAClE,MAAM,EAAE,wDAAwD;EAChE,aAAa,EAAE,gBAAgB;EAC/B,eAAe,EACb,+DACD;EACD,gBAAgB,YAAY,EAAE,MAAM,YAAY,CAAC;EACjD,YAAY;EACZ,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,qBAAqB,EACnB,UAAU,SACX;EACD,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as connectConfig } from "./connect.config-CUbxYkCy.js";
|
|
2
2
|
import { t as toast$1 } from "./toast-iD-70hL8.js";
|
|
3
3
|
import { t as useRegistryPackages } from "./useRegistryPackages-Ctlhv061.js";
|
|
4
|
-
import { t as package_default } from "./package-
|
|
4
|
+
import { t as package_default } from "./package-CvSLnKns.js";
|
|
5
5
|
import { closePHModal, deleteDrive, setSelectedDrive, showPHModal, useDrives, usePHModal, useVetraPackageManager } from "@powerhousedao/reactor-browser";
|
|
6
6
|
import { useCallback, useMemo, useState } from "react";
|
|
7
7
|
import { About, DangerZone, DefaultEditor, PackageManager, SettingsModal as SettingsModal$1 } from "@powerhousedao/design-system/connect";
|
|
@@ -150,4 +150,4 @@ const SettingsModal = () => {
|
|
|
150
150
|
//#endregion
|
|
151
151
|
export { SettingsModal };
|
|
152
152
|
|
|
153
|
-
//# sourceMappingURL=SettingsModal-
|
|
153
|
+
//# sourceMappingURL=SettingsModal-rNEeEyNO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsModal-
|
|
1
|
+
{"version":3,"file":"SettingsModal-rNEeEyNO.js","names":["About","BaseAbout","packageJson","DangerZone","BaseDangerZone","DefaultEditor","BaseDefaultEditor","DefaultEditor","DangerZone","About","SettingsModalV2"],"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 { packageJson } from \"@powerhousedao/connect/utils\";\nimport { About as BaseAbout } from \"@powerhousedao/design-system/connect\";\n\nexport const About: React.FC = () => {\n return (\n <BaseAbout\n packageJson={packageJson}\n phCliVersion={\n typeof connectConfig.phCliVersion === \"string\"\n ? connectConfig.phCliVersion\n : undefined\n }\n />\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={handleDeleteDrive}\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\nexport const ConnectPackageManager: React.FC = () => {\n const packageManager = useVetraPackageManager();\n const { registryPackageList, updateRegistryPackageStatus } =\n useRegistryPackages();\n\n async function handleInstall(packageName: string) {\n if (!packageManager) return;\n\n const result = await packageManager.addPackage(packageName);\n if (result.type === \"success\") {\n updateRegistryPackageStatus(packageName, \"registry-install\");\n toast(`Package \"${packageName}\" installed successfully`, {\n type: \"connect-success\",\n });\n } else {\n const message = result.error.message;\n toast(`Failed to install \"${packageName}\": ${message}`, {\n type: \"error\",\n });\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 const message = error instanceof Error ? error.message : \"Unknown error\";\n toast(`Failed to uninstall \"${packageName}\": ${message}`, {\n type: \"error\",\n });\n }\n }\n\n return (\n <div className=\"flex h-full flex-1 flex-col\">\n <PackageManager\n mutable={true}\n registryPackageList={registryPackageList}\n onInstall={handleInstall}\n onUninstall={handleUninstall}\n />\n </div>\n );\n};\n","import { Icon } from \"@powerhousedao/design-system\";\nimport { SettingsModal as SettingsModalV2 } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { t } from \"i18next\";\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\nexport const SettingsModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"settings\";\n function onRefresh() {\n window.location.reload();\n }\n\n const tabs = useMemo(\n () => [\n {\n id: \"package-manager\",\n icon: <Icon name=\"PackageManager\" size={12} />,\n label: \"Package Manager\",\n content: ConnectPackageManager,\n },\n {\n id: \"default-editors\",\n icon: <Icon name=\"Edit\" size={12} />,\n label: \"Default Editors\",\n content: DefaultEditor,\n },\n {\n id: \"danger-zone\",\n icon: <Icon name=\"Danger\" size={12} className=\"text-red-900\" />,\n label: <span className=\"text-red-900\">Danger Zone</span>,\n content: () => <DangerZone />,\n },\n {\n id: \"about\",\n icon: <Icon name=\"QuestionSquare\" size={12} />,\n label: \"About\",\n content: About,\n },\n ],\n [onRefresh],\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 />\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as connectConfig } from "./connect.config-CUbxYkCy.js";
|
|
2
2
|
import { t as toast } from "./toast-iD-70hL8.js";
|
|
3
|
-
import { t as package_default } from "./package-
|
|
4
|
-
import { n as createReactor } from "./reactor-
|
|
3
|
+
import { t as package_default } from "./package-CvSLnKns.js";
|
|
4
|
+
import { n as createReactor } from "./reactor-iR_6EJyf.js";
|
|
5
5
|
import { useUser } from "@powerhousedao/reactor-browser";
|
|
6
6
|
import { logger } from "document-model";
|
|
7
7
|
import { createElement, useEffect } from "react";
|
|
@@ -102,4 +102,4 @@ async function loadComponent(localPackage) {
|
|
|
102
102
|
//#endregion
|
|
103
103
|
export { loadComponent };
|
|
104
104
|
|
|
105
|
-
//# sourceMappingURL=load-
|
|
105
|
+
//# sourceMappingURL=load-CWYw130N.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-
|
|
1
|
+
{"version":3,"file":"load-CWYw130N.js","names":["packageJson"],"sources":["../src/components/reload-connect-toast.tsx","../src/hooks/useCheckLatestVersion.ts","../src/hooks/utils.ts","../src/store/user.ts","../src/components/load.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\n\nexport const ReloadConnectToast = () => {\n const { t } = useTranslation();\n\n return (\n <div>\n <p className=\"font-medium\">{t(\"notifications.reloadApp\")}</p>\n <button\n onClick={() => location.reload()}\n className=\"underline decoration-solid underline-offset-2\"\n >\n {t(\"common.reloadConnect\")} 🔄\n </button>\n </div>\n );\n};\n","import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { isLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { logger } from \"document-model\";\nimport { createElement, useEffect } from \"react\";\nimport { ReloadConnectToast } from \"../components/reload-connect-toast.js\";\n\nexport const useCheckLatestVersion = () => {\n async function checkLatestVersion() {\n const result = await isLatestVersion();\n if (result === null) return;\n // ignore dev/staging versions\n if (result.isLatest || result.currentVersion.includes(\"-\")) {\n return true;\n }\n\n if (\n import.meta.env.MODE === \"development\" ||\n connectConfig.studioMode ||\n !connectConfig.warnOutdatedApp\n ) {\n logger.warn(\n \"Connect is outdated: \\nCurrent: @currentVersion\\nLatest: @latestVersion\",\n result.currentVersion,\n result.latestVersion,\n );\n } else {\n toast(createElement(ReloadConnectToast), {\n type: \"connect-warning\",\n toastId: \"outdated-app\",\n autoClose: false,\n });\n }\n }\n\n useEffect(() => {\n checkLatestVersion().catch(console.error);\n }, []);\n};\n","import { packageJson } from \"../utils/package-json.js\";\n\nexport const isMac = window.navigator.appVersion.includes(\"Mac\");\n\nconst urlBranchMap: Record<string, string> = {\n \"staging/makerdao\": \"deployments/staging/makerdao\",\n \"staging/arbitrum\": \"arb-ltip\",\n \"staging/powerhouse\": \"staging\",\n makerdao: \"deployments/makerdao\",\n arbitrum: \"deployments/arbitrum\",\n arbgrants: \"deployments/arbitrum\",\n localhost: \"develop\",\n};\n\nconst getGithubLinkFromUrl = () => {\n const githubLink = \"https://raw.githubusercontent.com/powerhouse-inc/connect\";\n const url = window.location.href;\n\n const env = Object.keys(urlBranchMap).find((env) => url.includes(env));\n const value = env ? urlBranchMap[env] : undefined;\n if (!value) {\n return undefined;\n } else {\n return `${githubLink}/${value}/package.json`;\n }\n};\n\nconst fetchLatestVersion = async () => {\n const link = getGithubLinkFromUrl();\n if (!link) {\n return undefined;\n }\n const result = await fetch(link);\n const data = (await result.json()) as { version: string };\n const { version } = data;\n return version;\n};\n\nexport const isLatestVersion = async () => {\n const currentVersion = packageJson.version;\n const deployed = await fetchLatestVersion();\n\n if (deployed) {\n return {\n isLatest: deployed === currentVersion,\n currentVersion,\n latestVersion: deployed,\n };\n }\n\n return null;\n};\n","import { useUser } from \"@powerhousedao/reactor-browser\";\nimport type { User as SentryUser } from \"@sentry/react\";\nimport { setUser as setSentryUser } from \"@sentry/react\";\nimport { useEffect } from \"react\";\n\nexport function useSetSentryUser() {\n const user = useUser();\n useEffect(() => {\n let sentryUser: SentryUser | null = null;\n if (user) {\n // saves the user info except the credential\n const { credential, ...rest } = user;\n sentryUser = { id: rest.did, username: rest.ens?.name, ...rest };\n }\n setSentryUser(sentryUser);\n }, [user]);\n}\n","import { useCheckLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport \"@powerhousedao/connect/i18n\";\nimport { createReactor, useSetSentryUser } from \"@powerhousedao/connect/store\";\nimport type { VetraPackage } from \"@powerhousedao/reactor-browser\";\nimport { type ReactNode } from \"react\";\n\nexport async function loadComponent(localPackage?: VetraPackage) {\n await createReactor(localPackage);\n return {\n default: ({ children }: { children?: ReactNode }) => {\n useSetSentryUser();\n useCheckLatestVersion();\n return children;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;AAEA,MAAa,2BAA2B;CACtC,MAAM,EAAE,MAAM,gBAAgB;AAE9B,QACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,KAAD;EAAG,WAAU;YAAe,EAAE,0BAA0B;EAAK,CAAA,EAC7D,qBAAC,UAAD;EACE,eAAe,SAAS,QAAQ;EAChC,WAAU;YAFZ,CAIG,EAAE,uBAAuB,EAAC,MACpB;IACL,EAAA,CAAA;;;;ACPV,MAAa,8BAA8B;CACzC,eAAe,qBAAqB;EAClC,MAAM,SAAS,MAAM,iBAAiB;AACtC,MAAI,WAAW,KAAM;AAErB,MAAI,OAAO,YAAY,OAAO,eAAe,SAAS,IAAI,CACxD,QAAO;AAGT,MACE,OAAO,KAAK,IAAI,SAAS,iBACzB,cAAc,cACd,CAAC,cAAc,gBAEf,QAAO,KACL,2EACA,OAAO,gBACP,OAAO,cACR;MAED,OAAM,cAAc,mBAAmB,EAAE;GACvC,MAAM;GACN,SAAS;GACT,WAAW;GACZ,CAAC;;AAIN,iBAAgB;AACd,sBAAoB,CAAC,MAAM,QAAQ,MAAM;IACxC,EAAE,CAAC;;ACnCa,OAAO,UAAU,WAAW,SAAS,MAAM;AAEhE,MAAM,eAAuC;CAC3C,oBAAoB;CACpB,oBAAoB;CACpB,sBAAsB;CACtB,UAAU;CACV,UAAU;CACV,WAAW;CACX,WAAW;CACZ;AAED,MAAM,6BAA6B;CACjC,MAAM,aAAa;CACnB,MAAM,MAAM,OAAO,SAAS;CAE5B,MAAM,MAAM,OAAO,KAAK,aAAa,CAAC,MAAM,QAAQ,IAAI,SAAS,IAAI,CAAC;CACtE,MAAM,QAAQ,MAAM,aAAa,OAAO,KAAA;AACxC,KAAI,CAAC,MACH;KAEA,QAAO,GAAG,WAAW,GAAG,MAAM;;AAIlC,MAAM,qBAAqB,YAAY;CACrC,MAAM,OAAO,sBAAsB;AACnC,KAAI,CAAC,KACH;CAIF,MAAM,EAAE,YADM,OADC,MAAM,MAAM,KAAK,EACL,MAAM;AAEjC,QAAO;;AAGT,MAAa,kBAAkB,YAAY;CACzC,MAAM,iBAAiBA,gBAAY;CACnC,MAAM,WAAW,MAAM,oBAAoB;AAE3C,KAAI,SACF,QAAO;EACL,UAAU,aAAa;EACvB;EACA,eAAe;EAChB;AAGH,QAAO;;;;AC7CT,SAAgB,mBAAmB;CACjC,MAAM,OAAO,SAAS;AACtB,iBAAgB;EACd,IAAI,aAAgC;AACpC,MAAI,MAAM;GAER,MAAM,EAAE,YAAY,GAAG,SAAS;AAChC,gBAAa;IAAE,IAAI,KAAK;IAAK,UAAU,KAAK,KAAK;IAAM,GAAG;IAAM;;AAElE,UAAc,WAAW;IACxB,CAAC,KAAK,CAAC;;;;ACTZ,eAAsB,cAAc,cAA6B;AAC/D,OAAM,cAAc,aAAa;AACjC,QAAO,EACL,UAAU,EAAE,eAAyC;AACnD,oBAAkB;AAClB,yBAAuB;AACvB,SAAO;IAEV"}
|
package/dist/main.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
var package_default = {
|
|
3
3
|
name: "@powerhousedao/connect",
|
|
4
4
|
productName: "Powerhouse-Connect",
|
|
5
|
-
version: "6.0.0-dev.
|
|
5
|
+
version: "6.0.0-dev.126",
|
|
6
6
|
description: "Powerhouse Connect",
|
|
7
7
|
main: "dist/index.html",
|
|
8
8
|
type: "module",
|
|
@@ -106,4 +106,4 @@ var package_default = {
|
|
|
106
106
|
//#endregion
|
|
107
107
|
export { package_default as t };
|
|
108
108
|
|
|
109
|
-
//# sourceMappingURL=package-
|
|
109
|
+
//# sourceMappingURL=package-CvSLnKns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-CvSLnKns.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
|
|
@@ -438,6 +438,23 @@ var BrowserPackageManager = class {
|
|
|
438
438
|
}
|
|
439
439
|
};
|
|
440
440
|
//#endregion
|
|
441
|
+
//#region src/packages.config.ts
|
|
442
|
+
function assertPackagesConfig(value) {
|
|
443
|
+
if (typeof value !== "object" || value === null) throw new Error("ph-packages.json must be a JSON object");
|
|
444
|
+
const obj = value;
|
|
445
|
+
if (!Array.isArray(obj.packages)) throw new Error("ph-packages.json: 'packages' must be an array");
|
|
446
|
+
if (!obj.packages.every((item) => typeof item === "string")) throw new Error("ph-packages.json: 'packages' must be an array of strings");
|
|
447
|
+
}
|
|
448
|
+
let cached;
|
|
449
|
+
async function loadPackagesConfig() {
|
|
450
|
+
if (cached) return cached;
|
|
451
|
+
const url = `${import.meta.env.BASE_URL ?? "/"}ph-packages.json`;
|
|
452
|
+
const json = await (await fetch(url)).json();
|
|
453
|
+
assertPackagesConfig(json);
|
|
454
|
+
cached = json;
|
|
455
|
+
return cached;
|
|
456
|
+
}
|
|
457
|
+
//#endregion
|
|
441
458
|
//#region src/pglite.db.ts
|
|
442
459
|
async function getDb() {
|
|
443
460
|
const worker = new Worker(new URL("./pglite.worker.js", import.meta.url), { type: "module" });
|
|
@@ -485,10 +502,11 @@ async function createReactor(localPackage) {
|
|
|
485
502
|
basename: phGlobalConfigFromEnv.routerBasename,
|
|
486
503
|
baseUrl: phGlobalConfigFromEnv.renownUrl
|
|
487
504
|
}).withCrypto(renownCrypto).build();
|
|
505
|
+
const packagesConfig = await loadPackagesConfig();
|
|
488
506
|
const packageManager = new BrowserPackageManager(phGlobalConfigFromEnv.routerBasename ?? "", PH_PACKAGE_REGISTRY_URL);
|
|
489
507
|
setVetraPackageManager(packageManager);
|
|
490
508
|
await packageManager.init(localPackage);
|
|
491
|
-
(await packageManager.addPackages(
|
|
509
|
+
(await packageManager.addPackages(packagesConfig.packages)).map((r) => {
|
|
492
510
|
if (r.type === "error") console.error(r.error);
|
|
493
511
|
});
|
|
494
512
|
const reactorClientModule = await createBrowserReactor(packageManager.packages.flatMap((pkg) => pkg.modules.documentModelModules).filter((module, index, modules) => module !== void 0 && modules.findIndex((m) => m?.documentType === module.documentType && m.version === module.version) === index).filter((d) => d !== void 0), packageManager.packages.flatMap((pkg) => pkg.upgradeManifests).filter((u) => u !== void 0), renown);
|
|
@@ -565,4 +583,4 @@ function getDriveUrl() {
|
|
|
565
583
|
//#endregion
|
|
566
584
|
export { createReactor as n, clearReactorStorage as t };
|
|
567
585
|
|
|
568
|
-
//# sourceMappingURL=reactor-
|
|
586
|
+
//# sourceMappingURL=reactor-iR_6EJyf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactor-iR_6EJyf.js","names":["#storage","#cdnUrl","#toCdnUrl","#loadCommonPackage","#registerPackage","#loadVetraPackage","#localPackage","#packagesMemo","#packages","#loadPackage","#unmountStylesheet","#notifyPackagesChanged","#subscribers","#loadPackageFromNodeModules","#importPackage","#loadPackageFromRegistry","#mountStylesheet","#stylesheets"],"sources":["../src/utils/reactor.ts","../src/store/document-model.ts","../src/store/editor.ts","../src/feature-flags.ts","../src/package-manager.ts","../src/packages.config.ts","../src/pglite.db.ts","../src/store/processor-host-module.ts","../src/store/reactor.ts"],"sourcesContent":["import { PGlite } from \"@electric-sql/pglite\";\nimport {\n addRemoteDrive,\n ChannelScheme,\n ReactorBuilder,\n ReactorClientBuilder,\n type BrowserReactorClientModule,\n type Database,\n type IDocumentModelLoader,\n type JwtHandler,\n type SignerConfig,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n DocumentModelModule,\n UpgradeManifest,\n} from \"@powerhousedao/shared/document-model\";\nimport { createSignatureVerifier, type IRenown } from \"@renown/sdk\";\nimport { ConsoleLogger } from \"document-model\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\n\n/**\n * Creates a Reactor that plugs into legacy storage but syncs through the new\n * Reactor GQL API.\n */\nexport async function createBrowserReactor(\n documentModelModules: DocumentModelModule[],\n upgradeManifests: UpgradeManifest<readonly number[]>[],\n renown: IRenown,\n documentModelLoader?: IDocumentModelLoader,\n): Promise<BrowserReactorClientModule> {\n const signerConfig: SignerConfig = {\n signer: renown.signer,\n verifier: createSignatureVerifier(),\n };\n\n const jwtHandler: JwtHandler = async (url: string) => {\n if (!renown.user) {\n return undefined;\n }\n return renown.getBearerToken({ expiresIn: 10, aud: url });\n };\n\n const pg = new PGlite(\"idb://reactor\", {\n relaxedDurability: true,\n });\n const logger = new ConsoleLogger([\"reactor-client\"]);\n const builder = new ReactorClientBuilder()\n .withLogger(logger)\n .withSigner(signerConfig)\n .withReactorBuilder(\n new ReactorBuilder()\n .withDocumentModels(documentModelModules)\n .withUpgradeManifests(upgradeManifests)\n .withChannelScheme(ChannelScheme.CONNECT)\n .withJwtHandler(jwtHandler)\n .withKysely(\n new Kysely<Database>({\n dialect: new PGliteDialect(pg),\n }),\n ),\n );\n\n if (documentModelLoader) {\n builder.withDocumentModelLoader(documentModelLoader);\n }\n\n const module = await builder.buildModule();\n return {\n ...module,\n pg,\n } as BrowserReactorClientModule;\n}\n\n/**\n * Parse default drives from environment variable.\n * Returns an array of drive REST endpoint URLs (e.g., \"https://example.com/d/powerhouse\").\n */\nexport function getDefaultDrivesFromEnv(): string[] {\n const envValue = import.meta.env.PH_CONNECT_DEFAULT_DRIVES_URL as\n | string\n | undefined;\n if (!envValue) return [];\n return envValue.split(\",\").filter((url) => url.trim().length > 0);\n}\n\n/**\n * Add default drives for the new reactor via sync manager.\n * @param defaultDriveUrls - Array of drive REST endpoint URLs (e.g., \"https://example.com/d/powerhouse\")\n */\nexport async function addDefaultDrivesForNewReactor(\n defaultDriveUrls: string[],\n): Promise<void> {\n for (const url of defaultDriveUrls) {\n try {\n await addRemoteDrive(url);\n } catch (error) {\n console.error(`Failed to add default drive ${url}:`, error);\n }\n }\n}\n","import type { VetraDocumentModelModule } from \"@powerhousedao/reactor-browser\";\nimport { driveDocumentModelModule } from \"@powerhousedao/shared/document-drive\";\nimport {\n createState,\n defaultBaseState,\n} from \"@powerhousedao/shared/document-model\";\nimport { documentModelDocumentModelModule } from \"document-model\";\n\nexport function loadDocumentModelDocumentModelModule() {\n const global = documentModelDocumentModelModule.documentModel.global;\n const name = global.name;\n const documentType = global.id;\n const unsafeIdFromDocumentType = documentType;\n const extension = global.extension;\n const specifications = global.specifications;\n const reducer = documentModelDocumentModelModule.reducer;\n const actions = documentModelDocumentModelModule.actions;\n const utils = documentModelDocumentModelModule.utils;\n const vetraDocumentModelModule: VetraDocumentModelModule = {\n id: unsafeIdFromDocumentType,\n name,\n documentType,\n extension,\n specifications,\n reducer,\n actions,\n utils,\n documentModel: createState(defaultBaseState(), global),\n };\n return vetraDocumentModelModule;\n}\n\nexport function loadDriveDocumentModelModule() {\n const global = driveDocumentModelModule.documentModel.global;\n const name = global.name;\n const documentType = global.id;\n const unsafeIdFromDocumentType = documentType;\n const extension = global.extension;\n const specifications = global.specifications;\n const reducer = driveDocumentModelModule.reducer;\n const actions = driveDocumentModelModule.actions;\n const utils = driveDocumentModelModule.utils;\n const vetraDocumentModelModule: VetraDocumentModelModule = {\n id: unsafeIdFromDocumentType,\n name,\n documentType,\n extension,\n specifications,\n reducer,\n actions,\n utils,\n documentModel: createState(defaultBaseState(), global),\n };\n return vetraDocumentModelModule;\n}\n","import {\n DocumentModelEditor,\n GenericDriveExplorer,\n} from \"@powerhousedao/powerhouse-vetra-packages/editors\";\nimport type { VetraEditorModule } from \"@powerhousedao/reactor-browser\";\nimport { DEFAULT_DRIVE_EDITOR_ID } from \"@powerhousedao/reactor-browser\";\n\nexport function loadGenericDriveExplorerEditorModule(): VetraEditorModule {\n const name = \"Generic Drive Explorer\";\n const documentTypes = [\"powerhouse/document-drive\"];\n const Component = GenericDriveExplorer.Component;\n const vetraEditorModule: VetraEditorModule = {\n id: DEFAULT_DRIVE_EDITOR_ID,\n name,\n documentTypes,\n Component,\n };\n return vetraEditorModule;\n}\n\nexport function loadDocumentModelEditor(): VetraEditorModule {\n const name = \"Document Model Editor\";\n const id = \"document-model-editor-v2\";\n const documentTypes = [\"powerhouse/document-model\"];\n const Component = DocumentModelEditor.Component;\n const vetraEditorModule: VetraEditorModule = {\n id,\n name,\n documentTypes,\n Component,\n };\n return vetraEditorModule;\n}\n","import {\n OpenFeature,\n type ErrorCode,\n type JsonValue,\n type Provider,\n type ResolutionDetails,\n} from \"@openfeature/web-sdk\";\nimport { logger, setLogLevel, type ILogger } from \"document-model\";\nimport { connectConfig } from \"./connect.config.js\";\n\n/**\n * QueryParamProvider reads feature flags from URL query parameters.\n *\n * Usage:\n * const params = new URLSearchParams(window.location.search);\n * const provider = new QueryParamProvider(params);\n * await OpenFeature.setProviderAndWait(provider);\n *\n * Query parameter format:\n * ?FEATURE_DUAL_ACTION_CREATE_ENABLED=true&FEATURE_FOO=false\n */\nexport class QueryParamProvider implements Provider {\n public readonly runsOn = \"client\" as const;\n\n readonly metadata = {\n name: \"QueryParamProvider\",\n } as const;\n\n private flags: Map<string, string>;\n\n constructor(searchParams: URLSearchParams) {\n this.flags = new Map();\n\n // Extract all query parameters that look like feature flags\n for (const [key, value] of searchParams.entries()) {\n this.flags.set(key, value);\n }\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n ): ResolutionDetails<boolean> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n // Parse boolean from string\n const boolValue = value.toLowerCase() === \"true\" || value === \"1\";\n\n return {\n value: boolValue,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n ): ResolutionDetails<string> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n return {\n value,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n ): ResolutionDetails<number> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n const numValue = Number(value);\n\n if (isNaN(numValue)) {\n return {\n value: defaultValue,\n reason: \"ERROR\",\n errorCode: \"PARSE_ERROR\" as ErrorCode,\n errorMessage: `Failed to parse \"${value}\" as a number`,\n };\n }\n\n return {\n value: numValue,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n ): ResolutionDetails<T> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n try {\n const objValue = JSON.parse(value) as T;\n return {\n value: objValue,\n reason: \"STATIC\",\n variant: value,\n };\n } catch (error) {\n return {\n value: defaultValue,\n reason: \"ERROR\",\n errorCode: \"PARSE_ERROR\" as ErrorCode,\n errorMessage: `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n}\n\n/**\n * Initialize OpenFeature with the QueryParamProvider.\n * Reads feature flags from query parameters.\n */\nexport async function initFeatureFlags(\n searchParams?: URLSearchParams,\n): Promise<Map<string, boolean>> {\n const params =\n searchParams ??\n (typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search)\n : new URLSearchParams());\n const provider = new QueryParamProvider(params);\n await OpenFeature.setProviderAndWait(provider);\n\n const features = new Map<string, boolean>();\n const client = OpenFeature.getClient();\n\n // Query param overrides env var for inspector\n const inspectorFromParam = params.has(FEATURE_INSPECTOR_ENABLED);\n const inspectorEnabled = inspectorFromParam\n ? client.getBooleanValue(\n FEATURE_INSPECTOR_ENABLED,\n FEATURE_INSPECTOR_ENABLED_DEFAULT,\n )\n : connectConfig.content.inspectorEnabled;\n features.set(FEATURE_INSPECTOR_ENABLED, inspectorEnabled);\n\n // Handle LOG_LEVEL query param override\n const logLevelParam = params.get(\"LOG_LEVEL\");\n if (logLevelParam) {\n const validLogLevels = [\"verbose\", \"debug\", \"info\", \"warn\", \"error\"];\n if (validLogLevels.includes(logLevelParam.toLowerCase())) {\n setLogLevel(logLevelParam.toLowerCase() as ILogger[\"level\"]);\n logger.info(\n \"Log level set to @level via query param\",\n logLevelParam.toLowerCase(),\n );\n } else {\n logger.warn(\n \"Invalid LOG_LEVEL query param: @param. Valid values: @validLevels\",\n logLevelParam,\n validLogLevels.join(\", \"),\n );\n }\n }\n\n return features;\n}\n\nconst FEATURE_INSPECTOR_ENABLED = \"FEATURE_INSPECTOR_ENABLED\";\nconst FEATURE_INSPECTOR_ENABLED_DEFAULT = false;\n\n/**\n * If true, shows the inspector button in the sidebar.\n * Defaults to false (hidden).\n */\nexport async function isInspectorEnabled(): Promise<boolean> {\n const client = OpenFeature.getClient();\n return Promise.resolve(\n client.getBooleanValue(\n FEATURE_INSPECTOR_ENABLED,\n FEATURE_INSPECTOR_ENABLED_DEFAULT,\n ),\n );\n}\n","import type {\n IPackagesListener,\n PackageManagerInstallResult,\n VetraPackage,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n BrowserLocalStorage,\n COMMON_PACKAGE_ID,\n convertLegacyLibToVetraPackage,\n type IPackageListerUnsubscribe,\n type IPackageManager,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n type DocumentModelLib,\n type DocumentModelModule,\n} from \"@powerhousedao/shared/document-model\";\nimport * as vetraVetraPackage from \"@powerhousedao/vetra\";\nimport {\n loadDocumentModelDocumentModelModule,\n loadDriveDocumentModelModule,\n} from \"./store/document-model.js\";\nimport {\n loadDocumentModelEditor,\n loadGenericDriveExplorerEditorModule,\n} from \"./store/editor.js\";\n\ntype PackageMeta = {\n name: string;\n importUrl: string | null;\n stylesheetUrl: string | null;\n};\n\ntype PackageWithMeta = PackageMeta & {\n loadedPackage: VetraPackage;\n};\n\nconst LOCAL_PACKAGE_NAME = \"Local\" as const;\nconst COMMON_PACKAGE_NAME = \"Common\" as const;\nconst VETRA_PACKAGE_NAME = \"@powerhousedao/vetra\" as const;\nconst LOCAL_PACKAGES: string[] = [\n LOCAL_PACKAGE_NAME,\n COMMON_PACKAGE_NAME,\n VETRA_PACKAGE_NAME,\n];\n\nexport class BrowserPackageManager implements IPackageManager {\n registryUrl: string | null;\n #storage: BrowserLocalStorage<PackageMeta>;\n #packages: Map<string, VetraPackage> = new Map();\n #subscribers = new Set<IPackagesListener>();\n #packagesMemo: VetraPackage[] = [];\n #stylesheets: Map<string, HTMLLinkElement> = new Map();\n #localPackage: VetraPackage | undefined;\n\n #cdnUrl: string | null;\n\n constructor(namespace: string, registryUrl: string | null) {\n this.#storage = new BrowserLocalStorage<PackageMeta>(\n namespace + \":PH_PACKAGES\",\n );\n this.registryUrl = registryUrl;\n this.#cdnUrl = registryUrl !== null ? this.#toCdnUrl(registryUrl) : null;\n }\n\n #toCdnUrl(baseUrl: string): string {\n if (baseUrl.includes(\"/-/cdn\")) return baseUrl;\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n return `${base}/-/cdn`;\n }\n\n async init(localPackage?: VetraPackage) {\n const commonPackageWithMeta = this.#loadCommonPackage();\n this.#registerPackage(commonPackageWithMeta);\n const vetraVetraPackageWithMeta = this.#loadVetraPackage();\n this.#registerPackage(vetraVetraPackageWithMeta);\n if (localPackage) {\n this.#localPackage = localPackage;\n this.#registerPackage({\n name: LOCAL_PACKAGE_NAME,\n stylesheetUrl: null,\n importUrl: null,\n loadedPackage: localPackage,\n });\n }\n for (const packageName of this.#storage.keys()) {\n await this.addPackage(packageName);\n }\n }\n\n get packages() {\n return this.#packagesMemo;\n }\n\n getPackageSource(packageName: string) {\n // check vs the constant name we use for common packages\n if (LOCAL_PACKAGES.includes(packageName)) {\n return \"common\";\n }\n // check if the package has the same name as the local project\n if (packageName === this.#localPackage?.name) return \"project\";\n const packageMeta = this.#storage.get(packageName);\n // if meta does not exist the package is not installed\n if (!packageMeta) return null;\n // if imported from node_modules then the package is installed locally\n if (packageMeta.importUrl === `/node_modules/${packageName}`)\n return \"local-install\";\n // all other import urls point to a registry\n return \"registry-install\";\n }\n\n async addPackage(packageName: string): Promise<PackageManagerInstallResult> {\n const existingPackage = this.#packages.get(packageName);\n if (existingPackage) {\n return {\n type: \"success\",\n package: existingPackage,\n };\n }\n try {\n const packageWithMeta = await this.#loadPackage(packageName);\n this.#registerPackage(packageWithMeta);\n\n return {\n type: \"success\",\n package: packageWithMeta.loadedPackage,\n };\n } catch (error) {\n return {\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n async addPackages(packageNames: string[]) {\n const results: PackageManagerInstallResult[] = [];\n for (const packageName of packageNames) {\n const result = await this.addPackage(packageName);\n results.push(result);\n }\n return results;\n }\n\n removePackage(name: string) {\n this.#packages.delete(name);\n this.#storage.delete(name);\n this.#unmountStylesheet(name);\n this.#notifyPackagesChanged();\n }\n\n subscribe(handler: IPackagesListener): IPackageListerUnsubscribe {\n this.#subscribers.add(handler);\n return () => {\n this.#subscribers.delete(handler);\n };\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const documentModelModule = Array.from(\n this.#packages\n .values()\n .flatMap((p) => p.modules.documentModelModules ?? []),\n ).find((m) => m.documentType === documentType);\n\n if (documentModelModule) return Promise.resolve(documentModelModule);\n return Promise.reject(new Error(\"Model not available\"));\n }\n\n #loadCommonPackage(): PackageWithMeta {\n const documentModelDocumentModelModule =\n loadDocumentModelDocumentModelModule();\n const driveDocumentModelModule = loadDriveDocumentModelModule();\n const documentModelEditorModule = loadDocumentModelEditor();\n const genericDriveExplorerEditorModule =\n loadGenericDriveExplorerEditorModule();\n const name = COMMON_PACKAGE_NAME;\n const importUrl = null;\n const stylesheetUrl = null;\n const loadedPackage: VetraPackage = {\n id: COMMON_PACKAGE_ID,\n name,\n description: \"Common\",\n category: \"Common\",\n author: {\n name: \"Powerhouse\",\n website: \"https://powerhousedao.com\",\n },\n modules: {\n documentModelModules: [\n documentModelDocumentModelModule,\n driveDocumentModelModule,\n ],\n editorModules: [\n documentModelEditorModule,\n genericDriveExplorerEditorModule,\n ],\n },\n upgradeManifests: [],\n };\n return {\n name,\n importUrl,\n stylesheetUrl,\n loadedPackage,\n };\n }\n\n #loadVetraPackage(): PackageWithMeta {\n const name = vetraVetraPackage.manifest.name;\n const importUrl = null;\n const stylesheetUrl = null;\n const loadedPackage: VetraPackage = convertLegacyLibToVetraPackage(\n vetraVetraPackage as DocumentModelLib,\n );\n return {\n name,\n importUrl,\n stylesheetUrl,\n loadedPackage,\n };\n }\n\n async #loadPackageFromNodeModules(name: string): Promise<PackageWithMeta> {\n const importUrl = `/node_modules/${name}/index.js`;\n const stylesheetUrl = `/node_modules/${name}/style.css`;\n\n const packageWithMeta = await this.#importPackage({\n name,\n importUrl,\n stylesheetUrl,\n });\n\n return packageWithMeta;\n }\n\n async #loadPackageFromRegistry(name: string): Promise<PackageWithMeta> {\n const importUrl = `${this.#cdnUrl}/${name}/index.js`;\n const stylesheetUrl = `${this.#cdnUrl}/${name}/style.css`;\n const packageWithMeta = await this.#importPackage({\n name,\n importUrl,\n stylesheetUrl,\n });\n\n return packageWithMeta;\n }\n\n async #importPackage(packageMeta: PackageMeta) {\n const { name, importUrl, stylesheetUrl } = packageMeta;\n if (!importUrl) {\n throw new Error(`Import url not defined for package \"${name}\".`);\n }\n\n const importedPackage = (await import(\n /* @vite-ignore */ importUrl\n )) as DocumentModelLib;\n const loadedPackage = convertLegacyLibToVetraPackage(importedPackage);\n\n return {\n name,\n loadedPackage,\n importUrl,\n stylesheetUrl,\n };\n }\n\n async #loadPackage(packageName: string): Promise<PackageWithMeta> {\n if (LOCAL_PACKAGES.includes(packageName)) {\n throw new Error(\n `Package \"${packageName}\" is a local package and cannot be loaded dynamically.`,\n );\n }\n\n // only attemp to load from node_modules in dev mode\n if (!import.meta.env.PROD) {\n try {\n const packageWithMeta =\n await this.#loadPackageFromNodeModules(packageName);\n return packageWithMeta;\n } catch (error) {\n console.warn(\n `Failed to load package \"${packageName}\" from node_modules:`,\n error,\n );\n }\n }\n\n if (!this.registryUrl) {\n throw new Error(\"Registry url not defined.\");\n }\n\n return await this.#loadPackageFromRegistry(packageName);\n }\n\n #registerPackage(packageWithMeta: PackageWithMeta) {\n const { name, loadedPackage, importUrl, stylesheetUrl } = packageWithMeta;\n\n if (stylesheetUrl !== null) {\n this.#mountStylesheet(name, stylesheetUrl);\n }\n this.#packages.set(name, loadedPackage);\n this.#storage.set(name, {\n name,\n importUrl,\n stylesheetUrl,\n });\n\n this.#notifyPackagesChanged();\n }\n\n #mountStylesheet(name: string, href: string) {\n const existing = this.#stylesheets.get(name);\n\n if (existing) return existing;\n\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n\n this.#stylesheets.set(name, link);\n }\n\n #unmountStylesheet(name: string): void {\n const link = this.#stylesheets.get(name);\n if (!link) return;\n\n link.remove();\n this.#stylesheets.delete(name);\n }\n\n #notifyPackagesChanged() {\n this.#packagesMemo = Array.from(this.#packages.values());\n const packages = this.packages;\n this.#subscribers.forEach((handler) => {\n handler({ packages });\n });\n }\n}\n","export type PackagesConfig = {\n packages: string[];\n};\n\nfunction assertPackagesConfig(value: unknown): asserts value is PackagesConfig {\n if (typeof value !== \"object\" || value === null) {\n throw new Error(\"ph-packages.json must be a JSON object\");\n }\n\n const obj = value as Record<string, unknown>;\n\n if (!Array.isArray(obj.packages)) {\n throw new Error(\"ph-packages.json: 'packages' must be an array\");\n }\n\n if (!obj.packages.every((item) => typeof item === \"string\")) {\n throw new Error(\"ph-packages.json: 'packages' must be an array of strings\");\n }\n}\n\nlet cached: PackagesConfig | undefined;\n\nexport async function loadPackagesConfig(): Promise<PackagesConfig> {\n if (cached) return cached;\n\n const basePath = import.meta.env.BASE_URL ?? \"/\";\n const url = `${basePath}ph-packages.json`;\n const res = await fetch(url);\n const json: unknown = await res.json();\n assertPackagesConfig(json);\n cached = json;\n return cached;\n}\n\n/**\n * Returns the cached config synchronously.\n * Must be called after `loadPackagesConfig()` has resolved.\n */\nexport function getPackagesConfig(): PackagesConfig {\n if (!cached) {\n throw new Error(\n \"Packages config not loaded yet. Call loadPackagesConfig() first.\",\n );\n }\n return cached;\n}\n","import { live } from \"@electric-sql/pglite/live\";\nimport { PGliteWorker } from \"@electric-sql/pglite/worker\";\nimport { createRelationalDb } from \"@powerhousedao/shared/processors\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\n\nexport async function getDb() {\n const worker = new Worker(new URL(\"./pglite.worker.js\", import.meta.url), {\n type: \"module\",\n });\n\n const pgLite = await PGliteWorker.create(worker, {\n extensions: { live },\n });\n\n const kysely = new Kysely({\n dialect: new PGliteDialect(pgLite),\n });\n\n const relationalDb = createRelationalDb(kysely);\n\n return { pgLite, relationalDb };\n}\n","import { createAnalyticsStore } from \"@powerhousedao/reactor-browser\";\nimport { type IProcessorHostModule } from \"@powerhousedao/shared/processors\";\nimport { getDb } from \"../pglite.db.js\";\n\nexport async function createProcessorHostModule(): Promise<\n IProcessorHostModule | undefined\n> {\n try {\n const { pgLite, relationalDb } = await getDb();\n const { store: analyticsStore } = await createAnalyticsStore({\n pgLite,\n });\n const processorApp = \"connect\" as const;\n return {\n relationalDb,\n analyticsStore,\n processorApp,\n };\n } catch (error) {\n console.error(`Failed to initialize processor host module:`);\n console.error(error);\n }\n}\n","import { phGlobalConfigFromEnv } from \"@powerhousedao/connect/config\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport {\n addDefaultDrivesForNewReactor,\n createBrowserReactor,\n getDefaultDrivesFromEnv,\n} from \"@powerhousedao/connect/utils\";\nimport {\n addPHEventHandlers,\n addRemoteDrive,\n DocumentCache,\n DocumentChangeType,\n dropAllReactorStorage,\n extractDriveSlugFromPath,\n extractNodeSlugFromPath,\n getDrives,\n login,\n refreshReactorDataClient,\n setDefaultPHGlobalConfig,\n setDocumentCache,\n setDrives,\n setFeatures,\n setPHToast,\n setReactorClient,\n setReactorClientModule,\n setRenown,\n setSelectedDrive,\n setSelectedNode,\n setVetraPackageManager,\n type PHToastFn,\n type VetraPackage,\n} from \"@powerhousedao/reactor-browser\";\nimport type { ProcessorFactoryBuilder } from \"@powerhousedao/shared/processors\";\nimport {\n BrowserKeyStorage,\n RenownBuilder,\n RenownCryptoBuilder,\n} from \"@renown/sdk\";\nimport { logger } from \"document-model\";\nimport { initFeatureFlags } from \"../feature-flags.js\";\nimport { BrowserPackageManager } from \"../package-manager.js\";\nimport { loadPackagesConfig } from \"../packages.config.js\";\nimport { createProcessorHostModule } from \"./processor-host-module.js\";\n\nexport async function clearReactorStorage() {\n const pg = window.ph?.reactorClientModule?.pg;\n if (!pg) {\n throw new Error(\"PGlite not found\");\n }\n\n await dropAllReactorStorage(pg);\n\n await pg.close();\n}\n\nexport async function createReactor(localPackage?: VetraPackage) {\n if (!window.ph) {\n window.ph = {};\n }\n if (window.ph.loading) return;\n\n window.ph.loading = true;\n\n // add window event handlers for updates\n addPHEventHandlers();\n\n // register toast function for use in editor components\n setPHToast(toast as PHToastFn);\n\n // initialize feature flags\n const features = await initFeatureFlags();\n\n logger.info(\n \"Features: @features\",\n JSON.stringify(Object.fromEntries(features), null, 2),\n );\n\n // initialize renown crypto\n const keyPairStorage = await BrowserKeyStorage.create();\n const renownCrypto = await new RenownCryptoBuilder()\n .withKeyPairStorage(keyPairStorage)\n .build();\n\n // initialize Renown\n const renown = await new RenownBuilder(\"connect\", {\n basename: phGlobalConfigFromEnv.routerBasename,\n baseUrl: phGlobalConfigFromEnv.renownUrl,\n })\n .withCrypto(renownCrypto)\n .build();\n\n // load packages list from ph-packages.json (replaceable post-build)\n const packagesConfig = await loadPackagesConfig();\n\n // initialize package manager\n const packageManager = new BrowserPackageManager(\n phGlobalConfigFromEnv.routerBasename ?? \"\",\n PH_PACKAGE_REGISTRY_URL,\n );\n setVetraPackageManager(packageManager);\n await packageManager.init(localPackage);\n const packagesResult = await packageManager.addPackages(\n packagesConfig.packages,\n );\n packagesResult.map((r) => {\n if (r.type === \"error\") console.error(r.error);\n });\n\n // get document models to set in the reactor (all versions)\n const documentModelModules = packageManager.packages\n .flatMap((pkg) => pkg.modules.documentModelModules)\n .filter(\n (module, index, modules) =>\n module !== undefined &&\n // deduplicate by documentType and version\n modules.findIndex(\n (m) =>\n m?.documentType === module.documentType &&\n m.version === module.version,\n ) === index,\n )\n .filter((d) => d !== undefined);\n\n // get upgrade manifests from packages\n const upgradeManifests = packageManager.packages\n .flatMap((pkg) => pkg.upgradeManifests)\n .filter((u) => u !== undefined);\n\n // create reactor v2 with all versions and upgrade manifests\n const reactorClientModule = await createBrowserReactor(\n documentModelModules,\n upgradeManifests,\n renown,\n );\n\n // get the drives from the reactor\n const drives = await getDrives(reactorClientModule.client);\n\n // set the selected drive and node from the path\n const path = window.location.pathname;\n const driveSlug = extractDriveSlugFromPath(path);\n const nodeSlug = extractNodeSlugFromPath(path);\n\n // initialize user from URL parameter\n const didFromUrl = getDidFromUrl();\n await login(didFromUrl, renown);\n\n const documentCache = new DocumentCache(reactorClientModule.client);\n\n // dispatch the events to set the values in the window object\n setDefaultPHGlobalConfig(phGlobalConfigFromEnv);\n setReactorClientModule(reactorClientModule);\n setReactorClient(reactorClientModule.client);\n setDocumentCache(documentCache);\n setRenown(renown);\n setDrives(drives);\n setSelectedDrive(driveSlug);\n setSelectedNode(nodeSlug);\n setFeatures(features);\n\n // Add default drives for new reactor (after window.ph is set up)\n const defaultDrivesConfig = getDefaultDrivesFromEnv();\n if (defaultDrivesConfig.length > 0) {\n await addDefaultDrivesForNewReactor(defaultDrivesConfig);\n }\n\n // if remoteUrl is set and drive not already existing add remote drive and open it\n const remoteUrl = getDriveUrl();\n if (remoteUrl) {\n try {\n await addRemoteDrive(remoteUrl);\n } catch (error) {\n console.error(`Failed to add remote drive from ${remoteUrl}:`, error);\n }\n }\n\n // Subscribe via ReactorClient interface\n const reactorClient = reactorClientModule.client;\n reactorClient.subscribe({ type: \"powerhouse/document-drive\" }, (event) => {\n logger.verbose(\"ReactorClient subscription event: @event\", event);\n refreshReactorDataClient(reactorClientModule.client).catch((e) =>\n logger.error(\"@error\", e),\n );\n });\n\n // Redirect when a currently-viewed document or drive is deleted remotely\n reactorClient.subscribe({}, (event) => {\n if (event.type !== DocumentChangeType.Deleted) return;\n const deletedId = event.context?.childId;\n if (!deletedId) return;\n\n const selectedDriveId = window.ph?.selectedDriveId;\n const selectedNodeId = window.ph?.selectedNodeId;\n\n if (selectedDriveId && deletedId === selectedDriveId) {\n setSelectedDrive(undefined);\n toast(\"The drive you were viewing has been deleted\");\n return;\n }\n\n if (selectedNodeId && deletedId === selectedNodeId) {\n setSelectedNode(undefined);\n toast(\"The document you were editing has been deleted\");\n }\n });\n\n // Refresh from ReactorClient to pick up any synced drives\n await refreshReactorDataClient(reactorClientModule.client);\n\n // Setup processor factories for packages that have them\n const packagesWithProcessorFactories = packageManager.packages.filter(\n (\n pkg,\n ): pkg is VetraPackage & { processorFactory: ProcessorFactoryBuilder } =>\n pkg.processorFactory !== undefined,\n );\n\n if (packagesWithProcessorFactories.length > 0) {\n const processorHostModule = await createProcessorHostModule();\n if (processorHostModule !== undefined) {\n await Promise.all(\n packagesWithProcessorFactories.map(async (pkg) => {\n const { id, name, processorFactory } = pkg;\n logger.info(\"Loading processor factory: @name\", name);\n try {\n const factory = await processorFactory(processorHostModule);\n await reactorClientModule.reactorModule?.processorManager.registerFactory(\n id,\n factory,\n );\n } catch (error) {\n logger.error(`Error registering processor: @name`, name);\n logger.error(\"@error\", error);\n }\n }),\n );\n }\n }\n\n window.ph.loading = false;\n}\n\nfunction getDidFromUrl() {\n const searchParams = new URLSearchParams(window.location.search);\n const didComponent = searchParams.get(\"user\");\n const did = didComponent ? decodeURIComponent(didComponent) : undefined;\n return did;\n}\n\nfunction getDriveUrl() {\n const searchParams = new URLSearchParams(window.location.search);\n const driveUrl = searchParams.get(\"driveUrl\");\n const url = driveUrl ? decodeURIComponent(driveUrl) : undefined;\n return url;\n}\n"],"mappings":"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"}
|
|
@@ -404,7 +404,7 @@ function ErrorBoundary$1(props) {
|
|
|
404
404
|
//#endregion
|
|
405
405
|
//#region src/components/modal/modals-container.tsx
|
|
406
406
|
const AddDriveModal$1 = lazy(() => import("./AddDriveModal-A2SuEFot.js").then((m) => ({ default: m.AddDriveModal })));
|
|
407
|
-
const ClearStorageModal = lazy(() => import("./ClearStorageModal-
|
|
407
|
+
const ClearStorageModal = lazy(() => import("./ClearStorageModal-Cdq-bPvv.js").then((m) => ({ default: m.ClearStorageModal })));
|
|
408
408
|
const CookiesPolicyModal = lazy(() => import("./CookiesPolicyModal-Gae1QuhA.js").then((m) => ({ default: m.CookiesPolicyModal })));
|
|
409
409
|
const CreateDocumentModal$1 = lazy(() => import("./CreateDocumentModal-5i6rmv3C.js").then((m) => ({ default: m.CreateDocumentModal })));
|
|
410
410
|
const DebugSettingsModal = lazy(() => import("./DebugSettingsModal-Ko7M_1hz.js").then((m) => ({ default: m.DebugSettingsModal })));
|
|
@@ -413,7 +413,7 @@ const DeleteItemModal = lazy(() => import("./DeleteItemModal-CkWegLlh.js").then(
|
|
|
413
413
|
const DisclaimerModal = lazy(() => import("./DisclaimerModal-CCnvwoB5.js").then((m) => ({ default: m.DisclaimerModal })));
|
|
414
414
|
const DriveSettingsModal$1 = lazy(() => import("./DriveSettingsModal-DxMjOsLg.js").then((m) => ({ default: m.DriveSettingsModal })));
|
|
415
415
|
const ExportDocumentWithErrorsModal = lazy(() => import("./ExportDocumentWithErrorsModal-hgliF8Gy.js").then((m) => ({ default: m.ExportDocumentWithErrorsModal })));
|
|
416
|
-
const SettingsModal$1 = lazy(() => import("./SettingsModal-
|
|
416
|
+
const SettingsModal$1 = lazy(() => import("./SettingsModal-rNEeEyNO.js").then((m) => ({ default: m.SettingsModal })));
|
|
417
417
|
const UpgradeDriveModal = lazy(() => import("./UpgradeDriveModal-DldcNCaT.js").then((m) => ({ default: m.UpgradeDriveModal })));
|
|
418
418
|
const modalComponents = {
|
|
419
419
|
addDrive: AddDriveModal$1,
|
|
@@ -449,7 +449,7 @@ const ModalsContainer = lazy(async () => {
|
|
|
449
449
|
//#endregion
|
|
450
450
|
//#region src/components/app-loader.tsx
|
|
451
451
|
const AppLoader = (props) => {
|
|
452
|
-
const Load = lazy(() => import("./load-
|
|
452
|
+
const Load = lazy(() => import("./load-CWYw130N.js").then((m) => m.loadComponent(props.localPackage)));
|
|
453
453
|
return /* @__PURE__ */ jsxs(StrictMode, { children: [
|
|
454
454
|
/* @__PURE__ */ jsx(Suspense, {
|
|
455
455
|
fallback: /* @__PURE__ */ jsx(AppSkeleton, {}),
|
|
@@ -1144,4 +1144,4 @@ function Sidebar() {
|
|
|
1144
1144
|
//#endregion
|
|
1145
1145
|
export { AppLoader as t };
|
|
1146
1146
|
|
|
1147
|
-
//# sourceMappingURL=sidebar-
|
|
1147
|
+
//# sourceMappingURL=sidebar-CP_Du6Zs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar-Bhnmtf8R.js","names":["listeners","getInitial","subscribe","logger","logger","ErrorBoundary","ReactErrorBoundary","AddDriveModal","CreateDocumentModal","DriveSettingsModal","SettingsModal","ErrorBoundary","CookieBanner","CookieBanner","PHCookieBanner","ErrorBoundary","ErrorBoundary","ErrorBoundary"],"sources":["../src/hooks/useAcceptedCookies.ts","../src/hooks/useCookieBanner.ts","../src/hooks/useInitSentry.ts","../src/hooks/useUndoRedoShortcuts.ts","../src/components/analytics.tsx","../src/utils/browser.ts","../src/utils/document-editor-debug-tools.ts","../src/components/app-skeleton.tsx","../src/components/error-boundary.tsx","../src/components/modal/modals-container.tsx","../src/components/app-loader.tsx","../src/context/sentry-provider.tsx","../src/components/app.tsx","../src/components/cookie-banner.tsx","../src/components/document-editor-container.tsx","../src/components/editor-loader.tsx","../src/components/drive-editor-container.tsx","../src/components/drive-icon.tsx","../src/components/editors.tsx","../src/components/root.tsx","../src/pages/content.tsx","../src/pages/demo/atlas-import.tsx","../src/components/router.tsx","../src/components/sidebar.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useSyncExternalStore } from \"react\";\n\nconst namespace = connectConfig.routerBasename;\n\nconst ACCEPTED_COOKIES_KEY_STORAGE = `${namespace}:acceptedCookies`;\n\nexport interface AcceptedCookies {\n analytics: boolean;\n marketing: boolean;\n functional: boolean;\n}\n\nconst listeners = new Set<() => void>();\n\nlet cookies: AcceptedCookies = getInitial();\n\nfunction getInitial(): AcceptedCookies {\n try {\n const value = localStorage.getItem(ACCEPTED_COOKIES_KEY_STORAGE);\n return value\n ? (JSON.parse(value) as AcceptedCookies)\n : { analytics: false, marketing: false, functional: false };\n } catch {\n return { analytics: false, marketing: false, functional: false };\n }\n}\n\nfunction getCookies(): AcceptedCookies {\n return cookies;\n}\n\nfunction setCookies(setter: (prev: AcceptedCookies) => AcceptedCookies) {\n cookies = setter(cookies);\n localStorage.setItem(ACCEPTED_COOKIES_KEY_STORAGE, JSON.stringify(cookies));\n listeners.forEach((fn) => fn());\n}\n\nfunction subscribe(fn: () => void) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n}\n\nexport const useAcceptedCookies = () => {\n const cookies = useSyncExternalStore(subscribe, getCookies, getCookies);\n return [cookies, setCookies] as const;\n};\n","import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useSyncExternalStore } from \"react\";\n\nconst namespace = connectConfig.routerBasename;\n\nexport const COOKIE_BANNER_KEY_STORAGE = `${namespace}:display-cookie-banner`;\n\nconst listeners = new Set<() => void>();\n\nlet bannerShown = getInitial();\n\nfunction getInitial(): boolean {\n try {\n const value = localStorage.getItem(COOKIE_BANNER_KEY_STORAGE);\n return value !== \"false\";\n } catch (error) {\n console.error(error);\n return true;\n }\n}\n\nfunction getCookieBannerState(): boolean {\n return bannerShown;\n}\n\nfunction setCookieBannerState(state: boolean) {\n bannerShown = state;\n localStorage.setItem(COOKIE_BANNER_KEY_STORAGE, JSON.stringify(state));\n}\n\nfunction subscribe(fn: () => void) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n}\n\nexport const useCookieBanner = () => {\n const cookieBannerShown = useSyncExternalStore(\n subscribe,\n getCookieBannerState,\n getCookieBannerState,\n );\n return [cookieBannerShown, setCookieBannerState] as const;\n};\n","import { connectConfig } from \"@powerhousedao/connect/config\";\n\nimport type { BrowserOptions } from \"@sentry/react\";\n\nimport { childLogger } from \"document-model\";\nimport React, { useEffect } from \"react\";\nimport {\n createRoutesFromChildren,\n matchRoutes,\n useLocation,\n useNavigationType,\n} from \"react-router-dom\";\nimport { useAcceptedCookies } from \"./useAcceptedCookies.js\";\n\nconst logger = childLogger([\"sentry\"]);\n\nlet clientStarted = false;\n\nasync function getSentry() {\n return await import(\"@sentry/react\");\n}\n\nasync function initSentry() {\n const release = connectConfig.sentry;\n\n const Sentry = await getSentry();\n const integrations: BrowserOptions[\"integrations\"] = [\n Sentry.httpClientIntegration(),\n Sentry.extraErrorDataIntegration({ depth: 5 }),\n Sentry.replayIntegration(),\n Sentry.captureConsoleIntegration({ levels: [\"error\"] }),\n ];\n if (connectConfig.sentry.tracing) {\n integrations.push(\n Sentry.reactRouterV6BrowserTracingIntegration({\n useEffect: React.useEffect,\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n }),\n );\n }\n\n Sentry.init({\n release: connectConfig.sentry.release,\n dsn: connectConfig.sentry.dsn,\n environment: connectConfig.sentry.env,\n integrations,\n ignoreErrors: [\n \"User is not allowed to create files\",\n \"User is not allowed to move documents\",\n \"The user aborted a request.\",\n ],\n sendDefaultPii: true,\n tracesSampleRate: 1.0,\n replaysSessionSampleRate: 0.1,\n replaysOnErrorSampleRate: 1.0,\n beforeSend(event, hint) {\n const error = hint.originalException;\n if (\n error instanceof TypeError &&\n error.message.includes(\"Failed to fetch\") &&\n !navigator.onLine\n ) {\n // If fetch fails because user is offline then ignores the error\n return null;\n }\n return event;\n },\n });\n\n clientStarted = true;\n}\n\nasync function closeClient() {\n if (!clientStarted) {\n return;\n }\n const sentry = await getSentry();\n const client = sentry.getClient();\n return client?.close();\n}\n\nexport function useInitSentry() {\n const [acceptedCookies] = useAcceptedCookies();\n const { analytics } = acceptedCookies;\n\n useEffect(() => {\n if (!analytics) {\n closeClient().catch((error: unknown) => logger.error(\"@error\", error));\n return;\n }\n\n if (\n clientStarted ||\n !connectConfig.sentry.dsn ||\n connectConfig.sentry.dsn === \"\"\n ) {\n return;\n }\n\n initSentry().catch((error: unknown) => logger.error(\"@error\", error));\n }, [analytics]);\n}\n","import { useHotkeys } from \"react-hotkeys-hook\";\n\nexport interface UseUndoRedoShortcutsProps {\n undo: () => void;\n redo: () => void;\n canUndo: boolean;\n canRedo: boolean;\n}\n\nexport const useUndoRedoShortcuts = (props: UseUndoRedoShortcutsProps) => {\n const { undo, redo, canRedo, canUndo } = props;\n const isMac = window.navigator.userAgent.includes(\"Mac\");\n\n let undoShortcut = \"ctrl+z\";\n let redoShortcut = \"ctrl+y\";\n\n if (isMac) {\n undoShortcut = \"mod+z\";\n redoShortcut = \"mod+shift+z\";\n }\n\n // set handler for undo\n useHotkeys(\n undoShortcut,\n (event) => {\n event.preventDefault();\n if (canUndo) {\n undo();\n }\n },\n {},\n [canUndo, undo],\n );\n\n // set handler for redo\n useHotkeys(\n redoShortcut,\n (event) => {\n event.preventDefault();\n if (canRedo) {\n redo();\n }\n },\n {},\n [canRedo, redo],\n );\n};\n","import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useAcceptedCookies } from \"@powerhousedao/connect/hooks\";\nimport { useEffect } from \"react\";\n\ndeclare global {\n interface Window {\n gtag?: (...args: any[]) => void;\n dataLayer?: any[];\n }\n}\n\nfunction gtag(...args: (string | Date)[]) {\n window.dataLayer?.push(...args);\n}\n\nexport const Analytics = () => {\n const gaTrackingId = connectConfig.gaTrackingId;\n const [{ analytics }] = useAcceptedCookies();\n const useAnalytics = gaTrackingId && analytics;\n\n useEffect(() => {\n if (useAnalytics) {\n // Create the GA script tag\n const script = document.createElement(\"script\");\n script.src = `https://www.googletagmanager.com/gtag/js?id=${gaTrackingId}`;\n script.async = true;\n document.head.appendChild(script);\n\n // Initialize GA\n window.dataLayer = window.dataLayer || [];\n\n gtag(\"js\", new Date());\n gtag(\"config\", gaTrackingId);\n\n // Clean up the script if no longer enabled\n return () => {\n document.head.removeChild(script);\n };\n }\n }, [useAnalytics, gaTrackingId]);\n\n return null;\n};\n","export function getBasePath() {\n if (typeof document === \"undefined\") {\n return \"/\";\n }\n\n const baseEl = document.querySelector(\"base\");\n const href = baseEl?.getAttribute(\"href\");\n return href || \"/\";\n}\n","import type {\n Operation,\n PHDocument,\n} from \"@powerhousedao/shared/document-model\";\n\nexport class DocumentEditorDebugTools {\n private document: PHDocument | undefined;\n private operations: Operation[] = [];\n\n constructor(document?: PHDocument) {\n if (document) {\n this.document = document;\n }\n }\n\n private operationsToTableObject(operations: Operation[]) {\n return operations.map((op) => ({\n ...op,\n input: JSON.stringify(op.action.input),\n }));\n }\n\n public setDocument(document: PHDocument) {\n this.document = document;\n }\n\n public getDocument() {\n return this.document;\n }\n\n public getOperations() {\n return this.operations;\n }\n\n public pushOperation(operation: Operation) {\n this.operations.push(operation);\n }\n\n public operationsTable() {\n if (!this.document) {\n console.warn(\"No document\");\n }\n const ops = Object.values(this.document?.operations || {})\n .filter((array): array is Operation[] => array !== undefined)\n .flatMap((array) => array)\n .sort((a, b) => a.index - b.index);\n\n console.table(this.operationsToTableObject(ops));\n }\n\n public scopeOperationsTable(scope: string) {\n if (!this.document) {\n console.warn(\"No document\");\n }\n const ops = this.document?.operations[scope] || [];\n console.table(this.operationsToTableObject(ops));\n }\n\n public operationsLog() {\n console.log(this.operations);\n }\n\n public operationsLogTable() {\n console.table(this.operationsToTableObject(this.operations));\n }\n\n public clear() {\n this.operations = [];\n this.document = undefined;\n }\n}\n","import { getBasePath } from \"@powerhousedao/connect/utils\";\nimport {\n AnimatedLoader,\n ConnectSidebar,\n HomeScreen,\n} from \"@powerhousedao/design-system/connect\";\nimport { useEffect, useState } from \"react\";\nconst LOADER_DELAY = 250;\n\nconst Loader = ({ delay = LOADER_DELAY }: { delay?: number }) => {\n const isSSR = typeof window === \"undefined\";\n const showInitialLoader =\n typeof document !== \"undefined\" &&\n document.body.getAttribute(\"data-show-loader\") === \"true\";\n\n const [showLoading, setShowLoading] = useState(!delay || showInitialLoader);\n\n useEffect(() => {\n const id = setTimeout(() => {\n setShowLoading(true);\n }, delay);\n\n return () => clearTimeout(id);\n }, []);\n\n return (\n <div\n className={`skeleton-loader absolute inset-0 z-10 flex items-center justify-center ${showLoading ? \"\" : \"hidden\"}`}\n >\n <div className=\"animate-pulse overflow-hidden rounded-full shadow-lg\">\n <AnimatedLoader />\n </div>\n {isSSR ? (\n <script\n dangerouslySetInnerHTML={{\n __html: `setTimeout(() => {\n document.querySelector('.skeleton-loader')?.classList.remove('hidden');\n document.body.setAttribute('data-show-loader', 'true');\n }, ${delay})`,\n }}\n />\n ) : null}\n </div>\n );\n};\n\nexport const AppSkeleton = () => {\n const isSSR = typeof window === \"undefined\";\n const isHomeScreen = !isSSR && window.location.pathname === getBasePath();\n return (\n <div className=\"flex h-screen\">\n <ConnectSidebar\n className=\"animate-pulse\"\n onLogin={undefined}\n onDisconnect={undefined}\n onClickSettings={undefined}\n address={undefined}\n />\n <HomeScreen\n containerClassName={\n isSSR || !isHomeScreen ? \"hidden home-screen\" : undefined\n }\n children={null}\n />\n {isSSR ? (\n <script\n dangerouslySetInnerHTML={{\n __html: `\n const baseEl = document.querySelector('base');\n const href = baseEl?.getAttribute('href');\n const basePath = href || '/';\n if (window.location.pathname === basePath) {\n document.querySelector('.home-screen')?.classList.remove('hidden')\n }`,\n }}\n />\n ) : null}\n <Loader />\n </div>\n );\n};\n\nexport default AppSkeleton;\n","import { childLogger } from \"document-model\";\nimport type { ReactNode } from \"react\";\nimport {\n ErrorBoundary as ReactErrorBoundary,\n type FallbackProps,\n} from \"react-error-boundary\";\n\nconst logger = childLogger([\"Connect\"]);\n\n/**\n * Available fallback UI variants for the ErrorBoundary component.\n *\n * - `\"silent\"` - Renders nothing when an error occurs (useful for modals)\n * - `\"text\"` - Displays a simple centered text message\n * - `\"detailed\"` - Shows full error details including message and JSON representation\n */\ntype ErrorFallbackVariant = \"silent\" | \"text\" | \"detailed\";\n\n/**\n * Base props shared by all ErrorBoundary configurations.\n */\ntype BaseErrorBoundaryProps = {\n /** Content to wrap with error boundary protection */\n children: ReactNode;\n /** Optional callback invoked when an error is caught (in addition to logging) */\n onError?: (error: Error, info: React.ErrorInfo) => void;\n /** When any value in this array changes, the error boundary resets */\n resetKeys?: unknown[];\n /** Logger context path for error logging (e.g., [\"Connect\", \"Editor\"]) */\n loggerContext?: string[];\n};\n\n/**\n * Props for using a predefined fallback variant.\n */\ntype VariantErrorBoundaryProps = BaseErrorBoundaryProps & {\n /** The fallback UI variant to display on error */\n variant: ErrorFallbackVariant;\n /** Custom message for the \"text\" variant (default: \"Something went wrong\") */\n fallbackMessage?: string;\n};\n\n/**\n * Props for using a custom fallback render function.\n */\ntype CustomFallbackErrorBoundaryProps = BaseErrorBoundaryProps & {\n /** Custom render function for the fallback UI */\n fallbackRender: (props: FallbackProps) => ReactNode;\n};\n\n/**\n * Union type for all ErrorBoundary prop configurations.\n * Use either a variant or a custom fallbackRender, but not both.\n */\ntype ErrorBoundaryProps =\n | VariantErrorBoundaryProps\n | CustomFallbackErrorBoundaryProps;\n\nfunction hasCustomFallback(\n props: ErrorBoundaryProps,\n): props is CustomFallbackErrorBoundaryProps {\n return \"fallbackRender\" in props;\n}\n\nfunction SilentFallback() {\n return null;\n}\n\n/**\n * Simple text-based fallback component.\n * Displays a centered message when an error occurs.\n */\nfunction TextFallback({\n message = \"Something went wrong\",\n}: {\n message?: string;\n}) {\n return <div className=\"text-center\">{message}</div>;\n}\n\n/**\n * Detailed fallback component showing full error information.\n * Displays error message and JSON representation of the error object.\n * Useful for development and debugging purposes.\n */\nfunction DetailedFallback({ error }: FallbackProps) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return (\n <div className=\"mx-auto flex max-w-[80%] flex-1 flex-col items-center justify-center\">\n <h1 className=\"mb-2 text-xl font-semibold\">Error</h1>\n <i>{errorMessage}</i>\n <pre>{JSON.stringify(error, null, 2)}</pre>\n </div>\n );\n}\n\n/**\n * Centered error message fallback component.\n * Displays the error message in a centered, full-size container.\n * Suitable for use as a custom fallbackRender when you need simple error display.\n */\nfunction CenteredErrorMessage({ error }: FallbackProps) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return (\n <div className=\"flex size-full items-center justify-center\">\n <h3 className=\"text-lg font-semibold\">{errorMessage}</h3>\n </div>\n );\n}\n\nfunction getFallbackComponent(\n variant: ErrorFallbackVariant,\n fallbackMessage?: string,\n): (props: FallbackProps) => ReactNode {\n switch (variant) {\n case \"silent\":\n return SilentFallback;\n case \"text\":\n return () => <TextFallback message={fallbackMessage} />;\n case \"detailed\":\n return DetailedFallback;\n default:\n return CenteredErrorMessage;\n }\n}\n\n/**\n * Unified error boundary component for catching and handling React errors.\n *\n * Built on top of `react-error-boundary`, this component provides:\n * - Automatic error logging with configurable context\n * - Multiple fallback UI variants (silent, text, detailed)\n * - Support for custom fallback render functions\n * - Reset capability via `resetKeys`\n *\n * @example\n * // Using a predefined variant\n * <ErrorBoundary variant=\"detailed\" loggerContext={[\"Connect\", \"Editor\"]}>\n * <EditorComponent />\n * </ErrorBoundary>\n *\n * @example\n * // Using a custom message with the text variant\n * <ErrorBoundary variant=\"text\" fallbackMessage=\"Failed to load drives\">\n * <DrivesList />\n * </ErrorBoundary>\n *\n * @example\n * // Using a custom fallback render\n * <ErrorBoundary\n * fallbackRender={CenteredErrorMessage}\n * onError={(error) => trackError(error)}\n * >\n * <MyComponent />\n * </ErrorBoundary>\n *\n * @example\n * // Silent mode for modals (renders null on error)\n * <ErrorBoundary variant=\"silent\" loggerContext={[\"Connect\", \"Modals\"]}>\n * <ModalContent />\n * </ErrorBoundary>\n */\nexport function ErrorBoundary(props: ErrorBoundaryProps) {\n const { children, onError, resetKeys, loggerContext } = props;\n\n const handleError = (error: Error, info: React.ErrorInfo) => {\n if (\n error.message.includes(\"Failed to fetch dynamically imported module\") &&\n error.message.includes(\"node_modules/.vite\")\n ) {\n console.error(error);\n console.log(\"Outdated chunk detected, reloading page...\");\n window.location.reload();\n return;\n }\n\n const contextLogger = loggerContext ? childLogger(loggerContext) : logger;\n contextLogger.error(\"@error @info\", error, info);\n onError?.(error, info);\n };\n\n const fallbackRender = hasCustomFallback(props)\n ? props.fallbackRender\n : getFallbackComponent(props.variant, props.fallbackMessage);\n\n return (\n <ReactErrorBoundary\n fallbackRender={fallbackRender}\n onError={handleError}\n resetKeys={resetKeys}\n >\n {children}\n </ReactErrorBoundary>\n );\n}\n\nexport { CenteredErrorMessage, DetailedFallback, TextFallback };\nexport type { FallbackProps };\n","import { usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { lazy, Suspense } from \"react\";\nimport { ErrorBoundary } from \"../error-boundary.js\";\n\nconst AddDriveModal = lazy(() =>\n import(\"./modals/AddDriveModal.js\").then((m) => ({\n default: m.AddDriveModal,\n })),\n);\nconst ClearStorageModal = lazy(() =>\n import(\"./modals/ClearStorageModal.js\").then((m) => ({\n default: m.ClearStorageModal,\n })),\n);\nconst CookiesPolicyModal = lazy(() =>\n import(\"./modals/CookiesPolicyModal.js\").then((m) => ({\n default: m.CookiesPolicyModal,\n })),\n);\nconst CreateDocumentModal = lazy(() =>\n import(\"./modals/CreateDocumentModal.js\").then((m) => ({\n default: m.CreateDocumentModal,\n })),\n);\nconst DebugSettingsModal = lazy(() =>\n import(\"./modals/DebugSettingsModal.js\").then((m) => ({\n default: m.DebugSettingsModal,\n })),\n);\nconst DeleteDriveModal = lazy(() =>\n import(\"./modals/DeleteDriveModal.js\").then((m) => ({\n default: m.DeleteDriveModal,\n })),\n);\nconst DeleteItemModal = lazy(() =>\n import(\"./modals/DeleteItemModal.js\").then((m) => ({\n default: m.DeleteItemModal,\n })),\n);\nconst DisclaimerModal = lazy(() =>\n import(\"./modals/DisclaimerModal.js\").then((m) => ({\n default: m.DisclaimerModal,\n })),\n);\nconst DriveSettingsModal = lazy(() =>\n import(\"./modals/DriveSettingsModal.js\").then((m) => ({\n default: m.DriveSettingsModal,\n })),\n);\nconst ExportDocumentWithErrorsModal = lazy(() =>\n import(\"./modals/ExportDocumentWithErrorsModal.js\").then((m) => ({\n default: m.ExportDocumentWithErrorsModal,\n })),\n);\nconst SettingsModal = lazy(() =>\n import(\"./modals/SettingsModal.js\").then((m) => ({\n default: m.SettingsModal,\n })),\n);\nconst UpgradeDriveModal = lazy(() =>\n import(\"./modals/UpgradeDriveModal.js\").then((m) => ({\n default: m.UpgradeDriveModal,\n })),\n);\nconst InspectorModal = lazy(() =>\n import(\"./modals/InspectorModal/index.js\").then((m) => ({\n default: m.InspectorModal,\n })),\n);\nconst MissingPackageModal = lazy(() =>\n import(\"./modals/MissingPackageModal.js\").then((m) => ({\n default: m.ConnectMissingPackageModal,\n })),\n);\nconst modalComponents = {\n addDrive: AddDriveModal,\n clearStorage: ClearStorageModal,\n cookiesPolicy: CookiesPolicyModal,\n createDocument: CreateDocumentModal,\n debugSettings: DebugSettingsModal,\n deleteDrive: DeleteDriveModal,\n deleteItem: DeleteItemModal,\n disclaimer: DisclaimerModal,\n driveSettings: DriveSettingsModal,\n exportDocumentWithErrors: ExportDocumentWithErrorsModal,\n inspector: InspectorModal,\n settings: SettingsModal,\n upgradeDrive: UpgradeDriveModal,\n missingPackage: MissingPackageModal,\n} as const;\n\nexport const ModalsContainer = lazy(async () => {\n return {\n default: () => {\n const phModal = usePHModal();\n\n if (!phModal?.type) return null;\n\n const ModalComponent = modalComponents[phModal.type];\n\n return ModalComponent ? (\n <ErrorBoundary variant=\"silent\" loggerContext={[\"Connect\", \"Modals\"]}>\n <Suspense fallback={null}>\n <ModalComponent />\n </Suspense>\n </ErrorBoundary>\n ) : null;\n },\n };\n});\n","import \"@powerhousedao/connect/i18n\";\nimport type { VetraPackage } from \"@powerhousedao/reactor-browser\";\nimport { lazy, StrictMode, Suspense } from \"react\";\nimport AppSkeleton from \"./app-skeleton.js\";\nimport { App, CookieBanner } from \"./index.js\";\nimport { ModalsContainer } from \"./modal/modals-container.js\";\n\nexport const AppLoader = (props: { localPackage?: VetraPackage }) => {\n const Load = lazy(() =>\n import(\"./load.js\").then((m) => m.loadComponent(props.localPackage)),\n );\n return (\n <StrictMode>\n <Suspense fallback={<AppSkeleton />} name=\"AppLoader\">\n <Load {...props}>\n <App />\n </Load>\n </Suspense>\n <Suspense name=\"CookieBanner\">\n <CookieBanner />\n </Suspense>\n <Suspense name=\"ModalsContainer\">\n <ModalsContainer />\n </Suspense>\n </StrictMode>\n );\n};\n","import { useInitSentry } from \"@powerhousedao/connect/hooks\";\n\ninterface SentryProviderProps {\n children?: React.ReactNode;\n}\n\nexport const SentryProvider: React.FC<SentryProviderProps> = ({ children }) => {\n useInitSentry();\n\n return children;\n};\n","import { Analytics, Router } from \"@powerhousedao/connect/components\";\n\nimport { SentryProvider } from \"@powerhousedao/connect/context\";\nimport {\n DocumentEditorDebugTools,\n serviceWorkerManager,\n} from \"@powerhousedao/connect/utils\";\nimport {\n ToastContainer,\n WagmiContext,\n} from \"@powerhousedao/design-system/connect\";\nimport { useEffect } from \"react\";\nexport const App = () => {\n // refresh page on vite preload error due to outdated chunks\n useEffect(() => {\n const handlePreloadError = () => {\n console.log(\"Outdated chunks detected, reloading page...\");\n window.location.reload();\n };\n\n window.addEventListener(\"vite:preloadError\", handlePreloadError);\n\n return () => {\n window.removeEventListener(\"vite:preloadError\", handlePreloadError);\n };\n }, []);\n\n useEffect(() => {\n if (import.meta.env.MODE === \"development\") {\n window.documentEditorDebugTools = new DocumentEditorDebugTools();\n } else {\n serviceWorkerManager.registerServiceWorker(false);\n }\n }, []);\n\n return (\n <SentryProvider>\n <WagmiContext>\n <ToastContainer position=\"bottom-right\" containerId=\"connect\" />\n <Router />\n <Analytics />\n </WagmiContext>\n </SentryProvider>\n );\n};\n","import {\n useAcceptedCookies,\n useCookieBanner,\n} from \"@powerhousedao/connect/hooks\";\nimport type { CookieInput } from \"@powerhousedao/design-system/connect\";\nimport { CookieBanner as PHCookieBanner } from \"@powerhousedao/design-system/connect\";\nimport { showPHModal } from \"@powerhousedao/reactor-browser\";\nimport { Trans, useTranslation } from \"react-i18next\";\nimport { i18n } from \"@powerhousedao/connect/i18n\";\n\nconst isCookieAccepted = (cookies: CookieInput[], id: string) => {\n return cookies.some((cookie) => cookie.id === id && cookie.value);\n};\n\nexport const CookieBanner = () => {\n const { t } = useTranslation(undefined, {\n useSuspense: true,\n i18n,\n });\n const [showBanner, setShowBanner] = useCookieBanner();\n const [, setAcceptedCookies] = useAcceptedCookies();\n\n const cookiesInput: CookieInput[] = [\n {\n id: \"analytics-cookie\",\n label: t(\"cookieBanner.cookies.analytics\"),\n value: true,\n },\n ];\n\n const handleAccept = (cookies: CookieInput[]) => {\n setShowBanner(false);\n\n if (isCookieAccepted(cookies, \"analytics-cookie\")) {\n setAcceptedCookies((acceptedCookies) => ({\n ...acceptedCookies,\n analytics: true,\n }));\n }\n };\n\n const handleReject = () => {\n setShowBanner(false);\n setAcceptedCookies(() => ({\n analytics: false,\n functional: false,\n marketing: false,\n }));\n };\n\n if (!showBanner) {\n return null;\n }\n\n return (\n <div className=\"absolute inset-0 z-[10000] backdrop-blur-sm\">\n <div className=\"absolute inset-0 bg-black opacity-15\" />\n <div className=\"absolute inset-x-0 bottom-0 flex justify-center bg-white px-10 pb-16 pt-10 shadow-lg\">\n <PHCookieBanner\n className=\"max-w-[1024px]\"\n cookies={cookiesInput}\n onSubmit={handleAccept}\n onReject={handleReject}\n submitLabel={t(\"cookieBanner.accept\")}\n rejectLabel={t(\"cookieBanner.reject\")}\n >\n <p className=\"font-semibold text-gray-500\">\n <Trans\n key={\"cookieBanner.message\"}\n i18nKey=\"cookieBanner.message\"\n components={{\n a: (\n <a\n onClick={() => showPHModal({ type: \"cookiesPolicy\" })}\n key={\"cookieBanner.message-link\"}\n className=\"cursor-pointer text-gray-900 hover:underline\"\n />\n ),\n }}\n />\n </p>\n </PHCookieBanner>\n </div>\n </div>\n );\n};\n","import { DocumentEditor } from \"@powerhousedao/connect/components\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport {\n exportFile,\n setSelectedNode,\n showPHModal,\n useNodeParentFolderById,\n useSelectedDocument,\n validateDocument,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function DocumentEditorContainer() {\n const [selectedDocument] = useSelectedDocument();\n const parentFolder = useNodeParentFolderById(selectedDocument.header.id);\n\n const onExport = useCallback(() => {\n const validationErrors = validateDocument(selectedDocument);\n\n if (validationErrors.length) {\n showPHModal({\n type: \"exportDocumentWithErrors\",\n documentId: selectedDocument.header.id,\n });\n } else {\n exportFile(selectedDocument).catch((error: any) => {\n console.error(error);\n const errorMessage =\n error instanceof Error\n ? error.message\n : JSON.stringify(error, null, 1);\n toast(`Failed to export document: ${errorMessage}`);\n });\n }\n }, [selectedDocument]);\n\n // TODO: unused\n const onOpenSwitchboardLink = useMemo(() => {\n return async () => {\n //\n };\n }, []);\n\n const onClose = useCallback(() => {\n setSelectedNode(parentFolder);\n }, [parentFolder, setSelectedNode]);\n\n return (\n <div\n id=\"document-editor-container\"\n className=\"flex-1\"\n data-document-type={selectedDocument.header.documentType}\n >\n <DocumentEditor\n document={selectedDocument}\n onClose={onClose}\n onExport={onExport}\n onOpenSwitchboardLink={onOpenSwitchboardLink}\n />\n </div>\n );\n}\n","import { DefaultEditorLoader } from \"@powerhousedao/design-system/connect\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { useEffect, useState } from \"react\";\n\ntype Props = ComponentProps<typeof DefaultEditorLoader> & {\n loadingTimeout?: number;\n customEditorLoader?: ReactNode;\n};\nexport function EditorLoader(props: Props) {\n const [showLoading, setShowLoading] = useState(false);\n\n // only shows the loader after some time has passed\n useEffect(() => {\n setTimeout(() => {\n setShowLoading(true);\n }, props.loadingTimeout ?? 200);\n }, [props]);\n\n if (!showLoading) return null;\n\n const { customEditorLoader, ...defaultProps } = props;\n\n if (customEditorLoader) return <>{customEditorLoader}</>;\n\n return <DefaultEditorLoader {...defaultProps} />;\n}\n","import { GenericDriveExplorer } from \"@powerhousedao/powerhouse-vetra-packages/editors\";\nimport { DropZoneWrapper } from \"@powerhousedao/design-system/connect\";\nimport {\n useDefaultDriveEditorModule,\n useDriveEditorModuleById,\n useSelectedDocumentId,\n useSelectedDrive,\n} from \"@powerhousedao/reactor-browser\";\nimport { Suspense } from \"react\";\nimport { DocumentEditorContainer } from \"./document-editor-container.js\";\nimport { EditorLoader } from \"./editor-loader.js\";\nimport { ErrorBoundary } from \"./error-boundary.js\";\n\nexport function DriveEditorContainer() {\n const [selectedDrive] = useSelectedDrive();\n const selectedDocumentId = useSelectedDocumentId();\n\n const driveEditor = useDriveEditorModuleById(\n selectedDrive.header.meta?.preferredEditor,\n );\n const defaultDriveEditor = useDefaultDriveEditorModule();\n\n const DriveEditorComponent =\n driveEditor?.Component ??\n defaultDriveEditor?.Component ??\n GenericDriveExplorer.Component;\n\n if (!DriveEditorComponent) {\n throw new Error(\"No drive editor component found\");\n }\n return (\n <ErrorBoundary\n variant=\"detailed\"\n resetKeys={[selectedDrive.header.id]}\n loggerContext={[\"Connect\", \"DriveEditor\"]}\n >\n <Suspense fallback={<EditorLoader />}>\n <DropZoneWrapper className=\"flex h-full flex-col overflow-auto\">\n <DriveEditorComponent>\n {selectedDocumentId ? <DocumentEditorContainer /> : null}\n </DriveEditorComponent>\n </DropZoneWrapper>\n </Suspense>\n </ErrorBoundary>\n );\n}\n","import { Icon } from \"@powerhousedao/design-system\";\nimport { driveCollectionId, useSyncList } from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport { useMemo } from \"react\";\n\nexport function DriveIcon({\n drive,\n}: {\n drive: DocumentDriveDocument | undefined;\n}) {\n const remotes = useSyncList();\n const isRemoteDrive = useMemo(() => {\n if (!drive) return false;\n\n return remotes.some(\n (remote) =>\n remote.collectionId === driveCollectionId(\"main\", drive.header.id),\n );\n }, [remotes, drive]);\n\n const driveIconSrc = drive?.state.global.icon;\n\n if (driveIconSrc) {\n return (\n <img src={driveIconSrc} alt={drive.header.name} height={32} width={32} />\n );\n }\n\n if (!isRemoteDrive) {\n return <Icon name=\"Hdd\" size={32} />;\n }\n\n return <Icon name=\"Server\" size={32} />;\n}\n","import { EditorLoader } from \"@powerhousedao/connect/components\";\nimport { useUndoRedoShortcuts } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { RevisionHistory } from \"@powerhousedao/design-system/connect\";\nimport {\n getRevisionFromDate,\n setRevisionHistoryVisible,\n showPHModal,\n useDocumentById,\n useDocumentModelModuleById,\n useDocumentOperations,\n useEditorModuleById,\n useFallbackEditorModule,\n useRevisionHistoryVisible,\n useSelectedTimelineItem,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PHDocument } from \"@powerhousedao/shared/document-model\";\nimport { redo, undo } from \"@powerhousedao/shared/document-model\";\nimport { Suspense, useEffect, useState } from \"react\";\nimport { CenteredErrorMessage, ErrorBoundary } from \"./error-boundary.js\";\n\ntype Props<TDocument extends PHDocument = PHDocument> = {\n document: TDocument;\n onClose: () => void;\n onExport: () => void;\n onOpenSwitchboardLink?: () => Promise<void>;\n};\n\nfunction EditorError({ message }: { message: React.ReactNode }) {\n return (\n <div className=\"flex size-full items-center justify-center\">\n <h3 className=\"text-lg font-semibold\">{message}</h3>\n </div>\n );\n}\n\nexport const DocumentEditor: React.FC<Props> = (props) => {\n const {\n document: initialDocument,\n onClose,\n onExport,\n onOpenSwitchboardLink,\n } = props;\n const selectedTimelineItem = useSelectedTimelineItem();\n const revisionHistoryVisible = useRevisionHistoryVisible();\n const [document, dispatch] = useDocumentById(initialDocument.header.id);\n const documentId = document?.header.id ?? undefined;\n const documentName = document?.header.name ?? undefined;\n const documentType = document?.header.documentType ?? undefined;\n const preferredEditor = document?.header.meta?.preferredEditor ?? undefined;\n const {\n globalOperations,\n localOperations,\n isLoading: isLoadingOperations,\n refetch: refetchOperations,\n } = useDocumentOperations(documentId);\n\n // Refetch operations when revision history panel opens\n useEffect(() => {\n if (revisionHistoryVisible) {\n void refetchOperations();\n }\n }, [revisionHistoryVisible, refetchOperations]);\n\n const globalRevisionNumber = document?.header.revision.global ?? 0;\n const localRevisionNumber = document?.header.revision.local ?? 0;\n const documentModelModule = useDocumentModelModuleById(documentType);\n const preferredEditorModule = useEditorModuleById(preferredEditor);\n const fallbackEditorModule = useFallbackEditorModule(documentType);\n const editorModule = preferredEditorModule ?? fallbackEditorModule;\n const isLoadingDocument = !document;\n const isLoadingEditor =\n editorModule &&\n documentType &&\n !editorModule.documentTypes.includes(documentType) &&\n !editorModule.documentTypes.includes(\"*\");\n\n const canUndo = globalRevisionNumber > 0 || localRevisionNumber > 0;\n const canRedo = !!document?.clipboard.length;\n const addUndoAction = () => dispatch(undo());\n const addRedoAction = () => dispatch(redo());\n useUndoRedoShortcuts({\n undo: addUndoAction,\n redo: addRedoAction,\n canUndo,\n canRedo,\n });\n\n useEffect(() => {\n return () => {\n window.documentEditorDebugTools?.clear();\n };\n }, []);\n\n const [editorError, setEditorError] = useState<\n | {\n error: any;\n info: React.ErrorInfo;\n documentId?: string;\n // clear: () => void;\n }\n | undefined\n >(undefined);\n\n useEffect(() => {\n if (editorError && editorError.documentId !== documentId) {\n setEditorError(undefined);\n }\n }, [editorError, documentId]);\n\n const handleEditorError = (error: Error, info: React.ErrorInfo) => {\n setEditorError({\n error,\n documentId,\n info,\n });\n };\n\n if (isLoadingEditor) {\n return <EditorLoader message=\"Loading editor\" />;\n }\n\n if (isLoadingDocument) {\n return <EditorLoader message=\"Loading document\" />;\n }\n\n if (!documentModelModule) {\n return (\n <EditorError\n message={\n <div className=\"text-center leading-10\">\n <p>\n Unable to open the document because the document model \"\n {documentType}\" is not supported.\n </p>\n <p>\n Go to the{\" \"}\n <button\n type=\"button\"\n className=\"cursor-pointer underline\"\n onClick={() => {\n showPHModal({ type: \"settings\" });\n }}\n >\n package manager\n </button>{\" \"}\n to install this document model\n </p>\n </div>\n }\n />\n );\n }\n\n if (!editorModule) {\n return (\n <EditorError\n message={\n <div className=\"text-center leading-10\">\n <p>Unable to open the document because no editor has been found</p>\n <p>\n Go to the{\" \"}\n <button\n type=\"button\"\n className=\"cursor-pointer underline\"\n onClick={() => {\n showPHModal({ type: \"settings\" });\n }}\n >\n package manager\n </button>{\" \"}\n an editor for the \"${documentType}\" document type\n </p>\n </div>\n }\n />\n );\n }\n const EditorComponent = editorModule.Component;\n\n return (\n <div\n className=\"relative h-full\"\n id=\"document-editor-context\"\n data-editor={editorModule.id}\n data-document-type={documentType}\n >\n {revisionHistoryVisible ? (\n isLoadingOperations ? (\n <EditorLoader message=\"Loading operations\" />\n ) : (\n <RevisionHistory\n key={documentId}\n documentTitle={documentName ?? \"\"}\n documentId={documentId ?? \"\"}\n globalOperations={globalOperations}\n localOperations={localOperations}\n onClose={() => setRevisionHistoryVisible(false)}\n documentState={document.state}\n onCopyState={() => {\n toast(\"Copied document state to clipboard\", { type: \"success\" });\n }}\n onCopyDocId={() => {\n toast(\"Copied document ID to clipboard\", { type: \"success\" });\n }}\n />\n )\n ) : (\n <Suspense\n fallback={<EditorLoader message=\"Loading editor\" />}\n name=\"EditorLoader\"\n >\n <ErrorBoundary\n fallbackRender={CenteredErrorMessage}\n resetKeys={[documentId]}\n onError={handleEditorError}\n loggerContext={[\"Connect\", \"DocumentEditor\"]}\n >\n {!editorError?.error && (\n <EditorComponent\n key={documentId}\n context={{\n readMode: !!selectedTimelineItem,\n selectedTimelineRevision: getRevisionFromDate(\n selectedTimelineItem?.startDate,\n selectedTimelineItem?.endDate,\n globalOperations,\n ),\n }}\n documentId={document.header.id}\n />\n )}\n </ErrorBoundary>\n </Suspense>\n )}\n </div>\n );\n};\n","import { Sidebar } from \"@powerhousedao/connect/components\";\nimport { Suspense } from \"react\";\nimport { Outlet } from \"react-router-dom\";\n\nexport function Root() {\n return (\n <div className=\"h-screen\">\n <div\n className={`flex h-screen items-stretch overflow-auto`}\n role=\"presentation\"\n tabIndex={0}\n >\n <Suspense name=\"Root\">\n <Sidebar />\n <div className=\"relative flex-1 overflow-auto\">\n <Outlet />\n </div>\n </Suspense>\n </div>\n </div>\n );\n}\n","import {\n DriveEditorContainer,\n DriveIcon,\n} from \"@powerhousedao/connect/components\";\nimport {\n connectConfig,\n defaultPHDocumentEditorConfig,\n defaultPHDriveEditorConfig,\n} from \"@powerhousedao/connect/config\";\nimport {\n HomeScreen,\n HomeScreenAddDriveItem,\n HomeScreenItem,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n setPHDocumentEditorConfig,\n setPHDriveEditorConfig,\n setSelectedDrive,\n useDriveEditorModuleById,\n useDrives,\n useSelectedDocumentId,\n useSelectedDriveSafe,\n useSelectedFolder,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport { useEffect } from \"react\";\n\nexport function Content() {\n const [selectedDrive] = useSelectedDriveSafe();\n const selectedFolder = useSelectedFolder();\n const selectedDocumentId = useSelectedDocumentId();\n\n useEffect(() => {\n if (!selectedDocumentId) {\n setPHDocumentEditorConfig(defaultPHDocumentEditorConfig);\n }\n }, [selectedDocumentId]);\n\n useEffect(() => {\n if (!selectedDrive) {\n setPHDriveEditorConfig(defaultPHDriveEditorConfig);\n }\n }, [selectedDrive]);\n\n const showHomeScreen =\n !selectedDocumentId && !selectedDrive && !selectedFolder;\n return (\n <ContentContainer>\n {showHomeScreen ? <HomeScreenContainer /> : <DriveEditorContainer />}\n </ContentContainer>\n );\n}\n\nfunction ContentContainer({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex h-full flex-col overflow-auto\" id=\"content-view\">\n {children}\n </div>\n );\n}\n\nfunction DriveItem({ drive }: { drive: DocumentDriveDocument }) {\n const editorModule = useDriveEditorModuleById(\n drive.header.meta?.preferredEditor,\n );\n const description = editorModule?.name || \"Drive Explorer App\";\n return (\n <HomeScreenItem\n key={drive.header.id}\n title={drive.state.global.name}\n description={description}\n icon={<DriveIcon drive={drive} />}\n onClick={() => setSelectedDrive(drive)}\n />\n );\n}\n\nfunction HomeScreenContainer() {\n const drives = useDrives();\n const config = connectConfig;\n return (\n <HomeScreen>\n {drives?.map((drive) => {\n return <DriveItem key={drive.header.id} drive={drive} />;\n })}\n {config.drives.addDriveEnabled && <HomeScreenAddDriveItem />}\n </HomeScreen>\n );\n}\n","import { toast } from \"@powerhousedao/connect/services\";\nimport { PowerhouseButton } from \"@powerhousedao/design-system\";\nimport {\n addRemoteDrive,\n useReactorClient,\n} from \"@powerhousedao/reactor-browser\";\nimport { gql, request } from \"graphql-request\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLocation, useNavigate, useParams } from \"react-router-dom\";\n\nconst REACTOR_URL = \"https://apps.powerhouse.io/sky-atlas/staging/switchboard\";\nconst MIN_LOADING_TIME = 2000;\n\nfunction useReactorUrl() {\n const { search } = useLocation();\n return useMemo(() => {\n const params = new URLSearchParams(search);\n const url = params.get(\"reactorUrl\") ?? REACTOR_URL;\n return url.endsWith(\"/\") ? url : `${url}/`;\n }, [search]);\n}\n\nasync function forkAtlas(\n docId: string,\n reactorUrl: string,\n): Promise<{ ForkAtlas: string }> {\n const document = gql`\n mutation ForkAtlas($docId: PHID) {\n ForkAtlas(docId: $docId)\n }\n `;\n return await request(`${reactorUrl}graphql`, document, { docId });\n}\n\nexport function AtlasImport() {\n const status = useRef<\n \"initial\" | \"forking\" | \"forked\" | \"addingDrive\" | \"done\" | \"error\"\n >(\"initial\");\n const reactor = useReactorClient();\n const { documentId } = useParams();\n const reactorUrl = useReactorUrl();\n const navigate = useNavigate();\n const [driveId, setDriveId] = useState<string | undefined>(undefined);\n const [error, setError] = useState<unknown>(undefined);\n const [loading, setLoading] = useState(true);\n const hasError = status.current === \"error\";\n\n useEffect(() => {\n if (error) {\n console.error(\"Error forking Atlas:\", error);\n toast(\"Error forking Atlas\", { type: \"error\" });\n }\n }, [error]);\n\n async function forkAtlasDocument(documentId: string) {\n const result = await forkAtlas(documentId, reactorUrl);\n const driveId = result.ForkAtlas;\n status.current = \"forked\";\n setDriveId(driveId);\n }\n\n const redirectToDrive = useCallback(() => {\n if (driveId && !loading) {\n navigate(`/d/${driveId}`, { replace: true });\n }\n }, [driveId, navigate, loading]);\n\n const addForkDrive = useCallback(\n async (driveId: string) => {\n console.log(\"Adding remote drive:\", driveId);\n const driveUrl = `${reactorUrl}d/${driveId}`;\n try {\n const addedDrive = await addRemoteDrive(driveUrl);\n status.current = \"done\";\n console.log(\"Added remote drive:\", addedDrive);\n setTimeout(() => {\n setLoading(false);\n }, MIN_LOADING_TIME);\n } catch (error) {\n status.current = \"error\";\n setLoading(false);\n setError(error);\n }\n },\n [addRemoteDrive, navigate, reactorUrl],\n );\n\n useEffect(() => {\n if (!documentId || status.current !== \"initial\") return;\n status.current = \"forking\";\n forkAtlasDocument(documentId).catch((error) => {\n status.current = \"error\";\n setError(error);\n });\n }, [documentId, status]);\n\n useEffect(() => {\n if (!driveId || !reactor || status.current !== \"forked\") return;\n status.current = \"addingDrive\";\n new Promise<void>((resolve) => {\n setTimeout(resolve, 500);\n })\n .then(() => addForkDrive(driveId))\n .catch((error) => {\n status.current = \"error\";\n setError(error);\n });\n }, [driveId, reactor, status]);\n\n return (\n <div className=\"flex size-full justify-center gap-x-4 bg-gray-50\">\n <div className=\"w-full max-w-[850px] rounded-2xl bg-white p-6 drop-shadow-sm\">\n <h1 className=\"text-lg font-medium text-gray-900\">\n Welcome to the Atlas Explorer\n </h1>\n <div className=\"mt-4 rounded-xl border border-gray-200 bg-gray-50 p-6\">\n <div className=\"flex min-h-80 flex-col items-center justify-center rounded-2xl bg-slate-50\">\n <div>\n <svg\n width=\"28\"\n height=\"32\"\n viewBox=\"0 0 28 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0.05092 23.7286L0.000163347 23.9993L0 23.9995L0.207853 24.067L27.6823 24.067L27.9995 23.9995L27.9161 23.6913L14.2182 0.209032L13.9998 0L13.749 0.246353L0.05092 23.7286ZM20.9994 11.9999L7.0003 11.9999L13.9998 23.999L20.9994 11.9999Z\"\n fill=\"url(#paint0_radial_319_20865)\"\n />\n <path\n d=\"M14 0L0 23.9998V7.99993L14 0Z\"\n fill=\"url(#paint1_linear_319_20865)\"\n />\n <path\n d=\"M28 24L7.82013e-05 24L14 31.9999L28 24Z\"\n fill=\"url(#paint2_linear_319_20865)\"\n />\n <path\n d=\"M14 0L28 23.9998V7.99993L14 0Z\"\n fill=\"url(#paint3_linear_319_20865)\"\n />\n <defs>\n <radialGradient\n id=\"paint0_radial_319_20865\"\n cx=\"0\"\n cy=\"0\"\n r=\"1\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"translate(13.9994 16.0344) rotate(-89.9988) scale(16.0344 16.201)\"\n >\n <stop offset=\"0.181008\" stopColor=\"#FFCD6B\" />\n <stop offset=\"1\" stopColor=\"#EB5EDF\" />\n </radialGradient>\n <linearGradient\n id=\"paint1_linear_319_20865\"\n x1=\"-0.031454\"\n y1=\"24.041\"\n x2=\"13.801\"\n y2=\"-0.142908\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#4331E9\" />\n <stop offset=\"1\" stopColor=\"#A273FF\" />\n </linearGradient>\n <linearGradient\n id=\"paint2_linear_319_20865\"\n x1=\"-0.0310093\"\n y1=\"24\"\n x2=\"28.0444\"\n y2=\"24\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#A273FF\" />\n <stop offset=\"1\" stopColor=\"#4331E9\" />\n </linearGradient>\n <linearGradient\n id=\"paint3_linear_319_20865\"\n x1=\"28.0315\"\n y1=\"24.041\"\n x2=\"14.199\"\n y2=\"-0.142908\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#A273FF\" />\n <stop offset=\"1\" stopColor=\"#4331E9\" />\n </linearGradient>\n </defs>\n </svg>\n </div>\n {hasError ? (\n <div className=\"mt-3 text-sm text-gray-800\">\n Error forking Atlas scope. Please try again.\n </div>\n ) : (\n <div className=\"mt-3 text-sm text-gray-500\">\n Forking Atlas scope...\n </div>\n )}\n <PowerhouseButton\n onClick={\n hasError\n ? window.location.reload.bind(window.location)\n : redirectToDrive\n }\n size=\"small\"\n color=\"light\"\n className=\"mt-4 h-9 border border-gray-200 bg-white px-3 text-gray-600\"\n >\n {hasError ? (\n \"Retry\"\n ) : loading ? (\n <>\n <svg\n className=\"animate-spin\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.6867 8.03333C15.4933 7.83999 15.1733 7.83999 14.98 8.03333L14.6733 8.34001V8C14.6733 4.32 11.68 1.32666 7.99999 1.32666C5.96666 1.32666 4.06666 2.23999 2.79333 3.82666C2.61999 4.03999 2.65332 4.35999 2.87332 4.52665C3.08666 4.69999 3.40666 4.66666 3.57332 4.44666C4.65999 3.09332 6.27332 2.31999 7.99999 2.31999C11.1267 2.31999 13.6733 4.86666 13.6733 7.99333V8.32666L13.3667 8.02002C13.1733 7.82669 12.8533 7.82669 12.66 8.02002C12.4667 8.21335 12.4667 8.53335 12.66 8.72668L13.82 9.88668C13.8667 9.93334 13.92 9.96666 13.98 9.99333C14.04 10.02 14.1067 10.0333 14.1733 10.0333C14.24 10.0333 14.3 10.02 14.3667 9.99333C14.4267 9.96666 14.48 9.93334 14.5267 9.88668L15.6867 8.72668C15.88 8.54668 15.88 8.22666 15.6867 8.03333Z\"\n fill=\"#6C7275\"\n />\n <path\n d=\"M13.1267 11.4666C12.9133 11.2933 12.5933 11.3266 12.4267 11.5466C11.34 12.9 9.72665 13.6733 7.99998 13.6733C4.87332 13.6733 2.32665 11.1266 2.32665 7.99996V7.66663L2.63332 7.97331C2.73332 8.07331 2.85999 8.11996 2.98665 8.11996C3.11332 8.11996 3.23999 8.07331 3.33999 7.97331C3.53332 7.77998 3.53332 7.45998 3.33999 7.26664L2.17998 6.10661C2.13332 6.05994 2.07998 6.02663 2.01998 5.99996C1.89998 5.94663 1.75998 5.94663 1.63998 5.99996C1.57998 6.02663 1.52665 6.05994 1.47999 6.10661L0.319988 7.26664C0.126654 7.45998 0.126654 7.77998 0.319988 7.97331C0.513321 8.16664 0.833319 8.16664 1.02665 7.97331L1.33332 7.66663V7.99996C1.33332 11.68 4.32665 14.6733 8.00665 14.6733C10.04 14.6733 11.94 13.76 13.2133 12.1733C13.38 11.96 13.3467 11.64 13.1267 11.4666Z\"\n fill=\"#6C7275\"\n />\n </svg>\n Loading\n </>\n ) : (\n \"Continue\"\n )}\n </PowerhouseButton>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { Root } from \"@powerhousedao/connect/components\";\nimport { connectConfig } from \"@powerhousedao/connect/config\";\nimport { AtlasImport, Content } from \"@powerhousedao/connect/pages\";\nimport { Suspense } from \"react\";\nimport type { RouteObject } from \"react-router-dom\";\nimport { RouterProvider, createBrowserRouter } from \"react-router-dom\";\n\nfunction createRouter(routes: RouteObject[]) {\n const routerBasename = connectConfig.routerBasename;\n\n return createBrowserRouter(routes, {\n basename: routerBasename,\n future: {\n v7_fetcherPersist: true,\n v7_relativeSplatPath: true,\n },\n });\n}\n\nfunction createRoutes() {\n const routes: RouteObject[] = [\n {\n index: true,\n path: \"d?/:driveId?/*?\",\n element: (\n <Suspense name=\"Drive\">\n <Content />\n </Suspense>\n ),\n },\n {\n path: \"import/:documentId\",\n element: (\n <Suspense name=\"AtlasImport\">\n <AtlasImport />\n </Suspense>\n ),\n },\n ];\n\n return [\n {\n element: (\n <Suspense name=\"RouteRoot\">\n <Root />\n </Suspense>\n ),\n children: routes,\n },\n ];\n}\n\nconst routes = createRoutes();\nconst router = createRouter(routes);\n\nexport const Router = () => {\n return <RouterProvider router={router} />;\n};\n","import { DriveIcon } from \"@powerhousedao/connect/components\";\nimport { connectConfig } from \"@powerhousedao/connect/config\";\nimport {\n ConnectSidebar,\n ConnectTooltipProvider,\n SidebarAddDriveItem,\n SidebarItem,\n} from \"@powerhousedao/design-system/connect\";\n\nimport {\n logout,\n openRenown,\n setSelectedDrive,\n showPHModal,\n useDrives,\n useInspectorEnabled,\n useSelectedDriveSafe,\n useUser,\n} from \"@powerhousedao/reactor-browser\";\nimport { ErrorBoundary } from \"./error-boundary.js\";\n\nexport function Sidebar() {\n const user = useUser();\n const drives = useDrives();\n const [selectedDrive] = useSelectedDriveSafe();\n const inspectorEnabled = useInspectorEnabled();\n const connectDebug = localStorage.getItem(\"CONNECT_DEBUG\") === \"true\";\n\n const onClickSettings = () => {\n showPHModal({ type: \"settings\" });\n };\n\n const onAddDriveClick = () => {\n showPHModal({ type: \"addDrive\" });\n };\n\n const onInspectorClick = () => {\n showPHModal({ type: \"inspector\" });\n };\n\n const etherscanUrl = user?.address\n ? `https://etherscan.io/address/${user.address}`\n : \"\";\n\n return (\n <ConnectTooltipProvider>\n <ConnectSidebar\n id=\"sidebar\"\n onClick={() => setSelectedDrive(undefined)}\n onClickSettings={onClickSettings}\n onInspectorClick={inspectorEnabled ? onInspectorClick : undefined}\n address={user?.address}\n onLogin={openRenown}\n onDisconnect={logout}\n etherscanUrl={etherscanUrl}\n showDebug={connectDebug}\n onDebugClick={() => showPHModal({ type: \"debugSettings\" })}\n >\n <ErrorBoundary\n variant=\"text\"\n fallbackMessage=\"There was an error loading drives\"\n loggerContext={[\"Connect\", \"Sidebar\"]}\n >\n {drives?.map((drive, index) => (\n <SidebarItem\n key={index}\n title={drive.header.name}\n onClick={() => setSelectedDrive(drive)}\n active={selectedDrive?.header.id === drive.header.id}\n icon={<DriveIcon drive={drive} />}\n />\n ))}\n {connectConfig.drives.addDriveEnabled && (\n <SidebarAddDriveItem onClick={onAddDriveClick} />\n )}\n </ErrorBoundary>\n </ConnectSidebar>\n </ConnectTooltipProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAKA,MAAM,+BAA+B,GAFnB,cAAc,eAEkB;AAQlD,MAAMA,8BAAY,IAAI,KAAiB;AAEvC,IAAI,UAA2BC,cAAY;AAE3C,SAASA,eAA8B;AACrC,KAAI;EACF,MAAM,QAAQ,aAAa,QAAQ,6BAA6B;AAChE,SAAO,QACF,KAAK,MAAM,MAAM,GAClB;GAAE,WAAW;GAAO,WAAW;GAAO,YAAY;GAAO;SACvD;AACN,SAAO;GAAE,WAAW;GAAO,WAAW;GAAO,YAAY;GAAO;;;AAIpE,SAAS,aAA8B;AACrC,QAAO;;AAGT,SAAS,WAAW,QAAoD;AACtE,WAAU,OAAO,QAAQ;AACzB,cAAa,QAAQ,8BAA8B,KAAK,UAAU,QAAQ,CAAC;AAC3E,aAAU,SAAS,OAAO,IAAI,CAAC;;AAGjC,SAASC,YAAU,IAAgB;AACjC,aAAU,IAAI,GAAG;AACjB,cAAaF,YAAU,OAAO,GAAG;;AAGnC,MAAa,2BAA2B;AAEtC,QAAO,CADS,qBAAqBE,aAAW,YAAY,WAAW,EACtD,WAAW;;ACxC9B,MAAa,4BAA4B,GAFvB,cAAc,eAEsB;AAEtD,MAAM,4BAAY,IAAI,KAAiB;AAEvC,IAAI,cAAc,YAAY;AAE9B,SAAS,aAAsB;AAC7B,KAAI;AAEF,SADc,aAAa,QAAQ,0BAA0B,KAC5C;UACV,OAAO;AACd,UAAQ,MAAM,MAAM;AACpB,SAAO;;;AAIX,SAAS,uBAAgC;AACvC,QAAO;;AAGT,SAAS,qBAAqB,OAAgB;AAC5C,eAAc;AACd,cAAa,QAAQ,2BAA2B,KAAK,UAAU,MAAM,CAAC;;AAGxE,SAAS,UAAU,IAAgB;AACjC,WAAU,IAAI,GAAG;AACjB,cAAa,UAAU,OAAO,GAAG;;AAGnC,MAAa,wBAAwB;AAMnC,QAAO,CALmB,qBACxB,WACA,sBACA,qBACD,EAC0B,qBAAqB;;;;AC3BlD,MAAMC,WAAS,YAAY,CAAC,SAAS,CAAC;AAEtC,IAAI,gBAAgB;AAEpB,eAAe,YAAY;AACzB,QAAO,MAAM,OAAO;;AAGtB,eAAe,aAAa;AACV,eAAc;CAE9B,MAAM,SAAS,MAAM,WAAW;CAChC,MAAM,eAA+C;EACnD,OAAO,uBAAuB;EAC9B,OAAO,0BAA0B,EAAE,OAAO,GAAG,CAAC;EAC9C,OAAO,mBAAmB;EAC1B,OAAO,0BAA0B,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;EACxD;AACD,KAAI,cAAc,OAAO,QACvB,cAAa,KACX,OAAO,uCAAuC;EAC5C,WAAW,MAAM;EACjB;EACA;EACA;EACA;EACD,CAAC,CACH;AAGH,QAAO,KAAK;EACV,SAAS,cAAc,OAAO;EAC9B,KAAK,cAAc,OAAO;EAC1B,aAAa,cAAc,OAAO;EAClC;EACA,cAAc;GACZ;GACA;GACA;GACD;EACD,gBAAgB;EAChB,kBAAkB;EAClB,0BAA0B;EAC1B,0BAA0B;EAC1B,WAAW,OAAO,MAAM;GACtB,MAAM,QAAQ,KAAK;AACnB,OACE,iBAAiB,aACjB,MAAM,QAAQ,SAAS,kBAAkB,IACzC,CAAC,UAAU,OAGX,QAAO;AAET,UAAO;;EAEV,CAAC;AAEF,iBAAgB;;AAGlB,eAAe,cAAc;AAC3B,KAAI,CAAC,cACH;AAIF,SAFe,MAAM,WAAW,EACV,WAAW,EAClB,OAAO;;AAGxB,SAAgB,gBAAgB;CAC9B,MAAM,CAAC,mBAAmB,oBAAoB;CAC9C,MAAM,EAAE,cAAc;AAEtB,iBAAgB;AACd,MAAI,CAAC,WAAW;AACd,gBAAa,CAAC,OAAO,UAAmBA,SAAO,MAAM,UAAU,MAAM,CAAC;AACtE;;AAGF,MACE,iBACA,CAAC,cAAc,OAAO,OACtB,cAAc,OAAO,QAAQ,GAE7B;AAGF,cAAY,CAAC,OAAO,UAAmBA,SAAO,MAAM,UAAU,MAAM,CAAC;IACpE,CAAC,UAAU,CAAC;;;;AC9FjB,MAAa,wBAAwB,UAAqC;CACxE,MAAM,EAAE,MAAM,MAAM,SAAS,YAAY;CACzC,MAAM,QAAQ,OAAO,UAAU,UAAU,SAAS,MAAM;CAExD,IAAI,eAAe;CACnB,IAAI,eAAe;AAEnB,KAAI,OAAO;AACT,iBAAe;AACf,iBAAe;;AAIjB,YACE,eACC,UAAU;AACT,QAAM,gBAAgB;AACtB,MAAI,QACF,OAAM;IAGV,EAAE,EACF,CAAC,SAAS,KAAK,CAChB;AAGD,YACE,eACC,UAAU;AACT,QAAM,gBAAgB;AACtB,MAAI,QACF,OAAM;IAGV,EAAE,EACF,CAAC,SAAS,KAAK,CAChB;;;;AClCH,SAAS,KAAK,GAAG,MAAyB;AACxC,QAAO,WAAW,KAAK,GAAG,KAAK;;AAGjC,MAAa,kBAAkB;CAC7B,MAAM,eAAe,cAAc;CACnC,MAAM,CAAC,EAAE,eAAe,oBAAoB;CAC5C,MAAM,eAAe,gBAAgB;AAErC,iBAAgB;AACd,MAAI,cAAc;GAEhB,MAAM,SAAS,SAAS,cAAc,SAAS;AAC/C,UAAO,MAAM,+CAA+C;AAC5D,UAAO,QAAQ;AACf,YAAS,KAAK,YAAY,OAAO;AAGjC,UAAO,YAAY,OAAO,aAAa,EAAE;AAEzC,QAAK,sBAAM,IAAI,MAAM,CAAC;AACtB,QAAK,UAAU,aAAa;AAG5B,gBAAa;AACX,aAAS,KAAK,YAAY,OAAO;;;IAGpC,CAAC,cAAc,aAAa,CAAC;AAEhC,QAAO;;;;ACzCT,SAAgB,cAAc;AAC5B,KAAI,OAAO,aAAa,YACtB,QAAO;AAKT,QAFe,SAAS,cAAc,OAAO,EACxB,aAAa,OAAO,IAC1B;;;;ACFjB,IAAa,2BAAb,MAAsC;CACpC;CACA,aAAkC,EAAE;CAEpC,YAAY,UAAuB;AACjC,MAAI,SACF,MAAK,WAAW;;CAIpB,wBAAgC,YAAyB;AACvD,SAAO,WAAW,KAAK,QAAQ;GAC7B,GAAG;GACH,OAAO,KAAK,UAAU,GAAG,OAAO,MAAM;GACvC,EAAE;;CAGL,YAAmB,UAAsB;AACvC,OAAK,WAAW;;CAGlB,cAAqB;AACnB,SAAO,KAAK;;CAGd,gBAAuB;AACrB,SAAO,KAAK;;CAGd,cAAqB,WAAsB;AACzC,OAAK,WAAW,KAAK,UAAU;;CAGjC,kBAAyB;AACvB,MAAI,CAAC,KAAK,SACR,SAAQ,KAAK,cAAc;EAE7B,MAAM,MAAM,OAAO,OAAO,KAAK,UAAU,cAAc,EAAE,CAAC,CACvD,QAAQ,UAAgC,UAAU,KAAA,EAAU,CAC5D,SAAS,UAAU,MAAM,CACzB,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM;AAEpC,UAAQ,MAAM,KAAK,wBAAwB,IAAI,CAAC;;CAGlD,qBAA4B,OAAe;AACzC,MAAI,CAAC,KAAK,SACR,SAAQ,KAAK,cAAc;EAE7B,MAAM,MAAM,KAAK,UAAU,WAAW,UAAU,EAAE;AAClD,UAAQ,MAAM,KAAK,wBAAwB,IAAI,CAAC;;CAGlD,gBAAuB;AACrB,UAAQ,IAAI,KAAK,WAAW;;CAG9B,qBAA4B;AAC1B,UAAQ,MAAM,KAAK,wBAAwB,KAAK,WAAW,CAAC;;CAG9D,QAAe;AACb,OAAK,aAAa,EAAE;AACpB,OAAK,WAAW,KAAA;;;;;AC7DpB,MAAM,eAAe;AAErB,MAAM,UAAU,EAAE,QAAQ,mBAAuC;CAC/D,MAAM,QAAQ,OAAO,WAAW;CAChC,MAAM,oBACJ,OAAO,aAAa,eACpB,SAAS,KAAK,aAAa,mBAAmB,KAAK;CAErD,MAAM,CAAC,aAAa,kBAAkB,SAAS,CAAC,SAAS,kBAAkB;AAE3E,iBAAgB;EACd,MAAM,KAAK,iBAAiB;AAC1B,kBAAe,KAAK;KACnB,MAAM;AAET,eAAa,aAAa,GAAG;IAC5B,EAAE,CAAC;AAEN,QACE,qBAAC,OAAD;EACE,WAAW,0EAA0E,cAAc,KAAK;YAD1G,CAGE,oBAAC,OAAD;GAAK,WAAU;aACb,oBAAC,gBAAD,EAAkB,CAAA;GACd,CAAA,EACL,QACC,oBAAC,UAAD,EACE,yBAAyB,EACvB,QAAQ;;;yBAGK,MAAM,IACpB,EACD,CAAA,GACA,KACA;;;AAIV,MAAa,oBAAoB;CAC/B,MAAM,QAAQ,OAAO,WAAW;CAChC,MAAM,eAAe,CAAC,SAAS,OAAO,SAAS,aAAa,aAAa;AACzE,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,gBAAD;IACE,WAAU;IACV,SAAS,KAAA;IACT,cAAc,KAAA;IACd,iBAAiB,KAAA;IACjB,SAAS,KAAA;IACT,CAAA;GACF,oBAAC,YAAD;IACE,oBACE,SAAS,CAAC,eAAe,uBAAuB,KAAA;IAElD,UAAU;IACV,CAAA;GACD,QACC,oBAAC,UAAD,EACE,yBAAyB,EACvB,QAAQ;;;;;;wBAOT,EACD,CAAA,GACA;GACJ,oBAAC,QAAD,EAAU,CAAA;GACN;;;;;ACvEV,MAAMC,WAAS,YAAY,CAAC,UAAU,CAAC;AAmDvC,SAAS,kBACP,OAC2C;AAC3C,QAAO,oBAAoB;;AAG7B,SAAS,iBAAiB;AACxB,QAAO;;;;;;AAOT,SAAS,aAAa,EACpB,UAAU,0BAGT;AACD,QAAO,oBAAC,OAAD;EAAK,WAAU;YAAe;EAAc,CAAA;;;;;;;AAQrD,SAAS,iBAAiB,EAAE,SAAwB;CAClD,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,MAAD;IAAI,WAAU;cAA6B;IAAU,CAAA;GACrD,oBAAC,KAAD,EAAA,UAAI,cAAiB,CAAA;GACrB,oBAAC,OAAD,EAAA,UAAM,KAAK,UAAU,OAAO,MAAM,EAAE,EAAO,CAAA;GACvC;;;;;;;;AASV,SAAS,qBAAqB,EAAE,SAAwB;AAEtD,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,MAAD;GAAI,WAAU;aAHG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAGd,CAAA;EACrD,CAAA;;AAIV,SAAS,qBACP,SACA,iBACqC;AACrC,SAAQ,SAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,OACH,cAAa,oBAAC,cAAD,EAAc,SAAS,iBAAmB,CAAA;EACzD,KAAK,WACH,QAAO;EACT,QACE,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCb,SAAgBC,gBAAc,OAA2B;CACvD,MAAM,EAAE,UAAU,SAAS,WAAW,kBAAkB;CAExD,MAAM,eAAe,OAAc,SAA0B;AAC3D,MACE,MAAM,QAAQ,SAAS,8CAA8C,IACrE,MAAM,QAAQ,SAAS,qBAAqB,EAC5C;AACA,WAAQ,MAAM,MAAM;AACpB,WAAQ,IAAI,6CAA6C;AACzD,UAAO,SAAS,QAAQ;AACxB;;AAIF,GADsB,gBAAgB,YAAY,cAAc,GAAGD,UACrD,MAAM,gBAAgB,OAAO,KAAK;AAChD,YAAU,OAAO,KAAK;;AAOxB,QACE,oBAACE,eAAD;EACE,gBANmB,kBAAkB,MAAM,GAC3C,MAAM,iBACN,qBAAqB,MAAM,SAAS,MAAM,gBAAgB;EAK1D,SAAS;EACE;EAEV;EACkB,CAAA;;;;AC5LzB,MAAMC,kBAAgB,WACpB,OAAO,+BAA6B,MAAM,OAAO,EAC/C,SAAS,EAAE,eACZ,EAAE,CACJ;AACD,MAAM,oBAAoB,WACxB,OAAO,mCAAiC,MAAM,OAAO,EACnD,SAAS,EAAE,mBACZ,EAAE,CACJ;AACD,MAAM,qBAAqB,WACzB,OAAO,oCAAkC,MAAM,OAAO,EACpD,SAAS,EAAE,oBACZ,EAAE,CACJ;AACD,MAAMC,wBAAsB,WAC1B,OAAO,qCAAmC,MAAM,OAAO,EACrD,SAAS,EAAE,qBACZ,EAAE,CACJ;AACD,MAAM,qBAAqB,WACzB,OAAO,oCAAkC,MAAM,OAAO,EACpD,SAAS,EAAE,oBACZ,EAAE,CACJ;AACD,MAAM,mBAAmB,WACvB,OAAO,kCAAgC,MAAM,OAAO,EAClD,SAAS,EAAE,kBACZ,EAAE,CACJ;AACD,MAAM,kBAAkB,WACtB,OAAO,iCAA+B,MAAM,OAAO,EACjD,SAAS,EAAE,iBACZ,EAAE,CACJ;AACD,MAAM,kBAAkB,WACtB,OAAO,iCAA+B,MAAM,OAAO,EACjD,SAAS,EAAE,iBACZ,EAAE,CACJ;AACD,MAAMC,uBAAqB,WACzB,OAAO,oCAAkC,MAAM,OAAO,EACpD,SAAS,EAAE,oBACZ,EAAE,CACJ;AACD,MAAM,gCAAgC,WACpC,OAAO,+CAA6C,MAAM,OAAO,EAC/D,SAAS,EAAE,+BACZ,EAAE,CACJ;AACD,MAAMC,kBAAgB,WACpB,OAAO,+BAA6B,MAAM,OAAO,EAC/C,SAAS,EAAE,eACZ,EAAE,CACJ;AACD,MAAM,oBAAoB,WACxB,OAAO,mCAAiC,MAAM,OAAO,EACnD,SAAS,EAAE,mBACZ,EAAE,CACJ;AAWD,MAAM,kBAAkB;CACtB,UAAUH;CACV,cAAc;CACd,eAAe;CACf,gBAAgBC;CAChB,eAAe;CACf,aAAa;CACb,YAAY;CACZ,YAAY;CACZ,eAAeC;CACf,0BAA0B;CAC1B,WArBqB,WACrB,OAAO,gCAAoC,MAAM,OAAO,EACtD,SAAS,EAAE,gBACZ,EAAE,CACJ;CAkBC,UAAUC;CACV,cAAc;CACd,gBAnB0B,WAC1B,OAAO,qCAAmC,MAAM,OAAO,EACrD,SAAS,EAAE,4BACZ,EAAE,CACJ;CAgBA;AAED,MAAa,kBAAkB,KAAK,YAAY;AAC9C,QAAO,EACL,eAAe;EACb,MAAM,UAAU,YAAY;AAE5B,MAAI,CAAC,SAAS,KAAM,QAAO;EAE3B,MAAM,iBAAiB,gBAAgB,QAAQ;AAE/C,SAAO,iBACL,oBAACC,iBAAD;GAAe,SAAQ;GAAS,eAAe,CAAC,WAAW,SAAS;aAClE,oBAAC,UAAD;IAAU,UAAU;cAClB,oBAAC,gBAAD,EAAkB,CAAA;IACT,CAAA;GACG,CAAA,GACd;IAEP;EACD;;;ACtGF,MAAa,aAAa,UAA2C;CACnE,MAAM,OAAO,WACX,OAAO,sBAAa,MAAM,MAAM,EAAE,cAAc,MAAM,aAAa,CAAC,CACrE;AACD,QACE,qBAAC,YAAD,EAAA,UAAA;EACE,oBAAC,UAAD;GAAU,UAAU,oBAAC,aAAD,EAAe,CAAA;GAAE,MAAK;aACxC,oBAAC,MAAD;IAAM,GAAI;cACR,oBAAC,KAAD,EAAO,CAAA;IACF,CAAA;GACE,CAAA;EACX,oBAAC,UAAD;GAAU,MAAK;aACb,oBAACC,gBAAD,EAAgB,CAAA;GACP,CAAA;EACX,oBAAC,UAAD;GAAU,MAAK;aACb,oBAAC,iBAAD,EAAmB,CAAA;GACV,CAAA;EACA,EAAA,CAAA;;;;AClBjB,MAAa,kBAAiD,EAAE,eAAe;AAC7E,gBAAe;AAEf,QAAO;;;;ACGT,MAAa,YAAY;AAEvB,iBAAgB;EACd,MAAM,2BAA2B;AAC/B,WAAQ,IAAI,8CAA8C;AAC1D,UAAO,SAAS,QAAQ;;AAG1B,SAAO,iBAAiB,qBAAqB,mBAAmB;AAEhE,eAAa;AACX,UAAO,oBAAoB,qBAAqB,mBAAmB;;IAEpE,EAAE,CAAC;AAEN,iBAAgB;AACd,MAAI,OAAO,KAAK,IAAI,SAAS,cAC3B,QAAO,2BAA2B,IAAI,0BAA0B;MAEhE,sBAAqB,sBAAsB,MAAM;IAElD,EAAE,CAAC;AAEN,QACE,oBAAC,gBAAD,EAAA,UACE,qBAAC,cAAD,EAAA,UAAA;EACE,oBAAC,gBAAD;GAAgB,UAAS;GAAe,aAAY;GAAY,CAAA;EAChE,oBAAC,QAAD,EAAU,CAAA;EACV,oBAAC,WAAD,EAAa,CAAA;EACA,EAAA,CAAA,EACA,CAAA;;;;AChCrB,MAAM,oBAAoB,SAAwB,OAAe;AAC/D,QAAO,QAAQ,MAAM,WAAW,OAAO,OAAO,MAAM,OAAO,MAAM;;AAGnE,MAAaC,uBAAqB;CAChC,MAAM,EAAE,MAAM,eAAe,KAAA,GAAW;EACtC,aAAa;EACb;EACD,CAAC;CACF,MAAM,CAAC,YAAY,iBAAiB,iBAAiB;CACrD,MAAM,GAAG,sBAAsB,oBAAoB;CAEnD,MAAM,eAA8B,CAClC;EACE,IAAI;EACJ,OAAO,EAAE,iCAAiC;EAC1C,OAAO;EACR,CACF;CAED,MAAM,gBAAgB,YAA2B;AAC/C,gBAAc,MAAM;AAEpB,MAAI,iBAAiB,SAAS,mBAAmB,CAC/C,qBAAoB,qBAAqB;GACvC,GAAG;GACH,WAAW;GACZ,EAAE;;CAIP,MAAM,qBAAqB;AACzB,gBAAc,MAAM;AACpB,4BAA0B;GACxB,WAAW;GACX,YAAY;GACZ,WAAW;GACZ,EAAE;;AAGL,KAAI,CAAC,WACH,QAAO;AAGT,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,OAAD,EAAK,WAAU,wCAAyC,CAAA,EACxD,oBAAC,OAAD;GAAK,WAAU;aACb,oBAACC,cAAD;IACE,WAAU;IACV,SAAS;IACT,UAAU;IACV,UAAU;IACV,aAAa,EAAE,sBAAsB;IACrC,aAAa,EAAE,sBAAsB;cAErC,oBAAC,KAAD;KAAG,WAAU;eACX,oBAAC,OAAD;MAEE,SAAQ;MACR,YAAY,EACV,GACE,oBAAC,KAAD;OACE,eAAe,YAAY,EAAE,MAAM,iBAAiB,CAAC;OAErD,WAAU;OACV,EAFK,4BAEL,EAEL;MACD,EAXK,uBAWL;KACA,CAAA;IACW,CAAA;GACb,CAAA,CACF;;;;;ACvEV,SAAgB,0BAA0B;CACxC,MAAM,CAAC,oBAAoB,qBAAqB;CAChD,MAAM,eAAe,wBAAwB,iBAAiB,OAAO,GAAG;CAExE,MAAM,WAAW,kBAAkB;AAGjC,MAFyB,iBAAiB,iBAAiB,CAEtC,OACnB,aAAY;GACV,MAAM;GACN,YAAY,iBAAiB,OAAO;GACrC,CAAC;MAEF,YAAW,iBAAiB,CAAC,OAAO,UAAe;AACjD,WAAQ,MAAM,MAAM;AAKpB,WAAM,8BAHJ,iBAAiB,QACb,MAAM,UACN,KAAK,UAAU,OAAO,MAAM,EAAE,GACe;IACnD;IAEH,CAAC,iBAAiB,CAAC;CAGtB,MAAM,wBAAwB,cAAc;AAC1C,SAAO,YAAY;IAGlB,EAAE,CAAC;CAEN,MAAM,UAAU,kBAAkB;AAChC,kBAAgB,aAAa;IAC5B,CAAC,cAAc,gBAAgB,CAAC;AAEnC,QACE,oBAAC,OAAD;EACE,IAAG;EACH,WAAU;EACV,sBAAoB,iBAAiB,OAAO;YAE5C,oBAAC,gBAAD;GACE,UAAU;GACD;GACC;GACa;GACvB,CAAA;EACE,CAAA;;;;ACnDV,SAAgB,aAAa,OAAc;CACzC,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;AAGrD,iBAAgB;AACd,mBAAiB;AACf,kBAAe,KAAK;KACnB,MAAM,kBAAkB,IAAI;IAC9B,CAAC,MAAM,CAAC;AAEX,KAAI,CAAC,YAAa,QAAO;CAEzB,MAAM,EAAE,oBAAoB,GAAG,iBAAiB;AAEhD,KAAI,mBAAoB,QAAO,oBAAA,UAAA,EAAA,UAAG,oBAAsB,CAAA;AAExD,QAAO,oBAAC,qBAAD,EAAqB,GAAI,cAAgB,CAAA;;;;ACXlD,SAAgB,uBAAuB;CACrC,MAAM,CAAC,iBAAiB,kBAAkB;CAC1C,MAAM,qBAAqB,uBAAuB;CAElD,MAAM,cAAc,yBAClB,cAAc,OAAO,MAAM,gBAC5B;CACD,MAAM,qBAAqB,6BAA6B;CAExD,MAAM,uBACJ,aAAa,aACb,oBAAoB,aACpB,qBAAqB;AAEvB,KAAI,CAAC,qBACH,OAAM,IAAI,MAAM,kCAAkC;AAEpD,QACE,oBAACC,iBAAD;EACE,SAAQ;EACR,WAAW,CAAC,cAAc,OAAO,GAAG;EACpC,eAAe,CAAC,WAAW,cAAc;YAEzC,oBAAC,UAAD;GAAU,UAAU,oBAAC,cAAD,EAAgB,CAAA;aAClC,oBAAC,iBAAD;IAAiB,WAAU;cACzB,oBAAC,sBAAD,EAAA,UACG,qBAAqB,oBAAC,yBAAD,EAA2B,CAAA,GAAG,MAC/B,CAAA;IACP,CAAA;GACT,CAAA;EACG,CAAA;;;;ACtCpB,SAAgB,UAAU,EACxB,SAGC;CACD,MAAM,UAAU,aAAa;CAC7B,MAAM,gBAAgB,cAAc;AAClC,MAAI,CAAC,MAAO,QAAO;AAEnB,SAAO,QAAQ,MACZ,WACC,OAAO,iBAAiB,kBAAkB,QAAQ,MAAM,OAAO,GAAG,CACrE;IACA,CAAC,SAAS,MAAM,CAAC;CAEpB,MAAM,eAAe,OAAO,MAAM,OAAO;AAEzC,KAAI,aACF,QACE,oBAAC,OAAD;EAAK,KAAK;EAAc,KAAK,MAAM,OAAO;EAAM,QAAQ;EAAI,OAAO;EAAM,CAAA;AAI7E,KAAI,CAAC,cACH,QAAO,oBAAC,MAAD;EAAM,MAAK;EAAM,MAAM;EAAM,CAAA;AAGtC,QAAO,oBAAC,MAAD;EAAM,MAAK;EAAS,MAAM;EAAM,CAAA;;;;ACJzC,SAAS,YAAY,EAAE,WAAyC;AAC9D,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,MAAD;GAAI,WAAU;aAAyB;GAAa,CAAA;EAChD,CAAA;;AAIV,MAAa,kBAAmC,UAAU;CACxD,MAAM,EACJ,UAAU,iBACV,SACA,UACA,0BACE;CACJ,MAAM,uBAAuB,yBAAyB;CACtD,MAAM,yBAAyB,2BAA2B;CAC1D,MAAM,CAAC,UAAU,YAAY,gBAAgB,gBAAgB,OAAO,GAAG;CACvE,MAAM,aAAa,UAAU,OAAO,MAAM,KAAA;CAC1C,MAAM,eAAe,UAAU,OAAO,QAAQ,KAAA;CAC9C,MAAM,eAAe,UAAU,OAAO,gBAAgB,KAAA;CACtD,MAAM,kBAAkB,UAAU,OAAO,MAAM,mBAAmB,KAAA;CAClE,MAAM,EACJ,kBACA,iBACA,WAAW,qBACX,SAAS,sBACP,sBAAsB,WAAW;AAGrC,iBAAgB;AACd,MAAI,uBACG,oBAAmB;IAEzB,CAAC,wBAAwB,kBAAkB,CAAC;CAE/C,MAAM,uBAAuB,UAAU,OAAO,SAAS,UAAU;CACjE,MAAM,sBAAsB,UAAU,OAAO,SAAS,SAAS;CAC/D,MAAM,sBAAsB,2BAA2B,aAAa;CACpE,MAAM,wBAAwB,oBAAoB,gBAAgB;CAClE,MAAM,uBAAuB,wBAAwB,aAAa;CAClE,MAAM,eAAe,yBAAyB;CAC9C,MAAM,oBAAoB,CAAC;CAC3B,MAAM,kBACJ,gBACA,gBACA,CAAC,aAAa,cAAc,SAAS,aAAa,IAClD,CAAC,aAAa,cAAc,SAAS,IAAI;CAE3C,MAAM,UAAU,uBAAuB,KAAK,sBAAsB;CAClE,MAAM,UAAU,CAAC,CAAC,UAAU,UAAU;CACtC,MAAM,sBAAsB,SAAS,MAAM,CAAC;CAC5C,MAAM,sBAAsB,SAAS,MAAM,CAAC;AAC5C,sBAAqB;EACnB,MAAM;EACN,MAAM;EACN;EACA;EACD,CAAC;AAEF,iBAAgB;AACd,eAAa;AACX,UAAO,0BAA0B,OAAO;;IAEzC,EAAE,CAAC;CAEN,MAAM,CAAC,aAAa,kBAAkB,SAQpC,KAAA,EAAU;AAEZ,iBAAgB;AACd,MAAI,eAAe,YAAY,eAAe,WAC5C,gBAAe,KAAA,EAAU;IAE1B,CAAC,aAAa,WAAW,CAAC;CAE7B,MAAM,qBAAqB,OAAc,SAA0B;AACjE,iBAAe;GACb;GACA;GACA;GACD,CAAC;;AAGJ,KAAI,gBACF,QAAO,oBAAC,cAAD,EAAc,SAAQ,kBAAmB,CAAA;AAGlD,KAAI,kBACF,QAAO,oBAAC,cAAD,EAAc,SAAQ,oBAAqB,CAAA;AAGpD,KAAI,CAAC,oBACH,QACE,oBAAC,aAAD,EACE,SACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,qBAAC,KAAD,EAAA,UAAA;GAAG;GAEA;GAAa;GACZ,EAAA,CAAA,EACJ,qBAAC,KAAD,EAAA,UAAA;GAAG;GACS;GACV,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,eAAe;AACb,iBAAY,EAAE,MAAM,YAAY,CAAC;;cAEpC;IAEQ,CAAA;GAAC;GAAI;GAEZ,EAAA,CAAA,CACA;KAER,CAAA;AAIN,KAAI,CAAC,aACH,QACE,oBAAC,aAAD,EACE,SACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,KAAD,EAAA,UAAG,gEAAgE,CAAA,EACnE,qBAAC,KAAD,EAAA,UAAA;GAAG;GACS;GACV,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,eAAe;AACb,iBAAY,EAAE,MAAM,YAAY,CAAC;;cAEpC;IAEQ,CAAA;GAAC;GAAI;GACO;GAAa;GAChC,EAAA,CAAA,CACA;KAER,CAAA;CAGN,MAAM,kBAAkB,aAAa;AAErC,QACE,oBAAC,OAAD;EACE,WAAU;EACV,IAAG;EACH,eAAa,aAAa;EAC1B,sBAAoB;YAEnB,yBACC,sBACE,oBAAC,cAAD,EAAc,SAAQ,sBAAuB,CAAA,GAE7C,oBAAC,iBAAD;GAEE,eAAe,gBAAgB;GAC/B,YAAY,cAAc;GACR;GACD;GACjB,eAAe,0BAA0B,MAAM;GAC/C,eAAe,SAAS;GACxB,mBAAmB;AACjB,YAAM,sCAAsC,EAAE,MAAM,WAAW,CAAC;;GAElE,mBAAmB;AACjB,YAAM,mCAAmC,EAAE,MAAM,WAAW,CAAC;;GAE/D,EAbK,WAaL,GAGJ,oBAAC,UAAD;GACE,UAAU,oBAAC,cAAD,EAAc,SAAQ,kBAAmB,CAAA;GACnD,MAAK;aAEL,oBAACC,iBAAD;IACE,gBAAgB;IAChB,WAAW,CAAC,WAAW;IACvB,SAAS;IACT,eAAe,CAAC,WAAW,iBAAiB;cAE3C,CAAC,aAAa,SACb,oBAAC,iBAAD;KAEE,SAAS;MACP,UAAU,CAAC,CAAC;MACZ,0BAA0B,oBACxB,sBAAsB,WACtB,sBAAsB,SACtB,iBACD;MACF;KACD,YAAY,SAAS,OAAO;KAC5B,EAVK,WAUL;IAEU,CAAA;GACP,CAAA;EAET,CAAA;;;;ACvOV,SAAgB,OAAO;AACrB,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,OAAD;GACE,WAAW;GACX,MAAK;GACL,UAAU;aAEV,qBAAC,UAAD;IAAU,MAAK;cAAf,CACE,oBAAC,SAAD,EAAW,CAAA,EACX,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,QAAD,EAAU,CAAA;KACN,CAAA,CACG;;GACP,CAAA;EACF,CAAA;;;;ACQV,SAAgB,UAAU;CACxB,MAAM,CAAC,iBAAiB,sBAAsB;CAC9C,MAAM,iBAAiB,mBAAmB;CAC1C,MAAM,qBAAqB,uBAAuB;AAElD,iBAAgB;AACd,MAAI,CAAC,mBACH,2BAA0B,8BAA8B;IAEzD,CAAC,mBAAmB,CAAC;AAExB,iBAAgB;AACd,MAAI,CAAC,cACH,wBAAuB,2BAA2B;IAEnD,CAAC,cAAc,CAAC;AAInB,QACE,oBAAC,kBAAD,EAAA,UAFA,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,iBAGtB,oBAAC,qBAAD,EAAuB,CAAA,GAAG,oBAAC,sBAAD,EAAwB,CAAA,EACnD,CAAA;;AAIvB,SAAS,iBAAiB,EAAE,YAA2C;AACrE,QACE,oBAAC,OAAD;EAAK,WAAU;EAAqC,IAAG;EACpD;EACG,CAAA;;AAIV,SAAS,UAAU,EAAE,SAA2C;CAI9D,MAAM,cAHe,yBACnB,MAAM,OAAO,MAAM,gBACpB,EACiC,QAAQ;AAC1C,QACE,oBAAC,gBAAD;EAEE,OAAO,MAAM,MAAM,OAAO;EACb;EACb,MAAM,oBAAC,WAAD,EAAkB,OAAS,CAAA;EACjC,eAAe,iBAAiB,MAAM;EACtC,EALK,MAAM,OAAO,GAKlB;;AAIN,SAAS,sBAAsB;CAC7B,MAAM,SAAS,WAAW;CAC1B,MAAM,SAAS;AACf,QACE,qBAAC,YAAD,EAAA,UAAA,CACG,QAAQ,KAAK,UAAU;AACtB,SAAO,oBAAC,WAAD,EAAwC,OAAS,EAAjC,MAAM,OAAO,GAAoB;GACxD,EACD,OAAO,OAAO,mBAAmB,oBAAC,wBAAD,EAA0B,CAAA,CACjD,EAAA,CAAA;;;;AC5EjB,MAAM,cAAc;AACpB,MAAM,mBAAmB;AAEzB,SAAS,gBAAgB;CACvB,MAAM,EAAE,WAAW,aAAa;AAChC,QAAO,cAAc;EAEnB,MAAM,MADS,IAAI,gBAAgB,OAAO,CACvB,IAAI,aAAa,IAAI;AACxC,SAAO,IAAI,SAAS,IAAI,GAAG,MAAM,GAAG,IAAI;IACvC,CAAC,OAAO,CAAC;;AAGd,eAAe,UACb,OACA,YACgC;CAChC,MAAM,WAAW,GAAG;;;;;AAKpB,QAAO,MAAM,QAAQ,GAAG,WAAW,UAAU,UAAU,EAAE,OAAO,CAAC;;AAGnE,SAAgB,cAAc;CAC5B,MAAM,SAAS,OAEb,UAAU;CACZ,MAAM,UAAU,kBAAkB;CAClC,MAAM,EAAE,eAAe,WAAW;CAClC,MAAM,aAAa,eAAe;CAClC,MAAM,WAAW,aAAa;CAC9B,MAAM,CAAC,SAAS,cAAc,SAA6B,KAAA,EAAU;CACrE,MAAM,CAAC,OAAO,YAAY,SAAkB,KAAA,EAAU;CACtD,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,WAAW,OAAO,YAAY;AAEpC,iBAAgB;AACd,MAAI,OAAO;AACT,WAAQ,MAAM,wBAAwB,MAAM;AAC5C,WAAM,uBAAuB,EAAE,MAAM,SAAS,CAAC;;IAEhD,CAAC,MAAM,CAAC;CAEX,eAAe,kBAAkB,YAAoB;EAEnD,MAAM,WADS,MAAM,UAAU,YAAY,WAAW,EAC/B;AACvB,SAAO,UAAU;AACjB,aAAW,QAAQ;;CAGrB,MAAM,kBAAkB,kBAAkB;AACxC,MAAI,WAAW,CAAC,QACd,UAAS,MAAM,WAAW,EAAE,SAAS,MAAM,CAAC;IAE7C;EAAC;EAAS;EAAU;EAAQ,CAAC;CAEhC,MAAM,eAAe,YACnB,OAAO,YAAoB;AACzB,UAAQ,IAAI,wBAAwB,QAAQ;EAC5C,MAAM,WAAW,GAAG,WAAW,IAAI;AACnC,MAAI;GACF,MAAM,aAAa,MAAM,eAAe,SAAS;AACjD,UAAO,UAAU;AACjB,WAAQ,IAAI,uBAAuB,WAAW;AAC9C,oBAAiB;AACf,eAAW,MAAM;MAChB,iBAAiB;WACb,OAAO;AACd,UAAO,UAAU;AACjB,cAAW,MAAM;AACjB,YAAS,MAAM;;IAGnB;EAAC;EAAgB;EAAU;EAAW,CACvC;AAED,iBAAgB;AACd,MAAI,CAAC,cAAc,OAAO,YAAY,UAAW;AACjD,SAAO,UAAU;AACjB,oBAAkB,WAAW,CAAC,OAAO,UAAU;AAC7C,UAAO,UAAU;AACjB,YAAS,MAAM;IACf;IACD,CAAC,YAAY,OAAO,CAAC;AAExB,iBAAgB;AACd,MAAI,CAAC,WAAW,CAAC,WAAW,OAAO,YAAY,SAAU;AACzD,SAAO,UAAU;AACjB,MAAI,SAAe,YAAY;AAC7B,cAAW,SAAS,IAAI;IACxB,CACC,WAAW,aAAa,QAAQ,CAAC,CACjC,OAAO,UAAU;AAChB,UAAO,UAAU;AACjB,YAAS,MAAM;IACf;IACH;EAAC;EAAS;EAAS;EAAO,CAAC;AAE9B,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,MAAD;IAAI,WAAU;cAAoC;IAE7C,CAAA,EACL,oBAAC,OAAD;IAAK,WAAU;cACb,qBAAC,OAAD;KAAK,WAAU;eAAf;MACE,oBAAC,OAAD,EAAA,UACE,qBAAC,OAAD;OACE,OAAM;OACN,QAAO;OACP,SAAQ;OACR,MAAK;OACL,OAAM;iBALR;QAOE,oBAAC,QAAD;SACE,UAAS;SACT,UAAS;SACT,GAAE;SACF,MAAK;SACL,CAAA;QACF,oBAAC,QAAD;SACE,GAAE;SACF,MAAK;SACL,CAAA;QACF,oBAAC,QAAD;SACE,GAAE;SACF,MAAK;SACL,CAAA;QACF,oBAAC,QAAD;SACE,GAAE;SACF,MAAK;SACL,CAAA;QACF,qBAAC,QAAD,EAAA,UAAA;SACE,qBAAC,kBAAD;UACE,IAAG;UACH,IAAG;UACH,IAAG;UACH,GAAE;UACF,eAAc;UACd,mBAAkB;oBANpB,CAQE,oBAAC,QAAD;WAAM,QAAO;WAAW,WAAU;WAAY,CAAA,EAC9C,oBAAC,QAAD;WAAM,QAAO;WAAI,WAAU;WAAY,CAAA,CACxB;;SACjB,qBAAC,kBAAD;UACE,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UACH,eAAc;oBANhB,CAQE,oBAAC,QAAD,EAAM,WAAU,WAAY,CAAA,EAC5B,oBAAC,QAAD;WAAM,QAAO;WAAI,WAAU;WAAY,CAAA,CACxB;;SACjB,qBAAC,kBAAD;UACE,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UACH,eAAc;oBANhB,CAQE,oBAAC,QAAD,EAAM,WAAU,WAAY,CAAA,EAC5B,oBAAC,QAAD;WAAM,QAAO;WAAI,WAAU;WAAY,CAAA,CACxB;;SACjB,qBAAC,kBAAD;UACE,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UACH,eAAc;oBANhB,CAQE,oBAAC,QAAD,EAAM,WAAU,WAAY,CAAA,EAC5B,oBAAC,QAAD;WAAM,QAAO;WAAI,WAAU;WAAY,CAAA,CACxB;;SACZ,EAAA,CAAA;QACH;UACF,CAAA;MACL,WACC,oBAAC,OAAD;OAAK,WAAU;iBAA6B;OAEtC,CAAA,GAEN,oBAAC,OAAD;OAAK,WAAU;iBAA6B;OAEtC,CAAA;MAER,oBAAC,kBAAD;OACE,SACE,WACI,OAAO,SAAS,OAAO,KAAK,OAAO,SAAS,GAC5C;OAEN,MAAK;OACL,OAAM;OACN,WAAU;iBAET,WACC,UACE,UACF,qBAAA,UAAA,EAAA,UAAA,CACE,qBAAC,OAAD;QACE,WAAU;QACV,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;kBANR,CAQE,oBAAC,QAAD;SACE,GAAE;SACF,MAAK;SACL,CAAA,EACF,oBAAC,QAAD;SACE,GAAE;SACF,MAAK;SACL,CAAA,CACE;qBAEL,EAAA,CAAA,GAEH;OAEe,CAAA;MACf;;IACF,CAAA,CACF;;EACF,CAAA;;;;ACzOV,SAAS,aAAa,QAAuB;CAC3C,MAAM,iBAAiB,cAAc;AAErC,QAAO,oBAAoB,QAAQ;EACjC,UAAU;EACV,QAAQ;GACN,mBAAmB;GACnB,sBAAsB;GACvB;EACF,CAAC;;AAGJ,SAAS,eAAe;AAqBtB,QAAO,CACL;EACE,SACE,oBAAC,UAAD;GAAU,MAAK;aACb,oBAAC,MAAD,EAAQ,CAAA;GACC,CAAA;EAEb,UA3B0B,CAC5B;GACE,OAAO;GACP,MAAM;GACN,SACE,oBAAC,UAAD;IAAU,MAAK;cACb,oBAAC,SAAD,EAAW,CAAA;IACF,CAAA;GAEd,EACD;GACE,MAAM;GACN,SACE,oBAAC,UAAD;IAAU,MAAK;cACb,oBAAC,aAAD,EAAe,CAAA;IACN,CAAA;GAEd,CACF;EAUE,CACF;;AAIH,MAAM,SAAS,aADA,cAAc,CACM;AAEnC,MAAa,eAAe;AAC1B,QAAO,oBAAC,gBAAD,EAAwB,QAAU,CAAA;;;;ACnC3C,SAAgB,UAAU;CACxB,MAAM,OAAO,SAAS;CACtB,MAAM,SAAS,WAAW;CAC1B,MAAM,CAAC,iBAAiB,sBAAsB;CAC9C,MAAM,mBAAmB,qBAAqB;CAC9C,MAAM,eAAe,aAAa,QAAQ,gBAAgB,KAAK;CAE/D,MAAM,wBAAwB;AAC5B,cAAY,EAAE,MAAM,YAAY,CAAC;;CAGnC,MAAM,wBAAwB;AAC5B,cAAY,EAAE,MAAM,YAAY,CAAC;;CAGnC,MAAM,yBAAyB;AAC7B,cAAY,EAAE,MAAM,aAAa,CAAC;;CAGpC,MAAM,eAAe,MAAM,UACvB,gCAAgC,KAAK,YACrC;AAEJ,QACE,oBAAC,wBAAD,EAAA,UACE,oBAAC,gBAAD;EACE,IAAG;EACH,eAAe,iBAAiB,KAAA,EAAU;EACzB;EACjB,kBAAkB,mBAAmB,mBAAmB,KAAA;EACxD,SAAS,MAAM;EACf,SAAS;EACT,cAAc;EACA;EACd,WAAW;EACX,oBAAoB,YAAY,EAAE,MAAM,iBAAiB,CAAC;YAE1D,qBAACC,iBAAD;GACE,SAAQ;GACR,iBAAgB;GAChB,eAAe,CAAC,WAAW,UAAU;aAHvC,CAKG,QAAQ,KAAK,OAAO,UACnB,oBAAC,aAAD;IAEE,OAAO,MAAM,OAAO;IACpB,eAAe,iBAAiB,MAAM;IACtC,QAAQ,eAAe,OAAO,OAAO,MAAM,OAAO;IAClD,MAAM,oBAAC,WAAD,EAAkB,OAAS,CAAA;IACjC,EALK,MAKL,CACF,EACD,cAAc,OAAO,mBACpB,oBAAC,qBAAD,EAAqB,SAAS,iBAAmB,CAAA,CAErC;;EACD,CAAA,EACM,CAAA"}
|
|
1
|
+
{"version":3,"file":"sidebar-CP_Du6Zs.js","names":["listeners","getInitial","subscribe","logger","logger","ErrorBoundary","ReactErrorBoundary","AddDriveModal","CreateDocumentModal","DriveSettingsModal","SettingsModal","ErrorBoundary","CookieBanner","CookieBanner","PHCookieBanner","ErrorBoundary","ErrorBoundary","ErrorBoundary"],"sources":["../src/hooks/useAcceptedCookies.ts","../src/hooks/useCookieBanner.ts","../src/hooks/useInitSentry.ts","../src/hooks/useUndoRedoShortcuts.ts","../src/components/analytics.tsx","../src/utils/browser.ts","../src/utils/document-editor-debug-tools.ts","../src/components/app-skeleton.tsx","../src/components/error-boundary.tsx","../src/components/modal/modals-container.tsx","../src/components/app-loader.tsx","../src/context/sentry-provider.tsx","../src/components/app.tsx","../src/components/cookie-banner.tsx","../src/components/document-editor-container.tsx","../src/components/editor-loader.tsx","../src/components/drive-editor-container.tsx","../src/components/drive-icon.tsx","../src/components/editors.tsx","../src/components/root.tsx","../src/pages/content.tsx","../src/pages/demo/atlas-import.tsx","../src/components/router.tsx","../src/components/sidebar.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useSyncExternalStore } from \"react\";\n\nconst namespace = connectConfig.routerBasename;\n\nconst ACCEPTED_COOKIES_KEY_STORAGE = `${namespace}:acceptedCookies`;\n\nexport interface AcceptedCookies {\n analytics: boolean;\n marketing: boolean;\n functional: boolean;\n}\n\nconst listeners = new Set<() => void>();\n\nlet cookies: AcceptedCookies = getInitial();\n\nfunction getInitial(): AcceptedCookies {\n try {\n const value = localStorage.getItem(ACCEPTED_COOKIES_KEY_STORAGE);\n return value\n ? (JSON.parse(value) as AcceptedCookies)\n : { analytics: false, marketing: false, functional: false };\n } catch {\n return { analytics: false, marketing: false, functional: false };\n }\n}\n\nfunction getCookies(): AcceptedCookies {\n return cookies;\n}\n\nfunction setCookies(setter: (prev: AcceptedCookies) => AcceptedCookies) {\n cookies = setter(cookies);\n localStorage.setItem(ACCEPTED_COOKIES_KEY_STORAGE, JSON.stringify(cookies));\n listeners.forEach((fn) => fn());\n}\n\nfunction subscribe(fn: () => void) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n}\n\nexport const useAcceptedCookies = () => {\n const cookies = useSyncExternalStore(subscribe, getCookies, getCookies);\n return [cookies, setCookies] as const;\n};\n","import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useSyncExternalStore } from \"react\";\n\nconst namespace = connectConfig.routerBasename;\n\nexport const COOKIE_BANNER_KEY_STORAGE = `${namespace}:display-cookie-banner`;\n\nconst listeners = new Set<() => void>();\n\nlet bannerShown = getInitial();\n\nfunction getInitial(): boolean {\n try {\n const value = localStorage.getItem(COOKIE_BANNER_KEY_STORAGE);\n return value !== \"false\";\n } catch (error) {\n console.error(error);\n return true;\n }\n}\n\nfunction getCookieBannerState(): boolean {\n return bannerShown;\n}\n\nfunction setCookieBannerState(state: boolean) {\n bannerShown = state;\n localStorage.setItem(COOKIE_BANNER_KEY_STORAGE, JSON.stringify(state));\n}\n\nfunction subscribe(fn: () => void) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n}\n\nexport const useCookieBanner = () => {\n const cookieBannerShown = useSyncExternalStore(\n subscribe,\n getCookieBannerState,\n getCookieBannerState,\n );\n return [cookieBannerShown, setCookieBannerState] as const;\n};\n","import { connectConfig } from \"@powerhousedao/connect/config\";\n\nimport type { BrowserOptions } from \"@sentry/react\";\n\nimport { childLogger } from \"document-model\";\nimport React, { useEffect } from \"react\";\nimport {\n createRoutesFromChildren,\n matchRoutes,\n useLocation,\n useNavigationType,\n} from \"react-router-dom\";\nimport { useAcceptedCookies } from \"./useAcceptedCookies.js\";\n\nconst logger = childLogger([\"sentry\"]);\n\nlet clientStarted = false;\n\nasync function getSentry() {\n return await import(\"@sentry/react\");\n}\n\nasync function initSentry() {\n const release = connectConfig.sentry;\n\n const Sentry = await getSentry();\n const integrations: BrowserOptions[\"integrations\"] = [\n Sentry.httpClientIntegration(),\n Sentry.extraErrorDataIntegration({ depth: 5 }),\n Sentry.replayIntegration(),\n Sentry.captureConsoleIntegration({ levels: [\"error\"] }),\n ];\n if (connectConfig.sentry.tracing) {\n integrations.push(\n Sentry.reactRouterV6BrowserTracingIntegration({\n useEffect: React.useEffect,\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n }),\n );\n }\n\n Sentry.init({\n release: connectConfig.sentry.release,\n dsn: connectConfig.sentry.dsn,\n environment: connectConfig.sentry.env,\n integrations,\n ignoreErrors: [\n \"User is not allowed to create files\",\n \"User is not allowed to move documents\",\n \"The user aborted a request.\",\n ],\n sendDefaultPii: true,\n tracesSampleRate: 1.0,\n replaysSessionSampleRate: 0.1,\n replaysOnErrorSampleRate: 1.0,\n beforeSend(event, hint) {\n const error = hint.originalException;\n if (\n error instanceof TypeError &&\n error.message.includes(\"Failed to fetch\") &&\n !navigator.onLine\n ) {\n // If fetch fails because user is offline then ignores the error\n return null;\n }\n return event;\n },\n });\n\n clientStarted = true;\n}\n\nasync function closeClient() {\n if (!clientStarted) {\n return;\n }\n const sentry = await getSentry();\n const client = sentry.getClient();\n return client?.close();\n}\n\nexport function useInitSentry() {\n const [acceptedCookies] = useAcceptedCookies();\n const { analytics } = acceptedCookies;\n\n useEffect(() => {\n if (!analytics) {\n closeClient().catch((error: unknown) => logger.error(\"@error\", error));\n return;\n }\n\n if (\n clientStarted ||\n !connectConfig.sentry.dsn ||\n connectConfig.sentry.dsn === \"\"\n ) {\n return;\n }\n\n initSentry().catch((error: unknown) => logger.error(\"@error\", error));\n }, [analytics]);\n}\n","import { useHotkeys } from \"react-hotkeys-hook\";\n\nexport interface UseUndoRedoShortcutsProps {\n undo: () => void;\n redo: () => void;\n canUndo: boolean;\n canRedo: boolean;\n}\n\nexport const useUndoRedoShortcuts = (props: UseUndoRedoShortcutsProps) => {\n const { undo, redo, canRedo, canUndo } = props;\n const isMac = window.navigator.userAgent.includes(\"Mac\");\n\n let undoShortcut = \"ctrl+z\";\n let redoShortcut = \"ctrl+y\";\n\n if (isMac) {\n undoShortcut = \"mod+z\";\n redoShortcut = \"mod+shift+z\";\n }\n\n // set handler for undo\n useHotkeys(\n undoShortcut,\n (event) => {\n event.preventDefault();\n if (canUndo) {\n undo();\n }\n },\n {},\n [canUndo, undo],\n );\n\n // set handler for redo\n useHotkeys(\n redoShortcut,\n (event) => {\n event.preventDefault();\n if (canRedo) {\n redo();\n }\n },\n {},\n [canRedo, redo],\n );\n};\n","import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useAcceptedCookies } from \"@powerhousedao/connect/hooks\";\nimport { useEffect } from \"react\";\n\ndeclare global {\n interface Window {\n gtag?: (...args: any[]) => void;\n dataLayer?: any[];\n }\n}\n\nfunction gtag(...args: (string | Date)[]) {\n window.dataLayer?.push(...args);\n}\n\nexport const Analytics = () => {\n const gaTrackingId = connectConfig.gaTrackingId;\n const [{ analytics }] = useAcceptedCookies();\n const useAnalytics = gaTrackingId && analytics;\n\n useEffect(() => {\n if (useAnalytics) {\n // Create the GA script tag\n const script = document.createElement(\"script\");\n script.src = `https://www.googletagmanager.com/gtag/js?id=${gaTrackingId}`;\n script.async = true;\n document.head.appendChild(script);\n\n // Initialize GA\n window.dataLayer = window.dataLayer || [];\n\n gtag(\"js\", new Date());\n gtag(\"config\", gaTrackingId);\n\n // Clean up the script if no longer enabled\n return () => {\n document.head.removeChild(script);\n };\n }\n }, [useAnalytics, gaTrackingId]);\n\n return null;\n};\n","export function getBasePath() {\n if (typeof document === \"undefined\") {\n return \"/\";\n }\n\n const baseEl = document.querySelector(\"base\");\n const href = baseEl?.getAttribute(\"href\");\n return href || \"/\";\n}\n","import type {\n Operation,\n PHDocument,\n} from \"@powerhousedao/shared/document-model\";\n\nexport class DocumentEditorDebugTools {\n private document: PHDocument | undefined;\n private operations: Operation[] = [];\n\n constructor(document?: PHDocument) {\n if (document) {\n this.document = document;\n }\n }\n\n private operationsToTableObject(operations: Operation[]) {\n return operations.map((op) => ({\n ...op,\n input: JSON.stringify(op.action.input),\n }));\n }\n\n public setDocument(document: PHDocument) {\n this.document = document;\n }\n\n public getDocument() {\n return this.document;\n }\n\n public getOperations() {\n return this.operations;\n }\n\n public pushOperation(operation: Operation) {\n this.operations.push(operation);\n }\n\n public operationsTable() {\n if (!this.document) {\n console.warn(\"No document\");\n }\n const ops = Object.values(this.document?.operations || {})\n .filter((array): array is Operation[] => array !== undefined)\n .flatMap((array) => array)\n .sort((a, b) => a.index - b.index);\n\n console.table(this.operationsToTableObject(ops));\n }\n\n public scopeOperationsTable(scope: string) {\n if (!this.document) {\n console.warn(\"No document\");\n }\n const ops = this.document?.operations[scope] || [];\n console.table(this.operationsToTableObject(ops));\n }\n\n public operationsLog() {\n console.log(this.operations);\n }\n\n public operationsLogTable() {\n console.table(this.operationsToTableObject(this.operations));\n }\n\n public clear() {\n this.operations = [];\n this.document = undefined;\n }\n}\n","import { getBasePath } from \"@powerhousedao/connect/utils\";\nimport {\n AnimatedLoader,\n ConnectSidebar,\n HomeScreen,\n} from \"@powerhousedao/design-system/connect\";\nimport { useEffect, useState } from \"react\";\nconst LOADER_DELAY = 250;\n\nconst Loader = ({ delay = LOADER_DELAY }: { delay?: number }) => {\n const isSSR = typeof window === \"undefined\";\n const showInitialLoader =\n typeof document !== \"undefined\" &&\n document.body.getAttribute(\"data-show-loader\") === \"true\";\n\n const [showLoading, setShowLoading] = useState(!delay || showInitialLoader);\n\n useEffect(() => {\n const id = setTimeout(() => {\n setShowLoading(true);\n }, delay);\n\n return () => clearTimeout(id);\n }, []);\n\n return (\n <div\n className={`skeleton-loader absolute inset-0 z-10 flex items-center justify-center ${showLoading ? \"\" : \"hidden\"}`}\n >\n <div className=\"animate-pulse overflow-hidden rounded-full shadow-lg\">\n <AnimatedLoader />\n </div>\n {isSSR ? (\n <script\n dangerouslySetInnerHTML={{\n __html: `setTimeout(() => {\n document.querySelector('.skeleton-loader')?.classList.remove('hidden');\n document.body.setAttribute('data-show-loader', 'true');\n }, ${delay})`,\n }}\n />\n ) : null}\n </div>\n );\n};\n\nexport const AppSkeleton = () => {\n const isSSR = typeof window === \"undefined\";\n const isHomeScreen = !isSSR && window.location.pathname === getBasePath();\n return (\n <div className=\"flex h-screen\">\n <ConnectSidebar\n className=\"animate-pulse\"\n onLogin={undefined}\n onDisconnect={undefined}\n onClickSettings={undefined}\n address={undefined}\n />\n <HomeScreen\n containerClassName={\n isSSR || !isHomeScreen ? \"hidden home-screen\" : undefined\n }\n children={null}\n />\n {isSSR ? (\n <script\n dangerouslySetInnerHTML={{\n __html: `\n const baseEl = document.querySelector('base');\n const href = baseEl?.getAttribute('href');\n const basePath = href || '/';\n if (window.location.pathname === basePath) {\n document.querySelector('.home-screen')?.classList.remove('hidden')\n }`,\n }}\n />\n ) : null}\n <Loader />\n </div>\n );\n};\n\nexport default AppSkeleton;\n","import { childLogger } from \"document-model\";\nimport type { ReactNode } from \"react\";\nimport {\n ErrorBoundary as ReactErrorBoundary,\n type FallbackProps,\n} from \"react-error-boundary\";\n\nconst logger = childLogger([\"Connect\"]);\n\n/**\n * Available fallback UI variants for the ErrorBoundary component.\n *\n * - `\"silent\"` - Renders nothing when an error occurs (useful for modals)\n * - `\"text\"` - Displays a simple centered text message\n * - `\"detailed\"` - Shows full error details including message and JSON representation\n */\ntype ErrorFallbackVariant = \"silent\" | \"text\" | \"detailed\";\n\n/**\n * Base props shared by all ErrorBoundary configurations.\n */\ntype BaseErrorBoundaryProps = {\n /** Content to wrap with error boundary protection */\n children: ReactNode;\n /** Optional callback invoked when an error is caught (in addition to logging) */\n onError?: (error: Error, info: React.ErrorInfo) => void;\n /** When any value in this array changes, the error boundary resets */\n resetKeys?: unknown[];\n /** Logger context path for error logging (e.g., [\"Connect\", \"Editor\"]) */\n loggerContext?: string[];\n};\n\n/**\n * Props for using a predefined fallback variant.\n */\ntype VariantErrorBoundaryProps = BaseErrorBoundaryProps & {\n /** The fallback UI variant to display on error */\n variant: ErrorFallbackVariant;\n /** Custom message for the \"text\" variant (default: \"Something went wrong\") */\n fallbackMessage?: string;\n};\n\n/**\n * Props for using a custom fallback render function.\n */\ntype CustomFallbackErrorBoundaryProps = BaseErrorBoundaryProps & {\n /** Custom render function for the fallback UI */\n fallbackRender: (props: FallbackProps) => ReactNode;\n};\n\n/**\n * Union type for all ErrorBoundary prop configurations.\n * Use either a variant or a custom fallbackRender, but not both.\n */\ntype ErrorBoundaryProps =\n | VariantErrorBoundaryProps\n | CustomFallbackErrorBoundaryProps;\n\nfunction hasCustomFallback(\n props: ErrorBoundaryProps,\n): props is CustomFallbackErrorBoundaryProps {\n return \"fallbackRender\" in props;\n}\n\nfunction SilentFallback() {\n return null;\n}\n\n/**\n * Simple text-based fallback component.\n * Displays a centered message when an error occurs.\n */\nfunction TextFallback({\n message = \"Something went wrong\",\n}: {\n message?: string;\n}) {\n return <div className=\"text-center\">{message}</div>;\n}\n\n/**\n * Detailed fallback component showing full error information.\n * Displays error message and JSON representation of the error object.\n * Useful for development and debugging purposes.\n */\nfunction DetailedFallback({ error }: FallbackProps) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return (\n <div className=\"mx-auto flex max-w-[80%] flex-1 flex-col items-center justify-center\">\n <h1 className=\"mb-2 text-xl font-semibold\">Error</h1>\n <i>{errorMessage}</i>\n <pre>{JSON.stringify(error, null, 2)}</pre>\n </div>\n );\n}\n\n/**\n * Centered error message fallback component.\n * Displays the error message in a centered, full-size container.\n * Suitable for use as a custom fallbackRender when you need simple error display.\n */\nfunction CenteredErrorMessage({ error }: FallbackProps) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return (\n <div className=\"flex size-full items-center justify-center\">\n <h3 className=\"text-lg font-semibold\">{errorMessage}</h3>\n </div>\n );\n}\n\nfunction getFallbackComponent(\n variant: ErrorFallbackVariant,\n fallbackMessage?: string,\n): (props: FallbackProps) => ReactNode {\n switch (variant) {\n case \"silent\":\n return SilentFallback;\n case \"text\":\n return () => <TextFallback message={fallbackMessage} />;\n case \"detailed\":\n return DetailedFallback;\n default:\n return CenteredErrorMessage;\n }\n}\n\n/**\n * Unified error boundary component for catching and handling React errors.\n *\n * Built on top of `react-error-boundary`, this component provides:\n * - Automatic error logging with configurable context\n * - Multiple fallback UI variants (silent, text, detailed)\n * - Support for custom fallback render functions\n * - Reset capability via `resetKeys`\n *\n * @example\n * // Using a predefined variant\n * <ErrorBoundary variant=\"detailed\" loggerContext={[\"Connect\", \"Editor\"]}>\n * <EditorComponent />\n * </ErrorBoundary>\n *\n * @example\n * // Using a custom message with the text variant\n * <ErrorBoundary variant=\"text\" fallbackMessage=\"Failed to load drives\">\n * <DrivesList />\n * </ErrorBoundary>\n *\n * @example\n * // Using a custom fallback render\n * <ErrorBoundary\n * fallbackRender={CenteredErrorMessage}\n * onError={(error) => trackError(error)}\n * >\n * <MyComponent />\n * </ErrorBoundary>\n *\n * @example\n * // Silent mode for modals (renders null on error)\n * <ErrorBoundary variant=\"silent\" loggerContext={[\"Connect\", \"Modals\"]}>\n * <ModalContent />\n * </ErrorBoundary>\n */\nexport function ErrorBoundary(props: ErrorBoundaryProps) {\n const { children, onError, resetKeys, loggerContext } = props;\n\n const handleError = (error: Error, info: React.ErrorInfo) => {\n if (\n error.message.includes(\"Failed to fetch dynamically imported module\") &&\n error.message.includes(\"node_modules/.vite\")\n ) {\n console.error(error);\n console.log(\"Outdated chunk detected, reloading page...\");\n window.location.reload();\n return;\n }\n\n const contextLogger = loggerContext ? childLogger(loggerContext) : logger;\n contextLogger.error(\"@error @info\", error, info);\n onError?.(error, info);\n };\n\n const fallbackRender = hasCustomFallback(props)\n ? props.fallbackRender\n : getFallbackComponent(props.variant, props.fallbackMessage);\n\n return (\n <ReactErrorBoundary\n fallbackRender={fallbackRender}\n onError={handleError}\n resetKeys={resetKeys}\n >\n {children}\n </ReactErrorBoundary>\n );\n}\n\nexport { CenteredErrorMessage, DetailedFallback, TextFallback };\nexport type { FallbackProps };\n","import { usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { lazy, Suspense } from \"react\";\nimport { ErrorBoundary } from \"../error-boundary.js\";\n\nconst AddDriveModal = lazy(() =>\n import(\"./modals/AddDriveModal.js\").then((m) => ({\n default: m.AddDriveModal,\n })),\n);\nconst ClearStorageModal = lazy(() =>\n import(\"./modals/ClearStorageModal.js\").then((m) => ({\n default: m.ClearStorageModal,\n })),\n);\nconst CookiesPolicyModal = lazy(() =>\n import(\"./modals/CookiesPolicyModal.js\").then((m) => ({\n default: m.CookiesPolicyModal,\n })),\n);\nconst CreateDocumentModal = lazy(() =>\n import(\"./modals/CreateDocumentModal.js\").then((m) => ({\n default: m.CreateDocumentModal,\n })),\n);\nconst DebugSettingsModal = lazy(() =>\n import(\"./modals/DebugSettingsModal.js\").then((m) => ({\n default: m.DebugSettingsModal,\n })),\n);\nconst DeleteDriveModal = lazy(() =>\n import(\"./modals/DeleteDriveModal.js\").then((m) => ({\n default: m.DeleteDriveModal,\n })),\n);\nconst DeleteItemModal = lazy(() =>\n import(\"./modals/DeleteItemModal.js\").then((m) => ({\n default: m.DeleteItemModal,\n })),\n);\nconst DisclaimerModal = lazy(() =>\n import(\"./modals/DisclaimerModal.js\").then((m) => ({\n default: m.DisclaimerModal,\n })),\n);\nconst DriveSettingsModal = lazy(() =>\n import(\"./modals/DriveSettingsModal.js\").then((m) => ({\n default: m.DriveSettingsModal,\n })),\n);\nconst ExportDocumentWithErrorsModal = lazy(() =>\n import(\"./modals/ExportDocumentWithErrorsModal.js\").then((m) => ({\n default: m.ExportDocumentWithErrorsModal,\n })),\n);\nconst SettingsModal = lazy(() =>\n import(\"./modals/SettingsModal.js\").then((m) => ({\n default: m.SettingsModal,\n })),\n);\nconst UpgradeDriveModal = lazy(() =>\n import(\"./modals/UpgradeDriveModal.js\").then((m) => ({\n default: m.UpgradeDriveModal,\n })),\n);\nconst InspectorModal = lazy(() =>\n import(\"./modals/InspectorModal/index.js\").then((m) => ({\n default: m.InspectorModal,\n })),\n);\nconst MissingPackageModal = lazy(() =>\n import(\"./modals/MissingPackageModal.js\").then((m) => ({\n default: m.ConnectMissingPackageModal,\n })),\n);\nconst modalComponents = {\n addDrive: AddDriveModal,\n clearStorage: ClearStorageModal,\n cookiesPolicy: CookiesPolicyModal,\n createDocument: CreateDocumentModal,\n debugSettings: DebugSettingsModal,\n deleteDrive: DeleteDriveModal,\n deleteItem: DeleteItemModal,\n disclaimer: DisclaimerModal,\n driveSettings: DriveSettingsModal,\n exportDocumentWithErrors: ExportDocumentWithErrorsModal,\n inspector: InspectorModal,\n settings: SettingsModal,\n upgradeDrive: UpgradeDriveModal,\n missingPackage: MissingPackageModal,\n} as const;\n\nexport const ModalsContainer = lazy(async () => {\n return {\n default: () => {\n const phModal = usePHModal();\n\n if (!phModal?.type) return null;\n\n const ModalComponent = modalComponents[phModal.type];\n\n return ModalComponent ? (\n <ErrorBoundary variant=\"silent\" loggerContext={[\"Connect\", \"Modals\"]}>\n <Suspense fallback={null}>\n <ModalComponent />\n </Suspense>\n </ErrorBoundary>\n ) : null;\n },\n };\n});\n","import \"@powerhousedao/connect/i18n\";\nimport type { VetraPackage } from \"@powerhousedao/reactor-browser\";\nimport { lazy, StrictMode, Suspense } from \"react\";\nimport AppSkeleton from \"./app-skeleton.js\";\nimport { App, CookieBanner } from \"./index.js\";\nimport { ModalsContainer } from \"./modal/modals-container.js\";\n\nexport const AppLoader = (props: { localPackage?: VetraPackage }) => {\n const Load = lazy(() =>\n import(\"./load.js\").then((m) => m.loadComponent(props.localPackage)),\n );\n return (\n <StrictMode>\n <Suspense fallback={<AppSkeleton />} name=\"AppLoader\">\n <Load {...props}>\n <App />\n </Load>\n </Suspense>\n <Suspense name=\"CookieBanner\">\n <CookieBanner />\n </Suspense>\n <Suspense name=\"ModalsContainer\">\n <ModalsContainer />\n </Suspense>\n </StrictMode>\n );\n};\n","import { useInitSentry } from \"@powerhousedao/connect/hooks\";\n\ninterface SentryProviderProps {\n children?: React.ReactNode;\n}\n\nexport const SentryProvider: React.FC<SentryProviderProps> = ({ children }) => {\n useInitSentry();\n\n return children;\n};\n","import { Analytics, Router } from \"@powerhousedao/connect/components\";\n\nimport { SentryProvider } from \"@powerhousedao/connect/context\";\nimport {\n DocumentEditorDebugTools,\n serviceWorkerManager,\n} from \"@powerhousedao/connect/utils\";\nimport {\n ToastContainer,\n WagmiContext,\n} from \"@powerhousedao/design-system/connect\";\nimport { useEffect } from \"react\";\nexport const App = () => {\n // refresh page on vite preload error due to outdated chunks\n useEffect(() => {\n const handlePreloadError = () => {\n console.log(\"Outdated chunks detected, reloading page...\");\n window.location.reload();\n };\n\n window.addEventListener(\"vite:preloadError\", handlePreloadError);\n\n return () => {\n window.removeEventListener(\"vite:preloadError\", handlePreloadError);\n };\n }, []);\n\n useEffect(() => {\n if (import.meta.env.MODE === \"development\") {\n window.documentEditorDebugTools = new DocumentEditorDebugTools();\n } else {\n serviceWorkerManager.registerServiceWorker(false);\n }\n }, []);\n\n return (\n <SentryProvider>\n <WagmiContext>\n <ToastContainer position=\"bottom-right\" containerId=\"connect\" />\n <Router />\n <Analytics />\n </WagmiContext>\n </SentryProvider>\n );\n};\n","import {\n useAcceptedCookies,\n useCookieBanner,\n} from \"@powerhousedao/connect/hooks\";\nimport type { CookieInput } from \"@powerhousedao/design-system/connect\";\nimport { CookieBanner as PHCookieBanner } from \"@powerhousedao/design-system/connect\";\nimport { showPHModal } from \"@powerhousedao/reactor-browser\";\nimport { Trans, useTranslation } from \"react-i18next\";\nimport { i18n } from \"@powerhousedao/connect/i18n\";\n\nconst isCookieAccepted = (cookies: CookieInput[], id: string) => {\n return cookies.some((cookie) => cookie.id === id && cookie.value);\n};\n\nexport const CookieBanner = () => {\n const { t } = useTranslation(undefined, {\n useSuspense: true,\n i18n,\n });\n const [showBanner, setShowBanner] = useCookieBanner();\n const [, setAcceptedCookies] = useAcceptedCookies();\n\n const cookiesInput: CookieInput[] = [\n {\n id: \"analytics-cookie\",\n label: t(\"cookieBanner.cookies.analytics\"),\n value: true,\n },\n ];\n\n const handleAccept = (cookies: CookieInput[]) => {\n setShowBanner(false);\n\n if (isCookieAccepted(cookies, \"analytics-cookie\")) {\n setAcceptedCookies((acceptedCookies) => ({\n ...acceptedCookies,\n analytics: true,\n }));\n }\n };\n\n const handleReject = () => {\n setShowBanner(false);\n setAcceptedCookies(() => ({\n analytics: false,\n functional: false,\n marketing: false,\n }));\n };\n\n if (!showBanner) {\n return null;\n }\n\n return (\n <div className=\"absolute inset-0 z-[10000] backdrop-blur-sm\">\n <div className=\"absolute inset-0 bg-black opacity-15\" />\n <div className=\"absolute inset-x-0 bottom-0 flex justify-center bg-white px-10 pb-16 pt-10 shadow-lg\">\n <PHCookieBanner\n className=\"max-w-[1024px]\"\n cookies={cookiesInput}\n onSubmit={handleAccept}\n onReject={handleReject}\n submitLabel={t(\"cookieBanner.accept\")}\n rejectLabel={t(\"cookieBanner.reject\")}\n >\n <p className=\"font-semibold text-gray-500\">\n <Trans\n key={\"cookieBanner.message\"}\n i18nKey=\"cookieBanner.message\"\n components={{\n a: (\n <a\n onClick={() => showPHModal({ type: \"cookiesPolicy\" })}\n key={\"cookieBanner.message-link\"}\n className=\"cursor-pointer text-gray-900 hover:underline\"\n />\n ),\n }}\n />\n </p>\n </PHCookieBanner>\n </div>\n </div>\n );\n};\n","import { DocumentEditor } from \"@powerhousedao/connect/components\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport {\n exportFile,\n setSelectedNode,\n showPHModal,\n useNodeParentFolderById,\n useSelectedDocument,\n validateDocument,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function DocumentEditorContainer() {\n const [selectedDocument] = useSelectedDocument();\n const parentFolder = useNodeParentFolderById(selectedDocument.header.id);\n\n const onExport = useCallback(() => {\n const validationErrors = validateDocument(selectedDocument);\n\n if (validationErrors.length) {\n showPHModal({\n type: \"exportDocumentWithErrors\",\n documentId: selectedDocument.header.id,\n });\n } else {\n exportFile(selectedDocument).catch((error: any) => {\n console.error(error);\n const errorMessage =\n error instanceof Error\n ? error.message\n : JSON.stringify(error, null, 1);\n toast(`Failed to export document: ${errorMessage}`);\n });\n }\n }, [selectedDocument]);\n\n // TODO: unused\n const onOpenSwitchboardLink = useMemo(() => {\n return async () => {\n //\n };\n }, []);\n\n const onClose = useCallback(() => {\n setSelectedNode(parentFolder);\n }, [parentFolder, setSelectedNode]);\n\n return (\n <div\n id=\"document-editor-container\"\n className=\"flex-1\"\n data-document-type={selectedDocument.header.documentType}\n >\n <DocumentEditor\n document={selectedDocument}\n onClose={onClose}\n onExport={onExport}\n onOpenSwitchboardLink={onOpenSwitchboardLink}\n />\n </div>\n );\n}\n","import { DefaultEditorLoader } from \"@powerhousedao/design-system/connect\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { useEffect, useState } from \"react\";\n\ntype Props = ComponentProps<typeof DefaultEditorLoader> & {\n loadingTimeout?: number;\n customEditorLoader?: ReactNode;\n};\nexport function EditorLoader(props: Props) {\n const [showLoading, setShowLoading] = useState(false);\n\n // only shows the loader after some time has passed\n useEffect(() => {\n setTimeout(() => {\n setShowLoading(true);\n }, props.loadingTimeout ?? 200);\n }, [props]);\n\n if (!showLoading) return null;\n\n const { customEditorLoader, ...defaultProps } = props;\n\n if (customEditorLoader) return <>{customEditorLoader}</>;\n\n return <DefaultEditorLoader {...defaultProps} />;\n}\n","import { GenericDriveExplorer } from \"@powerhousedao/powerhouse-vetra-packages/editors\";\nimport { DropZoneWrapper } from \"@powerhousedao/design-system/connect\";\nimport {\n useDefaultDriveEditorModule,\n useDriveEditorModuleById,\n useSelectedDocumentId,\n useSelectedDrive,\n} from \"@powerhousedao/reactor-browser\";\nimport { Suspense } from \"react\";\nimport { DocumentEditorContainer } from \"./document-editor-container.js\";\nimport { EditorLoader } from \"./editor-loader.js\";\nimport { ErrorBoundary } from \"./error-boundary.js\";\n\nexport function DriveEditorContainer() {\n const [selectedDrive] = useSelectedDrive();\n const selectedDocumentId = useSelectedDocumentId();\n\n const driveEditor = useDriveEditorModuleById(\n selectedDrive.header.meta?.preferredEditor,\n );\n const defaultDriveEditor = useDefaultDriveEditorModule();\n\n const DriveEditorComponent =\n driveEditor?.Component ??\n defaultDriveEditor?.Component ??\n GenericDriveExplorer.Component;\n\n if (!DriveEditorComponent) {\n throw new Error(\"No drive editor component found\");\n }\n return (\n <ErrorBoundary\n variant=\"detailed\"\n resetKeys={[selectedDrive.header.id]}\n loggerContext={[\"Connect\", \"DriveEditor\"]}\n >\n <Suspense fallback={<EditorLoader />}>\n <DropZoneWrapper className=\"flex h-full flex-col overflow-auto\">\n <DriveEditorComponent>\n {selectedDocumentId ? <DocumentEditorContainer /> : null}\n </DriveEditorComponent>\n </DropZoneWrapper>\n </Suspense>\n </ErrorBoundary>\n );\n}\n","import { Icon } from \"@powerhousedao/design-system\";\nimport { driveCollectionId, useSyncList } from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport { useMemo } from \"react\";\n\nexport function DriveIcon({\n drive,\n}: {\n drive: DocumentDriveDocument | undefined;\n}) {\n const remotes = useSyncList();\n const isRemoteDrive = useMemo(() => {\n if (!drive) return false;\n\n return remotes.some(\n (remote) =>\n remote.collectionId === driveCollectionId(\"main\", drive.header.id),\n );\n }, [remotes, drive]);\n\n const driveIconSrc = drive?.state.global.icon;\n\n if (driveIconSrc) {\n return (\n <img src={driveIconSrc} alt={drive.header.name} height={32} width={32} />\n );\n }\n\n if (!isRemoteDrive) {\n return <Icon name=\"Hdd\" size={32} />;\n }\n\n return <Icon name=\"Server\" size={32} />;\n}\n","import { EditorLoader } from \"@powerhousedao/connect/components\";\nimport { useUndoRedoShortcuts } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { RevisionHistory } from \"@powerhousedao/design-system/connect\";\nimport {\n getRevisionFromDate,\n setRevisionHistoryVisible,\n showPHModal,\n useDocumentById,\n useDocumentModelModuleById,\n useDocumentOperations,\n useEditorModuleById,\n useFallbackEditorModule,\n useRevisionHistoryVisible,\n useSelectedTimelineItem,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PHDocument } from \"@powerhousedao/shared/document-model\";\nimport { redo, undo } from \"@powerhousedao/shared/document-model\";\nimport { Suspense, useEffect, useState } from \"react\";\nimport { CenteredErrorMessage, ErrorBoundary } from \"./error-boundary.js\";\n\ntype Props<TDocument extends PHDocument = PHDocument> = {\n document: TDocument;\n onClose: () => void;\n onExport: () => void;\n onOpenSwitchboardLink?: () => Promise<void>;\n};\n\nfunction EditorError({ message }: { message: React.ReactNode }) {\n return (\n <div className=\"flex size-full items-center justify-center\">\n <h3 className=\"text-lg font-semibold\">{message}</h3>\n </div>\n );\n}\n\nexport const DocumentEditor: React.FC<Props> = (props) => {\n const {\n document: initialDocument,\n onClose,\n onExport,\n onOpenSwitchboardLink,\n } = props;\n const selectedTimelineItem = useSelectedTimelineItem();\n const revisionHistoryVisible = useRevisionHistoryVisible();\n const [document, dispatch] = useDocumentById(initialDocument.header.id);\n const documentId = document?.header.id ?? undefined;\n const documentName = document?.header.name ?? undefined;\n const documentType = document?.header.documentType ?? undefined;\n const preferredEditor = document?.header.meta?.preferredEditor ?? undefined;\n const {\n globalOperations,\n localOperations,\n isLoading: isLoadingOperations,\n refetch: refetchOperations,\n } = useDocumentOperations(documentId);\n\n // Refetch operations when revision history panel opens\n useEffect(() => {\n if (revisionHistoryVisible) {\n void refetchOperations();\n }\n }, [revisionHistoryVisible, refetchOperations]);\n\n const globalRevisionNumber = document?.header.revision.global ?? 0;\n const localRevisionNumber = document?.header.revision.local ?? 0;\n const documentModelModule = useDocumentModelModuleById(documentType);\n const preferredEditorModule = useEditorModuleById(preferredEditor);\n const fallbackEditorModule = useFallbackEditorModule(documentType);\n const editorModule = preferredEditorModule ?? fallbackEditorModule;\n const isLoadingDocument = !document;\n const isLoadingEditor =\n editorModule &&\n documentType &&\n !editorModule.documentTypes.includes(documentType) &&\n !editorModule.documentTypes.includes(\"*\");\n\n const canUndo = globalRevisionNumber > 0 || localRevisionNumber > 0;\n const canRedo = !!document?.clipboard.length;\n const addUndoAction = () => dispatch(undo());\n const addRedoAction = () => dispatch(redo());\n useUndoRedoShortcuts({\n undo: addUndoAction,\n redo: addRedoAction,\n canUndo,\n canRedo,\n });\n\n useEffect(() => {\n return () => {\n window.documentEditorDebugTools?.clear();\n };\n }, []);\n\n const [editorError, setEditorError] = useState<\n | {\n error: any;\n info: React.ErrorInfo;\n documentId?: string;\n // clear: () => void;\n }\n | undefined\n >(undefined);\n\n useEffect(() => {\n if (editorError && editorError.documentId !== documentId) {\n setEditorError(undefined);\n }\n }, [editorError, documentId]);\n\n const handleEditorError = (error: Error, info: React.ErrorInfo) => {\n setEditorError({\n error,\n documentId,\n info,\n });\n };\n\n if (isLoadingEditor) {\n return <EditorLoader message=\"Loading editor\" />;\n }\n\n if (isLoadingDocument) {\n return <EditorLoader message=\"Loading document\" />;\n }\n\n if (!documentModelModule) {\n return (\n <EditorError\n message={\n <div className=\"text-center leading-10\">\n <p>\n Unable to open the document because the document model \"\n {documentType}\" is not supported.\n </p>\n <p>\n Go to the{\" \"}\n <button\n type=\"button\"\n className=\"cursor-pointer underline\"\n onClick={() => {\n showPHModal({ type: \"settings\" });\n }}\n >\n package manager\n </button>{\" \"}\n to install this document model\n </p>\n </div>\n }\n />\n );\n }\n\n if (!editorModule) {\n return (\n <EditorError\n message={\n <div className=\"text-center leading-10\">\n <p>Unable to open the document because no editor has been found</p>\n <p>\n Go to the{\" \"}\n <button\n type=\"button\"\n className=\"cursor-pointer underline\"\n onClick={() => {\n showPHModal({ type: \"settings\" });\n }}\n >\n package manager\n </button>{\" \"}\n an editor for the \"${documentType}\" document type\n </p>\n </div>\n }\n />\n );\n }\n const EditorComponent = editorModule.Component;\n\n return (\n <div\n className=\"relative h-full\"\n id=\"document-editor-context\"\n data-editor={editorModule.id}\n data-document-type={documentType}\n >\n {revisionHistoryVisible ? (\n isLoadingOperations ? (\n <EditorLoader message=\"Loading operations\" />\n ) : (\n <RevisionHistory\n key={documentId}\n documentTitle={documentName ?? \"\"}\n documentId={documentId ?? \"\"}\n globalOperations={globalOperations}\n localOperations={localOperations}\n onClose={() => setRevisionHistoryVisible(false)}\n documentState={document.state}\n onCopyState={() => {\n toast(\"Copied document state to clipboard\", { type: \"success\" });\n }}\n onCopyDocId={() => {\n toast(\"Copied document ID to clipboard\", { type: \"success\" });\n }}\n />\n )\n ) : (\n <Suspense\n fallback={<EditorLoader message=\"Loading editor\" />}\n name=\"EditorLoader\"\n >\n <ErrorBoundary\n fallbackRender={CenteredErrorMessage}\n resetKeys={[documentId]}\n onError={handleEditorError}\n loggerContext={[\"Connect\", \"DocumentEditor\"]}\n >\n {!editorError?.error && (\n <EditorComponent\n key={documentId}\n context={{\n readMode: !!selectedTimelineItem,\n selectedTimelineRevision: getRevisionFromDate(\n selectedTimelineItem?.startDate,\n selectedTimelineItem?.endDate,\n globalOperations,\n ),\n }}\n documentId={document.header.id}\n />\n )}\n </ErrorBoundary>\n </Suspense>\n )}\n </div>\n );\n};\n","import { Sidebar } from \"@powerhousedao/connect/components\";\nimport { Suspense } from \"react\";\nimport { Outlet } from \"react-router-dom\";\n\nexport function Root() {\n return (\n <div className=\"h-screen\">\n <div\n className={`flex h-screen items-stretch overflow-auto`}\n role=\"presentation\"\n tabIndex={0}\n >\n <Suspense name=\"Root\">\n <Sidebar />\n <div className=\"relative flex-1 overflow-auto\">\n <Outlet />\n </div>\n </Suspense>\n </div>\n </div>\n );\n}\n","import {\n DriveEditorContainer,\n DriveIcon,\n} from \"@powerhousedao/connect/components\";\nimport {\n connectConfig,\n defaultPHDocumentEditorConfig,\n defaultPHDriveEditorConfig,\n} from \"@powerhousedao/connect/config\";\nimport {\n HomeScreen,\n HomeScreenAddDriveItem,\n HomeScreenItem,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n setPHDocumentEditorConfig,\n setPHDriveEditorConfig,\n setSelectedDrive,\n useDriveEditorModuleById,\n useDrives,\n useSelectedDocumentId,\n useSelectedDriveSafe,\n useSelectedFolder,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport { useEffect } from \"react\";\n\nexport function Content() {\n const [selectedDrive] = useSelectedDriveSafe();\n const selectedFolder = useSelectedFolder();\n const selectedDocumentId = useSelectedDocumentId();\n\n useEffect(() => {\n if (!selectedDocumentId) {\n setPHDocumentEditorConfig(defaultPHDocumentEditorConfig);\n }\n }, [selectedDocumentId]);\n\n useEffect(() => {\n if (!selectedDrive) {\n setPHDriveEditorConfig(defaultPHDriveEditorConfig);\n }\n }, [selectedDrive]);\n\n const showHomeScreen =\n !selectedDocumentId && !selectedDrive && !selectedFolder;\n return (\n <ContentContainer>\n {showHomeScreen ? <HomeScreenContainer /> : <DriveEditorContainer />}\n </ContentContainer>\n );\n}\n\nfunction ContentContainer({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex h-full flex-col overflow-auto\" id=\"content-view\">\n {children}\n </div>\n );\n}\n\nfunction DriveItem({ drive }: { drive: DocumentDriveDocument }) {\n const editorModule = useDriveEditorModuleById(\n drive.header.meta?.preferredEditor,\n );\n const description = editorModule?.name || \"Drive Explorer App\";\n return (\n <HomeScreenItem\n key={drive.header.id}\n title={drive.state.global.name}\n description={description}\n icon={<DriveIcon drive={drive} />}\n onClick={() => setSelectedDrive(drive)}\n />\n );\n}\n\nfunction HomeScreenContainer() {\n const drives = useDrives();\n const config = connectConfig;\n return (\n <HomeScreen>\n {drives?.map((drive) => {\n return <DriveItem key={drive.header.id} drive={drive} />;\n })}\n {config.drives.addDriveEnabled && <HomeScreenAddDriveItem />}\n </HomeScreen>\n );\n}\n","import { toast } from \"@powerhousedao/connect/services\";\nimport { PowerhouseButton } from \"@powerhousedao/design-system\";\nimport {\n addRemoteDrive,\n useReactorClient,\n} from \"@powerhousedao/reactor-browser\";\nimport { gql, request } from \"graphql-request\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLocation, useNavigate, useParams } from \"react-router-dom\";\n\nconst REACTOR_URL = \"https://apps.powerhouse.io/sky-atlas/staging/switchboard\";\nconst MIN_LOADING_TIME = 2000;\n\nfunction useReactorUrl() {\n const { search } = useLocation();\n return useMemo(() => {\n const params = new URLSearchParams(search);\n const url = params.get(\"reactorUrl\") ?? REACTOR_URL;\n return url.endsWith(\"/\") ? url : `${url}/`;\n }, [search]);\n}\n\nasync function forkAtlas(\n docId: string,\n reactorUrl: string,\n): Promise<{ ForkAtlas: string }> {\n const document = gql`\n mutation ForkAtlas($docId: PHID) {\n ForkAtlas(docId: $docId)\n }\n `;\n return await request(`${reactorUrl}graphql`, document, { docId });\n}\n\nexport function AtlasImport() {\n const status = useRef<\n \"initial\" | \"forking\" | \"forked\" | \"addingDrive\" | \"done\" | \"error\"\n >(\"initial\");\n const reactor = useReactorClient();\n const { documentId } = useParams();\n const reactorUrl = useReactorUrl();\n const navigate = useNavigate();\n const [driveId, setDriveId] = useState<string | undefined>(undefined);\n const [error, setError] = useState<unknown>(undefined);\n const [loading, setLoading] = useState(true);\n const hasError = status.current === \"error\";\n\n useEffect(() => {\n if (error) {\n console.error(\"Error forking Atlas:\", error);\n toast(\"Error forking Atlas\", { type: \"error\" });\n }\n }, [error]);\n\n async function forkAtlasDocument(documentId: string) {\n const result = await forkAtlas(documentId, reactorUrl);\n const driveId = result.ForkAtlas;\n status.current = \"forked\";\n setDriveId(driveId);\n }\n\n const redirectToDrive = useCallback(() => {\n if (driveId && !loading) {\n navigate(`/d/${driveId}`, { replace: true });\n }\n }, [driveId, navigate, loading]);\n\n const addForkDrive = useCallback(\n async (driveId: string) => {\n console.log(\"Adding remote drive:\", driveId);\n const driveUrl = `${reactorUrl}d/${driveId}`;\n try {\n const addedDrive = await addRemoteDrive(driveUrl);\n status.current = \"done\";\n console.log(\"Added remote drive:\", addedDrive);\n setTimeout(() => {\n setLoading(false);\n }, MIN_LOADING_TIME);\n } catch (error) {\n status.current = \"error\";\n setLoading(false);\n setError(error);\n }\n },\n [addRemoteDrive, navigate, reactorUrl],\n );\n\n useEffect(() => {\n if (!documentId || status.current !== \"initial\") return;\n status.current = \"forking\";\n forkAtlasDocument(documentId).catch((error) => {\n status.current = \"error\";\n setError(error);\n });\n }, [documentId, status]);\n\n useEffect(() => {\n if (!driveId || !reactor || status.current !== \"forked\") return;\n status.current = \"addingDrive\";\n new Promise<void>((resolve) => {\n setTimeout(resolve, 500);\n })\n .then(() => addForkDrive(driveId))\n .catch((error) => {\n status.current = \"error\";\n setError(error);\n });\n }, [driveId, reactor, status]);\n\n return (\n <div className=\"flex size-full justify-center gap-x-4 bg-gray-50\">\n <div className=\"w-full max-w-[850px] rounded-2xl bg-white p-6 drop-shadow-sm\">\n <h1 className=\"text-lg font-medium text-gray-900\">\n Welcome to the Atlas Explorer\n </h1>\n <div className=\"mt-4 rounded-xl border border-gray-200 bg-gray-50 p-6\">\n <div className=\"flex min-h-80 flex-col items-center justify-center rounded-2xl bg-slate-50\">\n <div>\n <svg\n width=\"28\"\n height=\"32\"\n viewBox=\"0 0 28 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0.05092 23.7286L0.000163347 23.9993L0 23.9995L0.207853 24.067L27.6823 24.067L27.9995 23.9995L27.9161 23.6913L14.2182 0.209032L13.9998 0L13.749 0.246353L0.05092 23.7286ZM20.9994 11.9999L7.0003 11.9999L13.9998 23.999L20.9994 11.9999Z\"\n fill=\"url(#paint0_radial_319_20865)\"\n />\n <path\n d=\"M14 0L0 23.9998V7.99993L14 0Z\"\n fill=\"url(#paint1_linear_319_20865)\"\n />\n <path\n d=\"M28 24L7.82013e-05 24L14 31.9999L28 24Z\"\n fill=\"url(#paint2_linear_319_20865)\"\n />\n <path\n d=\"M14 0L28 23.9998V7.99993L14 0Z\"\n fill=\"url(#paint3_linear_319_20865)\"\n />\n <defs>\n <radialGradient\n id=\"paint0_radial_319_20865\"\n cx=\"0\"\n cy=\"0\"\n r=\"1\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"translate(13.9994 16.0344) rotate(-89.9988) scale(16.0344 16.201)\"\n >\n <stop offset=\"0.181008\" stopColor=\"#FFCD6B\" />\n <stop offset=\"1\" stopColor=\"#EB5EDF\" />\n </radialGradient>\n <linearGradient\n id=\"paint1_linear_319_20865\"\n x1=\"-0.031454\"\n y1=\"24.041\"\n x2=\"13.801\"\n y2=\"-0.142908\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#4331E9\" />\n <stop offset=\"1\" stopColor=\"#A273FF\" />\n </linearGradient>\n <linearGradient\n id=\"paint2_linear_319_20865\"\n x1=\"-0.0310093\"\n y1=\"24\"\n x2=\"28.0444\"\n y2=\"24\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#A273FF\" />\n <stop offset=\"1\" stopColor=\"#4331E9\" />\n </linearGradient>\n <linearGradient\n id=\"paint3_linear_319_20865\"\n x1=\"28.0315\"\n y1=\"24.041\"\n x2=\"14.199\"\n y2=\"-0.142908\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#A273FF\" />\n <stop offset=\"1\" stopColor=\"#4331E9\" />\n </linearGradient>\n </defs>\n </svg>\n </div>\n {hasError ? (\n <div className=\"mt-3 text-sm text-gray-800\">\n Error forking Atlas scope. Please try again.\n </div>\n ) : (\n <div className=\"mt-3 text-sm text-gray-500\">\n Forking Atlas scope...\n </div>\n )}\n <PowerhouseButton\n onClick={\n hasError\n ? window.location.reload.bind(window.location)\n : redirectToDrive\n }\n size=\"small\"\n color=\"light\"\n className=\"mt-4 h-9 border border-gray-200 bg-white px-3 text-gray-600\"\n >\n {hasError ? (\n \"Retry\"\n ) : loading ? (\n <>\n <svg\n className=\"animate-spin\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.6867 8.03333C15.4933 7.83999 15.1733 7.83999 14.98 8.03333L14.6733 8.34001V8C14.6733 4.32 11.68 1.32666 7.99999 1.32666C5.96666 1.32666 4.06666 2.23999 2.79333 3.82666C2.61999 4.03999 2.65332 4.35999 2.87332 4.52665C3.08666 4.69999 3.40666 4.66666 3.57332 4.44666C4.65999 3.09332 6.27332 2.31999 7.99999 2.31999C11.1267 2.31999 13.6733 4.86666 13.6733 7.99333V8.32666L13.3667 8.02002C13.1733 7.82669 12.8533 7.82669 12.66 8.02002C12.4667 8.21335 12.4667 8.53335 12.66 8.72668L13.82 9.88668C13.8667 9.93334 13.92 9.96666 13.98 9.99333C14.04 10.02 14.1067 10.0333 14.1733 10.0333C14.24 10.0333 14.3 10.02 14.3667 9.99333C14.4267 9.96666 14.48 9.93334 14.5267 9.88668L15.6867 8.72668C15.88 8.54668 15.88 8.22666 15.6867 8.03333Z\"\n fill=\"#6C7275\"\n />\n <path\n d=\"M13.1267 11.4666C12.9133 11.2933 12.5933 11.3266 12.4267 11.5466C11.34 12.9 9.72665 13.6733 7.99998 13.6733C4.87332 13.6733 2.32665 11.1266 2.32665 7.99996V7.66663L2.63332 7.97331C2.73332 8.07331 2.85999 8.11996 2.98665 8.11996C3.11332 8.11996 3.23999 8.07331 3.33999 7.97331C3.53332 7.77998 3.53332 7.45998 3.33999 7.26664L2.17998 6.10661C2.13332 6.05994 2.07998 6.02663 2.01998 5.99996C1.89998 5.94663 1.75998 5.94663 1.63998 5.99996C1.57998 6.02663 1.52665 6.05994 1.47999 6.10661L0.319988 7.26664C0.126654 7.45998 0.126654 7.77998 0.319988 7.97331C0.513321 8.16664 0.833319 8.16664 1.02665 7.97331L1.33332 7.66663V7.99996C1.33332 11.68 4.32665 14.6733 8.00665 14.6733C10.04 14.6733 11.94 13.76 13.2133 12.1733C13.38 11.96 13.3467 11.64 13.1267 11.4666Z\"\n fill=\"#6C7275\"\n />\n </svg>\n Loading\n </>\n ) : (\n \"Continue\"\n )}\n </PowerhouseButton>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { Root } from \"@powerhousedao/connect/components\";\nimport { connectConfig } from \"@powerhousedao/connect/config\";\nimport { AtlasImport, Content } from \"@powerhousedao/connect/pages\";\nimport { Suspense } from \"react\";\nimport type { RouteObject } from \"react-router-dom\";\nimport { RouterProvider, createBrowserRouter } from \"react-router-dom\";\n\nfunction createRouter(routes: RouteObject[]) {\n const routerBasename = connectConfig.routerBasename;\n\n return createBrowserRouter(routes, {\n basename: routerBasename,\n future: {\n v7_fetcherPersist: true,\n v7_relativeSplatPath: true,\n },\n });\n}\n\nfunction createRoutes() {\n const routes: RouteObject[] = [\n {\n index: true,\n path: \"d?/:driveId?/*?\",\n element: (\n <Suspense name=\"Drive\">\n <Content />\n </Suspense>\n ),\n },\n {\n path: \"import/:documentId\",\n element: (\n <Suspense name=\"AtlasImport\">\n <AtlasImport />\n </Suspense>\n ),\n },\n ];\n\n return [\n {\n element: (\n <Suspense name=\"RouteRoot\">\n <Root />\n </Suspense>\n ),\n children: routes,\n },\n ];\n}\n\nconst routes = createRoutes();\nconst router = createRouter(routes);\n\nexport const Router = () => {\n return <RouterProvider router={router} />;\n};\n","import { DriveIcon } from \"@powerhousedao/connect/components\";\nimport { connectConfig } from \"@powerhousedao/connect/config\";\nimport {\n ConnectSidebar,\n ConnectTooltipProvider,\n SidebarAddDriveItem,\n SidebarItem,\n} from \"@powerhousedao/design-system/connect\";\n\nimport {\n logout,\n openRenown,\n setSelectedDrive,\n showPHModal,\n useDrives,\n useInspectorEnabled,\n useSelectedDriveSafe,\n useUser,\n} from \"@powerhousedao/reactor-browser\";\nimport { ErrorBoundary } from \"./error-boundary.js\";\n\nexport function Sidebar() {\n const user = useUser();\n const drives = useDrives();\n const [selectedDrive] = useSelectedDriveSafe();\n const inspectorEnabled = useInspectorEnabled();\n const connectDebug = localStorage.getItem(\"CONNECT_DEBUG\") === \"true\";\n\n const onClickSettings = () => {\n showPHModal({ type: \"settings\" });\n };\n\n const onAddDriveClick = () => {\n showPHModal({ type: \"addDrive\" });\n };\n\n const onInspectorClick = () => {\n showPHModal({ type: \"inspector\" });\n };\n\n const etherscanUrl = user?.address\n ? `https://etherscan.io/address/${user.address}`\n : \"\";\n\n return (\n <ConnectTooltipProvider>\n <ConnectSidebar\n id=\"sidebar\"\n onClick={() => setSelectedDrive(undefined)}\n onClickSettings={onClickSettings}\n onInspectorClick={inspectorEnabled ? onInspectorClick : undefined}\n address={user?.address}\n onLogin={openRenown}\n onDisconnect={logout}\n etherscanUrl={etherscanUrl}\n showDebug={connectDebug}\n onDebugClick={() => showPHModal({ type: \"debugSettings\" })}\n >\n <ErrorBoundary\n variant=\"text\"\n fallbackMessage=\"There was an error loading drives\"\n loggerContext={[\"Connect\", \"Sidebar\"]}\n >\n {drives?.map((drive, index) => (\n <SidebarItem\n key={index}\n title={drive.header.name}\n onClick={() => setSelectedDrive(drive)}\n active={selectedDrive?.header.id === drive.header.id}\n icon={<DriveIcon drive={drive} />}\n />\n ))}\n {connectConfig.drives.addDriveEnabled && (\n <SidebarAddDriveItem onClick={onAddDriveClick} />\n )}\n </ErrorBoundary>\n </ConnectSidebar>\n </ConnectTooltipProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAKA,MAAM,+BAA+B,GAFnB,cAAc,eAEkB;AAQlD,MAAMA,8BAAY,IAAI,KAAiB;AAEvC,IAAI,UAA2BC,cAAY;AAE3C,SAASA,eAA8B;AACrC,KAAI;EACF,MAAM,QAAQ,aAAa,QAAQ,6BAA6B;AAChE,SAAO,QACF,KAAK,MAAM,MAAM,GAClB;GAAE,WAAW;GAAO,WAAW;GAAO,YAAY;GAAO;SACvD;AACN,SAAO;GAAE,WAAW;GAAO,WAAW;GAAO,YAAY;GAAO;;;AAIpE,SAAS,aAA8B;AACrC,QAAO;;AAGT,SAAS,WAAW,QAAoD;AACtE,WAAU,OAAO,QAAQ;AACzB,cAAa,QAAQ,8BAA8B,KAAK,UAAU,QAAQ,CAAC;AAC3E,aAAU,SAAS,OAAO,IAAI,CAAC;;AAGjC,SAASC,YAAU,IAAgB;AACjC,aAAU,IAAI,GAAG;AACjB,cAAaF,YAAU,OAAO,GAAG;;AAGnC,MAAa,2BAA2B;AAEtC,QAAO,CADS,qBAAqBE,aAAW,YAAY,WAAW,EACtD,WAAW;;ACxC9B,MAAa,4BAA4B,GAFvB,cAAc,eAEsB;AAEtD,MAAM,4BAAY,IAAI,KAAiB;AAEvC,IAAI,cAAc,YAAY;AAE9B,SAAS,aAAsB;AAC7B,KAAI;AAEF,SADc,aAAa,QAAQ,0BAA0B,KAC5C;UACV,OAAO;AACd,UAAQ,MAAM,MAAM;AACpB,SAAO;;;AAIX,SAAS,uBAAgC;AACvC,QAAO;;AAGT,SAAS,qBAAqB,OAAgB;AAC5C,eAAc;AACd,cAAa,QAAQ,2BAA2B,KAAK,UAAU,MAAM,CAAC;;AAGxE,SAAS,UAAU,IAAgB;AACjC,WAAU,IAAI,GAAG;AACjB,cAAa,UAAU,OAAO,GAAG;;AAGnC,MAAa,wBAAwB;AAMnC,QAAO,CALmB,qBACxB,WACA,sBACA,qBACD,EAC0B,qBAAqB;;;;AC3BlD,MAAMC,WAAS,YAAY,CAAC,SAAS,CAAC;AAEtC,IAAI,gBAAgB;AAEpB,eAAe,YAAY;AACzB,QAAO,MAAM,OAAO;;AAGtB,eAAe,aAAa;AACV,eAAc;CAE9B,MAAM,SAAS,MAAM,WAAW;CAChC,MAAM,eAA+C;EACnD,OAAO,uBAAuB;EAC9B,OAAO,0BAA0B,EAAE,OAAO,GAAG,CAAC;EAC9C,OAAO,mBAAmB;EAC1B,OAAO,0BAA0B,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;EACxD;AACD,KAAI,cAAc,OAAO,QACvB,cAAa,KACX,OAAO,uCAAuC;EAC5C,WAAW,MAAM;EACjB;EACA;EACA;EACA;EACD,CAAC,CACH;AAGH,QAAO,KAAK;EACV,SAAS,cAAc,OAAO;EAC9B,KAAK,cAAc,OAAO;EAC1B,aAAa,cAAc,OAAO;EAClC;EACA,cAAc;GACZ;GACA;GACA;GACD;EACD,gBAAgB;EAChB,kBAAkB;EAClB,0BAA0B;EAC1B,0BAA0B;EAC1B,WAAW,OAAO,MAAM;GACtB,MAAM,QAAQ,KAAK;AACnB,OACE,iBAAiB,aACjB,MAAM,QAAQ,SAAS,kBAAkB,IACzC,CAAC,UAAU,OAGX,QAAO;AAET,UAAO;;EAEV,CAAC;AAEF,iBAAgB;;AAGlB,eAAe,cAAc;AAC3B,KAAI,CAAC,cACH;AAIF,SAFe,MAAM,WAAW,EACV,WAAW,EAClB,OAAO;;AAGxB,SAAgB,gBAAgB;CAC9B,MAAM,CAAC,mBAAmB,oBAAoB;CAC9C,MAAM,EAAE,cAAc;AAEtB,iBAAgB;AACd,MAAI,CAAC,WAAW;AACd,gBAAa,CAAC,OAAO,UAAmBA,SAAO,MAAM,UAAU,MAAM,CAAC;AACtE;;AAGF,MACE,iBACA,CAAC,cAAc,OAAO,OACtB,cAAc,OAAO,QAAQ,GAE7B;AAGF,cAAY,CAAC,OAAO,UAAmBA,SAAO,MAAM,UAAU,MAAM,CAAC;IACpE,CAAC,UAAU,CAAC;;;;AC9FjB,MAAa,wBAAwB,UAAqC;CACxE,MAAM,EAAE,MAAM,MAAM,SAAS,YAAY;CACzC,MAAM,QAAQ,OAAO,UAAU,UAAU,SAAS,MAAM;CAExD,IAAI,eAAe;CACnB,IAAI,eAAe;AAEnB,KAAI,OAAO;AACT,iBAAe;AACf,iBAAe;;AAIjB,YACE,eACC,UAAU;AACT,QAAM,gBAAgB;AACtB,MAAI,QACF,OAAM;IAGV,EAAE,EACF,CAAC,SAAS,KAAK,CAChB;AAGD,YACE,eACC,UAAU;AACT,QAAM,gBAAgB;AACtB,MAAI,QACF,OAAM;IAGV,EAAE,EACF,CAAC,SAAS,KAAK,CAChB;;;;AClCH,SAAS,KAAK,GAAG,MAAyB;AACxC,QAAO,WAAW,KAAK,GAAG,KAAK;;AAGjC,MAAa,kBAAkB;CAC7B,MAAM,eAAe,cAAc;CACnC,MAAM,CAAC,EAAE,eAAe,oBAAoB;CAC5C,MAAM,eAAe,gBAAgB;AAErC,iBAAgB;AACd,MAAI,cAAc;GAEhB,MAAM,SAAS,SAAS,cAAc,SAAS;AAC/C,UAAO,MAAM,+CAA+C;AAC5D,UAAO,QAAQ;AACf,YAAS,KAAK,YAAY,OAAO;AAGjC,UAAO,YAAY,OAAO,aAAa,EAAE;AAEzC,QAAK,sBAAM,IAAI,MAAM,CAAC;AACtB,QAAK,UAAU,aAAa;AAG5B,gBAAa;AACX,aAAS,KAAK,YAAY,OAAO;;;IAGpC,CAAC,cAAc,aAAa,CAAC;AAEhC,QAAO;;;;ACzCT,SAAgB,cAAc;AAC5B,KAAI,OAAO,aAAa,YACtB,QAAO;AAKT,QAFe,SAAS,cAAc,OAAO,EACxB,aAAa,OAAO,IAC1B;;;;ACFjB,IAAa,2BAAb,MAAsC;CACpC;CACA,aAAkC,EAAE;CAEpC,YAAY,UAAuB;AACjC,MAAI,SACF,MAAK,WAAW;;CAIpB,wBAAgC,YAAyB;AACvD,SAAO,WAAW,KAAK,QAAQ;GAC7B,GAAG;GACH,OAAO,KAAK,UAAU,GAAG,OAAO,MAAM;GACvC,EAAE;;CAGL,YAAmB,UAAsB;AACvC,OAAK,WAAW;;CAGlB,cAAqB;AACnB,SAAO,KAAK;;CAGd,gBAAuB;AACrB,SAAO,KAAK;;CAGd,cAAqB,WAAsB;AACzC,OAAK,WAAW,KAAK,UAAU;;CAGjC,kBAAyB;AACvB,MAAI,CAAC,KAAK,SACR,SAAQ,KAAK,cAAc;EAE7B,MAAM,MAAM,OAAO,OAAO,KAAK,UAAU,cAAc,EAAE,CAAC,CACvD,QAAQ,UAAgC,UAAU,KAAA,EAAU,CAC5D,SAAS,UAAU,MAAM,CACzB,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM;AAEpC,UAAQ,MAAM,KAAK,wBAAwB,IAAI,CAAC;;CAGlD,qBAA4B,OAAe;AACzC,MAAI,CAAC,KAAK,SACR,SAAQ,KAAK,cAAc;EAE7B,MAAM,MAAM,KAAK,UAAU,WAAW,UAAU,EAAE;AAClD,UAAQ,MAAM,KAAK,wBAAwB,IAAI,CAAC;;CAGlD,gBAAuB;AACrB,UAAQ,IAAI,KAAK,WAAW;;CAG9B,qBAA4B;AAC1B,UAAQ,MAAM,KAAK,wBAAwB,KAAK,WAAW,CAAC;;CAG9D,QAAe;AACb,OAAK,aAAa,EAAE;AACpB,OAAK,WAAW,KAAA;;;;;AC7DpB,MAAM,eAAe;AAErB,MAAM,UAAU,EAAE,QAAQ,mBAAuC;CAC/D,MAAM,QAAQ,OAAO,WAAW;CAChC,MAAM,oBACJ,OAAO,aAAa,eACpB,SAAS,KAAK,aAAa,mBAAmB,KAAK;CAErD,MAAM,CAAC,aAAa,kBAAkB,SAAS,CAAC,SAAS,kBAAkB;AAE3E,iBAAgB;EACd,MAAM,KAAK,iBAAiB;AAC1B,kBAAe,KAAK;KACnB,MAAM;AAET,eAAa,aAAa,GAAG;IAC5B,EAAE,CAAC;AAEN,QACE,qBAAC,OAAD;EACE,WAAW,0EAA0E,cAAc,KAAK;YAD1G,CAGE,oBAAC,OAAD;GAAK,WAAU;aACb,oBAAC,gBAAD,EAAkB,CAAA;GACd,CAAA,EACL,QACC,oBAAC,UAAD,EACE,yBAAyB,EACvB,QAAQ;;;yBAGK,MAAM,IACpB,EACD,CAAA,GACA,KACA;;;AAIV,MAAa,oBAAoB;CAC/B,MAAM,QAAQ,OAAO,WAAW;CAChC,MAAM,eAAe,CAAC,SAAS,OAAO,SAAS,aAAa,aAAa;AACzE,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,gBAAD;IACE,WAAU;IACV,SAAS,KAAA;IACT,cAAc,KAAA;IACd,iBAAiB,KAAA;IACjB,SAAS,KAAA;IACT,CAAA;GACF,oBAAC,YAAD;IACE,oBACE,SAAS,CAAC,eAAe,uBAAuB,KAAA;IAElD,UAAU;IACV,CAAA;GACD,QACC,oBAAC,UAAD,EACE,yBAAyB,EACvB,QAAQ;;;;;;wBAOT,EACD,CAAA,GACA;GACJ,oBAAC,QAAD,EAAU,CAAA;GACN;;;;;ACvEV,MAAMC,WAAS,YAAY,CAAC,UAAU,CAAC;AAmDvC,SAAS,kBACP,OAC2C;AAC3C,QAAO,oBAAoB;;AAG7B,SAAS,iBAAiB;AACxB,QAAO;;;;;;AAOT,SAAS,aAAa,EACpB,UAAU,0BAGT;AACD,QAAO,oBAAC,OAAD;EAAK,WAAU;YAAe;EAAc,CAAA;;;;;;;AAQrD,SAAS,iBAAiB,EAAE,SAAwB;CAClD,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,MAAD;IAAI,WAAU;cAA6B;IAAU,CAAA;GACrD,oBAAC,KAAD,EAAA,UAAI,cAAiB,CAAA;GACrB,oBAAC,OAAD,EAAA,UAAM,KAAK,UAAU,OAAO,MAAM,EAAE,EAAO,CAAA;GACvC;;;;;;;;AASV,SAAS,qBAAqB,EAAE,SAAwB;AAEtD,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,MAAD;GAAI,WAAU;aAHG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAGd,CAAA;EACrD,CAAA;;AAIV,SAAS,qBACP,SACA,iBACqC;AACrC,SAAQ,SAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,OACH,cAAa,oBAAC,cAAD,EAAc,SAAS,iBAAmB,CAAA;EACzD,KAAK,WACH,QAAO;EACT,QACE,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCb,SAAgBC,gBAAc,OAA2B;CACvD,MAAM,EAAE,UAAU,SAAS,WAAW,kBAAkB;CAExD,MAAM,eAAe,OAAc,SAA0B;AAC3D,MACE,MAAM,QAAQ,SAAS,8CAA8C,IACrE,MAAM,QAAQ,SAAS,qBAAqB,EAC5C;AACA,WAAQ,MAAM,MAAM;AACpB,WAAQ,IAAI,6CAA6C;AACzD,UAAO,SAAS,QAAQ;AACxB;;AAIF,GADsB,gBAAgB,YAAY,cAAc,GAAGD,UACrD,MAAM,gBAAgB,OAAO,KAAK;AAChD,YAAU,OAAO,KAAK;;AAOxB,QACE,oBAACE,eAAD;EACE,gBANmB,kBAAkB,MAAM,GAC3C,MAAM,iBACN,qBAAqB,MAAM,SAAS,MAAM,gBAAgB;EAK1D,SAAS;EACE;EAEV;EACkB,CAAA;;;;AC5LzB,MAAMC,kBAAgB,WACpB,OAAO,+BAA6B,MAAM,OAAO,EAC/C,SAAS,EAAE,eACZ,EAAE,CACJ;AACD,MAAM,oBAAoB,WACxB,OAAO,mCAAiC,MAAM,OAAO,EACnD,SAAS,EAAE,mBACZ,EAAE,CACJ;AACD,MAAM,qBAAqB,WACzB,OAAO,oCAAkC,MAAM,OAAO,EACpD,SAAS,EAAE,oBACZ,EAAE,CACJ;AACD,MAAMC,wBAAsB,WAC1B,OAAO,qCAAmC,MAAM,OAAO,EACrD,SAAS,EAAE,qBACZ,EAAE,CACJ;AACD,MAAM,qBAAqB,WACzB,OAAO,oCAAkC,MAAM,OAAO,EACpD,SAAS,EAAE,oBACZ,EAAE,CACJ;AACD,MAAM,mBAAmB,WACvB,OAAO,kCAAgC,MAAM,OAAO,EAClD,SAAS,EAAE,kBACZ,EAAE,CACJ;AACD,MAAM,kBAAkB,WACtB,OAAO,iCAA+B,MAAM,OAAO,EACjD,SAAS,EAAE,iBACZ,EAAE,CACJ;AACD,MAAM,kBAAkB,WACtB,OAAO,iCAA+B,MAAM,OAAO,EACjD,SAAS,EAAE,iBACZ,EAAE,CACJ;AACD,MAAMC,uBAAqB,WACzB,OAAO,oCAAkC,MAAM,OAAO,EACpD,SAAS,EAAE,oBACZ,EAAE,CACJ;AACD,MAAM,gCAAgC,WACpC,OAAO,+CAA6C,MAAM,OAAO,EAC/D,SAAS,EAAE,+BACZ,EAAE,CACJ;AACD,MAAMC,kBAAgB,WACpB,OAAO,+BAA6B,MAAM,OAAO,EAC/C,SAAS,EAAE,eACZ,EAAE,CACJ;AACD,MAAM,oBAAoB,WACxB,OAAO,mCAAiC,MAAM,OAAO,EACnD,SAAS,EAAE,mBACZ,EAAE,CACJ;AAWD,MAAM,kBAAkB;CACtB,UAAUH;CACV,cAAc;CACd,eAAe;CACf,gBAAgBC;CAChB,eAAe;CACf,aAAa;CACb,YAAY;CACZ,YAAY;CACZ,eAAeC;CACf,0BAA0B;CAC1B,WArBqB,WACrB,OAAO,gCAAoC,MAAM,OAAO,EACtD,SAAS,EAAE,gBACZ,EAAE,CACJ;CAkBC,UAAUC;CACV,cAAc;CACd,gBAnB0B,WAC1B,OAAO,qCAAmC,MAAM,OAAO,EACrD,SAAS,EAAE,4BACZ,EAAE,CACJ;CAgBA;AAED,MAAa,kBAAkB,KAAK,YAAY;AAC9C,QAAO,EACL,eAAe;EACb,MAAM,UAAU,YAAY;AAE5B,MAAI,CAAC,SAAS,KAAM,QAAO;EAE3B,MAAM,iBAAiB,gBAAgB,QAAQ;AAE/C,SAAO,iBACL,oBAACC,iBAAD;GAAe,SAAQ;GAAS,eAAe,CAAC,WAAW,SAAS;aAClE,oBAAC,UAAD;IAAU,UAAU;cAClB,oBAAC,gBAAD,EAAkB,CAAA;IACT,CAAA;GACG,CAAA,GACd;IAEP;EACD;;;ACtGF,MAAa,aAAa,UAA2C;CACnE,MAAM,OAAO,WACX,OAAO,sBAAa,MAAM,MAAM,EAAE,cAAc,MAAM,aAAa,CAAC,CACrE;AACD,QACE,qBAAC,YAAD,EAAA,UAAA;EACE,oBAAC,UAAD;GAAU,UAAU,oBAAC,aAAD,EAAe,CAAA;GAAE,MAAK;aACxC,oBAAC,MAAD;IAAM,GAAI;cACR,oBAAC,KAAD,EAAO,CAAA;IACF,CAAA;GACE,CAAA;EACX,oBAAC,UAAD;GAAU,MAAK;aACb,oBAACC,gBAAD,EAAgB,CAAA;GACP,CAAA;EACX,oBAAC,UAAD;GAAU,MAAK;aACb,oBAAC,iBAAD,EAAmB,CAAA;GACV,CAAA;EACA,EAAA,CAAA;;;;AClBjB,MAAa,kBAAiD,EAAE,eAAe;AAC7E,gBAAe;AAEf,QAAO;;;;ACGT,MAAa,YAAY;AAEvB,iBAAgB;EACd,MAAM,2BAA2B;AAC/B,WAAQ,IAAI,8CAA8C;AAC1D,UAAO,SAAS,QAAQ;;AAG1B,SAAO,iBAAiB,qBAAqB,mBAAmB;AAEhE,eAAa;AACX,UAAO,oBAAoB,qBAAqB,mBAAmB;;IAEpE,EAAE,CAAC;AAEN,iBAAgB;AACd,MAAI,OAAO,KAAK,IAAI,SAAS,cAC3B,QAAO,2BAA2B,IAAI,0BAA0B;MAEhE,sBAAqB,sBAAsB,MAAM;IAElD,EAAE,CAAC;AAEN,QACE,oBAAC,gBAAD,EAAA,UACE,qBAAC,cAAD,EAAA,UAAA;EACE,oBAAC,gBAAD;GAAgB,UAAS;GAAe,aAAY;GAAY,CAAA;EAChE,oBAAC,QAAD,EAAU,CAAA;EACV,oBAAC,WAAD,EAAa,CAAA;EACA,EAAA,CAAA,EACA,CAAA;;;;AChCrB,MAAM,oBAAoB,SAAwB,OAAe;AAC/D,QAAO,QAAQ,MAAM,WAAW,OAAO,OAAO,MAAM,OAAO,MAAM;;AAGnE,MAAaC,uBAAqB;CAChC,MAAM,EAAE,MAAM,eAAe,KAAA,GAAW;EACtC,aAAa;EACb;EACD,CAAC;CACF,MAAM,CAAC,YAAY,iBAAiB,iBAAiB;CACrD,MAAM,GAAG,sBAAsB,oBAAoB;CAEnD,MAAM,eAA8B,CAClC;EACE,IAAI;EACJ,OAAO,EAAE,iCAAiC;EAC1C,OAAO;EACR,CACF;CAED,MAAM,gBAAgB,YAA2B;AAC/C,gBAAc,MAAM;AAEpB,MAAI,iBAAiB,SAAS,mBAAmB,CAC/C,qBAAoB,qBAAqB;GACvC,GAAG;GACH,WAAW;GACZ,EAAE;;CAIP,MAAM,qBAAqB;AACzB,gBAAc,MAAM;AACpB,4BAA0B;GACxB,WAAW;GACX,YAAY;GACZ,WAAW;GACZ,EAAE;;AAGL,KAAI,CAAC,WACH,QAAO;AAGT,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,OAAD,EAAK,WAAU,wCAAyC,CAAA,EACxD,oBAAC,OAAD;GAAK,WAAU;aACb,oBAACC,cAAD;IACE,WAAU;IACV,SAAS;IACT,UAAU;IACV,UAAU;IACV,aAAa,EAAE,sBAAsB;IACrC,aAAa,EAAE,sBAAsB;cAErC,oBAAC,KAAD;KAAG,WAAU;eACX,oBAAC,OAAD;MAEE,SAAQ;MACR,YAAY,EACV,GACE,oBAAC,KAAD;OACE,eAAe,YAAY,EAAE,MAAM,iBAAiB,CAAC;OAErD,WAAU;OACV,EAFK,4BAEL,EAEL;MACD,EAXK,uBAWL;KACA,CAAA;IACW,CAAA;GACb,CAAA,CACF;;;;;ACvEV,SAAgB,0BAA0B;CACxC,MAAM,CAAC,oBAAoB,qBAAqB;CAChD,MAAM,eAAe,wBAAwB,iBAAiB,OAAO,GAAG;CAExE,MAAM,WAAW,kBAAkB;AAGjC,MAFyB,iBAAiB,iBAAiB,CAEtC,OACnB,aAAY;GACV,MAAM;GACN,YAAY,iBAAiB,OAAO;GACrC,CAAC;MAEF,YAAW,iBAAiB,CAAC,OAAO,UAAe;AACjD,WAAQ,MAAM,MAAM;AAKpB,WAAM,8BAHJ,iBAAiB,QACb,MAAM,UACN,KAAK,UAAU,OAAO,MAAM,EAAE,GACe;IACnD;IAEH,CAAC,iBAAiB,CAAC;CAGtB,MAAM,wBAAwB,cAAc;AAC1C,SAAO,YAAY;IAGlB,EAAE,CAAC;CAEN,MAAM,UAAU,kBAAkB;AAChC,kBAAgB,aAAa;IAC5B,CAAC,cAAc,gBAAgB,CAAC;AAEnC,QACE,oBAAC,OAAD;EACE,IAAG;EACH,WAAU;EACV,sBAAoB,iBAAiB,OAAO;YAE5C,oBAAC,gBAAD;GACE,UAAU;GACD;GACC;GACa;GACvB,CAAA;EACE,CAAA;;;;ACnDV,SAAgB,aAAa,OAAc;CACzC,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;AAGrD,iBAAgB;AACd,mBAAiB;AACf,kBAAe,KAAK;KACnB,MAAM,kBAAkB,IAAI;IAC9B,CAAC,MAAM,CAAC;AAEX,KAAI,CAAC,YAAa,QAAO;CAEzB,MAAM,EAAE,oBAAoB,GAAG,iBAAiB;AAEhD,KAAI,mBAAoB,QAAO,oBAAA,UAAA,EAAA,UAAG,oBAAsB,CAAA;AAExD,QAAO,oBAAC,qBAAD,EAAqB,GAAI,cAAgB,CAAA;;;;ACXlD,SAAgB,uBAAuB;CACrC,MAAM,CAAC,iBAAiB,kBAAkB;CAC1C,MAAM,qBAAqB,uBAAuB;CAElD,MAAM,cAAc,yBAClB,cAAc,OAAO,MAAM,gBAC5B;CACD,MAAM,qBAAqB,6BAA6B;CAExD,MAAM,uBACJ,aAAa,aACb,oBAAoB,aACpB,qBAAqB;AAEvB,KAAI,CAAC,qBACH,OAAM,IAAI,MAAM,kCAAkC;AAEpD,QACE,oBAACC,iBAAD;EACE,SAAQ;EACR,WAAW,CAAC,cAAc,OAAO,GAAG;EACpC,eAAe,CAAC,WAAW,cAAc;YAEzC,oBAAC,UAAD;GAAU,UAAU,oBAAC,cAAD,EAAgB,CAAA;aAClC,oBAAC,iBAAD;IAAiB,WAAU;cACzB,oBAAC,sBAAD,EAAA,UACG,qBAAqB,oBAAC,yBAAD,EAA2B,CAAA,GAAG,MAC/B,CAAA;IACP,CAAA;GACT,CAAA;EACG,CAAA;;;;ACtCpB,SAAgB,UAAU,EACxB,SAGC;CACD,MAAM,UAAU,aAAa;CAC7B,MAAM,gBAAgB,cAAc;AAClC,MAAI,CAAC,MAAO,QAAO;AAEnB,SAAO,QAAQ,MACZ,WACC,OAAO,iBAAiB,kBAAkB,QAAQ,MAAM,OAAO,GAAG,CACrE;IACA,CAAC,SAAS,MAAM,CAAC;CAEpB,MAAM,eAAe,OAAO,MAAM,OAAO;AAEzC,KAAI,aACF,QACE,oBAAC,OAAD;EAAK,KAAK;EAAc,KAAK,MAAM,OAAO;EAAM,QAAQ;EAAI,OAAO;EAAM,CAAA;AAI7E,KAAI,CAAC,cACH,QAAO,oBAAC,MAAD;EAAM,MAAK;EAAM,MAAM;EAAM,CAAA;AAGtC,QAAO,oBAAC,MAAD;EAAM,MAAK;EAAS,MAAM;EAAM,CAAA;;;;ACJzC,SAAS,YAAY,EAAE,WAAyC;AAC9D,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,MAAD;GAAI,WAAU;aAAyB;GAAa,CAAA;EAChD,CAAA;;AAIV,MAAa,kBAAmC,UAAU;CACxD,MAAM,EACJ,UAAU,iBACV,SACA,UACA,0BACE;CACJ,MAAM,uBAAuB,yBAAyB;CACtD,MAAM,yBAAyB,2BAA2B;CAC1D,MAAM,CAAC,UAAU,YAAY,gBAAgB,gBAAgB,OAAO,GAAG;CACvE,MAAM,aAAa,UAAU,OAAO,MAAM,KAAA;CAC1C,MAAM,eAAe,UAAU,OAAO,QAAQ,KAAA;CAC9C,MAAM,eAAe,UAAU,OAAO,gBAAgB,KAAA;CACtD,MAAM,kBAAkB,UAAU,OAAO,MAAM,mBAAmB,KAAA;CAClE,MAAM,EACJ,kBACA,iBACA,WAAW,qBACX,SAAS,sBACP,sBAAsB,WAAW;AAGrC,iBAAgB;AACd,MAAI,uBACG,oBAAmB;IAEzB,CAAC,wBAAwB,kBAAkB,CAAC;CAE/C,MAAM,uBAAuB,UAAU,OAAO,SAAS,UAAU;CACjE,MAAM,sBAAsB,UAAU,OAAO,SAAS,SAAS;CAC/D,MAAM,sBAAsB,2BAA2B,aAAa;CACpE,MAAM,wBAAwB,oBAAoB,gBAAgB;CAClE,MAAM,uBAAuB,wBAAwB,aAAa;CAClE,MAAM,eAAe,yBAAyB;CAC9C,MAAM,oBAAoB,CAAC;CAC3B,MAAM,kBACJ,gBACA,gBACA,CAAC,aAAa,cAAc,SAAS,aAAa,IAClD,CAAC,aAAa,cAAc,SAAS,IAAI;CAE3C,MAAM,UAAU,uBAAuB,KAAK,sBAAsB;CAClE,MAAM,UAAU,CAAC,CAAC,UAAU,UAAU;CACtC,MAAM,sBAAsB,SAAS,MAAM,CAAC;CAC5C,MAAM,sBAAsB,SAAS,MAAM,CAAC;AAC5C,sBAAqB;EACnB,MAAM;EACN,MAAM;EACN;EACA;EACD,CAAC;AAEF,iBAAgB;AACd,eAAa;AACX,UAAO,0BAA0B,OAAO;;IAEzC,EAAE,CAAC;CAEN,MAAM,CAAC,aAAa,kBAAkB,SAQpC,KAAA,EAAU;AAEZ,iBAAgB;AACd,MAAI,eAAe,YAAY,eAAe,WAC5C,gBAAe,KAAA,EAAU;IAE1B,CAAC,aAAa,WAAW,CAAC;CAE7B,MAAM,qBAAqB,OAAc,SAA0B;AACjE,iBAAe;GACb;GACA;GACA;GACD,CAAC;;AAGJ,KAAI,gBACF,QAAO,oBAAC,cAAD,EAAc,SAAQ,kBAAmB,CAAA;AAGlD,KAAI,kBACF,QAAO,oBAAC,cAAD,EAAc,SAAQ,oBAAqB,CAAA;AAGpD,KAAI,CAAC,oBACH,QACE,oBAAC,aAAD,EACE,SACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,qBAAC,KAAD,EAAA,UAAA;GAAG;GAEA;GAAa;GACZ,EAAA,CAAA,EACJ,qBAAC,KAAD,EAAA,UAAA;GAAG;GACS;GACV,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,eAAe;AACb,iBAAY,EAAE,MAAM,YAAY,CAAC;;cAEpC;IAEQ,CAAA;GAAC;GAAI;GAEZ,EAAA,CAAA,CACA;KAER,CAAA;AAIN,KAAI,CAAC,aACH,QACE,oBAAC,aAAD,EACE,SACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,KAAD,EAAA,UAAG,gEAAgE,CAAA,EACnE,qBAAC,KAAD,EAAA,UAAA;GAAG;GACS;GACV,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,eAAe;AACb,iBAAY,EAAE,MAAM,YAAY,CAAC;;cAEpC;IAEQ,CAAA;GAAC;GAAI;GACO;GAAa;GAChC,EAAA,CAAA,CACA;KAER,CAAA;CAGN,MAAM,kBAAkB,aAAa;AAErC,QACE,oBAAC,OAAD;EACE,WAAU;EACV,IAAG;EACH,eAAa,aAAa;EAC1B,sBAAoB;YAEnB,yBACC,sBACE,oBAAC,cAAD,EAAc,SAAQ,sBAAuB,CAAA,GAE7C,oBAAC,iBAAD;GAEE,eAAe,gBAAgB;GAC/B,YAAY,cAAc;GACR;GACD;GACjB,eAAe,0BAA0B,MAAM;GAC/C,eAAe,SAAS;GACxB,mBAAmB;AACjB,YAAM,sCAAsC,EAAE,MAAM,WAAW,CAAC;;GAElE,mBAAmB;AACjB,YAAM,mCAAmC,EAAE,MAAM,WAAW,CAAC;;GAE/D,EAbK,WAaL,GAGJ,oBAAC,UAAD;GACE,UAAU,oBAAC,cAAD,EAAc,SAAQ,kBAAmB,CAAA;GACnD,MAAK;aAEL,oBAACC,iBAAD;IACE,gBAAgB;IAChB,WAAW,CAAC,WAAW;IACvB,SAAS;IACT,eAAe,CAAC,WAAW,iBAAiB;cAE3C,CAAC,aAAa,SACb,oBAAC,iBAAD;KAEE,SAAS;MACP,UAAU,CAAC,CAAC;MACZ,0BAA0B,oBACxB,sBAAsB,WACtB,sBAAsB,SACtB,iBACD;MACF;KACD,YAAY,SAAS,OAAO;KAC5B,EAVK,WAUL;IAEU,CAAA;GACP,CAAA;EAET,CAAA;;;;ACvOV,SAAgB,OAAO;AACrB,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,OAAD;GACE,WAAW;GACX,MAAK;GACL,UAAU;aAEV,qBAAC,UAAD;IAAU,MAAK;cAAf,CACE,oBAAC,SAAD,EAAW,CAAA,EACX,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,QAAD,EAAU,CAAA;KACN,CAAA,CACG;;GACP,CAAA;EACF,CAAA;;;;ACQV,SAAgB,UAAU;CACxB,MAAM,CAAC,iBAAiB,sBAAsB;CAC9C,MAAM,iBAAiB,mBAAmB;CAC1C,MAAM,qBAAqB,uBAAuB;AAElD,iBAAgB;AACd,MAAI,CAAC,mBACH,2BAA0B,8BAA8B;IAEzD,CAAC,mBAAmB,CAAC;AAExB,iBAAgB;AACd,MAAI,CAAC,cACH,wBAAuB,2BAA2B;IAEnD,CAAC,cAAc,CAAC;AAInB,QACE,oBAAC,kBAAD,EAAA,UAFA,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,iBAGtB,oBAAC,qBAAD,EAAuB,CAAA,GAAG,oBAAC,sBAAD,EAAwB,CAAA,EACnD,CAAA;;AAIvB,SAAS,iBAAiB,EAAE,YAA2C;AACrE,QACE,oBAAC,OAAD;EAAK,WAAU;EAAqC,IAAG;EACpD;EACG,CAAA;;AAIV,SAAS,UAAU,EAAE,SAA2C;CAI9D,MAAM,cAHe,yBACnB,MAAM,OAAO,MAAM,gBACpB,EACiC,QAAQ;AAC1C,QACE,oBAAC,gBAAD;EAEE,OAAO,MAAM,MAAM,OAAO;EACb;EACb,MAAM,oBAAC,WAAD,EAAkB,OAAS,CAAA;EACjC,eAAe,iBAAiB,MAAM;EACtC,EALK,MAAM,OAAO,GAKlB;;AAIN,SAAS,sBAAsB;CAC7B,MAAM,SAAS,WAAW;CAC1B,MAAM,SAAS;AACf,QACE,qBAAC,YAAD,EAAA,UAAA,CACG,QAAQ,KAAK,UAAU;AACtB,SAAO,oBAAC,WAAD,EAAwC,OAAS,EAAjC,MAAM,OAAO,GAAoB;GACxD,EACD,OAAO,OAAO,mBAAmB,oBAAC,wBAAD,EAA0B,CAAA,CACjD,EAAA,CAAA;;;;AC5EjB,MAAM,cAAc;AACpB,MAAM,mBAAmB;AAEzB,SAAS,gBAAgB;CACvB,MAAM,EAAE,WAAW,aAAa;AAChC,QAAO,cAAc;EAEnB,MAAM,MADS,IAAI,gBAAgB,OAAO,CACvB,IAAI,aAAa,IAAI;AACxC,SAAO,IAAI,SAAS,IAAI,GAAG,MAAM,GAAG,IAAI;IACvC,CAAC,OAAO,CAAC;;AAGd,eAAe,UACb,OACA,YACgC;CAChC,MAAM,WAAW,GAAG;;;;;AAKpB,QAAO,MAAM,QAAQ,GAAG,WAAW,UAAU,UAAU,EAAE,OAAO,CAAC;;AAGnE,SAAgB,cAAc;CAC5B,MAAM,SAAS,OAEb,UAAU;CACZ,MAAM,UAAU,kBAAkB;CAClC,MAAM,EAAE,eAAe,WAAW;CAClC,MAAM,aAAa,eAAe;CAClC,MAAM,WAAW,aAAa;CAC9B,MAAM,CAAC,SAAS,cAAc,SAA6B,KAAA,EAAU;CACrE,MAAM,CAAC,OAAO,YAAY,SAAkB,KAAA,EAAU;CACtD,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,WAAW,OAAO,YAAY;AAEpC,iBAAgB;AACd,MAAI,OAAO;AACT,WAAQ,MAAM,wBAAwB,MAAM;AAC5C,WAAM,uBAAuB,EAAE,MAAM,SAAS,CAAC;;IAEhD,CAAC,MAAM,CAAC;CAEX,eAAe,kBAAkB,YAAoB;EAEnD,MAAM,WADS,MAAM,UAAU,YAAY,WAAW,EAC/B;AACvB,SAAO,UAAU;AACjB,aAAW,QAAQ;;CAGrB,MAAM,kBAAkB,kBAAkB;AACxC,MAAI,WAAW,CAAC,QACd,UAAS,MAAM,WAAW,EAAE,SAAS,MAAM,CAAC;IAE7C;EAAC;EAAS;EAAU;EAAQ,CAAC;CAEhC,MAAM,eAAe,YACnB,OAAO,YAAoB;AACzB,UAAQ,IAAI,wBAAwB,QAAQ;EAC5C,MAAM,WAAW,GAAG,WAAW,IAAI;AACnC,MAAI;GACF,MAAM,aAAa,MAAM,eAAe,SAAS;AACjD,UAAO,UAAU;AACjB,WAAQ,IAAI,uBAAuB,WAAW;AAC9C,oBAAiB;AACf,eAAW,MAAM;MAChB,iBAAiB;WACb,OAAO;AACd,UAAO,UAAU;AACjB,cAAW,MAAM;AACjB,YAAS,MAAM;;IAGnB;EAAC;EAAgB;EAAU;EAAW,CACvC;AAED,iBAAgB;AACd,MAAI,CAAC,cAAc,OAAO,YAAY,UAAW;AACjD,SAAO,UAAU;AACjB,oBAAkB,WAAW,CAAC,OAAO,UAAU;AAC7C,UAAO,UAAU;AACjB,YAAS,MAAM;IACf;IACD,CAAC,YAAY,OAAO,CAAC;AAExB,iBAAgB;AACd,MAAI,CAAC,WAAW,CAAC,WAAW,OAAO,YAAY,SAAU;AACzD,SAAO,UAAU;AACjB,MAAI,SAAe,YAAY;AAC7B,cAAW,SAAS,IAAI;IACxB,CACC,WAAW,aAAa,QAAQ,CAAC,CACjC,OAAO,UAAU;AAChB,UAAO,UAAU;AACjB,YAAS,MAAM;IACf;IACH;EAAC;EAAS;EAAS;EAAO,CAAC;AAE9B,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,MAAD;IAAI,WAAU;cAAoC;IAE7C,CAAA,EACL,oBAAC,OAAD;IAAK,WAAU;cACb,qBAAC,OAAD;KAAK,WAAU;eAAf;MACE,oBAAC,OAAD,EAAA,UACE,qBAAC,OAAD;OACE,OAAM;OACN,QAAO;OACP,SAAQ;OACR,MAAK;OACL,OAAM;iBALR;QAOE,oBAAC,QAAD;SACE,UAAS;SACT,UAAS;SACT,GAAE;SACF,MAAK;SACL,CAAA;QACF,oBAAC,QAAD;SACE,GAAE;SACF,MAAK;SACL,CAAA;QACF,oBAAC,QAAD;SACE,GAAE;SACF,MAAK;SACL,CAAA;QACF,oBAAC,QAAD;SACE,GAAE;SACF,MAAK;SACL,CAAA;QACF,qBAAC,QAAD,EAAA,UAAA;SACE,qBAAC,kBAAD;UACE,IAAG;UACH,IAAG;UACH,IAAG;UACH,GAAE;UACF,eAAc;UACd,mBAAkB;oBANpB,CAQE,oBAAC,QAAD;WAAM,QAAO;WAAW,WAAU;WAAY,CAAA,EAC9C,oBAAC,QAAD;WAAM,QAAO;WAAI,WAAU;WAAY,CAAA,CACxB;;SACjB,qBAAC,kBAAD;UACE,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UACH,eAAc;oBANhB,CAQE,oBAAC,QAAD,EAAM,WAAU,WAAY,CAAA,EAC5B,oBAAC,QAAD;WAAM,QAAO;WAAI,WAAU;WAAY,CAAA,CACxB;;SACjB,qBAAC,kBAAD;UACE,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UACH,eAAc;oBANhB,CAQE,oBAAC,QAAD,EAAM,WAAU,WAAY,CAAA,EAC5B,oBAAC,QAAD;WAAM,QAAO;WAAI,WAAU;WAAY,CAAA,CACxB;;SACjB,qBAAC,kBAAD;UACE,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UACH,IAAG;UACH,eAAc;oBANhB,CAQE,oBAAC,QAAD,EAAM,WAAU,WAAY,CAAA,EAC5B,oBAAC,QAAD;WAAM,QAAO;WAAI,WAAU;WAAY,CAAA,CACxB;;SACZ,EAAA,CAAA;QACH;UACF,CAAA;MACL,WACC,oBAAC,OAAD;OAAK,WAAU;iBAA6B;OAEtC,CAAA,GAEN,oBAAC,OAAD;OAAK,WAAU;iBAA6B;OAEtC,CAAA;MAER,oBAAC,kBAAD;OACE,SACE,WACI,OAAO,SAAS,OAAO,KAAK,OAAO,SAAS,GAC5C;OAEN,MAAK;OACL,OAAM;OACN,WAAU;iBAET,WACC,UACE,UACF,qBAAA,UAAA,EAAA,UAAA,CACE,qBAAC,OAAD;QACE,WAAU;QACV,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;kBANR,CAQE,oBAAC,QAAD;SACE,GAAE;SACF,MAAK;SACL,CAAA,EACF,oBAAC,QAAD;SACE,GAAE;SACF,MAAK;SACL,CAAA,CACE;qBAEL,EAAA,CAAA,GAEH;OAEe,CAAA;MACf;;IACF,CAAA,CACF;;EACF,CAAA;;;;ACzOV,SAAS,aAAa,QAAuB;CAC3C,MAAM,iBAAiB,cAAc;AAErC,QAAO,oBAAoB,QAAQ;EACjC,UAAU;EACV,QAAQ;GACN,mBAAmB;GACnB,sBAAsB;GACvB;EACF,CAAC;;AAGJ,SAAS,eAAe;AAqBtB,QAAO,CACL;EACE,SACE,oBAAC,UAAD;GAAU,MAAK;aACb,oBAAC,MAAD,EAAQ,CAAA;GACC,CAAA;EAEb,UA3B0B,CAC5B;GACE,OAAO;GACP,MAAM;GACN,SACE,oBAAC,UAAD;IAAU,MAAK;cACb,oBAAC,SAAD,EAAW,CAAA;IACF,CAAA;GAEd,EACD;GACE,MAAM;GACN,SACE,oBAAC,UAAD;IAAU,MAAK;cACb,oBAAC,aAAD,EAAe,CAAA;IACN,CAAA;GAEd,CACF;EAUE,CACF;;AAIH,MAAM,SAAS,aADA,cAAc,CACM;AAEnC,MAAa,eAAe;AAC1B,QAAO,oBAAC,gBAAD,EAAwB,QAAU,CAAA;;;;ACnC3C,SAAgB,UAAU;CACxB,MAAM,OAAO,SAAS;CACtB,MAAM,SAAS,WAAW;CAC1B,MAAM,CAAC,iBAAiB,sBAAsB;CAC9C,MAAM,mBAAmB,qBAAqB;CAC9C,MAAM,eAAe,aAAa,QAAQ,gBAAgB,KAAK;CAE/D,MAAM,wBAAwB;AAC5B,cAAY,EAAE,MAAM,YAAY,CAAC;;CAGnC,MAAM,wBAAwB;AAC5B,cAAY,EAAE,MAAM,YAAY,CAAC;;CAGnC,MAAM,yBAAyB;AAC7B,cAAY,EAAE,MAAM,aAAa,CAAC;;CAGpC,MAAM,eAAe,MAAM,UACvB,gCAAgC,KAAK,YACrC;AAEJ,QACE,oBAAC,wBAAD,EAAA,UACE,oBAAC,gBAAD;EACE,IAAG;EACH,eAAe,iBAAiB,KAAA,EAAU;EACzB;EACjB,kBAAkB,mBAAmB,mBAAmB,KAAA;EACxD,SAAS,MAAM;EACf,SAAS;EACT,cAAc;EACA;EACd,WAAW;EACX,oBAAoB,YAAY,EAAE,MAAM,iBAAiB,CAAC;YAE1D,qBAACC,iBAAD;GACE,SAAQ;GACR,iBAAgB;GAChB,eAAe,CAAC,WAAW,UAAU;aAHvC,CAKG,QAAQ,KAAK,OAAO,UACnB,oBAAC,aAAD;IAEE,OAAO,MAAM,OAAO;IACpB,eAAe,iBAAiB,MAAM;IACtC,QAAQ,eAAe,OAAO,OAAO,MAAM,OAAO;IAClD,MAAM,oBAAC,WAAD,EAAkB,OAAS,CAAA;IACjC,EALK,MAKL,CACF,EACD,cAAc,OAAO,mBACpB,oBAAC,qBAAD,EAAqB,SAAS,iBAAmB,CAAA,CAErC;;EACD,CAAA,EACM,CAAA"}
|
package/dist/start-connect.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as AppLoader } from "./sidebar-
|
|
1
|
+
import { t as AppLoader } from "./sidebar-CP_Du6Zs.js";
|
|
2
2
|
import { convertLegacyLibToVetraPackage } from "@powerhousedao/reactor-browser";
|
|
3
3
|
import { createRoot } from "react-dom/client";
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/connect",
|
|
3
3
|
"productName": "Powerhouse-Connect",
|
|
4
|
-
"version": "6.0.0-dev.
|
|
4
|
+
"version": "6.0.0-dev.126",
|
|
5
5
|
"description": "Powerhouse Connect",
|
|
6
6
|
"main": "dist/index.html",
|
|
7
7
|
"type": "module",
|
|
@@ -65,14 +65,14 @@
|
|
|
65
65
|
"react-router-dom": "^6.11.2",
|
|
66
66
|
"tailwind-merge": "3.4.0",
|
|
67
67
|
"usehooks-ts": "^3.1.1",
|
|
68
|
-
"@powerhousedao/design-system": "6.0.0-dev.
|
|
69
|
-
"@powerhousedao/
|
|
70
|
-
"@powerhousedao/
|
|
71
|
-
"@powerhousedao/
|
|
72
|
-
"@
|
|
73
|
-
"@powerhousedao/
|
|
74
|
-
"@
|
|
75
|
-
"document-model": "6.0.0-dev.
|
|
68
|
+
"@powerhousedao/design-system": "6.0.0-dev.126",
|
|
69
|
+
"@powerhousedao/reactor-browser": "6.0.0-dev.126",
|
|
70
|
+
"@powerhousedao/shared": "6.0.0-dev.126",
|
|
71
|
+
"@powerhousedao/config": "6.0.0-dev.126",
|
|
72
|
+
"@powerhousedao/powerhouse-vetra-packages": "6.0.0-dev.126",
|
|
73
|
+
"@powerhousedao/vetra": "6.0.0-dev.126",
|
|
74
|
+
"@renown/sdk": "6.0.0-dev.126",
|
|
75
|
+
"document-model": "6.0.0-dev.126"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
78
|
"@tailwindcss/cli": "4.2.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"package-CmSTDors.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reactor-0ePhFy1l.js","names":["#storage","#cdnUrl","#toCdnUrl","#loadCommonPackage","#registerPackage","#loadVetraPackage","#localPackage","#packagesMemo","#packages","#loadPackage","#unmountStylesheet","#notifyPackagesChanged","#subscribers","#loadPackageFromNodeModules","#importPackage","#loadPackageFromRegistry","#mountStylesheet","#stylesheets"],"sources":["../src/utils/reactor.ts","../src/store/document-model.ts","../src/store/editor.ts","../src/feature-flags.ts","../src/package-manager.ts","../src/pglite.db.ts","../src/store/processor-host-module.ts","../src/store/reactor.ts"],"sourcesContent":["import { PGlite } from \"@electric-sql/pglite\";\nimport {\n addRemoteDrive,\n ChannelScheme,\n ReactorBuilder,\n ReactorClientBuilder,\n type BrowserReactorClientModule,\n type Database,\n type IDocumentModelLoader,\n type JwtHandler,\n type SignerConfig,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n DocumentModelModule,\n UpgradeManifest,\n} from \"@powerhousedao/shared/document-model\";\nimport { createSignatureVerifier, type IRenown } from \"@renown/sdk\";\nimport { ConsoleLogger } from \"document-model\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\n\n/**\n * Creates a Reactor that plugs into legacy storage but syncs through the new\n * Reactor GQL API.\n */\nexport async function createBrowserReactor(\n documentModelModules: DocumentModelModule[],\n upgradeManifests: UpgradeManifest<readonly number[]>[],\n renown: IRenown,\n documentModelLoader?: IDocumentModelLoader,\n): Promise<BrowserReactorClientModule> {\n const signerConfig: SignerConfig = {\n signer: renown.signer,\n verifier: createSignatureVerifier(),\n };\n\n const jwtHandler: JwtHandler = async (url: string) => {\n if (!renown.user) {\n return undefined;\n }\n return renown.getBearerToken({ expiresIn: 10, aud: url });\n };\n\n const pg = new PGlite(\"idb://reactor\", {\n relaxedDurability: true,\n });\n const logger = new ConsoleLogger([\"reactor-client\"]);\n const builder = new ReactorClientBuilder()\n .withLogger(logger)\n .withSigner(signerConfig)\n .withReactorBuilder(\n new ReactorBuilder()\n .withDocumentModels(documentModelModules)\n .withUpgradeManifests(upgradeManifests)\n .withChannelScheme(ChannelScheme.CONNECT)\n .withJwtHandler(jwtHandler)\n .withKysely(\n new Kysely<Database>({\n dialect: new PGliteDialect(pg),\n }),\n ),\n );\n\n if (documentModelLoader) {\n builder.withDocumentModelLoader(documentModelLoader);\n }\n\n const module = await builder.buildModule();\n return {\n ...module,\n pg,\n } as BrowserReactorClientModule;\n}\n\n/**\n * Parse default drives from environment variable.\n * Returns an array of drive REST endpoint URLs (e.g., \"https://example.com/d/powerhouse\").\n */\nexport function getDefaultDrivesFromEnv(): string[] {\n const envValue = import.meta.env.PH_CONNECT_DEFAULT_DRIVES_URL as\n | string\n | undefined;\n if (!envValue) return [];\n return envValue.split(\",\").filter((url) => url.trim().length > 0);\n}\n\n/**\n * Add default drives for the new reactor via sync manager.\n * @param defaultDriveUrls - Array of drive REST endpoint URLs (e.g., \"https://example.com/d/powerhouse\")\n */\nexport async function addDefaultDrivesForNewReactor(\n defaultDriveUrls: string[],\n): Promise<void> {\n for (const url of defaultDriveUrls) {\n try {\n await addRemoteDrive(url);\n } catch (error) {\n console.error(`Failed to add default drive ${url}:`, error);\n }\n }\n}\n","import type { VetraDocumentModelModule } from \"@powerhousedao/reactor-browser\";\nimport { driveDocumentModelModule } from \"@powerhousedao/shared/document-drive\";\nimport {\n createState,\n defaultBaseState,\n} from \"@powerhousedao/shared/document-model\";\nimport { documentModelDocumentModelModule } from \"document-model\";\n\nexport function loadDocumentModelDocumentModelModule() {\n const global = documentModelDocumentModelModule.documentModel.global;\n const name = global.name;\n const documentType = global.id;\n const unsafeIdFromDocumentType = documentType;\n const extension = global.extension;\n const specifications = global.specifications;\n const reducer = documentModelDocumentModelModule.reducer;\n const actions = documentModelDocumentModelModule.actions;\n const utils = documentModelDocumentModelModule.utils;\n const vetraDocumentModelModule: VetraDocumentModelModule = {\n id: unsafeIdFromDocumentType,\n name,\n documentType,\n extension,\n specifications,\n reducer,\n actions,\n utils,\n documentModel: createState(defaultBaseState(), global),\n };\n return vetraDocumentModelModule;\n}\n\nexport function loadDriveDocumentModelModule() {\n const global = driveDocumentModelModule.documentModel.global;\n const name = global.name;\n const documentType = global.id;\n const unsafeIdFromDocumentType = documentType;\n const extension = global.extension;\n const specifications = global.specifications;\n const reducer = driveDocumentModelModule.reducer;\n const actions = driveDocumentModelModule.actions;\n const utils = driveDocumentModelModule.utils;\n const vetraDocumentModelModule: VetraDocumentModelModule = {\n id: unsafeIdFromDocumentType,\n name,\n documentType,\n extension,\n specifications,\n reducer,\n actions,\n utils,\n documentModel: createState(defaultBaseState(), global),\n };\n return vetraDocumentModelModule;\n}\n","import {\n DocumentModelEditor,\n GenericDriveExplorer,\n} from \"@powerhousedao/powerhouse-vetra-packages/editors\";\nimport type { VetraEditorModule } from \"@powerhousedao/reactor-browser\";\nimport { DEFAULT_DRIVE_EDITOR_ID } from \"@powerhousedao/reactor-browser\";\n\nexport function loadGenericDriveExplorerEditorModule(): VetraEditorModule {\n const name = \"Generic Drive Explorer\";\n const documentTypes = [\"powerhouse/document-drive\"];\n const Component = GenericDriveExplorer.Component;\n const vetraEditorModule: VetraEditorModule = {\n id: DEFAULT_DRIVE_EDITOR_ID,\n name,\n documentTypes,\n Component,\n };\n return vetraEditorModule;\n}\n\nexport function loadDocumentModelEditor(): VetraEditorModule {\n const name = \"Document Model Editor\";\n const id = \"document-model-editor-v2\";\n const documentTypes = [\"powerhouse/document-model\"];\n const Component = DocumentModelEditor.Component;\n const vetraEditorModule: VetraEditorModule = {\n id,\n name,\n documentTypes,\n Component,\n };\n return vetraEditorModule;\n}\n","import {\n OpenFeature,\n type ErrorCode,\n type JsonValue,\n type Provider,\n type ResolutionDetails,\n} from \"@openfeature/web-sdk\";\nimport { logger, setLogLevel, type ILogger } from \"document-model\";\nimport { connectConfig } from \"./connect.config.js\";\n\n/**\n * QueryParamProvider reads feature flags from URL query parameters.\n *\n * Usage:\n * const params = new URLSearchParams(window.location.search);\n * const provider = new QueryParamProvider(params);\n * await OpenFeature.setProviderAndWait(provider);\n *\n * Query parameter format:\n * ?FEATURE_DUAL_ACTION_CREATE_ENABLED=true&FEATURE_FOO=false\n */\nexport class QueryParamProvider implements Provider {\n public readonly runsOn = \"client\" as const;\n\n readonly metadata = {\n name: \"QueryParamProvider\",\n } as const;\n\n private flags: Map<string, string>;\n\n constructor(searchParams: URLSearchParams) {\n this.flags = new Map();\n\n // Extract all query parameters that look like feature flags\n for (const [key, value] of searchParams.entries()) {\n this.flags.set(key, value);\n }\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n ): ResolutionDetails<boolean> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n // Parse boolean from string\n const boolValue = value.toLowerCase() === \"true\" || value === \"1\";\n\n return {\n value: boolValue,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n ): ResolutionDetails<string> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n return {\n value,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n ): ResolutionDetails<number> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n const numValue = Number(value);\n\n if (isNaN(numValue)) {\n return {\n value: defaultValue,\n reason: \"ERROR\",\n errorCode: \"PARSE_ERROR\" as ErrorCode,\n errorMessage: `Failed to parse \"${value}\" as a number`,\n };\n }\n\n return {\n value: numValue,\n reason: \"STATIC\",\n variant: value,\n };\n }\n\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n ): ResolutionDetails<T> {\n const value = this.flags.get(flagKey);\n\n if (value === undefined) {\n return {\n value: defaultValue,\n reason: \"DEFAULT\",\n };\n }\n\n try {\n const objValue = JSON.parse(value) as T;\n return {\n value: objValue,\n reason: \"STATIC\",\n variant: value,\n };\n } catch (error) {\n return {\n value: defaultValue,\n reason: \"ERROR\",\n errorCode: \"PARSE_ERROR\" as ErrorCode,\n errorMessage: `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n}\n\n/**\n * Initialize OpenFeature with the QueryParamProvider.\n * Reads feature flags from query parameters.\n */\nexport async function initFeatureFlags(\n searchParams?: URLSearchParams,\n): Promise<Map<string, boolean>> {\n const params =\n searchParams ??\n (typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search)\n : new URLSearchParams());\n const provider = new QueryParamProvider(params);\n await OpenFeature.setProviderAndWait(provider);\n\n const features = new Map<string, boolean>();\n const client = OpenFeature.getClient();\n\n // Query param overrides env var for inspector\n const inspectorFromParam = params.has(FEATURE_INSPECTOR_ENABLED);\n const inspectorEnabled = inspectorFromParam\n ? client.getBooleanValue(\n FEATURE_INSPECTOR_ENABLED,\n FEATURE_INSPECTOR_ENABLED_DEFAULT,\n )\n : connectConfig.content.inspectorEnabled;\n features.set(FEATURE_INSPECTOR_ENABLED, inspectorEnabled);\n\n // Handle LOG_LEVEL query param override\n const logLevelParam = params.get(\"LOG_LEVEL\");\n if (logLevelParam) {\n const validLogLevels = [\"verbose\", \"debug\", \"info\", \"warn\", \"error\"];\n if (validLogLevels.includes(logLevelParam.toLowerCase())) {\n setLogLevel(logLevelParam.toLowerCase() as ILogger[\"level\"]);\n logger.info(\n \"Log level set to @level via query param\",\n logLevelParam.toLowerCase(),\n );\n } else {\n logger.warn(\n \"Invalid LOG_LEVEL query param: @param. Valid values: @validLevels\",\n logLevelParam,\n validLogLevels.join(\", \"),\n );\n }\n }\n\n return features;\n}\n\nconst FEATURE_INSPECTOR_ENABLED = \"FEATURE_INSPECTOR_ENABLED\";\nconst FEATURE_INSPECTOR_ENABLED_DEFAULT = false;\n\n/**\n * If true, shows the inspector button in the sidebar.\n * Defaults to false (hidden).\n */\nexport async function isInspectorEnabled(): Promise<boolean> {\n const client = OpenFeature.getClient();\n return Promise.resolve(\n client.getBooleanValue(\n FEATURE_INSPECTOR_ENABLED,\n FEATURE_INSPECTOR_ENABLED_DEFAULT,\n ),\n );\n}\n","import type {\n IPackagesListener,\n PackageManagerInstallResult,\n VetraPackage,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n BrowserLocalStorage,\n COMMON_PACKAGE_ID,\n convertLegacyLibToVetraPackage,\n type IPackageListerUnsubscribe,\n type IPackageManager,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n type DocumentModelLib,\n type DocumentModelModule,\n} from \"@powerhousedao/shared/document-model\";\nimport * as vetraVetraPackage from \"@powerhousedao/vetra\";\nimport {\n loadDocumentModelDocumentModelModule,\n loadDriveDocumentModelModule,\n} from \"./store/document-model.js\";\nimport {\n loadDocumentModelEditor,\n loadGenericDriveExplorerEditorModule,\n} from \"./store/editor.js\";\n\ntype PackageMeta = {\n name: string;\n importUrl: string | null;\n stylesheetUrl: string | null;\n};\n\ntype PackageWithMeta = PackageMeta & {\n loadedPackage: VetraPackage;\n};\n\nconst LOCAL_PACKAGE_NAME = \"Local\" as const;\nconst COMMON_PACKAGE_NAME = \"Common\" as const;\nconst VETRA_PACKAGE_NAME = \"@powerhousedao/vetra\" as const;\nconst LOCAL_PACKAGES: string[] = [\n LOCAL_PACKAGE_NAME,\n COMMON_PACKAGE_NAME,\n VETRA_PACKAGE_NAME,\n];\n\nexport class BrowserPackageManager implements IPackageManager {\n registryUrl: string | null;\n #storage: BrowserLocalStorage<PackageMeta>;\n #packages: Map<string, VetraPackage> = new Map();\n #subscribers = new Set<IPackagesListener>();\n #packagesMemo: VetraPackage[] = [];\n #stylesheets: Map<string, HTMLLinkElement> = new Map();\n #localPackage: VetraPackage | undefined;\n\n #cdnUrl: string | null;\n\n constructor(namespace: string, registryUrl: string | null) {\n this.#storage = new BrowserLocalStorage<PackageMeta>(\n namespace + \":PH_PACKAGES\",\n );\n this.registryUrl = registryUrl;\n this.#cdnUrl = registryUrl !== null ? this.#toCdnUrl(registryUrl) : null;\n }\n\n #toCdnUrl(baseUrl: string): string {\n if (baseUrl.includes(\"/-/cdn\")) return baseUrl;\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n return `${base}/-/cdn`;\n }\n\n async init(localPackage?: VetraPackage) {\n const commonPackageWithMeta = this.#loadCommonPackage();\n this.#registerPackage(commonPackageWithMeta);\n const vetraVetraPackageWithMeta = this.#loadVetraPackage();\n this.#registerPackage(vetraVetraPackageWithMeta);\n if (localPackage) {\n this.#localPackage = localPackage;\n this.#registerPackage({\n name: LOCAL_PACKAGE_NAME,\n stylesheetUrl: null,\n importUrl: null,\n loadedPackage: localPackage,\n });\n }\n for (const packageName of this.#storage.keys()) {\n await this.addPackage(packageName);\n }\n }\n\n get packages() {\n return this.#packagesMemo;\n }\n\n getPackageSource(packageName: string) {\n // check vs the constant name we use for common packages\n if (LOCAL_PACKAGES.includes(packageName)) {\n return \"common\";\n }\n // check if the package has the same name as the local project\n if (packageName === this.#localPackage?.name) return \"project\";\n const packageMeta = this.#storage.get(packageName);\n // if meta does not exist the package is not installed\n if (!packageMeta) return null;\n // if imported from node_modules then the package is installed locally\n if (packageMeta.importUrl === `/node_modules/${packageName}`)\n return \"local-install\";\n // all other import urls point to a registry\n return \"registry-install\";\n }\n\n async addPackage(packageName: string): Promise<PackageManagerInstallResult> {\n const existingPackage = this.#packages.get(packageName);\n if (existingPackage) {\n return {\n type: \"success\",\n package: existingPackage,\n };\n }\n try {\n const packageWithMeta = await this.#loadPackage(packageName);\n this.#registerPackage(packageWithMeta);\n\n return {\n type: \"success\",\n package: packageWithMeta.loadedPackage,\n };\n } catch (error) {\n return {\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n async addPackages(packageNames: string[]) {\n const results: PackageManagerInstallResult[] = [];\n for (const packageName of packageNames) {\n const result = await this.addPackage(packageName);\n results.push(result);\n }\n return results;\n }\n\n removePackage(name: string) {\n this.#packages.delete(name);\n this.#storage.delete(name);\n this.#unmountStylesheet(name);\n this.#notifyPackagesChanged();\n }\n\n subscribe(handler: IPackagesListener): IPackageListerUnsubscribe {\n this.#subscribers.add(handler);\n return () => {\n this.#subscribers.delete(handler);\n };\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const documentModelModule = Array.from(\n this.#packages\n .values()\n .flatMap((p) => p.modules.documentModelModules ?? []),\n ).find((m) => m.documentType === documentType);\n\n if (documentModelModule) return Promise.resolve(documentModelModule);\n return Promise.reject(new Error(\"Model not available\"));\n }\n\n #loadCommonPackage(): PackageWithMeta {\n const documentModelDocumentModelModule =\n loadDocumentModelDocumentModelModule();\n const driveDocumentModelModule = loadDriveDocumentModelModule();\n const documentModelEditorModule = loadDocumentModelEditor();\n const genericDriveExplorerEditorModule =\n loadGenericDriveExplorerEditorModule();\n const name = COMMON_PACKAGE_NAME;\n const importUrl = null;\n const stylesheetUrl = null;\n const loadedPackage: VetraPackage = {\n id: COMMON_PACKAGE_ID,\n name,\n description: \"Common\",\n category: \"Common\",\n author: {\n name: \"Powerhouse\",\n website: \"https://powerhousedao.com\",\n },\n modules: {\n documentModelModules: [\n documentModelDocumentModelModule,\n driveDocumentModelModule,\n ],\n editorModules: [\n documentModelEditorModule,\n genericDriveExplorerEditorModule,\n ],\n },\n upgradeManifests: [],\n };\n return {\n name,\n importUrl,\n stylesheetUrl,\n loadedPackage,\n };\n }\n\n #loadVetraPackage(): PackageWithMeta {\n const name = vetraVetraPackage.manifest.name;\n const importUrl = null;\n const stylesheetUrl = null;\n const loadedPackage: VetraPackage = convertLegacyLibToVetraPackage(\n vetraVetraPackage as DocumentModelLib,\n );\n return {\n name,\n importUrl,\n stylesheetUrl,\n loadedPackage,\n };\n }\n\n async #loadPackageFromNodeModules(name: string): Promise<PackageWithMeta> {\n const importUrl = `/node_modules/${name}/index.js`;\n const stylesheetUrl = `/node_modules/${name}/style.css`;\n\n const packageWithMeta = await this.#importPackage({\n name,\n importUrl,\n stylesheetUrl,\n });\n\n return packageWithMeta;\n }\n\n async #loadPackageFromRegistry(name: string): Promise<PackageWithMeta> {\n const importUrl = `${this.#cdnUrl}/${name}/index.js`;\n const stylesheetUrl = `${this.#cdnUrl}/${name}/style.css`;\n const packageWithMeta = await this.#importPackage({\n name,\n importUrl,\n stylesheetUrl,\n });\n\n return packageWithMeta;\n }\n\n async #importPackage(packageMeta: PackageMeta) {\n const { name, importUrl, stylesheetUrl } = packageMeta;\n if (!importUrl) {\n throw new Error(`Import url not defined for package \"${name}\".`);\n }\n\n const importedPackage = (await import(\n /* @vite-ignore */ importUrl\n )) as DocumentModelLib;\n const loadedPackage = convertLegacyLibToVetraPackage(importedPackage);\n\n return {\n name,\n loadedPackage,\n importUrl,\n stylesheetUrl,\n };\n }\n\n async #loadPackage(packageName: string): Promise<PackageWithMeta> {\n if (LOCAL_PACKAGES.includes(packageName)) {\n throw new Error(\n `Package \"${packageName}\" is a local package and cannot be loaded dynamically.`,\n );\n }\n\n // only attemp to load from node_modules in dev mode\n if (!import.meta.env.PROD) {\n try {\n const packageWithMeta =\n await this.#loadPackageFromNodeModules(packageName);\n return packageWithMeta;\n } catch (error) {\n console.warn(\n `Failed to load package \"${packageName}\" from node_modules:`,\n error,\n );\n }\n }\n\n if (!this.registryUrl) {\n throw new Error(\"Registry url not defined.\");\n }\n\n return await this.#loadPackageFromRegistry(packageName);\n }\n\n #registerPackage(packageWithMeta: PackageWithMeta) {\n const { name, loadedPackage, importUrl, stylesheetUrl } = packageWithMeta;\n\n if (stylesheetUrl !== null) {\n this.#mountStylesheet(name, stylesheetUrl);\n }\n this.#packages.set(name, loadedPackage);\n this.#storage.set(name, {\n name,\n importUrl,\n stylesheetUrl,\n });\n\n this.#notifyPackagesChanged();\n }\n\n #mountStylesheet(name: string, href: string) {\n const existing = this.#stylesheets.get(name);\n\n if (existing) return existing;\n\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n\n this.#stylesheets.set(name, link);\n }\n\n #unmountStylesheet(name: string): void {\n const link = this.#stylesheets.get(name);\n if (!link) return;\n\n link.remove();\n this.#stylesheets.delete(name);\n }\n\n #notifyPackagesChanged() {\n this.#packagesMemo = Array.from(this.#packages.values());\n const packages = this.packages;\n this.#subscribers.forEach((handler) => {\n handler({ packages });\n });\n }\n}\n","import { live } from \"@electric-sql/pglite/live\";\nimport { PGliteWorker } from \"@electric-sql/pglite/worker\";\nimport { createRelationalDb } from \"@powerhousedao/shared/processors\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\n\nexport async function getDb() {\n const worker = new Worker(new URL(\"./pglite.worker.js\", import.meta.url), {\n type: \"module\",\n });\n\n const pgLite = await PGliteWorker.create(worker, {\n extensions: { live },\n });\n\n const kysely = new Kysely({\n dialect: new PGliteDialect(pgLite),\n });\n\n const relationalDb = createRelationalDb(kysely);\n\n return { pgLite, relationalDb };\n}\n","import { createAnalyticsStore } from \"@powerhousedao/reactor-browser\";\nimport { type IProcessorHostModule } from \"@powerhousedao/shared/processors\";\nimport { getDb } from \"../pglite.db.js\";\n\nexport async function createProcessorHostModule(): Promise<\n IProcessorHostModule | undefined\n> {\n try {\n const { pgLite, relationalDb } = await getDb();\n const { store: analyticsStore } = await createAnalyticsStore({\n pgLite,\n });\n const processorApp = \"connect\" as const;\n return {\n relationalDb,\n analyticsStore,\n processorApp,\n };\n } catch (error) {\n console.error(`Failed to initialize processor host module:`);\n console.error(error);\n }\n}\n","import { phGlobalConfigFromEnv } from \"@powerhousedao/connect/config\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport {\n addDefaultDrivesForNewReactor,\n createBrowserReactor,\n getDefaultDrivesFromEnv,\n} from \"@powerhousedao/connect/utils\";\nimport {\n addPHEventHandlers,\n addRemoteDrive,\n DocumentCache,\n DocumentChangeType,\n dropAllReactorStorage,\n extractDriveSlugFromPath,\n extractNodeSlugFromPath,\n getDrives,\n login,\n refreshReactorDataClient,\n setDefaultPHGlobalConfig,\n setDocumentCache,\n setDrives,\n setFeatures,\n setPHToast,\n setReactorClient,\n setReactorClientModule,\n setRenown,\n setSelectedDrive,\n setSelectedNode,\n setVetraPackageManager,\n type PHToastFn,\n type VetraPackage,\n} from \"@powerhousedao/reactor-browser\";\nimport type { ProcessorFactoryBuilder } from \"@powerhousedao/shared/processors\";\nimport {\n BrowserKeyStorage,\n RenownBuilder,\n RenownCryptoBuilder,\n} from \"@renown/sdk\";\nimport { logger } from \"document-model\";\nimport { initFeatureFlags } from \"../feature-flags.js\";\nimport { BrowserPackageManager } from \"../package-manager.js\";\nimport { createProcessorHostModule } from \"./processor-host-module.js\";\n\nexport async function clearReactorStorage() {\n const pg = window.ph?.reactorClientModule?.pg;\n if (!pg) {\n throw new Error(\"PGlite not found\");\n }\n\n await dropAllReactorStorage(pg);\n\n await pg.close();\n}\n\nexport async function createReactor(localPackage?: VetraPackage) {\n if (!window.ph) {\n window.ph = {};\n }\n if (window.ph.loading) return;\n\n window.ph.loading = true;\n\n // add window event handlers for updates\n addPHEventHandlers();\n\n // register toast function for use in editor components\n setPHToast(toast as PHToastFn);\n\n // initialize feature flags\n const features = await initFeatureFlags();\n\n logger.info(\n \"Features: @features\",\n JSON.stringify(Object.fromEntries(features), null, 2),\n );\n\n // initialize renown crypto\n const keyPairStorage = await BrowserKeyStorage.create();\n const renownCrypto = await new RenownCryptoBuilder()\n .withKeyPairStorage(keyPairStorage)\n .build();\n\n // initialize Renown\n const renown = await new RenownBuilder(\"connect\", {\n basename: phGlobalConfigFromEnv.routerBasename,\n baseUrl: phGlobalConfigFromEnv.renownUrl,\n })\n .withCrypto(renownCrypto)\n .build();\n\n // initialize package manager\n const packageManager = new BrowserPackageManager(\n phGlobalConfigFromEnv.routerBasename ?? \"\",\n PH_PACKAGE_REGISTRY_URL,\n );\n setVetraPackageManager(packageManager);\n await packageManager.init(localPackage);\n const packagesResult = await packageManager.addPackages(PH_PACKAGES ?? []);\n packagesResult.map((r) => {\n if (r.type === \"error\") console.error(r.error);\n });\n\n // get document models to set in the reactor (all versions)\n const documentModelModules = packageManager.packages\n .flatMap((pkg) => pkg.modules.documentModelModules)\n .filter(\n (module, index, modules) =>\n module !== undefined &&\n // deduplicate by documentType and version\n modules.findIndex(\n (m) =>\n m?.documentType === module.documentType &&\n m.version === module.version,\n ) === index,\n )\n .filter((d) => d !== undefined);\n\n // get upgrade manifests from packages\n const upgradeManifests = packageManager.packages\n .flatMap((pkg) => pkg.upgradeManifests)\n .filter((u) => u !== undefined);\n\n // create reactor v2 with all versions and upgrade manifests\n const reactorClientModule = await createBrowserReactor(\n documentModelModules,\n upgradeManifests,\n renown,\n );\n\n // get the drives from the reactor\n const drives = await getDrives(reactorClientModule.client);\n\n // set the selected drive and node from the path\n const path = window.location.pathname;\n const driveSlug = extractDriveSlugFromPath(path);\n const nodeSlug = extractNodeSlugFromPath(path);\n\n // initialize user from URL parameter\n const didFromUrl = getDidFromUrl();\n await login(didFromUrl, renown);\n\n const documentCache = new DocumentCache(reactorClientModule.client);\n\n // dispatch the events to set the values in the window object\n setDefaultPHGlobalConfig(phGlobalConfigFromEnv);\n setReactorClientModule(reactorClientModule);\n setReactorClient(reactorClientModule.client);\n setDocumentCache(documentCache);\n setRenown(renown);\n setDrives(drives);\n setSelectedDrive(driveSlug);\n setSelectedNode(nodeSlug);\n setFeatures(features);\n\n // Add default drives for new reactor (after window.ph is set up)\n const defaultDrivesConfig = getDefaultDrivesFromEnv();\n if (defaultDrivesConfig.length > 0) {\n await addDefaultDrivesForNewReactor(defaultDrivesConfig);\n }\n\n // if remoteUrl is set and drive not already existing add remote drive and open it\n const remoteUrl = getDriveUrl();\n if (remoteUrl) {\n try {\n await addRemoteDrive(remoteUrl);\n } catch (error) {\n console.error(`Failed to add remote drive from ${remoteUrl}:`, error);\n }\n }\n\n // Subscribe via ReactorClient interface\n const reactorClient = reactorClientModule.client;\n reactorClient.subscribe({ type: \"powerhouse/document-drive\" }, (event) => {\n logger.verbose(\"ReactorClient subscription event: @event\", event);\n refreshReactorDataClient(reactorClientModule.client).catch((e) =>\n logger.error(\"@error\", e),\n );\n });\n\n // Redirect when a currently-viewed document or drive is deleted remotely\n reactorClient.subscribe({}, (event) => {\n if (event.type !== DocumentChangeType.Deleted) return;\n const deletedId = event.context?.childId;\n if (!deletedId) return;\n\n const selectedDriveId = window.ph?.selectedDriveId;\n const selectedNodeId = window.ph?.selectedNodeId;\n\n if (selectedDriveId && deletedId === selectedDriveId) {\n setSelectedDrive(undefined);\n toast(\"The drive you were viewing has been deleted\");\n return;\n }\n\n if (selectedNodeId && deletedId === selectedNodeId) {\n setSelectedNode(undefined);\n toast(\"The document you were editing has been deleted\");\n }\n });\n\n // Refresh from ReactorClient to pick up any synced drives\n await refreshReactorDataClient(reactorClientModule.client);\n\n // Setup processor factories for packages that have them\n const packagesWithProcessorFactories = packageManager.packages.filter(\n (\n pkg,\n ): pkg is VetraPackage & { processorFactory: ProcessorFactoryBuilder } =>\n pkg.processorFactory !== undefined,\n );\n\n if (packagesWithProcessorFactories.length > 0) {\n const processorHostModule = await createProcessorHostModule();\n if (processorHostModule !== undefined) {\n await Promise.all(\n packagesWithProcessorFactories.map(async (pkg) => {\n const { id, name, processorFactory } = pkg;\n logger.info(\"Loading processor factory: @name\", name);\n try {\n const factory = await processorFactory(processorHostModule);\n await reactorClientModule.reactorModule?.processorManager.registerFactory(\n id,\n factory,\n );\n } catch (error) {\n logger.error(`Error registering processor: @name`, name);\n logger.error(\"@error\", error);\n }\n }),\n );\n }\n }\n\n window.ph.loading = false;\n}\n\nfunction getDidFromUrl() {\n const searchParams = new URLSearchParams(window.location.search);\n const didComponent = searchParams.get(\"user\");\n const did = didComponent ? decodeURIComponent(didComponent) : undefined;\n return did;\n}\n\nfunction getDriveUrl() {\n const searchParams = new URLSearchParams(window.location.search);\n const driveUrl = searchParams.get(\"driveUrl\");\n const url = driveUrl ? decodeURIComponent(driveUrl) : undefined;\n return url;\n}\n"],"mappings":"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"}
|