@powerhousedao/connect 6.0.2-staging.3 → 6.0.2-staging.5
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/{DriveSettingsModal-BVnVLbtl.js → DriveSettingsModal-DmsUU0g3.js} +5 -2
- package/dist/DriveSettingsModal-DmsUU0g3.js.map +1 -0
- package/dist/{SettingsModal-BBR3tg5Y.js → SettingsModal-DcXOgoue.js} +94 -24
- package/dist/SettingsModal-DcXOgoue.js.map +1 -0
- package/dist/{load-DTtATFLX.js → load-DhAv1kI1.js} +2 -2
- package/dist/{load-DTtATFLX.js.map → load-DhAv1kI1.js.map} +1 -1
- package/dist/main.js +1 -1
- package/dist/{package-CD1WYMbw.js → package-BTrkaFGy.js} +2 -2
- package/dist/package-BTrkaFGy.js.map +1 -0
- package/dist/{sidebar-C2bjr-Lf.js → sidebar-9mwcuU2h.js} +5 -5
- package/dist/{sidebar-C2bjr-Lf.js.map → sidebar-9mwcuU2h.js.map} +1 -1
- package/dist/start-connect.js +1 -1
- package/dist/style.css +15 -0
- package/package.json +9 -9
- package/dist/DriveSettingsModal-BVnVLbtl.js.map +0 -1
- package/dist/SettingsModal-BBR3tg5Y.js.map +0 -1
- package/dist/package-CD1WYMbw.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { closePHModal, driveCollectionId, renameDrive, setDriveAvailableOffline, setDriveSharingType, showPHModal, useDriveById, usePHModal, useSyncList } from "@powerhousedao/reactor-browser";
|
|
1
|
+
import { closePHModal, driveCollectionId, renameDrive, setDriveAvailableOffline, setDriveSharingType, showPHModal, useDriveById, useDriveSystemInfo, usePHModal, useSyncList } from "@powerhousedao/reactor-browser";
|
|
2
2
|
import { useMemo } from "react";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
import { DriveSettingsModal as DriveSettingsModal$1 } from "@powerhousedao/design-system/connect";
|
|
@@ -10,8 +10,10 @@ function DriveSettingsModal() {
|
|
|
10
10
|
const [drive] = useDriveById(driveId);
|
|
11
11
|
const remotes = useSyncList();
|
|
12
12
|
const isRemoteDrive = useMemo(() => {
|
|
13
|
+
if (!drive) return false;
|
|
13
14
|
return remotes.some((remote) => remote.collectionId === driveCollectionId("main", drive.header.id));
|
|
14
15
|
}, [remotes, drive]);
|
|
16
|
+
const systemInfo = useDriveSystemInfo(drive);
|
|
15
17
|
if (!driveId || !drive) return null;
|
|
16
18
|
async function onRenameDrive(drive, newName) {
|
|
17
19
|
await renameDrive(drive.header.id, newName);
|
|
@@ -26,6 +28,7 @@ function DriveSettingsModal() {
|
|
|
26
28
|
drive,
|
|
27
29
|
sharingType: isRemoteDrive ? "PUBLIC" : "LOCAL",
|
|
28
30
|
availableOffline: !isRemoteDrive,
|
|
31
|
+
systemInfo,
|
|
29
32
|
open,
|
|
30
33
|
onRenameDrive,
|
|
31
34
|
onDeleteDrive: () => showPHModal({
|
|
@@ -42,4 +45,4 @@ function DriveSettingsModal() {
|
|
|
42
45
|
//#endregion
|
|
43
46
|
export { DriveSettingsModal };
|
|
44
47
|
|
|
45
|
-
//# sourceMappingURL=DriveSettingsModal-
|
|
48
|
+
//# sourceMappingURL=DriveSettingsModal-DmsUU0g3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DriveSettingsModal-DmsUU0g3.js","names":["ConnectDriveSettingsModal"],"sources":["../src/components/modal/modals/DriveSettingsModal.tsx"],"sourcesContent":["import { DriveSettingsModal as ConnectDriveSettingsModal } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n driveCollectionId,\n renameDrive,\n setDriveAvailableOffline,\n setDriveSharingType,\n showPHModal,\n useDriveById,\n useDriveSystemInfo,\n usePHModal,\n useSyncList,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport type { SharingType } from \"@powerhousedao/shared/document-drive\";\nimport { useMemo } from \"react\";\n\nexport function DriveSettingsModal() {\n const phModal = usePHModal();\n const open = phModal?.type === \"driveSettings\";\n const driveId = open ? phModal.driveId : undefined;\n const [drive] = useDriveById(driveId);\n const remotes = useSyncList();\n\n const isRemoteDrive = useMemo(() => {\n if (!drive) return false;\n return remotes.some(\n (remote) =>\n remote.collectionId === driveCollectionId(\"main\", drive.header.id),\n );\n }, [remotes, drive]);\n\n const systemInfo = useDriveSystemInfo(drive);\n\n if (!driveId || !drive) {\n return null;\n }\n\n async function onRenameDrive(drive: DocumentDriveDocument, newName: string) {\n await renameDrive(drive.header.id, newName);\n }\n\n async function onChangeSharingType(\n drive: DocumentDriveDocument,\n newSharingType: SharingType,\n ) {\n await setDriveSharingType(drive.header.id, newSharingType);\n }\n\n async function onChangeAvailableOffline(\n drive: DocumentDriveDocument,\n newAvailableOffline: boolean,\n ) {\n await setDriveAvailableOffline(drive.header.id, newAvailableOffline);\n }\n\n return (\n <ConnectDriveSettingsModal\n drive={drive}\n sharingType={isRemoteDrive ? \"PUBLIC\" : \"LOCAL\"}\n availableOffline={!isRemoteDrive}\n systemInfo={systemInfo}\n open={open}\n onRenameDrive={onRenameDrive}\n onDeleteDrive={() => showPHModal({ type: \"deleteDrive\", driveId })}\n onChangeAvailableOffline={onChangeAvailableOffline}\n onChangeSharingType={onChangeSharingType}\n onOpenChange={(status) => {\n if (!status) return closePHModal();\n }}\n />\n );\n}\n"],"mappings":";;;;;AAiBA,SAAgB,qBAAqB;CACnC,MAAM,UAAU,YAAY;CAC5B,MAAM,OAAO,SAAS,SAAS;CAC/B,MAAM,UAAU,OAAO,QAAQ,UAAU,KAAA;CACzC,MAAM,CAAC,SAAS,aAAa,QAAQ;CACrC,MAAM,UAAU,aAAa;CAE7B,MAAM,gBAAgB,cAAc;AAClC,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,QAAQ,MACZ,WACC,OAAO,iBAAiB,kBAAkB,QAAQ,MAAM,OAAO,GAAG,CACrE;IACA,CAAC,SAAS,MAAM,CAAC;CAEpB,MAAM,aAAa,mBAAmB,MAAM;AAE5C,KAAI,CAAC,WAAW,CAAC,MACf,QAAO;CAGT,eAAe,cAAc,OAA8B,SAAiB;AAC1E,QAAM,YAAY,MAAM,OAAO,IAAI,QAAQ;;CAG7C,eAAe,oBACb,OACA,gBACA;AACA,QAAM,oBAAoB,MAAM,OAAO,IAAI,eAAe;;CAG5D,eAAe,yBACb,OACA,qBACA;AACA,QAAM,yBAAyB,MAAM,OAAO,IAAI,oBAAoB;;AAGtE,QACE,oBAACA,sBAAD;EACS;EACP,aAAa,gBAAgB,WAAW;EACxC,kBAAkB,CAAC;EACP;EACN;EACS;EACf,qBAAqB,YAAY;GAAE,MAAM;GAAe;GAAS,CAAC;EACxC;EACL;EACrB,eAAe,WAAW;AACxB,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { t as connectConfig } from "./connect.config-Cuh0hj_Q.js";
|
|
2
2
|
import { n as toast } from "./toast-DnODOv28.js";
|
|
3
3
|
import { t as useRegistryPackages } from "./useRegistryPackages-BOX4NMAb.js";
|
|
4
|
-
import { t as package_default } from "./package-
|
|
5
|
-
import { closePHModal, deleteDrive, setSelectedDrive, showPHModal, useDrives, usePHModal, useVetraPackageManager } from "@powerhousedao/reactor-browser";
|
|
4
|
+
import { t as package_default } from "./package-BTrkaFGy.js";
|
|
5
|
+
import { closePHModal, deleteDrive, driveCollectionId, setSelectedDrive, showPHModal, useDriveSystemInfo, useDrives, usePHModal, useSyncList, useVetraPackageManager } from "@powerhousedao/reactor-browser";
|
|
6
6
|
import { useCallback, useMemo, useState } from "react";
|
|
7
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
8
|
import { About, DangerZone, DefaultEditor, PackageManager, SettingsModal as SettingsModal$1 } from "@powerhousedao/design-system/connect";
|
|
@@ -14,32 +14,102 @@ const About$1 = () => {
|
|
|
14
14
|
closePHModal();
|
|
15
15
|
showPHModal({ type: "inspector" });
|
|
16
16
|
};
|
|
17
|
-
return /* @__PURE__ */ jsxs("div", { children: [
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
18
|
+
/* @__PURE__ */ jsx(About, {
|
|
19
|
+
packageJson: package_default,
|
|
20
|
+
phCliVersion: typeof connectConfig.phCliVersion === "string" ? connectConfig.phCliVersion : void 0
|
|
21
|
+
}),
|
|
22
|
+
/* @__PURE__ */ jsx(ConnectedDrives, {}),
|
|
23
|
+
/* @__PURE__ */ jsxs("div", {
|
|
24
|
+
className: "bg-white p-3",
|
|
25
|
+
children: [
|
|
26
|
+
/* @__PURE__ */ jsx("h2", {
|
|
27
|
+
className: "mb-2 font-semibold",
|
|
28
|
+
children: "Inspector"
|
|
29
|
+
}),
|
|
30
|
+
/* @__PURE__ */ jsx("p", {
|
|
31
|
+
className: "mb-3 text-sm font-normal text-gray-600",
|
|
32
|
+
children: "Explore the local database and sync state for debugging."
|
|
33
|
+
}),
|
|
34
|
+
/* @__PURE__ */ jsxs("button", {
|
|
35
|
+
className: "flex items-center gap-x-2 rounded-md border border-gray-300 bg-transparent px-3 py-1 text-sm font-medium text-gray-900 transition-colors hover:bg-gray-100",
|
|
36
|
+
onClick: onOpenInspector,
|
|
37
|
+
type: "button",
|
|
38
|
+
children: ["Open Inspector ", /* @__PURE__ */ jsx(Icon, {
|
|
39
|
+
name: "CircleInfo",
|
|
40
|
+
size: 16
|
|
41
|
+
})]
|
|
42
|
+
})
|
|
43
|
+
]
|
|
44
|
+
})
|
|
45
|
+
] });
|
|
46
|
+
};
|
|
47
|
+
function ConnectedDrives() {
|
|
48
|
+
const drives = useDrives() ?? [];
|
|
49
|
+
const remotes = useSyncList();
|
|
50
|
+
const remoteDrives = useMemo(() => drives.filter((d) => remotes.some((r) => r.collectionId === driveCollectionId("main", d.header.id))), [drives, remotes]);
|
|
51
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
52
|
+
className: "my-4 bg-white p-3",
|
|
53
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
54
|
+
className: "mb-2 font-semibold",
|
|
55
|
+
children: "Connected drives"
|
|
56
|
+
}), remoteDrives.length === 0 ? /* @__PURE__ */ jsx("p", {
|
|
57
|
+
className: "text-sm font-normal text-gray-600",
|
|
58
|
+
children: "No connected remote drives."
|
|
59
|
+
}) : /* @__PURE__ */ jsx("ul", {
|
|
60
|
+
className: "flex flex-col gap-3",
|
|
61
|
+
children: remoteDrives.map((drive) => /* @__PURE__ */ jsx(DriveAboutEntry, { drive }, drive.header.id))
|
|
62
|
+
})]
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function DriveAboutEntry({ drive }) {
|
|
66
|
+
const info = useDriveSystemInfo(drive);
|
|
67
|
+
return /* @__PURE__ */ jsxs("li", {
|
|
68
|
+
className: "text-sm text-gray-700",
|
|
22
69
|
children: [
|
|
23
|
-
/* @__PURE__ */
|
|
24
|
-
className: "
|
|
25
|
-
children: "
|
|
70
|
+
/* @__PURE__ */ jsxs("div", {
|
|
71
|
+
className: "flex items-baseline gap-2",
|
|
72
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
73
|
+
className: "font-medium",
|
|
74
|
+
children: drive.state.global.name || drive.header.name
|
|
75
|
+
}), info.status === "ready" && /* @__PURE__ */ jsx("span", {
|
|
76
|
+
className: "text-xs text-gray-500",
|
|
77
|
+
children: info.host
|
|
78
|
+
})]
|
|
26
79
|
}),
|
|
27
|
-
/* @__PURE__ */ jsx("
|
|
28
|
-
className: "
|
|
29
|
-
children: "
|
|
80
|
+
info.status === "loading" && /* @__PURE__ */ jsx("div", {
|
|
81
|
+
className: "mt-1 text-xs text-gray-400",
|
|
82
|
+
children: "Loading…"
|
|
30
83
|
}),
|
|
31
|
-
/* @__PURE__ */
|
|
32
|
-
className: "
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
84
|
+
info.status === "error" && /* @__PURE__ */ jsx("div", {
|
|
85
|
+
className: "mt-1 text-xs text-red-600",
|
|
86
|
+
children: "Could not load system info"
|
|
87
|
+
}),
|
|
88
|
+
info.status === "ready" && /* @__PURE__ */ jsxs("div", {
|
|
89
|
+
className: "mt-1 text-xs text-gray-600",
|
|
90
|
+
children: [/* @__PURE__ */ jsxs("div", { children: [
|
|
91
|
+
/* @__PURE__ */ jsx("span", {
|
|
92
|
+
className: "font-medium",
|
|
93
|
+
children: "Version:"
|
|
94
|
+
}),
|
|
95
|
+
" ",
|
|
96
|
+
info.version
|
|
97
|
+
] }), /* @__PURE__ */ jsxs("div", { children: [
|
|
98
|
+
/* @__PURE__ */ jsx("span", {
|
|
99
|
+
className: "font-medium",
|
|
100
|
+
children: "Git hash:"
|
|
101
|
+
}),
|
|
102
|
+
" ",
|
|
103
|
+
info.gitHash
|
|
104
|
+
] })]
|
|
105
|
+
}),
|
|
106
|
+
info.status === "local" && /* @__PURE__ */ jsx("div", {
|
|
107
|
+
className: "mt-1 text-xs text-gray-400",
|
|
108
|
+
children: "Local drive — N/A"
|
|
39
109
|
})
|
|
40
110
|
]
|
|
41
|
-
})
|
|
42
|
-
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
43
113
|
//#endregion
|
|
44
114
|
//#region src/components/modal/modals/settings/danger-zone.tsx
|
|
45
115
|
const DangerZone$1 = () => {
|
|
@@ -188,4 +258,4 @@ const SettingsModal = () => {
|
|
|
188
258
|
//#endregion
|
|
189
259
|
export { SettingsModal };
|
|
190
260
|
|
|
191
|
-
//# sourceMappingURL=SettingsModal-
|
|
261
|
+
//# sourceMappingURL=SettingsModal-DcXOgoue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsModal-DcXOgoue.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 { Icon } from \"@powerhousedao/design-system\";\nimport { About as BaseAbout } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n driveCollectionId,\n showPHModal,\n useDrives,\n useDriveSystemInfo,\n useSyncList,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport { useMemo } from \"react\";\n\nexport const About: React.FC = () => {\n const onOpenInspector = () => {\n closePHModal();\n showPHModal({ type: \"inspector\" });\n };\n\n return (\n <div>\n <BaseAbout\n packageJson={packageJson}\n phCliVersion={\n typeof connectConfig.phCliVersion === \"string\"\n ? connectConfig.phCliVersion\n : undefined\n }\n />\n <ConnectedDrives />\n <div className=\"bg-white p-3\">\n <h2 className=\"mb-2 font-semibold\">Inspector</h2>\n <p className=\"mb-3 text-sm font-normal text-gray-600\">\n Explore the local database and sync state for debugging.\n </p>\n <button\n className=\"flex items-center gap-x-2 rounded-md border border-gray-300 bg-transparent px-3 py-1 text-sm font-medium text-gray-900 transition-colors hover:bg-gray-100\"\n onClick={onOpenInspector}\n type=\"button\"\n >\n Open Inspector <Icon name=\"CircleInfo\" size={16} />\n </button>\n </div>\n </div>\n );\n};\n\nfunction ConnectedDrives() {\n const drives = useDrives() ?? [];\n const remotes = useSyncList();\n\n const remoteDrives = useMemo(\n () =>\n drives.filter((d) =>\n remotes.some(\n (r) => r.collectionId === driveCollectionId(\"main\", d.header.id),\n ),\n ),\n [drives, remotes],\n );\n\n return (\n <div className=\"my-4 bg-white p-3\">\n <h2 className=\"mb-2 font-semibold\">Connected drives</h2>\n {remoteDrives.length === 0 ? (\n <p className=\"text-sm font-normal text-gray-600\">\n No connected remote drives.\n </p>\n ) : (\n <ul className=\"flex flex-col gap-3\">\n {remoteDrives.map((drive) => (\n <DriveAboutEntry key={drive.header.id} drive={drive} />\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nfunction DriveAboutEntry({ drive }: { drive: DocumentDriveDocument }) {\n const info = useDriveSystemInfo(drive);\n const name = drive.state.global.name || drive.header.name;\n\n return (\n <li className=\"text-sm text-gray-700\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"font-medium\">{name}</span>\n {info.status === \"ready\" && (\n <span className=\"text-xs text-gray-500\">{info.host}</span>\n )}\n </div>\n {info.status === \"loading\" && (\n <div className=\"mt-1 text-xs text-gray-400\">Loading…</div>\n )}\n {info.status === \"error\" && (\n <div className=\"mt-1 text-xs text-red-600\">\n Could not load system info\n </div>\n )}\n {info.status === \"ready\" && (\n <div className=\"mt-1 text-xs text-gray-600\">\n <div>\n <span className=\"font-medium\">Version:</span> {info.version}\n </div>\n <div>\n <span className=\"font-medium\">Git hash:</span> {info.gitHash}\n </div>\n </div>\n )}\n {info.status === \"local\" && (\n <div className=\"mt-1 text-xs text-gray-400\">Local drive — N/A</div>\n )}\n </li>\n );\n}\n","import { DangerZone as BaseDangerZone } from \"@powerhousedao/design-system/connect\";\nimport {\n deleteDrive,\n setSelectedDrive,\n showPHModal,\n useDrives,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\n\nexport const DangerZone: React.FC = () => {\n const drives = useDrives();\n\n const handleDeleteDrive = async (drive: DocumentDriveDocument) => {\n await deleteDrive(drive.header.id);\n setSelectedDrive(undefined);\n };\n\n const handleClearStorage = () => {\n showPHModal({ type: \"clearStorage\" });\n };\n\n return (\n <BaseDangerZone\n drives={drives ?? []}\n onDeleteDrive={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\n/**\n * Split a `name@tag` spec into its bare package name. Mirrors the design-system's\n * `parsePackageSpec` — duplicated here to avoid reaching into a deep subpath\n * export. Scoped names split on the LAST `@`, unscoped on the first.\n */\nfunction parseBareName(spec: string): string {\n const trimmed = spec.trim();\n const at = trimmed.startsWith(\"@\")\n ? trimmed.lastIndexOf(\"@\")\n : trimmed.indexOf(\"@\");\n return at > 0 ? trimmed.slice(0, at) : trimmed;\n}\n\nexport const ConnectPackageManager: React.FC = () => {\n const packageManager = useVetraPackageManager();\n const {\n registryPackageList,\n updateRegistryPackageStatus,\n registerFallbackRegistryPackage,\n } = useRegistryPackages();\n\n async function handleInstall(packageSpec: string) {\n if (!packageManager) return;\n\n // The spec may include an explicit `@tag` / `@version` suffix from the\n // search input. Pass it through to the package manager as-is (the CDN\n // route already handles `name@tag` specs), but track status under the\n // bare name so the Settings list doesn't fragment.\n const bareName = parseBareName(packageSpec);\n // Packages that were in `/packages` when the user clicked Install go\n // through `updateRegistryPackageStatus` and hit an existing entry.\n // Packages that landed via the npm-uplink fallback weren't in the list,\n // so we register them explicitly rather than silently upserting a\n // placeholder — keeping the \"does not exist\" error as a signal for any\n // other code path that reaches update without a matching entry.\n const wasKnownToRegistry = registryPackageList.some(\n (p) => p.name === bareName,\n );\n const result = await packageManager.addPackage(packageSpec);\n if (result.type === \"success\") {\n if (wasKnownToRegistry) {\n updateRegistryPackageStatus(bareName, \"registry-install\");\n } else {\n registerFallbackRegistryPackage(\n bareName,\n result.package,\n packageManager.getPackageVersion(bareName) ??\n packageManager.getPackageVersion(packageSpec),\n \"registry-install\",\n );\n }\n toast(`Package \"${packageSpec}\" installed successfully`, {\n type: \"connect-success\",\n });\n } else {\n const message = result.error.message;\n // `BrowserPackageManager` raises a generic \"Failed to fetch dynamically\n // imported module\" when the registry CDN returns an error. That covers\n // both \"the name exists nowhere (not on this registry AND not on the\n // npmjs uplink)\" and \"the tarball is there but doesn't look like a\n // Powerhouse package\". Tell the user in plain terms before dumping the\n // raw error so the \"install from npm\" fallback case is self-explanatory.\n const isLikelyNotFound = /failed to fetch|404|not found/i.test(message);\n const userMessage = isLikelyNotFound\n ? `Could not install \"${packageSpec}\". The package isn't available on this registry, and the npmjs.org fallback could not resolve it either.`\n : `Failed to install \"${packageSpec}\": ${message}`;\n toast(userMessage, { type: \"error\" });\n }\n }\n\n function handleUninstall(packageName: string) {\n if (!packageManager) return;\n try {\n packageManager.removePackage(packageName);\n updateRegistryPackageStatus(packageName, \"available\");\n\n toast(`Package \"${packageName}\" uninstalled successfully`, {\n type: \"connect-success\",\n });\n } catch (error) {\n 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,6 +1,6 @@
|
|
|
1
1
|
import { t as connectConfig } from "./connect.config-Cuh0hj_Q.js";
|
|
2
2
|
import { n as toast } from "./toast-DnODOv28.js";
|
|
3
|
-
import { t as package_default } from "./package-
|
|
3
|
+
import { t as package_default } from "./package-BTrkaFGy.js";
|
|
4
4
|
import { t as detectReactorPgMajor } from "./pglite-runtime-BS9wpAs9.js";
|
|
5
5
|
import { n as seedPendingPgVersion } from "./pglite-seed-VlhY0n-A.js";
|
|
6
6
|
import { n as createReactor } from "./reactor-D1P2nU-G.js";
|
|
@@ -106,4 +106,4 @@ async function loadComponent(localPackage) {
|
|
|
106
106
|
//#endregion
|
|
107
107
|
export { loadComponent };
|
|
108
108
|
|
|
109
|
-
//# sourceMappingURL=load-
|
|
109
|
+
//# sourceMappingURL=load-DhAv1kI1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-
|
|
1
|
+
{"version":3,"file":"load-DhAv1kI1.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 {\n detectReactorPgMajor,\n seedPendingPgVersion,\n} from \"@powerhousedao/connect/utils\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { type ReactNode } from \"react\";\n\nexport async function loadComponent(localPackage?: DocumentModelLib) {\n await seedPendingPgVersion();\n await detectReactorPgMajor();\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;;;;ACLZ,eAAsB,cAAc,cAAiC;AACnE,OAAM,sBAAsB;AAC5B,OAAM,sBAAsB;AAC5B,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.2-staging.
|
|
5
|
+
version: "6.0.2-staging.5",
|
|
6
6
|
description: "Powerhouse Connect",
|
|
7
7
|
main: "dist/index.html",
|
|
8
8
|
type: "module",
|
|
@@ -111,4 +111,4 @@ var package_default = {
|
|
|
111
111
|
//#endregion
|
|
112
112
|
export { package_default as t };
|
|
113
113
|
|
|
114
|
-
//# sourceMappingURL=package-
|
|
114
|
+
//# sourceMappingURL=package-BTrkaFGy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-BTrkaFGy.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
|
|
@@ -874,9 +874,9 @@ const DebugSettingsModal = lazy(() => import("./DebugSettingsModal-DeZ-x8H3.js")
|
|
|
874
874
|
const DeleteDriveModal = lazy(() => import("./DeleteDriveModal-B7T2CVIX.js").then((m) => ({ default: m.DeleteDriveModal })));
|
|
875
875
|
const DeleteItemModal = lazy(() => import("./DeleteItemModal-DJv71YQG.js").then((m) => ({ default: m.DeleteItemModal })));
|
|
876
876
|
const DisclaimerModal = lazy(() => import("./DisclaimerModal-Co13N7HH.js").then((m) => ({ default: m.DisclaimerModal })));
|
|
877
|
-
const DriveSettingsModal$1 = lazy(() => import("./DriveSettingsModal-
|
|
877
|
+
const DriveSettingsModal$1 = lazy(() => import("./DriveSettingsModal-DmsUU0g3.js").then((m) => ({ default: m.DriveSettingsModal })));
|
|
878
878
|
const ExportDocumentWithErrorsModal = lazy(() => import("./ExportDocumentWithErrorsModal-DOV_UVlM.js").then((m) => ({ default: m.ExportDocumentWithErrorsModal })));
|
|
879
|
-
const SettingsModal$1 = lazy(() => import("./SettingsModal-
|
|
879
|
+
const SettingsModal$1 = lazy(() => import("./SettingsModal-DcXOgoue.js").then((m) => ({ default: m.SettingsModal })));
|
|
880
880
|
const UpgradeDriveModal = lazy(() => import("./UpgradeDriveModal-BH4ecdCU.js").then((m) => ({ default: m.UpgradeDriveModal })));
|
|
881
881
|
const modalComponents = {
|
|
882
882
|
addDrive: AddDriveModal$1,
|
|
@@ -912,7 +912,7 @@ const ModalsContainer = lazy(async () => {
|
|
|
912
912
|
//#endregion
|
|
913
913
|
//#region src/components/app-loader.tsx
|
|
914
914
|
const AppLoader = (props) => {
|
|
915
|
-
const Load = lazy(() => import("./load-
|
|
915
|
+
const Load = lazy(() => import("./load-DhAv1kI1.js").then((m) => m.loadComponent(props.localPackage)));
|
|
916
916
|
return /* @__PURE__ */ jsx(StrictMode, { children: /* @__PURE__ */ jsxs(ErrorBoundary$1, {
|
|
917
917
|
fallbackRender: (props) => /* @__PURE__ */ jsx(AppSkeleton, { children: /* @__PURE__ */ jsx(DetailedFallback, { ...props }) }),
|
|
918
918
|
resetKeys: [props.localPackage],
|
|
@@ -1252,7 +1252,7 @@ function ContentContainer({ children }) {
|
|
|
1252
1252
|
function DriveItem({ drive }) {
|
|
1253
1253
|
const description = useAppModuleById(drive.header.meta?.preferredEditor)?.config.name || "Drive Explorer App";
|
|
1254
1254
|
return /* @__PURE__ */ jsx(HomeScreenItem, {
|
|
1255
|
-
title: drive.state.global.name,
|
|
1255
|
+
title: drive.state.global.name || drive.header.name,
|
|
1256
1256
|
description,
|
|
1257
1257
|
icon: /* @__PURE__ */ jsx(DriveIcon, { drive }),
|
|
1258
1258
|
onClick: () => setSelectedDrive(drive)
|
|
@@ -1563,4 +1563,4 @@ function Sidebar() {
|
|
|
1563
1563
|
//#endregion
|
|
1564
1564
|
export { AppLoader as t };
|
|
1565
1565
|
|
|
1566
|
-
//# sourceMappingURL=sidebar-
|
|
1566
|
+
//# sourceMappingURL=sidebar-9mwcuU2h.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar-C2bjr-Lf.js","names":["listeners","getInitial","subscribe","listeners","logger","logger","ErrorBoundary","ReactErrorBoundary","ErrorBoundary","listeners","AddDriveModal","CreateDocumentModal","DriveSettingsModal","SettingsModal","ErrorBoundary","ErrorBoundary","CookieBanner","CookieBanner","PHCookieBanner","ErrorBoundary","ErrorBoundary"],"sources":["../src/hooks/useAcceptedCookies.ts","../src/hooks/usePendingInstallations.ts","../src/hooks/useCookieBanner.ts","../src/hooks/useInitSentry.ts","../src/hooks/useUndoRedoShortcuts.ts","../src/components/analytics.tsx","../src/components/document-editor-container.tsx","../src/components/editor-loader.tsx","../src/components/error-boundary.tsx","../src/components/app-container.tsx","../src/utils/browser.ts","../src/utils/document-editor-debug-tools.ts","../src/components/migration-status.ts","../src/utils/pglite-migration.ts","../src/components/app-skeleton.tsx","../src/components/migration-banner.tsx","../src/components/modal/modals-container.tsx","../src/components/app-loader.tsx","../src/context/sentry-provider.tsx","../src/components/package-install-prompt.tsx","../src/components/app.tsx","../src/components/cookie-banner.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 {\n usePackageDiscoveryService,\n type PendingInstallation,\n} from \"@powerhousedao/reactor-browser\";\nimport { useSyncExternalStore } from \"react\";\n\nconst emptyArray: PendingInstallation[] = [];\n\nexport function usePendingInstallations() {\n const discoveryService = usePackageDiscoveryService();\n return useSyncExternalStore(\n (cb) => discoveryService?.subscribePending(cb) ?? (() => {}),\n () => discoveryService?.getPendingInstallations() ?? emptyArray,\n );\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","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 { Icon, PowerhouseButton } from \"@powerhousedao/design-system\";\nimport { 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 with a collapsible details section.\n * Useful for development and debugging purposes.\n */\nfunction DetailedFallback({ error, resetErrorBoundary }: FallbackProps) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorDetails =\n error instanceof Error\n ? (error.stack ?? String(error.cause))\n : JSON.stringify(error, null, 2);\n const hasDetails = errorDetails !== \"{}\";\n\n return (\n <div className=\"z-10 mx-auto flex max-w-[80%] flex-1 items-center justify-center p-6\">\n <div className=\"w-full max-w-lg rounded-lg border border-gray-500 bg-white p-6 shadow-sm\">\n <div className=\"mb-3 flex items-center gap-2\">\n <Icon name=\"Error\" className=\"size-5 shrink-0\" />\n <h1 className=\"text-lg font-semibold\">Something went wrong</h1>\n </div>\n <p className=\"mb-4 text-sm text-gray-700\">{errorMessage}</p>\n {hasDetails && (\n <details className=\"group\">\n <summary className=\"cursor-pointer select-none text-sm font-medium text-gray-700 underline hover:text-gray-700\">\n Show details\n </summary>\n <pre className=\"mt-2 max-h-48 overflow-auto rounded bg-gray-100 p-3 text-xs\">\n {errorDetails}\n </pre>\n </details>\n )}\n <PowerhouseButton\n type=\"button\"\n onClick={resetErrorBoundary}\n className=\"text-md mt-4 px-3 py-1.5 font-medium\"\n >\n Try again\n </PowerhouseButton>\n </div>\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 { DropZoneWrapper } from \"@powerhousedao/design-system/connect\";\nimport { GenericDriveExplorer } from \"@powerhousedao/powerhouse-vetra-packages/editors\";\nimport {\n useAppModuleById,\n useDefaultAppModule,\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 AppContainer() {\n const [selectedDrive] = useSelectedDrive();\n const selectedDocumentId = useSelectedDocumentId();\n\n const app = useAppModuleById(selectedDrive.header.meta?.preferredEditor);\n const defaultApp = useDefaultAppModule();\n\n const AppComponent =\n app?.Component ?? defaultApp?.Component ?? GenericDriveExplorer.Component;\n\n if (!AppComponent) {\n throw new Error(\"No app component found\");\n }\n return (\n <ErrorBoundary\n variant=\"detailed\"\n resetKeys={[selectedDrive.header.id]}\n loggerContext={[\"Connect\", \"App\"]}\n >\n <Suspense fallback={<EditorLoader />}>\n <DropZoneWrapper className=\"flex h-full flex-col overflow-auto\">\n <AppComponent>\n {selectedDocumentId ? <DocumentEditorContainer /> : null}\n </AppComponent>\n </DropZoneWrapper>\n </Suspense>\n </ErrorBoundary>\n );\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","export type MigrationPhase = \"clone\" | \"dump\" | \"restore\";\n\nexport type MigrationStatus = {\n idbName: string;\n phase: MigrationPhase;\n};\n\nlet current: MigrationStatus | null = null;\nconst listeners = new Set<() => void>();\n\nexport function setMigrationStatus(status: MigrationStatus | null): void {\n current = status;\n for (const l of listeners) l();\n}\n\nexport function getMigrationStatus(): MigrationStatus | null {\n return current;\n}\n\nexport function subscribeMigrationStatus(cb: () => void): () => void {\n listeners.add(cb);\n return () => {\n listeners.delete(cb);\n };\n}\n","import { PGlite } from \"@electric-sql/pglite\";\nimport {\n setMigrationStatus,\n type MigrationPhase,\n} from \"../components/migration-status.js\";\nimport {\n createFileDataStore,\n IDB_DB_VERSION,\n IDB_STORE_NAME,\n idbError,\n openIdb,\n PRIMARY_IDB_NAMES,\n readPgVersionFile,\n} from \"./pglite-idb.js\";\nimport { CURRENT_PG_MAJOR } from \"./pglite-runtime.js\";\n\nconst BACKUP_PREFIX = \"ph-pglite-backup::\";\nconst BACKUP_INDEX_KEY = \"ph:pglite-backups\";\nconst BACKUP_RETENTION_MS = 30 * 24 * 60 * 60 * 1000;\n\ntype FileDataValue = {\n contents: Uint8Array | number[];\n mode: number;\n timestamp: Date | number;\n};\n\ntype LegacyDumper = (idbName: string) => Promise<string>;\n\nconst LEGACY_DUMPERS: Partial<Record<number, () => Promise<LegacyDumper>>> = {\n 16: async () => {\n const [{ PGlite: LegacyPGlite }, { pgDump }] = await Promise.all([\n import(\"pglite-legacy-02\"),\n import(\"pglite-tools-legacy-02/pg_dump\"),\n ]);\n return async (idbName: string) => {\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new LegacyPGlite(`idb://${stripped}`);\n try {\n await pg.waitReady;\n const file = await pgDump({ pg });\n return await file.text();\n } finally {\n await pg.close();\n }\n };\n },\n};\n\n// Emscripten IDBFS holds the IDB connection open past pglite's pg.close(),\n// so deleteDatabase can be blocked indefinitely. Callers on the hot path\n// should prefer clearFileData() instead; deleteIdb is only used by the\n// janitor for expired backups, which tolerates the 15s timeout.\nfunction deleteIdb(name: string, timeoutMs = 15_000): Promise<void> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.deleteDatabase(name);\n let settled = false;\n const done = (fn: () => void) => {\n if (settled) return;\n settled = true;\n fn();\n };\n const timer = setTimeout(\n () =>\n done(() =>\n reject(\n new Error(`IDB delete timed out for ${name} after ${timeoutMs}ms`),\n ),\n ),\n timeoutMs,\n );\n req.onsuccess = () =>\n done(() => {\n clearTimeout(timer);\n resolve();\n });\n req.onerror = () =>\n done(() => {\n clearTimeout(timer);\n reject(idbError(req, `IDB delete failed for ${name}`));\n });\n });\n}\n\nasync function clearFileData(name: string): Promise<void> {\n const db = await openIdb(name, IDB_DB_VERSION, createFileDataStore);\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(IDB_STORE_NAME, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(idbError(tx, `FILE_DATA clear failed for ${name}`));\n tx.onabort = () =>\n reject(idbError(tx, `FILE_DATA clear aborted for ${name}`));\n tx.objectStore(IDB_STORE_NAME).clear();\n });\n } finally {\n db.close();\n }\n}\n\nasync function cloneFileData(\n sourceName: string,\n destName: string,\n): Promise<void> {\n const source = await openIdb(sourceName, IDB_DB_VERSION, createFileDataStore);\n try {\n const dest = await openIdb(destName, IDB_DB_VERSION, createFileDataStore);\n try {\n const readTx = source.transaction(IDB_STORE_NAME, \"readonly\");\n const readStore = readTx.objectStore(IDB_STORE_NAME);\n const entries = await new Promise<\n Array<{ key: IDBValidKey; value: FileDataValue }>\n >((resolve, reject) => {\n const out: Array<{ key: IDBValidKey; value: FileDataValue }> = [];\n const req = readStore.openCursor();\n req.onerror = () =>\n reject(\n idbError(req, `FILE_DATA read cursor failed for ${sourceName}`),\n );\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) return resolve(out);\n out.push({ key: cursor.key, value: cursor.value as FileDataValue });\n cursor.continue();\n };\n });\n\n await new Promise<void>((resolve, reject) => {\n const writeTx = dest.transaction(IDB_STORE_NAME, \"readwrite\");\n writeTx.oncomplete = () => resolve();\n writeTx.onerror = () =>\n reject(idbError(writeTx, `FILE_DATA write failed for ${destName}`));\n writeTx.onabort = () =>\n reject(idbError(writeTx, `FILE_DATA write aborted for ${destName}`));\n const writeStore = writeTx.objectStore(IDB_STORE_NAME);\n writeStore.clear();\n for (const { key, value } of entries) {\n writeStore.put(value, key);\n }\n });\n } finally {\n dest.close();\n }\n } finally {\n source.close();\n }\n}\n\ntype BackupRecord = { name: string; idbName: string; createdAt: number };\n\nfunction readBackupIndex(): BackupRecord[] {\n try {\n const raw = localStorage.getItem(BACKUP_INDEX_KEY);\n if (!raw) return [];\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as BackupRecord[]) : [];\n } catch {\n return [];\n }\n}\n\nfunction writeBackupIndex(records: BackupRecord[]): void {\n try {\n localStorage.setItem(BACKUP_INDEX_KEY, JSON.stringify(records));\n } catch {\n // ignore quota errors — janitor is best-effort\n }\n}\n\nfunction registerBackup(rec: BackupRecord): void {\n writeBackupIndex([...readBackupIndex(), rec]);\n}\n\nfunction forgetBackup(name: string): void {\n writeBackupIndex(readBackupIndex().filter((r) => r.name !== name));\n}\n\nasync function janitor(): Promise<void> {\n const cutoff = Date.now() - BACKUP_RETENTION_MS;\n const keep: BackupRecord[] = [];\n for (const rec of readBackupIndex()) {\n if (rec.createdAt >= cutoff) {\n keep.push(rec);\n continue;\n }\n try {\n await deleteIdb(rec.name);\n } catch (err) {\n console.warn(`Failed to delete expired pglite backup ${rec.name}`, err);\n keep.push(rec);\n }\n }\n writeBackupIndex(keep);\n}\n\nfunction publishPhase(idbName: string, phase: MigrationPhase): void {\n setMigrationStatus({ idbName, phase });\n}\n\nasync function migrateIdbIfNeeded(idbName: string): Promise<void> {\n const major = await readPgVersionFile(idbName);\n if (major === null || major === CURRENT_PG_MAJOR) return;\n\n const loader = LEGACY_DUMPERS[major];\n if (!loader) {\n throw new Error(\n `Unsupported legacy PGlite data dir: PG_VERSION=${major} for ${idbName}`,\n );\n }\n\n const backupName = `${BACKUP_PREFIX}${idbName}::${new Date().toISOString()}`;\n const backupRec: BackupRecord = {\n name: backupName,\n idbName,\n createdAt: Date.now(),\n };\n\n publishPhase(idbName, \"clone\");\n await cloneFileData(idbName, backupName);\n registerBackup(backupRec);\n\n let sql: string;\n try {\n publishPhase(idbName, \"dump\");\n const dump = await loader();\n sql = await dump(idbName);\n } catch (err) {\n await deleteIdb(backupName).catch(() => {});\n forgetBackup(backupName);\n throw err;\n }\n\n try {\n // Can't deleteDatabase here: Emscripten IDBFS from the legacy PGlite\n // keeps its IDB connection open past pg.close(). Clearing the store\n // in-place leaves the IDB handle alone, and the fresh PGlite will\n // initdb into the empty VFS.\n await clearFileData(idbName);\n publishPhase(idbName, \"restore\");\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new PGlite(`idb://${stripped}`, { relaxedDurability: false });\n try {\n await pg.waitReady;\n // PGlite 0.2.x pg_dump emits SQL literals with doubled backslashes\n // (escape-string form) but does not always emit the matching\n // `SET standard_conforming_strings = off`. PG17 defaults that GUC to on,\n // so '\\\\\"' in the dump is parsed as a literal backslash + end-of-string\n // and JSONB re-parsing fails. Force off at the session level before\n // running the dump so doubled backslashes collapse as intended.\n console.info(\n `[pglite-migration] Dump preamble (first 500 chars):\\n${sql.slice(0, 500)}`,\n );\n try {\n await pg.exec(\"SET standard_conforming_strings = off;\");\n } catch (gucErr) {\n console.warn(\n \"[pglite-migration] Could not force standard_conforming_strings=off\",\n gucErr,\n );\n }\n try {\n await pg.exec(sql);\n } catch (execErr) {\n logRestoreFailure(idbName, sql, execErr);\n throw execErr;\n }\n } finally {\n await pg.close();\n }\n } catch (err) {\n await rollbackFromBackup(idbName, backupName, err);\n throw err;\n }\n}\n\nfunction logRestoreFailure(idbName: string, sql: string, err: unknown): void {\n const errObj = err as {\n message?: string;\n position?: string | number;\n severity?: string;\n code?: string;\n detail?: string;\n where?: string;\n internalQuery?: string;\n };\n const position =\n typeof errObj.position === \"string\"\n ? parseInt(errObj.position, 10)\n : typeof errObj.position === \"number\"\n ? errObj.position\n : NaN;\n\n console.error(`[pglite-migration] Restore failed for ${idbName}`, {\n message: errObj.message,\n code: errObj.code,\n severity: errObj.severity,\n detail: errObj.detail,\n where: errObj.where,\n position: errObj.position,\n sqlLength: sql.length,\n });\n\n if (Number.isFinite(position) && position > 0) {\n const zeroBased = position - 1;\n const start = Math.max(0, zeroBased - 200);\n const end = Math.min(sql.length, zeroBased + 200);\n const before = sql.slice(start, zeroBased);\n const at = sql.slice(zeroBased, zeroBased + 1);\n const after = sql.slice(zeroBased + 1, end);\n console.error(\n `[pglite-migration] SQL context around position ${position}:\\n${before}»${at}«${after}`,\n );\n const lineStart = sql.lastIndexOf(\"\\n\", zeroBased) + 1;\n const lineEnd = sql.indexOf(\"\\n\", zeroBased);\n const line = sql.slice(lineStart, lineEnd === -1 ? sql.length : lineEnd);\n console.error(\n `[pglite-migration] Failing line (truncated to 500 chars):\\n${line.slice(0, 500)}`,\n );\n } else {\n console.error(\n `[pglite-migration] No position info. First 2000 chars of dump:\\n${sql.slice(0, 2000)}`,\n );\n }\n}\n\nasync function rollbackFromBackup(\n idbName: string,\n backupName: string,\n originalError: unknown,\n): Promise<void> {\n try {\n await clearFileData(idbName).catch(() => {});\n await cloneFileData(backupName, idbName);\n } catch (rollbackErr) {\n console.error(\n `PGlite migration failed AND rollback failed for ${idbName}. Primary error:`,\n originalError,\n \"Rollback error:\",\n rollbackErr,\n );\n return;\n }\n await deleteIdb(backupName).catch(() => {});\n forgetBackup(backupName);\n}\n\nasync function migrateAllLocked(): Promise<void> {\n for (const idbName of PRIMARY_IDB_NAMES) {\n await migrateIdbIfNeeded(idbName);\n }\n setMigrationStatus(null);\n}\n\nexport async function migrateAllIfNeeded(): Promise<void> {\n janitor().catch((err) => console.warn(\"PGlite backup janitor failed\", err));\n\n const hasLocks =\n typeof navigator !== \"undefined\" &&\n \"locks\" in navigator &&\n typeof navigator.locks.request === \"function\";\n\n if (!hasLocks) {\n await migrateAllLocked();\n return;\n }\n\n await navigator.locks.request(\n \"ph-pglite-migration\",\n { mode: \"exclusive\" },\n async () => {\n await migrateAllLocked();\n },\n );\n}\n","import { getBasePath } from \"@powerhousedao/connect/utils\";\nimport {\n AnimatedLoader,\n ConnectSidebar,\n HomeScreen,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n useEffect,\n useState,\n useSyncExternalStore,\n type PropsWithChildren,\n} from \"react\";\nimport {\n getMigrationStatus,\n subscribeMigrationStatus,\n type MigrationPhase,\n} from \"./migration-status.js\";\nconst LOADER_DELAY = 250;\n\nconst PHASE_LABEL: Record<MigrationPhase, string> = {\n clone: \"Backing up local database…\",\n dump: \"Exporting data from previous version…\",\n restore: \"Restoring data into the new database…\",\n};\n\nconst MigrationOverlay = () => {\n const status = useSyncExternalStore(\n subscribeMigrationStatus,\n getMigrationStatus,\n () => null,\n );\n if (!status) return null;\n return (\n <div className=\"absolute inset-0 z-20 flex items-center justify-center\">\n <div className=\"rounded-lg bg-white/90 px-6 py-4 text-sm text-gray-900 shadow-lg\">\n <div className=\"font-medium\">Upgrading local database…</div>\n <div className=\"text-gray-600\">{PHASE_LABEL[status.phase]}</div>\n </div>\n </div>\n );\n};\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: React.FC<PropsWithChildren> = (props) => {\n const isSSR = typeof window === \"undefined\";\n const isHomeScreen = !isSSR && window.location.pathname === getBasePath();\n return (\n <div className=\"flex h-screen overflow-hidden\">\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={props.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 {!props.children ? <Loader /> : null}\n <MigrationOverlay />\n </div>\n );\n};\n\nexport default AppSkeleton;\n","import {\n CURRENT_PG_MAJOR,\n getCachedReactorPgMajor,\n migrateAllIfNeeded,\n subscribeReactorPgMajor,\n} from \"@powerhousedao/connect/utils\";\nimport { useState, useSyncExternalStore } from \"react\";\n\nlet dismissed = false;\nconst listeners = new Set<() => void>();\n\nfunction notify() {\n for (const l of listeners) l();\n}\n\nfunction dismiss() {\n dismissed = true;\n notify();\n}\n\nfunction subscribeDismissed(cb: () => void): () => void {\n listeners.add(cb);\n return () => {\n listeners.delete(cb);\n };\n}\n\nfunction getDismissed(): boolean {\n return dismissed;\n}\n\nexport const MigrationBanner: React.FC = () => {\n const isDismissed = useSyncExternalStore(\n subscribeDismissed,\n getDismissed,\n () => false,\n );\n const major = useSyncExternalStore(\n subscribeReactorPgMajor,\n getCachedReactorPgMajor,\n () => undefined,\n );\n const [migrating, setMigrating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n if (major === undefined || major === null || major === CURRENT_PG_MAJOR) {\n return null;\n }\n if (isDismissed) return null;\n\n const handleMigrate = () => {\n setError(null);\n setMigrating(true);\n migrateAllIfNeeded()\n .then(() => {\n window.location.reload();\n })\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n setMigrating(false);\n });\n };\n\n return (\n <div className=\"absolute inset-x-0 top-0 z-30 flex justify-center p-3\">\n <div className=\"flex max-w-3xl items-center gap-3 rounded-lg border border-yellow-500 bg-yellow-400 px-4 py-3 text-sm text-gray-900 shadow-lg\">\n <div className=\"flex-1\">\n <div className=\"font-semibold\">\n Your local database uses Postgres {major}.\n </div>\n <div className=\"text-gray-800\">\n Migrate to Postgres {CURRENT_PG_MAJOR} to pick up the latest\n features. Your data will be backed up first.\n </div>\n {error && (\n <div className=\"mt-2 font-medium text-red-900\">\n Migration failed: {error}\n </div>\n )}\n </div>\n <button\n type=\"button\"\n disabled={migrating}\n onClick={handleMigrate}\n className=\"rounded bg-gray-900 px-3 py-1 text-sm font-medium text-white hover:bg-gray-800 disabled:opacity-50\"\n >\n {migrating ? \"Migrating…\" : \"Migrate now\"}\n </button>\n <button\n type=\"button\"\n disabled={migrating}\n onClick={dismiss}\n className=\"rounded border border-gray-900 bg-transparent px-3 py-1 text-sm font-medium text-gray-900 hover:bg-gray-900/10 disabled:opacity-50\"\n >\n Dismiss\n </button>\n </div>\n </div>\n );\n};\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 { DocumentModelLib } from \"document-model\";\nimport { lazy, StrictMode, Suspense } from \"react\";\nimport AppSkeleton from \"./app-skeleton.js\";\nimport { DetailedFallback, ErrorBoundary } from \"./error-boundary.js\";\nimport { App, CookieBanner } from \"./index.js\";\nimport { MigrationBanner } from \"./migration-banner.js\";\nimport { ModalsContainer } from \"./modal/modals-container.js\";\n\nexport const AppLoader = (props: { localPackage?: DocumentModelLib }) => {\n const Load = lazy(() =>\n import(\"./load.js\").then((m) => m.loadComponent(props.localPackage)),\n );\n return (\n <StrictMode>\n <ErrorBoundary\n fallbackRender={(props) => (\n <AppSkeleton children={<DetailedFallback {...props} />} />\n )}\n resetKeys={[props.localPackage]}\n loggerContext={[\"Connect\"]}\n >\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 <MigrationBanner />\n </ErrorBoundary>\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 {\n PackageInstallModal,\n type PendingPackageInstallation,\n} from \"@powerhousedao/design-system/connect/index\";\nimport { usePackageDiscoveryService } from \"@powerhousedao/reactor-browser\";\nimport { usePendingInstallations } from \"../hooks/usePendingInstallations.js\";\n\nexport function PackageInstallPrompt() {\n const pendingInstallations = usePendingInstallations();\n const discoveryService = usePackageDiscoveryService();\n\n if (!discoveryService || pendingInstallations.length === 0) return null;\n\n const installations: PendingPackageInstallation[] =\n pendingInstallations.flatMap((p) =>\n p.packageNames.map((packageName) => ({\n documentType: p.documentType,\n packageName,\n })),\n );\n\n return (\n <PackageInstallModal\n pendingInstallations={installations}\n onInstall={(packageName) =>\n discoveryService.approveInstallation(packageName)\n }\n onDismiss={(packageName) =>\n discoveryService.dismissInstallation(packageName)\n }\n />\n );\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 { useEffect } from \"react\";\nimport { ToastContainer } from \"../services/toast.js\";\nimport { PackageInstallPrompt } from \"./package-install-prompt.js\";\n\nexport const App = () => {\n // refresh page on vite preload error due to outdated chunks — but only when\n // the failing dynamic import is one of Connect's own chunks. External\n // dynamic imports (e.g. the package manager loading a package from the\n // configured CDN) should let the error propagate so the caller can surface\n // it; reloading here drops any open state and hides the real failure.\n useEffect(() => {\n const handlePreloadError = (event: Event) => {\n const payload = (event as Event & { payload?: unknown }).payload;\n const message =\n payload instanceof Error ? payload.message : String(payload ?? \"\");\n const failedUrl = message.match(/https?:\\/\\/[^\\s\"']+/)?.[0];\n\n if (failedUrl && !failedUrl.startsWith(window.location.origin)) {\n console.debug(\n `[Connect] Skipping reload — vite:preloadError for off-origin URL: ${failedUrl}`,\n );\n return;\n }\n\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 <ToastContainer position=\"bottom-right\" />\n <Router />\n <PackageInstallPrompt />\n <Analytics />\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 { 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.config.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 { AppContainer, DriveIcon } from \"@powerhousedao/connect/components\";\nimport {\n connectConfig,\n defaultPHAppConfig,\n defaultPHDocumentEditorConfig,\n} from \"@powerhousedao/connect/config\";\nimport {\n HomeScreen,\n HomeScreenAddDriveItem,\n HomeScreenItem,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n setPHAppConfig,\n setPHDocumentEditorConfig,\n setSelectedDrive,\n useAppModuleById,\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 setPHAppConfig(defaultPHAppConfig);\n }\n }, [selectedDrive]);\n\n const showHomeScreen =\n !selectedDocumentId && !selectedDrive && !selectedFolder;\n return (\n <ContentContainer>\n {showHomeScreen ? <HomeScreenContainer /> : <AppContainer />}\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 = useAppModuleById(drive.header.meta?.preferredEditor);\n const description = editorModule?.config.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 useEns,\n} from \"@powerhousedao/design-system/connect\";\n\nimport {\n logout,\n openRenown,\n setSelectedDrive,\n showPHModal,\n useDrives,\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 connectDebug = localStorage.getItem(\"CONNECT_DEBUG\") === \"true\";\n\n const ensName = user?.ens?.name || user?.profile?.username || undefined;\n const avatarUrl =\n user?.ens?.avatarUrl || user?.profile?.userImage || undefined;\n\n const ensInfo = useEns(!avatarUrl ? user?.address : undefined);\n\n const onClickSettings = () => {\n showPHModal({ type: \"settings\" });\n };\n\n const onAddDriveClick = () => {\n showPHModal({ type: \"addDrive\" });\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 address={user?.address}\n onLogin={openRenown}\n onDisconnect={logout}\n ensName={ensName || ensInfo.data?.ens}\n avatarUrl={\n avatarUrl ||\n ensInfo.data?.avatar_small ||\n ensInfo.data?.avatar_url ||\n undefined\n }\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":"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"}
|
|
1
|
+
{"version":3,"file":"sidebar-9mwcuU2h.js","names":["listeners","getInitial","subscribe","listeners","logger","logger","ErrorBoundary","ReactErrorBoundary","ErrorBoundary","listeners","AddDriveModal","CreateDocumentModal","DriveSettingsModal","SettingsModal","ErrorBoundary","ErrorBoundary","CookieBanner","CookieBanner","PHCookieBanner","ErrorBoundary","ErrorBoundary"],"sources":["../src/hooks/useAcceptedCookies.ts","../src/hooks/usePendingInstallations.ts","../src/hooks/useCookieBanner.ts","../src/hooks/useInitSentry.ts","../src/hooks/useUndoRedoShortcuts.ts","../src/components/analytics.tsx","../src/components/document-editor-container.tsx","../src/components/editor-loader.tsx","../src/components/error-boundary.tsx","../src/components/app-container.tsx","../src/utils/browser.ts","../src/utils/document-editor-debug-tools.ts","../src/components/migration-status.ts","../src/utils/pglite-migration.ts","../src/components/app-skeleton.tsx","../src/components/migration-banner.tsx","../src/components/modal/modals-container.tsx","../src/components/app-loader.tsx","../src/context/sentry-provider.tsx","../src/components/package-install-prompt.tsx","../src/components/app.tsx","../src/components/cookie-banner.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 {\n usePackageDiscoveryService,\n type PendingInstallation,\n} from \"@powerhousedao/reactor-browser\";\nimport { useSyncExternalStore } from \"react\";\n\nconst emptyArray: PendingInstallation[] = [];\n\nexport function usePendingInstallations() {\n const discoveryService = usePackageDiscoveryService();\n return useSyncExternalStore(\n (cb) => discoveryService?.subscribePending(cb) ?? (() => {}),\n () => discoveryService?.getPendingInstallations() ?? emptyArray,\n );\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","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 { Icon, PowerhouseButton } from \"@powerhousedao/design-system\";\nimport { 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 with a collapsible details section.\n * Useful for development and debugging purposes.\n */\nfunction DetailedFallback({ error, resetErrorBoundary }: FallbackProps) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorDetails =\n error instanceof Error\n ? (error.stack ?? String(error.cause))\n : JSON.stringify(error, null, 2);\n const hasDetails = errorDetails !== \"{}\";\n\n return (\n <div className=\"z-10 mx-auto flex max-w-[80%] flex-1 items-center justify-center p-6\">\n <div className=\"w-full max-w-lg rounded-lg border border-gray-500 bg-white p-6 shadow-sm\">\n <div className=\"mb-3 flex items-center gap-2\">\n <Icon name=\"Error\" className=\"size-5 shrink-0\" />\n <h1 className=\"text-lg font-semibold\">Something went wrong</h1>\n </div>\n <p className=\"mb-4 text-sm text-gray-700\">{errorMessage}</p>\n {hasDetails && (\n <details className=\"group\">\n <summary className=\"cursor-pointer select-none text-sm font-medium text-gray-700 underline hover:text-gray-700\">\n Show details\n </summary>\n <pre className=\"mt-2 max-h-48 overflow-auto rounded bg-gray-100 p-3 text-xs\">\n {errorDetails}\n </pre>\n </details>\n )}\n <PowerhouseButton\n type=\"button\"\n onClick={resetErrorBoundary}\n className=\"text-md mt-4 px-3 py-1.5 font-medium\"\n >\n Try again\n </PowerhouseButton>\n </div>\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 { DropZoneWrapper } from \"@powerhousedao/design-system/connect\";\nimport { GenericDriveExplorer } from \"@powerhousedao/powerhouse-vetra-packages/editors\";\nimport {\n useAppModuleById,\n useDefaultAppModule,\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 AppContainer() {\n const [selectedDrive] = useSelectedDrive();\n const selectedDocumentId = useSelectedDocumentId();\n\n const app = useAppModuleById(selectedDrive.header.meta?.preferredEditor);\n const defaultApp = useDefaultAppModule();\n\n const AppComponent =\n app?.Component ?? defaultApp?.Component ?? GenericDriveExplorer.Component;\n\n if (!AppComponent) {\n throw new Error(\"No app component found\");\n }\n return (\n <ErrorBoundary\n variant=\"detailed\"\n resetKeys={[selectedDrive.header.id]}\n loggerContext={[\"Connect\", \"App\"]}\n >\n <Suspense fallback={<EditorLoader />}>\n <DropZoneWrapper className=\"flex h-full flex-col overflow-auto\">\n <AppComponent>\n {selectedDocumentId ? <DocumentEditorContainer /> : null}\n </AppComponent>\n </DropZoneWrapper>\n </Suspense>\n </ErrorBoundary>\n );\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","export type MigrationPhase = \"clone\" | \"dump\" | \"restore\";\n\nexport type MigrationStatus = {\n idbName: string;\n phase: MigrationPhase;\n};\n\nlet current: MigrationStatus | null = null;\nconst listeners = new Set<() => void>();\n\nexport function setMigrationStatus(status: MigrationStatus | null): void {\n current = status;\n for (const l of listeners) l();\n}\n\nexport function getMigrationStatus(): MigrationStatus | null {\n return current;\n}\n\nexport function subscribeMigrationStatus(cb: () => void): () => void {\n listeners.add(cb);\n return () => {\n listeners.delete(cb);\n };\n}\n","import { PGlite } from \"@electric-sql/pglite\";\nimport {\n setMigrationStatus,\n type MigrationPhase,\n} from \"../components/migration-status.js\";\nimport {\n createFileDataStore,\n IDB_DB_VERSION,\n IDB_STORE_NAME,\n idbError,\n openIdb,\n PRIMARY_IDB_NAMES,\n readPgVersionFile,\n} from \"./pglite-idb.js\";\nimport { CURRENT_PG_MAJOR } from \"./pglite-runtime.js\";\n\nconst BACKUP_PREFIX = \"ph-pglite-backup::\";\nconst BACKUP_INDEX_KEY = \"ph:pglite-backups\";\nconst BACKUP_RETENTION_MS = 30 * 24 * 60 * 60 * 1000;\n\ntype FileDataValue = {\n contents: Uint8Array | number[];\n mode: number;\n timestamp: Date | number;\n};\n\ntype LegacyDumper = (idbName: string) => Promise<string>;\n\nconst LEGACY_DUMPERS: Partial<Record<number, () => Promise<LegacyDumper>>> = {\n 16: async () => {\n const [{ PGlite: LegacyPGlite }, { pgDump }] = await Promise.all([\n import(\"pglite-legacy-02\"),\n import(\"pglite-tools-legacy-02/pg_dump\"),\n ]);\n return async (idbName: string) => {\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new LegacyPGlite(`idb://${stripped}`);\n try {\n await pg.waitReady;\n const file = await pgDump({ pg });\n return await file.text();\n } finally {\n await pg.close();\n }\n };\n },\n};\n\n// Emscripten IDBFS holds the IDB connection open past pglite's pg.close(),\n// so deleteDatabase can be blocked indefinitely. Callers on the hot path\n// should prefer clearFileData() instead; deleteIdb is only used by the\n// janitor for expired backups, which tolerates the 15s timeout.\nfunction deleteIdb(name: string, timeoutMs = 15_000): Promise<void> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.deleteDatabase(name);\n let settled = false;\n const done = (fn: () => void) => {\n if (settled) return;\n settled = true;\n fn();\n };\n const timer = setTimeout(\n () =>\n done(() =>\n reject(\n new Error(`IDB delete timed out for ${name} after ${timeoutMs}ms`),\n ),\n ),\n timeoutMs,\n );\n req.onsuccess = () =>\n done(() => {\n clearTimeout(timer);\n resolve();\n });\n req.onerror = () =>\n done(() => {\n clearTimeout(timer);\n reject(idbError(req, `IDB delete failed for ${name}`));\n });\n });\n}\n\nasync function clearFileData(name: string): Promise<void> {\n const db = await openIdb(name, IDB_DB_VERSION, createFileDataStore);\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(IDB_STORE_NAME, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(idbError(tx, `FILE_DATA clear failed for ${name}`));\n tx.onabort = () =>\n reject(idbError(tx, `FILE_DATA clear aborted for ${name}`));\n tx.objectStore(IDB_STORE_NAME).clear();\n });\n } finally {\n db.close();\n }\n}\n\nasync function cloneFileData(\n sourceName: string,\n destName: string,\n): Promise<void> {\n const source = await openIdb(sourceName, IDB_DB_VERSION, createFileDataStore);\n try {\n const dest = await openIdb(destName, IDB_DB_VERSION, createFileDataStore);\n try {\n const readTx = source.transaction(IDB_STORE_NAME, \"readonly\");\n const readStore = readTx.objectStore(IDB_STORE_NAME);\n const entries = await new Promise<\n Array<{ key: IDBValidKey; value: FileDataValue }>\n >((resolve, reject) => {\n const out: Array<{ key: IDBValidKey; value: FileDataValue }> = [];\n const req = readStore.openCursor();\n req.onerror = () =>\n reject(\n idbError(req, `FILE_DATA read cursor failed for ${sourceName}`),\n );\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) return resolve(out);\n out.push({ key: cursor.key, value: cursor.value as FileDataValue });\n cursor.continue();\n };\n });\n\n await new Promise<void>((resolve, reject) => {\n const writeTx = dest.transaction(IDB_STORE_NAME, \"readwrite\");\n writeTx.oncomplete = () => resolve();\n writeTx.onerror = () =>\n reject(idbError(writeTx, `FILE_DATA write failed for ${destName}`));\n writeTx.onabort = () =>\n reject(idbError(writeTx, `FILE_DATA write aborted for ${destName}`));\n const writeStore = writeTx.objectStore(IDB_STORE_NAME);\n writeStore.clear();\n for (const { key, value } of entries) {\n writeStore.put(value, key);\n }\n });\n } finally {\n dest.close();\n }\n } finally {\n source.close();\n }\n}\n\ntype BackupRecord = { name: string; idbName: string; createdAt: number };\n\nfunction readBackupIndex(): BackupRecord[] {\n try {\n const raw = localStorage.getItem(BACKUP_INDEX_KEY);\n if (!raw) return [];\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as BackupRecord[]) : [];\n } catch {\n return [];\n }\n}\n\nfunction writeBackupIndex(records: BackupRecord[]): void {\n try {\n localStorage.setItem(BACKUP_INDEX_KEY, JSON.stringify(records));\n } catch {\n // ignore quota errors — janitor is best-effort\n }\n}\n\nfunction registerBackup(rec: BackupRecord): void {\n writeBackupIndex([...readBackupIndex(), rec]);\n}\n\nfunction forgetBackup(name: string): void {\n writeBackupIndex(readBackupIndex().filter((r) => r.name !== name));\n}\n\nasync function janitor(): Promise<void> {\n const cutoff = Date.now() - BACKUP_RETENTION_MS;\n const keep: BackupRecord[] = [];\n for (const rec of readBackupIndex()) {\n if (rec.createdAt >= cutoff) {\n keep.push(rec);\n continue;\n }\n try {\n await deleteIdb(rec.name);\n } catch (err) {\n console.warn(`Failed to delete expired pglite backup ${rec.name}`, err);\n keep.push(rec);\n }\n }\n writeBackupIndex(keep);\n}\n\nfunction publishPhase(idbName: string, phase: MigrationPhase): void {\n setMigrationStatus({ idbName, phase });\n}\n\nasync function migrateIdbIfNeeded(idbName: string): Promise<void> {\n const major = await readPgVersionFile(idbName);\n if (major === null || major === CURRENT_PG_MAJOR) return;\n\n const loader = LEGACY_DUMPERS[major];\n if (!loader) {\n throw new Error(\n `Unsupported legacy PGlite data dir: PG_VERSION=${major} for ${idbName}`,\n );\n }\n\n const backupName = `${BACKUP_PREFIX}${idbName}::${new Date().toISOString()}`;\n const backupRec: BackupRecord = {\n name: backupName,\n idbName,\n createdAt: Date.now(),\n };\n\n publishPhase(idbName, \"clone\");\n await cloneFileData(idbName, backupName);\n registerBackup(backupRec);\n\n let sql: string;\n try {\n publishPhase(idbName, \"dump\");\n const dump = await loader();\n sql = await dump(idbName);\n } catch (err) {\n await deleteIdb(backupName).catch(() => {});\n forgetBackup(backupName);\n throw err;\n }\n\n try {\n // Can't deleteDatabase here: Emscripten IDBFS from the legacy PGlite\n // keeps its IDB connection open past pg.close(). Clearing the store\n // in-place leaves the IDB handle alone, and the fresh PGlite will\n // initdb into the empty VFS.\n await clearFileData(idbName);\n publishPhase(idbName, \"restore\");\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new PGlite(`idb://${stripped}`, { relaxedDurability: false });\n try {\n await pg.waitReady;\n // PGlite 0.2.x pg_dump emits SQL literals with doubled backslashes\n // (escape-string form) but does not always emit the matching\n // `SET standard_conforming_strings = off`. PG17 defaults that GUC to on,\n // so '\\\\\"' in the dump is parsed as a literal backslash + end-of-string\n // and JSONB re-parsing fails. Force off at the session level before\n // running the dump so doubled backslashes collapse as intended.\n console.info(\n `[pglite-migration] Dump preamble (first 500 chars):\\n${sql.slice(0, 500)}`,\n );\n try {\n await pg.exec(\"SET standard_conforming_strings = off;\");\n } catch (gucErr) {\n console.warn(\n \"[pglite-migration] Could not force standard_conforming_strings=off\",\n gucErr,\n );\n }\n try {\n await pg.exec(sql);\n } catch (execErr) {\n logRestoreFailure(idbName, sql, execErr);\n throw execErr;\n }\n } finally {\n await pg.close();\n }\n } catch (err) {\n await rollbackFromBackup(idbName, backupName, err);\n throw err;\n }\n}\n\nfunction logRestoreFailure(idbName: string, sql: string, err: unknown): void {\n const errObj = err as {\n message?: string;\n position?: string | number;\n severity?: string;\n code?: string;\n detail?: string;\n where?: string;\n internalQuery?: string;\n };\n const position =\n typeof errObj.position === \"string\"\n ? parseInt(errObj.position, 10)\n : typeof errObj.position === \"number\"\n ? errObj.position\n : NaN;\n\n console.error(`[pglite-migration] Restore failed for ${idbName}`, {\n message: errObj.message,\n code: errObj.code,\n severity: errObj.severity,\n detail: errObj.detail,\n where: errObj.where,\n position: errObj.position,\n sqlLength: sql.length,\n });\n\n if (Number.isFinite(position) && position > 0) {\n const zeroBased = position - 1;\n const start = Math.max(0, zeroBased - 200);\n const end = Math.min(sql.length, zeroBased + 200);\n const before = sql.slice(start, zeroBased);\n const at = sql.slice(zeroBased, zeroBased + 1);\n const after = sql.slice(zeroBased + 1, end);\n console.error(\n `[pglite-migration] SQL context around position ${position}:\\n${before}»${at}«${after}`,\n );\n const lineStart = sql.lastIndexOf(\"\\n\", zeroBased) + 1;\n const lineEnd = sql.indexOf(\"\\n\", zeroBased);\n const line = sql.slice(lineStart, lineEnd === -1 ? sql.length : lineEnd);\n console.error(\n `[pglite-migration] Failing line (truncated to 500 chars):\\n${line.slice(0, 500)}`,\n );\n } else {\n console.error(\n `[pglite-migration] No position info. First 2000 chars of dump:\\n${sql.slice(0, 2000)}`,\n );\n }\n}\n\nasync function rollbackFromBackup(\n idbName: string,\n backupName: string,\n originalError: unknown,\n): Promise<void> {\n try {\n await clearFileData(idbName).catch(() => {});\n await cloneFileData(backupName, idbName);\n } catch (rollbackErr) {\n console.error(\n `PGlite migration failed AND rollback failed for ${idbName}. Primary error:`,\n originalError,\n \"Rollback error:\",\n rollbackErr,\n );\n return;\n }\n await deleteIdb(backupName).catch(() => {});\n forgetBackup(backupName);\n}\n\nasync function migrateAllLocked(): Promise<void> {\n for (const idbName of PRIMARY_IDB_NAMES) {\n await migrateIdbIfNeeded(idbName);\n }\n setMigrationStatus(null);\n}\n\nexport async function migrateAllIfNeeded(): Promise<void> {\n janitor().catch((err) => console.warn(\"PGlite backup janitor failed\", err));\n\n const hasLocks =\n typeof navigator !== \"undefined\" &&\n \"locks\" in navigator &&\n typeof navigator.locks.request === \"function\";\n\n if (!hasLocks) {\n await migrateAllLocked();\n return;\n }\n\n await navigator.locks.request(\n \"ph-pglite-migration\",\n { mode: \"exclusive\" },\n async () => {\n await migrateAllLocked();\n },\n );\n}\n","import { getBasePath } from \"@powerhousedao/connect/utils\";\nimport {\n AnimatedLoader,\n ConnectSidebar,\n HomeScreen,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n useEffect,\n useState,\n useSyncExternalStore,\n type PropsWithChildren,\n} from \"react\";\nimport {\n getMigrationStatus,\n subscribeMigrationStatus,\n type MigrationPhase,\n} from \"./migration-status.js\";\nconst LOADER_DELAY = 250;\n\nconst PHASE_LABEL: Record<MigrationPhase, string> = {\n clone: \"Backing up local database…\",\n dump: \"Exporting data from previous version…\",\n restore: \"Restoring data into the new database…\",\n};\n\nconst MigrationOverlay = () => {\n const status = useSyncExternalStore(\n subscribeMigrationStatus,\n getMigrationStatus,\n () => null,\n );\n if (!status) return null;\n return (\n <div className=\"absolute inset-0 z-20 flex items-center justify-center\">\n <div className=\"rounded-lg bg-white/90 px-6 py-4 text-sm text-gray-900 shadow-lg\">\n <div className=\"font-medium\">Upgrading local database…</div>\n <div className=\"text-gray-600\">{PHASE_LABEL[status.phase]}</div>\n </div>\n </div>\n );\n};\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: React.FC<PropsWithChildren> = (props) => {\n const isSSR = typeof window === \"undefined\";\n const isHomeScreen = !isSSR && window.location.pathname === getBasePath();\n return (\n <div className=\"flex h-screen overflow-hidden\">\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={props.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 {!props.children ? <Loader /> : null}\n <MigrationOverlay />\n </div>\n );\n};\n\nexport default AppSkeleton;\n","import {\n CURRENT_PG_MAJOR,\n getCachedReactorPgMajor,\n migrateAllIfNeeded,\n subscribeReactorPgMajor,\n} from \"@powerhousedao/connect/utils\";\nimport { useState, useSyncExternalStore } from \"react\";\n\nlet dismissed = false;\nconst listeners = new Set<() => void>();\n\nfunction notify() {\n for (const l of listeners) l();\n}\n\nfunction dismiss() {\n dismissed = true;\n notify();\n}\n\nfunction subscribeDismissed(cb: () => void): () => void {\n listeners.add(cb);\n return () => {\n listeners.delete(cb);\n };\n}\n\nfunction getDismissed(): boolean {\n return dismissed;\n}\n\nexport const MigrationBanner: React.FC = () => {\n const isDismissed = useSyncExternalStore(\n subscribeDismissed,\n getDismissed,\n () => false,\n );\n const major = useSyncExternalStore(\n subscribeReactorPgMajor,\n getCachedReactorPgMajor,\n () => undefined,\n );\n const [migrating, setMigrating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n if (major === undefined || major === null || major === CURRENT_PG_MAJOR) {\n return null;\n }\n if (isDismissed) return null;\n\n const handleMigrate = () => {\n setError(null);\n setMigrating(true);\n migrateAllIfNeeded()\n .then(() => {\n window.location.reload();\n })\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n setMigrating(false);\n });\n };\n\n return (\n <div className=\"absolute inset-x-0 top-0 z-30 flex justify-center p-3\">\n <div className=\"flex max-w-3xl items-center gap-3 rounded-lg border border-yellow-500 bg-yellow-400 px-4 py-3 text-sm text-gray-900 shadow-lg\">\n <div className=\"flex-1\">\n <div className=\"font-semibold\">\n Your local database uses Postgres {major}.\n </div>\n <div className=\"text-gray-800\">\n Migrate to Postgres {CURRENT_PG_MAJOR} to pick up the latest\n features. Your data will be backed up first.\n </div>\n {error && (\n <div className=\"mt-2 font-medium text-red-900\">\n Migration failed: {error}\n </div>\n )}\n </div>\n <button\n type=\"button\"\n disabled={migrating}\n onClick={handleMigrate}\n className=\"rounded bg-gray-900 px-3 py-1 text-sm font-medium text-white hover:bg-gray-800 disabled:opacity-50\"\n >\n {migrating ? \"Migrating…\" : \"Migrate now\"}\n </button>\n <button\n type=\"button\"\n disabled={migrating}\n onClick={dismiss}\n className=\"rounded border border-gray-900 bg-transparent px-3 py-1 text-sm font-medium text-gray-900 hover:bg-gray-900/10 disabled:opacity-50\"\n >\n Dismiss\n </button>\n </div>\n </div>\n );\n};\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 { DocumentModelLib } from \"document-model\";\nimport { lazy, StrictMode, Suspense } from \"react\";\nimport AppSkeleton from \"./app-skeleton.js\";\nimport { DetailedFallback, ErrorBoundary } from \"./error-boundary.js\";\nimport { App, CookieBanner } from \"./index.js\";\nimport { MigrationBanner } from \"./migration-banner.js\";\nimport { ModalsContainer } from \"./modal/modals-container.js\";\n\nexport const AppLoader = (props: { localPackage?: DocumentModelLib }) => {\n const Load = lazy(() =>\n import(\"./load.js\").then((m) => m.loadComponent(props.localPackage)),\n );\n return (\n <StrictMode>\n <ErrorBoundary\n fallbackRender={(props) => (\n <AppSkeleton children={<DetailedFallback {...props} />} />\n )}\n resetKeys={[props.localPackage]}\n loggerContext={[\"Connect\"]}\n >\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 <MigrationBanner />\n </ErrorBoundary>\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 {\n PackageInstallModal,\n type PendingPackageInstallation,\n} from \"@powerhousedao/design-system/connect/index\";\nimport { usePackageDiscoveryService } from \"@powerhousedao/reactor-browser\";\nimport { usePendingInstallations } from \"../hooks/usePendingInstallations.js\";\n\nexport function PackageInstallPrompt() {\n const pendingInstallations = usePendingInstallations();\n const discoveryService = usePackageDiscoveryService();\n\n if (!discoveryService || pendingInstallations.length === 0) return null;\n\n const installations: PendingPackageInstallation[] =\n pendingInstallations.flatMap((p) =>\n p.packageNames.map((packageName) => ({\n documentType: p.documentType,\n packageName,\n })),\n );\n\n return (\n <PackageInstallModal\n pendingInstallations={installations}\n onInstall={(packageName) =>\n discoveryService.approveInstallation(packageName)\n }\n onDismiss={(packageName) =>\n discoveryService.dismissInstallation(packageName)\n }\n />\n );\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 { useEffect } from \"react\";\nimport { ToastContainer } from \"../services/toast.js\";\nimport { PackageInstallPrompt } from \"./package-install-prompt.js\";\n\nexport const App = () => {\n // refresh page on vite preload error due to outdated chunks — but only when\n // the failing dynamic import is one of Connect's own chunks. External\n // dynamic imports (e.g. the package manager loading a package from the\n // configured CDN) should let the error propagate so the caller can surface\n // it; reloading here drops any open state and hides the real failure.\n useEffect(() => {\n const handlePreloadError = (event: Event) => {\n const payload = (event as Event & { payload?: unknown }).payload;\n const message =\n payload instanceof Error ? payload.message : String(payload ?? \"\");\n const failedUrl = message.match(/https?:\\/\\/[^\\s\"']+/)?.[0];\n\n if (failedUrl && !failedUrl.startsWith(window.location.origin)) {\n console.debug(\n `[Connect] Skipping reload — vite:preloadError for off-origin URL: ${failedUrl}`,\n );\n return;\n }\n\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 <ToastContainer position=\"bottom-right\" />\n <Router />\n <PackageInstallPrompt />\n <Analytics />\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 { 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.config.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 { AppContainer, DriveIcon } from \"@powerhousedao/connect/components\";\nimport {\n connectConfig,\n defaultPHAppConfig,\n defaultPHDocumentEditorConfig,\n} from \"@powerhousedao/connect/config\";\nimport {\n HomeScreen,\n HomeScreenAddDriveItem,\n HomeScreenItem,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n setPHAppConfig,\n setPHDocumentEditorConfig,\n setSelectedDrive,\n useAppModuleById,\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 setPHAppConfig(defaultPHAppConfig);\n }\n }, [selectedDrive]);\n\n const showHomeScreen =\n !selectedDocumentId && !selectedDrive && !selectedFolder;\n return (\n <ContentContainer>\n {showHomeScreen ? <HomeScreenContainer /> : <AppContainer />}\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 = useAppModuleById(drive.header.meta?.preferredEditor);\n const description = editorModule?.config.name || \"Drive Explorer App\";\n return (\n <HomeScreenItem\n key={drive.header.id}\n title={drive.state.global.name || drive.header.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 useEns,\n} from \"@powerhousedao/design-system/connect\";\n\nimport {\n logout,\n openRenown,\n setSelectedDrive,\n showPHModal,\n useDrives,\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 connectDebug = localStorage.getItem(\"CONNECT_DEBUG\") === \"true\";\n\n const ensName = user?.ens?.name || user?.profile?.username || undefined;\n const avatarUrl =\n user?.ens?.avatarUrl || user?.profile?.userImage || undefined;\n\n const ensInfo = useEns(!avatarUrl ? user?.address : undefined);\n\n const onClickSettings = () => {\n showPHModal({ type: \"settings\" });\n };\n\n const onAddDriveClick = () => {\n showPHModal({ type: \"addDrive\" });\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 address={user?.address}\n onLogin={openRenown}\n onDisconnect={logout}\n ensName={ensName || ensInfo.data?.ens}\n avatarUrl={\n avatarUrl ||\n ensInfo.data?.avatar_small ||\n ensInfo.data?.avatar_url ||\n undefined\n }\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;;;;ACvC9B,MAAM,aAAoC,EAAE;AAE5C,SAAgB,0BAA0B;CACxC,MAAM,mBAAmB,4BAA4B;AACrD,QAAO,sBACJ,OAAO,kBAAkB,iBAAiB,GAAG,WAAW,WACnD,kBAAkB,yBAAyB,IAAI,WACtD;;ACRH,MAAa,4BAA4B,GAFvB,cAAc,eAEsB;AAEtD,MAAMC,8BAAY,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,aAAU,IAAI,GAAG;AACjB,cAAaA,YAAU,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;;;;AC7BT,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,SAAM,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;;;;AChBlD,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,OAAO,sBAAqC;CACtE,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;CAC3E,MAAM,eACJ,iBAAiB,QACZ,MAAM,SAAS,OAAO,MAAM,MAAM,GACnC,KAAK,UAAU,OAAO,MAAM,EAAE;AAGpC,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAD;MAAM,MAAK;MAAQ,WAAU;MAAoB,CAAA,EACjD,oBAAC,MAAD;MAAI,WAAU;gBAAwB;MAAyB,CAAA,CAC3D;;IACN,oBAAC,KAAD;KAAG,WAAU;eAA8B;KAAiB,CAAA;IAT/C,iBAAiB,QAW5B,qBAAC,WAAD;KAAS,WAAU;eAAnB,CACE,oBAAC,WAAD;MAAS,WAAU;gBAA6F;MAEtG,CAAA,EACV,oBAAC,OAAD;MAAK,WAAU;gBACZ;MACG,CAAA,CACE;;IAEZ,oBAAC,kBAAD;KACE,MAAK;KACL,SAAS;KACT,WAAU;eACX;KAEkB,CAAA;IACf;;EACF,CAAA;;;;;;;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;;;;AC/MzB,SAAgB,eAAe;CAC7B,MAAM,CAAC,iBAAiB,kBAAkB;CAC1C,MAAM,qBAAqB,uBAAuB;CAElD,MAAM,MAAM,iBAAiB,cAAc,OAAO,MAAM,gBAAgB;CACxE,MAAM,aAAa,qBAAqB;CAExC,MAAM,eACJ,KAAK,aAAa,YAAY,aAAa,qBAAqB;AAElE,KAAI,CAAC,aACH,OAAM,IAAI,MAAM,yBAAyB;AAE3C,QACE,oBAACC,iBAAD;EACE,SAAQ;EACR,WAAW,CAAC,cAAc,OAAO,GAAG;EACpC,eAAe,CAAC,WAAW,MAAM;YAEjC,oBAAC,UAAD;GAAU,UAAU,oBAAC,cAAD,EAAgB,CAAA;aAClC,oBAAC,iBAAD;IAAiB,WAAU;cACzB,oBAAC,cAAD,EAAA,UACG,qBAAqB,oBAAC,yBAAD,EAA2B,CAAA,GAAG,MACvC,CAAA;IACC,CAAA;GACT,CAAA;EACG,CAAA;;;;ACvCpB,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,IAAI,UAAkC;AACtC,MAAMC,8BAAY,IAAI,KAAiB;AAEvC,SAAgB,mBAAmB,QAAsC;AACvE,WAAU;AACV,MAAK,MAAM,KAAKA,YAAW,IAAG;;AAGhC,SAAgB,qBAA6C;AAC3D,QAAO;;AAGT,SAAgB,yBAAyB,IAA4B;AACnE,aAAU,IAAI,GAAG;AACjB,cAAa;AACX,cAAU,OAAO,GAAG;;;;;ACNxB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AACzB,MAAM,sBAAsB,MAAU,KAAK,KAAK;AAUhD,MAAM,iBAAuE,EAC3E,IAAI,YAAY;CACd,MAAM,CAAC,EAAE,QAAQ,gBAAgB,EAAE,YAAY,MAAM,QAAQ,IAAI,CAC/D,OAAO,qBACP,OAAO,kCACR,CAAC;AACF,QAAO,OAAO,YAAoB;EAEhC,MAAM,KAAK,IAAI,aAAa,SADX,QAAQ,QAAQ,eAAe,GAAG,GACH;AAChD,MAAI;AACF,SAAM,GAAG;AAET,UAAO,OADM,MAAM,OAAO,EAAE,IAAI,CAAC,EACf,MAAM;YAChB;AACR,SAAM,GAAG,OAAO;;;GAIvB;AAMD,SAAS,UAAU,MAAc,YAAY,MAAuB;AAClE,QAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,MAAM,UAAU,eAAe,KAAK;EAC1C,IAAI,UAAU;EACd,MAAM,QAAQ,OAAmB;AAC/B,OAAI,QAAS;AACb,aAAU;AACV,OAAI;;EAEN,MAAM,QAAQ,iBAEV,WACE,uBACE,IAAI,MAAM,4BAA4B,KAAK,SAAS,UAAU,IAAI,CACnE,CACF,EACH,UACD;AACD,MAAI,kBACF,WAAW;AACT,gBAAa,MAAM;AACnB,YAAS;IACT;AACJ,MAAI,gBACF,WAAW;AACT,gBAAa,MAAM;AACnB,UAAO,SAAS,KAAK,yBAAyB,OAAO,CAAC;IACtD;GACJ;;AAGJ,eAAe,cAAc,MAA6B;CACxD,MAAM,KAAK,MAAM,QAAQ,MAAA,IAAsB,oBAAoB;AACnE,KAAI;AACF,QAAM,IAAI,SAAe,SAAS,WAAW;GAC3C,MAAM,KAAK,GAAG,YAAY,gBAAgB,YAAY;AACtD,MAAG,mBAAmB,SAAS;AAC/B,MAAG,gBACD,OAAO,SAAS,IAAI,8BAA8B,OAAO,CAAC;AAC5D,MAAG,gBACD,OAAO,SAAS,IAAI,+BAA+B,OAAO,CAAC;AAC7D,MAAG,YAAY,eAAe,CAAC,OAAO;IACtC;WACM;AACR,KAAG,OAAO;;;AAId,eAAe,cACb,YACA,UACe;CACf,MAAM,SAAS,MAAM,QAAQ,YAAA,IAA4B,oBAAoB;AAC7E,KAAI;EACF,MAAM,OAAO,MAAM,QAAQ,UAAA,IAA0B,oBAAoB;AACzE,MAAI;GAEF,MAAM,YADS,OAAO,YAAY,gBAAgB,WAAW,CACpC,YAAY,eAAe;GACpD,MAAM,UAAU,MAAM,IAAI,SAEvB,SAAS,WAAW;IACrB,MAAM,MAAyD,EAAE;IACjE,MAAM,MAAM,UAAU,YAAY;AAClC,QAAI,gBACF,OACE,SAAS,KAAK,oCAAoC,aAAa,CAChE;AACH,QAAI,kBAAkB;KACpB,MAAM,SAAS,IAAI;AACnB,SAAI,CAAC,OAAQ,QAAO,QAAQ,IAAI;AAChC,SAAI,KAAK;MAAE,KAAK,OAAO;MAAK,OAAO,OAAO;MAAwB,CAAC;AACnE,YAAO,UAAU;;KAEnB;AAEF,SAAM,IAAI,SAAe,SAAS,WAAW;IAC3C,MAAM,UAAU,KAAK,YAAY,gBAAgB,YAAY;AAC7D,YAAQ,mBAAmB,SAAS;AACpC,YAAQ,gBACN,OAAO,SAAS,SAAS,8BAA8B,WAAW,CAAC;AACrE,YAAQ,gBACN,OAAO,SAAS,SAAS,+BAA+B,WAAW,CAAC;IACtE,MAAM,aAAa,QAAQ,YAAY,eAAe;AACtD,eAAW,OAAO;AAClB,SAAK,MAAM,EAAE,KAAK,WAAW,QAC3B,YAAW,IAAI,OAAO,IAAI;KAE5B;YACM;AACR,QAAK,OAAO;;WAEN;AACR,SAAO,OAAO;;;AAMlB,SAAS,kBAAkC;AACzC,KAAI;EACF,MAAM,MAAM,aAAa,QAAQ,iBAAiB;AAClD,MAAI,CAAC,IAAK,QAAO,EAAE;EACnB,MAAM,SAAkB,KAAK,MAAM,IAAI;AACvC,SAAO,MAAM,QAAQ,OAAO,GAAI,SAA4B,EAAE;SACxD;AACN,SAAO,EAAE;;;AAIb,SAAS,iBAAiB,SAA+B;AACvD,KAAI;AACF,eAAa,QAAQ,kBAAkB,KAAK,UAAU,QAAQ,CAAC;SACzD;;AAKV,SAAS,eAAe,KAAyB;AAC/C,kBAAiB,CAAC,GAAG,iBAAiB,EAAE,IAAI,CAAC;;AAG/C,SAAS,aAAa,MAAoB;AACxC,kBAAiB,iBAAiB,CAAC,QAAQ,MAAM,EAAE,SAAS,KAAK,CAAC;;AAGpE,eAAe,UAAyB;CACtC,MAAM,SAAS,KAAK,KAAK,GAAG;CAC5B,MAAM,OAAuB,EAAE;AAC/B,MAAK,MAAM,OAAO,iBAAiB,EAAE;AACnC,MAAI,IAAI,aAAa,QAAQ;AAC3B,QAAK,KAAK,IAAI;AACd;;AAEF,MAAI;AACF,SAAM,UAAU,IAAI,KAAK;WAClB,KAAK;AACZ,WAAQ,KAAK,0CAA0C,IAAI,QAAQ,IAAI;AACvE,QAAK,KAAK,IAAI;;;AAGlB,kBAAiB,KAAK;;AAGxB,SAAS,aAAa,SAAiB,OAA6B;AAClE,oBAAmB;EAAE;EAAS;EAAO,CAAC;;AAGxC,eAAe,mBAAmB,SAAgC;CAChE,MAAM,QAAQ,MAAM,kBAAkB,QAAQ;AAC9C,KAAI,UAAU,QAAQ,UAAA,GAA4B;CAElD,MAAM,SAAS,eAAe;AAC9B,KAAI,CAAC,OACH,OAAM,IAAI,MACR,kDAAkD,MAAM,OAAO,UAChE;CAGH,MAAM,aAAa,GAAG,gBAAgB,QAAQ,qBAAI,IAAI,MAAM,EAAC,aAAa;CAC1E,MAAM,YAA0B;EAC9B,MAAM;EACN;EACA,WAAW,KAAK,KAAK;EACtB;AAED,cAAa,SAAS,QAAQ;AAC9B,OAAM,cAAc,SAAS,WAAW;AACxC,gBAAe,UAAU;CAEzB,IAAI;AACJ,KAAI;AACF,eAAa,SAAS,OAAO;AAE7B,QAAM,OADO,MAAM,QAAQ,EACV,QAAQ;UAClB,KAAK;AACZ,QAAM,UAAU,WAAW,CAAC,YAAY,GAAG;AAC3C,eAAa,WAAW;AACxB,QAAM;;AAGR,KAAI;AAKF,QAAM,cAAc,QAAQ;AAC5B,eAAa,SAAS,UAAU;EAEhC,MAAM,KAAK,IAAI,OAAO,SADL,QAAQ,QAAQ,eAAe,GAAG,IACR,EAAE,mBAAmB,OAAO,CAAC;AACxE,MAAI;AACF,SAAM,GAAG;AAOT,WAAQ,KACN,wDAAwD,IAAI,MAAM,GAAG,IAAI,GAC1E;AACD,OAAI;AACF,UAAM,GAAG,KAAK,yCAAyC;YAChD,QAAQ;AACf,YAAQ,KACN,sEACA,OACD;;AAEH,OAAI;AACF,UAAM,GAAG,KAAK,IAAI;YACX,SAAS;AAChB,sBAAkB,SAAS,KAAK,QAAQ;AACxC,UAAM;;YAEA;AACR,SAAM,GAAG,OAAO;;UAEX,KAAK;AACZ,QAAM,mBAAmB,SAAS,YAAY,IAAI;AAClD,QAAM;;;AAIV,SAAS,kBAAkB,SAAiB,KAAa,KAAoB;CAC3E,MAAM,SAAS;CASf,MAAM,WACJ,OAAO,OAAO,aAAa,WACvB,SAAS,OAAO,UAAU,GAAG,GAC7B,OAAO,OAAO,aAAa,WACzB,OAAO,WACP;AAER,SAAQ,MAAM,yCAAyC,WAAW;EAChE,SAAS,OAAO;EAChB,MAAM,OAAO;EACb,UAAU,OAAO;EACjB,QAAQ,OAAO;EACf,OAAO,OAAO;EACd,UAAU,OAAO;EACjB,WAAW,IAAI;EAChB,CAAC;AAEF,KAAI,OAAO,SAAS,SAAS,IAAI,WAAW,GAAG;EAC7C,MAAM,YAAY,WAAW;EAC7B,MAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,IAAI;EAC1C,MAAM,MAAM,KAAK,IAAI,IAAI,QAAQ,YAAY,IAAI;EACjD,MAAM,SAAS,IAAI,MAAM,OAAO,UAAU;EAC1C,MAAM,KAAK,IAAI,MAAM,WAAW,YAAY,EAAE;EAC9C,MAAM,QAAQ,IAAI,MAAM,YAAY,GAAG,IAAI;AAC3C,UAAQ,MACN,kDAAkD,SAAS,KAAK,OAAO,GAAG,GAAG,GAAG,QACjF;EACD,MAAM,YAAY,IAAI,YAAY,MAAM,UAAU,GAAG;EACrD,MAAM,UAAU,IAAI,QAAQ,MAAM,UAAU;EAC5C,MAAM,OAAO,IAAI,MAAM,WAAW,YAAY,KAAK,IAAI,SAAS,QAAQ;AACxE,UAAQ,MACN,8DAA8D,KAAK,MAAM,GAAG,IAAI,GACjF;OAED,SAAQ,MACN,mEAAmE,IAAI,MAAM,GAAG,IAAK,GACtF;;AAIL,eAAe,mBACb,SACA,YACA,eACe;AACf,KAAI;AACF,QAAM,cAAc,QAAQ,CAAC,YAAY,GAAG;AAC5C,QAAM,cAAc,YAAY,QAAQ;UACjC,aAAa;AACpB,UAAQ,MACN,mDAAmD,QAAQ,mBAC3D,eACA,mBACA,YACD;AACD;;AAEF,OAAM,UAAU,WAAW,CAAC,YAAY,GAAG;AAC3C,cAAa,WAAW;;AAG1B,eAAe,mBAAkC;AAC/C,MAAK,MAAM,WAAW,kBACpB,OAAM,mBAAmB,QAAQ;AAEnC,oBAAmB,KAAK;;AAG1B,eAAsB,qBAAoC;AACxD,UAAS,CAAC,OAAO,QAAQ,QAAQ,KAAK,gCAAgC,IAAI,CAAC;AAO3E,KAAI,EAJF,OAAO,cAAc,eACrB,WAAW,aACX,OAAO,UAAU,MAAM,YAAY,aAEtB;AACb,QAAM,kBAAkB;AACxB;;AAGF,OAAM,UAAU,MAAM,QACpB,uBACA,EAAE,MAAM,aAAa,EACrB,YAAY;AACV,QAAM,kBAAkB;GAE3B;;;;ACnWH,MAAM,eAAe;AAErB,MAAM,cAA8C;CAClD,OAAO;CACP,MAAM;CACN,SAAS;CACV;AAED,MAAM,yBAAyB;CAC7B,MAAM,SAAS,qBACb,0BACA,0BACM,KACP;AACD,KAAI,CAAC,OAAQ,QAAO;AACpB,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,OAAD;IAAK,WAAU;cAAc;IAA+B,CAAA,EAC5D,oBAAC,OAAD;IAAK,WAAU;cAAiB,YAAY,OAAO;IAAa,CAAA,CAC5D;;EACF,CAAA;;AAIV,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,eAA4C,UAAU;CACjE,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,MAAM,YAAY;IAC5B,CAAA;GACD,QACC,oBAAC,UAAD,EACE,yBAAyB,EACvB,QAAQ;;;;;;wBAOT,EACD,CAAA,GACA;GACH,CAAC,MAAM,WAAW,oBAAC,QAAD,EAAU,CAAA,GAAG;GAChC,oBAAC,kBAAD,EAAoB,CAAA;GAChB;;;;;ACxGV,IAAI,YAAY;AAChB,MAAM,4BAAY,IAAI,KAAiB;AAEvC,SAAS,SAAS;AAChB,MAAK,MAAM,KAAK,UAAW,IAAG;;AAGhC,SAAS,UAAU;AACjB,aAAY;AACZ,SAAQ;;AAGV,SAAS,mBAAmB,IAA4B;AACtD,WAAU,IAAI,GAAG;AACjB,cAAa;AACX,YAAU,OAAO,GAAG;;;AAIxB,SAAS,eAAwB;AAC/B,QAAO;;AAGT,MAAa,wBAAkC;CAC7C,MAAM,cAAc,qBAClB,oBACA,oBACM,MACP;CACD,MAAM,QAAQ,qBACZ,yBACA,+BACM,KAAA,EACP;CACD,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;CACjD,MAAM,CAAC,OAAO,YAAY,SAAwB,KAAK;AAEvD,KAAI,UAAU,KAAA,KAAa,UAAU,QAAQ,UAAA,GAC3C,QAAO;AAET,KAAI,YAAa,QAAO;CAExB,MAAM,sBAAsB;AAC1B,WAAS,KAAK;AACd,eAAa,KAAK;AAClB,sBAAoB,CACjB,WAAW;AACV,UAAO,SAAS,QAAQ;IACxB,CACD,OAAO,QAAiB;AACvB,YAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,CAAC;AAC1D,gBAAa,MAAM;IACnB;;AAGN,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,qBAAC,OAAD;KAAK,WAAU;eAAf;MACE,qBAAC,OAAD;OAAK,WAAU;iBAAf;QAA+B;QACM;QAAM;QACrC;;MACN,qBAAC,OAAD;OAAK,WAAU;iBAAf;QAA+B;;QACS;QAElC;;MACL,SACC,qBAAC,OAAD;OAAK,WAAU;iBAAf,CAA+C,sBAC1B,MACf;;MAEJ;;IACN,oBAAC,UAAD;KACE,MAAK;KACL,UAAU;KACV,SAAS;KACT,WAAU;eAET,YAAY,eAAe;KACrB,CAAA;IACT,oBAAC,UAAD;KACE,MAAK;KACL,UAAU;KACV,SAAS;KACT,WAAU;eACX;KAEQ,CAAA;IACL;;EACF,CAAA;;;;AC7FV,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;;;ACpGF,MAAa,aAAa,UAA+C;CACvE,MAAM,OAAO,WACX,OAAO,sBAAa,MAAM,MAAM,EAAE,cAAc,MAAM,aAAa,CAAC,CACrE;AACD,QACE,oBAAC,YAAD,EAAA,UACE,qBAACC,iBAAD;EACE,iBAAiB,UACf,oBAAC,aAAD,EAAa,UAAU,oBAAC,kBAAD,EAAkB,GAAI,OAAS,CAAA,EAAI,CAAA;EAE5D,WAAW,CAAC,MAAM,aAAa;EAC/B,eAAe,CAAC,UAAU;YAL5B;GAOE,oBAAC,UAAD;IAAU,UAAU,oBAAC,aAAD,EAAe,CAAA;IAAE,MAAK;cACxC,oBAAC,MAAD;KAAM,GAAI;eACR,oBAAC,KAAD,EAAO,CAAA;KACF,CAAA;IACE,CAAA;GACX,oBAAC,UAAD;IAAU,MAAK;cACb,oBAACC,gBAAD,EAAgB,CAAA;IACP,CAAA;GACX,oBAAC,UAAD;IAAU,MAAK;cACb,oBAAC,iBAAD,EAAmB,CAAA;IACV,CAAA;GACX,oBAAC,iBAAD,EAAmB,CAAA;GACL;KACL,CAAA;;;;AC7BjB,MAAa,kBAAiD,EAAE,eAAe;AAC7E,gBAAe;AAEf,QAAO;;;;ACFT,SAAgB,uBAAuB;CACrC,MAAM,uBAAuB,yBAAyB;CACtD,MAAM,mBAAmB,4BAA4B;AAErD,KAAI,CAAC,oBAAoB,qBAAqB,WAAW,EAAG,QAAO;AAUnE,QACE,oBAAC,qBAAD;EACE,sBATF,qBAAqB,SAAS,MAC5B,EAAE,aAAa,KAAK,iBAAiB;GACnC,cAAc,EAAE;GAChB;GACD,EAAE,CACJ;EAKC,YAAY,gBACV,iBAAiB,oBAAoB,YAAY;EAEnD,YAAY,gBACV,iBAAiB,oBAAoB,YAAY;EAEnD,CAAA;;;;ACnBN,MAAa,YAAY;AAMvB,iBAAgB;EACd,MAAM,sBAAsB,UAAiB;GAC3C,MAAM,UAAW,MAAwC;GAGzD,MAAM,aADJ,mBAAmB,QAAQ,QAAQ,UAAU,OAAO,WAAW,GAAG,EAC1C,MAAM,sBAAsB,GAAG;AAEzD,OAAI,aAAa,CAAC,UAAU,WAAW,OAAO,SAAS,OAAO,EAAE;AAC9D,YAAQ,MACN,qEAAqE,YACtE;AACD;;AAGF,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,qBAAC,gBAAD,EAAA,UAAA;EACE,oBAAC,gBAAD,EAAgB,UAAS,gBAAiB,CAAA;EAC1C,oBAAC,QAAD,EAAU,CAAA;EACV,oBAAC,sBAAD,EAAwB,CAAA;EACxB,oBAAC,WAAD,EAAa,CAAA;EACE,EAAA,CAAA;;;;AC9CrB,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;;;;;AC9EV,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,OAAO;EACjC,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,UAAM,sCAAsC,EAAE,MAAM,WAAW,CAAC;;GAElE,mBAAmB;AACjB,UAAM,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;;;;ACKV,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,gBAAe,mBAAmB;IAEnC,CAAC,cAAc,CAAC;AAInB,QACE,oBAAC,kBAAD,EAAA,UAFA,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,iBAGtB,oBAAC,qBAAD,EAAuB,CAAA,GAAG,oBAAC,cAAD,EAAgB,CAAA,EAC3C,CAAA;;AAIvB,SAAS,iBAAiB,EAAE,YAA2C;AACrE,QACE,oBAAC,OAAD;EAAK,WAAU;EAAqC,IAAG;EACpD;EACG,CAAA;;AAIV,SAAS,UAAU,EAAE,SAA2C;CAE9D,MAAM,cADe,iBAAiB,MAAM,OAAO,MAAM,gBAAgB,EACvC,OAAO,QAAQ;AACjD,QACE,oBAAC,gBAAD;EAEE,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAM,OAAO;EAClC;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;;;;ACvEjB,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,SAAM,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,eAAe,aAAa,QAAQ,gBAAgB,KAAK;CAE/D,MAAM,UAAU,MAAM,KAAK,QAAQ,MAAM,SAAS,YAAY,KAAA;CAC9D,MAAM,YACJ,MAAM,KAAK,aAAa,MAAM,SAAS,aAAa,KAAA;CAEtD,MAAM,UAAU,OAAO,CAAC,YAAY,MAAM,UAAU,KAAA,EAAU;CAE9D,MAAM,wBAAwB;AAC5B,cAAY,EAAE,MAAM,YAAY,CAAC;;CAGnC,MAAM,wBAAwB;AAC5B,cAAY,EAAE,MAAM,YAAY,CAAC;;CAGnC,MAAM,eAAe,MAAM,UACvB,gCAAgC,KAAK,YACrC;AAEJ,QACE,oBAAC,wBAAD,EAAA,UACE,oBAAC,gBAAD;EACE,IAAG;EACH,eAAe,iBAAiB,KAAA,EAAU;EACzB;EACjB,SAAS,MAAM;EACf,SAAS;EACT,cAAc;EACd,SAAS,WAAW,QAAQ,MAAM;EAClC,WACE,aACA,QAAQ,MAAM,gBACd,QAAQ,MAAM,cACd,KAAA;EAEY;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
package/dist/style.css
CHANGED
|
@@ -377,6 +377,12 @@
|
|
|
377
377
|
.mx-auto {
|
|
378
378
|
margin-inline: auto;
|
|
379
379
|
}
|
|
380
|
+
.my-4 {
|
|
381
|
+
margin-block: calc(var(--spacing) * 4);
|
|
382
|
+
}
|
|
383
|
+
.mt-1 {
|
|
384
|
+
margin-top: calc(var(--spacing) * 1);
|
|
385
|
+
}
|
|
380
386
|
.mt-2 {
|
|
381
387
|
margin-top: calc(var(--spacing) * 2);
|
|
382
388
|
}
|
|
@@ -508,6 +514,9 @@
|
|
|
508
514
|
.flex-col {
|
|
509
515
|
flex-direction: column;
|
|
510
516
|
}
|
|
517
|
+
.items-baseline {
|
|
518
|
+
align-items: baseline;
|
|
519
|
+
}
|
|
511
520
|
.items-center {
|
|
512
521
|
align-items: center;
|
|
513
522
|
}
|
|
@@ -726,6 +735,9 @@
|
|
|
726
735
|
--tw-font-weight: var(--font-weight-semibold);
|
|
727
736
|
font-weight: var(--font-weight-semibold);
|
|
728
737
|
}
|
|
738
|
+
.text-gray-400 {
|
|
739
|
+
color: var(--color-gray-400);
|
|
740
|
+
}
|
|
729
741
|
.text-gray-500 {
|
|
730
742
|
color: var(--color-gray-500);
|
|
731
743
|
}
|
|
@@ -741,6 +753,9 @@
|
|
|
741
753
|
.text-gray-900 {
|
|
742
754
|
color: var(--color-gray-900);
|
|
743
755
|
}
|
|
756
|
+
.text-red-600 {
|
|
757
|
+
color: var(--color-red-600);
|
|
758
|
+
}
|
|
744
759
|
.text-red-900 {
|
|
745
760
|
color: var(--color-red-900);
|
|
746
761
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/connect",
|
|
3
3
|
"productName": "Powerhouse-Connect",
|
|
4
|
-
"version": "6.0.2-staging.
|
|
4
|
+
"version": "6.0.2-staging.5",
|
|
5
5
|
"description": "Powerhouse Connect",
|
|
6
6
|
"main": "dist/index.html",
|
|
7
7
|
"type": "module",
|
|
@@ -66,14 +66,14 @@
|
|
|
66
66
|
"react-router-dom": "^6.11.2",
|
|
67
67
|
"tailwind-merge": "3.4.0",
|
|
68
68
|
"usehooks-ts": "^3.1.1",
|
|
69
|
-
"@powerhousedao/powerhouse-vetra-packages": "6.0.2-staging.
|
|
70
|
-
"@powerhousedao/config": "6.0.2-staging.
|
|
71
|
-
"@powerhousedao/
|
|
72
|
-
"@powerhousedao/
|
|
73
|
-
"@powerhousedao/shared": "6.0.2-staging.
|
|
74
|
-
"
|
|
75
|
-
"@
|
|
76
|
-
"
|
|
69
|
+
"@powerhousedao/powerhouse-vetra-packages": "6.0.2-staging.5",
|
|
70
|
+
"@powerhousedao/config": "6.0.2-staging.5",
|
|
71
|
+
"@powerhousedao/design-system": "6.0.2-staging.5",
|
|
72
|
+
"@powerhousedao/reactor-browser": "6.0.2-staging.5",
|
|
73
|
+
"@powerhousedao/shared": "6.0.2-staging.5",
|
|
74
|
+
"@powerhousedao/vetra": "6.0.2-staging.5",
|
|
75
|
+
"@renown/sdk": "6.0.2-staging.5",
|
|
76
|
+
"document-model": "6.0.2-staging.5"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
79
|
"@tailwindcss/cli": "4.2.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DriveSettingsModal-BVnVLbtl.js","names":["ConnectDriveSettingsModal"],"sources":["../src/components/modal/modals/DriveSettingsModal.tsx"],"sourcesContent":["import { DriveSettingsModal as ConnectDriveSettingsModal } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n driveCollectionId,\n renameDrive,\n setDriveAvailableOffline,\n setDriveSharingType,\n showPHModal,\n useDriveById,\n usePHModal,\n useSyncList,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport type { SharingType } from \"@powerhousedao/shared/document-drive\";\nimport { useMemo } from \"react\";\n\nexport function DriveSettingsModal() {\n const phModal = usePHModal();\n const open = phModal?.type === \"driveSettings\";\n const driveId = open ? phModal.driveId : undefined;\n const [drive] = useDriveById(driveId);\n const remotes = useSyncList();\n\n const isRemoteDrive = useMemo(() => {\n return remotes.some(\n (remote) =>\n remote.collectionId === driveCollectionId(\"main\", drive.header.id),\n );\n }, [remotes, drive]);\n\n if (!driveId || !drive) {\n return null;\n }\n\n async function onRenameDrive(drive: DocumentDriveDocument, newName: string) {\n await renameDrive(drive.header.id, newName);\n }\n\n async function onChangeSharingType(\n drive: DocumentDriveDocument,\n newSharingType: SharingType,\n ) {\n await setDriveSharingType(drive.header.id, newSharingType);\n }\n\n async function onChangeAvailableOffline(\n drive: DocumentDriveDocument,\n newAvailableOffline: boolean,\n ) {\n await setDriveAvailableOffline(drive.header.id, newAvailableOffline);\n }\n\n return (\n <ConnectDriveSettingsModal\n drive={drive}\n sharingType={isRemoteDrive ? \"PUBLIC\" : \"LOCAL\"}\n availableOffline={!isRemoteDrive}\n open={open}\n onRenameDrive={onRenameDrive}\n onDeleteDrive={() => showPHModal({ type: \"deleteDrive\", driveId })}\n onChangeAvailableOffline={onChangeAvailableOffline}\n onChangeSharingType={onChangeSharingType}\n onOpenChange={(status) => {\n if (!status) return closePHModal();\n }}\n />\n );\n}\n"],"mappings":";;;;;AAgBA,SAAgB,qBAAqB;CACnC,MAAM,UAAU,YAAY;CAC5B,MAAM,OAAO,SAAS,SAAS;CAC/B,MAAM,UAAU,OAAO,QAAQ,UAAU,KAAA;CACzC,MAAM,CAAC,SAAS,aAAa,QAAQ;CACrC,MAAM,UAAU,aAAa;CAE7B,MAAM,gBAAgB,cAAc;AAClC,SAAO,QAAQ,MACZ,WACC,OAAO,iBAAiB,kBAAkB,QAAQ,MAAM,OAAO,GAAG,CACrE;IACA,CAAC,SAAS,MAAM,CAAC;AAEpB,KAAI,CAAC,WAAW,CAAC,MACf,QAAO;CAGT,eAAe,cAAc,OAA8B,SAAiB;AAC1E,QAAM,YAAY,MAAM,OAAO,IAAI,QAAQ;;CAG7C,eAAe,oBACb,OACA,gBACA;AACA,QAAM,oBAAoB,MAAM,OAAO,IAAI,eAAe;;CAG5D,eAAe,yBACb,OACA,qBACA;AACA,QAAM,yBAAyB,MAAM,OAAO,IAAI,oBAAoB;;AAGtE,QACE,oBAACA,sBAAD;EACS;EACP,aAAa,gBAAgB,WAAW;EACxC,kBAAkB,CAAC;EACb;EACS;EACf,qBAAqB,YAAY;GAAE,MAAM;GAAe;GAAS,CAAC;EACxC;EACL;EACrB,eAAe,WAAW;AACxB,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsModal-BBR3tg5Y.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 { Icon } from \"@powerhousedao/design-system\";\nimport { About as BaseAbout } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, showPHModal } from \"@powerhousedao/reactor-browser\";\n\nexport const About: React.FC = () => {\n const onOpenInspector = () => {\n closePHModal();\n showPHModal({ type: \"inspector\" });\n };\n\n return (\n <div>\n <BaseAbout\n packageJson={packageJson}\n phCliVersion={\n typeof connectConfig.phCliVersion === \"string\"\n ? connectConfig.phCliVersion\n : undefined\n }\n />\n <div className=\"bg-white p-3\">\n <h2 className=\"mb-2 font-semibold\">Inspector</h2>\n <p className=\"mb-3 text-sm font-normal text-gray-600\">\n Explore the local database and sync state for debugging.\n </p>\n <button\n className=\"flex items-center gap-x-2 rounded-md border border-gray-300 bg-transparent px-3 py-1 text-sm font-medium text-gray-900 transition-colors hover:bg-gray-100\"\n onClick={onOpenInspector}\n type=\"button\"\n >\n Open Inspector <Icon name=\"CircleInfo\" size={16} />\n </button>\n </div>\n </div>\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\n/**\n * Split a `name@tag` spec into its bare package name. Mirrors the design-system's\n * `parsePackageSpec` — duplicated here to avoid reaching into a deep subpath\n * export. Scoped names split on the LAST `@`, unscoped on the first.\n */\nfunction parseBareName(spec: string): string {\n const trimmed = spec.trim();\n const at = trimmed.startsWith(\"@\")\n ? trimmed.lastIndexOf(\"@\")\n : trimmed.indexOf(\"@\");\n return at > 0 ? trimmed.slice(0, at) : trimmed;\n}\n\nexport const ConnectPackageManager: React.FC = () => {\n const packageManager = useVetraPackageManager();\n const {\n registryPackageList,\n updateRegistryPackageStatus,\n registerFallbackRegistryPackage,\n } = useRegistryPackages();\n\n async function handleInstall(packageSpec: string) {\n if (!packageManager) return;\n\n // The spec may include an explicit `@tag` / `@version` suffix from the\n // search input. Pass it through to the package manager as-is (the CDN\n // route already handles `name@tag` specs), but track status under the\n // bare name so the Settings list doesn't fragment.\n const bareName = parseBareName(packageSpec);\n // Packages that were in `/packages` when the user clicked Install go\n // through `updateRegistryPackageStatus` and hit an existing entry.\n // Packages that landed via the npm-uplink fallback weren't in the list,\n // so we register them explicitly rather than silently upserting a\n // placeholder — keeping the \"does not exist\" error as a signal for any\n // other code path that reaches update without a matching entry.\n const wasKnownToRegistry = registryPackageList.some(\n (p) => p.name === bareName,\n );\n const result = await packageManager.addPackage(packageSpec);\n if (result.type === \"success\") {\n if (wasKnownToRegistry) {\n updateRegistryPackageStatus(bareName, \"registry-install\");\n } else {\n registerFallbackRegistryPackage(\n bareName,\n result.package,\n packageManager.getPackageVersion(bareName) ??\n packageManager.getPackageVersion(packageSpec),\n \"registry-install\",\n );\n }\n toast(`Package \"${packageSpec}\" installed successfully`, {\n type: \"connect-success\",\n });\n } else {\n const message = result.error.message;\n // `BrowserPackageManager` raises a generic \"Failed to fetch dynamically\n // imported module\" when the registry CDN returns an error. That covers\n // both \"the name exists nowhere (not on this registry AND not on the\n // npmjs uplink)\" and \"the tarball is there but doesn't look like a\n // Powerhouse package\". Tell the user in plain terms before dumping the\n // raw error so the \"install from npm\" fallback case is self-explanatory.\n const isLikelyNotFound = /failed to fetch|404|not found/i.test(message);\n const userMessage = isLikelyNotFound\n ? `Could not install \"${packageSpec}\". The package isn't available on this registry, and the npmjs.org fallback could not resolve it either.`\n : `Failed to install \"${packageSpec}\": ${message}`;\n toast(userMessage, { type: \"error\" });\n }\n }\n\n function handleUninstall(packageName: string) {\n if (!packageManager) return;\n try {\n packageManager.removePackage(packageName);\n updateRegistryPackageStatus(packageName, \"available\");\n\n toast(`Package \"${packageName}\" uninstalled successfully`, {\n type: \"connect-success\",\n });\n } catch (error) {\n 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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"package-CD1WYMbw.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
|