@sqlite-sync/devtools 0.4.3 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -225,6 +225,18 @@ function SQLiteSyncDevtools({ className }) {
225
225
  ]
226
226
  }
227
227
  ),
228
+ /* @__PURE__ */ jsxs(
229
+ "button",
230
+ {
231
+ type: "button",
232
+ style: getTabButtonStyles(activeTab === "live-queries"),
233
+ onClick: () => setActiveTab("live-queries"),
234
+ children: [
235
+ /* @__PURE__ */ jsx("span", { style: navIconStyles, children: "\u25C9" }),
236
+ "Live Queries"
237
+ ]
238
+ }
239
+ ),
228
240
  /* @__PURE__ */ jsxs(
229
241
  "button",
230
242
  {
@@ -264,7 +276,7 @@ function SQLiteSyncDevtools({ className }) {
264
276
  ] })
265
277
  ] })
266
278
  ] }),
267
- /* @__PURE__ */ jsx("div", { style: mainPaneStyles, children: activeTab === "overview" ? /* @__PURE__ */ jsx(OverviewTab, { selectedInstance, dbIdCounts }) : activeTab === "schema" ? /* @__PURE__ */ jsx(SchemaTab, { selectedInstance }) : activeTab === "event-log" ? /* @__PURE__ */ jsx(EventLogTab, { selectedInstance }) : /* @__PURE__ */ jsx(
279
+ /* @__PURE__ */ jsx("div", { style: mainPaneStyles, children: activeTab === "overview" ? /* @__PURE__ */ jsx(OverviewTab, { selectedInstance, dbIdCounts }) : activeTab === "schema" ? /* @__PURE__ */ jsx(SchemaTab, { selectedInstance }) : activeTab === "live-queries" ? /* @__PURE__ */ jsx(LiveQueriesTab, { selectedInstance }) : activeTab === "event-log" ? /* @__PURE__ */ jsx(EventLogTab, { selectedInstance }) : /* @__PURE__ */ jsx(
268
280
  QueryRunnerTab,
269
281
  {
270
282
  selectedInstance,
@@ -473,6 +485,71 @@ function SchemaTab({
473
485
  ] })
474
486
  ] });
475
487
  }
488
+ function LiveQueriesTab({ selectedInstance }) {
489
+ const [queries, setQueries] = useState([]);
490
+ const refresh = useCallback(() => {
491
+ if (!selectedInstance) {
492
+ setQueries([]);
493
+ return;
494
+ }
495
+ setQueries(
496
+ selectedInstance.instance._internal.getSharedLiveQueriesSnapshot().sort(
497
+ (a, b) => a.sql.localeCompare(b.sql) || formatLiveQueryParameters(a.parameters).localeCompare(formatLiveQueryParameters(b.parameters))
498
+ )
499
+ );
500
+ }, [selectedInstance]);
501
+ useEffect(() => {
502
+ refresh();
503
+ }, [refresh]);
504
+ const totalSubscribers = queries.reduce((total, query) => total + query.subscriberCount, 0);
505
+ return /* @__PURE__ */ jsx("div", { style: schemaLayoutStyles, children: /* @__PURE__ */ jsxs("div", { style: schemaSectionStyles, children: [
506
+ /* @__PURE__ */ jsxs("div", { style: schemaSectionHeaderStyles, children: [
507
+ /* @__PURE__ */ jsx("div", { style: schemaSectionTitleStyles, children: "Shared Live Queries" }),
508
+ /* @__PURE__ */ jsx("span", { style: schemaBadgeStyles, children: queries.length }),
509
+ /* @__PURE__ */ jsxs("span", { style: schemaVersionChipStyles, children: [
510
+ totalSubscribers,
511
+ " subscriber",
512
+ totalSubscribers !== 1 ? "s" : ""
513
+ ] }),
514
+ /* @__PURE__ */ jsx(
515
+ "button",
516
+ {
517
+ type: "button",
518
+ style: { ...eventLogRefreshButtonStyles, marginLeft: "auto" },
519
+ onClick: refresh,
520
+ disabled: !selectedInstance,
521
+ children: "\u21BB Refresh"
522
+ }
523
+ )
524
+ ] }),
525
+ queries.length === 0 ? /* @__PURE__ */ jsxs("div", { style: schemaEmptyStyles, children: [
526
+ "No active live queries. Queries created via ",
527
+ /* @__PURE__ */ jsx("code", { style: inlineCodeStyles, children: "useDbQuery" }),
528
+ " appear here while components are subscribed."
529
+ ] }) : /* @__PURE__ */ jsxs("div", { style: schemaTableGridStyles, children: [
530
+ /* @__PURE__ */ jsxs("div", { style: liveQueryHeaderRowStyles, children: [
531
+ /* @__PURE__ */ jsx("div", { style: schemaColHeaderStyles, children: "SQL" }),
532
+ /* @__PURE__ */ jsx("div", { style: schemaColHeaderStyles, children: "Parameters" }),
533
+ /* @__PURE__ */ jsx("div", { style: { ...schemaColHeaderStyles, textAlign: "center" }, children: "Subscribers" })
534
+ ] }),
535
+ queries.map((query) => {
536
+ const parameters = formatLiveQueryParameters(query.parameters);
537
+ return /* @__PURE__ */ jsxs("div", { style: liveQueryRowStyles, children: [
538
+ /* @__PURE__ */ jsx("div", { style: liveQuerySqlStyles, children: query.sql }),
539
+ /* @__PURE__ */ jsx("div", { style: liveQueryParametersStyles, children: parameters }),
540
+ /* @__PURE__ */ jsx("div", { style: schemaStatusCellStyles, children: /* @__PURE__ */ jsx("span", { style: query.subscriberCount > 0 ? schemaActiveTagStyles : liveQueryIdleTagStyles, children: query.subscriberCount }) })
541
+ ] }, `${query.sql}|${parameters}`);
542
+ })
543
+ ] })
544
+ ] }) });
545
+ }
546
+ function formatLiveQueryParameters(parameters) {
547
+ try {
548
+ return JSON.stringify(parameters);
549
+ } catch {
550
+ return String(parameters);
551
+ }
552
+ }
476
553
  var PAGE_SIZE = 50;
477
554
  function buildEventLogQuery(filters, afterSyncId) {
478
555
  const conditions = [];
@@ -1736,6 +1813,47 @@ function getMigrationTagStyles(applied, isCurrent) {
1736
1813
  textAlign: "center"
1737
1814
  };
1738
1815
  }
1816
+ var liveQueryHeaderRowStyles = {
1817
+ display: "grid",
1818
+ gridTemplateColumns: "minmax(0, 1fr) 220px 110px",
1819
+ gap: 0,
1820
+ backgroundColor: C.bgCard,
1821
+ borderBottom: `1px solid ${C.border}`
1822
+ };
1823
+ var liveQueryRowStyles = {
1824
+ display: "grid",
1825
+ gridTemplateColumns: "minmax(0, 1fr) 220px 110px",
1826
+ gap: 0,
1827
+ borderBottom: `1px solid ${C.border}`
1828
+ };
1829
+ var liveQuerySqlStyles = {
1830
+ padding: "0.6rem 0.85rem",
1831
+ fontSize: "0.78rem",
1832
+ fontFamily: "ui-monospace, monospace",
1833
+ color: C.text,
1834
+ borderRight: `1px solid ${C.border}`,
1835
+ whiteSpace: "pre-wrap",
1836
+ overflowWrap: "anywhere"
1837
+ };
1838
+ var liveQueryParametersStyles = {
1839
+ padding: "0.6rem 0.85rem",
1840
+ fontSize: "0.78rem",
1841
+ fontFamily: "ui-monospace, monospace",
1842
+ color: C.textDim,
1843
+ borderRight: `1px solid ${C.border}`,
1844
+ whiteSpace: "pre-wrap",
1845
+ overflowWrap: "anywhere"
1846
+ };
1847
+ var liveQueryIdleTagStyles = {
1848
+ fontSize: "0.68rem",
1849
+ fontWeight: 700,
1850
+ color: C.textMuted,
1851
+ backgroundColor: C.bgCard,
1852
+ border: `1px solid ${C.border}`,
1853
+ borderRadius: "4px",
1854
+ padding: "0.15rem 0.45rem",
1855
+ fontFamily: "ui-monospace, monospace"
1856
+ };
1739
1857
  var eventLogLayoutStyles = {
1740
1858
  display: "flex",
1741
1859
  flexDirection: "column",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/devtools.tsx","../src/devtools-registry.ts"],"sourcesContent":["import type { CSSProperties } from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from \"react\";\nimport {\n getOrCreateSQLiteSyncDevtoolsRegistry,\n type SQLiteSyncDevtoolsInstance,\n type SQLiteSyncDevtoolsSnapshot,\n} from \"./devtools-registry\";\n\ntype SQLiteSyncDevtoolsProps = {\n className?: string;\n};\n\ntype DevtoolsTab = \"overview\" | \"schema\" | \"event-log\" | \"query-runner\";\ntype QueryTarget = \"memory\" | \"worker\";\n\ntype QueryState =\n | {\n status: \"idle\";\n }\n | {\n status: \"running\";\n }\n | {\n status: \"success\";\n output: {\n target: QueryTarget;\n sql: string;\n rowCount: number;\n durationMs: number;\n rows: unknown[];\n };\n }\n | {\n status: \"error\";\n error: {\n target: QueryTarget;\n sql: string;\n message: string;\n };\n };\n\nexport function SQLiteSyncDevtools({ className }: SQLiteSyncDevtoolsProps) {\n const registry = getOrCreateSQLiteSyncDevtoolsRegistry();\n const snapshot = useSyncExternalStore(registry.subscribe, registry.getSnapshot, getEmptySnapshot);\n const instances = snapshot.instances;\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeTab, setActiveTab] = useState<DevtoolsTab>(\"overview\");\n const [selectedInstanceId, setSelectedInstanceId] = useState<string>(\"\");\n const [queryTarget, setQueryTarget] = useState<QueryTarget>(\"memory\");\n const [query, setQuery] = useState(\"\");\n const [queryState, setQueryState] = useState<QueryState>({\n status: \"idle\",\n });\n\n useEffect(() => {\n if (!isOpen) return;\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [isOpen]);\n\n useEffect(() => {\n if (instances.length === 0) {\n setSelectedInstanceId(\"\");\n return;\n }\n\n if (instances.some((instance) => instance.instanceId === selectedInstanceId)) {\n return;\n }\n\n setSelectedInstanceId(instances[0]?.instanceId ?? \"\");\n }, [instances, selectedInstanceId]);\n\n const dbIdCounts = useMemo(() => {\n const counts = new Map<string, number>();\n\n for (const instance of instances) {\n counts.set(instance.dbId, (counts.get(instance.dbId) ?? 0) + 1);\n }\n\n return counts;\n }, [instances]);\n\n const selectedInstance = useMemo(() => {\n return instances.find((instance) => instance.instanceId === selectedInstanceId) ?? null;\n }, [instances, selectedInstanceId]);\n\n const canRunQuery = selectedInstance !== null && query.trim().length > 0 && queryState.status !== \"running\";\n\n const runQuery = async () => {\n if (!selectedInstance) return;\n\n let normalizedQuery = query.trim();\n\n try {\n normalizedQuery = normalizeSingleStatement(query);\n const statementKind = getStatementKind(normalizedQuery);\n\n if (queryTarget === \"worker\") {\n if (!isWorkerReadOnlyStatement(statementKind)) {\n throw new Error(\"Worker DB devtools only allows read-only SQL: SELECT, PRAGMA.\");\n }\n } else {\n const touchedTables = selectedInstance.instance._internal.getMemoryQueryTables(normalizedQuery);\n const writtenTables = touchedTables.filter((table) => table.isWrite).map((table) => table.name);\n const allowedTables = new Set(selectedInstance.instance._internal.crdtTableNames);\n\n const invalidTables = writtenTables.filter((table) => !allowedTables.has(table));\n if (invalidTables.length > 0) {\n throw new Error(\n `Memory DB writes are only allowed for CRDT tables. Rejected tables: ${invalidTables.join(\", \")}`,\n );\n }\n }\n\n setQueryState({ status: \"running\" });\n const startedAt = performance.now();\n\n const result =\n queryTarget === \"memory\"\n ? selectedInstance.instance.db.execute(normalizedQuery)\n : await selectedInstance.instance._internal.executeAsync({\n sql: normalizedQuery,\n parameters: [],\n });\n\n setQueryState({\n status: \"success\",\n output: {\n target: queryTarget,\n sql: normalizedQuery,\n rowCount: result.rows.length,\n durationMs: Number((performance.now() - startedAt).toFixed(2)),\n rows: result.rows,\n },\n });\n } catch (error) {\n setQueryState({\n status: \"error\",\n error: {\n target: queryTarget,\n sql: normalizedQuery,\n message: error instanceof Error ? error.message : String(error),\n },\n });\n }\n };\n\n return (\n <>\n <div style={floatingRootStyles}>\n <button type=\"button\" style={triggerButtonStyles} onClick={() => setIsOpen(true)} title=\"SQLite Sync Devtools\">\n <span style={triggerIconStyles}>◈</span>\n <span style={triggerCountStyles}>{instances.length}</span>\n </button>\n </div>\n\n {isOpen ? (\n <div style={overlayStyles} onClick={() => setIsOpen(false)}>\n <section\n className={className}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"SQLite Sync devtools\"\n style={dialogStyles}\n onClick={(event) => event.stopPropagation()}\n >\n {/* Dialog header */}\n <div style={headerStyles}>\n <div style={headerLeftStyles}>\n <span style={headerLogoStyles}>◈</span>\n <div>\n <div style={eyebrowStyles}>sqlite-sync</div>\n <h2 style={titleStyles}>Devtools</h2>\n </div>\n </div>\n\n <div style={headerRightStyles}>\n {instances.length > 0 && (\n <label style={instancePickerLabelStyles}>\n <span style={instancePickerTextStyles}>DB</span>\n <select\n value={selectedInstanceId}\n onChange={(event) => setSelectedInstanceId(event.target.value)}\n style={instancePickerSelectStyles}\n >\n {instances.map((instance) => (\n <option key={instance.instanceId} value={instance.instanceId}>\n {formatInstanceLabel(instance.dbId, instance.instanceId, dbIdCounts.get(instance.dbId) ?? 0)}\n </option>\n ))}\n </select>\n </label>\n )}\n <span style={instanceCountBadgeStyles}>\n {instances.length} instance{instances.length !== 1 ? \"s\" : \"\"}\n </span>\n <button type=\"button\" style={closeButtonStyles} onClick={() => setIsOpen(false)} aria-label=\"Close\">\n ✕\n </button>\n </div>\n </div>\n\n {instances.length === 0 ? (\n <div style={emptyStateStyles}>\n <div style={emptyStateIconStyles}>◈</div>\n <p style={emptyStateTextStyles}>No SQLite Sync database instances registered.</p>\n <p style={emptyStateSubtextStyles}>\n Call <code style={inlineCodeStyles}>registerDevtools(db)</code> in your app to get started.\n </p>\n </div>\n ) : (\n <div style={contentLayoutStyles}>\n {/* Sidebar nav */}\n <aside style={sidebarStyles}>\n <nav style={navStyles}>\n <button\n type=\"button\"\n style={getTabButtonStyles(activeTab === \"overview\")}\n onClick={() => setActiveTab(\"overview\")}\n >\n <span style={navIconStyles}>▦</span>\n Overview\n </button>\n <button\n type=\"button\"\n style={getTabButtonStyles(activeTab === \"schema\")}\n onClick={() => setActiveTab(\"schema\")}\n >\n <span style={navIconStyles}>⬡</span>\n Schema\n </button>\n <button\n type=\"button\"\n style={getTabButtonStyles(activeTab === \"event-log\")}\n onClick={() => setActiveTab(\"event-log\")}\n >\n <span style={navIconStyles}>≡</span>\n Event Log\n </button>\n <button\n type=\"button\"\n style={getTabButtonStyles(activeTab === \"query-runner\")}\n onClick={() => setActiveTab(\"query-runner\")}\n >\n <span style={navIconStyles}>▶</span>\n Query Runner\n </button>\n </nav>\n\n {selectedInstance && (\n <div style={sidebarInfoStyles}>\n <div style={sidebarInfoLabelStyles}>Active instance</div>\n <div style={sidebarInfoValueStyles}>\n {formatInstanceLabel(\n selectedInstance.dbId,\n selectedInstance.instanceId,\n dbIdCounts.get(selectedInstance.dbId) ?? 0,\n )}\n </div>\n <div style={sidebarInfoSubStyles}>id: {selectedInstance.instanceId.slice(0, 12)}…</div>\n </div>\n )}\n </aside>\n\n {/* Main pane */}\n <div style={mainPaneStyles}>\n {activeTab === \"overview\" ? (\n <OverviewTab selectedInstance={selectedInstance} dbIdCounts={dbIdCounts} />\n ) : activeTab === \"schema\" ? (\n <SchemaTab selectedInstance={selectedInstance} />\n ) : activeTab === \"event-log\" ? (\n <EventLogTab selectedInstance={selectedInstance} />\n ) : (\n <QueryRunnerTab\n selectedInstance={selectedInstance}\n queryTarget={queryTarget}\n setQueryTarget={setQueryTarget}\n query={query}\n setQuery={setQuery}\n queryState={queryState}\n canRunQuery={canRunQuery}\n runQuery={runQuery}\n />\n )}\n </div>\n </div>\n )}\n </section>\n </div>\n ) : null}\n </>\n );\n}\n\nconst EVENT_HLC_ACCUMULATOR_KV_KEY = \"crdt.consistency.event_hlc_sum.v2\";\nconst EVENT_HLC_ACCUMULATOR_QUERY = `SELECT value FROM \"worker\".\"kv\" WHERE key = '${EVENT_HLC_ACCUMULATOR_KV_KEY}'`;\n\nfunction OverviewTab({\n selectedInstance,\n dbIdCounts,\n}: {\n selectedInstance: ReturnType<typeof getOrCreateSQLiteSyncDevtoolsRegistry>[\"getSnapshot\"] extends () => {\n instances: infer I;\n }\n ? I extends readonly (infer T)[]\n ? T | null\n : never\n : never;\n dbIdCounts: Map<string, number>;\n}) {\n const [eventHlcAccumulator, setEventHlcAccumulator] = useState<string | null>(null);\n const [accumulatorError, setAccumulatorError] = useState<string | null>(null);\n const [isAccumulatorLoading, setIsAccumulatorLoading] = useState(false);\n\n const refreshEventHlcAccumulator = useCallback(async () => {\n if (!selectedInstance) return;\n setIsAccumulatorLoading(true);\n setAccumulatorError(null);\n try {\n const result = await selectedInstance.instance._internal.executeAsync({\n sql: EVENT_HLC_ACCUMULATOR_QUERY,\n parameters: [],\n });\n const row = result.rows[0] as { value?: string } | undefined;\n setEventHlcAccumulator(row?.value ?? \"\");\n } catch (error) {\n setAccumulatorError(error instanceof Error ? error.message : String(error));\n setEventHlcAccumulator(null);\n } finally {\n setIsAccumulatorLoading(false);\n }\n }, [selectedInstance]);\n\n useEffect(() => {\n setEventHlcAccumulator(null);\n setAccumulatorError(null);\n void refreshEventHlcAccumulator();\n }, [refreshEventHlcAccumulator]);\n\n if (!selectedInstance) return null;\n\n const label = formatInstanceLabel(\n selectedInstance.dbId,\n selectedInstance.instanceId,\n dbIdCounts.get(selectedInstance.dbId) ?? 0,\n );\n\n const crdtTables = selectedInstance.instance._internal.crdtTableNames;\n\n return (\n <div style={overviewLayoutStyles}>\n <div style={overviewCardsRowStyles}>\n <div style={overviewCardStyles}>\n <div style={overviewCardLabelStyles}>Database</div>\n <div style={overviewCardValueStyles}>{label}</div>\n </div>\n <div style={overviewCardStyles}>\n <div style={overviewCardLabelStyles}>Instance ID</div>\n <div style={{ ...overviewCardValueStyles, fontFamily: \"ui-monospace, monospace\", fontSize: \"0.78rem\" }}>\n {selectedInstance.instanceId.slice(0, 16)}…\n </div>\n </div>\n <div style={overviewCardStyles}>\n <div style={overviewCardLabelStyles}>CRDT Tables</div>\n <div style={overviewCardValueStyles}>{crdtTables.length}</div>\n </div>\n </div>\n\n <div style={overviewSectionStyles}>\n <div style={overviewSectionTitleStyles}>CRDT Tables</div>\n {crdtTables.length === 0 ? (\n <div style={overviewEmptyStyles}>No CRDT tables registered.</div>\n ) : (\n <div style={crdtTableListStyles}>\n {[...crdtTables].map((name) => (\n <div key={name} style={crdtTableRowStyles}>\n <span style={crdtTableIconStyles}>▦</span>\n <span style={crdtTableNameStyles}>{name}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <div style={overviewSectionStyles}>\n <div style={overviewSectionHeaderStyles}>\n <div style={overviewSectionTitleStyles}>Event HLC accumulator</div>\n <button\n type=\"button\"\n style={overviewRefreshButtonStyles}\n disabled={isAccumulatorLoading}\n onClick={() => void refreshEventHlcAccumulator()}\n >\n {isAccumulatorLoading ? \"…\" : \"↻\"} Refresh\n </button>\n </div>\n <div style={overviewAccumulatorValueStyles}>\n {accumulatorError ? (\n <span style={overviewAccumulatorErrorStyles}>{accumulatorError}</span>\n ) : isAccumulatorLoading && eventHlcAccumulator === null ? (\n \"Loading…\"\n ) : eventHlcAccumulator === \"\" ? (\n <span style={overviewAccumulatorEmptyStyles}>(empty)</span>\n ) : (\n eventHlcAccumulator\n )}\n </div>\n </div>\n\n <div style={overviewSectionStyles}>\n <div style={overviewSectionTitleStyles}>Write Permissions</div>\n <div style={permissionRowStyles}>\n <span style={permissionIconStyles}>✓</span>\n <span style={permissionTextStyles}>Memory DB — CRDT tables only</span>\n </div>\n <div style={permissionRowStyles}>\n <span style={{ ...permissionIconStyles, color: \"#f59e0b\" }}>⊘</span>\n <span style={permissionTextStyles}>Worker DB — read-only (SELECT, PRAGMA, EXPLAIN)</span>\n </div>\n </div>\n\n <ResetSection dbId={selectedInstance.dbId} instance={selectedInstance.instance} />\n </div>\n );\n}\n\nfunction ResetSection({ dbId, instance }: { dbId: string; instance: SQLiteSyncDevtoolsInstance[\"instance\"] }) {\n const [confirming, setConfirming] = useState(false);\n const [isResetting, setIsResetting] = useState(false);\n\n const handleReset = () => {\n setIsResetting(true);\n // Worker-owned clean reset: durably records a reset epoch, broadcasts a\n // reload to all tabs, and the next elected worker wipes the persisted DB.\n // The promise may never settle — the page unloads first.\n void instance.requestReload({ clean: true });\n };\n\n return (\n <div style={dangerZoneStyles}>\n <div style={dangerZoneTitleStyles}>Danger Zone</div>\n <div style={dangerZoneRowStyles}>\n <div style={dangerZoneDescStyles}>\n Requests a clean reload, so <code style={inlineCodeStyles}>{dbId}</code> is wiped on next load via{\" \"}\n <code style={inlineCodeStyles}>clearOnInit</code>, then reloads all tabs.\n </div>\n {confirming ? (\n <div style={dangerZoneActionsStyles}>\n <button\n type=\"button\"\n style={resetCancelButtonStyles}\n disabled={isResetting}\n onClick={() => setConfirming(false)}\n >\n Cancel\n </button>\n <button type=\"button\" style={resetConfirmButtonStyles} disabled={isResetting} onClick={handleReset}>\n {isResetting ? \"Resetting…\" : \"Confirm reset\"}\n </button>\n </div>\n ) : (\n <button type=\"button\" style={resetButtonStyles} onClick={() => setConfirming(true)}>\n Reset DB\n </button>\n )}\n </div>\n </div>\n );\n}\n\nfunction SchemaTab({\n selectedInstance,\n}: {\n selectedInstance: ReturnType<typeof getOrCreateSQLiteSyncDevtoolsRegistry>[\"getSnapshot\"] extends () => {\n instances: infer I;\n }\n ? I extends readonly (infer T)[]\n ? T | null\n : never\n : never;\n}) {\n if (!selectedInstance) return null;\n\n const { crdtTablesConfig, schemaVersion, migrationVersions } = selectedInstance.instance._internal;\n const latestVersion = migrationVersions.at(-1) ?? 0;\n\n return (\n <div style={schemaLayoutStyles}>\n {/* CRDT Tables */}\n <div style={schemaSectionStyles}>\n <div style={schemaSectionHeaderStyles}>\n <div style={schemaSectionTitleStyles}>CRDT Tables</div>\n <span style={schemaBadgeStyles}>{crdtTablesConfig.length}</span>\n </div>\n <div style={schemaTableGridStyles}>\n <div style={schemaTableHeaderRowStyles}>\n <div style={schemaColHeaderStyles}>Base Table</div>\n <div style={schemaColHeaderStyles}>CRDT Table</div>\n <div style={{ ...schemaColHeaderStyles, textAlign: \"center\" }}>Status</div>\n </div>\n {crdtTablesConfig.map((table) => (\n <div key={table.crdtTableName} style={schemaTableRowStyles}>\n <div style={schemaTableNameStyles}>\n <span style={schemaTableIconStyles}>▦</span>\n {table.baseTableName}\n </div>\n <div style={schemaCrdtNameStyles}>{table.crdtTableName}</div>\n <div style={schemaStatusCellStyles}>\n <span style={schemaActiveTagStyles}>active</span>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Migrations */}\n <div style={schemaSectionStyles}>\n <div style={schemaSectionHeaderStyles}>\n <div style={schemaSectionTitleStyles}>Migrations</div>\n <div style={schemaMigrationsMetaStyles}>\n <span style={schemaBadgeStyles}>{migrationVersions.length} total</span>\n <span style={schemaVersionChipStyles}>\n current: v{schemaVersion} / latest: v{latestVersion}\n </span>\n </div>\n </div>\n {migrationVersions.length === 0 ? (\n <div style={schemaEmptyStyles}>No migrations defined.</div>\n ) : (\n <div style={migrationListStyles}>\n {migrationVersions.map((version) => {\n const applied = version <= schemaVersion;\n const isCurrent = version === schemaVersion;\n return (\n <div key={version} style={getMigrationRowStyles(applied)}>\n <div style={migrationVersionStyles}>v{version}</div>\n <div style={migrationBarTrackStyles}>\n <div style={getMigrationBarFillStyles(applied)} />\n </div>\n <div style={getMigrationTagStyles(applied, isCurrent)}>\n {isCurrent ? \"current\" : applied ? \"applied\" : \"pending\"}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n\ntype PersistedCrdtEvent = {\n sync_id: number;\n schema_version: number;\n status: \"pending\" | \"applied\" | \"failed\" | \"deduped\";\n type: \"item-created\" | \"item-updated\" | \"item-deleted\";\n timestamp: string;\n origin: \"remote\" | \"own\" | \"local\";\n source_node_id: string;\n dataset: string;\n item_id: string;\n payload: string;\n};\n\ntype EventLogFilters = {\n dataset: string;\n origin: string;\n status: string;\n};\n\nconst PAGE_SIZE = 50;\n\nfunction buildEventLogQuery(filters: EventLogFilters, afterSyncId: number | null): string {\n const conditions: string[] = [];\n\n if (filters.dataset) conditions.push(`dataset = '${filters.dataset}'`);\n if (filters.origin) conditions.push(`origin = '${filters.origin}'`);\n if (filters.status) conditions.push(`status = '${filters.status}'`);\n if (afterSyncId !== null) conditions.push(`sync_id < ${afterSyncId}`);\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n return `SELECT * FROM \"worker\".\"crdt_events\" ${where} ORDER BY sync_id DESC LIMIT ${PAGE_SIZE + 1}`;\n}\n\nfunction EventLogTab({\n selectedInstance,\n}: {\n selectedInstance: ReturnType<typeof getOrCreateSQLiteSyncDevtoolsRegistry>[\"getSnapshot\"] extends () => {\n instances: infer I;\n }\n ? I extends readonly (infer T)[]\n ? T | null\n : never\n : never;\n}) {\n const baseTableNames = useMemo(\n () => selectedInstance?.instance._internal.crdtTablesConfig.map((table) => table.baseTableName) ?? [],\n [selectedInstance],\n );\n\n const [filters, setFilters] = useState<EventLogFilters>({ dataset: \"\", origin: \"\", status: \"\" });\n const [events, setEvents] = useState<PersistedCrdtEvent[]>([]);\n const [hasMore, setHasMore] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [expandedId, setExpandedId] = useState<number | null>(null);\n const afterSyncIdRef = useRef<number | null>(null);\n const isLoadingRef = useRef(false);\n\n const executeQuery = useCallback(\n async (sql: string): Promise<PersistedCrdtEvent[]> => {\n if (!selectedInstance) return [];\n const result = await selectedInstance.instance._internal.executeAsync({ sql, parameters: [] });\n return result.rows as PersistedCrdtEvent[];\n },\n [selectedInstance],\n );\n\n const load = useCallback(\n async (reset: boolean, currentFilters: EventLogFilters) => {\n if (!selectedInstance || isLoadingRef.current) return;\n isLoadingRef.current = true;\n setIsLoading(true);\n try {\n const afterSyncId = reset ? null : afterSyncIdRef.current;\n const sql = buildEventLogQuery(currentFilters, afterSyncId);\n const rows = await executeQuery(sql);\n const page = rows.slice(0, PAGE_SIZE);\n setHasMore(rows.length > PAGE_SIZE);\n if (reset) {\n setEvents(page);\n } else {\n setEvents((prev) => [...prev, ...page]);\n }\n afterSyncIdRef.current = page.at(-1)?.sync_id ?? null;\n } finally {\n isLoadingRef.current = false;\n setIsLoading(false);\n }\n },\n [selectedInstance, executeQuery],\n );\n\n // Initial load and reload on instance or filter change\n useEffect(() => {\n afterSyncIdRef.current = null;\n setEvents([]);\n void load(true, filters);\n }, [filters, load]);\n\n const applyFilters = (next: EventLogFilters) => {\n setFilters(next);\n };\n\n if (!selectedInstance) return null;\n\n return (\n <div style={eventLogLayoutStyles}>\n {/* Toolbar */}\n <div style={eventLogToolbarStyles}>\n <select\n value={filters.dataset}\n onChange={(e) => applyFilters({ ...filters, dataset: e.target.value })}\n style={eventLogFilterSelectStyles}\n >\n <option value=\"\">All datasets</option>\n {baseTableNames.map((name) => (\n <option key={name} value={name}>\n {name}\n </option>\n ))}\n </select>\n <select\n value={filters.origin}\n onChange={(e) => applyFilters({ ...filters, origin: e.target.value })}\n style={eventLogFilterSelectStyles}\n >\n <option value=\"\">All origins</option>\n <option value=\"own\">own</option>\n <option value=\"remote\">remote</option>\n <option value=\"local\">local</option>\n </select>\n <select\n value={filters.status}\n onChange={(e) => applyFilters({ ...filters, status: e.target.value })}\n style={eventLogFilterSelectStyles}\n >\n <option value=\"\">All statuses</option>\n <option value=\"applied\">applied</option>\n <option value=\"pending\">pending</option>\n <option value=\"failed\">failed</option>\n <option value=\"deduped\">deduped</option>\n </select>\n <button\n type=\"button\"\n style={eventLogRefreshButtonStyles}\n disabled={isLoading}\n onClick={() => void load(true, filters)}\n >\n {isLoading ? \"…\" : \"↻\"} Refresh\n </button>\n {events.length > 0 && (\n <span style={eventLogCountStyles}>\n {events.length}\n {hasMore ? \"+\" : \"\"} events\n </span>\n )}\n </div>\n\n {/* Event list */}\n {events.length === 0 && !isLoading ? (\n <div style={eventLogEmptyStyles}>No events match the current filters.</div>\n ) : (\n <div style={eventLogListStyles}>\n {events.map((event) => {\n const isExpanded = expandedId === event.sync_id;\n return (\n <div key={event.sync_id} style={getEventRowStyles(isExpanded)}>\n <button\n type=\"button\"\n style={eventRowHeaderStyles}\n onClick={() => setExpandedId(isExpanded ? null : event.sync_id)}\n >\n <span style={eventSyncIdStyles}>#{event.sync_id}</span>\n <EventTypeBadge type={event.type} />\n <EventOriginBadge origin={event.origin} />\n <EventStatusBadge status={event.status} />\n <span style={eventDatasetStyles}>{event.dataset}</span>\n <span style={eventItemIdStyles}>{event.item_id}</span>\n <span style={eventTimestampStyles}>{formatHlcTimestamp(event.timestamp)}</span>\n <span style={eventChevronStyles}>{isExpanded ? \"▲\" : \"▼\"}</span>\n </button>\n\n {isExpanded && (\n <div style={eventPayloadStyles}>\n <div style={eventPayloadMetaStyles}>\n <span style={eventMetaItemStyles}>schema v{event.schema_version}</span>\n <span style={eventMetaItemStyles}>node: {event.source_node_id || \"—\"}</span>\n <span style={eventMetaItemStyles}>ts: {event.timestamp}</span>\n </div>\n <pre style={eventPayloadPreStyles}>{formatPayload(event.payload)}</pre>\n </div>\n )}\n </div>\n );\n })}\n\n {hasMore && (\n <button\n type=\"button\"\n style={loadMoreButtonStyles}\n disabled={isLoading}\n onClick={() => void load(false, filters)}\n >\n {isLoading ? \"Loading…\" : `Load ${PAGE_SIZE} more`}\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction EventTypeBadge({ type }: { type: string }) {\n const { style, label } =\n type === \"item-created\"\n ? { style: eventTypeCreateStyles, label: \"create\" }\n : type === \"item-deleted\"\n ? { style: eventTypeDeleteStyles, label: \"delete\" }\n : { style: eventTypeUpdateStyles, label: \"update\" };\n return <span style={style}>{label}</span>;\n}\n\nfunction EventOriginBadge({ origin }: { origin: string }) {\n const style =\n origin === \"own\" ? eventOriginOwnStyles : origin === \"remote\" ? eventOriginRemoteStyles : eventOriginLocalStyles;\n return <span style={style}>{origin}</span>;\n}\n\nfunction EventStatusBadge({ status }: { status: string }) {\n const style =\n status === \"applied\"\n ? eventStatusAppliedStyles\n : status === \"pending\"\n ? eventStatusPendingStyles\n : status === \"failed\"\n ? eventStatusFailedStyles\n : eventStatusSkippedStyles;\n return <span style={style}>{status}</span>;\n}\n\nfunction formatHlcTimestamp(ts: string): string {\n // HLC format: \"<unix_ms>-<counter>-<node>\" or just an ISO string\n const ms = Number(ts.split(\"-\")[0]);\n if (!Number.isNaN(ms) && ms > 1e12) {\n return new Date(ms).toLocaleTimeString();\n }\n return ts.slice(0, 19).replace(\"T\", \" \");\n}\n\nfunction formatPayload(raw: string): string {\n try {\n return JSON.stringify(JSON.parse(raw), null, 2);\n } catch {\n return raw;\n }\n}\n\nfunction QueryRunnerTab({\n selectedInstance,\n queryTarget,\n setQueryTarget,\n query,\n setQuery,\n queryState,\n canRunQuery,\n runQuery,\n}: {\n selectedInstance: unknown;\n queryTarget: QueryTarget;\n setQueryTarget: (t: QueryTarget) => void;\n query: string;\n setQuery: (q: string) => void;\n queryState: QueryState;\n canRunQuery: boolean;\n runQuery: () => Promise<void>;\n}) {\n return (\n <div style={queryRunnerLayoutStyles}>\n {/* Top toolbar */}\n <div style={queryToolbarStyles}>\n <div style={targetToggleStyles}>\n <button\n type=\"button\"\n style={getTargetButtonStyles(queryTarget === \"memory\")}\n onClick={() => setQueryTarget(\"memory\")}\n >\n Memory DB\n </button>\n <button\n type=\"button\"\n style={getTargetButtonStyles(queryTarget === \"worker\")}\n onClick={() => setQueryTarget(\"worker\")}\n >\n Worker DB\n </button>\n </div>\n\n <div style={queryToolbarRightStyles}>\n {!selectedInstance && <span style={noInstanceWarningStyles}>No instance selected</span>}\n <span style={shortcutHintStyles}>⌘↵ to run</span>\n <button\n type=\"button\"\n style={runButtonStyles(canRunQuery, queryState.status === \"running\")}\n disabled={!canRunQuery}\n onClick={() => void runQuery()}\n >\n {queryState.status === \"running\" ? (\n <>\n <span style={runningDotStyles} />\n Running…\n </>\n ) : (\n <>▶ Run</>\n )}\n </button>\n </div>\n </div>\n\n {/* SQL textarea */}\n <div style={editorWrapperStyles}>\n <textarea\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === \"Enter\" && canRunQuery) {\n event.preventDefault();\n void runQuery();\n }\n }}\n style={textareaStyles}\n placeholder=\"SELECT * FROM your_table LIMIT 100\"\n spellCheck={false}\n />\n </div>\n\n {/* Constraint hint */}\n <div style={helperTextStyles}>\n {queryTarget === \"worker\"\n ? \"Worker DB is read-only — only SELECT, PRAGMA, and EXPLAIN are allowed.\"\n : \"Memory DB allows writes only to CRDT tables.\"}\n </div>\n\n {/* Results */}\n {queryState.status === \"error\" && (\n <div style={errorPanelStyles}>\n <div style={resultHeaderStyles}>\n <span style={errorBadgeStyles}>Error</span>\n <span style={resultMetaStyles}>\n {queryState.error.target} · {queryState.error.sql}\n </span>\n </div>\n <pre style={errorMessageStyles}>{queryState.error.message}</pre>\n </div>\n )}\n\n {queryState.status === \"success\" && (\n <div style={resultPanelStyles}>\n <div style={resultHeaderStyles}>\n <span style={successBadgeStyles}>\n {queryState.output.rowCount} row{queryState.output.rowCount !== 1 ? \"s\" : \"\"}\n </span>\n <span style={resultMetaStyles}>\n {queryState.output.target} · {queryState.output.durationMs}ms\n </span>\n </div>\n <ResultTable rows={queryState.output.rows} />\n </div>\n )}\n </div>\n );\n}\n\nfunction ResultTable({ rows }: { rows: unknown[] }) {\n if (rows.length === 0) {\n return <div style={resultEmptyStyles}>Query returned 0 rows.</div>;\n }\n\n const firstRow = rows[0];\n if (typeof firstRow !== \"object\" || firstRow === null) {\n return <pre style={resultRawStyles}>{JSON.stringify(rows, null, 2)}</pre>;\n }\n\n const columns = Object.keys(firstRow as object);\n\n return (\n <div style={tableWrapperStyles}>\n <table style={tableStyles}>\n <thead>\n <tr>\n <th style={thRowNumStyles}>#</th>\n {columns.map((col) => (\n <th key={col} style={thStyles}>\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIdx) => (\n <tr key={rowIdx} style={rowIdx % 2 === 0 ? trStyles : trAltStyles}>\n <td style={tdRowNumStyles}>{rowIdx + 1}</td>\n {columns.map((col) => {\n const val = (row as Record<string, unknown>)[col];\n return (\n <td key={col} style={tdStyles}>\n {val === null ? (\n <span style={nullValueStyles}>NULL</span>\n ) : typeof val === \"object\" ? (\n <span style={jsonValueStyles}>{JSON.stringify(val)}</span>\n ) : (\n String(val)\n )}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatInstanceLabel(dbId: string, instanceId: string, duplicateCount: number): string {\n if (duplicateCount < 2) {\n return dbId;\n }\n\n return `${dbId} (${instanceId.slice(0, 6)})`;\n}\n\nfunction normalizeSingleStatement(query: string): string {\n const trimmed = query.trim();\n if (!trimmed) {\n throw new Error(\"Enter a SQL statement.\");\n }\n\n const withoutTrailingSemicolons = trimmed.replace(/;+\\s*$/u, \"\");\n if (withoutTrailingSemicolons.includes(\";\")) {\n throw new Error(\"Devtools only supports a single SQL statement.\");\n }\n\n return withoutTrailingSemicolons;\n}\n\nfunction getStatementKind(query: string): string {\n const match = query.trimStart().match(/^([a-z]+)/iu);\n return match?.[1]?.toLowerCase() ?? \"\";\n}\n\nfunction isWorkerReadOnlyStatement(statementKind: string): boolean {\n return statementKind === \"select\" || statementKind === \"pragma\";\n}\n\nfunction getEmptySnapshot(): SQLiteSyncDevtoolsSnapshot {\n return emptySnapshot;\n}\n\nconst emptySnapshot: SQLiteSyncDevtoolsSnapshot = {\n instances: [],\n};\n\n// ─── Styles ───────────────────────────────────────────────────────────────────\n\nconst C = {\n bg: \"#0e1015\",\n bgPanel: \"#161921\",\n bgCard: \"#1c2030\",\n bgInput: \"#111318\",\n border: \"#2a2f3e\",\n borderLight: \"#343a4f\",\n text: \"#e2e8f0\",\n textMuted: \"#6b7280\",\n textDim: \"#9ca3af\",\n teal: \"#2dd4bf\",\n tealDim: \"rgba(45,212,191,0.12)\",\n tealGlow: \"rgba(45,212,191,0.06)\",\n error: \"#f87171\",\n errorBg: \"rgba(248,113,113,0.08)\",\n errorBorder: \"rgba(248,113,113,0.25)\",\n success: \"#34d399\",\n successBg: \"rgba(52,211,153,0.08)\",\n amber: \"#fbbf24\",\n};\n\nconst floatingRootStyles: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 9998,\n};\n\nconst triggerButtonStyles: CSSProperties = {\n position: \"absolute\",\n right: \"16px\",\n bottom: \"16px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.3rem\",\n border: `1px solid ${C.border}`,\n borderRadius: \"8px\",\n padding: \"0.3rem 0.45rem\",\n background: C.bgPanel,\n color: C.text,\n boxShadow: `0 0 0 1px ${C.border}, 0 4px 16px rgba(0,0,0,0.5)`,\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n};\n\nconst triggerIconStyles: CSSProperties = {\n color: C.teal,\n fontSize: \"0.9rem\",\n lineHeight: 1,\n};\n\nconst triggerCountStyles: CSSProperties = {\n minWidth: \"1.1rem\",\n borderRadius: \"4px\",\n padding: \"0.05rem 0.25rem\",\n backgroundColor: C.tealDim,\n color: C.teal,\n fontSize: \"0.65rem\",\n fontWeight: 700,\n textAlign: \"center\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst overlayStyles: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 9999,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"1.5rem\",\n backgroundColor: \"rgba(0,0,0,0.72)\",\n backdropFilter: \"blur(8px)\",\n};\n\nconst dialogStyles: CSSProperties = {\n width: \"min(72rem, 100%)\",\n height: \"min(90vh, 860px)\",\n display: \"flex\",\n flexDirection: \"column\",\n border: `1px solid ${C.border}`,\n borderRadius: \"16px\",\n background: C.bg,\n boxShadow: `0 0 0 1px ${C.border}, 0 40px 80px rgba(0,0,0,0.8), 0 0 60px rgba(45,212,191,0.04)`,\n overflow: \"hidden\",\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n color: C.text,\n fontSize: \"0.88rem\",\n};\n\nconst headerStyles: CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"1rem\",\n padding: \"0.85rem 1.1rem\",\n borderBottom: `1px solid ${C.border}`,\n background: C.bgPanel,\n flexShrink: 0,\n};\n\nconst headerLeftStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n};\n\nconst headerLogoStyles: CSSProperties = {\n fontSize: \"1.3rem\",\n color: C.teal,\n lineHeight: 1,\n};\n\nconst eyebrowStyles: CSSProperties = {\n fontSize: \"0.65rem\",\n fontWeight: 600,\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst titleStyles: CSSProperties = {\n margin: \"0.05rem 0 0\",\n fontSize: \"0.95rem\",\n fontWeight: 700,\n color: C.text,\n letterSpacing: \"-0.01em\",\n};\n\nconst headerRightStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.6rem\",\n};\n\nconst instancePickerLabelStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n};\n\nconst instancePickerTextStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n fontWeight: 600,\n color: C.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.06em\",\n};\n\nconst instancePickerSelectStyles: CSSProperties = {\n borderRadius: \"7px\",\n border: `1px solid ${C.border}`,\n padding: \"0.35rem 0.6rem\",\n backgroundColor: C.bgCard,\n color: C.text,\n fontSize: \"0.82rem\",\n fontFamily: \"ui-monospace, monospace\",\n cursor: \"pointer\",\n};\n\nconst instanceCountBadgeStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n fontWeight: 600,\n color: C.teal,\n backgroundColor: C.tealDim,\n borderRadius: \"5px\",\n padding: \"0.2rem 0.5rem\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst closeButtonStyles: CSSProperties = {\n border: `1px solid ${C.border}`,\n borderRadius: \"7px\",\n width: \"28px\",\n height: \"28px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"transparent\",\n color: C.textMuted,\n fontSize: \"0.82rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n};\n\nconst emptyStateStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"4rem 2rem\",\n gap: \"0.75rem\",\n flex: 1,\n};\n\nconst emptyStateIconStyles: CSSProperties = {\n fontSize: \"2.5rem\",\n color: C.textMuted,\n opacity: 0.4,\n};\n\nconst emptyStateTextStyles: CSSProperties = {\n margin: 0,\n fontSize: \"0.95rem\",\n fontWeight: 600,\n color: C.textDim,\n};\n\nconst emptyStateSubtextStyles: CSSProperties = {\n margin: 0,\n fontSize: \"0.82rem\",\n color: C.textMuted,\n textAlign: \"center\",\n};\n\nconst inlineCodeStyles: CSSProperties = {\n fontFamily: \"ui-monospace, monospace\",\n backgroundColor: C.bgCard,\n border: `1px solid ${C.border}`,\n borderRadius: \"4px\",\n padding: \"0.1em 0.4em\",\n fontSize: \"0.88em\",\n color: C.teal,\n};\n\nconst contentLayoutStyles: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"200px minmax(0, 1fr)\",\n flex: 1,\n minHeight: 0,\n overflow: \"hidden\",\n};\n\nconst sidebarStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0\",\n padding: \"0.75rem\",\n borderRight: `1px solid ${C.border}`,\n background: C.bgPanel,\n overflowY: \"auto\",\n};\n\nconst navStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.25rem\",\n marginBottom: \"1rem\",\n};\n\nconst navIconStyles: CSSProperties = {\n fontSize: \"0.7rem\",\n opacity: 0.7,\n};\n\nconst sidebarInfoStyles: CSSProperties = {\n marginTop: \"auto\",\n padding: \"0.75rem\",\n borderRadius: \"8px\",\n background: C.bgCard,\n border: `1px solid ${C.border}`,\n};\n\nconst sidebarInfoLabelStyles: CSSProperties = {\n fontSize: \"0.65rem\",\n fontWeight: 600,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n marginBottom: \"0.3rem\",\n};\n\nconst sidebarInfoValueStyles: CSSProperties = {\n fontSize: \"0.88rem\",\n fontWeight: 600,\n color: C.text,\n wordBreak: \"break-word\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst sidebarInfoSubStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n color: C.textMuted,\n fontFamily: \"ui-monospace, monospace\",\n marginTop: \"0.25rem\",\n};\n\nconst mainPaneStyles: CSSProperties = {\n minWidth: 0,\n overflowY: \"auto\",\n padding: \"1rem\",\n};\n\n// ─── Overview tab styles ───────────────────────────────────────────────────────\n\nconst overviewLayoutStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1.25rem\",\n};\n\nconst overviewCardsRowStyles: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(11rem, 1fr))\",\n gap: \"0.75rem\",\n};\n\nconst overviewCardStyles: CSSProperties = {\n padding: \"0.9rem 1rem\",\n borderRadius: \"10px\",\n border: `1px solid ${C.border}`,\n background: C.bgCard,\n};\n\nconst overviewCardLabelStyles: CSSProperties = {\n fontSize: \"0.68rem\",\n fontWeight: 600,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n marginBottom: \"0.4rem\",\n};\n\nconst overviewCardValueStyles: CSSProperties = {\n fontSize: \"1rem\",\n fontWeight: 700,\n color: C.text,\n wordBreak: \"break-word\",\n};\n\nconst overviewSectionStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n};\n\nconst overviewSectionTitleStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n fontWeight: 600,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n};\n\nconst overviewSectionHeaderStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"0.75rem\",\n};\n\nconst overviewRefreshButtonStyles: CSSProperties = {\n border: `1px solid ${C.border}`,\n borderRadius: \"7px\",\n padding: \"0.35rem 0.7rem\",\n backgroundColor: \"transparent\",\n color: C.textDim,\n fontSize: \"0.78rem\",\n fontFamily: \"ui-monospace, monospace\",\n cursor: \"pointer\",\n flexShrink: 0,\n};\n\nconst overviewAccumulatorValueStyles: CSSProperties = {\n padding: \"0.75rem\",\n borderRadius: \"8px\",\n border: `1px solid ${C.border}`,\n background: C.bgCard,\n fontFamily: \"ui-monospace, monospace\",\n fontSize: \"0.78rem\",\n color: C.text,\n lineHeight: 1.5,\n wordBreak: \"break-all\",\n};\n\nconst overviewAccumulatorEmptyStyles: CSSProperties = {\n color: C.textMuted,\n fontStyle: \"italic\",\n};\n\nconst overviewAccumulatorErrorStyles: CSSProperties = {\n color: C.error,\n};\n\nconst overviewEmptyStyles: CSSProperties = {\n fontSize: \"0.82rem\",\n color: C.textMuted,\n fontStyle: \"italic\",\n};\n\nconst crdtTableListStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.25rem\",\n};\n\nconst crdtTableRowStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.6rem\",\n padding: \"0.5rem 0.75rem\",\n borderRadius: \"7px\",\n background: C.bgCard,\n border: `1px solid ${C.border}`,\n};\n\nconst crdtTableIconStyles: CSSProperties = {\n color: C.teal,\n fontSize: \"0.72rem\",\n};\n\nconst crdtTableNameStyles: CSSProperties = {\n fontFamily: \"ui-monospace, monospace\",\n fontSize: \"0.85rem\",\n color: C.text,\n};\n\nconst permissionRowStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.6rem\",\n fontSize: \"0.82rem\",\n color: C.textDim,\n};\n\nconst permissionIconStyles: CSSProperties = {\n color: C.success,\n fontWeight: 700,\n fontSize: \"0.85rem\",\n lineHeight: 1,\n};\n\nconst permissionTextStyles: CSSProperties = {\n color: C.textDim,\n};\n\nconst dangerZoneStyles: CSSProperties = {\n marginTop: \"auto\",\n borderRadius: \"10px\",\n border: `1px solid ${C.errorBorder}`,\n padding: \"0.75rem 1rem\",\n background: C.errorBg,\n};\n\nconst dangerZoneTitleStyles: CSSProperties = {\n fontSize: \"0.65rem\",\n fontWeight: 700,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: C.error,\n marginBottom: \"0.5rem\",\n};\n\nconst dangerZoneRowStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"1rem\",\n};\n\nconst dangerZoneDescStyles: CSSProperties = {\n fontSize: \"0.75rem\",\n color: C.textMuted,\n lineHeight: 1.5,\n};\n\nconst dangerZoneActionsStyles: CSSProperties = {\n display: \"flex\",\n gap: \"0.4rem\",\n flexShrink: 0,\n};\n\nconst resetButtonStyles: CSSProperties = {\n flexShrink: 0,\n border: `1px solid ${C.errorBorder}`,\n borderRadius: \"7px\",\n padding: \"0.35rem 0.75rem\",\n backgroundColor: \"transparent\",\n color: C.error,\n fontSize: \"0.78rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n};\n\nconst resetCancelButtonStyles: CSSProperties = {\n border: `1px solid ${C.border}`,\n borderRadius: \"7px\",\n padding: \"0.35rem 0.65rem\",\n backgroundColor: \"transparent\",\n color: C.textDim,\n fontSize: \"0.78rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n};\n\nconst resetConfirmButtonStyles: CSSProperties = {\n border: \"none\",\n borderRadius: \"7px\",\n padding: \"0.35rem 0.75rem\",\n backgroundColor: C.error,\n color: \"#0e1015\",\n fontSize: \"0.78rem\",\n fontWeight: 700,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n};\n\n// ─── Query runner tab styles ───────────────────────────────────────────────────\n\nconst queryRunnerLayoutStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.75rem\",\n height: \"100%\",\n};\n\nconst queryToolbarStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"0.75rem\",\n flexWrap: \"wrap\",\n};\n\nconst targetToggleStyles: CSSProperties = {\n display: \"flex\",\n gap: \"0\",\n borderRadius: \"8px\",\n border: `1px solid ${C.border}`,\n overflow: \"hidden\",\n background: C.bgCard,\n};\n\nconst queryToolbarRightStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.6rem\",\n};\n\nconst noInstanceWarningStyles: CSSProperties = {\n fontSize: \"0.75rem\",\n color: C.amber,\n fontWeight: 500,\n};\n\nconst shortcutHintStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n color: C.textMuted,\n fontFamily: \"ui-monospace, monospace\",\n padding: \"0.2rem 0.5rem\",\n borderRadius: \"5px\",\n border: `1px solid ${C.border}`,\n background: C.bgCard,\n};\n\nconst editorWrapperStyles: CSSProperties = {\n borderRadius: \"10px\",\n border: `1px solid ${C.border}`,\n overflow: \"hidden\",\n background: C.bgInput,\n};\n\nconst textareaStyles: CSSProperties = {\n width: \"100%\",\n minHeight: \"9rem\",\n resize: \"vertical\",\n border: \"none\",\n padding: \"0.85rem 1rem\",\n backgroundColor: \"transparent\",\n color: C.text,\n fontSize: \"0.875rem\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, monospace\",\n lineHeight: 1.6,\n outline: \"none\",\n boxSizing: \"border-box\",\n};\n\nconst helperTextStyles: CSSProperties = {\n fontSize: \"0.75rem\",\n lineHeight: 1.5,\n color: C.textMuted,\n};\n\nconst resultPanelStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.6rem\",\n borderRadius: \"10px\",\n border: `1px solid ${C.border}`,\n overflow: \"hidden\",\n background: C.bgPanel,\n};\n\nconst errorPanelStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.6rem\",\n padding: \"0.85rem 1rem\",\n borderRadius: \"10px\",\n border: `1px solid ${C.errorBorder}`,\n background: C.errorBg,\n};\n\nconst resultHeaderStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.6rem\",\n padding: \"0.6rem 0.85rem\",\n borderBottom: `1px solid ${C.border}`,\n background: C.bgCard,\n};\n\nconst successBadgeStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n fontWeight: 700,\n color: C.success,\n backgroundColor: C.successBg,\n borderRadius: \"5px\",\n padding: \"0.15rem 0.5rem\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst errorBadgeStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n fontWeight: 700,\n color: C.error,\n backgroundColor: C.errorBg,\n borderRadius: \"5px\",\n padding: \"0.15rem 0.5rem\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst resultMetaStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n color: C.textMuted,\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst resultEmptyStyles: CSSProperties = {\n padding: \"1.5rem\",\n fontSize: \"0.82rem\",\n color: C.textMuted,\n fontStyle: \"italic\",\n textAlign: \"center\",\n};\n\nconst resultRawStyles: CSSProperties = {\n margin: 0,\n padding: \"0.85rem 1rem\",\n overflowX: \"auto\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n fontSize: \"0.8rem\",\n lineHeight: 1.5,\n color: C.text,\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst errorMessageStyles: CSSProperties = {\n margin: 0,\n fontSize: \"0.82rem\",\n lineHeight: 1.6,\n color: C.error,\n fontFamily: \"ui-monospace, monospace\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n};\n\nconst tableWrapperStyles: CSSProperties = {\n overflowX: \"auto\",\n maxHeight: \"320px\",\n overflowY: \"auto\",\n};\n\nconst tableStyles: CSSProperties = {\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: \"0.8rem\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, monospace\",\n};\n\nconst thStyles: CSSProperties = {\n padding: \"0.5rem 0.85rem\",\n textAlign: \"left\",\n fontWeight: 600,\n fontSize: \"0.7rem\",\n letterSpacing: \"0.05em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n borderBottom: `1px solid ${C.border}`,\n borderRight: `1px solid ${C.border}`,\n background: C.bgCard,\n whiteSpace: \"nowrap\",\n position: \"sticky\",\n top: 0,\n};\n\nconst thRowNumStyles: CSSProperties = {\n ...thStyles,\n color: C.textMuted,\n opacity: 0.5,\n width: \"2.5rem\",\n textAlign: \"right\",\n};\n\nconst trStyles: CSSProperties = {\n background: \"transparent\",\n};\n\nconst trAltStyles: CSSProperties = {\n background: C.tealGlow,\n};\n\nconst tdStyles: CSSProperties = {\n padding: \"0.45rem 0.85rem\",\n borderBottom: `1px solid ${C.border}`,\n borderRight: `1px solid ${C.border}`,\n color: C.text,\n whiteSpace: \"nowrap\",\n maxWidth: \"300px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n\nconst tdRowNumStyles: CSSProperties = {\n ...tdStyles,\n color: C.textMuted,\n opacity: 0.5,\n textAlign: \"right\",\n userSelect: \"none\",\n};\n\nconst nullValueStyles: CSSProperties = {\n color: C.textMuted,\n fontStyle: \"italic\",\n opacity: 0.6,\n};\n\nconst jsonValueStyles: CSSProperties = {\n color: C.textDim,\n};\n\nfunction getTabButtonStyles(isActive: boolean): CSSProperties {\n return {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n width: \"100%\",\n border: \"none\",\n borderRadius: \"7px\",\n padding: \"0.6rem 0.75rem\",\n background: isActive ? C.tealDim : \"transparent\",\n color: isActive ? C.teal : C.textDim,\n fontSize: \"0.82rem\",\n fontWeight: isActive ? 700 : 500,\n textAlign: \"left\",\n cursor: \"pointer\",\n transition: \"background 0.15s\",\n borderLeft: isActive ? `2px solid ${C.teal}` : \"2px solid transparent\",\n };\n}\n\nfunction getTargetButtonStyles(isActive: boolean): CSSProperties {\n return {\n border: \"none\",\n borderRight: `1px solid ${C.border}`,\n padding: \"0.45rem 0.85rem\",\n background: isActive ? C.tealDim : \"transparent\",\n color: isActive ? C.teal : C.textMuted,\n fontSize: \"0.78rem\",\n fontWeight: isActive ? 700 : 500,\n cursor: \"pointer\",\n fontFamily: \"ui-monospace, monospace\",\n transition: \"background 0.1s\",\n whiteSpace: \"nowrap\",\n };\n}\n\nfunction runButtonStyles(enabled: boolean, running: boolean): CSSProperties {\n return {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.4rem\",\n border: \"none\",\n borderRadius: \"7px\",\n padding: \"0.45rem 0.9rem\",\n background: enabled ? C.teal : C.bgCard,\n color: enabled ? \"#0e1015\" : C.textMuted,\n fontSize: \"0.82rem\",\n fontWeight: 700,\n fontFamily: \"ui-monospace, monospace\",\n cursor: enabled ? \"pointer\" : \"not-allowed\",\n opacity: running ? 0.75 : 1,\n transition: \"background 0.15s\",\n whiteSpace: \"nowrap\",\n };\n}\n\nconst runningDotStyles: CSSProperties = {\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"currentColor\",\n};\n\n// ─── Schema tab styles ────────────────────────────────────────────────────────\n\nconst schemaLayoutStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1.5rem\",\n};\n\nconst schemaSectionStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.65rem\",\n};\n\nconst schemaSectionHeaderStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.6rem\",\n};\n\nconst schemaSectionTitleStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n fontWeight: 700,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n};\n\nconst schemaBadgeStyles: CSSProperties = {\n fontSize: \"0.68rem\",\n fontWeight: 700,\n color: C.teal,\n backgroundColor: C.tealDim,\n borderRadius: \"4px\",\n padding: \"0.1rem 0.4rem\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst schemaMigrationsMetaStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n marginLeft: \"auto\",\n};\n\nconst schemaVersionChipStyles: CSSProperties = {\n fontSize: \"0.68rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textMuted,\n backgroundColor: C.bgCard,\n border: `1px solid ${C.border}`,\n borderRadius: \"4px\",\n padding: \"0.1rem 0.5rem\",\n};\n\nconst schemaTableGridStyles: CSSProperties = {\n borderRadius: \"10px\",\n border: `1px solid ${C.border}`,\n overflow: \"hidden\",\n};\n\nconst schemaTableHeaderRowStyles: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr 90px\",\n gap: 0,\n backgroundColor: C.bgCard,\n borderBottom: `1px solid ${C.border}`,\n};\n\nconst schemaColHeaderStyles: CSSProperties = {\n padding: \"0.5rem 0.85rem\",\n fontSize: \"0.68rem\",\n fontWeight: 700,\n letterSpacing: \"0.07em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n borderRight: `1px solid ${C.border}`,\n};\n\nconst schemaTableRowStyles: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr 90px\",\n gap: 0,\n borderBottom: `1px solid ${C.border}`,\n};\n\nconst schemaTableNameStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n padding: \"0.6rem 0.85rem\",\n fontSize: \"0.82rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.text,\n borderRight: `1px solid ${C.border}`,\n};\n\nconst schemaTableIconStyles: CSSProperties = {\n color: C.teal,\n fontSize: \"0.68rem\",\n opacity: 0.8,\n};\n\nconst schemaCrdtNameStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n padding: \"0.6rem 0.85rem\",\n fontSize: \"0.82rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textDim,\n borderRight: `1px solid ${C.border}`,\n};\n\nconst schemaStatusCellStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"0.6rem 0.5rem\",\n};\n\nconst schemaActiveTagStyles: CSSProperties = {\n fontSize: \"0.68rem\",\n fontWeight: 700,\n color: C.success,\n backgroundColor: C.successBg,\n borderRadius: \"4px\",\n padding: \"0.15rem 0.45rem\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst schemaEmptyStyles: CSSProperties = {\n fontSize: \"0.82rem\",\n color: C.textMuted,\n fontStyle: \"italic\",\n};\n\nconst migrationListStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.35rem\",\n};\n\nfunction getMigrationRowStyles(applied: boolean): CSSProperties {\n return {\n display: \"grid\",\n gridTemplateColumns: \"3.5rem 1fr 70px\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"0.55rem 0.85rem\",\n borderRadius: \"8px\",\n background: applied ? C.bgCard : \"transparent\",\n border: `1px solid ${applied ? C.border : C.borderLight}`,\n opacity: applied ? 1 : 0.55,\n };\n}\n\nconst migrationVersionStyles: CSSProperties = {\n fontSize: \"0.78rem\",\n fontWeight: 700,\n fontFamily: \"ui-monospace, monospace\",\n color: C.textDim,\n};\n\nconst migrationBarTrackStyles: CSSProperties = {\n height: \"4px\",\n borderRadius: \"2px\",\n backgroundColor: C.border,\n overflow: \"hidden\",\n};\n\nfunction getMigrationBarFillStyles(applied: boolean): CSSProperties {\n return {\n height: \"100%\",\n width: applied ? \"100%\" : \"0%\",\n borderRadius: \"2px\",\n backgroundColor: C.teal,\n transition: \"width 0.3s ease\",\n };\n}\n\nfunction getMigrationTagStyles(applied: boolean, isCurrent: boolean): CSSProperties {\n if (isCurrent) {\n return {\n fontSize: \"0.68rem\",\n fontWeight: 700,\n color: C.teal,\n backgroundColor: C.tealDim,\n borderRadius: \"4px\",\n padding: \"0.15rem 0.45rem\",\n fontFamily: \"ui-monospace, monospace\",\n textAlign: \"center\",\n };\n }\n if (applied) {\n return {\n fontSize: \"0.68rem\",\n fontWeight: 600,\n color: C.success,\n backgroundColor: C.successBg,\n borderRadius: \"4px\",\n padding: \"0.15rem 0.45rem\",\n fontFamily: \"ui-monospace, monospace\",\n textAlign: \"center\",\n };\n }\n return {\n fontSize: \"0.68rem\",\n fontWeight: 600,\n color: C.amber,\n backgroundColor: \"rgba(251,191,36,0.08)\",\n borderRadius: \"4px\",\n padding: \"0.15rem 0.45rem\",\n fontFamily: \"ui-monospace, monospace\",\n textAlign: \"center\",\n };\n}\n\n// ─── Event log tab styles ─────────────────────────────────────────────────────\n\nconst eventLogLayoutStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.75rem\",\n height: \"100%\",\n};\n\nconst eventLogToolbarStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n flexWrap: \"wrap\",\n flexShrink: 0,\n};\n\nconst eventLogFilterSelectStyles: CSSProperties = {\n borderRadius: \"7px\",\n border: `1px solid ${C.border}`,\n padding: \"0.35rem 0.6rem\",\n backgroundColor: C.bgCard,\n color: C.text,\n fontSize: \"0.78rem\",\n fontFamily: \"ui-monospace, monospace\",\n cursor: \"pointer\",\n};\n\nconst eventLogRefreshButtonStyles: CSSProperties = {\n border: `1px solid ${C.border}`,\n borderRadius: \"7px\",\n padding: \"0.35rem 0.7rem\",\n backgroundColor: \"transparent\",\n color: C.textDim,\n fontSize: \"0.78rem\",\n fontFamily: \"ui-monospace, monospace\",\n cursor: \"pointer\",\n};\n\nconst eventLogCountStyles: CSSProperties = {\n marginLeft: \"auto\",\n fontSize: \"0.72rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textMuted,\n};\n\nconst eventLogEmptyStyles: CSSProperties = {\n padding: \"2rem\",\n textAlign: \"center\",\n fontSize: \"0.82rem\",\n color: C.textMuted,\n fontStyle: \"italic\",\n};\n\nconst eventLogListStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.25rem\",\n overflowY: \"auto\",\n flex: 1,\n};\n\nfunction getEventRowStyles(isExpanded: boolean): CSSProperties {\n return {\n borderRadius: \"8px\",\n border: `1px solid ${isExpanded ? `${C.teal}40` : C.border}`,\n background: isExpanded ? C.tealGlow : C.bgCard,\n overflow: \"hidden\",\n flexShrink: 0,\n };\n}\n\nconst eventRowHeaderStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n width: \"100%\",\n padding: \"0.5rem 0.75rem\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n textAlign: \"left\",\n flexWrap: \"wrap\",\n};\n\nconst eventSyncIdStyles: CSSProperties = {\n fontSize: \"0.7rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textMuted,\n minWidth: \"3.5rem\",\n};\n\nconst eventDatasetStyles: CSSProperties = {\n fontSize: \"0.8rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.text,\n fontWeight: 600,\n};\n\nconst eventItemIdStyles: CSSProperties = {\n fontSize: \"0.75rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textMuted,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n minWidth: 0,\n};\n\nconst eventTimestampStyles: CSSProperties = {\n fontSize: \"0.7rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textMuted,\n marginLeft: \"auto\",\n};\n\nconst eventChevronStyles: CSSProperties = {\n fontSize: \"0.6rem\",\n color: C.textMuted,\n marginLeft: \"0.25rem\",\n};\n\nconst eventPayloadStyles: CSSProperties = {\n borderTop: `1px solid ${C.border}`,\n padding: \"0.6rem 0.75rem\",\n};\n\nconst eventPayloadMetaStyles: CSSProperties = {\n display: \"flex\",\n gap: \"0.75rem\",\n marginBottom: \"0.5rem\",\n};\n\nconst eventMetaItemStyles: CSSProperties = {\n fontSize: \"0.68rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textMuted,\n};\n\nconst eventPayloadPreStyles: CSSProperties = {\n margin: 0,\n fontSize: \"0.78rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.text,\n lineHeight: 1.5,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n};\n\nconst loadMoreButtonStyles: CSSProperties = {\n width: \"100%\",\n border: `1px solid ${C.border}`,\n borderRadius: \"8px\",\n padding: \"0.6rem\",\n backgroundColor: \"transparent\",\n color: C.textDim,\n fontSize: \"0.78rem\",\n fontFamily: \"ui-monospace, monospace\",\n cursor: \"pointer\",\n flexShrink: 0,\n};\n\n// Event type badges\nconst eventTypeBadgeBase: CSSProperties = {\n fontSize: \"0.65rem\",\n fontWeight: 700,\n borderRadius: \"4px\",\n padding: \"0.1rem 0.4rem\",\n fontFamily: \"ui-monospace, monospace\",\n whiteSpace: \"nowrap\",\n};\n\nconst eventTypeCreateStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.teal,\n backgroundColor: C.tealDim,\n};\n\nconst eventTypeUpdateStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: \"#a78bfa\",\n backgroundColor: \"rgba(167,139,250,0.12)\",\n};\n\nconst eventTypeDeleteStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.error,\n backgroundColor: \"rgba(248,113,113,0.12)\",\n};\n\n// Origin badges\nconst eventOriginOwnStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.success,\n backgroundColor: C.successBg,\n};\n\nconst eventOriginRemoteStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.amber,\n backgroundColor: \"rgba(251,191,36,0.1)\",\n};\n\nconst eventOriginLocalStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.textDim,\n backgroundColor: C.bgCard,\n border: `1px solid ${C.border}`,\n};\n\n// Status badges\nconst eventStatusAppliedStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.success,\n backgroundColor: C.successBg,\n};\n\nconst eventStatusPendingStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.amber,\n backgroundColor: \"rgba(251,191,36,0.1)\",\n};\n\nconst eventStatusFailedStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.error,\n backgroundColor: C.errorBg,\n};\n\nconst eventStatusSkippedStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.textMuted,\n backgroundColor: C.bgCard,\n};\n","import type { SyncedDb } from \"@sqlite-sync/core\";\n\nconst devtoolsRegistrySymbol = Symbol.for(\"@sqlite-sync/devtools\");\n\nexport type SQLiteSyncDevtoolsInstance = {\n instanceId: string;\n dbId: string;\n createdAt: number;\n instance: SyncedDb<any>;\n};\n\nexport type SQLiteSyncDevtoolsSnapshot = {\n instances: readonly SQLiteSyncDevtoolsInstance[];\n};\n\nexport type SQLiteSyncDevtoolsRegistry = {\n version: 1;\n instances: Map<string, SQLiteSyncDevtoolsInstance>;\n subscribe(listener: () => void): () => void;\n getSnapshot(): SQLiteSyncDevtoolsSnapshot;\n register(instance: SQLiteSyncDevtoolsInstance): () => void;\n};\n\ntype RegistryGlobal = typeof globalThis & {\n [key: symbol]: SQLiteSyncDevtoolsRegistry | undefined;\n};\n\nfunction createSQLiteSyncDevtoolsRegistry(): SQLiteSyncDevtoolsRegistry {\n const instances = new Map<string, SQLiteSyncDevtoolsInstance>();\n const listeners = new Set<() => void>();\n let snapshot: SQLiteSyncDevtoolsSnapshot = {\n instances: [],\n };\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n const updateSnapshot = () => {\n snapshot = {\n instances: Array.from(instances.values()),\n };\n notify();\n };\n\n return {\n version: 1,\n instances,\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n getSnapshot() {\n return snapshot;\n },\n register(instance) {\n instances.set(instance.instanceId, instance);\n updateSnapshot();\n\n let isUnregistered = false;\n return () => {\n if (isUnregistered) return;\n isUnregistered = true;\n\n if (!instances.delete(instance.instanceId)) return;\n updateSnapshot();\n };\n },\n };\n}\n\nexport function getOrCreateSQLiteSyncDevtoolsRegistry(): SQLiteSyncDevtoolsRegistry {\n const registryGlobal = globalThis as RegistryGlobal;\n\n registryGlobal[devtoolsRegistrySymbol] ??= createSQLiteSyncDevtoolsRegistry();\n\n return registryGlobal[devtoolsRegistrySymbol];\n}\n"],"mappings":";AACA,SAAS,aAAa,WAAW,SAAS,QAAQ,UAAU,4BAA4B;;;ACCxF,IAAM,yBAAyB,OAAO,IAAI,uBAAuB;AAyBjE,SAAS,mCAA+D;AACtE,QAAM,YAAY,oBAAI,IAAwC;AAC9D,QAAM,YAAY,oBAAI,IAAgB;AACtC,MAAI,WAAuC;AAAA,IACzC,WAAW,CAAC;AAAA,EACd;AAEA,QAAM,SAAS,MAAM;AACnB,eAAW,YAAY,WAAW;AAChC,eAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM;AAC3B,eAAW;AAAA,MACT,WAAW,MAAM,KAAK,UAAU,OAAO,CAAC;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,UAAU,UAAU;AAClB,gBAAU,IAAI,QAAQ;AACtB,aAAO,MAAM;AACX,kBAAU,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,cAAc;AACZ,aAAO;AAAA,IACT;AAAA,IACA,SAAS,UAAU;AACjB,gBAAU,IAAI,SAAS,YAAY,QAAQ;AAC3C,qBAAe;AAEf,UAAI,iBAAiB;AACrB,aAAO,MAAM;AACX,YAAI,eAAgB;AACpB,yBAAiB;AAEjB,YAAI,CAAC,UAAU,OAAO,SAAS,UAAU,EAAG;AAC5C,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,wCAAoE;AAClF,QAAM,iBAAiB;AAEvB,iBAAe,sBAAsB,MAAM,iCAAiC;AAE5E,SAAO,eAAe,sBAAsB;AAC9C;;;AD8EI,mBAGM,KADF,YAFJ;AAtHG,SAAS,mBAAmB,EAAE,UAAU,GAA4B;AACzE,QAAM,WAAW,sCAAsC;AACvD,QAAM,WAAW,qBAAqB,SAAS,WAAW,SAAS,aAAa,gBAAgB;AAChG,QAAM,YAAY,SAAS;AAE3B,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAsB,UAAU;AAClE,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,SAAiB,EAAE;AACvE,QAAM,CAAC,aAAa,cAAc,IAAI,SAAsB,QAAQ;AACpE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,YAAY,aAAa,IAAI,SAAqB;AAAA,IACvD,QAAQ;AAAA,EACV,CAAC;AAED,YAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AAEb,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,UAAU;AAC1B,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,MAAM;AACX,aAAO,oBAAoB,WAAW,SAAS;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,QAAI,UAAU,WAAW,GAAG;AAC1B,4BAAsB,EAAE;AACxB;AAAA,IACF;AAEA,QAAI,UAAU,KAAK,CAAC,aAAa,SAAS,eAAe,kBAAkB,GAAG;AAC5E;AAAA,IACF;AAEA,0BAAsB,UAAU,CAAC,GAAG,cAAc,EAAE;AAAA,EACtD,GAAG,CAAC,WAAW,kBAAkB,CAAC;AAElC,QAAM,aAAa,QAAQ,MAAM;AAC/B,UAAM,SAAS,oBAAI,IAAoB;AAEvC,eAAW,YAAY,WAAW;AAChC,aAAO,IAAI,SAAS,OAAO,OAAO,IAAI,SAAS,IAAI,KAAK,KAAK,CAAC;AAAA,IAChE;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,mBAAmB,QAAQ,MAAM;AACrC,WAAO,UAAU,KAAK,CAAC,aAAa,SAAS,eAAe,kBAAkB,KAAK;AAAA,EACrF,GAAG,CAAC,WAAW,kBAAkB,CAAC;AAElC,QAAM,cAAc,qBAAqB,QAAQ,MAAM,KAAK,EAAE,SAAS,KAAK,WAAW,WAAW;AAElG,QAAM,WAAW,YAAY;AAC3B,QAAI,CAAC,iBAAkB;AAEvB,QAAI,kBAAkB,MAAM,KAAK;AAEjC,QAAI;AACF,wBAAkB,yBAAyB,KAAK;AAChD,YAAM,gBAAgB,iBAAiB,eAAe;AAEtD,UAAI,gBAAgB,UAAU;AAC5B,YAAI,CAAC,0BAA0B,aAAa,GAAG;AAC7C,gBAAM,IAAI,MAAM,+DAA+D;AAAA,QACjF;AAAA,MACF,OAAO;AACL,cAAM,gBAAgB,iBAAiB,SAAS,UAAU,qBAAqB,eAAe;AAC9F,cAAM,gBAAgB,cAAc,OAAO,CAAC,UAAU,MAAM,OAAO,EAAE,IAAI,CAAC,UAAU,MAAM,IAAI;AAC9F,cAAM,gBAAgB,IAAI,IAAI,iBAAiB,SAAS,UAAU,cAAc;AAEhF,cAAM,gBAAgB,cAAc,OAAO,CAAC,UAAU,CAAC,cAAc,IAAI,KAAK,CAAC;AAC/E,YAAI,cAAc,SAAS,GAAG;AAC5B,gBAAM,IAAI;AAAA,YACR,uEAAuE,cAAc,KAAK,IAAI,CAAC;AAAA,UACjG;AAAA,QACF;AAAA,MACF;AAEA,oBAAc,EAAE,QAAQ,UAAU,CAAC;AACnC,YAAM,YAAY,YAAY,IAAI;AAElC,YAAM,SACJ,gBAAgB,WACZ,iBAAiB,SAAS,GAAG,QAAQ,eAAe,IACpD,MAAM,iBAAiB,SAAS,UAAU,aAAa;AAAA,QACrD,KAAK;AAAA,QACL,YAAY,CAAC;AAAA,MACf,CAAC;AAEP,oBAAc;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN,QAAQ;AAAA,UACR,KAAK;AAAA,UACL,UAAU,OAAO,KAAK;AAAA,UACtB,YAAY,QAAQ,YAAY,IAAI,IAAI,WAAW,QAAQ,CAAC,CAAC;AAAA,UAC7D,MAAM,OAAO;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,oBAAc;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,KAAK;AAAA,UACL,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAChE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SACE,iCACE;AAAA,wBAAC,SAAI,OAAO,oBACV,+BAAC,YAAO,MAAK,UAAS,OAAO,qBAAqB,SAAS,MAAM,UAAU,IAAI,GAAG,OAAM,wBACtF;AAAA,0BAAC,UAAK,OAAO,mBAAmB,oBAAC;AAAA,MACjC,oBAAC,UAAK,OAAO,oBAAqB,oBAAU,QAAO;AAAA,OACrD,GACF;AAAA,IAEC,SACC,oBAAC,SAAI,OAAO,eAAe,SAAS,MAAM,UAAU,KAAK,GACvD;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QACX,cAAW;AAAA,QACX,OAAO;AAAA,QACP,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,QAG1C;AAAA,+BAAC,SAAI,OAAO,cACV;AAAA,iCAAC,SAAI,OAAO,kBACV;AAAA,kCAAC,UAAK,OAAO,kBAAkB,oBAAC;AAAA,cAChC,qBAAC,SACC;AAAA,oCAAC,SAAI,OAAO,eAAe,yBAAW;AAAA,gBACtC,oBAAC,QAAG,OAAO,aAAa,sBAAQ;AAAA,iBAClC;AAAA,eACF;AAAA,YAEA,qBAAC,SAAI,OAAO,mBACT;AAAA,wBAAU,SAAS,KAClB,qBAAC,WAAM,OAAO,2BACZ;AAAA,oCAAC,UAAK,OAAO,0BAA0B,gBAAE;AAAA,gBACzC;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU,CAAC,UAAU,sBAAsB,MAAM,OAAO,KAAK;AAAA,oBAC7D,OAAO;AAAA,oBAEN,oBAAU,IAAI,CAAC,aACd,oBAAC,YAAiC,OAAO,SAAS,YAC/C,8BAAoB,SAAS,MAAM,SAAS,YAAY,WAAW,IAAI,SAAS,IAAI,KAAK,CAAC,KADhF,SAAS,UAEtB,CACD;AAAA;AAAA,gBACH;AAAA,iBACF;AAAA,cAEF,qBAAC,UAAK,OAAO,0BACV;AAAA,0BAAU;AAAA,gBAAO;AAAA,gBAAU,UAAU,WAAW,IAAI,MAAM;AAAA,iBAC7D;AAAA,cACA,oBAAC,YAAO,MAAK,UAAS,OAAO,mBAAmB,SAAS,MAAM,UAAU,KAAK,GAAG,cAAW,SAAQ,oBAEpG;AAAA,eACF;AAAA,aACF;AAAA,UAEC,UAAU,WAAW,IACpB,qBAAC,SAAI,OAAO,kBACV;AAAA,gCAAC,SAAI,OAAO,sBAAsB,oBAAC;AAAA,YACnC,oBAAC,OAAE,OAAO,sBAAsB,2DAA6C;AAAA,YAC7E,qBAAC,OAAE,OAAO,yBAAyB;AAAA;AAAA,cAC5B,oBAAC,UAAK,OAAO,kBAAkB,kCAAoB;AAAA,cAAO;AAAA,eACjE;AAAA,aACF,IAEA,qBAAC,SAAI,OAAO,qBAEV;AAAA,iCAAC,WAAM,OAAO,eACZ;AAAA,mCAAC,SAAI,OAAO,WACV;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,mBAAmB,cAAc,UAAU;AAAA,oBAClD,SAAS,MAAM,aAAa,UAAU;AAAA,oBAEtC;AAAA,0CAAC,UAAK,OAAO,eAAe,oBAAC;AAAA,sBAAO;AAAA;AAAA;AAAA,gBAEtC;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,mBAAmB,cAAc,QAAQ;AAAA,oBAChD,SAAS,MAAM,aAAa,QAAQ;AAAA,oBAEpC;AAAA,0CAAC,UAAK,OAAO,eAAe,oBAAC;AAAA,sBAAO;AAAA;AAAA;AAAA,gBAEtC;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,mBAAmB,cAAc,WAAW;AAAA,oBACnD,SAAS,MAAM,aAAa,WAAW;AAAA,oBAEvC;AAAA,0CAAC,UAAK,OAAO,eAAe,oBAAC;AAAA,sBAAO;AAAA;AAAA;AAAA,gBAEtC;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,mBAAmB,cAAc,cAAc;AAAA,oBACtD,SAAS,MAAM,aAAa,cAAc;AAAA,oBAE1C;AAAA,0CAAC,UAAK,OAAO,eAAe,oBAAC;AAAA,sBAAO;AAAA;AAAA;AAAA,gBAEtC;AAAA,iBACF;AAAA,cAEC,oBACC,qBAAC,SAAI,OAAO,mBACV;AAAA,oCAAC,SAAI,OAAO,wBAAwB,6BAAe;AAAA,gBACnD,oBAAC,SAAI,OAAO,wBACT;AAAA,kBACC,iBAAiB;AAAA,kBACjB,iBAAiB;AAAA,kBACjB,WAAW,IAAI,iBAAiB,IAAI,KAAK;AAAA,gBAC3C,GACF;AAAA,gBACA,qBAAC,SAAI,OAAO,sBAAsB;AAAA;AAAA,kBAAK,iBAAiB,WAAW,MAAM,GAAG,EAAE;AAAA,kBAAE;AAAA,mBAAC;AAAA,iBACnF;AAAA,eAEJ;AAAA,YAGA,oBAAC,SAAI,OAAO,gBACT,wBAAc,aACb,oBAAC,eAAY,kBAAoC,YAAwB,IACvE,cAAc,WAChB,oBAAC,aAAU,kBAAoC,IAC7C,cAAc,cAChB,oBAAC,eAAY,kBAAoC,IAEjD;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,YACF,GAEJ;AAAA,aACF;AAAA;AAAA;AAAA,IAEJ,GACF,IACE;AAAA,KACN;AAEJ;AAEA,IAAM,+BAA+B;AACrC,IAAM,8BAA8B,gDAAgD,4BAA4B;AAEhH,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AACF,GASG;AACD,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAwB,IAAI;AAClF,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAwB,IAAI;AAC5E,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAAS,KAAK;AAEtE,QAAM,6BAA6B,YAAY,YAAY;AACzD,QAAI,CAAC,iBAAkB;AACvB,4BAAwB,IAAI;AAC5B,wBAAoB,IAAI;AACxB,QAAI;AACF,YAAM,SAAS,MAAM,iBAAiB,SAAS,UAAU,aAAa;AAAA,QACpE,KAAK;AAAA,QACL,YAAY,CAAC;AAAA,MACf,CAAC;AACD,YAAM,MAAM,OAAO,KAAK,CAAC;AACzB,6BAAuB,KAAK,SAAS,EAAE;AAAA,IACzC,SAAS,OAAO;AACd,0BAAoB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC1E,6BAAuB,IAAI;AAAA,IAC7B,UAAE;AACA,8BAAwB,KAAK;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,YAAU,MAAM;AACd,2BAAuB,IAAI;AAC3B,wBAAoB,IAAI;AACxB,SAAK,2BAA2B;AAAA,EAClC,GAAG,CAAC,0BAA0B,CAAC;AAE/B,MAAI,CAAC,iBAAkB,QAAO;AAE9B,QAAM,QAAQ;AAAA,IACZ,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,WAAW,IAAI,iBAAiB,IAAI,KAAK;AAAA,EAC3C;AAEA,QAAM,aAAa,iBAAiB,SAAS,UAAU;AAEvD,SACE,qBAAC,SAAI,OAAO,sBACV;AAAA,yBAAC,SAAI,OAAO,wBACV;AAAA,2BAAC,SAAI,OAAO,oBACV;AAAA,4BAAC,SAAI,OAAO,yBAAyB,sBAAQ;AAAA,QAC7C,oBAAC,SAAI,OAAO,yBAA0B,iBAAM;AAAA,SAC9C;AAAA,MACA,qBAAC,SAAI,OAAO,oBACV;AAAA,4BAAC,SAAI,OAAO,yBAAyB,yBAAW;AAAA,QAChD,qBAAC,SAAI,OAAO,EAAE,GAAG,yBAAyB,YAAY,2BAA2B,UAAU,UAAU,GAClG;AAAA,2BAAiB,WAAW,MAAM,GAAG,EAAE;AAAA,UAAE;AAAA,WAC5C;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,OAAO,oBACV;AAAA,4BAAC,SAAI,OAAO,yBAAyB,yBAAW;AAAA,QAChD,oBAAC,SAAI,OAAO,yBAA0B,qBAAW,QAAO;AAAA,SAC1D;AAAA,OACF;AAAA,IAEA,qBAAC,SAAI,OAAO,uBACV;AAAA,0BAAC,SAAI,OAAO,4BAA4B,yBAAW;AAAA,MAClD,WAAW,WAAW,IACrB,oBAAC,SAAI,OAAO,qBAAqB,wCAA0B,IAE3D,oBAAC,SAAI,OAAO,qBACT,WAAC,GAAG,UAAU,EAAE,IAAI,CAAC,SACpB,qBAAC,SAAe,OAAO,oBACrB;AAAA,4BAAC,UAAK,OAAO,qBAAqB,oBAAC;AAAA,QACnC,oBAAC,UAAK,OAAO,qBAAsB,gBAAK;AAAA,WAFhC,IAGV,CACD,GACH;AAAA,OAEJ;AAAA,IAEA,qBAAC,SAAI,OAAO,uBACV;AAAA,2BAAC,SAAI,OAAO,6BACV;AAAA,4BAAC,SAAI,OAAO,4BAA4B,mCAAqB;AAAA,QAC7D;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU;AAAA,YACV,SAAS,MAAM,KAAK,2BAA2B;AAAA,YAE9C;AAAA,qCAAuB,WAAM;AAAA,cAAI;AAAA;AAAA;AAAA,QACpC;AAAA,SACF;AAAA,MACA,oBAAC,SAAI,OAAO,gCACT,6BACC,oBAAC,UAAK,OAAO,gCAAiC,4BAAiB,IAC7D,wBAAwB,wBAAwB,OAClD,kBACE,wBAAwB,KAC1B,oBAAC,UAAK,OAAO,gCAAgC,qBAAO,IAEpD,qBAEJ;AAAA,OACF;AAAA,IAEA,qBAAC,SAAI,OAAO,uBACV;AAAA,0BAAC,SAAI,OAAO,4BAA4B,+BAAiB;AAAA,MACzD,qBAAC,SAAI,OAAO,qBACV;AAAA,4BAAC,UAAK,OAAO,sBAAsB,oBAAC;AAAA,QACpC,oBAAC,UAAK,OAAO,sBAAsB,+CAA4B;AAAA,SACjE;AAAA,MACA,qBAAC,SAAI,OAAO,qBACV;AAAA,4BAAC,UAAK,OAAO,EAAE,GAAG,sBAAsB,OAAO,UAAU,GAAG,oBAAC;AAAA,QAC7D,oBAAC,UAAK,OAAO,sBAAsB,kEAA+C;AAAA,SACpF;AAAA,OACF;AAAA,IAEA,oBAAC,gBAAa,MAAM,iBAAiB,MAAM,UAAU,iBAAiB,UAAU;AAAA,KAClF;AAEJ;AAEA,SAAS,aAAa,EAAE,MAAM,SAAS,GAAuE;AAC5G,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AAEpD,QAAM,cAAc,MAAM;AACxB,mBAAe,IAAI;AAInB,SAAK,SAAS,cAAc,EAAE,OAAO,KAAK,CAAC;AAAA,EAC7C;AAEA,SACE,qBAAC,SAAI,OAAO,kBACV;AAAA,wBAAC,SAAI,OAAO,uBAAuB,yBAAW;AAAA,IAC9C,qBAAC,SAAI,OAAO,qBACV;AAAA,2BAAC,SAAI,OAAO,sBAAsB;AAAA;AAAA,QACJ,oBAAC,UAAK,OAAO,kBAAmB,gBAAK;AAAA,QAAO;AAAA,QAA2B;AAAA,QACnG,oBAAC,UAAK,OAAO,kBAAkB,yBAAW;AAAA,QAAO;AAAA,SACnD;AAAA,MACC,aACC,qBAAC,SAAI,OAAO,yBACV;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU;AAAA,YACV,SAAS,MAAM,cAAc,KAAK;AAAA,YACnC;AAAA;AAAA,QAED;AAAA,QACA,oBAAC,YAAO,MAAK,UAAS,OAAO,0BAA0B,UAAU,aAAa,SAAS,aACpF,wBAAc,oBAAe,iBAChC;AAAA,SACF,IAEA,oBAAC,YAAO,MAAK,UAAS,OAAO,mBAAmB,SAAS,MAAM,cAAc,IAAI,GAAG,sBAEpF;AAAA,OAEJ;AAAA,KACF;AAEJ;AAEA,SAAS,UAAU;AAAA,EACjB;AACF,GAQG;AACD,MAAI,CAAC,iBAAkB,QAAO;AAE9B,QAAM,EAAE,kBAAkB,eAAe,kBAAkB,IAAI,iBAAiB,SAAS;AACzF,QAAM,gBAAgB,kBAAkB,GAAG,EAAE,KAAK;AAElD,SACE,qBAAC,SAAI,OAAO,oBAEV;AAAA,yBAAC,SAAI,OAAO,qBACV;AAAA,2BAAC,SAAI,OAAO,2BACV;AAAA,4BAAC,SAAI,OAAO,0BAA0B,yBAAW;AAAA,QACjD,oBAAC,UAAK,OAAO,mBAAoB,2BAAiB,QAAO;AAAA,SAC3D;AAAA,MACA,qBAAC,SAAI,OAAO,uBACV;AAAA,6BAAC,SAAI,OAAO,4BACV;AAAA,8BAAC,SAAI,OAAO,uBAAuB,wBAAU;AAAA,UAC7C,oBAAC,SAAI,OAAO,uBAAuB,wBAAU;AAAA,UAC7C,oBAAC,SAAI,OAAO,EAAE,GAAG,uBAAuB,WAAW,SAAS,GAAG,oBAAM;AAAA,WACvE;AAAA,QACC,iBAAiB,IAAI,CAAC,UACrB,qBAAC,SAA8B,OAAO,sBACpC;AAAA,+BAAC,SAAI,OAAO,uBACV;AAAA,gCAAC,UAAK,OAAO,uBAAuB,oBAAC;AAAA,YACpC,MAAM;AAAA,aACT;AAAA,UACA,oBAAC,SAAI,OAAO,sBAAuB,gBAAM,eAAc;AAAA,UACvD,oBAAC,SAAI,OAAO,wBACV,8BAAC,UAAK,OAAO,uBAAuB,oBAAM,GAC5C;AAAA,aARQ,MAAM,aAShB,CACD;AAAA,SACH;AAAA,OACF;AAAA,IAGA,qBAAC,SAAI,OAAO,qBACV;AAAA,2BAAC,SAAI,OAAO,2BACV;AAAA,4BAAC,SAAI,OAAO,0BAA0B,wBAAU;AAAA,QAChD,qBAAC,SAAI,OAAO,4BACV;AAAA,+BAAC,UAAK,OAAO,mBAAoB;AAAA,8BAAkB;AAAA,YAAO;AAAA,aAAM;AAAA,UAChE,qBAAC,UAAK,OAAO,yBAAyB;AAAA;AAAA,YACzB;AAAA,YAAc;AAAA,YAAa;AAAA,aACxC;AAAA,WACF;AAAA,SACF;AAAA,MACC,kBAAkB,WAAW,IAC5B,oBAAC,SAAI,OAAO,mBAAmB,oCAAsB,IAErD,oBAAC,SAAI,OAAO,qBACT,4BAAkB,IAAI,CAAC,YAAY;AAClC,cAAM,UAAU,WAAW;AAC3B,cAAM,YAAY,YAAY;AAC9B,eACE,qBAAC,SAAkB,OAAO,sBAAsB,OAAO,GACrD;AAAA,+BAAC,SAAI,OAAO,wBAAwB;AAAA;AAAA,YAAE;AAAA,aAAQ;AAAA,UAC9C,oBAAC,SAAI,OAAO,yBACV,8BAAC,SAAI,OAAO,0BAA0B,OAAO,GAAG,GAClD;AAAA,UACA,oBAAC,SAAI,OAAO,sBAAsB,SAAS,SAAS,GACjD,sBAAY,YAAY,UAAU,YAAY,WACjD;AAAA,aAPQ,OAQV;AAAA,MAEJ,CAAC,GACH;AAAA,OAEJ;AAAA,KACF;AAEJ;AAqBA,IAAM,YAAY;AAElB,SAAS,mBAAmB,SAA0B,aAAoC;AACxF,QAAM,aAAuB,CAAC;AAE9B,MAAI,QAAQ,QAAS,YAAW,KAAK,cAAc,QAAQ,OAAO,GAAG;AACrE,MAAI,QAAQ,OAAQ,YAAW,KAAK,aAAa,QAAQ,MAAM,GAAG;AAClE,MAAI,QAAQ,OAAQ,YAAW,KAAK,aAAa,QAAQ,MAAM,GAAG;AAClE,MAAI,gBAAgB,KAAM,YAAW,KAAK,aAAa,WAAW,EAAE;AAEpE,QAAM,QAAQ,WAAW,SAAS,IAAI,SAAS,WAAW,KAAK,OAAO,CAAC,KAAK;AAC5E,SAAO,wCAAwC,KAAK,gCAAgC,YAAY,CAAC;AACnG;AAEA,SAAS,YAAY;AAAA,EACnB;AACF,GAQG;AACD,QAAM,iBAAiB;AAAA,IACrB,MAAM,kBAAkB,SAAS,UAAU,iBAAiB,IAAI,CAAC,UAAU,MAAM,aAAa,KAAK,CAAC;AAAA,IACpG,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,CAAC,SAAS,UAAU,IAAI,SAA0B,EAAE,SAAS,IAAI,QAAQ,IAAI,QAAQ,GAAG,CAAC;AAC/F,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA+B,CAAC,CAAC;AAC7D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAwB,IAAI;AAChE,QAAM,iBAAiB,OAAsB,IAAI;AACjD,QAAM,eAAe,OAAO,KAAK;AAEjC,QAAM,eAAe;AAAA,IACnB,OAAO,QAA+C;AACpD,UAAI,CAAC,iBAAkB,QAAO,CAAC;AAC/B,YAAM,SAAS,MAAM,iBAAiB,SAAS,UAAU,aAAa,EAAE,KAAK,YAAY,CAAC,EAAE,CAAC;AAC7F,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,OAAO;AAAA,IACX,OAAO,OAAgB,mBAAoC;AACzD,UAAI,CAAC,oBAAoB,aAAa,QAAS;AAC/C,mBAAa,UAAU;AACvB,mBAAa,IAAI;AACjB,UAAI;AACF,cAAM,cAAc,QAAQ,OAAO,eAAe;AAClD,cAAM,MAAM,mBAAmB,gBAAgB,WAAW;AAC1D,cAAM,OAAO,MAAM,aAAa,GAAG;AACnC,cAAM,OAAO,KAAK,MAAM,GAAG,SAAS;AACpC,mBAAW,KAAK,SAAS,SAAS;AAClC,YAAI,OAAO;AACT,oBAAU,IAAI;AAAA,QAChB,OAAO;AACL,oBAAU,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AAAA,QACxC;AACA,uBAAe,UAAU,KAAK,GAAG,EAAE,GAAG,WAAW;AAAA,MACnD,UAAE;AACA,qBAAa,UAAU;AACvB,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB,YAAY;AAAA,EACjC;AAGA,YAAU,MAAM;AACd,mBAAe,UAAU;AACzB,cAAU,CAAC,CAAC;AACZ,SAAK,KAAK,MAAM,OAAO;AAAA,EACzB,GAAG,CAAC,SAAS,IAAI,CAAC;AAElB,QAAM,eAAe,CAAC,SAA0B;AAC9C,eAAW,IAAI;AAAA,EACjB;AAEA,MAAI,CAAC,iBAAkB,QAAO;AAE9B,SACE,qBAAC,SAAI,OAAO,sBAEV;AAAA,yBAAC,SAAI,OAAO,uBACV;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,QAAQ;AAAA,UACf,UAAU,CAAC,MAAM,aAAa,EAAE,GAAG,SAAS,SAAS,EAAE,OAAO,MAAM,CAAC;AAAA,UACrE,OAAO;AAAA,UAEP;AAAA,gCAAC,YAAO,OAAM,IAAG,0BAAY;AAAA,YAC5B,eAAe,IAAI,CAAC,SACnB,oBAAC,YAAkB,OAAO,MACvB,kBADU,IAEb,CACD;AAAA;AAAA;AAAA,MACH;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,QAAQ;AAAA,UACf,UAAU,CAAC,MAAM,aAAa,EAAE,GAAG,SAAS,QAAQ,EAAE,OAAO,MAAM,CAAC;AAAA,UACpE,OAAO;AAAA,UAEP;AAAA,gCAAC,YAAO,OAAM,IAAG,yBAAW;AAAA,YAC5B,oBAAC,YAAO,OAAM,OAAM,iBAAG;AAAA,YACvB,oBAAC,YAAO,OAAM,UAAS,oBAAM;AAAA,YAC7B,oBAAC,YAAO,OAAM,SAAQ,mBAAK;AAAA;AAAA;AAAA,MAC7B;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,QAAQ;AAAA,UACf,UAAU,CAAC,MAAM,aAAa,EAAE,GAAG,SAAS,QAAQ,EAAE,OAAO,MAAM,CAAC;AAAA,UACpE,OAAO;AAAA,UAEP;AAAA,gCAAC,YAAO,OAAM,IAAG,0BAAY;AAAA,YAC7B,oBAAC,YAAO,OAAM,WAAU,qBAAO;AAAA,YAC/B,oBAAC,YAAO,OAAM,WAAU,qBAAO;AAAA,YAC/B,oBAAC,YAAO,OAAM,UAAS,oBAAM;AAAA,YAC7B,oBAAC,YAAO,OAAM,WAAU,qBAAO;AAAA;AAAA;AAAA,MACjC;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,UACV,SAAS,MAAM,KAAK,KAAK,MAAM,OAAO;AAAA,UAErC;AAAA,wBAAY,WAAM;AAAA,YAAI;AAAA;AAAA;AAAA,MACzB;AAAA,MACC,OAAO,SAAS,KACf,qBAAC,UAAK,OAAO,qBACV;AAAA,eAAO;AAAA,QACP,UAAU,MAAM;AAAA,QAAG;AAAA,SACtB;AAAA,OAEJ;AAAA,IAGC,OAAO,WAAW,KAAK,CAAC,YACvB,oBAAC,SAAI,OAAO,qBAAqB,kDAAoC,IAErE,qBAAC,SAAI,OAAO,oBACT;AAAA,aAAO,IAAI,CAAC,UAAU;AACrB,cAAM,aAAa,eAAe,MAAM;AACxC,eACE,qBAAC,SAAwB,OAAO,kBAAkB,UAAU,GAC1D;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO;AAAA,cACP,SAAS,MAAM,cAAc,aAAa,OAAO,MAAM,OAAO;AAAA,cAE9D;AAAA,qCAAC,UAAK,OAAO,mBAAmB;AAAA;AAAA,kBAAE,MAAM;AAAA,mBAAQ;AAAA,gBAChD,oBAAC,kBAAe,MAAM,MAAM,MAAM;AAAA,gBAClC,oBAAC,oBAAiB,QAAQ,MAAM,QAAQ;AAAA,gBACxC,oBAAC,oBAAiB,QAAQ,MAAM,QAAQ;AAAA,gBACxC,oBAAC,UAAK,OAAO,oBAAqB,gBAAM,SAAQ;AAAA,gBAChD,oBAAC,UAAK,OAAO,mBAAoB,gBAAM,SAAQ;AAAA,gBAC/C,oBAAC,UAAK,OAAO,sBAAuB,6BAAmB,MAAM,SAAS,GAAE;AAAA,gBACxE,oBAAC,UAAK,OAAO,oBAAqB,uBAAa,WAAM,UAAI;AAAA;AAAA;AAAA,UAC3D;AAAA,UAEC,cACC,qBAAC,SAAI,OAAO,oBACV;AAAA,iCAAC,SAAI,OAAO,wBACV;AAAA,mCAAC,UAAK,OAAO,qBAAqB;AAAA;AAAA,gBAAS,MAAM;AAAA,iBAAe;AAAA,cAChE,qBAAC,UAAK,OAAO,qBAAqB;AAAA;AAAA,gBAAO,MAAM,kBAAkB;AAAA,iBAAI;AAAA,cACrE,qBAAC,UAAK,OAAO,qBAAqB;AAAA;AAAA,gBAAK,MAAM;AAAA,iBAAU;AAAA,eACzD;AAAA,YACA,oBAAC,SAAI,OAAO,uBAAwB,wBAAc,MAAM,OAAO,GAAE;AAAA,aACnE;AAAA,aAxBM,MAAM,OA0BhB;AAAA,MAEJ,CAAC;AAAA,MAEA,WACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,UACV,SAAS,MAAM,KAAK,KAAK,OAAO,OAAO;AAAA,UAEtC,sBAAY,kBAAa,QAAQ,SAAS;AAAA;AAAA,MAC7C;AAAA,OAEJ;AAAA,KAEJ;AAEJ;AAEA,SAAS,eAAe,EAAE,KAAK,GAAqB;AAClD,QAAM,EAAE,OAAO,MAAM,IACnB,SAAS,iBACL,EAAE,OAAO,uBAAuB,OAAO,SAAS,IAChD,SAAS,iBACP,EAAE,OAAO,uBAAuB,OAAO,SAAS,IAChD,EAAE,OAAO,uBAAuB,OAAO,SAAS;AACxD,SAAO,oBAAC,UAAK,OAAe,iBAAM;AACpC;AAEA,SAAS,iBAAiB,EAAE,OAAO,GAAuB;AACxD,QAAM,QACJ,WAAW,QAAQ,uBAAuB,WAAW,WAAW,0BAA0B;AAC5F,SAAO,oBAAC,UAAK,OAAe,kBAAO;AACrC;AAEA,SAAS,iBAAiB,EAAE,OAAO,GAAuB;AACxD,QAAM,QACJ,WAAW,YACP,2BACA,WAAW,YACT,2BACA,WAAW,WACT,0BACA;AACV,SAAO,oBAAC,UAAK,OAAe,kBAAO;AACrC;AAEA,SAAS,mBAAmB,IAAoB;AAE9C,QAAM,KAAK,OAAO,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC;AAClC,MAAI,CAAC,OAAO,MAAM,EAAE,KAAK,KAAK,MAAM;AAClC,WAAO,IAAI,KAAK,EAAE,EAAE,mBAAmB;AAAA,EACzC;AACA,SAAO,GAAG,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AACzC;AAEA,SAAS,cAAc,KAAqB;AAC1C,MAAI;AACF,WAAO,KAAK,UAAU,KAAK,MAAM,GAAG,GAAG,MAAM,CAAC;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,SACE,qBAAC,SAAI,OAAO,yBAEV;AAAA,yBAAC,SAAI,OAAO,oBACV;AAAA,2BAAC,SAAI,OAAO,oBACV;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,sBAAsB,gBAAgB,QAAQ;AAAA,YACrD,SAAS,MAAM,eAAe,QAAQ;AAAA,YACvC;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,sBAAsB,gBAAgB,QAAQ;AAAA,YACrD,SAAS,MAAM,eAAe,QAAQ;AAAA,YACvC;AAAA;AAAA,QAED;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,OAAO,yBACT;AAAA,SAAC,oBAAoB,oBAAC,UAAK,OAAO,yBAAyB,kCAAoB;AAAA,QAChF,oBAAC,UAAK,OAAO,oBAAoB,iCAAS;AAAA,QAC1C;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,gBAAgB,aAAa,WAAW,WAAW,SAAS;AAAA,YACnE,UAAU,CAAC;AAAA,YACX,SAAS,MAAM,KAAK,SAAS;AAAA,YAE5B,qBAAW,WAAW,YACrB,iCACE;AAAA,kCAAC,UAAK,OAAO,kBAAkB;AAAA,cAAE;AAAA,eAEnC,IAEA,gCAAE,wBAAK;AAAA;AAAA,QAEX;AAAA,SACF;AAAA,OACF;AAAA,IAGA,oBAAC,SAAI,OAAO,qBACV;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,QAChD,WAAW,CAAC,UAAU;AACpB,eAAK,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ,WAAW,aAAa;AAC5E,kBAAM,eAAe;AACrB,iBAAK,SAAS;AAAA,UAChB;AAAA,QACF;AAAA,QACA,OAAO;AAAA,QACP,aAAY;AAAA,QACZ,YAAY;AAAA;AAAA,IACd,GACF;AAAA,IAGA,oBAAC,SAAI,OAAO,kBACT,0BAAgB,WACb,gFACA,gDACN;AAAA,IAGC,WAAW,WAAW,WACrB,qBAAC,SAAI,OAAO,kBACV;AAAA,2BAAC,SAAI,OAAO,oBACV;AAAA,4BAAC,UAAK,OAAO,kBAAkB,mBAAK;AAAA,QACpC,qBAAC,UAAK,OAAO,kBACV;AAAA,qBAAW,MAAM;AAAA,UAAO;AAAA,UAAI,WAAW,MAAM;AAAA,WAChD;AAAA,SACF;AAAA,MACA,oBAAC,SAAI,OAAO,oBAAqB,qBAAW,MAAM,SAAQ;AAAA,OAC5D;AAAA,IAGD,WAAW,WAAW,aACrB,qBAAC,SAAI,OAAO,mBACV;AAAA,2BAAC,SAAI,OAAO,oBACV;AAAA,6BAAC,UAAK,OAAO,oBACV;AAAA,qBAAW,OAAO;AAAA,UAAS;AAAA,UAAK,WAAW,OAAO,aAAa,IAAI,MAAM;AAAA,WAC5E;AAAA,QACA,qBAAC,UAAK,OAAO,kBACV;AAAA,qBAAW,OAAO;AAAA,UAAO;AAAA,UAAI,WAAW,OAAO;AAAA,UAAW;AAAA,WAC7D;AAAA,SACF;AAAA,MACA,oBAAC,eAAY,MAAM,WAAW,OAAO,MAAM;AAAA,OAC7C;AAAA,KAEJ;AAEJ;AAEA,SAAS,YAAY,EAAE,KAAK,GAAwB;AAClD,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,oBAAC,SAAI,OAAO,mBAAmB,oCAAsB;AAAA,EAC9D;AAEA,QAAM,WAAW,KAAK,CAAC;AACvB,MAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,WAAO,oBAAC,SAAI,OAAO,iBAAkB,eAAK,UAAU,MAAM,MAAM,CAAC,GAAE;AAAA,EACrE;AAEA,QAAM,UAAU,OAAO,KAAK,QAAkB;AAE9C,SACE,oBAAC,SAAI,OAAO,oBACV,+BAAC,WAAM,OAAO,aACZ;AAAA,wBAAC,WACC,+BAAC,QACC;AAAA,0BAAC,QAAG,OAAO,gBAAgB,eAAC;AAAA,MAC3B,QAAQ,IAAI,CAAC,QACZ,oBAAC,QAAa,OAAO,UAClB,iBADM,GAET,CACD;AAAA,OACH,GACF;AAAA,IACA,oBAAC,WACE,eAAK,IAAI,CAAC,KAAK,WACd,qBAAC,QAAgB,OAAO,SAAS,MAAM,IAAI,WAAW,aACpD;AAAA,0BAAC,QAAG,OAAO,gBAAiB,mBAAS,GAAE;AAAA,MACtC,QAAQ,IAAI,CAAC,QAAQ;AACpB,cAAM,MAAO,IAAgC,GAAG;AAChD,eACE,oBAAC,QAAa,OAAO,UAClB,kBAAQ,OACP,oBAAC,UAAK,OAAO,iBAAiB,kBAAI,IAChC,OAAO,QAAQ,WACjB,oBAAC,UAAK,OAAO,iBAAkB,eAAK,UAAU,GAAG,GAAE,IAEnD,OAAO,GAAG,KANL,GAQT;AAAA,MAEJ,CAAC;AAAA,SAfM,MAgBT,CACD,GACH;AAAA,KACF,GACF;AAEJ;AAIA,SAAS,oBAAoB,MAAc,YAAoB,gBAAgC;AAC7F,MAAI,iBAAiB,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,IAAI,KAAK,WAAW,MAAM,GAAG,CAAC,CAAC;AAC3C;AAEA,SAAS,yBAAyB,OAAuB;AACvD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,QAAM,4BAA4B,QAAQ,QAAQ,WAAW,EAAE;AAC/D,MAAI,0BAA0B,SAAS,GAAG,GAAG;AAC3C,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,QAAQ,MAAM,UAAU,EAAE,MAAM,aAAa;AACnD,SAAO,QAAQ,CAAC,GAAG,YAAY,KAAK;AACtC;AAEA,SAAS,0BAA0B,eAAgC;AACjE,SAAO,kBAAkB,YAAY,kBAAkB;AACzD;AAEA,SAAS,mBAA+C;AACtD,SAAO;AACT;AAEA,IAAM,gBAA4C;AAAA,EAChD,WAAW,CAAC;AACd;AAIA,IAAM,IAAI;AAAA,EACR,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,EACX,OAAO;AACT;AAEA,IAAM,qBAAoC;AAAA,EACxC,UAAU;AAAA,EACV,OAAO;AAAA,EACP,eAAe;AAAA,EACf,QAAQ;AACV;AAEA,IAAM,sBAAqC;AAAA,EACzC,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY,EAAE;AAAA,EACd,OAAO,EAAE;AAAA,EACT,WAAW,aAAa,EAAE,MAAM;AAAA,EAChC,QAAQ;AAAA,EACR,eAAe;AACjB;AAEA,IAAM,oBAAmC;AAAA,EACvC,OAAO,EAAE;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AACd;AAEA,IAAM,qBAAoC;AAAA,EACxC,UAAU;AAAA,EACV,cAAc;AAAA,EACd,SAAS;AAAA,EACT,iBAAiB,EAAE;AAAA,EACnB,OAAO,EAAE;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AACd;AAEA,IAAM,gBAA+B;AAAA,EACnC,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,gBAAgB;AAClB;AAEA,IAAM,eAA8B;AAAA,EAClC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,eAAe;AAAA,EACf,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,cAAc;AAAA,EACd,YAAY,EAAE;AAAA,EACd,WAAW,aAAa,EAAE,MAAM;AAAA,EAChC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,UAAU;AACZ;AAEA,IAAM,eAA8B;AAAA,EAClC,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,SAAS;AAAA,EACT,cAAc,aAAa,EAAE,MAAM;AAAA,EACnC,YAAY,EAAE;AAAA,EACd,YAAY;AACd;AAEA,IAAM,mBAAkC;AAAA,EACtC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AACP;AAEA,IAAM,mBAAkC;AAAA,EACtC,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,YAAY;AACd;AAEA,IAAM,gBAA+B;AAAA,EACnC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,OAAO,EAAE;AAAA,EACT,YAAY;AACd;AAEA,IAAM,cAA6B;AAAA,EACjC,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,eAAe;AACjB;AAEA,IAAM,oBAAmC;AAAA,EACvC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AACP;AAEA,IAAM,4BAA2C;AAAA,EAC/C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AACP;AAEA,IAAM,2BAA0C;AAAA,EAC9C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,eAAe;AAAA,EACf,eAAe;AACjB;AAEA,IAAM,6BAA4C;AAAA,EAChD,cAAc;AAAA,EACd,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,SAAS;AAAA,EACT,iBAAiB,EAAE;AAAA,EACnB,OAAO,EAAE;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AACV;AAEA,IAAM,2BAA0C;AAAA,EAC9C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,iBAAiB,EAAE;AAAA,EACnB,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AACd;AAEA,IAAM,oBAAmC;AAAA,EACvC,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,cAAc;AAAA,EACd,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,OAAO,EAAE;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AACV;AAEA,IAAM,mBAAkC;AAAA,EACtC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,KAAK;AAAA,EACL,MAAM;AACR;AAEA,IAAM,uBAAsC;AAAA,EAC1C,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,SAAS;AACX;AAEA,IAAM,uBAAsC;AAAA,EAC1C,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AACX;AAEA,IAAM,0BAAyC;AAAA,EAC7C,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,WAAW;AACb;AAEA,IAAM,mBAAkC;AAAA,EACtC,YAAY;AAAA,EACZ,iBAAiB,EAAE;AAAA,EACnB,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,cAAc;AAAA,EACd,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO,EAAE;AACX;AAEA,IAAM,sBAAqC;AAAA,EACzC,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,UAAU;AACZ;AAEA,IAAM,gBAA+B;AAAA,EACnC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,SAAS;AAAA,EACT,aAAa,aAAa,EAAE,MAAM;AAAA,EAClC,YAAY,EAAE;AAAA,EACd,WAAW;AACb;AAEA,IAAM,YAA2B;AAAA,EAC/B,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,cAAc;AAChB;AAEA,IAAM,gBAA+B;AAAA,EACnC,UAAU;AAAA,EACV,SAAS;AACX;AAEA,IAAM,oBAAmC;AAAA,EACvC,WAAW;AAAA,EACX,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY,EAAE;AAAA,EACd,QAAQ,aAAa,EAAE,MAAM;AAC/B;AAEA,IAAM,yBAAwC;AAAA,EAC5C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,OAAO,EAAE;AAAA,EACT,cAAc;AAChB;AAEA,IAAM,yBAAwC;AAAA,EAC5C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AACd;AAEA,IAAM,uBAAsC;AAAA,EAC1C,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AACb;AAEA,IAAM,iBAAgC;AAAA,EACpC,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AACX;AAIA,IAAM,uBAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AACP;AAEA,IAAM,yBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,KAAK;AACP;AAEA,IAAM,qBAAoC;AAAA,EACxC,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,YAAY,EAAE;AAChB;AAEA,IAAM,0BAAyC;AAAA,EAC7C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,OAAO,EAAE;AAAA,EACT,cAAc;AAChB;AAEA,IAAM,0BAAyC;AAAA,EAC7C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,WAAW;AACb;AAEA,IAAM,wBAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AACP;AAEA,IAAM,6BAA4C;AAAA,EAChD,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,OAAO,EAAE;AACX;AAEA,IAAM,8BAA6C;AAAA,EACjD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,KAAK;AACP;AAEA,IAAM,8BAA6C;AAAA,EACjD,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,cAAc;AAAA,EACd,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,OAAO,EAAE;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,YAAY;AACd;AAEA,IAAM,iCAAgD;AAAA,EACpD,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,YAAY,EAAE;AAAA,EACd,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AACb;AAEA,IAAM,iCAAgD;AAAA,EACpD,OAAO,EAAE;AAAA,EACT,WAAW;AACb;AAEA,IAAM,iCAAgD;AAAA,EACpD,OAAO,EAAE;AACX;AAEA,IAAM,sBAAqC;AAAA,EACzC,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,WAAW;AACb;AAEA,IAAM,sBAAqC;AAAA,EACzC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AACP;AAEA,IAAM,qBAAoC;AAAA,EACxC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY,EAAE;AAAA,EACd,QAAQ,aAAa,EAAE,MAAM;AAC/B;AAEA,IAAM,sBAAqC;AAAA,EACzC,OAAO,EAAE;AAAA,EACT,UAAU;AACZ;AAEA,IAAM,sBAAqC;AAAA,EACzC,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO,EAAE;AACX;AAEA,IAAM,sBAAqC;AAAA,EACzC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,UAAU;AAAA,EACV,OAAO,EAAE;AACX;AAEA,IAAM,uBAAsC;AAAA,EAC1C,OAAO,EAAE;AAAA,EACT,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AACd;AAEA,IAAM,uBAAsC;AAAA,EAC1C,OAAO,EAAE;AACX;AAEA,IAAM,mBAAkC;AAAA,EACtC,WAAW;AAAA,EACX,cAAc;AAAA,EACd,QAAQ,aAAa,EAAE,WAAW;AAAA,EAClC,SAAS;AAAA,EACT,YAAY,EAAE;AAChB;AAEA,IAAM,wBAAuC;AAAA,EAC3C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,OAAO,EAAE;AAAA,EACT,cAAc;AAChB;AAEA,IAAM,sBAAqC;AAAA,EACzC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,KAAK;AACP;AAEA,IAAM,uBAAsC;AAAA,EAC1C,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,YAAY;AACd;AAEA,IAAM,0BAAyC;AAAA,EAC7C,SAAS;AAAA,EACT,KAAK;AAAA,EACL,YAAY;AACd;AAEA,IAAM,oBAAmC;AAAA,EACvC,YAAY;AAAA,EACZ,QAAQ,aAAa,EAAE,WAAW;AAAA,EAClC,cAAc;AAAA,EACd,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,OAAO,EAAE;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,YAAY;AACd;AAEA,IAAM,0BAAyC;AAAA,EAC7C,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,cAAc;AAAA,EACd,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,OAAO,EAAE;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,YAAY;AACd;AAEA,IAAM,2BAA0C;AAAA,EAC9C,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS;AAAA,EACT,iBAAiB,EAAE;AAAA,EACnB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,YAAY;AACd;AAIA,IAAM,0BAAyC;AAAA,EAC7C,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,QAAQ;AACV;AAEA,IAAM,qBAAoC;AAAA,EACxC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,UAAU;AACZ;AAEA,IAAM,qBAAoC;AAAA,EACxC,SAAS;AAAA,EACT,KAAK;AAAA,EACL,cAAc;AAAA,EACd,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,UAAU;AAAA,EACV,YAAY,EAAE;AAChB;AAEA,IAAM,0BAAyC;AAAA,EAC7C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AACP;AAEA,IAAM,0BAAyC;AAAA,EAC7C,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,YAAY;AACd;AAEA,IAAM,qBAAoC;AAAA,EACxC,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,YAAY,EAAE;AAChB;AAEA,IAAM,sBAAqC;AAAA,EACzC,cAAc;AAAA,EACd,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,UAAU;AAAA,EACV,YAAY,EAAE;AAChB;AAEA,IAAM,iBAAgC;AAAA,EACpC,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,OAAO,EAAE;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,WAAW;AACb;AAEA,IAAM,mBAAkC;AAAA,EACtC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AACX;AAEA,IAAM,oBAAmC;AAAA,EACvC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,cAAc;AAAA,EACd,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,UAAU;AAAA,EACV,YAAY,EAAE;AAChB;AAEA,IAAM,mBAAkC;AAAA,EACtC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ,aAAa,EAAE,WAAW;AAAA,EAClC,YAAY,EAAE;AAChB;AAEA,IAAM,qBAAoC;AAAA,EACxC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,SAAS;AAAA,EACT,cAAc,aAAa,EAAE,MAAM;AAAA,EACnC,YAAY,EAAE;AAChB;AAEA,IAAM,qBAAoC;AAAA,EACxC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,iBAAiB,EAAE;AAAA,EACnB,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AACd;AAEA,IAAM,mBAAkC;AAAA,EACtC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,iBAAiB,EAAE;AAAA,EACnB,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AACd;AAEA,IAAM,mBAAkC;AAAA,EACtC,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,YAAY;AACd;AAEA,IAAM,oBAAmC;AAAA,EACvC,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AACb;AAEA,IAAM,kBAAiC;AAAA,EACrC,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,YAAY;AACd;AAEA,IAAM,qBAAoC;AAAA,EACxC,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AACb;AAEA,IAAM,qBAAoC;AAAA,EACxC,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AACb;AAEA,IAAM,cAA6B;AAAA,EACjC,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,YAAY;AACd;AAEA,IAAM,WAA0B;AAAA,EAC9B,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,eAAe;AAAA,EACf,eAAe;AAAA,EACf,OAAO,EAAE;AAAA,EACT,cAAc,aAAa,EAAE,MAAM;AAAA,EACnC,aAAa,aAAa,EAAE,MAAM;AAAA,EAClC,YAAY,EAAE;AAAA,EACd,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,KAAK;AACP;AAEA,IAAM,iBAAgC;AAAA,EACpC,GAAG;AAAA,EACH,OAAO,EAAE;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AACb;AAEA,IAAM,WAA0B;AAAA,EAC9B,YAAY;AACd;AAEA,IAAM,cAA6B;AAAA,EACjC,YAAY,EAAE;AAChB;AAEA,IAAM,WAA0B;AAAA,EAC9B,SAAS;AAAA,EACT,cAAc,aAAa,EAAE,MAAM;AAAA,EACnC,aAAa,aAAa,EAAE,MAAM;AAAA,EAClC,OAAO,EAAE;AAAA,EACT,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,cAAc;AAChB;AAEA,IAAM,iBAAgC;AAAA,EACpC,GAAG;AAAA,EACH,OAAO,EAAE;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AACd;AAEA,IAAM,kBAAiC;AAAA,EACrC,OAAO,EAAE;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AACX;AAEA,IAAM,kBAAiC;AAAA,EACrC,OAAO,EAAE;AACX;AAEA,SAAS,mBAAmB,UAAkC;AAC5D,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,YAAY,WAAW,EAAE,UAAU;AAAA,IACnC,OAAO,WAAW,EAAE,OAAO,EAAE;AAAA,IAC7B,UAAU;AAAA,IACV,YAAY,WAAW,MAAM;AAAA,IAC7B,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY,WAAW,aAAa,EAAE,IAAI,KAAK;AAAA,EACjD;AACF;AAEA,SAAS,sBAAsB,UAAkC;AAC/D,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,aAAa,aAAa,EAAE,MAAM;AAAA,IAClC,SAAS;AAAA,IACT,YAAY,WAAW,EAAE,UAAU;AAAA,IACnC,OAAO,WAAW,EAAE,OAAO,EAAE;AAAA,IAC7B,UAAU;AAAA,IACV,YAAY,WAAW,MAAM;AAAA,IAC7B,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AACF;AAEA,SAAS,gBAAgB,SAAkB,SAAiC;AAC1E,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,YAAY,UAAU,EAAE,OAAO,EAAE;AAAA,IACjC,OAAO,UAAU,YAAY,EAAE;AAAA,IAC/B,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,QAAQ,UAAU,YAAY;AAAA,IAC9B,SAAS,UAAU,OAAO;AAAA,IAC1B,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AACF;AAEA,IAAM,mBAAkC;AAAA,EACtC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,iBAAiB;AACnB;AAIA,IAAM,qBAAoC;AAAA,EACxC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AACP;AAEA,IAAM,sBAAqC;AAAA,EACzC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AACP;AAEA,IAAM,4BAA2C;AAAA,EAC/C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AACP;AAEA,IAAM,2BAA0C;AAAA,EAC9C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,OAAO,EAAE;AACX;AAEA,IAAM,oBAAmC;AAAA,EACvC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,iBAAiB,EAAE;AAAA,EACnB,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AACd;AAEA,IAAM,6BAA4C;AAAA,EAChD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,YAAY;AACd;AAEA,IAAM,0BAAyC;AAAA,EAC7C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,iBAAiB,EAAE;AAAA,EACnB,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,cAAc;AAAA,EACd,SAAS;AACX;AAEA,IAAM,wBAAuC;AAAA,EAC3C,cAAc;AAAA,EACd,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,UAAU;AACZ;AAEA,IAAM,6BAA4C;AAAA,EAChD,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,KAAK;AAAA,EACL,iBAAiB,EAAE;AAAA,EACnB,cAAc,aAAa,EAAE,MAAM;AACrC;AAEA,IAAM,wBAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,OAAO,EAAE;AAAA,EACT,aAAa,aAAa,EAAE,MAAM;AACpC;AAEA,IAAM,uBAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,KAAK;AAAA,EACL,cAAc,aAAa,EAAE,MAAM;AACrC;AAEA,IAAM,wBAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,aAAa,aAAa,EAAE,MAAM;AACpC;AAEA,IAAM,wBAAuC;AAAA,EAC3C,OAAO,EAAE;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AACX;AAEA,IAAM,uBAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,aAAa,aAAa,EAAE,MAAM;AACpC;AAEA,IAAM,yBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AACX;AAEA,IAAM,wBAAuC;AAAA,EAC3C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,iBAAiB,EAAE;AAAA,EACnB,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AACd;AAEA,IAAM,oBAAmC;AAAA,EACvC,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,WAAW;AACb;AAEA,IAAM,sBAAqC;AAAA,EACzC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AACP;AAEA,SAAS,sBAAsB,SAAiC;AAC9D,SAAO;AAAA,IACL,SAAS;AAAA,IACT,qBAAqB;AAAA,IACrB,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,SAAS;AAAA,IACT,cAAc;AAAA,IACd,YAAY,UAAU,EAAE,SAAS;AAAA,IACjC,QAAQ,aAAa,UAAU,EAAE,SAAS,EAAE,WAAW;AAAA,IACvD,SAAS,UAAU,IAAI;AAAA,EACzB;AACF;AAEA,IAAM,yBAAwC;AAAA,EAC5C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,OAAO,EAAE;AACX;AAEA,IAAM,0BAAyC;AAAA,EAC7C,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,iBAAiB,EAAE;AAAA,EACnB,UAAU;AACZ;AAEA,SAAS,0BAA0B,SAAiC;AAClE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,UAAU,SAAS;AAAA,IAC1B,cAAc;AAAA,IACd,iBAAiB,EAAE;AAAA,IACnB,YAAY;AAAA,EACd;AACF;AAEA,SAAS,sBAAsB,SAAkB,WAAmC;AAClF,MAAI,WAAW;AACb,WAAO;AAAA,MACL,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO,EAAE;AAAA,MACT,iBAAiB,EAAE;AAAA,MACnB,cAAc;AAAA,MACd,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AACA,MAAI,SAAS;AACX,WAAO;AAAA,MACL,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO,EAAE;AAAA,MACT,iBAAiB,EAAE;AAAA,MACnB,cAAc;AAAA,MACd,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO,EAAE;AAAA,IACT,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AACF;AAIA,IAAM,uBAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,QAAQ;AACV;AAEA,IAAM,wBAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,UAAU;AAAA,EACV,YAAY;AACd;AAEA,IAAM,6BAA4C;AAAA,EAChD,cAAc;AAAA,EACd,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,SAAS;AAAA,EACT,iBAAiB,EAAE;AAAA,EACnB,OAAO,EAAE;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AACV;AAEA,IAAM,8BAA6C;AAAA,EACjD,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,cAAc;AAAA,EACd,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,OAAO,EAAE;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AACV;AAEA,IAAM,sBAAqC;AAAA,EACzC,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AACX;AAEA,IAAM,sBAAqC;AAAA,EACzC,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,WAAW;AACb;AAEA,IAAM,qBAAoC;AAAA,EACxC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,WAAW;AAAA,EACX,MAAM;AACR;AAEA,SAAS,kBAAkB,YAAoC;AAC7D,SAAO;AAAA,IACL,cAAc;AAAA,IACd,QAAQ,aAAa,aAAa,GAAG,EAAE,IAAI,OAAO,EAAE,MAAM;AAAA,IAC1D,YAAY,aAAa,EAAE,WAAW,EAAE;AAAA,IACxC,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AACF;AAEA,IAAM,uBAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AACZ;AAEA,IAAM,oBAAmC;AAAA,EACvC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,UAAU;AACZ;AAEA,IAAM,qBAAoC;AAAA,EACxC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,YAAY;AACd;AAEA,IAAM,oBAAmC;AAAA,EACvC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,UAAU;AACZ;AAEA,IAAM,uBAAsC;AAAA,EAC1C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,YAAY;AACd;AAEA,IAAM,qBAAoC;AAAA,EACxC,UAAU;AAAA,EACV,OAAO,EAAE;AAAA,EACT,YAAY;AACd;AAEA,IAAM,qBAAoC;AAAA,EACxC,WAAW,aAAa,EAAE,MAAM;AAAA,EAChC,SAAS;AACX;AAEA,IAAM,yBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,KAAK;AAAA,EACL,cAAc;AAChB;AAEA,IAAM,sBAAqC;AAAA,EACzC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AACX;AAEA,IAAM,wBAAuC;AAAA,EAC3C,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AACb;AAEA,IAAM,uBAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,QAAQ,aAAa,EAAE,MAAM;AAAA,EAC7B,cAAc;AAAA,EACd,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,OAAO,EAAE;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,YAAY;AACd;AAGA,IAAM,qBAAoC;AAAA,EACxC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AACd;AAEA,IAAM,wBAAuC;AAAA,EAC3C,GAAG;AAAA,EACH,OAAO,EAAE;AAAA,EACT,iBAAiB,EAAE;AACrB;AAEA,IAAM,wBAAuC;AAAA,EAC3C,GAAG;AAAA,EACH,OAAO;AAAA,EACP,iBAAiB;AACnB;AAEA,IAAM,wBAAuC;AAAA,EAC3C,GAAG;AAAA,EACH,OAAO,EAAE;AAAA,EACT,iBAAiB;AACnB;AAGA,IAAM,uBAAsC;AAAA,EAC1C,GAAG;AAAA,EACH,OAAO,EAAE;AAAA,EACT,iBAAiB,EAAE;AACrB;AAEA,IAAM,0BAAyC;AAAA,EAC7C,GAAG;AAAA,EACH,OAAO,EAAE;AAAA,EACT,iBAAiB;AACnB;AAEA,IAAM,yBAAwC;AAAA,EAC5C,GAAG;AAAA,EACH,OAAO,EAAE;AAAA,EACT,iBAAiB,EAAE;AAAA,EACnB,QAAQ,aAAa,EAAE,MAAM;AAC/B;AAGA,IAAM,2BAA0C;AAAA,EAC9C,GAAG;AAAA,EACH,OAAO,EAAE;AAAA,EACT,iBAAiB,EAAE;AACrB;AAEA,IAAM,2BAA0C;AAAA,EAC9C,GAAG;AAAA,EACH,OAAO,EAAE;AAAA,EACT,iBAAiB;AACnB;AAEA,IAAM,0BAAyC;AAAA,EAC7C,GAAG;AAAA,EACH,OAAO,EAAE;AAAA,EACT,iBAAiB,EAAE;AACrB;AAEA,IAAM,2BAA0C;AAAA,EAC9C,GAAG;AAAA,EACH,OAAO,EAAE;AAAA,EACT,iBAAiB,EAAE;AACrB;","names":[]}
1
+ {"version":3,"sources":["../src/devtools.tsx","../src/devtools-registry.ts"],"sourcesContent":["import type { SharedLiveQuerySnapshot } from \"@sqlite-sync/core\";\nimport type { CSSProperties } from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from \"react\";\nimport {\n getOrCreateSQLiteSyncDevtoolsRegistry,\n type SQLiteSyncDevtoolsInstance,\n type SQLiteSyncDevtoolsSnapshot,\n} from \"./devtools-registry\";\n\ntype SQLiteSyncDevtoolsProps = {\n className?: string;\n};\n\ntype DevtoolsTab = \"overview\" | \"schema\" | \"live-queries\" | \"event-log\" | \"query-runner\";\ntype QueryTarget = \"memory\" | \"worker\";\n\ntype QueryState =\n | {\n status: \"idle\";\n }\n | {\n status: \"running\";\n }\n | {\n status: \"success\";\n output: {\n target: QueryTarget;\n sql: string;\n rowCount: number;\n durationMs: number;\n rows: unknown[];\n };\n }\n | {\n status: \"error\";\n error: {\n target: QueryTarget;\n sql: string;\n message: string;\n };\n };\n\nexport function SQLiteSyncDevtools({ className }: SQLiteSyncDevtoolsProps) {\n const registry = getOrCreateSQLiteSyncDevtoolsRegistry();\n const snapshot = useSyncExternalStore(registry.subscribe, registry.getSnapshot, getEmptySnapshot);\n const instances = snapshot.instances;\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeTab, setActiveTab] = useState<DevtoolsTab>(\"overview\");\n const [selectedInstanceId, setSelectedInstanceId] = useState<string>(\"\");\n const [queryTarget, setQueryTarget] = useState<QueryTarget>(\"memory\");\n const [query, setQuery] = useState(\"\");\n const [queryState, setQueryState] = useState<QueryState>({\n status: \"idle\",\n });\n\n useEffect(() => {\n if (!isOpen) return;\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [isOpen]);\n\n useEffect(() => {\n if (instances.length === 0) {\n setSelectedInstanceId(\"\");\n return;\n }\n\n if (instances.some((instance) => instance.instanceId === selectedInstanceId)) {\n return;\n }\n\n setSelectedInstanceId(instances[0]?.instanceId ?? \"\");\n }, [instances, selectedInstanceId]);\n\n const dbIdCounts = useMemo(() => {\n const counts = new Map<string, number>();\n\n for (const instance of instances) {\n counts.set(instance.dbId, (counts.get(instance.dbId) ?? 0) + 1);\n }\n\n return counts;\n }, [instances]);\n\n const selectedInstance = useMemo(() => {\n return instances.find((instance) => instance.instanceId === selectedInstanceId) ?? null;\n }, [instances, selectedInstanceId]);\n\n const canRunQuery = selectedInstance !== null && query.trim().length > 0 && queryState.status !== \"running\";\n\n const runQuery = async () => {\n if (!selectedInstance) return;\n\n let normalizedQuery = query.trim();\n\n try {\n normalizedQuery = normalizeSingleStatement(query);\n const statementKind = getStatementKind(normalizedQuery);\n\n if (queryTarget === \"worker\") {\n if (!isWorkerReadOnlyStatement(statementKind)) {\n throw new Error(\"Worker DB devtools only allows read-only SQL: SELECT, PRAGMA.\");\n }\n } else {\n const touchedTables = selectedInstance.instance._internal.getMemoryQueryTables(normalizedQuery);\n const writtenTables = touchedTables.filter((table) => table.isWrite).map((table) => table.name);\n const allowedTables = new Set(selectedInstance.instance._internal.crdtTableNames);\n\n const invalidTables = writtenTables.filter((table) => !allowedTables.has(table));\n if (invalidTables.length > 0) {\n throw new Error(\n `Memory DB writes are only allowed for CRDT tables. Rejected tables: ${invalidTables.join(\", \")}`,\n );\n }\n }\n\n setQueryState({ status: \"running\" });\n const startedAt = performance.now();\n\n const result =\n queryTarget === \"memory\"\n ? selectedInstance.instance.db.execute(normalizedQuery)\n : await selectedInstance.instance._internal.executeAsync({\n sql: normalizedQuery,\n parameters: [],\n });\n\n setQueryState({\n status: \"success\",\n output: {\n target: queryTarget,\n sql: normalizedQuery,\n rowCount: result.rows.length,\n durationMs: Number((performance.now() - startedAt).toFixed(2)),\n rows: result.rows,\n },\n });\n } catch (error) {\n setQueryState({\n status: \"error\",\n error: {\n target: queryTarget,\n sql: normalizedQuery,\n message: error instanceof Error ? error.message : String(error),\n },\n });\n }\n };\n\n return (\n <>\n <div style={floatingRootStyles}>\n <button type=\"button\" style={triggerButtonStyles} onClick={() => setIsOpen(true)} title=\"SQLite Sync Devtools\">\n <span style={triggerIconStyles}>◈</span>\n <span style={triggerCountStyles}>{instances.length}</span>\n </button>\n </div>\n\n {isOpen ? (\n <div style={overlayStyles} onClick={() => setIsOpen(false)}>\n <section\n className={className}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"SQLite Sync devtools\"\n style={dialogStyles}\n onClick={(event) => event.stopPropagation()}\n >\n {/* Dialog header */}\n <div style={headerStyles}>\n <div style={headerLeftStyles}>\n <span style={headerLogoStyles}>◈</span>\n <div>\n <div style={eyebrowStyles}>sqlite-sync</div>\n <h2 style={titleStyles}>Devtools</h2>\n </div>\n </div>\n\n <div style={headerRightStyles}>\n {instances.length > 0 && (\n <label style={instancePickerLabelStyles}>\n <span style={instancePickerTextStyles}>DB</span>\n <select\n value={selectedInstanceId}\n onChange={(event) => setSelectedInstanceId(event.target.value)}\n style={instancePickerSelectStyles}\n >\n {instances.map((instance) => (\n <option key={instance.instanceId} value={instance.instanceId}>\n {formatInstanceLabel(instance.dbId, instance.instanceId, dbIdCounts.get(instance.dbId) ?? 0)}\n </option>\n ))}\n </select>\n </label>\n )}\n <span style={instanceCountBadgeStyles}>\n {instances.length} instance{instances.length !== 1 ? \"s\" : \"\"}\n </span>\n <button type=\"button\" style={closeButtonStyles} onClick={() => setIsOpen(false)} aria-label=\"Close\">\n ✕\n </button>\n </div>\n </div>\n\n {instances.length === 0 ? (\n <div style={emptyStateStyles}>\n <div style={emptyStateIconStyles}>◈</div>\n <p style={emptyStateTextStyles}>No SQLite Sync database instances registered.</p>\n <p style={emptyStateSubtextStyles}>\n Call <code style={inlineCodeStyles}>registerDevtools(db)</code> in your app to get started.\n </p>\n </div>\n ) : (\n <div style={contentLayoutStyles}>\n {/* Sidebar nav */}\n <aside style={sidebarStyles}>\n <nav style={navStyles}>\n <button\n type=\"button\"\n style={getTabButtonStyles(activeTab === \"overview\")}\n onClick={() => setActiveTab(\"overview\")}\n >\n <span style={navIconStyles}>▦</span>\n Overview\n </button>\n <button\n type=\"button\"\n style={getTabButtonStyles(activeTab === \"schema\")}\n onClick={() => setActiveTab(\"schema\")}\n >\n <span style={navIconStyles}>⬡</span>\n Schema\n </button>\n <button\n type=\"button\"\n style={getTabButtonStyles(activeTab === \"live-queries\")}\n onClick={() => setActiveTab(\"live-queries\")}\n >\n <span style={navIconStyles}>◉</span>\n Live Queries\n </button>\n <button\n type=\"button\"\n style={getTabButtonStyles(activeTab === \"event-log\")}\n onClick={() => setActiveTab(\"event-log\")}\n >\n <span style={navIconStyles}>≡</span>\n Event Log\n </button>\n <button\n type=\"button\"\n style={getTabButtonStyles(activeTab === \"query-runner\")}\n onClick={() => setActiveTab(\"query-runner\")}\n >\n <span style={navIconStyles}>▶</span>\n Query Runner\n </button>\n </nav>\n\n {selectedInstance && (\n <div style={sidebarInfoStyles}>\n <div style={sidebarInfoLabelStyles}>Active instance</div>\n <div style={sidebarInfoValueStyles}>\n {formatInstanceLabel(\n selectedInstance.dbId,\n selectedInstance.instanceId,\n dbIdCounts.get(selectedInstance.dbId) ?? 0,\n )}\n </div>\n <div style={sidebarInfoSubStyles}>id: {selectedInstance.instanceId.slice(0, 12)}…</div>\n </div>\n )}\n </aside>\n\n {/* Main pane */}\n <div style={mainPaneStyles}>\n {activeTab === \"overview\" ? (\n <OverviewTab selectedInstance={selectedInstance} dbIdCounts={dbIdCounts} />\n ) : activeTab === \"schema\" ? (\n <SchemaTab selectedInstance={selectedInstance} />\n ) : activeTab === \"live-queries\" ? (\n <LiveQueriesTab selectedInstance={selectedInstance} />\n ) : activeTab === \"event-log\" ? (\n <EventLogTab selectedInstance={selectedInstance} />\n ) : (\n <QueryRunnerTab\n selectedInstance={selectedInstance}\n queryTarget={queryTarget}\n setQueryTarget={setQueryTarget}\n query={query}\n setQuery={setQuery}\n queryState={queryState}\n canRunQuery={canRunQuery}\n runQuery={runQuery}\n />\n )}\n </div>\n </div>\n )}\n </section>\n </div>\n ) : null}\n </>\n );\n}\n\nconst EVENT_HLC_ACCUMULATOR_KV_KEY = \"crdt.consistency.event_hlc_sum.v2\";\nconst EVENT_HLC_ACCUMULATOR_QUERY = `SELECT value FROM \"worker\".\"kv\" WHERE key = '${EVENT_HLC_ACCUMULATOR_KV_KEY}'`;\n\nfunction OverviewTab({\n selectedInstance,\n dbIdCounts,\n}: {\n selectedInstance: ReturnType<typeof getOrCreateSQLiteSyncDevtoolsRegistry>[\"getSnapshot\"] extends () => {\n instances: infer I;\n }\n ? I extends readonly (infer T)[]\n ? T | null\n : never\n : never;\n dbIdCounts: Map<string, number>;\n}) {\n const [eventHlcAccumulator, setEventHlcAccumulator] = useState<string | null>(null);\n const [accumulatorError, setAccumulatorError] = useState<string | null>(null);\n const [isAccumulatorLoading, setIsAccumulatorLoading] = useState(false);\n\n const refreshEventHlcAccumulator = useCallback(async () => {\n if (!selectedInstance) return;\n setIsAccumulatorLoading(true);\n setAccumulatorError(null);\n try {\n const result = await selectedInstance.instance._internal.executeAsync({\n sql: EVENT_HLC_ACCUMULATOR_QUERY,\n parameters: [],\n });\n const row = result.rows[0] as { value?: string } | undefined;\n setEventHlcAccumulator(row?.value ?? \"\");\n } catch (error) {\n setAccumulatorError(error instanceof Error ? error.message : String(error));\n setEventHlcAccumulator(null);\n } finally {\n setIsAccumulatorLoading(false);\n }\n }, [selectedInstance]);\n\n useEffect(() => {\n setEventHlcAccumulator(null);\n setAccumulatorError(null);\n void refreshEventHlcAccumulator();\n }, [refreshEventHlcAccumulator]);\n\n if (!selectedInstance) return null;\n\n const label = formatInstanceLabel(\n selectedInstance.dbId,\n selectedInstance.instanceId,\n dbIdCounts.get(selectedInstance.dbId) ?? 0,\n );\n\n const crdtTables = selectedInstance.instance._internal.crdtTableNames;\n\n return (\n <div style={overviewLayoutStyles}>\n <div style={overviewCardsRowStyles}>\n <div style={overviewCardStyles}>\n <div style={overviewCardLabelStyles}>Database</div>\n <div style={overviewCardValueStyles}>{label}</div>\n </div>\n <div style={overviewCardStyles}>\n <div style={overviewCardLabelStyles}>Instance ID</div>\n <div style={{ ...overviewCardValueStyles, fontFamily: \"ui-monospace, monospace\", fontSize: \"0.78rem\" }}>\n {selectedInstance.instanceId.slice(0, 16)}…\n </div>\n </div>\n <div style={overviewCardStyles}>\n <div style={overviewCardLabelStyles}>CRDT Tables</div>\n <div style={overviewCardValueStyles}>{crdtTables.length}</div>\n </div>\n </div>\n\n <div style={overviewSectionStyles}>\n <div style={overviewSectionTitleStyles}>CRDT Tables</div>\n {crdtTables.length === 0 ? (\n <div style={overviewEmptyStyles}>No CRDT tables registered.</div>\n ) : (\n <div style={crdtTableListStyles}>\n {[...crdtTables].map((name) => (\n <div key={name} style={crdtTableRowStyles}>\n <span style={crdtTableIconStyles}>▦</span>\n <span style={crdtTableNameStyles}>{name}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <div style={overviewSectionStyles}>\n <div style={overviewSectionHeaderStyles}>\n <div style={overviewSectionTitleStyles}>Event HLC accumulator</div>\n <button\n type=\"button\"\n style={overviewRefreshButtonStyles}\n disabled={isAccumulatorLoading}\n onClick={() => void refreshEventHlcAccumulator()}\n >\n {isAccumulatorLoading ? \"…\" : \"↻\"} Refresh\n </button>\n </div>\n <div style={overviewAccumulatorValueStyles}>\n {accumulatorError ? (\n <span style={overviewAccumulatorErrorStyles}>{accumulatorError}</span>\n ) : isAccumulatorLoading && eventHlcAccumulator === null ? (\n \"Loading…\"\n ) : eventHlcAccumulator === \"\" ? (\n <span style={overviewAccumulatorEmptyStyles}>(empty)</span>\n ) : (\n eventHlcAccumulator\n )}\n </div>\n </div>\n\n <div style={overviewSectionStyles}>\n <div style={overviewSectionTitleStyles}>Write Permissions</div>\n <div style={permissionRowStyles}>\n <span style={permissionIconStyles}>✓</span>\n <span style={permissionTextStyles}>Memory DB — CRDT tables only</span>\n </div>\n <div style={permissionRowStyles}>\n <span style={{ ...permissionIconStyles, color: \"#f59e0b\" }}>⊘</span>\n <span style={permissionTextStyles}>Worker DB — read-only (SELECT, PRAGMA, EXPLAIN)</span>\n </div>\n </div>\n\n <ResetSection dbId={selectedInstance.dbId} instance={selectedInstance.instance} />\n </div>\n );\n}\n\nfunction ResetSection({ dbId, instance }: { dbId: string; instance: SQLiteSyncDevtoolsInstance[\"instance\"] }) {\n const [confirming, setConfirming] = useState(false);\n const [isResetting, setIsResetting] = useState(false);\n\n const handleReset = () => {\n setIsResetting(true);\n // Worker-owned clean reset: durably records a reset epoch, broadcasts a\n // reload to all tabs, and the next elected worker wipes the persisted DB.\n // The promise may never settle — the page unloads first.\n void instance.requestReload({ clean: true });\n };\n\n return (\n <div style={dangerZoneStyles}>\n <div style={dangerZoneTitleStyles}>Danger Zone</div>\n <div style={dangerZoneRowStyles}>\n <div style={dangerZoneDescStyles}>\n Requests a clean reload, so <code style={inlineCodeStyles}>{dbId}</code> is wiped on next load via{\" \"}\n <code style={inlineCodeStyles}>clearOnInit</code>, then reloads all tabs.\n </div>\n {confirming ? (\n <div style={dangerZoneActionsStyles}>\n <button\n type=\"button\"\n style={resetCancelButtonStyles}\n disabled={isResetting}\n onClick={() => setConfirming(false)}\n >\n Cancel\n </button>\n <button type=\"button\" style={resetConfirmButtonStyles} disabled={isResetting} onClick={handleReset}>\n {isResetting ? \"Resetting…\" : \"Confirm reset\"}\n </button>\n </div>\n ) : (\n <button type=\"button\" style={resetButtonStyles} onClick={() => setConfirming(true)}>\n Reset DB\n </button>\n )}\n </div>\n </div>\n );\n}\n\nfunction SchemaTab({\n selectedInstance,\n}: {\n selectedInstance: ReturnType<typeof getOrCreateSQLiteSyncDevtoolsRegistry>[\"getSnapshot\"] extends () => {\n instances: infer I;\n }\n ? I extends readonly (infer T)[]\n ? T | null\n : never\n : never;\n}) {\n if (!selectedInstance) return null;\n\n const { crdtTablesConfig, schemaVersion, migrationVersions } = selectedInstance.instance._internal;\n const latestVersion = migrationVersions.at(-1) ?? 0;\n\n return (\n <div style={schemaLayoutStyles}>\n {/* CRDT Tables */}\n <div style={schemaSectionStyles}>\n <div style={schemaSectionHeaderStyles}>\n <div style={schemaSectionTitleStyles}>CRDT Tables</div>\n <span style={schemaBadgeStyles}>{crdtTablesConfig.length}</span>\n </div>\n <div style={schemaTableGridStyles}>\n <div style={schemaTableHeaderRowStyles}>\n <div style={schemaColHeaderStyles}>Base Table</div>\n <div style={schemaColHeaderStyles}>CRDT Table</div>\n <div style={{ ...schemaColHeaderStyles, textAlign: \"center\" }}>Status</div>\n </div>\n {crdtTablesConfig.map((table) => (\n <div key={table.crdtTableName} style={schemaTableRowStyles}>\n <div style={schemaTableNameStyles}>\n <span style={schemaTableIconStyles}>▦</span>\n {table.baseTableName}\n </div>\n <div style={schemaCrdtNameStyles}>{table.crdtTableName}</div>\n <div style={schemaStatusCellStyles}>\n <span style={schemaActiveTagStyles}>active</span>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Migrations */}\n <div style={schemaSectionStyles}>\n <div style={schemaSectionHeaderStyles}>\n <div style={schemaSectionTitleStyles}>Migrations</div>\n <div style={schemaMigrationsMetaStyles}>\n <span style={schemaBadgeStyles}>{migrationVersions.length} total</span>\n <span style={schemaVersionChipStyles}>\n current: v{schemaVersion} / latest: v{latestVersion}\n </span>\n </div>\n </div>\n {migrationVersions.length === 0 ? (\n <div style={schemaEmptyStyles}>No migrations defined.</div>\n ) : (\n <div style={migrationListStyles}>\n {migrationVersions.map((version) => {\n const applied = version <= schemaVersion;\n const isCurrent = version === schemaVersion;\n return (\n <div key={version} style={getMigrationRowStyles(applied)}>\n <div style={migrationVersionStyles}>v{version}</div>\n <div style={migrationBarTrackStyles}>\n <div style={getMigrationBarFillStyles(applied)} />\n </div>\n <div style={getMigrationTagStyles(applied, isCurrent)}>\n {isCurrent ? \"current\" : applied ? \"applied\" : \"pending\"}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction LiveQueriesTab({ selectedInstance }: { selectedInstance: SQLiteSyncDevtoolsInstance | null }) {\n const [queries, setQueries] = useState<SharedLiveQuerySnapshot[]>([]);\n\n const refresh = useCallback(() => {\n if (!selectedInstance) {\n setQueries([]);\n return;\n }\n\n setQueries(\n selectedInstance.instance._internal\n .getSharedLiveQueriesSnapshot()\n .sort(\n (a, b) =>\n a.sql.localeCompare(b.sql) ||\n formatLiveQueryParameters(a.parameters).localeCompare(formatLiveQueryParameters(b.parameters)),\n ),\n );\n }, [selectedInstance]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const totalSubscribers = queries.reduce((total, query) => total + query.subscriberCount, 0);\n\n return (\n <div style={schemaLayoutStyles}>\n <div style={schemaSectionStyles}>\n <div style={schemaSectionHeaderStyles}>\n <div style={schemaSectionTitleStyles}>Shared Live Queries</div>\n <span style={schemaBadgeStyles}>{queries.length}</span>\n <span style={schemaVersionChipStyles}>\n {totalSubscribers} subscriber{totalSubscribers !== 1 ? \"s\" : \"\"}\n </span>\n <button\n type=\"button\"\n style={{ ...eventLogRefreshButtonStyles, marginLeft: \"auto\" }}\n onClick={refresh}\n disabled={!selectedInstance}\n >\n ↻ Refresh\n </button>\n </div>\n {queries.length === 0 ? (\n <div style={schemaEmptyStyles}>\n No active live queries. Queries created via <code style={inlineCodeStyles}>useDbQuery</code> appear here\n while components are subscribed.\n </div>\n ) : (\n <div style={schemaTableGridStyles}>\n <div style={liveQueryHeaderRowStyles}>\n <div style={schemaColHeaderStyles}>SQL</div>\n <div style={schemaColHeaderStyles}>Parameters</div>\n <div style={{ ...schemaColHeaderStyles, textAlign: \"center\" }}>Subscribers</div>\n </div>\n {queries.map((query) => {\n const parameters = formatLiveQueryParameters(query.parameters);\n return (\n <div key={`${query.sql}|${parameters}`} style={liveQueryRowStyles}>\n <div style={liveQuerySqlStyles}>{query.sql}</div>\n <div style={liveQueryParametersStyles}>{parameters}</div>\n <div style={schemaStatusCellStyles}>\n <span style={query.subscriberCount > 0 ? schemaActiveTagStyles : liveQueryIdleTagStyles}>\n {query.subscriberCount}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction formatLiveQueryParameters(parameters: readonly unknown[]): string {\n try {\n return JSON.stringify(parameters);\n } catch {\n return String(parameters);\n }\n}\n\ntype PersistedCrdtEvent = {\n sync_id: number;\n schema_version: number;\n status: \"pending\" | \"applied\" | \"failed\" | \"deduped\";\n type: \"item-created\" | \"item-updated\" | \"item-deleted\";\n timestamp: string;\n origin: \"remote\" | \"own\" | \"local\";\n source_node_id: string;\n dataset: string;\n item_id: string;\n payload: string;\n};\n\ntype EventLogFilters = {\n dataset: string;\n origin: string;\n status: string;\n};\n\nconst PAGE_SIZE = 50;\n\nfunction buildEventLogQuery(filters: EventLogFilters, afterSyncId: number | null): string {\n const conditions: string[] = [];\n\n if (filters.dataset) conditions.push(`dataset = '${filters.dataset}'`);\n if (filters.origin) conditions.push(`origin = '${filters.origin}'`);\n if (filters.status) conditions.push(`status = '${filters.status}'`);\n if (afterSyncId !== null) conditions.push(`sync_id < ${afterSyncId}`);\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n return `SELECT * FROM \"worker\".\"crdt_events\" ${where} ORDER BY sync_id DESC LIMIT ${PAGE_SIZE + 1}`;\n}\n\nfunction EventLogTab({\n selectedInstance,\n}: {\n selectedInstance: ReturnType<typeof getOrCreateSQLiteSyncDevtoolsRegistry>[\"getSnapshot\"] extends () => {\n instances: infer I;\n }\n ? I extends readonly (infer T)[]\n ? T | null\n : never\n : never;\n}) {\n const baseTableNames = useMemo(\n () => selectedInstance?.instance._internal.crdtTablesConfig.map((table) => table.baseTableName) ?? [],\n [selectedInstance],\n );\n\n const [filters, setFilters] = useState<EventLogFilters>({ dataset: \"\", origin: \"\", status: \"\" });\n const [events, setEvents] = useState<PersistedCrdtEvent[]>([]);\n const [hasMore, setHasMore] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [expandedId, setExpandedId] = useState<number | null>(null);\n const afterSyncIdRef = useRef<number | null>(null);\n const isLoadingRef = useRef(false);\n\n const executeQuery = useCallback(\n async (sql: string): Promise<PersistedCrdtEvent[]> => {\n if (!selectedInstance) return [];\n const result = await selectedInstance.instance._internal.executeAsync({ sql, parameters: [] });\n return result.rows as PersistedCrdtEvent[];\n },\n [selectedInstance],\n );\n\n const load = useCallback(\n async (reset: boolean, currentFilters: EventLogFilters) => {\n if (!selectedInstance || isLoadingRef.current) return;\n isLoadingRef.current = true;\n setIsLoading(true);\n try {\n const afterSyncId = reset ? null : afterSyncIdRef.current;\n const sql = buildEventLogQuery(currentFilters, afterSyncId);\n const rows = await executeQuery(sql);\n const page = rows.slice(0, PAGE_SIZE);\n setHasMore(rows.length > PAGE_SIZE);\n if (reset) {\n setEvents(page);\n } else {\n setEvents((prev) => [...prev, ...page]);\n }\n afterSyncIdRef.current = page.at(-1)?.sync_id ?? null;\n } finally {\n isLoadingRef.current = false;\n setIsLoading(false);\n }\n },\n [selectedInstance, executeQuery],\n );\n\n // Initial load and reload on instance or filter change\n useEffect(() => {\n afterSyncIdRef.current = null;\n setEvents([]);\n void load(true, filters);\n }, [filters, load]);\n\n const applyFilters = (next: EventLogFilters) => {\n setFilters(next);\n };\n\n if (!selectedInstance) return null;\n\n return (\n <div style={eventLogLayoutStyles}>\n {/* Toolbar */}\n <div style={eventLogToolbarStyles}>\n <select\n value={filters.dataset}\n onChange={(e) => applyFilters({ ...filters, dataset: e.target.value })}\n style={eventLogFilterSelectStyles}\n >\n <option value=\"\">All datasets</option>\n {baseTableNames.map((name) => (\n <option key={name} value={name}>\n {name}\n </option>\n ))}\n </select>\n <select\n value={filters.origin}\n onChange={(e) => applyFilters({ ...filters, origin: e.target.value })}\n style={eventLogFilterSelectStyles}\n >\n <option value=\"\">All origins</option>\n <option value=\"own\">own</option>\n <option value=\"remote\">remote</option>\n <option value=\"local\">local</option>\n </select>\n <select\n value={filters.status}\n onChange={(e) => applyFilters({ ...filters, status: e.target.value })}\n style={eventLogFilterSelectStyles}\n >\n <option value=\"\">All statuses</option>\n <option value=\"applied\">applied</option>\n <option value=\"pending\">pending</option>\n <option value=\"failed\">failed</option>\n <option value=\"deduped\">deduped</option>\n </select>\n <button\n type=\"button\"\n style={eventLogRefreshButtonStyles}\n disabled={isLoading}\n onClick={() => void load(true, filters)}\n >\n {isLoading ? \"…\" : \"↻\"} Refresh\n </button>\n {events.length > 0 && (\n <span style={eventLogCountStyles}>\n {events.length}\n {hasMore ? \"+\" : \"\"} events\n </span>\n )}\n </div>\n\n {/* Event list */}\n {events.length === 0 && !isLoading ? (\n <div style={eventLogEmptyStyles}>No events match the current filters.</div>\n ) : (\n <div style={eventLogListStyles}>\n {events.map((event) => {\n const isExpanded = expandedId === event.sync_id;\n return (\n <div key={event.sync_id} style={getEventRowStyles(isExpanded)}>\n <button\n type=\"button\"\n style={eventRowHeaderStyles}\n onClick={() => setExpandedId(isExpanded ? null : event.sync_id)}\n >\n <span style={eventSyncIdStyles}>#{event.sync_id}</span>\n <EventTypeBadge type={event.type} />\n <EventOriginBadge origin={event.origin} />\n <EventStatusBadge status={event.status} />\n <span style={eventDatasetStyles}>{event.dataset}</span>\n <span style={eventItemIdStyles}>{event.item_id}</span>\n <span style={eventTimestampStyles}>{formatHlcTimestamp(event.timestamp)}</span>\n <span style={eventChevronStyles}>{isExpanded ? \"▲\" : \"▼\"}</span>\n </button>\n\n {isExpanded && (\n <div style={eventPayloadStyles}>\n <div style={eventPayloadMetaStyles}>\n <span style={eventMetaItemStyles}>schema v{event.schema_version}</span>\n <span style={eventMetaItemStyles}>node: {event.source_node_id || \"—\"}</span>\n <span style={eventMetaItemStyles}>ts: {event.timestamp}</span>\n </div>\n <pre style={eventPayloadPreStyles}>{formatPayload(event.payload)}</pre>\n </div>\n )}\n </div>\n );\n })}\n\n {hasMore && (\n <button\n type=\"button\"\n style={loadMoreButtonStyles}\n disabled={isLoading}\n onClick={() => void load(false, filters)}\n >\n {isLoading ? \"Loading…\" : `Load ${PAGE_SIZE} more`}\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction EventTypeBadge({ type }: { type: string }) {\n const { style, label } =\n type === \"item-created\"\n ? { style: eventTypeCreateStyles, label: \"create\" }\n : type === \"item-deleted\"\n ? { style: eventTypeDeleteStyles, label: \"delete\" }\n : { style: eventTypeUpdateStyles, label: \"update\" };\n return <span style={style}>{label}</span>;\n}\n\nfunction EventOriginBadge({ origin }: { origin: string }) {\n const style =\n origin === \"own\" ? eventOriginOwnStyles : origin === \"remote\" ? eventOriginRemoteStyles : eventOriginLocalStyles;\n return <span style={style}>{origin}</span>;\n}\n\nfunction EventStatusBadge({ status }: { status: string }) {\n const style =\n status === \"applied\"\n ? eventStatusAppliedStyles\n : status === \"pending\"\n ? eventStatusPendingStyles\n : status === \"failed\"\n ? eventStatusFailedStyles\n : eventStatusSkippedStyles;\n return <span style={style}>{status}</span>;\n}\n\nfunction formatHlcTimestamp(ts: string): string {\n // HLC format: \"<unix_ms>-<counter>-<node>\" or just an ISO string\n const ms = Number(ts.split(\"-\")[0]);\n if (!Number.isNaN(ms) && ms > 1e12) {\n return new Date(ms).toLocaleTimeString();\n }\n return ts.slice(0, 19).replace(\"T\", \" \");\n}\n\nfunction formatPayload(raw: string): string {\n try {\n return JSON.stringify(JSON.parse(raw), null, 2);\n } catch {\n return raw;\n }\n}\n\nfunction QueryRunnerTab({\n selectedInstance,\n queryTarget,\n setQueryTarget,\n query,\n setQuery,\n queryState,\n canRunQuery,\n runQuery,\n}: {\n selectedInstance: unknown;\n queryTarget: QueryTarget;\n setQueryTarget: (t: QueryTarget) => void;\n query: string;\n setQuery: (q: string) => void;\n queryState: QueryState;\n canRunQuery: boolean;\n runQuery: () => Promise<void>;\n}) {\n return (\n <div style={queryRunnerLayoutStyles}>\n {/* Top toolbar */}\n <div style={queryToolbarStyles}>\n <div style={targetToggleStyles}>\n <button\n type=\"button\"\n style={getTargetButtonStyles(queryTarget === \"memory\")}\n onClick={() => setQueryTarget(\"memory\")}\n >\n Memory DB\n </button>\n <button\n type=\"button\"\n style={getTargetButtonStyles(queryTarget === \"worker\")}\n onClick={() => setQueryTarget(\"worker\")}\n >\n Worker DB\n </button>\n </div>\n\n <div style={queryToolbarRightStyles}>\n {!selectedInstance && <span style={noInstanceWarningStyles}>No instance selected</span>}\n <span style={shortcutHintStyles}>⌘↵ to run</span>\n <button\n type=\"button\"\n style={runButtonStyles(canRunQuery, queryState.status === \"running\")}\n disabled={!canRunQuery}\n onClick={() => void runQuery()}\n >\n {queryState.status === \"running\" ? (\n <>\n <span style={runningDotStyles} />\n Running…\n </>\n ) : (\n <>▶ Run</>\n )}\n </button>\n </div>\n </div>\n\n {/* SQL textarea */}\n <div style={editorWrapperStyles}>\n <textarea\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === \"Enter\" && canRunQuery) {\n event.preventDefault();\n void runQuery();\n }\n }}\n style={textareaStyles}\n placeholder=\"SELECT * FROM your_table LIMIT 100\"\n spellCheck={false}\n />\n </div>\n\n {/* Constraint hint */}\n <div style={helperTextStyles}>\n {queryTarget === \"worker\"\n ? \"Worker DB is read-only — only SELECT, PRAGMA, and EXPLAIN are allowed.\"\n : \"Memory DB allows writes only to CRDT tables.\"}\n </div>\n\n {/* Results */}\n {queryState.status === \"error\" && (\n <div style={errorPanelStyles}>\n <div style={resultHeaderStyles}>\n <span style={errorBadgeStyles}>Error</span>\n <span style={resultMetaStyles}>\n {queryState.error.target} · {queryState.error.sql}\n </span>\n </div>\n <pre style={errorMessageStyles}>{queryState.error.message}</pre>\n </div>\n )}\n\n {queryState.status === \"success\" && (\n <div style={resultPanelStyles}>\n <div style={resultHeaderStyles}>\n <span style={successBadgeStyles}>\n {queryState.output.rowCount} row{queryState.output.rowCount !== 1 ? \"s\" : \"\"}\n </span>\n <span style={resultMetaStyles}>\n {queryState.output.target} · {queryState.output.durationMs}ms\n </span>\n </div>\n <ResultTable rows={queryState.output.rows} />\n </div>\n )}\n </div>\n );\n}\n\nfunction ResultTable({ rows }: { rows: unknown[] }) {\n if (rows.length === 0) {\n return <div style={resultEmptyStyles}>Query returned 0 rows.</div>;\n }\n\n const firstRow = rows[0];\n if (typeof firstRow !== \"object\" || firstRow === null) {\n return <pre style={resultRawStyles}>{JSON.stringify(rows, null, 2)}</pre>;\n }\n\n const columns = Object.keys(firstRow as object);\n\n return (\n <div style={tableWrapperStyles}>\n <table style={tableStyles}>\n <thead>\n <tr>\n <th style={thRowNumStyles}>#</th>\n {columns.map((col) => (\n <th key={col} style={thStyles}>\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIdx) => (\n <tr key={rowIdx} style={rowIdx % 2 === 0 ? trStyles : trAltStyles}>\n <td style={tdRowNumStyles}>{rowIdx + 1}</td>\n {columns.map((col) => {\n const val = (row as Record<string, unknown>)[col];\n return (\n <td key={col} style={tdStyles}>\n {val === null ? (\n <span style={nullValueStyles}>NULL</span>\n ) : typeof val === \"object\" ? (\n <span style={jsonValueStyles}>{JSON.stringify(val)}</span>\n ) : (\n String(val)\n )}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatInstanceLabel(dbId: string, instanceId: string, duplicateCount: number): string {\n if (duplicateCount < 2) {\n return dbId;\n }\n\n return `${dbId} (${instanceId.slice(0, 6)})`;\n}\n\nfunction normalizeSingleStatement(query: string): string {\n const trimmed = query.trim();\n if (!trimmed) {\n throw new Error(\"Enter a SQL statement.\");\n }\n\n const withoutTrailingSemicolons = trimmed.replace(/;+\\s*$/u, \"\");\n if (withoutTrailingSemicolons.includes(\";\")) {\n throw new Error(\"Devtools only supports a single SQL statement.\");\n }\n\n return withoutTrailingSemicolons;\n}\n\nfunction getStatementKind(query: string): string {\n const match = query.trimStart().match(/^([a-z]+)/iu);\n return match?.[1]?.toLowerCase() ?? \"\";\n}\n\nfunction isWorkerReadOnlyStatement(statementKind: string): boolean {\n return statementKind === \"select\" || statementKind === \"pragma\";\n}\n\nfunction getEmptySnapshot(): SQLiteSyncDevtoolsSnapshot {\n return emptySnapshot;\n}\n\nconst emptySnapshot: SQLiteSyncDevtoolsSnapshot = {\n instances: [],\n};\n\n// ─── Styles ───────────────────────────────────────────────────────────────────\n\nconst C = {\n bg: \"#0e1015\",\n bgPanel: \"#161921\",\n bgCard: \"#1c2030\",\n bgInput: \"#111318\",\n border: \"#2a2f3e\",\n borderLight: \"#343a4f\",\n text: \"#e2e8f0\",\n textMuted: \"#6b7280\",\n textDim: \"#9ca3af\",\n teal: \"#2dd4bf\",\n tealDim: \"rgba(45,212,191,0.12)\",\n tealGlow: \"rgba(45,212,191,0.06)\",\n error: \"#f87171\",\n errorBg: \"rgba(248,113,113,0.08)\",\n errorBorder: \"rgba(248,113,113,0.25)\",\n success: \"#34d399\",\n successBg: \"rgba(52,211,153,0.08)\",\n amber: \"#fbbf24\",\n};\n\nconst floatingRootStyles: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 9998,\n};\n\nconst triggerButtonStyles: CSSProperties = {\n position: \"absolute\",\n right: \"16px\",\n bottom: \"16px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.3rem\",\n border: `1px solid ${C.border}`,\n borderRadius: \"8px\",\n padding: \"0.3rem 0.45rem\",\n background: C.bgPanel,\n color: C.text,\n boxShadow: `0 0 0 1px ${C.border}, 0 4px 16px rgba(0,0,0,0.5)`,\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n};\n\nconst triggerIconStyles: CSSProperties = {\n color: C.teal,\n fontSize: \"0.9rem\",\n lineHeight: 1,\n};\n\nconst triggerCountStyles: CSSProperties = {\n minWidth: \"1.1rem\",\n borderRadius: \"4px\",\n padding: \"0.05rem 0.25rem\",\n backgroundColor: C.tealDim,\n color: C.teal,\n fontSize: \"0.65rem\",\n fontWeight: 700,\n textAlign: \"center\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst overlayStyles: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 9999,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"1.5rem\",\n backgroundColor: \"rgba(0,0,0,0.72)\",\n backdropFilter: \"blur(8px)\",\n};\n\nconst dialogStyles: CSSProperties = {\n width: \"min(72rem, 100%)\",\n height: \"min(90vh, 860px)\",\n display: \"flex\",\n flexDirection: \"column\",\n border: `1px solid ${C.border}`,\n borderRadius: \"16px\",\n background: C.bg,\n boxShadow: `0 0 0 1px ${C.border}, 0 40px 80px rgba(0,0,0,0.8), 0 0 60px rgba(45,212,191,0.04)`,\n overflow: \"hidden\",\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n color: C.text,\n fontSize: \"0.88rem\",\n};\n\nconst headerStyles: CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"1rem\",\n padding: \"0.85rem 1.1rem\",\n borderBottom: `1px solid ${C.border}`,\n background: C.bgPanel,\n flexShrink: 0,\n};\n\nconst headerLeftStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n};\n\nconst headerLogoStyles: CSSProperties = {\n fontSize: \"1.3rem\",\n color: C.teal,\n lineHeight: 1,\n};\n\nconst eyebrowStyles: CSSProperties = {\n fontSize: \"0.65rem\",\n fontWeight: 600,\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst titleStyles: CSSProperties = {\n margin: \"0.05rem 0 0\",\n fontSize: \"0.95rem\",\n fontWeight: 700,\n color: C.text,\n letterSpacing: \"-0.01em\",\n};\n\nconst headerRightStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.6rem\",\n};\n\nconst instancePickerLabelStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n};\n\nconst instancePickerTextStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n fontWeight: 600,\n color: C.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.06em\",\n};\n\nconst instancePickerSelectStyles: CSSProperties = {\n borderRadius: \"7px\",\n border: `1px solid ${C.border}`,\n padding: \"0.35rem 0.6rem\",\n backgroundColor: C.bgCard,\n color: C.text,\n fontSize: \"0.82rem\",\n fontFamily: \"ui-monospace, monospace\",\n cursor: \"pointer\",\n};\n\nconst instanceCountBadgeStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n fontWeight: 600,\n color: C.teal,\n backgroundColor: C.tealDim,\n borderRadius: \"5px\",\n padding: \"0.2rem 0.5rem\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst closeButtonStyles: CSSProperties = {\n border: `1px solid ${C.border}`,\n borderRadius: \"7px\",\n width: \"28px\",\n height: \"28px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"transparent\",\n color: C.textMuted,\n fontSize: \"0.82rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n};\n\nconst emptyStateStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"4rem 2rem\",\n gap: \"0.75rem\",\n flex: 1,\n};\n\nconst emptyStateIconStyles: CSSProperties = {\n fontSize: \"2.5rem\",\n color: C.textMuted,\n opacity: 0.4,\n};\n\nconst emptyStateTextStyles: CSSProperties = {\n margin: 0,\n fontSize: \"0.95rem\",\n fontWeight: 600,\n color: C.textDim,\n};\n\nconst emptyStateSubtextStyles: CSSProperties = {\n margin: 0,\n fontSize: \"0.82rem\",\n color: C.textMuted,\n textAlign: \"center\",\n};\n\nconst inlineCodeStyles: CSSProperties = {\n fontFamily: \"ui-monospace, monospace\",\n backgroundColor: C.bgCard,\n border: `1px solid ${C.border}`,\n borderRadius: \"4px\",\n padding: \"0.1em 0.4em\",\n fontSize: \"0.88em\",\n color: C.teal,\n};\n\nconst contentLayoutStyles: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"200px minmax(0, 1fr)\",\n flex: 1,\n minHeight: 0,\n overflow: \"hidden\",\n};\n\nconst sidebarStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0\",\n padding: \"0.75rem\",\n borderRight: `1px solid ${C.border}`,\n background: C.bgPanel,\n overflowY: \"auto\",\n};\n\nconst navStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.25rem\",\n marginBottom: \"1rem\",\n};\n\nconst navIconStyles: CSSProperties = {\n fontSize: \"0.7rem\",\n opacity: 0.7,\n};\n\nconst sidebarInfoStyles: CSSProperties = {\n marginTop: \"auto\",\n padding: \"0.75rem\",\n borderRadius: \"8px\",\n background: C.bgCard,\n border: `1px solid ${C.border}`,\n};\n\nconst sidebarInfoLabelStyles: CSSProperties = {\n fontSize: \"0.65rem\",\n fontWeight: 600,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n marginBottom: \"0.3rem\",\n};\n\nconst sidebarInfoValueStyles: CSSProperties = {\n fontSize: \"0.88rem\",\n fontWeight: 600,\n color: C.text,\n wordBreak: \"break-word\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst sidebarInfoSubStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n color: C.textMuted,\n fontFamily: \"ui-monospace, monospace\",\n marginTop: \"0.25rem\",\n};\n\nconst mainPaneStyles: CSSProperties = {\n minWidth: 0,\n overflowY: \"auto\",\n padding: \"1rem\",\n};\n\n// ─── Overview tab styles ───────────────────────────────────────────────────────\n\nconst overviewLayoutStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1.25rem\",\n};\n\nconst overviewCardsRowStyles: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(11rem, 1fr))\",\n gap: \"0.75rem\",\n};\n\nconst overviewCardStyles: CSSProperties = {\n padding: \"0.9rem 1rem\",\n borderRadius: \"10px\",\n border: `1px solid ${C.border}`,\n background: C.bgCard,\n};\n\nconst overviewCardLabelStyles: CSSProperties = {\n fontSize: \"0.68rem\",\n fontWeight: 600,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n marginBottom: \"0.4rem\",\n};\n\nconst overviewCardValueStyles: CSSProperties = {\n fontSize: \"1rem\",\n fontWeight: 700,\n color: C.text,\n wordBreak: \"break-word\",\n};\n\nconst overviewSectionStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n};\n\nconst overviewSectionTitleStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n fontWeight: 600,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n};\n\nconst overviewSectionHeaderStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"0.75rem\",\n};\n\nconst overviewRefreshButtonStyles: CSSProperties = {\n border: `1px solid ${C.border}`,\n borderRadius: \"7px\",\n padding: \"0.35rem 0.7rem\",\n backgroundColor: \"transparent\",\n color: C.textDim,\n fontSize: \"0.78rem\",\n fontFamily: \"ui-monospace, monospace\",\n cursor: \"pointer\",\n flexShrink: 0,\n};\n\nconst overviewAccumulatorValueStyles: CSSProperties = {\n padding: \"0.75rem\",\n borderRadius: \"8px\",\n border: `1px solid ${C.border}`,\n background: C.bgCard,\n fontFamily: \"ui-monospace, monospace\",\n fontSize: \"0.78rem\",\n color: C.text,\n lineHeight: 1.5,\n wordBreak: \"break-all\",\n};\n\nconst overviewAccumulatorEmptyStyles: CSSProperties = {\n color: C.textMuted,\n fontStyle: \"italic\",\n};\n\nconst overviewAccumulatorErrorStyles: CSSProperties = {\n color: C.error,\n};\n\nconst overviewEmptyStyles: CSSProperties = {\n fontSize: \"0.82rem\",\n color: C.textMuted,\n fontStyle: \"italic\",\n};\n\nconst crdtTableListStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.25rem\",\n};\n\nconst crdtTableRowStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.6rem\",\n padding: \"0.5rem 0.75rem\",\n borderRadius: \"7px\",\n background: C.bgCard,\n border: `1px solid ${C.border}`,\n};\n\nconst crdtTableIconStyles: CSSProperties = {\n color: C.teal,\n fontSize: \"0.72rem\",\n};\n\nconst crdtTableNameStyles: CSSProperties = {\n fontFamily: \"ui-monospace, monospace\",\n fontSize: \"0.85rem\",\n color: C.text,\n};\n\nconst permissionRowStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.6rem\",\n fontSize: \"0.82rem\",\n color: C.textDim,\n};\n\nconst permissionIconStyles: CSSProperties = {\n color: C.success,\n fontWeight: 700,\n fontSize: \"0.85rem\",\n lineHeight: 1,\n};\n\nconst permissionTextStyles: CSSProperties = {\n color: C.textDim,\n};\n\nconst dangerZoneStyles: CSSProperties = {\n marginTop: \"auto\",\n borderRadius: \"10px\",\n border: `1px solid ${C.errorBorder}`,\n padding: \"0.75rem 1rem\",\n background: C.errorBg,\n};\n\nconst dangerZoneTitleStyles: CSSProperties = {\n fontSize: \"0.65rem\",\n fontWeight: 700,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: C.error,\n marginBottom: \"0.5rem\",\n};\n\nconst dangerZoneRowStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"1rem\",\n};\n\nconst dangerZoneDescStyles: CSSProperties = {\n fontSize: \"0.75rem\",\n color: C.textMuted,\n lineHeight: 1.5,\n};\n\nconst dangerZoneActionsStyles: CSSProperties = {\n display: \"flex\",\n gap: \"0.4rem\",\n flexShrink: 0,\n};\n\nconst resetButtonStyles: CSSProperties = {\n flexShrink: 0,\n border: `1px solid ${C.errorBorder}`,\n borderRadius: \"7px\",\n padding: \"0.35rem 0.75rem\",\n backgroundColor: \"transparent\",\n color: C.error,\n fontSize: \"0.78rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n};\n\nconst resetCancelButtonStyles: CSSProperties = {\n border: `1px solid ${C.border}`,\n borderRadius: \"7px\",\n padding: \"0.35rem 0.65rem\",\n backgroundColor: \"transparent\",\n color: C.textDim,\n fontSize: \"0.78rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n};\n\nconst resetConfirmButtonStyles: CSSProperties = {\n border: \"none\",\n borderRadius: \"7px\",\n padding: \"0.35rem 0.75rem\",\n backgroundColor: C.error,\n color: \"#0e1015\",\n fontSize: \"0.78rem\",\n fontWeight: 700,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n};\n\n// ─── Query runner tab styles ───────────────────────────────────────────────────\n\nconst queryRunnerLayoutStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.75rem\",\n height: \"100%\",\n};\n\nconst queryToolbarStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"0.75rem\",\n flexWrap: \"wrap\",\n};\n\nconst targetToggleStyles: CSSProperties = {\n display: \"flex\",\n gap: \"0\",\n borderRadius: \"8px\",\n border: `1px solid ${C.border}`,\n overflow: \"hidden\",\n background: C.bgCard,\n};\n\nconst queryToolbarRightStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.6rem\",\n};\n\nconst noInstanceWarningStyles: CSSProperties = {\n fontSize: \"0.75rem\",\n color: C.amber,\n fontWeight: 500,\n};\n\nconst shortcutHintStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n color: C.textMuted,\n fontFamily: \"ui-monospace, monospace\",\n padding: \"0.2rem 0.5rem\",\n borderRadius: \"5px\",\n border: `1px solid ${C.border}`,\n background: C.bgCard,\n};\n\nconst editorWrapperStyles: CSSProperties = {\n borderRadius: \"10px\",\n border: `1px solid ${C.border}`,\n overflow: \"hidden\",\n background: C.bgInput,\n};\n\nconst textareaStyles: CSSProperties = {\n width: \"100%\",\n minHeight: \"9rem\",\n resize: \"vertical\",\n border: \"none\",\n padding: \"0.85rem 1rem\",\n backgroundColor: \"transparent\",\n color: C.text,\n fontSize: \"0.875rem\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, monospace\",\n lineHeight: 1.6,\n outline: \"none\",\n boxSizing: \"border-box\",\n};\n\nconst helperTextStyles: CSSProperties = {\n fontSize: \"0.75rem\",\n lineHeight: 1.5,\n color: C.textMuted,\n};\n\nconst resultPanelStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.6rem\",\n borderRadius: \"10px\",\n border: `1px solid ${C.border}`,\n overflow: \"hidden\",\n background: C.bgPanel,\n};\n\nconst errorPanelStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.6rem\",\n padding: \"0.85rem 1rem\",\n borderRadius: \"10px\",\n border: `1px solid ${C.errorBorder}`,\n background: C.errorBg,\n};\n\nconst resultHeaderStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.6rem\",\n padding: \"0.6rem 0.85rem\",\n borderBottom: `1px solid ${C.border}`,\n background: C.bgCard,\n};\n\nconst successBadgeStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n fontWeight: 700,\n color: C.success,\n backgroundColor: C.successBg,\n borderRadius: \"5px\",\n padding: \"0.15rem 0.5rem\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst errorBadgeStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n fontWeight: 700,\n color: C.error,\n backgroundColor: C.errorBg,\n borderRadius: \"5px\",\n padding: \"0.15rem 0.5rem\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst resultMetaStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n color: C.textMuted,\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst resultEmptyStyles: CSSProperties = {\n padding: \"1.5rem\",\n fontSize: \"0.82rem\",\n color: C.textMuted,\n fontStyle: \"italic\",\n textAlign: \"center\",\n};\n\nconst resultRawStyles: CSSProperties = {\n margin: 0,\n padding: \"0.85rem 1rem\",\n overflowX: \"auto\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n fontSize: \"0.8rem\",\n lineHeight: 1.5,\n color: C.text,\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst errorMessageStyles: CSSProperties = {\n margin: 0,\n fontSize: \"0.82rem\",\n lineHeight: 1.6,\n color: C.error,\n fontFamily: \"ui-monospace, monospace\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n};\n\nconst tableWrapperStyles: CSSProperties = {\n overflowX: \"auto\",\n maxHeight: \"320px\",\n overflowY: \"auto\",\n};\n\nconst tableStyles: CSSProperties = {\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: \"0.8rem\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, monospace\",\n};\n\nconst thStyles: CSSProperties = {\n padding: \"0.5rem 0.85rem\",\n textAlign: \"left\",\n fontWeight: 600,\n fontSize: \"0.7rem\",\n letterSpacing: \"0.05em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n borderBottom: `1px solid ${C.border}`,\n borderRight: `1px solid ${C.border}`,\n background: C.bgCard,\n whiteSpace: \"nowrap\",\n position: \"sticky\",\n top: 0,\n};\n\nconst thRowNumStyles: CSSProperties = {\n ...thStyles,\n color: C.textMuted,\n opacity: 0.5,\n width: \"2.5rem\",\n textAlign: \"right\",\n};\n\nconst trStyles: CSSProperties = {\n background: \"transparent\",\n};\n\nconst trAltStyles: CSSProperties = {\n background: C.tealGlow,\n};\n\nconst tdStyles: CSSProperties = {\n padding: \"0.45rem 0.85rem\",\n borderBottom: `1px solid ${C.border}`,\n borderRight: `1px solid ${C.border}`,\n color: C.text,\n whiteSpace: \"nowrap\",\n maxWidth: \"300px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n\nconst tdRowNumStyles: CSSProperties = {\n ...tdStyles,\n color: C.textMuted,\n opacity: 0.5,\n textAlign: \"right\",\n userSelect: \"none\",\n};\n\nconst nullValueStyles: CSSProperties = {\n color: C.textMuted,\n fontStyle: \"italic\",\n opacity: 0.6,\n};\n\nconst jsonValueStyles: CSSProperties = {\n color: C.textDim,\n};\n\nfunction getTabButtonStyles(isActive: boolean): CSSProperties {\n return {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n width: \"100%\",\n border: \"none\",\n borderRadius: \"7px\",\n padding: \"0.6rem 0.75rem\",\n background: isActive ? C.tealDim : \"transparent\",\n color: isActive ? C.teal : C.textDim,\n fontSize: \"0.82rem\",\n fontWeight: isActive ? 700 : 500,\n textAlign: \"left\",\n cursor: \"pointer\",\n transition: \"background 0.15s\",\n borderLeft: isActive ? `2px solid ${C.teal}` : \"2px solid transparent\",\n };\n}\n\nfunction getTargetButtonStyles(isActive: boolean): CSSProperties {\n return {\n border: \"none\",\n borderRight: `1px solid ${C.border}`,\n padding: \"0.45rem 0.85rem\",\n background: isActive ? C.tealDim : \"transparent\",\n color: isActive ? C.teal : C.textMuted,\n fontSize: \"0.78rem\",\n fontWeight: isActive ? 700 : 500,\n cursor: \"pointer\",\n fontFamily: \"ui-monospace, monospace\",\n transition: \"background 0.1s\",\n whiteSpace: \"nowrap\",\n };\n}\n\nfunction runButtonStyles(enabled: boolean, running: boolean): CSSProperties {\n return {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.4rem\",\n border: \"none\",\n borderRadius: \"7px\",\n padding: \"0.45rem 0.9rem\",\n background: enabled ? C.teal : C.bgCard,\n color: enabled ? \"#0e1015\" : C.textMuted,\n fontSize: \"0.82rem\",\n fontWeight: 700,\n fontFamily: \"ui-monospace, monospace\",\n cursor: enabled ? \"pointer\" : \"not-allowed\",\n opacity: running ? 0.75 : 1,\n transition: \"background 0.15s\",\n whiteSpace: \"nowrap\",\n };\n}\n\nconst runningDotStyles: CSSProperties = {\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"currentColor\",\n};\n\n// ─── Schema tab styles ────────────────────────────────────────────────────────\n\nconst schemaLayoutStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1.5rem\",\n};\n\nconst schemaSectionStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.65rem\",\n};\n\nconst schemaSectionHeaderStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.6rem\",\n};\n\nconst schemaSectionTitleStyles: CSSProperties = {\n fontSize: \"0.72rem\",\n fontWeight: 700,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n};\n\nconst schemaBadgeStyles: CSSProperties = {\n fontSize: \"0.68rem\",\n fontWeight: 700,\n color: C.teal,\n backgroundColor: C.tealDim,\n borderRadius: \"4px\",\n padding: \"0.1rem 0.4rem\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst schemaMigrationsMetaStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n marginLeft: \"auto\",\n};\n\nconst schemaVersionChipStyles: CSSProperties = {\n fontSize: \"0.68rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textMuted,\n backgroundColor: C.bgCard,\n border: `1px solid ${C.border}`,\n borderRadius: \"4px\",\n padding: \"0.1rem 0.5rem\",\n};\n\nconst schemaTableGridStyles: CSSProperties = {\n borderRadius: \"10px\",\n border: `1px solid ${C.border}`,\n overflow: \"hidden\",\n};\n\nconst schemaTableHeaderRowStyles: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr 90px\",\n gap: 0,\n backgroundColor: C.bgCard,\n borderBottom: `1px solid ${C.border}`,\n};\n\nconst schemaColHeaderStyles: CSSProperties = {\n padding: \"0.5rem 0.85rem\",\n fontSize: \"0.68rem\",\n fontWeight: 700,\n letterSpacing: \"0.07em\",\n textTransform: \"uppercase\",\n color: C.textMuted,\n borderRight: `1px solid ${C.border}`,\n};\n\nconst schemaTableRowStyles: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr 90px\",\n gap: 0,\n borderBottom: `1px solid ${C.border}`,\n};\n\nconst schemaTableNameStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n padding: \"0.6rem 0.85rem\",\n fontSize: \"0.82rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.text,\n borderRight: `1px solid ${C.border}`,\n};\n\nconst schemaTableIconStyles: CSSProperties = {\n color: C.teal,\n fontSize: \"0.68rem\",\n opacity: 0.8,\n};\n\nconst schemaCrdtNameStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n padding: \"0.6rem 0.85rem\",\n fontSize: \"0.82rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textDim,\n borderRight: `1px solid ${C.border}`,\n};\n\nconst schemaStatusCellStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"0.6rem 0.5rem\",\n};\n\nconst schemaActiveTagStyles: CSSProperties = {\n fontSize: \"0.68rem\",\n fontWeight: 700,\n color: C.success,\n backgroundColor: C.successBg,\n borderRadius: \"4px\",\n padding: \"0.15rem 0.45rem\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst schemaEmptyStyles: CSSProperties = {\n fontSize: \"0.82rem\",\n color: C.textMuted,\n fontStyle: \"italic\",\n};\n\nconst migrationListStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.35rem\",\n};\n\nfunction getMigrationRowStyles(applied: boolean): CSSProperties {\n return {\n display: \"grid\",\n gridTemplateColumns: \"3.5rem 1fr 70px\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"0.55rem 0.85rem\",\n borderRadius: \"8px\",\n background: applied ? C.bgCard : \"transparent\",\n border: `1px solid ${applied ? C.border : C.borderLight}`,\n opacity: applied ? 1 : 0.55,\n };\n}\n\nconst migrationVersionStyles: CSSProperties = {\n fontSize: \"0.78rem\",\n fontWeight: 700,\n fontFamily: \"ui-monospace, monospace\",\n color: C.textDim,\n};\n\nconst migrationBarTrackStyles: CSSProperties = {\n height: \"4px\",\n borderRadius: \"2px\",\n backgroundColor: C.border,\n overflow: \"hidden\",\n};\n\nfunction getMigrationBarFillStyles(applied: boolean): CSSProperties {\n return {\n height: \"100%\",\n width: applied ? \"100%\" : \"0%\",\n borderRadius: \"2px\",\n backgroundColor: C.teal,\n transition: \"width 0.3s ease\",\n };\n}\n\nfunction getMigrationTagStyles(applied: boolean, isCurrent: boolean): CSSProperties {\n if (isCurrent) {\n return {\n fontSize: \"0.68rem\",\n fontWeight: 700,\n color: C.teal,\n backgroundColor: C.tealDim,\n borderRadius: \"4px\",\n padding: \"0.15rem 0.45rem\",\n fontFamily: \"ui-monospace, monospace\",\n textAlign: \"center\",\n };\n }\n if (applied) {\n return {\n fontSize: \"0.68rem\",\n fontWeight: 600,\n color: C.success,\n backgroundColor: C.successBg,\n borderRadius: \"4px\",\n padding: \"0.15rem 0.45rem\",\n fontFamily: \"ui-monospace, monospace\",\n textAlign: \"center\",\n };\n }\n return {\n fontSize: \"0.68rem\",\n fontWeight: 600,\n color: C.amber,\n backgroundColor: \"rgba(251,191,36,0.08)\",\n borderRadius: \"4px\",\n padding: \"0.15rem 0.45rem\",\n fontFamily: \"ui-monospace, monospace\",\n textAlign: \"center\",\n };\n}\n\n// ─── Event log tab styles ─────────────────────────────────────────────────────\n\nconst liveQueryHeaderRowStyles: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"minmax(0, 1fr) 220px 110px\",\n gap: 0,\n backgroundColor: C.bgCard,\n borderBottom: `1px solid ${C.border}`,\n};\n\nconst liveQueryRowStyles: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"minmax(0, 1fr) 220px 110px\",\n gap: 0,\n borderBottom: `1px solid ${C.border}`,\n};\n\nconst liveQuerySqlStyles: CSSProperties = {\n padding: \"0.6rem 0.85rem\",\n fontSize: \"0.78rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.text,\n borderRight: `1px solid ${C.border}`,\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"anywhere\",\n};\n\nconst liveQueryParametersStyles: CSSProperties = {\n padding: \"0.6rem 0.85rem\",\n fontSize: \"0.78rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textDim,\n borderRight: `1px solid ${C.border}`,\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"anywhere\",\n};\n\nconst liveQueryIdleTagStyles: CSSProperties = {\n fontSize: \"0.68rem\",\n fontWeight: 700,\n color: C.textMuted,\n backgroundColor: C.bgCard,\n border: `1px solid ${C.border}`,\n borderRadius: \"4px\",\n padding: \"0.15rem 0.45rem\",\n fontFamily: \"ui-monospace, monospace\",\n};\n\nconst eventLogLayoutStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.75rem\",\n height: \"100%\",\n};\n\nconst eventLogToolbarStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n flexWrap: \"wrap\",\n flexShrink: 0,\n};\n\nconst eventLogFilterSelectStyles: CSSProperties = {\n borderRadius: \"7px\",\n border: `1px solid ${C.border}`,\n padding: \"0.35rem 0.6rem\",\n backgroundColor: C.bgCard,\n color: C.text,\n fontSize: \"0.78rem\",\n fontFamily: \"ui-monospace, monospace\",\n cursor: \"pointer\",\n};\n\nconst eventLogRefreshButtonStyles: CSSProperties = {\n border: `1px solid ${C.border}`,\n borderRadius: \"7px\",\n padding: \"0.35rem 0.7rem\",\n backgroundColor: \"transparent\",\n color: C.textDim,\n fontSize: \"0.78rem\",\n fontFamily: \"ui-monospace, monospace\",\n cursor: \"pointer\",\n};\n\nconst eventLogCountStyles: CSSProperties = {\n marginLeft: \"auto\",\n fontSize: \"0.72rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textMuted,\n};\n\nconst eventLogEmptyStyles: CSSProperties = {\n padding: \"2rem\",\n textAlign: \"center\",\n fontSize: \"0.82rem\",\n color: C.textMuted,\n fontStyle: \"italic\",\n};\n\nconst eventLogListStyles: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.25rem\",\n overflowY: \"auto\",\n flex: 1,\n};\n\nfunction getEventRowStyles(isExpanded: boolean): CSSProperties {\n return {\n borderRadius: \"8px\",\n border: `1px solid ${isExpanded ? `${C.teal}40` : C.border}`,\n background: isExpanded ? C.tealGlow : C.bgCard,\n overflow: \"hidden\",\n flexShrink: 0,\n };\n}\n\nconst eventRowHeaderStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n width: \"100%\",\n padding: \"0.5rem 0.75rem\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n textAlign: \"left\",\n flexWrap: \"wrap\",\n};\n\nconst eventSyncIdStyles: CSSProperties = {\n fontSize: \"0.7rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textMuted,\n minWidth: \"3.5rem\",\n};\n\nconst eventDatasetStyles: CSSProperties = {\n fontSize: \"0.8rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.text,\n fontWeight: 600,\n};\n\nconst eventItemIdStyles: CSSProperties = {\n fontSize: \"0.75rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textMuted,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n minWidth: 0,\n};\n\nconst eventTimestampStyles: CSSProperties = {\n fontSize: \"0.7rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textMuted,\n marginLeft: \"auto\",\n};\n\nconst eventChevronStyles: CSSProperties = {\n fontSize: \"0.6rem\",\n color: C.textMuted,\n marginLeft: \"0.25rem\",\n};\n\nconst eventPayloadStyles: CSSProperties = {\n borderTop: `1px solid ${C.border}`,\n padding: \"0.6rem 0.75rem\",\n};\n\nconst eventPayloadMetaStyles: CSSProperties = {\n display: \"flex\",\n gap: \"0.75rem\",\n marginBottom: \"0.5rem\",\n};\n\nconst eventMetaItemStyles: CSSProperties = {\n fontSize: \"0.68rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.textMuted,\n};\n\nconst eventPayloadPreStyles: CSSProperties = {\n margin: 0,\n fontSize: \"0.78rem\",\n fontFamily: \"ui-monospace, monospace\",\n color: C.text,\n lineHeight: 1.5,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n};\n\nconst loadMoreButtonStyles: CSSProperties = {\n width: \"100%\",\n border: `1px solid ${C.border}`,\n borderRadius: \"8px\",\n padding: \"0.6rem\",\n backgroundColor: \"transparent\",\n color: C.textDim,\n fontSize: \"0.78rem\",\n fontFamily: \"ui-monospace, monospace\",\n cursor: \"pointer\",\n flexShrink: 0,\n};\n\n// Event type badges\nconst eventTypeBadgeBase: CSSProperties = {\n fontSize: \"0.65rem\",\n fontWeight: 700,\n borderRadius: \"4px\",\n padding: \"0.1rem 0.4rem\",\n fontFamily: \"ui-monospace, monospace\",\n whiteSpace: \"nowrap\",\n};\n\nconst eventTypeCreateStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.teal,\n backgroundColor: C.tealDim,\n};\n\nconst eventTypeUpdateStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: \"#a78bfa\",\n backgroundColor: \"rgba(167,139,250,0.12)\",\n};\n\nconst eventTypeDeleteStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.error,\n backgroundColor: \"rgba(248,113,113,0.12)\",\n};\n\n// Origin badges\nconst eventOriginOwnStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.success,\n backgroundColor: C.successBg,\n};\n\nconst eventOriginRemoteStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.amber,\n backgroundColor: \"rgba(251,191,36,0.1)\",\n};\n\nconst eventOriginLocalStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.textDim,\n backgroundColor: C.bgCard,\n border: `1px solid ${C.border}`,\n};\n\n// Status badges\nconst eventStatusAppliedStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.success,\n backgroundColor: C.successBg,\n};\n\nconst eventStatusPendingStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.amber,\n backgroundColor: \"rgba(251,191,36,0.1)\",\n};\n\nconst eventStatusFailedStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.error,\n backgroundColor: C.errorBg,\n};\n\nconst eventStatusSkippedStyles: CSSProperties = {\n ...eventTypeBadgeBase,\n color: C.textMuted,\n backgroundColor: C.bgCard,\n};\n","import type { SyncedDb } from \"@sqlite-sync/core\";\n\nconst devtoolsRegistrySymbol = Symbol.for(\"@sqlite-sync/devtools\");\n\nexport type SQLiteSyncDevtoolsInstance = {\n instanceId: string;\n dbId: string;\n createdAt: number;\n instance: SyncedDb<any>;\n};\n\nexport type SQLiteSyncDevtoolsSnapshot = {\n instances: readonly SQLiteSyncDevtoolsInstance[];\n};\n\nexport type SQLiteSyncDevtoolsRegistry = {\n version: 1;\n instances: Map<string, SQLiteSyncDevtoolsInstance>;\n subscribe(listener: () => void): () => void;\n getSnapshot(): SQLiteSyncDevtoolsSnapshot;\n register(instance: SQLiteSyncDevtoolsInstance): () => void;\n};\n\ntype RegistryGlobal = typeof globalThis & {\n [key: symbol]: SQLiteSyncDevtoolsRegistry | undefined;\n};\n\nfunction createSQLiteSyncDevtoolsRegistry(): SQLiteSyncDevtoolsRegistry {\n const instances = new Map<string, SQLiteSyncDevtoolsInstance>();\n const listeners = new Set<() => void>();\n let snapshot: SQLiteSyncDevtoolsSnapshot = {\n instances: [],\n };\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n const updateSnapshot = () => {\n snapshot = {\n instances: Array.from(instances.values()),\n };\n notify();\n };\n\n return {\n version: 1,\n instances,\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n getSnapshot() {\n return snapshot;\n },\n register(instance) {\n instances.set(instance.instanceId, instance);\n updateSnapshot();\n\n let isUnregistered = false;\n return () => {\n if (isUnregistered) return;\n isUnregistered = true;\n\n if (!instances.delete(instance.instanceId)) return;\n updateSnapshot();\n };\n },\n };\n}\n\nexport function getOrCreateSQLiteSyncDevtoolsRegistry(): SQLiteSyncDevtoolsRegistry {\n const registryGlobal = globalThis as RegistryGlobal;\n\n registryGlobal[devtoolsRegistrySymbol] ??= createSQLiteSyncDevtoolsRegistry();\n\n return registryGlobal[devtoolsRegistrySymbol];\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqlite-sync/devtools",
3
- "version": "0.4.3",
3
+ "version": "0.4.5",
4
4
  "description": "Embeddable devtools for @sqlite-sync",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -29,17 +29,16 @@
29
29
  "files": [
30
30
  "dist"
31
31
  ],
32
- "dependencies": {
33
- "@sqlite-sync/core": "0.4.3"
34
- },
35
32
  "peerDependencies": {
33
+ "@sqlite-sync/core": "^0.4.5",
36
34
  "react": "^18.0.0 || ^19.0.0"
37
35
  },
38
36
  "devDependencies": {
39
37
  "@types/react": "^19.2.17",
40
38
  "react": "^19.2.7",
41
39
  "tsup": "^8.3.5",
42
- "typescript": "~6.0.3"
40
+ "typescript": "~6.0.3",
41
+ "@sqlite-sync/core": "0.4.5"
43
42
  },
44
43
  "scripts": {
45
44
  "build": "tsup",