@powerhousedao/connect-core 6.2.3-dev.88 → 6.2.3-dev.90
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/index-Beqvfchq.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/{multi-reactor-91g8OeBB.js → multi-reactor-COKWkIh5.js} +2 -2
- package/dist/{multi-reactor-91g8OeBB.js.map → multi-reactor-COKWkIh5.js.map} +1 -1
- package/dist/{plugin-host-CMr7lN40.js → plugin-host-CaTO1tq-.js} +2 -2
- package/dist/{plugin-host-CMr7lN40.js.map → plugin-host-CaTO1tq-.js.map} +1 -1
- package/dist/{plugin-ui-DHlnXJmN.js → plugin-ui-BS5j5g1d.js} +3 -3
- package/dist/{plugin-ui-DHlnXJmN.js.map → plugin-ui-BS5j5g1d.js.map} +1 -1
- package/dist/plugins.js +2 -2
- package/dist/{router-C4hDJ4_J.js → router-C5uD96ZP.js} +2 -2
- package/dist/{router-C4hDJ4_J.js.map → router-C5uD96ZP.js.map} +1 -1
- package/dist/router.js +2 -2
- package/dist/{runtime-CtZfHUnR.js → runtime-ClrasOcu.js} +3 -3
- package/dist/{runtime-CtZfHUnR.js.map → runtime-ClrasOcu.js.map} +1 -1
- package/dist/runtime-config.js +4 -4
- package/dist/{runtime-flag-DvxW_SD4.js → runtime-flag-DwQ3Jpdw.js} +2 -2
- package/dist/{runtime-flag-DvxW_SD4.js.map → runtime-flag-DwQ3Jpdw.js.map} +1 -1
- package/dist/runtime.js +2 -2
- package/dist/{views-BtUVboYl.js → views-LyRJcSKu.js} +20 -6
- package/dist/views-LyRJcSKu.js.map +1 -0
- package/dist/views.js +1 -1
- package/package.json +8 -8
- package/src/views/modals.tsx +15 -3
- package/dist/views-BtUVboYl.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views-LyRJcSKu.js","names":["modalViews"],"sources":["../src/views/index-table.tsx","../src/views/directory-listing.tsx","../src/views/document-history.tsx","../src/views/document-json.tsx","../src/views/editor-host.tsx","../src/views/content.tsx","../src/views/home.tsx","../src/views/backend-auth-gate.tsx","../src/views/theme-toggle.tsx","../src/views/modals.tsx","../src/views/layout.tsx","../src/views/not-found-page.tsx","../src/views/route-views.tsx","../src/views/settings.tsx","../src/views/settings-packages.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n/** `YYYY-MM-DD HH:mm` in UTC, as a server index lists it; \"-\" when unknown. */\nexport function formatModified(iso: string | undefined) {\n if (!iso) return \"-\";\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return \"-\";\n return date.toISOString().slice(0, 16).replace(\"T\", \" \");\n}\n\n/** An \"Index of\" page: a title above a name / type / last modified table. */\nexport function IndexTable(props: {\n title: ReactNode;\n label: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"p-6 font-mono text-sm text-core-fg\">\n <h1 className=\"mb-4 text-xl font-semibold\">{props.title}</h1>\n <table aria-label={props.label} className=\"w-full border-collapse\">\n <thead>\n <tr className=\"border-b border-core-border text-left text-core-muted\">\n <th className=\"py-1 pr-6 font-normal\">Name</th>\n <th className=\"py-1 pr-6 font-normal\">Type</th>\n <th className=\"py-1 font-normal\">Last modified</th>\n </tr>\n </thead>\n <tbody>{props.children}</tbody>\n </table>\n </div>\n );\n}\n\nexport function IndexRow(props: {\n name: ReactNode;\n type: ReactNode;\n modified: ReactNode;\n}) {\n return (\n <tr className=\"border-b border-core-border/50 hover:bg-core-hover\">\n <td className=\"py-1 pr-6\">{props.name}</td>\n <td className=\"py-1 pr-6 text-core-muted\">{props.type}</td>\n <td className=\"py-1 whitespace-nowrap text-core-muted\">\n {props.modified}\n </td>\n </tr>\n );\n}\n\nexport const linkClass = \"text-core-link underline-offset-2 hover:underline\";\n","import {\n getDriveName,\n makeDriveSlug,\n makeNodeSlug,\n useDocumentById,\n useDriveNodes,\n useLinkProps,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n DocumentDriveDocument,\n FolderNode,\n Node,\n} from \"@powerhousedao/shared/document-drive\";\nimport { isFileNode } from \"@powerhousedao/shared/document-drive\";\nimport type { ReactNode } from \"react\";\nimport { Component, Fragment, Suspense } from \"react\";\nimport type { DriveViewProps } from \"../router/route-components.js\";\nimport {\n formatModified,\n IndexRow,\n IndexTable,\n linkClass,\n} from \"./index-table.js\";\n\nfunction NodeLink(props: {\n drive: DocumentDriveDocument;\n node: Node | undefined;\n children: ReactNode;\n}) {\n const link = useLinkProps({\n driveSlug: makeDriveSlug(props.drive),\n nodeSlug: props.node ? makeNodeSlug(props.node) : undefined,\n });\n return (\n <a {...link} className={linkClass}>\n {props.children}\n </a>\n );\n}\n\nfunction HomeLink(props: { children: ReactNode }) {\n const link = useLinkProps(undefined);\n return (\n <a {...link} className={linkClass}>\n {props.children}\n </a>\n );\n}\n\n// A row's date is a nicety: it shows \"-\" when the document can't load.\nclass Quiet extends Component<{ children: ReactNode }, { failed: boolean }> {\n override state = { failed: false };\n static getDerivedStateFromError() {\n return { failed: true };\n }\n override render() {\n return this.state.failed ? \"-\" : this.props.children;\n }\n}\n\nfunction DocumentModified({ id }: { id: string }) {\n const [document] = useDocumentById(id);\n return formatModified(document?.header.lastModifiedAtUtcIso);\n}\n\n/** The folders from the drive's root down to `folder`. */\nfunction folderPath(nodes: readonly Node[], folder: FolderNode | undefined) {\n const path: Node[] = [];\n for (let node: Node | undefined = folder; node;) {\n path.unshift(node);\n const parentId: string | null | undefined = node.parentFolder;\n node = parentId ? nodes.find((n) => n.id === parentId) : undefined;\n }\n return path;\n}\n\nconst byKindThenName = (a: Node, b: Node) =>\n a.kind === b.kind\n ? a.name.localeCompare(b.name)\n : a.kind === \"folder\"\n ? -1\n : 1;\n\n/** Core's drive fallback: a listing of the open folder; an open document shows instead. */\nexport function DirectoryListing({ drive, folder, children }: DriveViewProps) {\n if (children) return children;\n return <FolderListing drive={drive} folder={folder} />;\n}\n\nfunction FolderListing({\n drive,\n folder,\n}: {\n drive: DocumentDriveDocument;\n folder: FolderNode | undefined;\n}) {\n const nodes = useDriveNodes(drive.header.id) ?? [];\n const path = folderPath(nodes, folder);\n const parent = path.at(-2);\n const entries = nodes\n .filter((node) => (node.parentFolder ?? null) === (folder?.id ?? null))\n .sort(byKindThenName);\n const title = (\n <>\n Index of /\n <NodeLink drive={drive} node={undefined}>\n {getDriveName(drive)}\n </NodeLink>\n /\n {path.map((node) => (\n <Fragment key={node.id}>\n <NodeLink drive={drive} node={node}>\n {node.name}\n </NodeLink>\n /\n </Fragment>\n ))}\n </>\n );\n return (\n <IndexTable title={title} label=\"Directory listing\">\n <IndexRow\n name={\n folder ? (\n <NodeLink drive={drive} node={parent}>\n Parent Directory\n </NodeLink>\n ) : (\n <HomeLink>Parent Directory</HomeLink>\n )\n }\n type=\"-\"\n modified=\"-\"\n />\n {entries.map((node) => (\n <IndexRow\n key={node.id}\n name={\n <NodeLink drive={drive} node={node}>\n {node.kind === \"folder\" ? `${node.name}/` : node.name}\n </NodeLink>\n }\n type={isFileNode(node) ? node.documentType : \"Folder\"}\n modified={\n node.kind === \"folder\" ? (\n \"-\"\n ) : (\n <Quiet>\n <Suspense fallback=\"…\">\n <DocumentModified id={node.id} />\n </Suspense>\n </Quiet>\n )\n }\n />\n ))}\n </IndexTable>\n );\n}\n","import {\n hideRevisionHistory,\n setRevisionHistoryPage,\n useReactorClient,\n useRevisionHistoryPage,\n} from \"@powerhousedao/reactor-browser\";\nimport type { Operation } from \"@powerhousedao/shared/document-model\";\nimport { useEffect, useState } from \"react\";\nimport type { DocumentViewProps } from \"../router/route-components.js\";\nimport { formatModified, linkClass } from \"./index-table.js\";\n\nconst pagerClass = `${linkClass} disabled:text-core-muted disabled:no-underline`;\n\n/** Operations per scope on a history page. */\nexport const HISTORY_PAGE_SIZE = 50;\n\n/** Page `page`'s index range of a scope with `count` operations, newest first. */\nexport function historyPageRange(count: number, page: number) {\n const end = Math.max(count - (page - 1) * HISTORY_PAGE_SIZE, 0);\n return { start: Math.max(end - HISTORY_PAGE_SIZE, 0), end };\n}\n\ntype PageState =\n | { status: \"loading\" }\n | { status: \"ready\"; operations: Operation[] }\n | { status: \"error\"; error: Error };\n\n// Fetches only the page's range: `sinceRevision` and a limit of the page size.\nfunction useScopePage(\n documentId: string,\n scope: string,\n start: number,\n end: number,\n) {\n const client = useReactorClient();\n // Each result is kept with its request; a newer request reads as loading.\n const key = `${documentId}:${scope}:${start}:${end}`;\n const [result, setResult] = useState<{ key: string; state: PageState }>();\n const empty = !client || end <= start;\n useEffect(() => {\n if (empty) return;\n const controller = new AbortController();\n const setState = (state: PageState) => setResult({ key, state });\n client\n .getOperations(\n documentId,\n { scopes: [scope] },\n { sinceRevision: start },\n { cursor: \"\", limit: end - start },\n controller.signal,\n )\n .then(\n (page) => {\n const operations = page.results\n .filter((operation) => operation.index < end)\n .sort((a, b) => b.index - a.index);\n setState({ status: \"ready\", operations });\n },\n (reason: unknown) => {\n if (controller.signal.aborted) return;\n setState({\n status: \"error\",\n error: reason instanceof Error ? reason : new Error(String(reason)),\n });\n },\n );\n return () => controller.abort();\n }, [client, empty, key, documentId, scope, start, end]);\n if (empty) return { status: \"ready\", operations: [] } as const;\n return result?.key === key ? result.state : ({ status: \"loading\" } as const);\n}\n\nfunction ScopeOperations(props: {\n documentId: string;\n scope: string;\n count: number;\n page: number;\n}) {\n const { start, end } = historyPageRange(props.count, props.page);\n const state = useScopePage(props.documentId, props.scope, start, end);\n return (\n <section className=\"mb-6\">\n <h2 className=\"mb-2 font-semibold\">\n {props.scope}{\" \"}\n <span className=\"font-normal text-core-muted\">\n {end > start\n ? `${end - start} of ${props.count}, ${start}-${end - 1}`\n : `0 of ${props.count}`}\n </span>\n </h2>\n {state.status === \"error\" ? (\n <p className=\"text-core-danger\">{state.error.message}</p>\n ) : state.status === \"loading\" ? (\n <p className=\"text-core-muted\">Loading…</p>\n ) : state.operations.length === 0 ? (\n <p className=\"text-core-muted\">No operations on this page.</p>\n ) : (\n <table\n aria-label={`${props.scope} operations`}\n className=\"w-full border-collapse\"\n >\n <thead>\n <tr className=\"border-b border-core-border text-left text-core-muted\">\n <th className=\"py-1 pr-6 font-normal\">Index</th>\n <th className=\"py-1 pr-6 font-normal\">Action</th>\n <th className=\"py-1 font-normal\">Timestamp</th>\n </tr>\n </thead>\n <tbody>\n {state.operations.map((operation) => (\n <tr\n key={operation.index}\n className=\"border-b border-core-border/50 hover:bg-core-hover\"\n >\n <td className=\"py-1 pr-6\">{operation.index}</td>\n <td className=\"py-1 pr-6\">{operation.action.type}</td>\n <td className=\"py-1\">\n {formatModified(operation.timestampUtcMs)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </section>\n );\n}\n\n/** Core's revision history: each scope's operations, newest first, a page at a time. */\nexport function DocumentHistory({ document }: DocumentViewProps) {\n const page = useRevisionHistoryPage();\n const { header } = document;\n const scopes = Object.entries(header.revision);\n const pageCount = Math.max(\n 1,\n ...scopes.map(([, count]) => Math.ceil(count / HISTORY_PAGE_SIZE)),\n );\n const pager = (\n <nav aria-label=\"History pages\" className=\"flex items-center gap-4\">\n <button\n type=\"button\"\n className={pagerClass}\n disabled={page <= 1}\n onClick={() => setRevisionHistoryPage(page - 1)}\n >\n Newer\n </button>\n <span className=\"text-core-muted\">\n Page {page} of {pageCount}\n </span>\n <button\n type=\"button\"\n className={pagerClass}\n disabled={page >= pageCount}\n onClick={() => setRevisionHistoryPage(page + 1)}\n >\n Older\n </button>\n </nav>\n );\n return (\n <div className=\"p-6 font-mono text-sm text-core-fg\">\n <div className=\"mb-4 flex items-baseline justify-between\">\n <h1 className=\"text-xl font-semibold\">\n History of {header.name || header.id}\n </h1>\n <button\n type=\"button\"\n className={linkClass}\n onClick={hideRevisionHistory}\n >\n Close\n </button>\n </div>\n <div className=\"mb-4\">{pager}</div>\n {scopes.length === 0 ? (\n <p className=\"text-core-muted\">No operations yet.</p>\n ) : (\n scopes.map(([scope, count]) => (\n <ScopeOperations\n key={scope}\n documentId={header.id}\n scope={scope}\n count={count}\n page={page}\n />\n ))\n )}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { DocumentViewProps } from \"../router/route-components.js\";\nimport { formatModified } from \"./index-table.js\";\n\nfunction Leaf({ value }: { value: unknown }) {\n if (value === null) return <span className=\"text-core-muted\">null</span>;\n if (typeof value === \"string\") {\n return <span className=\"text-core-string\">{JSON.stringify(value)}</span>;\n }\n return <span className=\"text-core-number\">{JSON.stringify(value)}</span>;\n}\n\nfunction JsonNode(props: { name: ReactNode; value: unknown; open?: boolean }) {\n const { name, value } = props;\n if (value === null || typeof value !== \"object\") {\n return (\n <div className=\"pl-4\">\n <span className=\"text-core-muted\">{name}: </span>\n <Leaf value={value} />\n </div>\n );\n }\n const entries = Object.entries(value as Record<string, unknown>);\n const isArray = Array.isArray(value);\n const summary = isArray ? `[${entries.length}]` : `{${entries.length}}`;\n return (\n <details open={props.open} className=\"pl-4\">\n <summary className=\"cursor-pointer select-none\">\n <span className=\"text-core-muted\">{name}: </span>\n <span className=\"text-core-muted\">{summary}</span>\n </summary>\n {entries.map(([key, child]) => (\n <JsonNode key={key} name={key} value={child} />\n ))}\n </details>\n );\n}\n\n/** Core's document fallback: the document's state, read-only, as a JSON tree. */\nexport function DocumentJson({ document }: DocumentViewProps) {\n const { header } = document;\n const revisions = Object.entries(header.revision);\n const operations = revisions.reduce((sum, [, count]) => sum + count, 0);\n const state = document.state as Record<string, unknown>;\n const scopes = [\"global\", \"local\"].filter((scope) => scope in state);\n return (\n <div className=\"p-6 font-mono text-sm text-core-fg\">\n <h1 className=\"mb-1 text-xl font-semibold\">{header.name || header.id}</h1>\n <dl className=\"mb-4 grid grid-cols-[max-content_1fr] gap-x-4 text-core-muted\">\n <dt>Type</dt>\n <dd>{header.documentType}</dd>\n <dt>Id</dt>\n <dd>{header.id}</dd>\n <dt>Last modified</dt>\n <dd>{formatModified(header.lastModifiedAtUtcIso)}</dd>\n <dt>Operations</dt>\n <dd data-testid=\"operation-count\">\n {operations}\n {revisions.length > 0 &&\n ` (${revisions.map(([scope, count]) => `${scope} ${count}`).join(\", \")})`}\n </dd>\n </dl>\n <p className=\"mb-2 text-core-muted\">\n No editor is installed for this document type; its state is shown\n read-only.\n </p>\n <div aria-label=\"Document state\" className=\"-ml-4\">\n {scopes.map((scope) => (\n <JsonNode key={scope} name={scope} value={state[scope]} open />\n ))}\n </div>\n </div>\n );\n}\n","import type { EditorProps } from \"@powerhousedao/shared/document-model\";\nimport type { ErrorInfo, ReactNode } from \"react\";\nimport { Component, Suspense } from \"react\";\n\n/** What core passes a document editor; drive apps get `DriveViewProps`. */\nexport type DocumentEditorProps = EditorProps & {\n documentId: string;\n context?: { readMode?: boolean; selectedTimelineRevision?: number };\n};\n\ntype BoundaryProps = {\n resetKeys: readonly unknown[];\n label: string;\n children: ReactNode;\n};\ntype BoundaryState = { error?: unknown; keys: readonly unknown[] };\n\nclass EditorErrorBoundary extends Component<BoundaryProps, BoundaryState> {\n override state: BoundaryState = { keys: this.props.resetKeys };\n\n static getDerivedStateFromError(error: unknown): Partial<BoundaryState> {\n return { error };\n }\n\n // A new document or drive gets a fresh try.\n static getDerivedStateFromProps(\n props: BoundaryProps,\n state: BoundaryState,\n ): Partial<BoundaryState> | null {\n const changed =\n props.resetKeys.length !== state.keys.length ||\n props.resetKeys.some((key, i) => !Object.is(key, state.keys[i]));\n return changed ? { error: undefined, keys: props.resetKeys } : null;\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo) {\n console.error(`[connect] ${this.props.label} failed:`, error, info);\n }\n\n override render() {\n const { error } = this.state;\n if (error === undefined) return this.props.children;\n return (\n <div role=\"alert\" className=\"p-6 text-core-fg\">\n <h2 className=\"font-semibold\">The {this.props.label} failed</h2>\n <pre className=\"mt-2 overflow-x-auto text-sm text-core-muted\">\n {error instanceof Error ? error.message : JSON.stringify(error)}\n </pre>\n </div>\n );\n }\n}\n\nexport type EditorHostProps = {\n /** A change shows the editor again after an error. */\n resetKeys?: readonly unknown[];\n /** Names what failed, e.g. \"editor\" or \"drive app\". */\n label?: string;\n children: ReactNode;\n};\n\n/** Hosts a drive app or an editor: it loads in Suspense, and an error stays inside. */\nexport function EditorHost({\n resetKeys = [],\n label = \"editor\",\n children,\n}: EditorHostProps) {\n return (\n <EditorErrorBoundary resetKeys={resetKeys} label={label}>\n <Suspense\n name=\"EditorHost\"\n fallback={\n <p role=\"status\" className=\"p-6 text-core-muted\">\n Loading {label}…\n </p>\n }\n >\n {children}\n </Suspense>\n </EditorErrorBoundary>\n );\n}\n","import {\n DriveProvider,\n EditorDocumentProvider,\n useAppModuleById,\n useDispatch,\n useDocument,\n useEditorModuleFor,\n useRevisionHistoryVisible,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PHDocument } from \"@powerhousedao/shared/document-model\";\nimport { Outlet } from \"@tanstack/react-router\";\nimport { useMemo } from \"react\";\nimport { useDriveRouteData } from \"../router/route-data.js\";\nimport { DirectoryListing } from \"./directory-listing.js\";\nimport { DocumentHistory } from \"./document-history.js\";\nimport { DocumentJson } from \"./document-json.js\";\nimport { EditorHost } from \"./editor-host.js\";\n\n/** `document`: its revision history while `?history` is set, else its\n * editor (given `document` and `dispatch`), else its JSON. */\nexport function DocumentView({ document }: { document: PHDocument }) {\n const [, dispatch] = useDispatch(document);\n const editor = useEditorModuleFor(document);\n const historyVisible = useRevisionHistoryVisible();\n if (historyVisible) return <DocumentHistory document={document} />;\n if (!editor) return <DocumentJson document={document} />;\n const Editor = editor.Component;\n return (\n <div\n className=\"relative h-full\"\n data-editor={editor.config.id}\n data-document-type={document.header.documentType}\n >\n <EditorDocumentProvider document={document} dispatch={dispatch}>\n <Editor\n documentId={document.header.id}\n document={document}\n dispatch={dispatch}\n context={{ readMode: false }}\n />\n </EditorDocumentProvider>\n </div>\n );\n}\n\nfunction OpenDocument({ documentId }: { documentId: string }) {\n const document = useDocument(documentId);\n return document ? <DocumentView document={document} /> : null;\n}\n\n/** The drive layout: the drive app its `preferredEditor` names (given the\n * drive as `document`), else the directory listing, around the node route. */\nexport function DriveLayout() {\n const { drive, folder, documentId } = useDriveRouteData();\n const app = useAppModuleById(drive?.header.meta?.preferredEditor);\n const [, dispatch] = useDispatch(drive);\n const nodeId = documentId ?? folder?.id;\n const context = useMemo(\n () => drive && { drive, dispatch, folder, nodeId },\n [drive, dispatch, folder, nodeId],\n );\n if (!drive || !context) return null;\n const App = app?.Component;\n // Drive apps show their own view until they get a document to show.\n const document = documentId ? <Outlet /> : null;\n return (\n <DriveProvider value={context}>\n <EditorHost\n resetKeys={[drive.header.id]}\n label={App ? \"drive app\" : \"drive view\"}\n >\n {App ? (\n <App document={drive} dispatch={dispatch}>\n {document}\n </App>\n ) : (\n <DirectoryListing drive={drive} folder={folder}>\n {document}\n </DirectoryListing>\n )}\n </EditorHost>\n </DriveProvider>\n );\n}\n\n/** The node route: the open document, or nothing on a folder or the drive's root. */\nexport function NodeView() {\n const { documentId } = useDriveRouteData();\n if (!documentId) return null;\n return (\n <EditorHost resetKeys={[documentId]} label=\"editor\">\n <OpenDocument documentId={documentId} />\n </EditorHost>\n );\n}\n","import {\n getDriveName,\n makeDriveSlug,\n preloadDrive,\n useAppModuleById,\n useDrives,\n useLinkProps,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport {\n formatModified,\n IndexRow,\n IndexTable,\n linkClass,\n} from \"./index-table.js\";\n\nfunction DriveRow({ drive }: { drive: DocumentDriveDocument }) {\n const app = useAppModuleById(drive.header.meta?.preferredEditor);\n const link = useLinkProps({ driveSlug: makeDriveSlug(drive) });\n return (\n <IndexRow\n name={\n <a\n {...link}\n className={linkClass}\n onMouseEnter={() => {\n link.onMouseEnter();\n preloadDrive(drive);\n }}\n >\n {getDriveName(drive)}/\n </a>\n }\n type={app?.config.name ?? \"Drive\"}\n modified={formatModified(drive.header.lastModifiedAtUtcIso)}\n />\n );\n}\n\n/** Core's home: an index of the drives. */\nexport function DriveIndex() {\n const drives = useDrives();\n // Empty until the reactor lists its drives, e.g. in the prerendered shell.\n if (!drives) return null;\n return (\n <IndexTable title=\"Index of /\" label=\"Drives\">\n {drives.map((drive) => (\n <DriveRow key={drive.header.id} drive={drive} />\n ))}\n {!drives.length && (\n <tr>\n <td colSpan={3} className=\"py-2 text-core-muted\">\n No drives yet.\n </td>\n </tr>\n )}\n </IndexTable>\n );\n}\n","import {\n logout,\n openRenown,\n useBackendAuth,\n useUser,\n} from \"@powerhousedao/reactor-browser\";\nimport type { BackendAuthGateMode } from \"../runtime/backend-auth-gate.js\";\n\n// The decision lives with the runtime, so a root view outside this chunk\n// (Connect's own) can take it without loading every core view.\nexport { useBackendAuthGate } from \"../runtime/backend-auth-gate.js\";\nexport type { BackendAuthGateMode } from \"../runtime/backend-auth-gate.js\";\n\n/**\n * Full-page gate rendered by the root view in place of the routes when the\n * backend refused the caller. Signing in goes through Renown's redirect, so\n * the page comes back with the user and boots again as them.\n */\nexport function BackendAuthGate({\n mode,\n}: {\n mode: Exclude<BackendAuthGateMode, null>;\n}) {\n const user = useUser();\n const refusal = useBackendAuth();\n const where = refusal?.backend ? ` (${refusal.backend})` : \"\";\n return (\n <div\n role=\"dialog\"\n aria-labelledby=\"backend-auth-gate-title\"\n className=\"flex h-full min-h-[60vh] items-center justify-center p-6\"\n >\n <div className=\"flex w-full max-w-md flex-col gap-4 rounded-lg border border-core-border bg-core-bg p-6 text-core-fg\">\n {mode === \"login\" ? (\n <>\n <h1 id=\"backend-auth-gate-title\" className=\"text-lg font-semibold\">\n Sign in to continue\n </h1>\n <p className=\"text-sm text-core-muted\">\n This server{where} only answers signed-in users. Sign in with\n Renown to open it.\n </p>\n <button\n type=\"button\"\n className=\"self-start rounded border border-core-border px-3 py-1 hover:bg-core-hover\"\n onClick={() => openRenown()}\n >\n Sign in with Renown\n </button>\n </>\n ) : (\n <>\n <h1 id=\"backend-auth-gate-title\" className=\"text-lg font-semibold\">\n This account is not allowed here\n </h1>\n <p className=\"text-sm text-core-muted\">\n You are signed in as{\" \"}\n <code className=\"break-all\">{user?.address}</code>, but this\n server{where} does not accept that account. Ask its admin for\n access, or switch to another account.\n </p>\n <button\n type=\"button\"\n className=\"self-start rounded border border-core-border px-3 py-1 hover:bg-core-hover\"\n onClick={() => {\n void logout().then(() => openRenown());\n }}\n >\n Switch account\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useTheme } from \"@powerhousedao/reactor-browser\";\n\n/** Flips between light and dark; the first flip pins the system theme's opposite. */\nexport function ThemeToggle({ className }: { className?: string }) {\n const { theme, setTheme } = useTheme();\n const next = theme === \"dark\" ? \"light\" : \"dark\";\n return (\n <button\n type=\"button\"\n aria-label={`Switch to ${next} theme`}\n title={`Switch to ${next} theme`}\n className={\n className ??\n \"rounded px-2 py-1 text-core-muted hover:bg-core-hover hover:text-core-fg\"\n }\n onClick={() => setTheme(next)}\n >\n {theme === \"dark\" ? \"☾\" : \"☀\"}\n </button>\n );\n}\n","// Core's modals: the ones editors, drive apps and the reactor open, in core's plain style.\nimport {\n addDocument,\n closePHModal,\n deleteNode,\n exportFile,\n getDocumentUpgradePreview,\n getDriveName,\n getNodeTarget,\n logout,\n openRenown,\n openTarget,\n setSelectedNode,\n showPHModal,\n upgradeDocument,\n useDocumentById,\n useDocumentModelModuleById,\n useModelRegistry,\n useNodeById,\n useNodeParentFolderById,\n usePHModal,\n useRenownAuth,\n useRenownLoginMethods,\n useUser,\n validateDocument,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PHModal } from \"@powerhousedao/reactor-browser\";\nimport type { ReactNode } from \"react\";\nimport { createElement, useEffect, useId, useState } from \"react\";\nimport type { ModalFrameProps } from \"../router/modal-frame.js\";\nimport { ModalDialog, useModalFrame } from \"../router/modal-frame.js\";\nimport { useCreateDocumentTarget } from \"../router/create-target.js\";\nimport { useDriveRouteData } from \"../router/route-data.js\";\n\nconst buttonClass =\n \"rounded border border-core-border px-3 py-1 text-sm hover:bg-core-hover disabled:opacity-50\";\nconst primaryClass = `${buttonClass} font-semibold`;\n\n/** Core's modal frame: title, content, and the buttons on the right. */\nfunction CoreModalFrame({\n title,\n titleId,\n actions,\n children,\n}: ModalFrameProps) {\n return (\n <ModalDialog\n labelledBy={titleId}\n className=\"m-auto w-96 max-w-[calc(100vw-2rem)] rounded border border-core-border bg-core-bg p-5 text-core-fg backdrop:bg-black/30\"\n >\n <h2 id={titleId} className=\"mb-3 text-lg font-semibold\">\n {title}\n </h2>\n <div className=\"flex flex-col gap-2 text-sm\">{children}</div>\n <div className=\"mt-4 flex justify-end gap-2\">{actions}</div>\n </ModalDialog>\n );\n}\n\n/** A modal in the routes' frame, else core's. */\nfunction Dialog(props: {\n title: string;\n children: ReactNode;\n actions?: ReactNode;\n}) {\n const Frame = useModalFrame() ?? CoreModalFrame;\n const titleId = useId();\n const actions = props.actions ?? (\n <button type=\"button\" className={buttonClass} onClick={closePHModal}>\n Close\n </button>\n );\n // A registered frame, not one made here.\n return createElement(Frame, {\n title: props.title,\n titleId,\n actions,\n children: props.children,\n });\n}\n\nconst Cancel = () => (\n <button type=\"button\" className={buttonClass} onClick={closePHModal}>\n Cancel\n </button>\n);\n\nfunction useModal<T extends PHModal[\"type\"]>(type: T) {\n const modal = usePHModal();\n return modal?.type === type\n ? (modal as Extract<PHModal, { type: T }>)\n : undefined;\n}\n\n/** A new document of the modal's type: in its `driveId`, else the open drive\n * and folder, else a drive picked here. */\nexport function CreateDocumentModal() {\n const modal = useModal(\"createDocument\");\n const module = useDocumentModelModuleById(\n modal?.documentType,\n modal?.documentModelVersion,\n );\n const { folder } = useDriveRouteData();\n const target = useCreateDocumentTarget(modal?.driveId);\n const { drive } = target;\n const [name, setName] = useState(\"\");\n const typeName = module?.documentModel.global.name ?? modal?.documentType;\n const create = async () => {\n if (!drive || !module || !modal) return;\n closePHModal();\n const node = await addDocument(\n drive.header.id,\n name.trim() || `New ${typeName}`,\n module.documentModel.global.id,\n target.isOpenDrive ? folder?.id : undefined,\n undefined,\n undefined,\n undefined,\n modal.documentModelVersion,\n );\n // Opens it in its drive, wherever the modal was opened.\n openTarget(getNodeTarget(node, drive));\n };\n return (\n <Dialog\n title={`New ${typeName ?? \"document\"}`}\n actions={\n <>\n <Cancel />\n <button\n type=\"submit\"\n form=\"create-document\"\n className={primaryClass}\n disabled={!drive || !module}\n >\n Create\n </button>\n </>\n }\n >\n <form\n id=\"create-document\"\n className=\"flex flex-col gap-2\"\n onSubmit={(event) => {\n event.preventDefault();\n void create();\n }}\n >\n <label className=\"flex flex-col gap-1\">\n Name\n <input\n autoFocus\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder={`New ${typeName}`}\n className=\"rounded border border-core-border bg-core-bg px-2 py-1\"\n />\n </label>\n {!!target.choices?.length && (\n <label className=\"flex flex-col gap-1\">\n Drive\n <select\n value={drive?.header.id ?? \"\"}\n onChange={(event) => target.pick(event.target.value)}\n className=\"rounded border border-core-border bg-core-bg px-2 py-1\"\n >\n {!drive && <option value=\"\">Choose a drive</option>}\n {target.choices.map((choice) => (\n <option key={choice.header.id} value={choice.header.id}>\n {getDriveName(choice)}\n </option>\n ))}\n </select>\n </label>\n )}\n </form>\n {target.choices?.length === 0 && (\n <p className=\"text-core-muted\">\n There's no drive to create it in.{\" \"}\n <button\n type=\"button\"\n className=\"underline\"\n onClick={() => showPHModal({ type: \"addDrive\" })}\n >\n Add a drive\n </button>\n </p>\n )}\n </Dialog>\n );\n}\n\n/** Signs in with Renown: the configured methods, else its portal. */\nexport function LoginModal() {\n const user = useUser();\n const methods = useRenownLoginMethods();\n const { login, pending, error } = useRenownAuth();\n useEffect(() => {\n if (user) closePHModal();\n }, [user]);\n return (\n <Dialog title=\"Log in\">\n {methods.length ? (\n methods.map((method) => (\n <button\n key={method.id}\n type=\"button\"\n className={buttonClass}\n disabled={pending}\n onClick={() => {\n closePHModal();\n login(undefined, method.id);\n }}\n >\n {method.label}\n </button>\n ))\n ) : (\n <button\n type=\"button\"\n className={primaryClass}\n onClick={() => openRenown()}\n >\n Continue with Renown\n </button>\n )}\n {error && <p className=\"text-core-muted\">{error.message}</p>}\n </Dialog>\n );\n}\n\n/** Deletes a file or folder, then opens its parent. */\nexport function DeleteItemModal() {\n const modal = useModal(\"deleteItem\");\n const node = useNodeById(modal?.id);\n const parent = useNodeParentFolderById(modal?.id);\n const { drive } = useDriveRouteData();\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<string>();\n const remove = async () => {\n if (!drive || !modal) return;\n setPending(true);\n setError(undefined);\n try {\n await deleteNode(drive.header.id, modal.id);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n setPending(false);\n return;\n }\n closePHModal();\n setSelectedNode(parent);\n };\n return (\n <Dialog\n title={`Delete ${node?.name ?? \"item\"}?`}\n actions={\n <>\n <Cancel />\n <button\n type=\"button\"\n className={primaryClass}\n disabled={pending}\n onClick={() => void remove()}\n >\n {pending ? \"Deleting…\" : \"Delete\"}\n </button>\n </>\n }\n >\n <p>\n {node?.kind === \"folder\"\n ? \"The folder and everything in it will be deleted.\"\n : \"The document will be deleted.\"}\n </p>\n {error && <p className=\"text-core-muted\">{error}</p>}\n </Dialog>\n );\n}\n\n/** Upgrades a document to its model's latest version. */\nexport function ConfirmDocumentUpgradeModal() {\n const modal = useModal(\"confirmDocumentUpgrade\");\n const [document] = useDocumentById(modal?.documentId);\n const registry = useModelRegistry();\n const preview = document\n ? getDocumentUpgradePreview(document, registry)\n : undefined;\n if (!document || !preview) return null;\n const upgrade = () => {\n closePHModal();\n upgradeDocument(document.header.id).catch((error: unknown) => {\n console.error(\"[connect] the document upgrade failed:\", error);\n });\n };\n return (\n <Dialog\n title=\"Update document\"\n actions={\n <>\n <Cancel />\n <button type=\"button\" className={primaryClass} onClick={upgrade}>\n Update document\n </button>\n </>\n }\n >\n <p>\n From version {preview.fromVersion} to {preview.toVersion}. Existing\n content is migrated; this can't be undone.\n </p>\n {preview.steps\n .filter((step) => step.description)\n .map((step) => (\n <p key={step.toVersion}>\n v{step.toVersion}: {step.description}\n </p>\n ))}\n </Dialog>\n );\n}\n\n/** Exports a document that has validation errors, after listing them. */\nexport function DownloadDocumentWithErrorsModal() {\n const modal = useModal(\"downloadDocumentWithErrors\");\n const [document] = useDocumentById(modal?.documentId);\n if (!document) return null;\n const errors = validateDocument(document);\n const download = () => {\n closePHModal();\n exportFile(document).catch((error: unknown) => {\n console.error(\"[connect] the export failed:\", error);\n });\n };\n return (\n <Dialog\n title=\"The document has errors\"\n actions={\n <>\n <Cancel />\n <button type=\"button\" className={primaryClass} onClick={download}>\n Export anyway\n </button>\n </>\n }\n >\n <ul className=\"list-disc pl-5 text-core-muted\">\n {errors.map((error, index) => (\n <li key={index}>{error.message}</li>\n ))}\n </ul>\n </Dialog>\n );\n}\n\n/** A document whose model version no installed package provides. */\nexport function DocumentVersionUnsupportedModal() {\n const modal = useModal(\"documentVersionUnsupported\");\n if (!modal) return null;\n const { documentType, requiredVersion, availableVersions } = modal;\n return (\n <Dialog\n title=\"Document version not supported\"\n actions={\n <>\n <Cancel />\n <button\n type=\"button\"\n className={primaryClass}\n onClick={() => {\n closePHModal();\n openTarget({ settings: \"packages\" });\n }}\n >\n Show packages\n </button>\n </>\n }\n >\n <p>\n This document needs version {requiredVersion} of \"{documentType}\"; the\n installed packages provide {availableVersions.join(\", \")}.\n </p>\n </Dialog>\n );\n}\n\n/** A protected drive that couldn't be added: sign in, or as someone else. */\nexport function DriveAuthRequiredModal() {\n const user = useUser();\n return (\n <Dialog\n title={user ? \"No access to this drive\" : \"Log in to access this drive\"}\n actions={\n <>\n <Cancel />\n {user ? (\n <button\n type=\"button\"\n className={primaryClass}\n onClick={() => {\n closePHModal();\n void logout();\n }}\n >\n Log out\n </button>\n ) : (\n <button\n type=\"button\"\n className={primaryClass}\n onClick={() => showPHModal({ type: \"login\" })}\n >\n Log in\n </button>\n )}\n </>\n }\n >\n <p>\n {user\n ? \"The account you're signed in with can't open this drive.\"\n : \"This drive is only open to signed-in users.\"}\n </p>\n </Dialog>\n );\n}\n","import {\n initTheme,\n useLinkProps,\n useTheme,\n} from \"@powerhousedao/reactor-browser\";\nimport { HeadContent, Link, Outlet, useRouter } from \"@tanstack/react-router\";\nimport { Suspense } from \"react\";\nimport type { ConnectModals } from \"../router/modals.js\";\nimport { CORE_MODAL_VIEWS, ModalOutlet } from \"../router/modals.js\";\nimport { ContentOutlet } from \"../router/route-components.js\";\nimport { useNavRoutes, useSidebarMode } from \"../router/sidebar.js\";\nimport { appTitle } from \"../router/titles.js\";\nimport { useIsEmbedded } from \"../runtime/embedded.js\";\nimport { ThemeToggle } from \"./theme-toggle.js\";\nimport { linkClass } from \"./index-table.js\";\nimport * as modalViews from \"./modals.js\";\nimport { BackendAuthGate, useBackendAuthGate } from \"./backend-auth-gate.js\";\n\n// The layout shares the modals' chunk, so it renders them directly.\nconst coreModals: ConnectModals = Object.fromEntries(\n Object.entries(CORE_MODAL_VIEWS).map(([type, name]) => [\n type,\n modalViews[name],\n ]),\n);\n\n/** Core's root: the page, in the theme. When the app's backend refused the\n * caller, the sign-in gate stands in for every route, so a shell that\n * replaces core's layout still gets it. */\nexport function CoreRoot() {\n initTheme();\n useTheme();\n const gate = useBackendAuthGate();\n return (\n <div className=\"h-screen overflow-auto bg-core-bg text-core-fg\">\n {/* The matched routes' head: the document title. */}\n <HeadContent />\n <Suspense name=\"CoreRoot\">\n {gate ? <BackendAuthGate mode={gate} /> : <Outlet />}\n </Suspense>\n <ModalOutlet modals={coreModals} />\n </div>\n );\n}\n\n/** Core's header: home, the `staticData.nav` routes, settings and the theme. */\nexport function CoreHeader() {\n const appName = useRouter().options.context.appName;\n const home = useLinkProps(undefined);\n const settings = useLinkProps({ settings: true });\n const navRoutes = useNavRoutes();\n return (\n <header className=\"flex items-center gap-4 border-b border-core-border px-4 py-2 text-sm\">\n <a {...home} className=\"font-semibold text-core-fg\">\n {appTitle(appName)}\n </a>\n <nav aria-label=\"Pages\" className=\"flex gap-3\">\n {navRoutes.map((item) => (\n // `to` is a plain string: the routes are only known at runtime.\n <Link key={item.routeId} to={item.to as never} className={linkClass}>\n {item.label}\n </Link>\n ))}\n </nav>\n <div className=\"ml-auto flex items-center gap-2\">\n <a {...settings} className={linkClass}>\n Settings\n </a>\n <ThemeToggle />\n </div>\n </header>\n );\n}\n\n/** Core's `_app` layout: the header above the matched route. Embedded mode\n * and `staticData.sidebar: \"hidden\"` drop the header. */\nexport function CoreLayout() {\n const isEmbedded = useIsEmbedded();\n const hidden = useSidebarMode() === \"hidden\";\n return (\n <div className=\"flex h-full flex-col\">\n {!isEmbedded && !hidden && <CoreHeader />}\n <main className=\"relative min-h-0 flex-1\">\n <ContentOutlet />\n </main>\n </div>\n );\n}\n","import { useLinkProps } from \"@powerhousedao/reactor-browser\";\nimport { useRouterState } from \"@tanstack/react-router\";\n\n/** The 404 page: what was asked for, and a way home. */\nexport function NotFoundPage({ driveSlug }: { driveSlug?: string }) {\n const pathname = useRouterState({ select: (s) => s.location.pathname });\n const home = useLinkProps(undefined);\n return (\n <div\n role=\"alert\"\n className=\"flex size-full flex-col items-center justify-center gap-3 p-6 text-center\"\n >\n <h1 className=\"text-2xl font-semibold text-core-fg\">\n {driveSlug ? `Drive ${driveSlug} not found` : \"Page not found\"}\n </h1>\n <p className=\"text-core-muted\">\n Nothing is at{\" \"}\n <code data-testid=\"not-found-path\" className=\"text-core-fg\">\n {pathname}\n </code>\n .\n </p>\n <a {...home} className=\"text-core-fg underline\">\n Go to the home page\n </a>\n </div>\n );\n}\n\nexport function DriveNotFoundPage({ driveSlug }: { driveSlug: string }) {\n return <NotFoundPage driveSlug={driveSlug} />;\n}\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\n\n/** A route's loader or render error. */\nexport function CoreRouteError({ error, reset }: ErrorComponentProps) {\n return (\n <div role=\"alert\" className=\"flex flex-col gap-2 p-6 text-core-fg\">\n <h1 className=\"text-lg font-semibold\">Something went wrong</h1>\n <pre className=\"overflow-x-auto text-sm text-core-muted\">\n {error instanceof Error ? error.message : JSON.stringify(error)}\n </pre>\n <button\n type=\"button\"\n className=\"self-start rounded border border-core-border px-3 py-1 hover:bg-core-hover\"\n onClick={reset}\n >\n Try again\n </button>\n </div>\n );\n}\n","import {\n useLinkProps,\n usePHNavigation,\n useTheme,\n} from \"@powerhousedao/reactor-browser\";\nimport { Outlet } from \"@tanstack/react-router\";\nimport { Suspense } from \"react\";\nimport type { SettingsTabEntry } from \"../router/settings.js\";\nimport { useSettingsTabs } from \"../router/settings.js\";\n\nfunction TabLink({ tab }: { tab: SettingsTabEntry }) {\n const link = useLinkProps({ settings: tab.id });\n const current = link[\"aria-current\"] === \"page\";\n const Icon = tab.icon;\n return (\n <a\n {...link}\n className={[\n \"flex items-center gap-2 rounded px-3 py-1.5\",\n current ? \"bg-core-hover font-semibold\" : \"hover:bg-core-hover\",\n tab.destructive ? \"text-core-danger\" : \"text-core-fg\",\n ].join(\" \")}\n >\n {Icon && <Icon size={16} />}\n {tab.label}\n </a>\n );\n}\n\n/** Core's settings page: the tabs from `staticData.settings` beside the open one. */\nexport function CoreSettingsPage() {\n const tabs = useSettingsTabs();\n const navigation = usePHNavigation();\n // Back to where settings was opened from, else home.\n const close = () => {\n if (navigation.closeOpened?.()) return;\n navigation.open(undefined, { replace: true });\n };\n return (\n <div className=\"flex h-full flex-col text-core-fg\">\n <div className=\"flex items-center justify-between border-b border-core-border px-4 py-3\">\n <h1 className=\"text-lg font-semibold\">Settings</h1>\n <button\n type=\"button\"\n className=\"rounded px-2 text-core-muted hover:bg-core-hover\"\n onClick={close}\n >\n Close\n </button>\n </div>\n <div className=\"flex min-h-0 flex-1\">\n <nav aria-label=\"Settings\" className=\"w-48 shrink-0 p-3\">\n <ul className=\"flex flex-col gap-1\">\n {tabs.map((tab) => (\n <li key={tab.id}>\n <TabLink tab={tab} />\n </li>\n ))}\n </ul>\n </nav>\n <section className=\"min-w-0 flex-1 overflow-auto p-6\">\n <Suspense name=\"SettingsTab\">\n <Outlet />\n </Suspense>\n </section>\n </div>\n </div>\n );\n}\n\nconst THEMES = [\n { value: \"light\", label: \"Light\" },\n { value: \"dark\", label: \"Dark\" },\n { value: \"system\", label: \"System\" },\n] as const;\n\n/** Core's Appearance tab: light, dark, or the system's. */\nexport function AppearanceTab() {\n const { theme, isSystem, setTheme } = useTheme();\n const selected = isSystem ? \"system\" : theme;\n return (\n <fieldset className=\"flex flex-col gap-2\">\n <legend className=\"mb-2 font-semibold\">Theme</legend>\n {THEMES.map((option) => (\n <label key={option.value} className=\"flex items-center gap-2\">\n <input\n type=\"radio\"\n name=\"theme\"\n value={option.value}\n checked={selected === option.value}\n onChange={() => setTheme(option.value)}\n />\n {option.label}\n </label>\n ))}\n </fieldset>\n );\n}\n","import {\n DRIVE_DOCUMENT_TYPES,\n useVetraPackageManager,\n useVetraPackages,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n DocumentModelLib,\n EditorModule,\n} from \"@powerhousedao/shared/document-model\";\nimport type { ReactNode } from \"react\";\n\nconst SOURCE_LABELS: Record<string, string> = {\n common: \"built-in\",\n project: \"project\",\n \"local-install\": \"local\",\n \"registry-install\": \"registry\",\n};\n\nconst isDriveApp = (editor: EditorModule) =>\n editor.documentTypes.some((type) =>\n (DRIVE_DOCUMENT_TYPES as readonly string[]).includes(type),\n );\n\n/** A package's document models by type, with every version it ships. */\nfunction modelsOf(pkg: DocumentModelLib) {\n const byType = new Map<string, { name: string; versions: number[] }>();\n for (const model of pkg.documentModels) {\n const { id, name } = model.documentModel.global;\n const entry = byType.get(id) ?? { name, versions: [] };\n entry.versions.push(model.version ?? 1);\n byType.set(id, entry);\n }\n return [...byType].map(([type, { name, versions }]) => ({\n type,\n name,\n versions: versions.sort((a, b) => a - b),\n }));\n}\n\nfunction Section(props: { title: string; children: ReactNode }) {\n return (\n <div className=\"mt-3\">\n <h3 className=\"mb-1 text-xs font-semibold tracking-wide text-core-muted uppercase\">\n {props.title}\n </h3>\n {props.children}\n </div>\n );\n}\n\nconst cell = \"py-1 pr-4 align-top break-words\";\n\nfunction EditorTable(props: { label: string; editors: EditorModule[] }) {\n return (\n <table\n aria-label={props.label}\n className=\"w-full table-fixed border-collapse text-sm\"\n >\n <tbody>\n {props.editors.map((editor) => (\n <tr key={editor.config.id} className=\"border-t border-core-border/50\">\n <td className={`${cell} w-1/3`}>{editor.config.name}</td>\n <td className={`${cell} w-1/3 font-mono text-core-muted`}>\n {editor.config.id}\n </td>\n <td className={`${cell} font-mono`}>\n {editor.documentTypes.join(\", \")}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nfunction PackageEntry({ pkg }: { pkg: DocumentModelLib }) {\n const manager = useVetraPackageManager();\n const name = pkg.manifest.name;\n const version = manager?.getPackageVersion(name);\n const source = manager?.getPackageSource(name);\n const models = modelsOf(pkg);\n const apps = pkg.editors.filter(isDriveApp);\n const editors = pkg.editors.filter((editor) => !isDriveApp(editor));\n return (\n <li\n aria-label={name}\n className=\"rounded border border-core-border px-4 py-3\"\n >\n <div className=\"flex flex-wrap items-baseline gap-x-3\">\n <h2 className=\"font-semibold\">{name}</h2>\n {version && (\n <span className=\"font-mono text-sm text-core-muted\">{version}</span>\n )}\n {source && (\n <span className=\"rounded border border-core-border px-1.5 text-xs text-core-muted\">\n {SOURCE_LABELS[source] ?? source}\n </span>\n )}\n </div>\n {models.length > 0 && (\n <Section title=\"Document models\">\n <table\n aria-label={`${name} document models`}\n className=\"w-full table-fixed border-collapse text-sm\"\n >\n <tbody>\n {models.map((model) => (\n <tr key={model.type} className=\"border-t border-core-border/50\">\n <td className={`${cell} w-1/3`}>{model.name}</td>\n <td className={`${cell} w-1/3 font-mono`}>{model.type}</td>\n <td className={`${cell} text-core-muted`}>\n {model.versions.map((v) => `v${v}`).join(\", \")}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </Section>\n )}\n {editors.length > 0 && (\n <Section title=\"Editors\">\n <EditorTable label={`${name} editors`} editors={editors} />\n </Section>\n )}\n {apps.length > 0 && (\n <Section title=\"Drive apps\">\n <EditorTable label={`${name} drive apps`} editors={apps} />\n </Section>\n )}\n </li>\n );\n}\n\n/** Core's Packages tab: the loaded packages, their document models, editors and drive apps. */\nexport function PackagesTab() {\n const packages = useVetraPackages();\n return (\n <div className=\"w-full max-w-3xl\">\n {packages.length === 0 ? (\n <p className=\"text-core-muted\">No packages are loaded.</p>\n ) : (\n <ul aria-label=\"Packages\" className=\"flex flex-col gap-3\">\n {packages.map((pkg, index) => (\n <PackageEntry key={`${pkg.manifest.name}:${index}`} pkg={pkg} />\n ))}\n </ul>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA,SAAgB,eAAe,KAAyB;CACtD,IAAI,CAAC,KAAK,OAAO;CACjB,MAAM,OAAO,IAAI,KAAK,GAAG;CACzB,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG,OAAO;CACzC,OAAO,KAAK,YAAY,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,KAAK,GAAG;AACzD;;AAGA,SAAgB,WAAW,OAIxB;CACD,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,MAAD;GAAI,WAAU;GAA8B,UAAA,MAAM;EAAU,CAAA,GAC5D,qBAAC,SAAD;GAAO,cAAY,MAAM;GAAO,WAAU;GAA1C,UAAA,CACE,oBAAC,SAAD,EAAA,UACE,qBAAC,MAAD;IAAI,WAAU;IAAd,UAAA;KACE,oBAAC,MAAD;MAAI,WAAU;MAAwB,UAAA;KAAQ,CAAA;KAC9C,oBAAC,MAAD;MAAI,WAAU;MAAwB,UAAA;KAAQ,CAAA;KAC9C,oBAAC,MAAD;MAAI,WAAU;MAAmB,UAAA;KAAiB,CAAA;IAChD;GACC,CAAA,EAAA,CAAA,GACP,oBAAC,SAAD,EAAA,UAAQ,MAAM,SAAgB,CAAA,CACzB;EACJ,CAAA,CAAA;;AAET;AAEA,SAAgB,SAAS,OAItB;CACD,OACE,qBAAC,MAAD;EAAI,WAAU;EAAd,UAAA;GACE,oBAAC,MAAD;IAAI,WAAU;IAAa,UAAA,MAAM;GAAS,CAAA;GAC1C,oBAAC,MAAD;IAAI,WAAU;IAA6B,UAAA,MAAM;GAAS,CAAA;GAC1D,oBAAC,MAAD;IAAI,WAAU;IACX,UAAA,MAAM;GACL,CAAA;EACF;;AAER;AAEA,MAAa,YAAY;;;ACzBzB,SAAS,SAAS,OAIf;CACD,MAAM,OAAO,aAAa;EACxB,WAAW,cAAc,MAAM,KAAK;EACpC,UAAU,MAAM,OAAO,aAAa,MAAM,IAAI,IAAI,KAAA;CACpD,CAAC;CACD,OACE,oBAAC,KAAD;EAAG,GAAI;EAAM,WAAW;EACrB,UAAA,MAAM;CACN,CAAA;AAEP;AAEA,SAAS,SAAS,OAAgC;CAChD,MAAM,OAAO,aAAa,KAAA,CAAS;CACnC,OACE,oBAAC,KAAD;EAAG,GAAI;EAAM,WAAW;EACrB,UAAA,MAAM;CACN,CAAA;AAEP;AAGA,IAAM,QAAN,cAAoB,UAAwD;CAC1E,QAAiB,EAAE,QAAQ,MAAM;CACjC,OAAO,2BAA2B;EAChC,OAAO,EAAE,QAAQ,KAAK;CACxB;CACA,SAAkB;EAChB,OAAO,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM;CAC9C;AACF;AAEA,SAAS,iBAAiB,EAAE,MAAsB;CAChD,MAAM,CAAC,YAAY,gBAAgB,EAAE;CACrC,OAAO,eAAe,UAAU,OAAO,oBAAoB;AAC7D;;AAGA,SAAS,WAAW,OAAwB,QAAgC;CAC1E,MAAM,OAAe,CAAC;CACtB,KAAK,IAAI,OAAyB,QAAQ,OAAO;EAC/C,KAAK,QAAQ,IAAI;EACjB,MAAM,WAAsC,KAAK;EACjD,OAAO,WAAW,MAAM,MAAM,MAAM,EAAE,OAAO,QAAQ,IAAI,KAAA;CAC3D;CACA,OAAO;AACT;AAEA,MAAM,kBAAkB,GAAS,MAC/B,EAAE,SAAS,EAAE,OACT,EAAE,KAAK,cAAc,EAAE,IAAI,IAC3B,EAAE,SAAS,WACT,KACA;;AAGR,SAAgB,iBAAiB,EAAE,OAAO,QAAQ,YAA4B;CAC5E,IAAI,UAAU,OAAO;CACrB,OAAO,oBAAC,eAAD;EAAsB;EAAe;CAAS,CAAA;AACvD;AAEA,SAAS,cAAc,EACrB,OACA,UAIC;CACD,MAAM,QAAQ,cAAc,MAAM,OAAO,EAAE,KAAK,CAAC;CACjD,MAAM,OAAO,WAAW,OAAO,MAAM;CACrC,MAAM,SAAS,KAAK,GAAG,EAAE;CACzB,MAAM,UAAU,MACb,QAAQ,UAAU,KAAK,gBAAgB,WAAW,QAAQ,MAAM,KAAK,CAAC,CACtE,KAAK,cAAc;CACtB,MAAM,QACJ,qBAAA,YAAA,EAAA,UAAA;EAAE;EAEA,oBAAC,UAAD;GAAiB;GAAO,MAAM,KAAA;GAC3B,UAAA,aAAa,KAAK;EACX,CAAA;EAAC;EAEV,KAAK,KAAK,SACT,qBAAC,UAAD,EAAA,UAAA,CACE,oBAAC,UAAD;GAAiB;GAAa;GAC3B,UAAA,KAAK;EACE,CAAA,GAAC,GAEH,EAAA,GALK,KAAK,EAKV,CACX;CACD,EAAA,CAAA;CAEJ,OACE,qBAAC,YAAD;EAAmB;EAAO,OAAM;EAAhC,UAAA,CACE,oBAAC,UAAD;GACE,MACE,SACE,oBAAC,UAAD;IAAiB;IAAO,MAAM;IAAQ,UAAA;GAE5B,CAAA,IAEV,oBAAC,UAAD,EAAA,UAAU,mBAA0B,CAAA;GAGxC,MAAK;GACL,UAAS;EACV,CAAA,GACA,QAAQ,KAAK,SACZ,oBAAC,UAAD;GAEE,MACE,oBAAC,UAAD;IAAiB;IAAa;IAC3B,UAAA,KAAK,SAAS,WAAW,GAAG,KAAK,KAAK,KAAK,KAAK;GACzC,CAAA;GAEZ,MAAM,WAAW,IAAI,IAAI,KAAK,eAAe;GAC7C,UACE,KAAK,SAAS,WACZ,MAEA,oBAAC,OAAD,EAAA,UACE,oBAAC,UAAD;IAAU,UAAS;IACjB,UAAA,oBAAC,kBAAD,EAAkB,IAAI,KAAK,GAAK,CAAA;GACxB,CAAA,EACL,CAAA;EAGZ,GAlBM,KAAK,EAkBX,CACF,CACS;;AAEhB;;;ACnJA,MAAM,aAAa,GAAG,UAAU;;AAGhC,MAAa,oBAAoB;;AAGjC,SAAgB,iBAAiB,OAAe,MAAc;CAC5D,MAAM,MAAM,KAAK,IAAI,SAAS,OAAO,KAAA,IAAwB,CAAC;CAC9D,OAAO;EAAE,OAAO,KAAK,IAAI,MAAA,IAAyB,CAAC;EAAG;CAAI;AAC5D;AAQA,SAAS,aACP,YACA,OACA,OACA,KACA;CACA,MAAM,SAAS,iBAAiB;CAEhC,MAAM,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG;CAC/C,MAAM,CAAC,QAAQ,aAAa,SAA4C;CACxE,MAAM,QAAQ,CAAC,UAAU,OAAO;CAChC,gBAAgB;EACd,IAAI,OAAO;EACX,MAAM,aAAa,IAAI,gBAAgB;EACvC,MAAM,YAAY,UAAqB,UAAU;GAAE;GAAK;EAAM,CAAC;EAC/D,OACG,cACC,YACA,EAAE,QAAQ,CAAC,KAAK,EAAE,GAClB,EAAE,eAAe,MAAM,GACvB;GAAE,QAAQ;GAAI,OAAO,MAAM;EAAM,GACjC,WAAW,MACb,CAAC,CACA,MACE,SAAS;GACR,MAAM,aAAa,KAAK,QACrB,QAAQ,cAAc,UAAU,QAAQ,GAAG,CAAC,CAC5C,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;GACnC,SAAS;IAAE,QAAQ;IAAS;GAAW,CAAC;EAC1C,IACC,WAAoB;GACnB,IAAI,WAAW,OAAO,SAAS;GAC/B,SAAS;IACP,QAAQ;IACR,OAAO,kBAAkB,QAAQ,SAAS,IAAI,MAAM,OAAO,MAAM,CAAC;GACpE,CAAC;EACH,CACF;EACF,aAAa,WAAW,MAAM;CAChC,GAAG;EAAC;EAAQ;EAAO;EAAK;EAAY;EAAO;EAAO;CAAG,CAAC;CACtD,IAAI,OAAO,OAAO;EAAE,QAAQ;EAAS,YAAY,CAAC;CAAE;CACpD,OAAO,QAAQ,QAAQ,MAAM,OAAO,QAAS,EAAE,QAAQ,UAAU;AACnE;AAEA,SAAS,gBAAgB,OAKtB;CACD,MAAM,EAAE,OAAO,QAAQ,iBAAiB,MAAM,OAAO,MAAM,IAAI;CAC/D,MAAM,QAAQ,aAAa,MAAM,YAAY,MAAM,OAAO,OAAO,GAAG;CACpE,OACE,qBAAC,WAAD;EAAS,WAAU;EAAnB,UAAA,CACE,qBAAC,MAAD;GAAI,WAAU;GAAd,UAAA;IACG,MAAM;IAAO;IACd,oBAAC,QAAD;KAAM,WAAU;KACb,UAAA,MAAM,QACH,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,MAAM,GAAG,MAAM,MACpD,QAAQ,MAAM;IACd,CAAA;GACJ;EACH,CAAA,GAAA,MAAM,WAAW,UAChB,oBAAC,KAAD;GAAG,WAAU;GAAoB,UAAA,MAAM,MAAM;EAAW,CAAA,IACtD,MAAM,WAAW,YACnB,oBAAC,KAAD;GAAG,WAAU;GAAkB,UAAA;EAAW,CAAA,IACxC,MAAM,WAAW,WAAW,IAC9B,oBAAC,KAAD;GAAG,WAAU;GAAkB,UAAA;EAA8B,CAAA,IAE7D,qBAAC,SAAD;GACE,cAAY,GAAG,MAAM,MAAM;GAC3B,WAAU;GAFZ,UAAA,CAIE,oBAAC,SAAD,EAAA,UACE,qBAAC,MAAD;IAAI,WAAU;IAAd,UAAA;KACE,oBAAC,MAAD;MAAI,WAAU;MAAwB,UAAA;KAAS,CAAA;KAC/C,oBAAC,MAAD;MAAI,WAAU;MAAwB,UAAA;KAAU,CAAA;KAChD,oBAAC,MAAD;MAAI,WAAU;MAAmB,UAAA;KAAa,CAAA;IAC5C;GACC,CAAA,EAAA,CAAA,GACP,oBAAC,SAAD,EAAA,UACG,MAAM,WAAW,KAAK,cACrB,qBAAC,MAAD;IAEE,WAAU;IAFZ,UAAA;KAIE,oBAAC,MAAD;MAAI,WAAU;MAAa,UAAA,UAAU;KAAU,CAAA;KAC/C,oBAAC,MAAD;MAAI,WAAU;MAAa,UAAA,UAAU,OAAO;KAAS,CAAA;KACrD,oBAAC,MAAD;MAAI,WAAU;MACX,UAAA,eAAe,UAAU,cAAc;KACtC,CAAA;IACF;GARG,GAAA,UAAU,KAQb,CACL,EACI,CAAA,CACF;EAEF,CAAA,CAAA;;AAEb;;AAGA,SAAgB,gBAAgB,EAAE,YAA+B;CAC/D,MAAM,OAAO,uBAAuB;CACpC,MAAM,EAAE,WAAW;CACnB,MAAM,SAAS,OAAO,QAAQ,OAAO,QAAQ;CAC7C,MAAM,YAAY,KAAK,IACrB,GACA,GAAG,OAAO,KAAK,GAAG,WAAW,KAAK,KAAK,QAAA,EAAyB,CAAC,CACnE;CACA,MAAM,QACJ,qBAAC,OAAD;EAAK,cAAW;EAAgB,WAAU;EAA1C,UAAA;GACE,oBAAC,UAAD;IACE,MAAK;IACL,WAAW;IACX,UAAU,QAAQ;IAClB,eAAe,uBAAuB,OAAO,CAAC;IAC/C,UAAA;GAEO,CAAA;GACR,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA;KAAkC;KAC1B;KAAK;KAAK;IACZ;;GACN,oBAAC,UAAD;IACE,MAAK;IACL,WAAW;IACX,UAAU,QAAQ;IAClB,eAAe,uBAAuB,OAAO,CAAC;IAC/C,UAAA;GAEO,CAAA;EACL;;CAEP,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,qBAAC,MAAD;KAAI,WAAU;KAAd,UAAA,CAAsC,eACxB,OAAO,QAAQ,OAAO,EAChC;IACJ,CAAA,GAAA,oBAAC,UAAD;KACE,MAAK;KACL,WAAW;KACX,SAAS;KACV,UAAA;IAEO,CAAA,CACL;;GACL,oBAAC,OAAD;IAAK,WAAU;IAAQ,UAAA;GAAW,CAAA;GACjC,OAAO,WAAW,IACjB,oBAAC,KAAD;IAAG,WAAU;IAAkB,UAAA;GAAqB,CAAA,IAEpD,OAAO,KAAK,CAAC,OAAO,WAClB,oBAAC,iBAAD;IAEE,YAAY,OAAO;IACZ;IACA;IACD;GACP,GALM,KAKN,CACF;EAEA;;AAET;;;AC1LA,SAAS,KAAK,EAAE,SAA6B;CAC3C,IAAI,UAAU,MAAM,OAAO,oBAAC,QAAD;EAAM,WAAU;EAAkB,UAAA;CAAU,CAAA;CACvE,IAAI,OAAO,UAAU,UACnB,OAAO,oBAAC,QAAD;EAAM,WAAU;EAAoB,UAAA,KAAK,UAAU,KAAK;CAAQ,CAAA;CAEzE,OAAO,oBAAC,QAAD;EAAM,WAAU;EAAoB,UAAA,KAAK,UAAU,KAAK;CAAQ,CAAA;AACzE;AAEA,SAAS,SAAS,OAA4D;CAC5E,MAAM,EAAE,MAAM,UAAU;CACxB,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CAAmC,MAAK,IAAQ;EAChD,CAAA,GAAA,oBAAC,MAAD,EAAa,MAAQ,CAAA,CAClB;;CAGT,MAAM,UAAU,OAAO,QAAQ,KAAgC;CAE/D,MAAM,UADU,MAAM,QAAQ,KACR,IAAI,IAAI,QAAQ,OAAO,KAAK,IAAI,QAAQ,OAAO;CACrE,OACE,qBAAC,WAAD;EAAS,MAAM,MAAM;EAAM,WAAU;EAArC,UAAA,CACE,qBAAC,WAAD;GAAS,WAAU;GAAnB,UAAA,CACE,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CAAmC,MAAK,IAAQ;GAChD,CAAA,GAAA,oBAAC,QAAD;IAAM,WAAU;IAAmB,UAAA;GAAc,CAAA,CAC1C;EACR,CAAA,GAAA,QAAQ,KAAK,CAAC,KAAK,WAClB,oBAAC,UAAD;GAAoB,MAAM;GAAK,OAAO;EAAQ,GAA/B,GAA+B,CAC/C,CACM;;AAEb;;AAGA,SAAgB,aAAa,EAAE,YAA+B;CAC5D,MAAM,EAAE,WAAW;CACnB,MAAM,YAAY,OAAO,QAAQ,OAAO,QAAQ;CAChD,MAAM,aAAa,UAAU,QAAQ,KAAK,GAAG,WAAW,MAAM,OAAO,CAAC;CACtE,MAAM,QAAQ,SAAS;CACvB,MAAM,SAAS,CAAC,UAAU,OAAO,CAAC,CAAC,QAAQ,UAAU,SAAS,KAAK;CACnE,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,oBAAC,MAAD;IAAI,WAAU;IAA8B,UAAA,OAAO,QAAQ,OAAO;GAAO,CAAA;GACzE,qBAAC,MAAD;IAAI,WAAU;IAAd,UAAA;KACE,oBAAC,MAAD,EAAA,UAAI,OAAQ,CAAA;KACZ,oBAAC,MAAD,EAAA,UAAK,OAAO,aAAiB,CAAA;KAC7B,oBAAC,MAAD,EAAA,UAAI,KAAM,CAAA;KACV,oBAAC,MAAD,EAAA,UAAK,OAAO,GAAO,CAAA;KACnB,oBAAC,MAAD,EAAA,UAAI,gBAAiB,CAAA;KACrB,oBAAC,MAAD,EAAA,UAAK,eAAe,OAAO,oBAAoB,EAAM,CAAA;KACrD,oBAAC,MAAD,EAAA,UAAI,aAAc,CAAA;KAClB,qBAAC,MAAD;MAAI,eAAY;MAAhB,UAAA,CACG,YACA,UAAU,SAAS,KAClB,KAAK,UAAU,KAAK,CAAC,OAAO,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,EACvE;;IACF;;GACJ,oBAAC,KAAD;IAAG,WAAU;IAAuB,UAAA;GAGjC,CAAA;GACH,oBAAC,OAAD;IAAK,cAAW;IAAiB,WAAU;IACxC,UAAA,OAAO,KAAK,UACX,oBAAC,UAAD;KAAsB,MAAM;KAAO,OAAO,MAAM;KAAQ,MAAA;IAAM,GAA/C,KAA+C,CAC/D;GACE,CAAA;EACF;;AAET;;;ACxDA,IAAM,sBAAN,cAAkC,UAAwC;CACxE,QAAgC,EAAE,MAAM,KAAK,MAAM,UAAU;CAE7D,OAAO,yBAAyB,OAAwC;EACtE,OAAO,EAAE,MAAM;CACjB;CAGA,OAAO,yBACL,OACA,OAC+B;EAI/B,OAFE,MAAM,UAAU,WAAW,MAAM,KAAK,UACtC,MAAM,UAAU,MAAM,KAAK,MAAM,CAAC,OAAO,GAAG,KAAK,MAAM,KAAK,EAAE,CAAC,IAChD;GAAE,OAAO,KAAA;GAAW,MAAM,MAAM;EAAU,IAAI;CACjE;CAEA,kBAA2B,OAAgB,MAAiB;EAC1D,QAAQ,MAAM,aAAa,KAAK,MAAM,MAAM,WAAW,OAAO,IAAI;CACpE;CAEA,SAAkB;EAChB,MAAM,EAAE,UAAU,KAAK;EACvB,IAAI,UAAU,KAAA,GAAW,OAAO,KAAK,MAAM;EAC3C,OACE,qBAAC,OAAD;GAAK,MAAK;GAAQ,WAAU;GAA5B,UAAA,CACE,qBAAC,MAAD;IAAI,WAAU;IAAd,UAAA;KAA8B;KAAK,KAAK,MAAM;KAAM;IAAW;GAC/D,CAAA,GAAA,oBAAC,OAAD;IAAK,WAAU;IACZ,UAAA,iBAAiB,QAAQ,MAAM,UAAU,KAAK,UAAU,KAAK;GAC3D,CAAA,CACF;;CAET;AACF;;AAWA,SAAgB,WAAW,EACzB,YAAY,CAAC,GACb,QAAQ,UACR,YACkB;CAClB,OACE,oBAAC,qBAAD;EAAgC;EAAkB;EAChD,UAAA,oBAAC,UAAD;GACE,MAAK;GACL,UACE,qBAAC,KAAD;IAAG,MAAK;IAAS,WAAU;IAA3B,UAAA;KAAiD;KACtC;KAAM;IACd;;GAGJ;EACO,CAAA;CACS,CAAA;AAEzB;;;;;AC7DA,SAAgB,aAAa,EAAE,YAAsC;CACnE,MAAM,GAAG,YAAY,YAAY,QAAQ;CACzC,MAAM,SAAS,mBAAmB,QAAQ;CAE1C,IADuB,0BACN,GAAG,OAAO,oBAAC,iBAAD,EAA2B,SAAW,CAAA;CACjE,IAAI,CAAC,QAAQ,OAAO,oBAAC,cAAD,EAAwB,SAAW,CAAA;CACvD,MAAM,SAAS,OAAO;CACtB,OACE,oBAAC,OAAD;EACE,WAAU;EACV,eAAa,OAAO,OAAO;EAC3B,sBAAoB,SAAS,OAAO;EAEpC,UAAA,oBAAC,wBAAD;GAAkC;GAAoB;GACpD,UAAA,oBAAC,QAAD;IACE,YAAY,SAAS,OAAO;IAClB;IACA;IACV,SAAS,EAAE,UAAU,MAAM;GAC5B,CAAA;EACqB,CAAA;CACrB,CAAA;AAET;AAEA,SAAS,aAAa,EAAE,cAAsC;CAC5D,MAAM,WAAW,YAAY,UAAU;CACvC,OAAO,WAAW,oBAAC,cAAD,EAAwB,SAAW,CAAA,IAAI;AAC3D;;;AAIA,SAAgB,cAAc;CAC5B,MAAM,EAAE,OAAO,QAAQ,eAAe,kBAAkB;CACxD,MAAM,MAAM,iBAAiB,OAAO,OAAO,MAAM,eAAe;CAChE,MAAM,GAAG,YAAY,YAAY,KAAK;CACtC,MAAM,SAAS,cAAc,QAAQ;CACrC,MAAM,UAAU,cACR,SAAS;EAAE;EAAO;EAAU;EAAQ;CAAO,GACjD;EAAC;EAAO;EAAU;EAAQ;CAAM,CAClC;CACA,IAAI,CAAC,SAAS,CAAC,SAAS,OAAO;CAC/B,MAAM,MAAM,KAAK;CAEjB,MAAM,WAAW,aAAa,oBAAC,QAAD,CAAS,CAAA,IAAI;CAC3C,OACE,oBAAC,eAAD;EAAe,OAAO;EACpB,UAAA,oBAAC,YAAD;GACE,WAAW,CAAC,MAAM,OAAO,EAAE;GAC3B,OAAO,MAAM,cAAc;GAE1B,UAAA,MACC,oBAAC,KAAD;IAAK,UAAU;IAAiB;IAC7B,UAAA;GACE,CAAA,IAEL,oBAAC,kBAAD;IAAyB;IAAe;IACrC,UAAA;GACe,CAAA;EAEV,CAAA;CACC,CAAA;AAEnB;;AAGA,SAAgB,WAAW;CACzB,MAAM,EAAE,eAAe,kBAAkB;CACzC,IAAI,CAAC,YAAY,OAAO;CACxB,OACE,oBAAC,YAAD;EAAY,WAAW,CAAC,UAAU;EAAG,OAAM;EACzC,UAAA,oBAAC,cAAD,EAA0B,WAAa,CAAA;CAC7B,CAAA;AAEhB;;;AC9EA,SAAS,SAAS,EAAE,SAA2C;CAC7D,MAAM,MAAM,iBAAiB,MAAM,OAAO,MAAM,eAAe;CAC/D,MAAM,OAAO,aAAa,EAAE,WAAW,cAAc,KAAK,EAAE,CAAC;CAC7D,OACE,oBAAC,UAAD;EACE,MACE,qBAAC,KAAD;GACE,GAAI;GACJ,WAAW;GACX,oBAAoB;IAClB,KAAK,aAAa;IAClB,aAAa,KAAK;GACpB;GANF,UAAA,CAQG,aAAa,KAAK,GAAE,GACpB;;EAEL,MAAM,KAAK,OAAO,QAAQ;EAC1B,UAAU,eAAe,MAAM,OAAO,oBAAoB;CAC3D,CAAA;AAEL;;AAGA,SAAgB,aAAa;CAC3B,MAAM,SAAS,UAAU;CAEzB,IAAI,CAAC,QAAQ,OAAO;CACpB,OACE,qBAAC,YAAD;EAAY,OAAM;EAAa,OAAM;EAArC,UAAA,CACG,OAAO,KAAK,UACX,oBAAC,UAAD,EAAuC,MAAQ,GAAhC,MAAM,OAAO,EAAmB,CAChD,GACA,CAAC,OAAO,UACP,oBAAC,MAAD,EAAA,UACE,oBAAC,MAAD;GAAI,SAAS;GAAG,WAAU;GAAuB,UAAA;EAE7C,CAAA,EACF,CAAA,CAEI;;AAEhB;;;;;;;;ACxCA,SAAgB,gBAAgB,EAC9B,QAGC;CACD,MAAM,OAAO,QAAQ;CACrB,MAAM,UAAU,eAAe;CAC/B,MAAM,QAAQ,SAAS,UAAU,KAAK,QAAQ,QAAQ,KAAK;CAC3D,OACE,oBAAC,OAAD;EACE,MAAK;EACL,mBAAgB;EAChB,WAAU;EAEV,UAAA,oBAAC,OAAD;GAAK,WAAU;GACZ,UAAA,SAAS,UACR,qBAAA,YAAA,EAAA,UAAA;IACE,oBAAC,MAAD;KAAI,IAAG;KAA0B,WAAU;KAAwB,UAAA;IAE/D,CAAA;IACJ,qBAAC,KAAD;KAAG,WAAU;KAAb,UAAA;MAAuC;MACzB;MAAM;KAEjB;;IACH,oBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,eAAe,WAAW;KAC3B,UAAA;IAEO,CAAA;GACR,EAAA,CAAA,IAEF,qBAAA,YAAA,EAAA,UAAA;IACE,oBAAC,MAAD;KAAI,IAAG;KAA0B,WAAU;KAAwB,UAAA;IAE/D,CAAA;IACJ,qBAAC,KAAD;KAAG,WAAU;KAAb,UAAA;MAAuC;MAChB;MACrB,oBAAC,QAAD;OAAM,WAAU;OAAa,UAAA,MAAM;MAAc,CAAA;MAAC;MAC3C;MAAM;KAEZ;;IACH,oBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,eAAe;MACb,OAAY,CAAC,CAAC,WAAW,WAAW,CAAC;KACvC;KACD,UAAA;IAEO,CAAA;GACR,EAAA,CAAA;EAED,CAAA;CACF,CAAA;AAET;;;;ACxEA,SAAgB,YAAY,EAAE,aAAqC;CACjE,MAAM,EAAE,OAAO,aAAa,SAAS;CACrC,MAAM,OAAO,UAAU,SAAS,UAAU;CAC1C,OACE,oBAAC,UAAD;EACE,MAAK;EACL,cAAY,aAAa,KAAK;EAC9B,OAAO,aAAa,KAAK;EACzB,WACE,aACA;EAEF,eAAe,SAAS,IAAI;EAE3B,UAAA,UAAU,SAAS,MAAM;CACpB,CAAA;AAEZ;;;;;;;;;;;;ACcA,MAAM,cACJ;AACF,MAAM,eAAe,GAAG,YAAY;;AAGpC,SAAS,eAAe,EACtB,OACA,SACA,SACA,YACkB;CAClB,OACE,qBAAC,aAAD;EACE,YAAY;EACZ,WAAU;EAFZ,UAAA;GAIE,oBAAC,MAAD;IAAI,IAAI;IAAS,WAAU;IACxB,UAAA;GACC,CAAA;GACJ,oBAAC,OAAD;IAAK,WAAU;IAA+B;GAAc,CAAA;GAC5D,oBAAC,OAAD;IAAK,WAAU;IAA+B,UAAA;GAAa,CAAA;EAChD;;AAEjB;;AAGA,SAAS,OAAO,OAIb;CACD,MAAM,QAAQ,cAAc,KAAK;CACjC,MAAM,UAAU,MAAM;CACtB,MAAM,UAAU,MAAM,WACpB,oBAAC,UAAD;EAAQ,MAAK;EAAS,WAAW;EAAa,SAAS;EAAc,UAAA;CAE7D,CAAA;CAGV,OAAO,cAAc,OAAO;EAC1B,OAAO,MAAM;EACb;EACA;EACA,UAAU,MAAM;CAClB,CAAC;AACH;AAEA,MAAM,eACJ,oBAAC,UAAD;CAAQ,MAAK;CAAS,WAAW;CAAa,SAAS;CAAc,UAAA;AAE7D,CAAA;AAGV,SAAS,SAAoC,MAAS;CACpD,MAAM,QAAQ,WAAW;CACzB,OAAO,OAAO,SAAS,OAClB,QACD,KAAA;AACN;;;AAIA,SAAgB,sBAAsB;CACpC,MAAM,QAAQ,SAAS,gBAAgB;CACvC,MAAM,SAAS,2BACb,OAAO,cACP,OAAO,oBACT;CACA,MAAM,EAAE,WAAW,kBAAkB;CACrC,MAAM,SAAS,wBAAwB,OAAO,OAAO;CACrD,MAAM,EAAE,UAAU;CAClB,MAAM,CAAC,MAAM,WAAW,SAAS,EAAE;CACnC,MAAM,WAAW,QAAQ,cAAc,OAAO,QAAQ,OAAO;CAC7D,MAAM,SAAS,YAAY;EACzB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO;EACjC,aAAa;EACb,MAAM,OAAO,MAAM,YACjB,MAAM,OAAO,IACb,KAAK,KAAK,KAAK,OAAO,YACtB,OAAO,cAAc,OAAO,IAC5B,OAAO,cAAc,QAAQ,KAAK,KAAA,GAClC,KAAA,GACA,KAAA,GACA,KAAA,GACA,MAAM,oBACR;EAEA,WAAW,cAAc,MAAM,KAAK,CAAC;CACvC;CACA,OACE,qBAAC,QAAD;EACE,OAAO,OAAO,YAAY;EAC1B,SACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,QAAD,CAAS,CAAA,GACT,oBAAC,UAAD;GACE,MAAK;GACL,MAAK;GACL,WAAW;GACX,UAAU,CAAC,SAAS,CAAC;GACtB,UAAA;EAEO,CAAA,CACR,EAAA,CAAA;EAbN,UAAA,CAgBE,qBAAC,QAAD;GACE,IAAG;GACH,WAAU;GACV,WAAW,UAAU;IACnB,MAAM,eAAe;IACrB,OAAY;GACd;GANF,UAAA,CAQE,qBAAC,SAAD;IAAO,WAAU;IAAjB,UAAA,CAAuC,QAErC,oBAAC,SAAD;KACE,WAAA;KACA,OAAO;KACP,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAK;KAC/C,aAAa,OAAO;KACpB,WAAU;IACX,CAAA,CACI;GACN,CAAA,GAAA,CAAC,CAAC,OAAO,SAAS,UACjB,qBAAC,SAAD;IAAO,WAAU;IAAjB,UAAA,CAAuC,SAErC,qBAAC,UAAD;KACE,OAAO,OAAO,OAAO,MAAM;KAC3B,WAAW,UAAU,OAAO,KAAK,MAAM,OAAO,KAAK;KACnD,WAAU;KAHZ,UAAA,CAKG,CAAC,SAAS,oBAAC,UAAD;MAAQ,OAAM;MAAG,UAAA;KAAsB,CAAA,GACjD,OAAO,QAAQ,KAAK,WACnB,oBAAC,UAAD;MAA+B,OAAO,OAAO,OAAO;MACjD,UAAA,aAAa,MAAM;KACd,GAFK,OAAO,OAAO,EAEnB,CACT,CACK;IACH,CAAA,CAAA;GAEL,CAAA,CAAA;EACL,CAAA,GAAA,OAAO,SAAS,WAAW,KAC1B,qBAAC,KAAD;GAAG,WAAU;GAAb,UAAA;IAA+B;IACK;IAClC,oBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,eAAe,YAAY,EAAE,MAAM,WAAW,CAAC;KAChD,UAAA;IAEO,CAAA;GACP;EAEC,CAAA,CAAA;;AAEZ;;AAGA,SAAgB,aAAa;CAC3B,MAAM,OAAO,QAAQ;CACrB,MAAM,UAAU,sBAAsB;CACtC,MAAM,EAAE,OAAO,SAAS,UAAU,cAAc;CAChD,gBAAgB;EACd,IAAI,MAAM,aAAa;CACzB,GAAG,CAAC,IAAI,CAAC;CACT,OACE,qBAAC,QAAD;EAAQ,OAAM;EAAd,UAAA,CACG,QAAQ,SACP,QAAQ,KAAK,WACX,oBAAC,UAAD;GAEE,MAAK;GACL,WAAW;GACX,UAAU;GACV,eAAe;IACb,aAAa;IACb,MAAM,KAAA,GAAW,OAAO,EAAE;GAC5B;GAEC,UAAA,OAAO;EACF,GAVD,OAAO,EAUN,CACT,IAED,oBAAC,UAAD;GACE,MAAK;GACL,WAAW;GACX,eAAe,WAAW;GAC3B,UAAA;EAEO,CAAA,GAET,SAAS,oBAAC,KAAD;GAAG,WAAU;GAAmB,UAAA,MAAM;EAAW,CAAA,CACrD;;AAEZ;;AAGA,SAAgB,kBAAkB;CAChC,MAAM,QAAQ,SAAS,YAAY;CACnC,MAAM,OAAO,YAAY,OAAO,EAAE;CAClC,MAAM,SAAS,wBAAwB,OAAO,EAAE;CAChD,MAAM,EAAE,UAAU,kBAAkB;CACpC,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,CAAC,OAAO,YAAY,SAAiB;CAC3C,MAAM,SAAS,YAAY;EACzB,IAAI,CAAC,SAAS,CAAC,OAAO;EACtB,WAAW,IAAI;EACf,SAAS,KAAA,CAAS;EAClB,IAAI;GACF,MAAM,WAAW,MAAM,OAAO,IAAI,MAAM,EAAE;EAC5C,SAAS,OAAO;GACd,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;GAC/D,WAAW,KAAK;GAChB;EACF;EACA,aAAa;EACb,gBAAgB,MAAM;CACxB;CACA,OACE,qBAAC,QAAD;EACE,OAAO,UAAU,MAAM,QAAQ,OAAO;EACtC,SACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,QAAD,CAAS,CAAA,GACT,oBAAC,UAAD;GACE,MAAK;GACL,WAAW;GACX,UAAU;GACV,eAAe,KAAK,OAAO;GAE1B,UAAA,UAAU,cAAc;EACnB,CAAA,CACR,EAAA,CAAA;EAbN,UAAA,CAgBE,oBAAC,KAAD,EAAA,UACG,MAAM,SAAS,WACZ,qDACA,gCACH,CAAA,GACF,SAAS,oBAAC,KAAD;GAAG,WAAU;GAAmB,UAAA;EAAS,CAAA,CAC7C;;AAEZ;;AAGA,SAAgB,8BAA8B;CAC5C,MAAM,QAAQ,SAAS,wBAAwB;CAC/C,MAAM,CAAC,YAAY,gBAAgB,OAAO,UAAU;CACpD,MAAM,WAAW,iBAAiB;CAClC,MAAM,UAAU,WACZ,0BAA0B,UAAU,QAAQ,IAC5C,KAAA;CACJ,IAAI,CAAC,YAAY,CAAC,SAAS,OAAO;CAClC,MAAM,gBAAgB;EACpB,aAAa;EACb,gBAAgB,SAAS,OAAO,EAAE,CAAC,CAAC,OAAO,UAAmB;GAC5D,QAAQ,MAAM,0CAA0C,KAAK;EAC/D,CAAC;CACH;CACA,OACE,qBAAC,QAAD;EACE,OAAM;EACN,SACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,QAAD,CAAS,CAAA,GACT,oBAAC,UAAD;GAAQ,MAAK;GAAS,WAAW;GAAc,SAAS;GAAS,UAAA;EAEzD,CAAA,CACR,EAAA,CAAA;EARN,UAAA,CAWE,qBAAC,KAAD,EAAA,UAAA;GAAG;GACa,QAAQ;GAAY;GAAK,QAAQ;GAAU;EAExD,EAAA,CAAA,GACF,QAAQ,MACN,QAAQ,SAAS,KAAK,WAAW,CAAC,CAClC,KAAK,SACJ,qBAAC,KAAD,EAAA,UAAA;GAAwB;GACpB,KAAK;GAAU;GAAG,KAAK;EACxB,EAAA,GAFK,KAAK,SAEV,CACJ,CACG;;AAEZ;;AAGA,SAAgB,kCAAkC;CAChD,MAAM,QAAQ,SAAS,4BAA4B;CACnD,MAAM,CAAC,YAAY,gBAAgB,OAAO,UAAU;CACpD,IAAI,CAAC,UAAU,OAAO;CACtB,MAAM,SAAS,iBAAiB,QAAQ;CACxC,MAAM,iBAAiB;EACrB,aAAa;EACb,WAAW,QAAQ,CAAC,CAAC,OAAO,UAAmB;GAC7C,QAAQ,MAAM,gCAAgC,KAAK;EACrD,CAAC;CACH;CACA,OACE,oBAAC,QAAD;EACE,OAAM;EACN,SACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,QAAD,CAAS,CAAA,GACT,oBAAC,UAAD;GAAQ,MAAK;GAAS,WAAW;GAAc,SAAS;GAAU,UAAA;EAE1D,CAAA,CACR,EAAA,CAAA;EAGJ,UAAA,oBAAC,MAAD;GAAI,WAAU;GACX,UAAA,OAAO,KAAK,OAAO,UAClB,oBAAC,MAAD,EAAA,UAAiB,MAAM,QAAY,GAA1B,KAA0B,CACpC;EACC,CAAA;CACE,CAAA;AAEZ;;AAGA,SAAgB,kCAAkC;CAChD,MAAM,QAAQ,SAAS,4BAA4B;CACnD,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,EAAE,cAAc,iBAAiB,sBAAsB;CAC7D,OACE,oBAAC,QAAD;EACE,OAAM;EACN,SACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,QAAD,CAAS,CAAA,GACT,oBAAC,UAAD;GACE,MAAK;GACL,WAAW;GACX,eAAe;IACb,aAAa;IACb,WAAW,EAAE,UAAU,WAAW,CAAC;GACrC;GACD,UAAA;EAEO,CAAA,CACR,EAAA,CAAA;EAGJ,UAAA,qBAAC,KAAD,EAAA,UAAA;GAAG;GAC4B;GAAgB;GAAM;GAAa;GACpC,kBAAkB,KAAK,IAAI;GAAE;EACxD,EAAA,CAAA;CACG,CAAA;AAEZ;;AAGA,SAAgB,yBAAyB;CACvC,MAAM,OAAO,QAAQ;CACrB,OACE,oBAAC,QAAD;EACE,OAAO,OAAO,4BAA4B;EAC1C,SACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,QAAD,CAAS,CAAA,GACR,OACC,oBAAC,UAAD;GACE,MAAK;GACL,WAAW;GACX,eAAe;IACb,aAAa;IACb,OAAY;GACd;GACD,UAAA;EAEO,CAAA,IAER,oBAAC,UAAD;GACE,MAAK;GACL,WAAW;GACX,eAAe,YAAY,EAAE,MAAM,QAAQ,CAAC;GAC7C,UAAA;EAEO,CAAA,CAEV,EAAA,CAAA;EAGJ,UAAA,oBAAC,KAAD,EAAA,UACG,OACG,6DACA,8CACH,CAAA;CACG,CAAA;AAEZ;;;ACvZA,MAAM,aAA4B,OAAO,YACvC,OAAO,QAAQ,gBAAgB,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,CACrD,MACAA,eAAW,KACb,CAAC,CACH;;;;AAKA,SAAgB,WAAW;CACzB,UAAU;CACV,SAAS;CACT,MAAM,OAAO,mBAAmB;CAChC,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GAEE,oBAAC,aAAD,CAAc,CAAA;GACd,oBAAC,UAAD;IAAU,MAAK;IACZ,UAAA,OAAO,oBAAC,iBAAD,EAAiB,MAAM,KAAO,CAAA,IAAI,oBAAC,QAAD,CAAS,CAAA;GAC3C,CAAA;GACV,oBAAC,aAAD,EAAa,QAAQ,WAAa,CAAA;EAC/B;;AAET;;AAGA,SAAgB,aAAa;CAC3B,MAAM,UAAU,UAAU,CAAC,CAAC,QAAQ,QAAQ;CAC5C,MAAM,OAAO,aAAa,KAAA,CAAS;CACnC,MAAM,WAAW,aAAa,EAAE,UAAU,KAAK,CAAC;CAChD,MAAM,YAAY,aAAa;CAC/B,OACE,qBAAC,UAAD;EAAQ,WAAU;EAAlB,UAAA;GACE,oBAAC,KAAD;IAAG,GAAI;IAAM,WAAU;IACpB,UAAA,SAAS,OAAO;GAChB,CAAA;GACH,oBAAC,OAAD;IAAK,cAAW;IAAQ,WAAU;IAC/B,UAAA,UAAU,KAAK,SAEd,oBAAC,MAAD;KAAyB,IAAI,KAAK;KAAa,WAAW;KACvD,UAAA,KAAK;IACF,GAFK,KAAK,OAEV,CACP;GACE,CAAA;GACL,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,KAAD;KAAG,GAAI;KAAU,WAAW;KAAW,UAAA;IAEpC,CAAA,GACH,oBAAC,aAAD,CAAc,CAAA,CACX;;EACC;;AAEZ;;;AAIA,SAAgB,aAAa;CAC3B,MAAM,aAAa,cAAc;CACjC,MAAM,SAAS,eAAe,MAAM;CACpC,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACG,CAAC,cAAc,CAAC,UAAU,oBAAC,YAAD,CAAa,CAAA,GACxC,oBAAC,QAAD;GAAM,WAAU;GACd,UAAA,oBAAC,eAAD,CAAgB,CAAA;EACZ,CAAA,CACH;;AAET;;;;ACnFA,SAAgB,aAAa,EAAE,aAAqC;CAClE,MAAM,WAAW,eAAe,EAAE,SAAS,MAAM,EAAE,SAAS,SAAS,CAAC;CACtE,MAAM,OAAO,aAAa,KAAA,CAAS;CACnC,OACE,qBAAC,OAAD;EACE,MAAK;EACL,WAAU;EAFZ,UAAA;GAIE,oBAAC,MAAD;IAAI,WAAU;IACX,UAAA,YAAY,SAAS,UAAU,cAAc;GAC5C,CAAA;GACJ,qBAAC,KAAD;IAAG,WAAU;IAAb,UAAA;KAA+B;KACf;KACd,oBAAC,QAAD;MAAM,eAAY;MAAiB,WAAU;MAC1C,UAAA;KACG,CAAA;KAAC;IAEN;;GACH,oBAAC,KAAD;IAAG,GAAI;IAAM,WAAU;IAAyB,UAAA;GAE7C,CAAA;EACA;;AAET;AAEA,SAAgB,kBAAkB,EAAE,aAAoC;CACtE,OAAO,oBAAC,cAAD,EAAyB,UAAY,CAAA;AAC9C;;;;AC5BA,SAAgB,eAAe,EAAE,OAAO,SAA8B;CACpE,OACE,qBAAC,OAAD;EAAK,MAAK;EAAQ,WAAU;EAA5B,UAAA;GACE,oBAAC,MAAD;IAAI,WAAU;IAAwB,UAAA;GAAwB,CAAA;GAC9D,oBAAC,OAAD;IAAK,WAAU;IACZ,UAAA,iBAAiB,QAAQ,MAAM,UAAU,KAAK,UAAU,KAAK;GAC3D,CAAA;GACL,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,SAAS;IACV,UAAA;GAEO,CAAA;EACL;;AAET;;;ACTA,SAAS,QAAQ,EAAE,OAAkC;CACnD,MAAM,OAAO,aAAa,EAAE,UAAU,IAAI,GAAG,CAAC;CAC9C,MAAM,UAAU,KAAK,oBAAoB;CACzC,MAAM,OAAO,IAAI;CACjB,OACE,qBAAC,KAAD;EACE,GAAI;EACJ,WAAW;GACT;GACA,UAAU,gCAAgC;GAC1C,IAAI,cAAc,qBAAqB;EACzC,CAAC,CAAC,KAAK,GAAG;EANZ,UAAA,CAQG,QAAQ,oBAAC,MAAD,EAAM,MAAM,GAAK,CAAA,GACzB,IAAI,KACJ;;AAEP;;AAGA,SAAgB,mBAAmB;CACjC,MAAM,OAAO,gBAAgB;CAC7B,MAAM,aAAa,gBAAgB;CAEnC,MAAM,cAAc;EAClB,IAAI,WAAW,cAAc,GAAG;EAChC,WAAW,KAAK,KAAA,GAAW,EAAE,SAAS,KAAK,CAAC;CAC9C;CACA,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,MAAD;IAAI,WAAU;IAAwB,UAAA;GAAY,CAAA,GAClD,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,SAAS;IACV,UAAA;GAEO,CAAA,CACL;EACL,CAAA,GAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,OAAD;IAAK,cAAW;IAAW,WAAU;IACnC,UAAA,oBAAC,MAAD;KAAI,WAAU;KACX,UAAA,KAAK,KAAK,QACT,oBAAC,MAAD,EAAA,UACE,oBAAC,SAAD,EAAc,IAAM,CAAA,EAClB,GAFK,IAAI,EAET,CACL;IACC,CAAA;GACD,CAAA,GACL,oBAAC,WAAD;IAAS,WAAU;IACjB,UAAA,oBAAC,UAAD;KAAU,MAAK;KACb,UAAA,oBAAC,QAAD,CAAS,CAAA;IACD,CAAA;GACH,CAAA,CACN;EACF,CAAA,CAAA;;AAET;AAEA,MAAM,SAAS;CACb;EAAE,OAAO;EAAS,OAAO;CAAQ;CACjC;EAAE,OAAO;EAAQ,OAAO;CAAO;CAC/B;EAAE,OAAO;EAAU,OAAO;CAAS;AACrC;;AAGA,SAAgB,gBAAgB;CAC9B,MAAM,EAAE,OAAO,UAAU,aAAa,SAAS;CAC/C,MAAM,WAAW,WAAW,WAAW;CACvC,OACE,qBAAC,YAAD;EAAU,WAAU;EAApB,UAAA,CACE,oBAAC,UAAD;GAAQ,WAAU;GAAqB,UAAA;EAAa,CAAA,GACnD,OAAO,KAAK,WACX,qBAAC,SAAD;GAA0B,WAAU;GAApC,UAAA,CACE,oBAAC,SAAD;IACE,MAAK;IACL,MAAK;IACL,OAAO,OAAO;IACd,SAAS,aAAa,OAAO;IAC7B,gBAAgB,SAAS,OAAO,KAAK;GACtC,CAAA,GACA,OAAO,KACH;EATK,GAAA,OAAO,KASZ,CACR,CACO;;AAEd;;;ACtFA,MAAM,gBAAwC;CAC5C,QAAQ;CACR,SAAS;CACT,iBAAiB;CACjB,oBAAoB;AACtB;AAEA,MAAM,cAAc,WAClB,OAAO,cAAc,MAAM,SACxB,qBAA2C,SAAS,IAAI,CAC3D;;AAGF,SAAS,SAAS,KAAuB;CACvC,MAAM,yBAAS,IAAI,IAAkD;CACrE,KAAK,MAAM,SAAS,IAAI,gBAAgB;EACtC,MAAM,EAAE,IAAI,SAAS,MAAM,cAAc;EACzC,MAAM,QAAQ,OAAO,IAAI,EAAE,KAAK;GAAE;GAAM,UAAU,CAAC;EAAE;EACrD,MAAM,SAAS,KAAK,MAAM,WAAW,CAAC;EACtC,OAAO,IAAI,IAAI,KAAK;CACtB;CACA,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,iBAAiB;EACtD;EACA;EACA,UAAU,SAAS,MAAM,GAAG,MAAM,IAAI,CAAC;CACzC,EAAE;AACJ;AAEA,SAAS,QAAQ,OAA+C;CAC9D,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,MAAD;GAAI,WAAU;GACX,UAAA,MAAM;EACL,CAAA,GACH,MAAM,QACJ;;AAET;AAEA,MAAM,OAAO;AAEb,SAAS,YAAY,OAAmD;CACtE,OACE,oBAAC,SAAD;EACE,cAAY,MAAM;EAClB,WAAU;EAEV,UAAA,oBAAC,SAAD,EAAA,UACG,MAAM,QAAQ,KAAK,WAClB,qBAAC,MAAD;GAA2B,WAAU;GAArC,UAAA;IACE,oBAAC,MAAD;KAAI,WAAW,GAAG,KAAK;KAAU,UAAA,OAAO,OAAO;IAAS,CAAA;IACxD,oBAAC,MAAD;KAAI,WAAW,GAAG,KAAK;KACpB,UAAA,OAAO,OAAO;IACb,CAAA;IACJ,oBAAC,MAAD;KAAI,WAAW,GAAG,KAAK;KACpB,UAAA,OAAO,cAAc,KAAK,IAAI;IAC7B,CAAA;GACF;EARK,GAAA,OAAO,OAAO,EAQnB,CACL,EACI,CAAA;CACF,CAAA;AAEX;AAEA,SAAS,aAAa,EAAE,OAAkC;CACxD,MAAM,UAAU,uBAAuB;CACvC,MAAM,OAAO,IAAI,SAAS;CAC1B,MAAM,UAAU,SAAS,kBAAkB,IAAI;CAC/C,MAAM,SAAS,SAAS,iBAAiB,IAAI;CAC7C,MAAM,SAAS,SAAS,GAAG;CAC3B,MAAM,OAAO,IAAI,QAAQ,OAAO,UAAU;CAC1C,MAAM,UAAU,IAAI,QAAQ,QAAQ,WAAW,CAAC,WAAW,MAAM,CAAC;CAClE,OACE,qBAAC,MAAD;EACE,cAAY;EACZ,WAAU;EAFZ,UAAA;GAIE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,MAAD;MAAI,WAAU;MAAiB,UAAA;KAAS,CAAA;KACvC,WACC,oBAAC,QAAD;MAAM,WAAU;MAAqC,UAAA;KAAc,CAAA;KAEpE,UACC,oBAAC,QAAD;MAAM,WAAU;MACb,UAAA,cAAc,WAAW;KACtB,CAAA;IAEL;;GACJ,OAAO,SAAS,KACf,oBAAC,SAAD;IAAS,OAAM;IACb,UAAA,oBAAC,SAAD;KACE,cAAY,GAAG,KAAK;KACpB,WAAU;KAEV,UAAA,oBAAC,SAAD,EAAA,UACG,OAAO,KAAK,UACX,qBAAC,MAAD;MAAqB,WAAU;MAA/B,UAAA;OACE,oBAAC,MAAD;QAAI,WAAW,GAAG,KAAK;QAAU,UAAA,MAAM;OAAS,CAAA;OAChD,oBAAC,MAAD;QAAI,WAAW,GAAG,KAAK;QAAoB,UAAA,MAAM;OAAS,CAAA;OAC1D,oBAAC,MAAD;QAAI,WAAW,GAAG,KAAK;QACpB,UAAA,MAAM,SAAS,KAAK,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI;OAC3C,CAAA;MACF;KANK,GAAA,MAAM,IAMX,CACL,EACI,CAAA;IACF,CAAA;GACA,CAAA;GAEV,QAAQ,SAAS,KAChB,oBAAC,SAAD;IAAS,OAAM;IACb,UAAA,oBAAC,aAAD;KAAa,OAAO,GAAG,KAAK;KAAoB;IAAU,CAAA;GACnD,CAAA;GAEV,KAAK,SAAS,KACb,oBAAC,SAAD;IAAS,OAAM;IACb,UAAA,oBAAC,aAAD;KAAa,OAAO,GAAG,KAAK;KAAc,SAAS;IAAO,CAAA;GACnD,CAAA;EAET;;AAER;;AAGA,SAAgB,cAAc;CAC5B,MAAM,WAAW,iBAAiB;CAClC,OACE,oBAAC,OAAD;EAAK,WAAU;EACZ,UAAA,SAAS,WAAW,IACnB,oBAAC,KAAD;GAAG,WAAU;GAAkB,UAAA;EAA0B,CAAA,IAEzD,oBAAC,MAAD;GAAI,cAAW;GAAW,WAAU;GACjC,UAAA,SAAS,KAAK,KAAK,UAClB,oBAAC,cAAD,EAAyD,IAAM,GAA5C,GAAG,IAAI,SAAS,KAAK,GAAG,OAAoB,CAChE;EACC,CAAA;CAEH,CAAA;AAET"}
|
package/dist/views.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { C as EditorHost, D as DirectoryListing, E as HISTORY_PAGE_SIZE, O as formatModified, S as NodeView, T as DocumentHistory, _ as ThemeToggle, a as DriveNotFoundPage, b as DocumentView, c as CoreLayout, d as CreateDocumentModal, f as DeleteItemModal, g as LoginModal, h as DriveAuthRequiredModal, i as CoreRouteError, l as CoreRoot, m as DownloadDocumentWithErrorsModal, n as AppearanceTab, o as NotFoundPage, p as DocumentVersionUnsupportedModal, r as CoreSettingsPage, s as CoreHeader, t as PackagesTab, u as ConfirmDocumentUpgradeModal, v as BackendAuthGate, w as DocumentJson, x as DriveLayout, y as DriveIndex } from "./views-
|
|
1
|
+
import { C as EditorHost, D as DirectoryListing, E as HISTORY_PAGE_SIZE, O as formatModified, S as NodeView, T as DocumentHistory, _ as ThemeToggle, a as DriveNotFoundPage, b as DocumentView, c as CoreLayout, d as CreateDocumentModal, f as DeleteItemModal, g as LoginModal, h as DriveAuthRequiredModal, i as CoreRouteError, l as CoreRoot, m as DownloadDocumentWithErrorsModal, n as AppearanceTab, o as NotFoundPage, p as DocumentVersionUnsupportedModal, r as CoreSettingsPage, s as CoreHeader, t as PackagesTab, u as ConfirmDocumentUpgradeModal, v as BackendAuthGate, w as DocumentJson, x as DriveLayout, y as DriveIndex } from "./views-LyRJcSKu.js";
|
|
2
2
|
import { t as useBackendAuthGate } from "./backend-auth-gate-DNKg_v4Y.js";
|
|
3
3
|
export { AppearanceTab, BackendAuthGate, ConfirmDocumentUpgradeModal, CoreHeader, CoreLayout, CoreRoot, CoreRouteError, CoreSettingsPage, CreateDocumentModal, DeleteItemModal, DirectoryListing, DocumentHistory, DocumentJson, DocumentVersionUnsupportedModal, DocumentView, DownloadDocumentWithErrorsModal, DriveAuthRequiredModal, DriveIndex, DriveLayout, DriveNotFoundPage, EditorHost, HISTORY_PAGE_SIZE, LoginModal, NodeView, NotFoundPage, PackagesTab, ThemeToggle, formatModified, useBackendAuthGate };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/connect-core",
|
|
3
|
-
"version": "6.2.3-dev.
|
|
3
|
+
"version": "6.2.3-dev.90",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -73,17 +73,17 @@
|
|
|
73
73
|
"./package.json": "./package.json"
|
|
74
74
|
},
|
|
75
75
|
"dependencies": {
|
|
76
|
-
"@powerhousedao/host-core": "6.2.3-dev.
|
|
77
|
-
"@powerhousedao/reactor": "6.2.3-dev.
|
|
78
|
-
"@powerhousedao/reactor-browser": "6.2.3-dev.
|
|
79
|
-
"@powerhousedao/reactor-router": "6.2.3-dev.
|
|
80
|
-
"@powerhousedao/shared": "6.2.3-dev.
|
|
81
|
-
"document-model": "6.2.3-dev.
|
|
76
|
+
"@powerhousedao/host-core": "6.2.3-dev.90",
|
|
77
|
+
"@powerhousedao/reactor": "6.2.3-dev.90",
|
|
78
|
+
"@powerhousedao/reactor-browser": "6.2.3-dev.90",
|
|
79
|
+
"@powerhousedao/reactor-router": "6.2.3-dev.90",
|
|
80
|
+
"@powerhousedao/shared": "6.2.3-dev.90",
|
|
81
|
+
"document-model": "6.2.3-dev.90"
|
|
82
82
|
},
|
|
83
83
|
"devDependencies": {
|
|
84
84
|
"@electric-sql/pglite": "0.3.15",
|
|
85
85
|
"@playwright/test": "^1.60.0",
|
|
86
|
-
"@renown/sdk": "6.2.3-dev.
|
|
86
|
+
"@renown/sdk": "6.2.3-dev.90",
|
|
87
87
|
"@tanstack/react-router": "^1.170.41",
|
|
88
88
|
"@tanstack/router-cli": "1.167.40",
|
|
89
89
|
"@tanstack/router-core": "1.171.34",
|
package/src/views/modals.tsx
CHANGED
|
@@ -235,10 +235,20 @@ export function DeleteItemModal() {
|
|
|
235
235
|
const node = useNodeById(modal?.id);
|
|
236
236
|
const parent = useNodeParentFolderById(modal?.id);
|
|
237
237
|
const { drive } = useDriveRouteData();
|
|
238
|
+
const [pending, setPending] = useState(false);
|
|
239
|
+
const [error, setError] = useState<string>();
|
|
238
240
|
const remove = async () => {
|
|
239
|
-
closePHModal();
|
|
240
241
|
if (!drive || !modal) return;
|
|
241
|
-
|
|
242
|
+
setPending(true);
|
|
243
|
+
setError(undefined);
|
|
244
|
+
try {
|
|
245
|
+
await deleteNode(drive.header.id, modal.id);
|
|
246
|
+
} catch (cause) {
|
|
247
|
+
setError(cause instanceof Error ? cause.message : String(cause));
|
|
248
|
+
setPending(false);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
closePHModal();
|
|
242
252
|
setSelectedNode(parent);
|
|
243
253
|
};
|
|
244
254
|
return (
|
|
@@ -250,9 +260,10 @@ export function DeleteItemModal() {
|
|
|
250
260
|
<button
|
|
251
261
|
type="button"
|
|
252
262
|
className={primaryClass}
|
|
263
|
+
disabled={pending}
|
|
253
264
|
onClick={() => void remove()}
|
|
254
265
|
>
|
|
255
|
-
Delete
|
|
266
|
+
{pending ? "Deleting…" : "Delete"}
|
|
256
267
|
</button>
|
|
257
268
|
</>
|
|
258
269
|
}
|
|
@@ -262,6 +273,7 @@ export function DeleteItemModal() {
|
|
|
262
273
|
? "The folder and everything in it will be deleted."
|
|
263
274
|
: "The document will be deleted."}
|
|
264
275
|
</p>
|
|
276
|
+
{error && <p className="text-core-muted">{error}</p>}
|
|
265
277
|
</Dialog>
|
|
266
278
|
);
|
|
267
279
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"views-BtUVboYl.js","names":["modalViews"],"sources":["../src/views/index-table.tsx","../src/views/directory-listing.tsx","../src/views/document-history.tsx","../src/views/document-json.tsx","../src/views/editor-host.tsx","../src/views/content.tsx","../src/views/home.tsx","../src/views/backend-auth-gate.tsx","../src/views/theme-toggle.tsx","../src/views/modals.tsx","../src/views/layout.tsx","../src/views/not-found-page.tsx","../src/views/route-views.tsx","../src/views/settings.tsx","../src/views/settings-packages.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n/** `YYYY-MM-DD HH:mm` in UTC, as a server index lists it; \"-\" when unknown. */\nexport function formatModified(iso: string | undefined) {\n if (!iso) return \"-\";\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return \"-\";\n return date.toISOString().slice(0, 16).replace(\"T\", \" \");\n}\n\n/** An \"Index of\" page: a title above a name / type / last modified table. */\nexport function IndexTable(props: {\n title: ReactNode;\n label: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"p-6 font-mono text-sm text-core-fg\">\n <h1 className=\"mb-4 text-xl font-semibold\">{props.title}</h1>\n <table aria-label={props.label} className=\"w-full border-collapse\">\n <thead>\n <tr className=\"border-b border-core-border text-left text-core-muted\">\n <th className=\"py-1 pr-6 font-normal\">Name</th>\n <th className=\"py-1 pr-6 font-normal\">Type</th>\n <th className=\"py-1 font-normal\">Last modified</th>\n </tr>\n </thead>\n <tbody>{props.children}</tbody>\n </table>\n </div>\n );\n}\n\nexport function IndexRow(props: {\n name: ReactNode;\n type: ReactNode;\n modified: ReactNode;\n}) {\n return (\n <tr className=\"border-b border-core-border/50 hover:bg-core-hover\">\n <td className=\"py-1 pr-6\">{props.name}</td>\n <td className=\"py-1 pr-6 text-core-muted\">{props.type}</td>\n <td className=\"py-1 whitespace-nowrap text-core-muted\">\n {props.modified}\n </td>\n </tr>\n );\n}\n\nexport const linkClass = \"text-core-link underline-offset-2 hover:underline\";\n","import {\n getDriveName,\n makeDriveSlug,\n makeNodeSlug,\n useDocumentById,\n useDriveNodes,\n useLinkProps,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n DocumentDriveDocument,\n FolderNode,\n Node,\n} from \"@powerhousedao/shared/document-drive\";\nimport { isFileNode } from \"@powerhousedao/shared/document-drive\";\nimport type { ReactNode } from \"react\";\nimport { Component, Fragment, Suspense } from \"react\";\nimport type { DriveViewProps } from \"../router/route-components.js\";\nimport {\n formatModified,\n IndexRow,\n IndexTable,\n linkClass,\n} from \"./index-table.js\";\n\nfunction NodeLink(props: {\n drive: DocumentDriveDocument;\n node: Node | undefined;\n children: ReactNode;\n}) {\n const link = useLinkProps({\n driveSlug: makeDriveSlug(props.drive),\n nodeSlug: props.node ? makeNodeSlug(props.node) : undefined,\n });\n return (\n <a {...link} className={linkClass}>\n {props.children}\n </a>\n );\n}\n\nfunction HomeLink(props: { children: ReactNode }) {\n const link = useLinkProps(undefined);\n return (\n <a {...link} className={linkClass}>\n {props.children}\n </a>\n );\n}\n\n// A row's date is a nicety: it shows \"-\" when the document can't load.\nclass Quiet extends Component<{ children: ReactNode }, { failed: boolean }> {\n override state = { failed: false };\n static getDerivedStateFromError() {\n return { failed: true };\n }\n override render() {\n return this.state.failed ? \"-\" : this.props.children;\n }\n}\n\nfunction DocumentModified({ id }: { id: string }) {\n const [document] = useDocumentById(id);\n return formatModified(document?.header.lastModifiedAtUtcIso);\n}\n\n/** The folders from the drive's root down to `folder`. */\nfunction folderPath(nodes: readonly Node[], folder: FolderNode | undefined) {\n const path: Node[] = [];\n for (let node: Node | undefined = folder; node;) {\n path.unshift(node);\n const parentId: string | null | undefined = node.parentFolder;\n node = parentId ? nodes.find((n) => n.id === parentId) : undefined;\n }\n return path;\n}\n\nconst byKindThenName = (a: Node, b: Node) =>\n a.kind === b.kind\n ? a.name.localeCompare(b.name)\n : a.kind === \"folder\"\n ? -1\n : 1;\n\n/** Core's drive fallback: a listing of the open folder; an open document shows instead. */\nexport function DirectoryListing({ drive, folder, children }: DriveViewProps) {\n if (children) return children;\n return <FolderListing drive={drive} folder={folder} />;\n}\n\nfunction FolderListing({\n drive,\n folder,\n}: {\n drive: DocumentDriveDocument;\n folder: FolderNode | undefined;\n}) {\n const nodes = useDriveNodes(drive.header.id) ?? [];\n const path = folderPath(nodes, folder);\n const parent = path.at(-2);\n const entries = nodes\n .filter((node) => (node.parentFolder ?? null) === (folder?.id ?? null))\n .sort(byKindThenName);\n const title = (\n <>\n Index of /\n <NodeLink drive={drive} node={undefined}>\n {getDriveName(drive)}\n </NodeLink>\n /\n {path.map((node) => (\n <Fragment key={node.id}>\n <NodeLink drive={drive} node={node}>\n {node.name}\n </NodeLink>\n /\n </Fragment>\n ))}\n </>\n );\n return (\n <IndexTable title={title} label=\"Directory listing\">\n <IndexRow\n name={\n folder ? (\n <NodeLink drive={drive} node={parent}>\n Parent Directory\n </NodeLink>\n ) : (\n <HomeLink>Parent Directory</HomeLink>\n )\n }\n type=\"-\"\n modified=\"-\"\n />\n {entries.map((node) => (\n <IndexRow\n key={node.id}\n name={\n <NodeLink drive={drive} node={node}>\n {node.kind === \"folder\" ? `${node.name}/` : node.name}\n </NodeLink>\n }\n type={isFileNode(node) ? node.documentType : \"Folder\"}\n modified={\n node.kind === \"folder\" ? (\n \"-\"\n ) : (\n <Quiet>\n <Suspense fallback=\"…\">\n <DocumentModified id={node.id} />\n </Suspense>\n </Quiet>\n )\n }\n />\n ))}\n </IndexTable>\n );\n}\n","import {\n hideRevisionHistory,\n setRevisionHistoryPage,\n useReactorClient,\n useRevisionHistoryPage,\n} from \"@powerhousedao/reactor-browser\";\nimport type { Operation } from \"@powerhousedao/shared/document-model\";\nimport { useEffect, useState } from \"react\";\nimport type { DocumentViewProps } from \"../router/route-components.js\";\nimport { formatModified, linkClass } from \"./index-table.js\";\n\nconst pagerClass = `${linkClass} disabled:text-core-muted disabled:no-underline`;\n\n/** Operations per scope on a history page. */\nexport const HISTORY_PAGE_SIZE = 50;\n\n/** Page `page`'s index range of a scope with `count` operations, newest first. */\nexport function historyPageRange(count: number, page: number) {\n const end = Math.max(count - (page - 1) * HISTORY_PAGE_SIZE, 0);\n return { start: Math.max(end - HISTORY_PAGE_SIZE, 0), end };\n}\n\ntype PageState =\n | { status: \"loading\" }\n | { status: \"ready\"; operations: Operation[] }\n | { status: \"error\"; error: Error };\n\n// Fetches only the page's range: `sinceRevision` and a limit of the page size.\nfunction useScopePage(\n documentId: string,\n scope: string,\n start: number,\n end: number,\n) {\n const client = useReactorClient();\n // Each result is kept with its request; a newer request reads as loading.\n const key = `${documentId}:${scope}:${start}:${end}`;\n const [result, setResult] = useState<{ key: string; state: PageState }>();\n const empty = !client || end <= start;\n useEffect(() => {\n if (empty) return;\n const controller = new AbortController();\n const setState = (state: PageState) => setResult({ key, state });\n client\n .getOperations(\n documentId,\n { scopes: [scope] },\n { sinceRevision: start },\n { cursor: \"\", limit: end - start },\n controller.signal,\n )\n .then(\n (page) => {\n const operations = page.results\n .filter((operation) => operation.index < end)\n .sort((a, b) => b.index - a.index);\n setState({ status: \"ready\", operations });\n },\n (reason: unknown) => {\n if (controller.signal.aborted) return;\n setState({\n status: \"error\",\n error: reason instanceof Error ? reason : new Error(String(reason)),\n });\n },\n );\n return () => controller.abort();\n }, [client, empty, key, documentId, scope, start, end]);\n if (empty) return { status: \"ready\", operations: [] } as const;\n return result?.key === key ? result.state : ({ status: \"loading\" } as const);\n}\n\nfunction ScopeOperations(props: {\n documentId: string;\n scope: string;\n count: number;\n page: number;\n}) {\n const { start, end } = historyPageRange(props.count, props.page);\n const state = useScopePage(props.documentId, props.scope, start, end);\n return (\n <section className=\"mb-6\">\n <h2 className=\"mb-2 font-semibold\">\n {props.scope}{\" \"}\n <span className=\"font-normal text-core-muted\">\n {end > start\n ? `${end - start} of ${props.count}, ${start}-${end - 1}`\n : `0 of ${props.count}`}\n </span>\n </h2>\n {state.status === \"error\" ? (\n <p className=\"text-core-danger\">{state.error.message}</p>\n ) : state.status === \"loading\" ? (\n <p className=\"text-core-muted\">Loading…</p>\n ) : state.operations.length === 0 ? (\n <p className=\"text-core-muted\">No operations on this page.</p>\n ) : (\n <table\n aria-label={`${props.scope} operations`}\n className=\"w-full border-collapse\"\n >\n <thead>\n <tr className=\"border-b border-core-border text-left text-core-muted\">\n <th className=\"py-1 pr-6 font-normal\">Index</th>\n <th className=\"py-1 pr-6 font-normal\">Action</th>\n <th className=\"py-1 font-normal\">Timestamp</th>\n </tr>\n </thead>\n <tbody>\n {state.operations.map((operation) => (\n <tr\n key={operation.index}\n className=\"border-b border-core-border/50 hover:bg-core-hover\"\n >\n <td className=\"py-1 pr-6\">{operation.index}</td>\n <td className=\"py-1 pr-6\">{operation.action.type}</td>\n <td className=\"py-1\">\n {formatModified(operation.timestampUtcMs)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </section>\n );\n}\n\n/** Core's revision history: each scope's operations, newest first, a page at a time. */\nexport function DocumentHistory({ document }: DocumentViewProps) {\n const page = useRevisionHistoryPage();\n const { header } = document;\n const scopes = Object.entries(header.revision);\n const pageCount = Math.max(\n 1,\n ...scopes.map(([, count]) => Math.ceil(count / HISTORY_PAGE_SIZE)),\n );\n const pager = (\n <nav aria-label=\"History pages\" className=\"flex items-center gap-4\">\n <button\n type=\"button\"\n className={pagerClass}\n disabled={page <= 1}\n onClick={() => setRevisionHistoryPage(page - 1)}\n >\n Newer\n </button>\n <span className=\"text-core-muted\">\n Page {page} of {pageCount}\n </span>\n <button\n type=\"button\"\n className={pagerClass}\n disabled={page >= pageCount}\n onClick={() => setRevisionHistoryPage(page + 1)}\n >\n Older\n </button>\n </nav>\n );\n return (\n <div className=\"p-6 font-mono text-sm text-core-fg\">\n <div className=\"mb-4 flex items-baseline justify-between\">\n <h1 className=\"text-xl font-semibold\">\n History of {header.name || header.id}\n </h1>\n <button\n type=\"button\"\n className={linkClass}\n onClick={hideRevisionHistory}\n >\n Close\n </button>\n </div>\n <div className=\"mb-4\">{pager}</div>\n {scopes.length === 0 ? (\n <p className=\"text-core-muted\">No operations yet.</p>\n ) : (\n scopes.map(([scope, count]) => (\n <ScopeOperations\n key={scope}\n documentId={header.id}\n scope={scope}\n count={count}\n page={page}\n />\n ))\n )}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { DocumentViewProps } from \"../router/route-components.js\";\nimport { formatModified } from \"./index-table.js\";\n\nfunction Leaf({ value }: { value: unknown }) {\n if (value === null) return <span className=\"text-core-muted\">null</span>;\n if (typeof value === \"string\") {\n return <span className=\"text-core-string\">{JSON.stringify(value)}</span>;\n }\n return <span className=\"text-core-number\">{JSON.stringify(value)}</span>;\n}\n\nfunction JsonNode(props: { name: ReactNode; value: unknown; open?: boolean }) {\n const { name, value } = props;\n if (value === null || typeof value !== \"object\") {\n return (\n <div className=\"pl-4\">\n <span className=\"text-core-muted\">{name}: </span>\n <Leaf value={value} />\n </div>\n );\n }\n const entries = Object.entries(value as Record<string, unknown>);\n const isArray = Array.isArray(value);\n const summary = isArray ? `[${entries.length}]` : `{${entries.length}}`;\n return (\n <details open={props.open} className=\"pl-4\">\n <summary className=\"cursor-pointer select-none\">\n <span className=\"text-core-muted\">{name}: </span>\n <span className=\"text-core-muted\">{summary}</span>\n </summary>\n {entries.map(([key, child]) => (\n <JsonNode key={key} name={key} value={child} />\n ))}\n </details>\n );\n}\n\n/** Core's document fallback: the document's state, read-only, as a JSON tree. */\nexport function DocumentJson({ document }: DocumentViewProps) {\n const { header } = document;\n const revisions = Object.entries(header.revision);\n const operations = revisions.reduce((sum, [, count]) => sum + count, 0);\n const state = document.state as Record<string, unknown>;\n const scopes = [\"global\", \"local\"].filter((scope) => scope in state);\n return (\n <div className=\"p-6 font-mono text-sm text-core-fg\">\n <h1 className=\"mb-1 text-xl font-semibold\">{header.name || header.id}</h1>\n <dl className=\"mb-4 grid grid-cols-[max-content_1fr] gap-x-4 text-core-muted\">\n <dt>Type</dt>\n <dd>{header.documentType}</dd>\n <dt>Id</dt>\n <dd>{header.id}</dd>\n <dt>Last modified</dt>\n <dd>{formatModified(header.lastModifiedAtUtcIso)}</dd>\n <dt>Operations</dt>\n <dd data-testid=\"operation-count\">\n {operations}\n {revisions.length > 0 &&\n ` (${revisions.map(([scope, count]) => `${scope} ${count}`).join(\", \")})`}\n </dd>\n </dl>\n <p className=\"mb-2 text-core-muted\">\n No editor is installed for this document type; its state is shown\n read-only.\n </p>\n <div aria-label=\"Document state\" className=\"-ml-4\">\n {scopes.map((scope) => (\n <JsonNode key={scope} name={scope} value={state[scope]} open />\n ))}\n </div>\n </div>\n );\n}\n","import type { EditorProps } from \"@powerhousedao/shared/document-model\";\nimport type { ErrorInfo, ReactNode } from \"react\";\nimport { Component, Suspense } from \"react\";\n\n/** What core passes a document editor; drive apps get `DriveViewProps`. */\nexport type DocumentEditorProps = EditorProps & {\n documentId: string;\n context?: { readMode?: boolean; selectedTimelineRevision?: number };\n};\n\ntype BoundaryProps = {\n resetKeys: readonly unknown[];\n label: string;\n children: ReactNode;\n};\ntype BoundaryState = { error?: unknown; keys: readonly unknown[] };\n\nclass EditorErrorBoundary extends Component<BoundaryProps, BoundaryState> {\n override state: BoundaryState = { keys: this.props.resetKeys };\n\n static getDerivedStateFromError(error: unknown): Partial<BoundaryState> {\n return { error };\n }\n\n // A new document or drive gets a fresh try.\n static getDerivedStateFromProps(\n props: BoundaryProps,\n state: BoundaryState,\n ): Partial<BoundaryState> | null {\n const changed =\n props.resetKeys.length !== state.keys.length ||\n props.resetKeys.some((key, i) => !Object.is(key, state.keys[i]));\n return changed ? { error: undefined, keys: props.resetKeys } : null;\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo) {\n console.error(`[connect] ${this.props.label} failed:`, error, info);\n }\n\n override render() {\n const { error } = this.state;\n if (error === undefined) return this.props.children;\n return (\n <div role=\"alert\" className=\"p-6 text-core-fg\">\n <h2 className=\"font-semibold\">The {this.props.label} failed</h2>\n <pre className=\"mt-2 overflow-x-auto text-sm text-core-muted\">\n {error instanceof Error ? error.message : JSON.stringify(error)}\n </pre>\n </div>\n );\n }\n}\n\nexport type EditorHostProps = {\n /** A change shows the editor again after an error. */\n resetKeys?: readonly unknown[];\n /** Names what failed, e.g. \"editor\" or \"drive app\". */\n label?: string;\n children: ReactNode;\n};\n\n/** Hosts a drive app or an editor: it loads in Suspense, and an error stays inside. */\nexport function EditorHost({\n resetKeys = [],\n label = \"editor\",\n children,\n}: EditorHostProps) {\n return (\n <EditorErrorBoundary resetKeys={resetKeys} label={label}>\n <Suspense\n name=\"EditorHost\"\n fallback={\n <p role=\"status\" className=\"p-6 text-core-muted\">\n Loading {label}…\n </p>\n }\n >\n {children}\n </Suspense>\n </EditorErrorBoundary>\n );\n}\n","import {\n DriveProvider,\n EditorDocumentProvider,\n useAppModuleById,\n useDispatch,\n useDocument,\n useEditorModuleFor,\n useRevisionHistoryVisible,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PHDocument } from \"@powerhousedao/shared/document-model\";\nimport { Outlet } from \"@tanstack/react-router\";\nimport { useMemo } from \"react\";\nimport { useDriveRouteData } from \"../router/route-data.js\";\nimport { DirectoryListing } from \"./directory-listing.js\";\nimport { DocumentHistory } from \"./document-history.js\";\nimport { DocumentJson } from \"./document-json.js\";\nimport { EditorHost } from \"./editor-host.js\";\n\n/** `document`: its revision history while `?history` is set, else its\n * editor (given `document` and `dispatch`), else its JSON. */\nexport function DocumentView({ document }: { document: PHDocument }) {\n const [, dispatch] = useDispatch(document);\n const editor = useEditorModuleFor(document);\n const historyVisible = useRevisionHistoryVisible();\n if (historyVisible) return <DocumentHistory document={document} />;\n if (!editor) return <DocumentJson document={document} />;\n const Editor = editor.Component;\n return (\n <div\n className=\"relative h-full\"\n data-editor={editor.config.id}\n data-document-type={document.header.documentType}\n >\n <EditorDocumentProvider document={document} dispatch={dispatch}>\n <Editor\n documentId={document.header.id}\n document={document}\n dispatch={dispatch}\n context={{ readMode: false }}\n />\n </EditorDocumentProvider>\n </div>\n );\n}\n\nfunction OpenDocument({ documentId }: { documentId: string }) {\n const document = useDocument(documentId);\n return document ? <DocumentView document={document} /> : null;\n}\n\n/** The drive layout: the drive app its `preferredEditor` names (given the\n * drive as `document`), else the directory listing, around the node route. */\nexport function DriveLayout() {\n const { drive, folder, documentId } = useDriveRouteData();\n const app = useAppModuleById(drive?.header.meta?.preferredEditor);\n const [, dispatch] = useDispatch(drive);\n const nodeId = documentId ?? folder?.id;\n const context = useMemo(\n () => drive && { drive, dispatch, folder, nodeId },\n [drive, dispatch, folder, nodeId],\n );\n if (!drive || !context) return null;\n const App = app?.Component;\n // Drive apps show their own view until they get a document to show.\n const document = documentId ? <Outlet /> : null;\n return (\n <DriveProvider value={context}>\n <EditorHost\n resetKeys={[drive.header.id]}\n label={App ? \"drive app\" : \"drive view\"}\n >\n {App ? (\n <App document={drive} dispatch={dispatch}>\n {document}\n </App>\n ) : (\n <DirectoryListing drive={drive} folder={folder}>\n {document}\n </DirectoryListing>\n )}\n </EditorHost>\n </DriveProvider>\n );\n}\n\n/** The node route: the open document, or nothing on a folder or the drive's root. */\nexport function NodeView() {\n const { documentId } = useDriveRouteData();\n if (!documentId) return null;\n return (\n <EditorHost resetKeys={[documentId]} label=\"editor\">\n <OpenDocument documentId={documentId} />\n </EditorHost>\n );\n}\n","import {\n getDriveName,\n makeDriveSlug,\n preloadDrive,\n useAppModuleById,\n useDrives,\n useLinkProps,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport {\n formatModified,\n IndexRow,\n IndexTable,\n linkClass,\n} from \"./index-table.js\";\n\nfunction DriveRow({ drive }: { drive: DocumentDriveDocument }) {\n const app = useAppModuleById(drive.header.meta?.preferredEditor);\n const link = useLinkProps({ driveSlug: makeDriveSlug(drive) });\n return (\n <IndexRow\n name={\n <a\n {...link}\n className={linkClass}\n onMouseEnter={() => {\n link.onMouseEnter();\n preloadDrive(drive);\n }}\n >\n {getDriveName(drive)}/\n </a>\n }\n type={app?.config.name ?? \"Drive\"}\n modified={formatModified(drive.header.lastModifiedAtUtcIso)}\n />\n );\n}\n\n/** Core's home: an index of the drives. */\nexport function DriveIndex() {\n const drives = useDrives();\n // Empty until the reactor lists its drives, e.g. in the prerendered shell.\n if (!drives) return null;\n return (\n <IndexTable title=\"Index of /\" label=\"Drives\">\n {drives.map((drive) => (\n <DriveRow key={drive.header.id} drive={drive} />\n ))}\n {!drives.length && (\n <tr>\n <td colSpan={3} className=\"py-2 text-core-muted\">\n No drives yet.\n </td>\n </tr>\n )}\n </IndexTable>\n );\n}\n","import {\n logout,\n openRenown,\n useBackendAuth,\n useUser,\n} from \"@powerhousedao/reactor-browser\";\nimport type { BackendAuthGateMode } from \"../runtime/backend-auth-gate.js\";\n\n// The decision lives with the runtime, so a root view outside this chunk\n// (Connect's own) can take it without loading every core view.\nexport { useBackendAuthGate } from \"../runtime/backend-auth-gate.js\";\nexport type { BackendAuthGateMode } from \"../runtime/backend-auth-gate.js\";\n\n/**\n * Full-page gate rendered by the root view in place of the routes when the\n * backend refused the caller. Signing in goes through Renown's redirect, so\n * the page comes back with the user and boots again as them.\n */\nexport function BackendAuthGate({\n mode,\n}: {\n mode: Exclude<BackendAuthGateMode, null>;\n}) {\n const user = useUser();\n const refusal = useBackendAuth();\n const where = refusal?.backend ? ` (${refusal.backend})` : \"\";\n return (\n <div\n role=\"dialog\"\n aria-labelledby=\"backend-auth-gate-title\"\n className=\"flex h-full min-h-[60vh] items-center justify-center p-6\"\n >\n <div className=\"flex w-full max-w-md flex-col gap-4 rounded-lg border border-core-border bg-core-bg p-6 text-core-fg\">\n {mode === \"login\" ? (\n <>\n <h1 id=\"backend-auth-gate-title\" className=\"text-lg font-semibold\">\n Sign in to continue\n </h1>\n <p className=\"text-sm text-core-muted\">\n This server{where} only answers signed-in users. Sign in with\n Renown to open it.\n </p>\n <button\n type=\"button\"\n className=\"self-start rounded border border-core-border px-3 py-1 hover:bg-core-hover\"\n onClick={() => openRenown()}\n >\n Sign in with Renown\n </button>\n </>\n ) : (\n <>\n <h1 id=\"backend-auth-gate-title\" className=\"text-lg font-semibold\">\n This account is not allowed here\n </h1>\n <p className=\"text-sm text-core-muted\">\n You are signed in as{\" \"}\n <code className=\"break-all\">{user?.address}</code>, but this\n server{where} does not accept that account. Ask its admin for\n access, or switch to another account.\n </p>\n <button\n type=\"button\"\n className=\"self-start rounded border border-core-border px-3 py-1 hover:bg-core-hover\"\n onClick={() => {\n void logout().then(() => openRenown());\n }}\n >\n Switch account\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useTheme } from \"@powerhousedao/reactor-browser\";\n\n/** Flips between light and dark; the first flip pins the system theme's opposite. */\nexport function ThemeToggle({ className }: { className?: string }) {\n const { theme, setTheme } = useTheme();\n const next = theme === \"dark\" ? \"light\" : \"dark\";\n return (\n <button\n type=\"button\"\n aria-label={`Switch to ${next} theme`}\n title={`Switch to ${next} theme`}\n className={\n className ??\n \"rounded px-2 py-1 text-core-muted hover:bg-core-hover hover:text-core-fg\"\n }\n onClick={() => setTheme(next)}\n >\n {theme === \"dark\" ? \"☾\" : \"☀\"}\n </button>\n );\n}\n","// Core's modals: the ones editors, drive apps and the reactor open, in core's plain style.\nimport {\n addDocument,\n closePHModal,\n deleteNode,\n exportFile,\n getDocumentUpgradePreview,\n getDriveName,\n getNodeTarget,\n logout,\n openRenown,\n openTarget,\n setSelectedNode,\n showPHModal,\n upgradeDocument,\n useDocumentById,\n useDocumentModelModuleById,\n useModelRegistry,\n useNodeById,\n useNodeParentFolderById,\n usePHModal,\n useRenownAuth,\n useRenownLoginMethods,\n useUser,\n validateDocument,\n} from \"@powerhousedao/reactor-browser\";\nimport type { PHModal } from \"@powerhousedao/reactor-browser\";\nimport type { ReactNode } from \"react\";\nimport { createElement, useEffect, useId, useState } from \"react\";\nimport type { ModalFrameProps } from \"../router/modal-frame.js\";\nimport { ModalDialog, useModalFrame } from \"../router/modal-frame.js\";\nimport { useCreateDocumentTarget } from \"../router/create-target.js\";\nimport { useDriveRouteData } from \"../router/route-data.js\";\n\nconst buttonClass =\n \"rounded border border-core-border px-3 py-1 text-sm hover:bg-core-hover disabled:opacity-50\";\nconst primaryClass = `${buttonClass} font-semibold`;\n\n/** Core's modal frame: title, content, and the buttons on the right. */\nfunction CoreModalFrame({\n title,\n titleId,\n actions,\n children,\n}: ModalFrameProps) {\n return (\n <ModalDialog\n labelledBy={titleId}\n className=\"m-auto w-96 max-w-[calc(100vw-2rem)] rounded border border-core-border bg-core-bg p-5 text-core-fg backdrop:bg-black/30\"\n >\n <h2 id={titleId} className=\"mb-3 text-lg font-semibold\">\n {title}\n </h2>\n <div className=\"flex flex-col gap-2 text-sm\">{children}</div>\n <div className=\"mt-4 flex justify-end gap-2\">{actions}</div>\n </ModalDialog>\n );\n}\n\n/** A modal in the routes' frame, else core's. */\nfunction Dialog(props: {\n title: string;\n children: ReactNode;\n actions?: ReactNode;\n}) {\n const Frame = useModalFrame() ?? CoreModalFrame;\n const titleId = useId();\n const actions = props.actions ?? (\n <button type=\"button\" className={buttonClass} onClick={closePHModal}>\n Close\n </button>\n );\n // A registered frame, not one made here.\n return createElement(Frame, {\n title: props.title,\n titleId,\n actions,\n children: props.children,\n });\n}\n\nconst Cancel = () => (\n <button type=\"button\" className={buttonClass} onClick={closePHModal}>\n Cancel\n </button>\n);\n\nfunction useModal<T extends PHModal[\"type\"]>(type: T) {\n const modal = usePHModal();\n return modal?.type === type\n ? (modal as Extract<PHModal, { type: T }>)\n : undefined;\n}\n\n/** A new document of the modal's type: in its `driveId`, else the open drive\n * and folder, else a drive picked here. */\nexport function CreateDocumentModal() {\n const modal = useModal(\"createDocument\");\n const module = useDocumentModelModuleById(\n modal?.documentType,\n modal?.documentModelVersion,\n );\n const { folder } = useDriveRouteData();\n const target = useCreateDocumentTarget(modal?.driveId);\n const { drive } = target;\n const [name, setName] = useState(\"\");\n const typeName = module?.documentModel.global.name ?? modal?.documentType;\n const create = async () => {\n if (!drive || !module || !modal) return;\n closePHModal();\n const node = await addDocument(\n drive.header.id,\n name.trim() || `New ${typeName}`,\n module.documentModel.global.id,\n target.isOpenDrive ? folder?.id : undefined,\n undefined,\n undefined,\n undefined,\n modal.documentModelVersion,\n );\n // Opens it in its drive, wherever the modal was opened.\n openTarget(getNodeTarget(node, drive));\n };\n return (\n <Dialog\n title={`New ${typeName ?? \"document\"}`}\n actions={\n <>\n <Cancel />\n <button\n type=\"submit\"\n form=\"create-document\"\n className={primaryClass}\n disabled={!drive || !module}\n >\n Create\n </button>\n </>\n }\n >\n <form\n id=\"create-document\"\n className=\"flex flex-col gap-2\"\n onSubmit={(event) => {\n event.preventDefault();\n void create();\n }}\n >\n <label className=\"flex flex-col gap-1\">\n Name\n <input\n autoFocus\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder={`New ${typeName}`}\n className=\"rounded border border-core-border bg-core-bg px-2 py-1\"\n />\n </label>\n {!!target.choices?.length && (\n <label className=\"flex flex-col gap-1\">\n Drive\n <select\n value={drive?.header.id ?? \"\"}\n onChange={(event) => target.pick(event.target.value)}\n className=\"rounded border border-core-border bg-core-bg px-2 py-1\"\n >\n {!drive && <option value=\"\">Choose a drive</option>}\n {target.choices.map((choice) => (\n <option key={choice.header.id} value={choice.header.id}>\n {getDriveName(choice)}\n </option>\n ))}\n </select>\n </label>\n )}\n </form>\n {target.choices?.length === 0 && (\n <p className=\"text-core-muted\">\n There's no drive to create it in.{\" \"}\n <button\n type=\"button\"\n className=\"underline\"\n onClick={() => showPHModal({ type: \"addDrive\" })}\n >\n Add a drive\n </button>\n </p>\n )}\n </Dialog>\n );\n}\n\n/** Signs in with Renown: the configured methods, else its portal. */\nexport function LoginModal() {\n const user = useUser();\n const methods = useRenownLoginMethods();\n const { login, pending, error } = useRenownAuth();\n useEffect(() => {\n if (user) closePHModal();\n }, [user]);\n return (\n <Dialog title=\"Log in\">\n {methods.length ? (\n methods.map((method) => (\n <button\n key={method.id}\n type=\"button\"\n className={buttonClass}\n disabled={pending}\n onClick={() => {\n closePHModal();\n login(undefined, method.id);\n }}\n >\n {method.label}\n </button>\n ))\n ) : (\n <button\n type=\"button\"\n className={primaryClass}\n onClick={() => openRenown()}\n >\n Continue with Renown\n </button>\n )}\n {error && <p className=\"text-core-muted\">{error.message}</p>}\n </Dialog>\n );\n}\n\n/** Deletes a file or folder, then opens its parent. */\nexport function DeleteItemModal() {\n const modal = useModal(\"deleteItem\");\n const node = useNodeById(modal?.id);\n const parent = useNodeParentFolderById(modal?.id);\n const { drive } = useDriveRouteData();\n const remove = async () => {\n closePHModal();\n if (!drive || !modal) return;\n await deleteNode(drive.header.id, modal.id);\n setSelectedNode(parent);\n };\n return (\n <Dialog\n title={`Delete ${node?.name ?? \"item\"}?`}\n actions={\n <>\n <Cancel />\n <button\n type=\"button\"\n className={primaryClass}\n onClick={() => void remove()}\n >\n Delete\n </button>\n </>\n }\n >\n <p>\n {node?.kind === \"folder\"\n ? \"The folder and everything in it will be deleted.\"\n : \"The document will be deleted.\"}\n </p>\n </Dialog>\n );\n}\n\n/** Upgrades a document to its model's latest version. */\nexport function ConfirmDocumentUpgradeModal() {\n const modal = useModal(\"confirmDocumentUpgrade\");\n const [document] = useDocumentById(modal?.documentId);\n const registry = useModelRegistry();\n const preview = document\n ? getDocumentUpgradePreview(document, registry)\n : undefined;\n if (!document || !preview) return null;\n const upgrade = () => {\n closePHModal();\n upgradeDocument(document.header.id).catch((error: unknown) => {\n console.error(\"[connect] the document upgrade failed:\", error);\n });\n };\n return (\n <Dialog\n title=\"Update document\"\n actions={\n <>\n <Cancel />\n <button type=\"button\" className={primaryClass} onClick={upgrade}>\n Update document\n </button>\n </>\n }\n >\n <p>\n From version {preview.fromVersion} to {preview.toVersion}. Existing\n content is migrated; this can't be undone.\n </p>\n {preview.steps\n .filter((step) => step.description)\n .map((step) => (\n <p key={step.toVersion}>\n v{step.toVersion}: {step.description}\n </p>\n ))}\n </Dialog>\n );\n}\n\n/** Exports a document that has validation errors, after listing them. */\nexport function DownloadDocumentWithErrorsModal() {\n const modal = useModal(\"downloadDocumentWithErrors\");\n const [document] = useDocumentById(modal?.documentId);\n if (!document) return null;\n const errors = validateDocument(document);\n const download = () => {\n closePHModal();\n exportFile(document).catch((error: unknown) => {\n console.error(\"[connect] the export failed:\", error);\n });\n };\n return (\n <Dialog\n title=\"The document has errors\"\n actions={\n <>\n <Cancel />\n <button type=\"button\" className={primaryClass} onClick={download}>\n Export anyway\n </button>\n </>\n }\n >\n <ul className=\"list-disc pl-5 text-core-muted\">\n {errors.map((error, index) => (\n <li key={index}>{error.message}</li>\n ))}\n </ul>\n </Dialog>\n );\n}\n\n/** A document whose model version no installed package provides. */\nexport function DocumentVersionUnsupportedModal() {\n const modal = useModal(\"documentVersionUnsupported\");\n if (!modal) return null;\n const { documentType, requiredVersion, availableVersions } = modal;\n return (\n <Dialog\n title=\"Document version not supported\"\n actions={\n <>\n <Cancel />\n <button\n type=\"button\"\n className={primaryClass}\n onClick={() => {\n closePHModal();\n openTarget({ settings: \"packages\" });\n }}\n >\n Show packages\n </button>\n </>\n }\n >\n <p>\n This document needs version {requiredVersion} of \"{documentType}\"; the\n installed packages provide {availableVersions.join(\", \")}.\n </p>\n </Dialog>\n );\n}\n\n/** A protected drive that couldn't be added: sign in, or as someone else. */\nexport function DriveAuthRequiredModal() {\n const user = useUser();\n return (\n <Dialog\n title={user ? \"No access to this drive\" : \"Log in to access this drive\"}\n actions={\n <>\n <Cancel />\n {user ? (\n <button\n type=\"button\"\n className={primaryClass}\n onClick={() => {\n closePHModal();\n void logout();\n }}\n >\n Log out\n </button>\n ) : (\n <button\n type=\"button\"\n className={primaryClass}\n onClick={() => showPHModal({ type: \"login\" })}\n >\n Log in\n </button>\n )}\n </>\n }\n >\n <p>\n {user\n ? \"The account you're signed in with can't open this drive.\"\n : \"This drive is only open to signed-in users.\"}\n </p>\n </Dialog>\n );\n}\n","import {\n initTheme,\n useLinkProps,\n useTheme,\n} from \"@powerhousedao/reactor-browser\";\nimport { HeadContent, Link, Outlet, useRouter } from \"@tanstack/react-router\";\nimport { Suspense } from \"react\";\nimport type { ConnectModals } from \"../router/modals.js\";\nimport { CORE_MODAL_VIEWS, ModalOutlet } from \"../router/modals.js\";\nimport { ContentOutlet } from \"../router/route-components.js\";\nimport { useNavRoutes, useSidebarMode } from \"../router/sidebar.js\";\nimport { appTitle } from \"../router/titles.js\";\nimport { useIsEmbedded } from \"../runtime/embedded.js\";\nimport { ThemeToggle } from \"./theme-toggle.js\";\nimport { linkClass } from \"./index-table.js\";\nimport * as modalViews from \"./modals.js\";\nimport { BackendAuthGate, useBackendAuthGate } from \"./backend-auth-gate.js\";\n\n// The layout shares the modals' chunk, so it renders them directly.\nconst coreModals: ConnectModals = Object.fromEntries(\n Object.entries(CORE_MODAL_VIEWS).map(([type, name]) => [\n type,\n modalViews[name],\n ]),\n);\n\n/** Core's root: the page, in the theme. When the app's backend refused the\n * caller, the sign-in gate stands in for every route, so a shell that\n * replaces core's layout still gets it. */\nexport function CoreRoot() {\n initTheme();\n useTheme();\n const gate = useBackendAuthGate();\n return (\n <div className=\"h-screen overflow-auto bg-core-bg text-core-fg\">\n {/* The matched routes' head: the document title. */}\n <HeadContent />\n <Suspense name=\"CoreRoot\">\n {gate ? <BackendAuthGate mode={gate} /> : <Outlet />}\n </Suspense>\n <ModalOutlet modals={coreModals} />\n </div>\n );\n}\n\n/** Core's header: home, the `staticData.nav` routes, settings and the theme. */\nexport function CoreHeader() {\n const appName = useRouter().options.context.appName;\n const home = useLinkProps(undefined);\n const settings = useLinkProps({ settings: true });\n const navRoutes = useNavRoutes();\n return (\n <header className=\"flex items-center gap-4 border-b border-core-border px-4 py-2 text-sm\">\n <a {...home} className=\"font-semibold text-core-fg\">\n {appTitle(appName)}\n </a>\n <nav aria-label=\"Pages\" className=\"flex gap-3\">\n {navRoutes.map((item) => (\n // `to` is a plain string: the routes are only known at runtime.\n <Link key={item.routeId} to={item.to as never} className={linkClass}>\n {item.label}\n </Link>\n ))}\n </nav>\n <div className=\"ml-auto flex items-center gap-2\">\n <a {...settings} className={linkClass}>\n Settings\n </a>\n <ThemeToggle />\n </div>\n </header>\n );\n}\n\n/** Core's `_app` layout: the header above the matched route. Embedded mode\n * and `staticData.sidebar: \"hidden\"` drop the header. */\nexport function CoreLayout() {\n const isEmbedded = useIsEmbedded();\n const hidden = useSidebarMode() === \"hidden\";\n return (\n <div className=\"flex h-full flex-col\">\n {!isEmbedded && !hidden && <CoreHeader />}\n <main className=\"relative min-h-0 flex-1\">\n <ContentOutlet />\n </main>\n </div>\n );\n}\n","import { useLinkProps } from \"@powerhousedao/reactor-browser\";\nimport { useRouterState } from \"@tanstack/react-router\";\n\n/** The 404 page: what was asked for, and a way home. */\nexport function NotFoundPage({ driveSlug }: { driveSlug?: string }) {\n const pathname = useRouterState({ select: (s) => s.location.pathname });\n const home = useLinkProps(undefined);\n return (\n <div\n role=\"alert\"\n className=\"flex size-full flex-col items-center justify-center gap-3 p-6 text-center\"\n >\n <h1 className=\"text-2xl font-semibold text-core-fg\">\n {driveSlug ? `Drive ${driveSlug} not found` : \"Page not found\"}\n </h1>\n <p className=\"text-core-muted\">\n Nothing is at{\" \"}\n <code data-testid=\"not-found-path\" className=\"text-core-fg\">\n {pathname}\n </code>\n .\n </p>\n <a {...home} className=\"text-core-fg underline\">\n Go to the home page\n </a>\n </div>\n );\n}\n\nexport function DriveNotFoundPage({ driveSlug }: { driveSlug: string }) {\n return <NotFoundPage driveSlug={driveSlug} />;\n}\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\n\n/** A route's loader or render error. */\nexport function CoreRouteError({ error, reset }: ErrorComponentProps) {\n return (\n <div role=\"alert\" className=\"flex flex-col gap-2 p-6 text-core-fg\">\n <h1 className=\"text-lg font-semibold\">Something went wrong</h1>\n <pre className=\"overflow-x-auto text-sm text-core-muted\">\n {error instanceof Error ? error.message : JSON.stringify(error)}\n </pre>\n <button\n type=\"button\"\n className=\"self-start rounded border border-core-border px-3 py-1 hover:bg-core-hover\"\n onClick={reset}\n >\n Try again\n </button>\n </div>\n );\n}\n","import {\n useLinkProps,\n usePHNavigation,\n useTheme,\n} from \"@powerhousedao/reactor-browser\";\nimport { Outlet } from \"@tanstack/react-router\";\nimport { Suspense } from \"react\";\nimport type { SettingsTabEntry } from \"../router/settings.js\";\nimport { useSettingsTabs } from \"../router/settings.js\";\n\nfunction TabLink({ tab }: { tab: SettingsTabEntry }) {\n const link = useLinkProps({ settings: tab.id });\n const current = link[\"aria-current\"] === \"page\";\n const Icon = tab.icon;\n return (\n <a\n {...link}\n className={[\n \"flex items-center gap-2 rounded px-3 py-1.5\",\n current ? \"bg-core-hover font-semibold\" : \"hover:bg-core-hover\",\n tab.destructive ? \"text-core-danger\" : \"text-core-fg\",\n ].join(\" \")}\n >\n {Icon && <Icon size={16} />}\n {tab.label}\n </a>\n );\n}\n\n/** Core's settings page: the tabs from `staticData.settings` beside the open one. */\nexport function CoreSettingsPage() {\n const tabs = useSettingsTabs();\n const navigation = usePHNavigation();\n // Back to where settings was opened from, else home.\n const close = () => {\n if (navigation.closeOpened?.()) return;\n navigation.open(undefined, { replace: true });\n };\n return (\n <div className=\"flex h-full flex-col text-core-fg\">\n <div className=\"flex items-center justify-between border-b border-core-border px-4 py-3\">\n <h1 className=\"text-lg font-semibold\">Settings</h1>\n <button\n type=\"button\"\n className=\"rounded px-2 text-core-muted hover:bg-core-hover\"\n onClick={close}\n >\n Close\n </button>\n </div>\n <div className=\"flex min-h-0 flex-1\">\n <nav aria-label=\"Settings\" className=\"w-48 shrink-0 p-3\">\n <ul className=\"flex flex-col gap-1\">\n {tabs.map((tab) => (\n <li key={tab.id}>\n <TabLink tab={tab} />\n </li>\n ))}\n </ul>\n </nav>\n <section className=\"min-w-0 flex-1 overflow-auto p-6\">\n <Suspense name=\"SettingsTab\">\n <Outlet />\n </Suspense>\n </section>\n </div>\n </div>\n );\n}\n\nconst THEMES = [\n { value: \"light\", label: \"Light\" },\n { value: \"dark\", label: \"Dark\" },\n { value: \"system\", label: \"System\" },\n] as const;\n\n/** Core's Appearance tab: light, dark, or the system's. */\nexport function AppearanceTab() {\n const { theme, isSystem, setTheme } = useTheme();\n const selected = isSystem ? \"system\" : theme;\n return (\n <fieldset className=\"flex flex-col gap-2\">\n <legend className=\"mb-2 font-semibold\">Theme</legend>\n {THEMES.map((option) => (\n <label key={option.value} className=\"flex items-center gap-2\">\n <input\n type=\"radio\"\n name=\"theme\"\n value={option.value}\n checked={selected === option.value}\n onChange={() => setTheme(option.value)}\n />\n {option.label}\n </label>\n ))}\n </fieldset>\n );\n}\n","import {\n DRIVE_DOCUMENT_TYPES,\n useVetraPackageManager,\n useVetraPackages,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n DocumentModelLib,\n EditorModule,\n} from \"@powerhousedao/shared/document-model\";\nimport type { ReactNode } from \"react\";\n\nconst SOURCE_LABELS: Record<string, string> = {\n common: \"built-in\",\n project: \"project\",\n \"local-install\": \"local\",\n \"registry-install\": \"registry\",\n};\n\nconst isDriveApp = (editor: EditorModule) =>\n editor.documentTypes.some((type) =>\n (DRIVE_DOCUMENT_TYPES as readonly string[]).includes(type),\n );\n\n/** A package's document models by type, with every version it ships. */\nfunction modelsOf(pkg: DocumentModelLib) {\n const byType = new Map<string, { name: string; versions: number[] }>();\n for (const model of pkg.documentModels) {\n const { id, name } = model.documentModel.global;\n const entry = byType.get(id) ?? { name, versions: [] };\n entry.versions.push(model.version ?? 1);\n byType.set(id, entry);\n }\n return [...byType].map(([type, { name, versions }]) => ({\n type,\n name,\n versions: versions.sort((a, b) => a - b),\n }));\n}\n\nfunction Section(props: { title: string; children: ReactNode }) {\n return (\n <div className=\"mt-3\">\n <h3 className=\"mb-1 text-xs font-semibold tracking-wide text-core-muted uppercase\">\n {props.title}\n </h3>\n {props.children}\n </div>\n );\n}\n\nconst cell = \"py-1 pr-4 align-top break-words\";\n\nfunction EditorTable(props: { label: string; editors: EditorModule[] }) {\n return (\n <table\n aria-label={props.label}\n className=\"w-full table-fixed border-collapse text-sm\"\n >\n <tbody>\n {props.editors.map((editor) => (\n <tr key={editor.config.id} className=\"border-t border-core-border/50\">\n <td className={`${cell} w-1/3`}>{editor.config.name}</td>\n <td className={`${cell} w-1/3 font-mono text-core-muted`}>\n {editor.config.id}\n </td>\n <td className={`${cell} font-mono`}>\n {editor.documentTypes.join(\", \")}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nfunction PackageEntry({ pkg }: { pkg: DocumentModelLib }) {\n const manager = useVetraPackageManager();\n const name = pkg.manifest.name;\n const version = manager?.getPackageVersion(name);\n const source = manager?.getPackageSource(name);\n const models = modelsOf(pkg);\n const apps = pkg.editors.filter(isDriveApp);\n const editors = pkg.editors.filter((editor) => !isDriveApp(editor));\n return (\n <li\n aria-label={name}\n className=\"rounded border border-core-border px-4 py-3\"\n >\n <div className=\"flex flex-wrap items-baseline gap-x-3\">\n <h2 className=\"font-semibold\">{name}</h2>\n {version && (\n <span className=\"font-mono text-sm text-core-muted\">{version}</span>\n )}\n {source && (\n <span className=\"rounded border border-core-border px-1.5 text-xs text-core-muted\">\n {SOURCE_LABELS[source] ?? source}\n </span>\n )}\n </div>\n {models.length > 0 && (\n <Section title=\"Document models\">\n <table\n aria-label={`${name} document models`}\n className=\"w-full table-fixed border-collapse text-sm\"\n >\n <tbody>\n {models.map((model) => (\n <tr key={model.type} className=\"border-t border-core-border/50\">\n <td className={`${cell} w-1/3`}>{model.name}</td>\n <td className={`${cell} w-1/3 font-mono`}>{model.type}</td>\n <td className={`${cell} text-core-muted`}>\n {model.versions.map((v) => `v${v}`).join(\", \")}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </Section>\n )}\n {editors.length > 0 && (\n <Section title=\"Editors\">\n <EditorTable label={`${name} editors`} editors={editors} />\n </Section>\n )}\n {apps.length > 0 && (\n <Section title=\"Drive apps\">\n <EditorTable label={`${name} drive apps`} editors={apps} />\n </Section>\n )}\n </li>\n );\n}\n\n/** Core's Packages tab: the loaded packages, their document models, editors and drive apps. */\nexport function PackagesTab() {\n const packages = useVetraPackages();\n return (\n <div className=\"w-full max-w-3xl\">\n {packages.length === 0 ? (\n <p className=\"text-core-muted\">No packages are loaded.</p>\n ) : (\n <ul aria-label=\"Packages\" className=\"flex flex-col gap-3\">\n {packages.map((pkg, index) => (\n <PackageEntry key={`${pkg.manifest.name}:${index}`} pkg={pkg} />\n ))}\n </ul>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|