@party-stack/ontology-devtools 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +195 -0
  2. package/lib/DisclosureSummary.d.ts +7 -0
  3. package/lib/DisclosureSummary.d.ts.map +1 -0
  4. package/lib/DisclosureSummary.js +20 -0
  5. package/lib/DisclosureSummary.js.map +1 -0
  6. package/lib/NativeQueryCode.d.ts +7 -0
  7. package/lib/NativeQueryCode.d.ts.map +1 -0
  8. package/lib/NativeQueryCode.js +35 -0
  9. package/lib/NativeQueryCode.js.map +1 -0
  10. package/lib/OntologyDevtools.d.ts +11 -50
  11. package/lib/OntologyDevtools.d.ts.map +1 -1
  12. package/lib/OntologyDevtools.js +310 -626
  13. package/lib/OntologyDevtools.js.map +1 -1
  14. package/lib/OntologyIcons.d.ts +14 -0
  15. package/lib/OntologyIcons.d.ts.map +1 -0
  16. package/lib/OntologyIcons.js +22 -0
  17. package/lib/OntologyIcons.js.map +1 -0
  18. package/lib/PanelBoundary.d.ts +10 -0
  19. package/lib/PanelBoundary.d.ts.map +1 -0
  20. package/lib/PanelBoundary.js +67 -0
  21. package/lib/PanelBoundary.js.map +1 -0
  22. package/lib/Pinned.d.ts +14 -0
  23. package/lib/Pinned.d.ts.map +1 -0
  24. package/lib/Pinned.js +142 -0
  25. package/lib/Pinned.js.map +1 -0
  26. package/lib/PinnedFamily.d.ts +13 -0
  27. package/lib/PinnedFamily.d.ts.map +1 -0
  28. package/lib/PinnedFamily.js +105 -0
  29. package/lib/PinnedFamily.js.map +1 -0
  30. package/lib/Queries.d.ts +12 -0
  31. package/lib/Queries.d.ts.map +1 -0
  32. package/lib/Queries.js +147 -0
  33. package/lib/Queries.js.map +1 -0
  34. package/lib/QueryOwners.d.ts +7 -0
  35. package/lib/QueryOwners.d.ts.map +1 -0
  36. package/lib/QueryOwners.js +46 -0
  37. package/lib/QueryOwners.js.map +1 -0
  38. package/lib/QueryPills.d.ts +17 -0
  39. package/lib/QueryPills.d.ts.map +1 -0
  40. package/lib/QueryPills.js +37 -0
  41. package/lib/QueryPills.js.map +1 -0
  42. package/lib/QueryPushdown.d.ts +26 -0
  43. package/lib/QueryPushdown.d.ts.map +1 -0
  44. package/lib/QueryPushdown.js +380 -0
  45. package/lib/QueryPushdown.js.map +1 -0
  46. package/lib/QueryTokens.d.ts +25 -0
  47. package/lib/QueryTokens.d.ts.map +1 -0
  48. package/lib/QueryTokens.js +49 -0
  49. package/lib/QueryTokens.js.map +1 -0
  50. package/lib/QueryView.d.ts +37 -0
  51. package/lib/QueryView.d.ts.map +1 -0
  52. package/lib/QueryView.js +547 -0
  53. package/lib/QueryView.js.map +1 -0
  54. package/lib/SchemaView.d.ts +8 -0
  55. package/lib/SchemaView.d.ts.map +1 -0
  56. package/lib/SchemaView.js +213 -0
  57. package/lib/SchemaView.js.map +1 -0
  58. package/lib/Storage.d.ts +17 -0
  59. package/lib/Storage.d.ts.map +1 -0
  60. package/lib/Storage.js +205 -0
  61. package/lib/Storage.js.map +1 -0
  62. package/lib/Tracing.d.ts +7 -0
  63. package/lib/Tracing.d.ts.map +1 -0
  64. package/lib/Tracing.js +344 -0
  65. package/lib/Tracing.js.map +1 -0
  66. package/lib/attribution/Highlight.d.ts +9 -0
  67. package/lib/attribution/Highlight.d.ts.map +1 -0
  68. package/lib/attribution/Highlight.js +73 -0
  69. package/lib/attribution/Highlight.js.map +1 -0
  70. package/lib/attribution/index.d.ts +12 -0
  71. package/lib/attribution/index.d.ts.map +1 -0
  72. package/lib/attribution/index.js +31 -0
  73. package/lib/attribution/index.js.map +1 -0
  74. package/lib/attribution/registry.d.ts +16 -0
  75. package/lib/attribution/registry.d.ts.map +1 -0
  76. package/lib/attribution/registry.js +31 -0
  77. package/lib/attribution/registry.js.map +1 -0
  78. package/lib/attribution/tanstack.d.ts +11 -0
  79. package/lib/attribution/tanstack.d.ts.map +1 -0
  80. package/lib/attribution/tanstack.js +81 -0
  81. package/lib/attribution/tanstack.js.map +1 -0
  82. package/lib/chrome.d.ts +9 -0
  83. package/lib/chrome.d.ts.map +1 -0
  84. package/lib/chrome.js +41 -0
  85. package/lib/chrome.js.map +1 -0
  86. package/lib/diagnostics.d.ts +15 -0
  87. package/lib/diagnostics.d.ts.map +1 -0
  88. package/lib/diagnostics.js +31 -0
  89. package/lib/diagnostics.js.map +1 -0
  90. package/lib/index.d.ts +4 -2
  91. package/lib/index.js +3 -1
  92. package/lib/plugin.d.ts +11 -0
  93. package/lib/plugin.d.ts.map +1 -0
  94. package/lib/plugin.js +62 -0
  95. package/lib/plugin.js.map +1 -0
  96. package/lib/queryIR.d.ts +9 -0
  97. package/lib/queryIR.d.ts.map +1 -0
  98. package/lib/queryIR.js +69 -0
  99. package/lib/queryIR.js.map +1 -0
  100. package/lib/replicationActivity.d.ts +52 -0
  101. package/lib/replicationActivity.d.ts.map +1 -0
  102. package/lib/replicationActivity.js +54 -0
  103. package/lib/replicationActivity.js.map +1 -0
  104. package/lib/schemaLayout.d.ts +35 -0
  105. package/lib/schemaLayout.d.ts.map +1 -0
  106. package/lib/schemaLayout.js +75 -0
  107. package/lib/schemaLayout.js.map +1 -0
  108. package/lib/styles.js +6 -0
  109. package/lib/styles.js.map +1 -0
  110. package/lib/traceTimeline.d.ts +15 -0
  111. package/lib/traceTimeline.d.ts.map +1 -0
  112. package/lib/traceTimeline.js +36 -0
  113. package/lib/traceTimeline.js.map +1 -0
  114. package/lib/traceWaterfall.d.ts +25 -0
  115. package/lib/traceWaterfall.d.ts.map +1 -0
  116. package/lib/traceWaterfall.js +70 -0
  117. package/lib/traceWaterfall.js.map +1 -0
  118. package/lib/typeDisplayName.d.ts +5 -0
  119. package/lib/typeDisplayName.d.ts.map +1 -0
  120. package/lib/typeDisplayName.js +28 -0
  121. package/lib/typeDisplayName.js.map +1 -0
  122. package/lib/types.d.ts +17 -0
  123. package/lib/types.d.ts.map +1 -0
  124. package/lib/types.js +1 -0
  125. package/lib/vite/index.d.ts +18 -0
  126. package/lib/vite/index.d.ts.map +1 -0
  127. package/lib/vite/index.js +148 -0
  128. package/lib/vite/index.js.map +1 -0
  129. package/package.json +25 -8
  130. package/lib/styles.css +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"OntologyDevtools.js","names":["ArrowPathIcon","TrashIcon","CheckIcon","InboxStackIcon","ShareIcon","CircleStackIcon","LinkIcon","ListBulletIcon","Squares2X2Icon","CodeBracketSquareIcon","CheckCircleIcon","HashtagIcon","CalendarDaysIcon","ClockIcon","MapPinIcon","PaperClipIcon","MapIcon","QuestionMarkCircleIcon","ViewColumnsIcon","Bars2Icon","ChevronUpIcon","ChevronDownIcon","ChevronUpDownIcon"],"sources":["../src/OntologyDevtools.tsx"],"sourcesContent":["import { Dialog } from \"@base-ui/react/dialog\";\nimport { Menu } from \"@base-ui/react/menu\";\nimport { Tabs } from \"@base-ui/react/tabs\";\nimport { Tooltip } from \"@base-ui/react/tooltip\";\nimport {\n Graph,\n layout as layoutGraph,\n type EdgeLabel,\n type GraphLabel,\n type NodeLabel,\n type Point,\n} from \"@dagrejs/dagre\";\nimport NumberFlow from \"@number-flow/react\";\nimport { LucideIcon } from \"@party-stack/icons-lucide/react\";\nimport { createReactPlugin } from \"@tanstack/devtools-utils/react\";\nimport { useLiveInfiniteQuery, useLiveQuery } from \"@tanstack/react-db\";\nimport {\n createColumnHelper,\n flexRender,\n useTable,\n tableFeatures,\n rowSortingFeature,\n columnOrderingFeature,\n columnSizingFeature,\n columnResizingFeature,\n columnVisibilityFeature,\n type ColumnOrderState,\n type ColumnSizingState,\n type SortingState,\n type ColumnVisibilityState,\n} from \"@tanstack/react-table\";\nimport {\n RefreshCw as ArrowPathIcon,\n GripVertical as Bars2Icon,\n CalendarDays as CalendarDaysIcon,\n Check as CheckIcon,\n CircleCheck as CheckCircleIcon,\n ChevronDown as ChevronDownIcon,\n ChevronUp as ChevronUpIcon,\n ChevronsUpDown as ChevronUpDownIcon,\n Database as CircleStackIcon,\n Clock as ClockIcon,\n SquareCode as CodeBracketSquareIcon,\n Hash as HashtagIcon,\n Inbox as InboxStackIcon,\n Link as LinkIcon,\n List as ListBulletIcon,\n Map as MapIcon,\n MapPin as MapPinIcon,\n Paperclip as PaperClipIcon,\n CircleQuestionMark as QuestionMarkCircleIcon,\n Share2 as ShareIcon,\n Grid2X2 as Squares2X2Icon,\n Trash2 as TrashIcon,\n Columns3 as ViewColumnsIcon,\n} from \"lucide-react\";\nimport {\n useEffect,\n useId,\n useMemo,\n useState,\n type ComponentType,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport type { IconName } from \"@party-stack/icons\";\nimport type {\n AttachmentMetadata,\n LiveOntology,\n OntologyDefinition,\n OntologyIR,\n OntologyOutbox,\n OntologyOutboxEntry,\n ObjectTypeDef,\n TypeDef,\n} from \"@party-stack/ontology\";\nimport type * as v from \"@party-stack/ontology/values\";\nimport type { TanStackDevtoolsReactPlugin } from \"@tanstack/react-devtools\";\nimport \"./styles.css\";\n\nexport interface OntologyDevtoolsPanelProps<\n Ontology extends OntologyDefinition = OntologyDefinition,\n MetaOntology extends OntologyDefinition = OntologyDefinition,\n> {\n ontology: LiveOntology<Ontology>;\n metaOntology?: LiveOntology<MetaOntology>;\n theme?: \"light\" | \"dark\";\n}\n\nexport interface OntologyDevtoolsPluginOptions<\n Ontology extends OntologyDefinition = OntologyDefinition,\n MetaOntology extends OntologyDefinition = OntologyDefinition,\n> {\n ontology: LiveOntology<Ontology>;\n id?: string;\n metaOntology?: LiveOntology<MetaOntology>;\n name?: TanStackDevtoolsReactPlugin[\"name\"];\n defaultOpen?: boolean;\n}\n\nexport interface OntologyDevtoolsChromeProps {\n theme: \"light\" | \"dark\";\n}\n\nexport function OntologyIcon({\n className,\n color,\n name,\n}: {\n className?: string;\n color?: string;\n name: IconName;\n}) {\n return (\n <LucideIcon\n aria-hidden=\"true\"\n className={className}\n name={name}\n style={color ? { color } : undefined}\n />\n );\n}\n\nfunction ObjectTypeIcon({ className, objectType }: { className?: string; objectType: ObjectTypeDef }) {\n return (\n <OntologyIcon\n className={className}\n color={objectType.color}\n name={objectType.icon?.name ?? \"database\"}\n />\n );\n}\n\nfunction PartyStackLogo({ theme }: OntologyDevtoolsChromeProps) {\n const id = useId().replaceAll(\":\", \"\");\n const gradientId = `ps-ball-${id}`;\n const shadowId = `ps-shadow-${id}`;\n\n return (\n <svg\n aria-hidden=\"true\"\n style={{\n display: \"block\",\n height: \"100%\",\n width: \"100%\",\n }}\n viewBox=\"0 0 1200 300\"\n >\n <defs>\n <radialGradient cx=\"69%\" cy=\"24%\" id={gradientId} r=\"82%\">\n <stop offset=\"0\" stopColor=\"#fff\" />\n <stop offset=\".38\" stopColor=\"#fff\" />\n <stop offset=\".62\" stopColor=\"#f8f7f3\" />\n <stop offset=\".82\" stopColor=\"#e1dfda\" />\n <stop offset=\"1\" stopColor=\"#b7b3ad\" />\n </radialGradient>\n <filter height=\"170%\" id={shadowId} width=\"160%\" x=\"-30%\" y=\"-30%\">\n <feDropShadow dx=\"3\" dy=\"6\" floodColor=\"#681611\" floodOpacity=\".28\" stdDeviation=\"5\" />\n </filter>\n </defs>\n <g transform=\"translate(22 22) scale(.5)\">\n <path d=\"M96 64h184c81 0 136 55 136 136s-55 136-136 136h-56v112H96V64Z\" fill=\"#e83b32\" />\n <g filter={`url(#${shadowId})`}>\n <circle cx=\"258\" cy=\"200\" fill={`url(#${gradientId})`} r=\"60\" />\n <ellipse cx=\"279\" cy=\"177\" fill=\"#fff\" opacity=\".92\" rx=\"8.5\" ry=\"10.5\" />\n </g>\n </g>\n <text\n fill={theme === \"dark\" ? \"#f7f5f0\" : \"#171717\"}\n fontFamily=\"Avenir Next, Avenir, Helvetica Neue, Arial, sans-serif\"\n fontSize=\"124\"\n fontWeight=\"700\"\n letterSpacing=\"-3\"\n x=\"310\"\n y=\"196\"\n >\n Party Stack\n </text>\n </svg>\n );\n}\n\nfunction PartyStackLogomark() {\n const id = useId().replaceAll(\":\", \"\");\n const gradientId = `ps-mark-ball-${id}`;\n const shadowId = `ps-mark-shadow-${id}`;\n\n return (\n <svg\n aria-hidden=\"true\"\n style={{\n display: \"block\",\n height: \"100%\",\n width: \"100%\",\n }}\n viewBox=\"0 0 512 512\"\n >\n <defs>\n <radialGradient cx=\"69%\" cy=\"24%\" id={gradientId} r=\"82%\">\n <stop offset=\"0\" stopColor=\"#fff\" />\n <stop offset=\".38\" stopColor=\"#fff\" />\n <stop offset=\".62\" stopColor=\"#f8f7f3\" />\n <stop offset=\".82\" stopColor=\"#e1dfda\" />\n <stop offset=\"1\" stopColor=\"#b7b3ad\" />\n </radialGradient>\n <filter height=\"170%\" id={shadowId} width=\"160%\" x=\"-30%\" y=\"-30%\">\n <feDropShadow dx=\"3\" dy=\"6\" floodColor=\"#681611\" floodOpacity=\".28\" stdDeviation=\"5\" />\n </filter>\n </defs>\n <path d=\"M96 64h184c81 0 136 55 136 136s-55 136-136 136h-56v112H96V64Z\" fill=\"#e83b32\" />\n <g filter={`url(#${shadowId})`}>\n <circle cx=\"258\" cy=\"200\" fill={`url(#${gradientId})`} r=\"60\" />\n <ellipse cx=\"279\" cy=\"177\" fill=\"#fff\" opacity=\".92\" rx=\"8.5\" ry=\"10.5\" />\n </g>\n </svg>\n );\n}\n\nexport function OntologyDevtoolsPluginName({ theme }: OntologyDevtoolsChromeProps) {\n return (\n <div style={{ height: 30, width: 120 }}>\n <PartyStackLogo theme={theme} />\n </div>\n );\n}\n\nexport function OntologyDevtoolsTrigger({ theme }: OntologyDevtoolsChromeProps) {\n const dark = theme === \"dark\";\n return (\n <div\n aria-label=\"Open Ontology devtools\"\n style={{\n alignItems: \"center\",\n background: dark\n ? \"linear-gradient(145deg, #2d2d31, #171719)\"\n : \"linear-gradient(145deg, #fff, #f5f5f4)\",\n border: dark ? \"1px solid rgba(255,255,255,.16)\" : \"1px solid rgba(23,23,23,.14)\",\n borderRadius: \"999px\",\n boxSizing: \"border-box\",\n boxShadow: dark\n ? \"0 10px 30px rgba(0,0,0,.34), 0 0 0 4px rgba(232,59,50,.11)\"\n : \"0 10px 28px rgba(28,25,23,.16), 0 0 0 4px rgba(232,59,50,.09)\",\n cursor: \"pointer\",\n display: \"flex\",\n height: 48,\n justifyContent: \"center\",\n padding: 8,\n width: 48,\n }}\n title=\"Open Ontology devtools\"\n >\n <PartyStackLogomark />\n </div>\n );\n}\n\nexport function ontologyDevtoolsTrigger(_element: HTMLElement, { theme }: OntologyDevtoolsChromeProps) {\n return <OntologyDevtoolsTrigger theme={theme} />;\n}\n\nfunction OutboxPanel({ children, theme }: { children: ReactNode; theme: \"light\" | \"dark\" }) {\n return (\n <div className={`ps-outbox-root ps-theme-${theme}`}>\n <div className=\"ps-outbox\">{children}</div>\n </div>\n );\n}\n\nfunction statusClass(entry: OntologyOutboxEntry): string {\n return `ps-outbox-status ps-status-${entry.status}`;\n}\n\nfunction statusLabel(entry: OntologyOutboxEntry): string {\n switch (entry.status) {\n case \"queued\":\n return \"Waiting\";\n case \"executing\":\n return \"Running\";\n case \"failed\":\n return \"Failed\";\n }\n}\n\nconst relativeTime = new Intl.RelativeTimeFormat(undefined, { numeric: \"auto\" });\n\nfunction formatRelativeTime(timestamp: number, now: number): string {\n const elapsedMs = Math.max(0, now - timestamp);\n if (elapsedMs < 60_000) {\n return \"a few seconds ago\";\n }\n const minutes = -Math.round(elapsedMs / 60_000);\n if (Math.abs(minutes) < 60) {\n return relativeTime.format(minutes, \"minute\");\n }\n const hours = Math.round(minutes / 60);\n if (Math.abs(hours) < 24) {\n return relativeTime.format(hours, \"hour\");\n }\n return relativeTime.format(Math.round(hours / 24), \"day\");\n}\n\nfunction useRelativeTimeNow(): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const interval = setInterval(() => {\n setNow(Date.now());\n }, 60_000);\n return () => {\n clearInterval(interval);\n };\n }, []);\n return now;\n}\n\nfunction cardClass(entry: OntologyOutboxEntry): string {\n return `ps-outbox-card ps-card-${entry.status}`;\n}\n\nfunction OutboxEntryCard({\n entry,\n outbox,\n now,\n}: {\n entry: OntologyOutboxEntry;\n outbox: OntologyOutbox;\n now: number;\n}) {\n const [pending, setPending] = useState<\"retry\" | \"remove\" | undefined>();\n const [actionError, setActionError] = useState<string>();\n\n const run = async (action: \"retry\" | \"remove\"): Promise<void> => {\n setPending(action);\n setActionError(undefined);\n try {\n if (action === \"retry\") {\n await outbox.retry(entry.id);\n } else {\n await outbox.remove(entry.id);\n }\n } catch (error) {\n setActionError(error instanceof Error ? error.message : String(error));\n } finally {\n setPending(undefined);\n }\n };\n\n return (\n <article className={cardClass(entry)}>\n <div className=\"ps-outbox-card-header\">\n <div className=\"ps-outbox-name\">{entry.request.actionTypeName}</div>\n <span className={statusClass(entry)}>\n <span className=\"ps-status-dot\" />\n {statusLabel(entry)}\n </span>\n </div>\n <div className=\"ps-outbox-meta\">\n <span>\n <strong>{entry.attempts}</strong> {entry.attempts === 1 ? \"attempt\" : \"attempts\"}\n </span>\n <span aria-hidden=\"true\" className=\"ps-outbox-meta-divider\" />\n <span className=\"ps-outbox-time\" title={new Date(entry.createdAt).toLocaleString()}>\n Queued {formatRelativeTime(entry.createdAt, now)}\n </span>\n {!entry.retryable ? <span className=\"ps-outbox-permanent\">Won&apos;t retry</span> : null}\n </div>\n {entry.lastError ? <div className=\"ps-outbox-error\">{entry.lastError.message}</div> : null}\n <details className=\"ps-outbox-details\">\n <summary>Parameters</summary>\n <pre>{JSON.stringify(entry.request.parameters, null, 2)}</pre>\n </details>\n <div className=\"ps-outbox-actions\">\n <button\n className=\"ps-button ps-button-primary\"\n type=\"button\"\n disabled={!entry.retryable || entry.status === \"executing\" || pending !== undefined}\n onClick={() => {\n void run(\"retry\");\n }}\n >\n <ArrowPathIcon aria-hidden=\"true\" />\n {pending === \"retry\" ? \"Retrying…\" : \"Retry\"}\n </button>\n <button\n className=\"ps-button ps-button-danger\"\n type=\"button\"\n disabled={entry.status === \"executing\" || pending !== undefined}\n onClick={() => {\n void run(\"remove\");\n }}\n >\n <TrashIcon aria-hidden=\"true\" />\n {pending === \"remove\" ? \"Removing…\" : \"Remove\"}\n </button>\n </div>\n {actionError ? <div className=\"ps-outbox-action-error\">{actionError}</div> : null}\n </article>\n );\n}\n\nfunction OutboxRows({ outbox, theme }: { outbox: OntologyOutbox; theme: \"light\" | \"dark\" }) {\n const now = useRelativeTimeNow();\n const { data } = useLiveQuery({\n query: (query) =>\n query.from({ entry: outbox.collection }).orderBy(({ entry }) => entry.sequence, \"asc\"),\n });\n\n return (\n <OutboxPanel theme={theme}>\n {data.length === 0 ? (\n <div className=\"ps-outbox-empty\">\n <div>\n <span className=\"ps-outbox-empty-mark\">\n <CheckIcon aria-hidden=\"true\" />\n </span>\n <strong>Queue is clear</strong>\n Actions will appear here while they wait to sync.\n </div>\n </div>\n ) : (\n <div className=\"ps-outbox-track\">\n {data.map((entry, index) => (\n <div className=\"ps-outbox-step\" key={entry.id}>\n {index > 0 ? <span aria-hidden=\"true\" className=\"ps-outbox-connector\" /> : null}\n <div className=\"ps-outbox-node\">\n <OutboxEntryCard entry={entry} now={now} outbox={outbox} />\n </div>\n </div>\n ))}\n </div>\n )}\n </OutboxPanel>\n );\n}\n\ntype OntologyDevtoolsView = \"objects\" | \"schema\" | \"outbox\" | \"meta\";\ntype OutboxActivity = \"idle\" | \"draining\" | \"paused\";\n\nexport function getOutboxActivity(entries: OntologyOutboxEntry[]): OutboxActivity {\n if (entries.length === 0) return \"idle\";\n const head = entries.reduce((first, entry) => (entry.sequence < first.sequence ? entry : first));\n if (head.status === \"failed\") return \"paused\";\n return \"draining\";\n}\n\nfunction outboxActivityLabel(activity: OutboxActivity): string {\n switch (activity) {\n case \"idle\":\n return \"Idle\";\n case \"draining\":\n return \"Draining\";\n case \"paused\":\n return \"Paused by failure\";\n }\n}\n\nfunction outboxBadgeClass(activity: OutboxActivity): string {\n switch (activity) {\n case \"idle\":\n return \"ps:bg-zinc-500/15 ps:text-zinc-400\";\n case \"draining\":\n return \"ps:bg-sky-500/20 ps:text-sky-300\";\n case \"paused\":\n return \"ps:bg-red-500/20 ps:text-red-300\";\n }\n}\n\nconst ontologyViews: Array<{\n id: OntologyDevtoolsView;\n label: string;\n icon: ComponentType<{\n \"aria-hidden\"?: boolean;\n className?: string;\n style?: CSSProperties;\n }>;\n}> = [\n { id: \"outbox\", label: \"Outbox\", icon: InboxStackIcon },\n { id: \"schema\", label: \"Schema\", icon: ShareIcon },\n { id: \"objects\", label: \"Objects\", icon: CircleStackIcon },\n];\n\nfunction formatObjectValue(value: unknown): string {\n if (value === undefined || value === null) return \"—\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return \"[Unserializable value]\";\n }\n}\n\nconst CONTINENTS = [\n \"15,25 45,20 75,22 110,30 120,35 105,52 100,62 85,68 75,72 60,65 50,42 30,35\",\n \"100,82 118,80 138,90 140,100 130,118 118,132 108,138 100,122 95,100\",\n \"175,38 185,30 198,28 208,32 205,42 198,48 188,48 178,44\",\n \"170,58 185,52 205,56 218,68 215,88 208,108 198,125 185,128 172,112 168,88 165,70\",\n \"212,42 228,32 255,22 282,18 310,22 325,30 330,42 318,55 300,58 282,65 265,78 248,72 232,58 218,50\",\n \"292,112 312,108 332,114 330,126 318,134 298,128 292,118\",\n];\n\nfunction resolvedType(ir: OntologyIR, type: TypeDef): TypeDef {\n if (type.kind !== \"ref\") return type;\n const referenced = ir.types.find((candidate) => candidate.name === type.value.name)?.type;\n return referenced ? resolvedType(ir, referenced) : type;\n}\n\nexport function typeDisplayName(type: TypeDef): string {\n switch (type.kind) {\n case \"ref\":\n return type.value.name;\n case \"optional\":\n return `${typeDisplayName(type.value.type)} (optional)`;\n case \"list\":\n return `List of ${typeDisplayName(type.value.elementType)}`;\n case \"map\":\n return `Map of ${typeDisplayName(type.value.valueType)}`;\n case \"objectReference\":\n return `${type.value.objectType} reference`;\n case \"string\":\n return \"String\";\n case \"boolean\":\n return \"Boolean\";\n case \"integer\":\n return \"Integer\";\n case \"float\":\n return \"Float\";\n case \"double\":\n return \"Double\";\n case \"date\":\n return \"Date\";\n case \"timestamp\":\n return \"Timestamp\";\n case \"geopoint\":\n return \"Geopoint\";\n case \"struct\":\n return \"Struct\";\n case \"union\":\n return \"Union\";\n case \"result\":\n return \"Result\";\n case \"attachment\":\n return \"Attachment\";\n case \"unknown\":\n return \"Unknown\";\n }\n}\n\nfunction typeIcon(type: TypeDef): ComponentType<{ \"aria-hidden\"?: boolean; className?: string }> {\n switch (type.kind) {\n case \"ref\":\n return LinkIcon;\n case \"optional\":\n return typeIcon(type.value.type);\n case \"list\":\n return ListBulletIcon;\n case \"map\":\n return Squares2X2Icon;\n case \"objectReference\":\n return LinkIcon;\n case \"string\":\n return CodeBracketSquareIcon;\n case \"boolean\":\n return CheckCircleIcon;\n case \"integer\":\n case \"float\":\n case \"double\":\n return HashtagIcon;\n case \"date\":\n return CalendarDaysIcon;\n case \"timestamp\":\n return ClockIcon;\n case \"geopoint\":\n return MapPinIcon;\n case \"attachment\":\n return PaperClipIcon;\n case \"struct\":\n case \"union\":\n case \"result\":\n return MapIcon;\n case \"unknown\":\n return QuestionMarkCircleIcon;\n }\n}\n\nfunction DevtoolsTooltip({ children, label }: { children: ReactNode; label: ReactNode }) {\n return (\n <Tooltip.Root>\n <Tooltip.Trigger render={<span className=\"ps:inline-flex ps:items-center\" />}>\n {children}\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Positioner className=\"ps:z-[100001]\" sideOffset={6}>\n <Tooltip.Popup className=\"ps:max-w-64 ps:rounded-md ps:border ps:border-zinc-700 ps:bg-zinc-900 ps:px-2.5 ps:py-1.5 ps:text-[11px] ps:text-zinc-200 ps:shadow-xl\">\n {label}\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n}\n\nfunction TypeIndicator({ type }: { type: TypeDef }) {\n const Icon = typeIcon(type);\n return (\n <DevtoolsTooltip label={typeDisplayName(type)}>\n {/* oxlint-disable-next-line react/static-components -- typeIcon selects an imported static icon; it does not create a component. */}\n <Icon aria-hidden className=\"ps:size-3.5 ps:text-zinc-500\" />\n </DevtoolsTooltip>\n );\n}\n\nfunction isGeopoint(value: unknown): value is v.geopoint {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"lat\" in value &&\n typeof value.lat === \"number\" &&\n \"lon\" in value &&\n typeof value.lon === \"number\"\n );\n}\n\n/* oxlint-disable jsx-a11y/prefer-tag-over-role -- Inline SVG is an image, not an HTML img. */\nfunction GeopointPreview({ value }: { value: v.geopoint }) {\n const cx = value.lon + 180;\n const cy = 90 - value.lat;\n const label = `${value.lat.toFixed(4)}, ${value.lon.toFixed(4)}`;\n return (\n <DevtoolsTooltip\n label={\n <svg\n aria-label={`Map preview for ${label}`}\n className=\"ps:block ps:rounded ps:border ps:border-zinc-700\"\n height=\"72\"\n role=\"img\"\n viewBox=\"0 0 360 180\"\n width=\"144\"\n >\n <rect className=\"ps:fill-sky-950\" height=\"180\" width=\"360\" />\n {CONTINENTS.map((points) => (\n <polygon\n className=\"ps:fill-zinc-700 ps:stroke-zinc-600\"\n key={points}\n points={points}\n strokeWidth=\"0.5\"\n />\n ))}\n <circle className=\"ps:fill-rose-400\" cx={cx} cy={cy} r=\"5\" />\n </svg>\n }\n >\n <a\n className=\"ps:text-sky-400 ps:underline ps:decoration-dotted ps:underline-offset-4\"\n href={`https://www.google.com/maps?q=${value.lat},${value.lon}`}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n {label}\n </a>\n </DevtoolsTooltip>\n );\n}\n\n/* oxlint-enable jsx-a11y/prefer-tag-over-role */\nexport function timestampPreview(value: unknown): { display: string; exact: string } | undefined {\n if (value === undefined || value === null) return undefined;\n const exact = formatObjectValue(value);\n let epochMilliseconds: number | undefined;\n if (value instanceof Date) {\n epochMilliseconds = value.getTime();\n } else if (\n typeof value === \"object\" &&\n \"epochMilliseconds\" in value &&\n (typeof value.epochMilliseconds === \"number\" || typeof value.epochMilliseconds === \"bigint\")\n ) {\n epochMilliseconds = Number(value.epochMilliseconds);\n } else if (typeof value === \"string\") {\n const parsed = Date.parse(value);\n if (!Number.isNaN(parsed)) epochMilliseconds = parsed;\n }\n if (epochMilliseconds === undefined || !Number.isFinite(epochMilliseconds)) {\n return { display: exact, exact };\n }\n return {\n display: new Intl.DateTimeFormat(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"medium\",\n }).format(new Date(epochMilliseconds)),\n exact,\n };\n}\n\nfunction isAttachment(value: unknown): value is v.attachment {\n return typeof value === \"object\" && value !== null && \"id\" in value && typeof value.id === \"string\";\n}\n\nfunction AttachmentPreview({ attachment, ontology }: { attachment: v.attachment; ontology: LiveOntology }) {\n const [preview, setPreview] = useState<{\n metadata: AttachmentMetadata;\n src?: string;\n }>();\n useEffect(() => {\n let cancelled = false;\n let objectUrl: string | undefined;\n void ontology.attachments\n .metadata(attachment)\n .then(async (metadata) => {\n if (metadata.type.startsWith(\"image/\")) {\n objectUrl = URL.createObjectURL(await ontology.attachments.blob(attachment));\n }\n if (!cancelled) setPreview({ metadata, src: objectUrl });\n })\n .catch(() => {\n if (!cancelled) setPreview(undefined);\n });\n return () => {\n cancelled = true;\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n };\n }, [attachment, ontology]);\n\n const label = preview?.metadata.name ?? attachment.id;\n if (!preview?.src) {\n return (\n <DevtoolsTooltip label={label}>\n <span className=\"ps:inline-flex ps:max-w-40 ps:items-center ps:gap-1.5 ps:truncate\">\n <PaperClipIcon aria-hidden className=\"ps:size-3.5 ps:flex-none ps:text-zinc-500\" />\n <span className=\"ps:truncate\">{label}</span>\n </span>\n </DevtoolsTooltip>\n );\n }\n\n return (\n <Dialog.Root>\n <Dialog.Trigger\n aria-label={`Open ${label}`}\n className=\"ps:block ps:overflow-hidden ps:rounded-md ps:border ps:border-zinc-700 ps:bg-transparent ps:p-0 ps:hover:border-rose-400\"\n >\n <img alt={label} className=\"ps:size-10 ps:object-cover\" src={preview.src} />\n </Dialog.Trigger>\n <Dialog.Portal>\n <Dialog.Backdrop className=\"ps:fixed ps:inset-0 ps:z-[100002] ps:bg-black/75 ps:backdrop-blur-sm\" />\n <Dialog.Viewport className=\"ps:fixed ps:inset-0 ps:z-[100003] ps:grid ps:place-items-center ps:p-8\">\n <Dialog.Popup className=\"ps:relative ps:max-h-full ps:max-w-4xl ps:rounded-xl ps:border ps:border-zinc-700 ps:bg-zinc-950 ps:p-3 ps:shadow-2xl\">\n <Dialog.Title className=\"ps:sr-only\">{label}</Dialog.Title>\n <img\n alt={label}\n className=\"ps:max-h-[80vh] ps:max-w-[80vw] ps:rounded-lg ps:object-contain\"\n src={preview.src}\n />\n <Dialog.Close className=\"ps:absolute ps:top-4 ps:right-4 ps:rounded-md ps:border ps:border-zinc-600 ps:bg-zinc-950/90 ps:px-2.5 ps:py-1.5 ps:text-xs ps:text-white\">\n Close\n </Dialog.Close>\n </Dialog.Popup>\n </Dialog.Viewport>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n\nfunction PropertyValuePreview({\n ir,\n ontology,\n type,\n value,\n}: {\n ir: OntologyIR;\n ontology: LiveOntology;\n type: TypeDef;\n value: unknown;\n}) {\n const resolved = resolvedType(ir, type);\n if (resolved.kind === \"optional\") {\n return <PropertyValuePreview ir={ir} ontology={ontology} type={resolved.value.type} value={value} />;\n }\n if (resolved.kind === \"geopoint\" && isGeopoint(value)) {\n return <GeopointPreview value={value} />;\n }\n if (resolved.kind === \"timestamp\") {\n const preview = timestampPreview(value);\n if (preview) {\n return (\n <DevtoolsTooltip label={preview.exact}>\n <span>{preview.display}</span>\n </DevtoolsTooltip>\n );\n }\n }\n if (resolved.kind === \"attachment\" && isAttachment(value)) {\n return <AttachmentPreview attachment={value} ontology={ontology} />;\n }\n if (\n resolved.kind === \"list\" &&\n resolvedType(ir, resolved.value.elementType).kind === \"attachment\" &&\n Array.isArray(value)\n ) {\n const attachments = value.filter(isAttachment);\n if (attachments.length > 0) {\n return (\n <div className=\"ps:flex ps:items-center ps:gap-1.5\">\n {attachments.slice(0, 3).map((attachment) => (\n <AttachmentPreview attachment={attachment} key={attachment.id} ontology={ontology} />\n ))}\n {attachments.length > 3 ? (\n <span className=\"ps:text-zinc-500\">+{attachments.length - 3}</span>\n ) : null}\n </div>\n );\n }\n }\n const formatted = formatObjectValue(value);\n return (\n <span className=\"ps:block ps:max-w-72 ps:truncate\" title={formatted}>\n {formatted}\n </span>\n );\n}\n\nfunction defaultColumnSize(ir: OntologyIR, type: TypeDef): number {\n switch (resolvedType(ir, type).kind) {\n case \"boolean\":\n return 110;\n case \"integer\":\n case \"float\":\n case \"double\":\n return 130;\n case \"date\":\n case \"timestamp\":\n return 190;\n case \"geopoint\":\n return 175;\n case \"attachment\":\n case \"list\":\n return 150;\n case \"objectReference\":\n return 200;\n case \"string\":\n return 220;\n default:\n return 180;\n }\n}\n\nexport function moveColumn(columnOrder: string[], sourceId: string, targetId: string): string[] {\n const sourceIndex = columnOrder.indexOf(sourceId);\n const targetIndex = columnOrder.indexOf(targetId);\n if (sourceIndex === -1 || targetIndex === -1 || sourceIndex === targetIndex) {\n return columnOrder;\n }\n const next = [...columnOrder];\n next.splice(sourceIndex, 1);\n next.splice(targetIndex, 0, sourceId);\n return next;\n}\n\nconst objectTableFeatures = tableFeatures({\n rowSortingFeature,\n columnOrderingFeature,\n columnSizingFeature,\n columnResizingFeature,\n columnVisibilityFeature,\n});\nconst objectColumnHelper = createColumnHelper<typeof objectTableFeatures, Record<string, unknown>>();\n\nfunction ObjectTable({\n collection,\n objectType,\n ontology,\n pageSize,\n}: {\n collection: LiveOntology[\"objects\"][string];\n objectType: ObjectTypeDef;\n ontology: LiveOntology;\n pageSize: number;\n}) {\n const [sorting, setSorting] = useState<SortingState>([]);\n const [columnSizing, setColumnSizing] = useState<ColumnSizingState>({});\n const [columnVisibility, setColumnVisibility] = useState<ColumnVisibilityState>({});\n const [columnOrder, setColumnOrder] = useState<ColumnOrderState>(() =>\n objectType.properties.map((property) => property.name)\n );\n const [draggedColumnId, setDraggedColumnId] = useState<string>();\n const [dragOverColumnId, setDragOverColumnId] = useState<string>();\n const selectedSort = sorting[0];\n const { data, fetchNextPage, hasNextPage, isFetchingNextPage } = useLiveInfiniteQuery(\n (query) => {\n const from = query.from({ row: collection });\n const primaryKey = objectType.primaryKey;\n if (selectedSort && selectedSort.id !== primaryKey) {\n return from\n .orderBy(\n ({ row }) => (row as Record<string, unknown>)[selectedSort.id] as string | number,\n selectedSort.desc ? \"desc\" : \"asc\"\n )\n .orderBy(\n ({ row }) => (row as Record<string, unknown>)[primaryKey] as string | number,\n \"asc\"\n )\n .select(({ row }) => row as Record<string, unknown>);\n }\n return from\n .orderBy(\n ({ row }) => (row as Record<string, unknown>)[primaryKey] as string | number,\n selectedSort?.desc ? \"desc\" : \"asc\"\n )\n .select(({ row }) => row as Record<string, unknown>);\n },\n { pageSize },\n [collection.id, objectType.primaryKey, pageSize, selectedSort?.id, selectedSort?.desc]\n );\n const rows = data as Array<Record<string, unknown>>;\n const columns = useMemo(\n () =>\n objectType.properties.map((property) =>\n objectColumnHelper.accessor((row) => row[property.name], {\n id: property.name,\n maxSize: 520,\n minSize: 90,\n size:\n property.name === objectType.primaryKey\n ? 220\n : defaultColumnSize(ontology.ir, property.type),\n header: () => (\n <span className=\"ps:inline-flex ps:items-center ps:gap-1.5\">\n <TypeIndicator type={property.type} />\n <span>{property.displayName}</span>\n {property.name === objectType.primaryKey ? (\n <span className=\"ps:ml-1.5 ps:text-[9px] ps:font-bold ps:tracking-wide ps:text-rose-400\">\n PK\n </span>\n ) : null}\n </span>\n ),\n cell: (info) => (\n <PropertyValuePreview\n ir={ontology.ir}\n ontology={ontology}\n type={property.type}\n value={info.getValue()}\n />\n ),\n })\n ),\n [objectType, ontology]\n );\n const table = useTable({\n features: objectTableFeatures,\n columnResizeMode: \"onEnd\",\n columns,\n data: rows,\n enableColumnResizing: true,\n getRowId: (row, index) => `${formatObjectValue(row[objectType.primaryKey])}-${index}`,\n manualSorting: true,\n onColumnOrderChange: setColumnOrder,\n onColumnSizingChange: setColumnSizing,\n onColumnVisibilityChange: setColumnVisibility,\n onSortingChange: setSorting,\n state: { columnOrder, columnSizing, columnVisibility, sorting },\n });\n const resizingColumnId = table.state.columnResizing.isResizingColumn;\n const resizingColumn =\n typeof resizingColumnId === \"string\" ? table.getColumn(resizingColumnId) : undefined;\n const allColumns = table.getAllLeafColumns();\n\n return (\n <div className=\"ps:flex ps:min-h-0 ps:min-w-0 ps:flex-1 ps:flex-col ps:overflow-hidden\">\n <div className=\"ps:flex ps:flex-none ps:items-center ps:border-b ps:border-zinc-500/20 ps:px-4 ps:py-2\">\n <h2 className=\"ps:m-0 ps:flex ps:items-center ps:gap-2 ps:text-lg ps:font-semibold\">\n <ObjectTypeIcon\n className=\"ps:size-5 ps:flex-none ps:text-rose-400\"\n objectType={objectType}\n />\n {objectType.pluralDisplayName}\n </h2>\n <div className=\"ps:ml-auto ps:flex ps:items-center ps:gap-1.5\">\n <button\n className=\"ps:inline-flex ps:items-center ps:gap-1.5 ps:rounded-md ps:border-0 ps:bg-transparent ps:px-2 ps:py-1.5 ps:text-xs ps:text-zinc-400 ps:hover:bg-zinc-500/10 ps:hover:text-current ps:disabled:opacity-40\"\n disabled={Object.keys(columnSizing).length === 0}\n title=\"Reset column widths\"\n type=\"button\"\n onClick={() => {\n table.resetColumnSizing();\n }}\n >\n <ArrowPathIcon aria-hidden className=\"ps:size-3.5\" />\n Reset widths\n </button>\n <Menu.Root>\n <Menu.Trigger className=\"ps:inline-flex ps:items-center ps:gap-1.5 ps:rounded-md ps:border ps:border-zinc-500/30 ps:bg-zinc-500/10 ps:px-2.5 ps:py-1.5 ps:text-xs ps:text-inherit ps:hover:border-zinc-500/60\">\n <ViewColumnsIcon aria-hidden className=\"ps:size-3.5\" />\n Columns\n </Menu.Trigger>\n <Menu.Portal>\n <Menu.Positioner align=\"end\" className=\"ps:z-[100001]\" sideOffset={6}>\n <Menu.Popup className=\"ps:min-w-48 ps:rounded-lg ps:border ps:border-zinc-700 ps:bg-zinc-900 ps:p-1.5 ps:text-xs ps:text-zinc-200 ps:shadow-2xl\">\n <Menu.Group>\n <Menu.GroupLabel className=\"ps:px-2 ps:py-1.5 ps:text-[10px] ps:font-bold ps:tracking-wider ps:text-zinc-500 ps:uppercase\">\n Columns\n </Menu.GroupLabel>\n {allColumns.map((column, columnIndex) => (\n <Menu.CheckboxItem\n aria-label={\n objectType.properties.find(\n (property) => property.name === column.id\n )?.displayName ?? column.id\n }\n checked={column.getIsVisible()}\n className={\n dragOverColumnId === column.id &&\n draggedColumnId !== column.id\n ? \"ps:flex ps:cursor-default ps:items-center ps:gap-2 ps:rounded-md ps:bg-rose-500/15 ps:px-2 ps:py-1.5 ps:outline-none\"\n : \"ps:flex ps:cursor-default ps:items-center ps:gap-2 ps:rounded-md ps:px-2 ps:py-1.5 ps:outline-none ps:data-[highlighted]:bg-zinc-700/70\"\n }\n draggable\n key={column.id}\n label={\n objectType.properties.find(\n (property) => property.name === column.id\n )?.displayName ?? column.id\n }\n onCheckedChange={(checked) => {\n column.toggleVisibility(checked);\n }}\n onDragEnd={() => {\n setDraggedColumnId(undefined);\n setDragOverColumnId(undefined);\n }}\n onDragOver={(event) => {\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n setDragOverColumnId(column.id);\n }}\n onDragStart={(event) => {\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", column.id);\n setDraggedColumnId(column.id);\n }}\n onDrop={(event) => {\n event.preventDefault();\n if (draggedColumnId && draggedColumnId !== column.id) {\n setColumnOrder((current) =>\n moveColumn(current, draggedColumnId, column.id)\n );\n }\n setDraggedColumnId(undefined);\n setDragOverColumnId(undefined);\n }}\n onKeyDown={(event) => {\n if (\n !event.altKey ||\n (event.key !== \"ArrowUp\" && event.key !== \"ArrowDown\")\n ) {\n return;\n }\n event.preventDefault();\n const targetIndex =\n event.key === \"ArrowUp\"\n ? columnIndex - 1\n : columnIndex + 1;\n const target = allColumns[targetIndex];\n if (target) {\n setColumnOrder((current) =>\n moveColumn(current, column.id, target.id)\n );\n }\n }}\n >\n <span\n aria-hidden=\"true\"\n className=\"ps:cursor-grab ps:text-zinc-500 ps:active:cursor-grabbing\"\n title=\"Drag to reorder\"\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <Bars2Icon aria-hidden className=\"ps:size-3.5\" />\n </span>\n <span className=\"ps:grid ps:size-4 ps:place-items-center ps:rounded ps:border ps:border-zinc-600\">\n {column.getIsVisible() ? (\n <CheckIcon\n aria-hidden\n className=\"ps:size-3 ps:text-rose-400\"\n />\n ) : null}\n </span>\n <span className=\"ps:truncate\">\n {objectType.properties.find(\n (property) => property.name === column.id\n )?.displayName ?? column.id}\n </span>\n </Menu.CheckboxItem>\n ))}\n <p className=\"ps:m-0 ps:px-2 ps:pt-2 ps:pb-1 ps:text-[10px] ps:text-zinc-500\">\n Drag to reorder · Alt+↑/↓ with keyboard\n </p>\n </Menu.Group>\n </Menu.Popup>\n </Menu.Positioner>\n </Menu.Portal>\n </Menu.Root>\n </div>\n </div>\n {rows.length === 0 ? (\n <div className=\"ps:m-4 ps:grid ps:min-h-40 ps:place-items-center ps:rounded-xl ps:border ps:border-dashed ps:border-zinc-500/40 ps:text-sm ps:text-zinc-500\">\n No objects loaded\n </div>\n ) : (\n <div className=\"ps-object-table-scroll ps:min-h-0 ps:flex-1 ps:overflow-auto\">\n <div\n className=\"ps:relative ps:min-h-full\"\n style={{ minWidth: \"100%\", width: table.getTotalSize() }}\n >\n <table className=\"ps:w-full ps:table-fixed ps:border-separate ps:border-spacing-0 ps:text-left ps:text-xs\">\n <colgroup>\n {table.getVisibleLeafColumns().map((column) => (\n <col key={column.id} style={{ width: column.getSize() }} />\n ))}\n </colgroup>\n <thead className=\"ps-object-table-header\">\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const direction = header.column.getIsSorted();\n return (\n <th\n className=\"ps:relative ps:border-b ps:border-zinc-500/30 ps:bg-zinc-950/95 ps:px-4 ps:py-3 ps:font-semibold ps:whitespace-nowrap ps:backdrop-blur ps:in-[.ps-theme-light]:bg-stone-50/95\"\n key={header.id}\n >\n {header.isPlaceholder ? null : (\n <button\n className=\"ps:flex ps:w-full ps:items-center ps:gap-2 ps:border-0 ps:bg-transparent ps:p-0 ps:text-left ps:text-inherit ps:font-inherit ps:hover:text-rose-400\"\n title={`Sort by ${header.column.id}`}\n type=\"button\"\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n {direction === \"asc\" ? (\n <ChevronUpIcon\n aria-hidden\n className=\"ps:size-3.5 ps:flex-none ps:text-rose-400\"\n />\n ) : direction === \"desc\" ? (\n <ChevronDownIcon\n aria-hidden\n className=\"ps:size-3.5 ps:flex-none ps:text-rose-400\"\n />\n ) : (\n <ChevronUpDownIcon\n aria-hidden\n className=\"ps:size-3.5 ps:flex-none ps:text-zinc-600\"\n />\n )}\n <span className=\"ps:sr-only\">\n {direction === \"asc\"\n ? \"Sorted ascending\"\n : direction === \"desc\"\n ? \"Sorted descending\"\n : \"Not sorted\"}\n </span>\n </button>\n )}\n {\n header.column.getCanResize() ? (\n // oxlint-disable jsx-a11y/prefer-tag-over-role -- This focusable separator adjusts column width; an hr cannot replace it.\n <button\n aria-label={`Resize ${header.column.id} column`}\n aria-orientation=\"vertical\"\n aria-valuemax={\n header.column.columnDef.maxSize\n }\n aria-valuemin={\n header.column.columnDef.minSize\n }\n aria-valuenow={header.column.getSize()}\n className={\n header.column.getIsResizing()\n ? \"ps:absolute ps:top-0 ps:right-0 ps:z-20 ps:h-full ps:w-1 ps:cursor-col-resize ps:touch-none ps:border-0 ps:bg-transparent ps:p-0\"\n : resizingColumn\n ? \"ps:pointer-events-none ps:invisible ps:absolute ps:top-0 ps:right-0 ps:h-full ps:w-1 ps:border-0 ps:bg-transparent ps:p-0\"\n : \"ps:absolute ps:top-0 ps:right-0 ps:h-full ps:w-1 ps:cursor-col-resize ps:touch-none ps:border-0 ps:bg-transparent ps:p-0 ps:hover:bg-rose-400/70 ps:focus-visible:bg-rose-400/70 ps:focus:outline-none\"\n }\n disabled={\n resizingColumn !== undefined &&\n !header.column.getIsResizing()\n }\n role=\"separator\"\n tabIndex={0}\n type=\"button\"\n onDoubleClick={() => {\n header.column.resetSize();\n }}\n onKeyDown={(event) => {\n if (\n event.key !== \"ArrowLeft\" &&\n event.key !== \"ArrowRight\"\n ) {\n return;\n }\n event.preventDefault();\n const delta =\n event.key === \"ArrowRight\" ? 10 : -10;\n const min =\n header.column.columnDef.minSize ?? 20;\n const max =\n header.column.columnDef.maxSize ??\n Number.MAX_SAFE_INTEGER;\n setColumnSizing((current) => ({\n ...current,\n [header.column.id]: Math.min(\n max,\n Math.max(\n min,\n header.column.getSize() +\n delta\n )\n ),\n }));\n }}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n ) : null /* oxlint-enable jsx-a11y/prefer-tag-over-role */\n }\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows.map((row) => (\n <tr className=\"ps:hover:bg-zinc-500/8\" key={row.id}>\n {row.getVisibleCells().map((cell) => (\n <td\n className=\"ps:max-w-80 ps:border-b ps:border-zinc-500/15 ps:px-4 ps:py-3 ps:text-[11px] ps:whitespace-nowrap\"\n key={cell.id}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {hasNextPage ? (\n <div className=\"ps:sticky ps:left-0 ps:flex ps:w-full ps:justify-center ps:border-t ps:border-zinc-500/20 ps:bg-zinc-950/95 ps:p-3 ps:in-[.ps-theme-light]:bg-stone-50/95\">\n <button\n className=\"ps:rounded-md ps:border ps:border-zinc-600 ps:bg-zinc-900 ps:px-3 ps:py-1.5 ps:text-xs ps:text-zinc-200 ps:hover:border-rose-400 ps:hover:text-rose-300 ps:disabled:opacity-50\"\n disabled={isFetchingNextPage}\n type=\"button\"\n onClick={() => void fetchNextPage()}\n >\n {isFetchingNextPage ? \"Loading…\" : `Load ${pageSize} more`}\n </button>\n </div>\n ) : null}\n {resizingColumn ? (\n <div\n className=\"ps:pointer-events-none ps:absolute ps:inset-y-0 ps:z-50 ps:w-0.5 ps:bg-rose-400 ps:shadow-[0_0_0_1px_rgba(251,113,133,0.18)] ps:will-change-transform\"\n style={{\n left: resizingColumn.getStart() + resizingColumn.getSize(),\n transform: `translateX(${table.state.columnResizing.deltaOffset ?? 0}px)`,\n }}\n />\n ) : null}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ObjectsView({ ontology, pageSize = 50 }: { ontology: LiveOntology; pageSize?: number }) {\n const objectTypes = ontology.ir.objectTypes;\n const [selectedName, setSelectedName] = useState(() => objectTypes[0]?.name);\n const selected = objectTypes.find((objectType) => objectType.name === selectedName) ?? objectTypes[0];\n const collection = selected ? ontology.objects[selected.name] : undefined;\n\n if (!selected || !collection) {\n return (\n <div className=\"ps:grid ps:h-full ps:place-items-center ps:text-sm ps:text-zinc-500\">\n This ontology has no object types.\n </div>\n );\n }\n\n return (\n <div className=\"ps:flex ps:h-full ps:min-h-0 ps:w-full ps:min-w-0 ps:overflow-hidden\">\n <aside className=\"ps:w-44 ps:flex-none ps:overflow-y-auto ps:border-r ps:border-zinc-500/20 ps:p-3\">\n <p className=\"ps:mt-0 ps:mb-2 ps:px-2 ps:text-[10px] ps:font-bold ps:tracking-[0.14em] ps:text-zinc-500 ps:uppercase\">\n Object types\n </p>\n <div className=\"ps:flex ps:flex-col ps:gap-1\">\n {objectTypes.map((objectType) => (\n <button\n className={\n objectType.name === selected.name\n ? \"ps:flex ps:items-center ps:gap-2 ps:rounded-lg ps:border-0 ps:bg-rose-500/15 ps:px-2.5 ps:py-2 ps:text-left ps:text-xs ps:font-semibold ps:text-rose-400\"\n : \"ps:flex ps:items-center ps:gap-2 ps:rounded-lg ps:border-0 ps:bg-transparent ps:px-2.5 ps:py-2 ps:text-left ps:text-xs ps:text-inherit ps:hover:bg-zinc-500/10\"\n }\n key={objectType.name}\n type=\"button\"\n onClick={() => {\n setSelectedName(objectType.name);\n }}\n >\n <ObjectTypeIcon className=\"ps:size-4 ps:flex-none\" objectType={objectType} />\n <span className=\"ps:truncate\">{objectType.pluralDisplayName}</span>\n </button>\n ))}\n </div>\n </aside>\n <ObjectTable\n collection={collection}\n key={selected.name}\n objectType={selected}\n ontology={ontology}\n pageSize={pageSize}\n />\n </div>\n );\n}\n\ninterface SchemaNode {\n objectType: ObjectTypeDef;\n x: number;\n y: number;\n}\n\ninterface SchemaEdge {\n id: string;\n label: string;\n labelWidth: number;\n labelX: number;\n labelY: number;\n points: Point[];\n}\n\ninterface SchemaGraphEdgeLabel extends EdgeLabel {\n label: string;\n}\n\nconst SCHEMA_CARD_WIDTH = 230;\nconst SCHEMA_CARD_HEIGHT = 176;\n\nfunction schemaEdgeLabel(link: OntologyIR[\"linkTypes\"][number]): {\n label: string;\n width: number;\n} {\n const label = `${link.source.displayName} · ${link.cardinality}`;\n return {\n label,\n width: Math.min(180, Math.max(72, label.length * 6 + 16)),\n };\n}\n\nexport function layoutSchema(ir: OntologyIR): {\n nodes: SchemaNode[];\n edges: SchemaEdge[];\n width: number;\n height: number;\n} {\n const graph = new Graph<GraphLabel, NodeLabel, SchemaGraphEdgeLabel>({ multigraph: true })\n .setGraph({\n marginx: 40,\n marginy: 40,\n nodesep: 72,\n rankdir: \"LR\",\n ranksep: 120,\n })\n .setDefaultEdgeLabel(() => ({ label: \"\" }));\n\n for (const objectType of ir.objectTypes) {\n graph.setNode(objectType.name, {\n height: SCHEMA_CARD_HEIGHT,\n width: SCHEMA_CARD_WIDTH,\n });\n }\n for (const link of ir.linkTypes) {\n const edgeLabel = schemaEdgeLabel(link);\n graph.setEdge(\n link.source.objectType,\n link.target.objectType,\n {\n height: 24,\n label: edgeLabel.label,\n width: edgeLabel.width,\n },\n link.id\n );\n }\n\n layoutGraph(graph);\n\n const objectTypeByName = new Map(ir.objectTypes.map((objectType) => [objectType.name, objectType]));\n const nodes = graph\n .nodes()\n .map((name) => {\n const objectType = objectTypeByName.get(name);\n const node = graph.node(name);\n if (!objectType || !node) return undefined;\n return {\n objectType,\n x: (node.x ?? 0) - SCHEMA_CARD_WIDTH / 2,\n y: (node.y ?? 0) - SCHEMA_CARD_HEIGHT / 2,\n };\n })\n .filter((node): node is SchemaNode => node !== undefined);\n const edges = graph.edges().map((edge) => {\n const value = graph.edge(edge);\n return {\n id: edge.name ?? `${edge.v}-${edge.w}`,\n label: value.label ?? \"\",\n labelWidth: value.width ?? 72,\n labelX: value.x ?? value.points?.[0]?.x ?? 0,\n labelY: value.y ?? value.points?.[0]?.y ?? 0,\n points: value.points ?? [],\n };\n });\n const graphSize = graph.graph();\n\n return {\n nodes,\n edges,\n width: Math.max(310, graphSize.width ?? 0),\n height: Math.max(256, graphSize.height ?? 0),\n };\n}\n\nexport function schemaEdgePath(points: Point[], cornerRadius = 12): string {\n if (points.length === 0) return \"\";\n const first = points[0]!;\n if (points.length === 1) return `M ${first.x} ${first.y}`;\n\n const path = [`M ${first.x} ${first.y}`];\n for (let index = 1; index < points.length - 1; index += 1) {\n const previous = points[index - 1]!;\n const current = points[index]!;\n const next = points[index + 1]!;\n const incoming = Math.hypot(current.x - previous.x, current.y - previous.y);\n const outgoing = Math.hypot(next.x - current.x, next.y - current.y);\n if (incoming === 0 || outgoing === 0) {\n path.push(`L ${current.x} ${current.y}`);\n continue;\n }\n const radius = Math.min(cornerRadius, incoming / 2, outgoing / 2);\n const before = {\n x: current.x + ((previous.x - current.x) / incoming) * radius,\n y: current.y + ((previous.y - current.y) / incoming) * radius,\n };\n const after = {\n x: current.x + ((next.x - current.x) / outgoing) * radius,\n y: current.y + ((next.y - current.y) / outgoing) * radius,\n };\n path.push(`L ${before.x} ${before.y}`, `Q ${current.x} ${current.y} ${after.x} ${after.y}`);\n }\n const end = points.at(-1);\n if (end) path.push(`L ${end.x} ${end.y}`);\n return path.join(\" \");\n}\n\nfunction SchemaView({ ir }: { ir: OntologyIR }) {\n const schemaLayout = useMemo(() => layoutSchema(ir), [ir]);\n const markerId = `ps-schema-arrow-${useId().replaceAll(\":\", \"\")}`;\n\n if (ir.objectTypes.length === 0) {\n return (\n <div className=\"ps:grid ps:h-full ps:place-items-center ps:text-sm ps:text-zinc-500\">\n This ontology has no schema.\n </div>\n );\n }\n\n return (\n <div className=\"ps:h-full ps:overflow-auto ps:p-5\">\n <div\n className=\"ps:relative ps:rounded-2xl ps:border ps:border-zinc-500/20 ps:bg-zinc-950/25 ps:in-[.ps-theme-light]:bg-white/45\"\n style={{ height: schemaLayout.height, width: schemaLayout.width }}\n >\n {/* oxlint-disable jsx-a11y/prefer-tag-over-role -- Inline SVG is an image, not an HTML img. */}\n <svg\n aria-label=\"Ontology relations\"\n className=\"ps:absolute ps:inset-0 ps:size-full ps:overflow-visible\"\n role=\"img\"\n viewBox={`0 0 ${schemaLayout.width} ${schemaLayout.height}`}\n >\n <defs>\n <marker\n id={markerId}\n markerHeight=\"8\"\n markerWidth=\"8\"\n orient=\"auto\"\n refX=\"7\"\n refY=\"4\"\n >\n <path className=\"ps:fill-rose-400\" d=\"M0,0 L8,4 L0,8 Z\" />\n </marker>\n </defs>\n {schemaLayout.edges.map((edge) => (\n <g key={edge.id}>\n <path\n className=\"ps:fill-none ps:stroke-rose-400/80\"\n d={schemaEdgePath(edge.points)}\n markerEnd={`url(#${markerId})`}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n />\n <rect\n className=\"ps:fill-zinc-900 ps:stroke-zinc-700 ps:in-[.ps-theme-light]:fill-white ps:in-[.ps-theme-light]:stroke-stone-300\"\n height=\"22\"\n rx=\"7\"\n width={edge.labelWidth}\n x={edge.labelX - edge.labelWidth / 2}\n y={edge.labelY - 11}\n />\n <text\n className=\"ps:fill-zinc-300 ps:text-[10px] ps:font-medium ps:in-[.ps-theme-light]:fill-stone-600\"\n dominantBaseline=\"middle\"\n textAnchor=\"middle\"\n x={edge.labelX}\n y={edge.labelY}\n >\n {edge.label}\n </text>\n </g>\n ))}\n </svg>\n {/* oxlint-enable jsx-a11y/prefer-tag-over-role */}\n {schemaLayout.nodes.map(({ objectType, x, y }) => (\n <article\n className=\"ps:absolute ps:h-44 ps:w-[230px] ps:overflow-hidden ps:rounded-xl ps:border ps:border-zinc-500/30 ps:bg-zinc-900/95 ps:shadow-xl ps:in-[.ps-theme-light]:bg-white/95\"\n key={objectType.name}\n style={{ left: x, top: y }}\n >\n <header className=\"ps:border-b ps:border-zinc-500/20 ps:px-3.5 ps:py-3\">\n <h3 className=\"ps:m-0 ps:flex ps:items-center ps:gap-2 ps:text-sm ps:font-semibold\">\n <ObjectTypeIcon\n className=\"ps:size-4 ps:flex-none ps:text-rose-400\"\n objectType={objectType}\n />\n {objectType.displayName}\n </h3>\n <p className=\"ps:mt-0.5 ps:mb-0 ps:font-mono ps:text-[10px] ps:text-zinc-500\">\n {objectType.name}\n </p>\n </header>\n <div className=\"ps:max-h-28 ps:overflow-y-auto ps:px-3.5 ps:py-2\">\n {objectType.properties.map((property) => (\n <div\n className=\"ps:flex ps:items-center ps:justify-between ps:gap-3 ps:py-1 ps:text-[11px]\"\n key={property.name}\n >\n <span className=\"ps:truncate\">{property.displayName}</span>\n {property.name === objectType.primaryKey ? (\n <span className=\"ps:flex-none ps:text-[9px] ps:font-bold ps:text-rose-400\">\n PK\n </span>\n ) : null}\n </div>\n ))}\n </div>\n </article>\n ))}\n </div>\n </div>\n );\n}\n\nexport function OntologyDevtoolsPanel<\n Ontology extends OntologyDefinition,\n MetaOntology extends OntologyDefinition = OntologyDefinition,\n>({ metaOntology, ontology, theme = \"dark\" }: OntologyDevtoolsPanelProps<Ontology, MetaOntology>) {\n const { data: outboxEntries } = useLiveQuery({\n query: (query) => query.from({ entry: ontology.outbox.collection }),\n });\n const outboxActivity = getOutboxActivity(outboxEntries);\n\n return (\n <Tooltip.Provider>\n <Tabs.Root\n className={`ps-devtools ps-theme-${theme} ps:flex ps:h-full ps:min-h-0 ps:w-full ps:min-w-0 ps:flex-col ps:overflow-hidden ps:font-sans ps:text-[13px] ${\n theme === \"dark\" ? \"ps:bg-zinc-950 ps:text-stone-200\" : \"ps:bg-stone-50 ps:text-stone-800\"\n }`}\n defaultValue=\"outbox\"\n style={{ contain: \"inline-size\" }}\n >\n <Tabs.List\n aria-label=\"Ontology devtools views\"\n className=\"ps:flex ps:flex-none ps:items-center ps:gap-1 ps:border-b ps:border-zinc-500/20 ps:px-4\"\n style={{ height: 40 }}\n >\n {[\n ...ontologyViews,\n ...(metaOntology\n ? [\n {\n id: \"meta\" as const,\n label: \"Meta\",\n icon: CodeBracketSquareIcon,\n },\n ]\n : []),\n ].map((view) => {\n const Icon = view.icon;\n return (\n <Tabs.Tab\n className=\"ps:group ps:flex ps:h-full ps:items-center ps:gap-1.5 ps:border-x-0 ps:border-t-0 ps:border-b-2 ps:border-transparent ps:bg-transparent ps:px-3 ps:text-xs ps:font-medium ps:text-zinc-500 ps:hover:text-current ps:data-[active]:border-rose-400 ps:data-[active]:font-semibold ps:data-[active]:text-rose-400\"\n key={view.id}\n value={view.id}\n >\n <Icon\n aria-hidden\n className=\"ps:flex-none\"\n style={{ height: 16, width: 16 }}\n />\n <span>{view.label}</span>\n {view.id === \"outbox\" ? (\n <>\n <span\n className={`ps:inline-flex ps:min-w-5 ps:items-center ps:justify-center ps:rounded-full ps:px-1.5 ps:py-0.5 ps:text-center ps:text-[10px] ps:leading-none ps:transition-colors ${outboxBadgeClass(\n outboxActivity\n )}`}\n title={`${outboxEntries.length} outbox entries · ${outboxActivityLabel(\n outboxActivity\n )}`}\n >\n <NumberFlow\n className=\"ps:tabular-nums\"\n isolate\n value={outboxEntries.length}\n />\n </span>\n </>\n ) : null}\n </Tabs.Tab>\n );\n })}\n </Tabs.List>\n <Tabs.Panel className=\"ps:min-h-0 ps:min-w-0 ps:flex-1 ps:overflow-hidden\" value=\"outbox\">\n <OutboxRows outbox={ontology.outbox} theme={theme} />\n </Tabs.Panel>\n <Tabs.Panel className=\"ps:min-h-0 ps:min-w-0 ps:flex-1 ps:overflow-hidden\" value=\"schema\">\n <SchemaView ir={ontology.ir} />\n </Tabs.Panel>\n <Tabs.Panel className=\"ps:min-h-0 ps:min-w-0 ps:flex-1 ps:overflow-hidden\" value=\"objects\">\n <ObjectsView ontology={ontology} />\n </Tabs.Panel>\n {metaOntology ? (\n <Tabs.Panel className=\"ps:min-h-0 ps:min-w-0 ps:flex-1 ps:overflow-hidden\" value=\"meta\">\n <ObjectsView ontology={metaOntology} pageSize={25} />\n </Tabs.Panel>\n ) : null}\n </Tabs.Root>\n </Tooltip.Provider>\n );\n}\n\nexport function createOntologyDevtoolsPlugin<\n Ontology extends OntologyDefinition,\n MetaOntology extends OntologyDefinition = OntologyDefinition,\n>({\n ontology,\n id = \"party-stack-ontology\",\n metaOntology,\n name,\n defaultOpen,\n}: OntologyDevtoolsPluginOptions<Ontology, MetaOntology>): TanStackDevtoolsReactPlugin {\n const [createPlugin] = createReactPlugin({\n id,\n name: \"Ontology\",\n defaultOpen,\n Component: ({ theme }) => (\n <OntologyDevtoolsPanel metaOntology={metaOntology} ontology={ontology} theme={theme} />\n ),\n });\n\n return {\n ...createPlugin(),\n name: name ?? ((_element, { theme }) => <OntologyDevtoolsPluginName theme={theme} />),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"OntologyDevtools.js","names":["ArrowPathIcon","TrashIcon","CheckIcon","BoxesIcon","SendIcon","SearchIcon","PinIcon","GanttIcon","WaypointsIcon","HardDriveIcon","LinkIcon","ListBulletIcon","Squares2X2Icon","CodeBracketSquareIcon","CheckCircleIcon","HashtagIcon","CalendarDaysIcon","ClockIcon","MapPinIcon","PaperClipIcon","MapIcon","QuestionMarkCircleIcon","ViewColumnsIcon","Bars2Icon","ChevronUpIcon","ChevronDownIcon","ChevronUpDownIcon"],"sources":["../src/OntologyDevtools.tsx"],"sourcesContent":["import { Dialog } from \"@base-ui/react/dialog\";\nimport { Menu } from \"@base-ui/react/menu\";\nimport { Tabs } from \"@base-ui/react/tabs\";\nimport { Tooltip } from \"@base-ui/react/tooltip\";\nimport NumberFlow from \"@number-flow/react\";\nimport { DbProvider, useLiveInfiniteQuery, useLiveQuery } from \"@tanstack/react-db\";\nimport {\n createColumnHelper,\n flexRender,\n useTable,\n tableFeatures,\n rowSortingFeature,\n columnOrderingFeature,\n columnSizingFeature,\n columnResizingFeature,\n columnVisibilityFeature,\n type ColumnOrderState,\n type ColumnSizingState,\n type SortingState,\n type ColumnVisibilityState,\n} from \"@tanstack/react-table\";\nimport {\n RefreshCw as ArrowPathIcon,\n GripVertical as Bars2Icon,\n CalendarDays as CalendarDaysIcon,\n Boxes as BoxesIcon,\n ChartNoAxesGantt as GanttIcon,\n Check as CheckIcon,\n CircleCheck as CheckCircleIcon,\n ChevronDown as ChevronDownIcon,\n ChevronUp as ChevronUpIcon,\n ChevronsUpDown as ChevronUpDownIcon,\n Clock as ClockIcon,\n SquareCode as CodeBracketSquareIcon,\n Hash as HashtagIcon,\n HardDrive as HardDriveIcon,\n Link as LinkIcon,\n List as ListBulletIcon,\n Map as MapIcon,\n MapPin as MapPinIcon,\n Paperclip as PaperClipIcon,\n Pin as PinIcon,\n CircleQuestionMark as QuestionMarkCircleIcon,\n Search as SearchIcon,\n Send as SendIcon,\n Waypoints as WaypointsIcon,\n Grid2X2 as Squares2X2Icon,\n Trash2 as TrashIcon,\n Columns3 as ViewColumnsIcon,\n} from \"lucide-react\";\nimport {\n memo,\n useDeferredValue,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { DisclosureSummary } from \"./DisclosureSummary.js\";\nimport { ObjectTypeIcon } from \"./OntologyIcons.js\";\nimport { PanelBoundary, usePanelPortal } from \"./PanelBoundary.js\";\nimport { SchemaView } from \"./SchemaView.js\";\nimport { typeDisplayName } from \"./typeDisplayName.js\";\nexport { layoutSchema } from \"./schemaLayout.js\";\nexport { typeDisplayName } from \"./typeDisplayName.js\";\nimport { Pinned } from \"./Pinned.js\";\nimport { Queries } from \"./Queries.js\";\nimport { Storage } from \"./Storage.js\";\nimport { Tracing } from \"./Tracing.js\";\nexport { OntologyIcon } from \"./OntologyIcons.js\";\nimport type { OntologyDevtoolsPanelProps } from \"./types.js\";\nimport type {\n AttachmentMetadata,\n LiveOntology,\n OntologyDefinition,\n OntologyIR,\n OntologyOutbox,\n OntologyOutboxEntry,\n ObjectTypeDef,\n TypeDef,\n} from \"@party-stack/ontology\";\nimport type * as v from \"@party-stack/ontology/values\";\n\nfunction OutboxPanel({ children, theme }: { children: ReactNode; theme: \"light\" | \"dark\" }) {\n return (\n <div className={`ps-outbox-root ps-theme-${theme}`}>\n <div className=\"ps-outbox\">{children}</div>\n </div>\n );\n}\n\nfunction statusClass(entry: OntologyOutboxEntry): string {\n return `ps-outbox-status ps-status-${entry.status}`;\n}\n\nfunction statusLabel(entry: OntologyOutboxEntry): string {\n switch (entry.status) {\n case \"queued\":\n return \"Waiting\";\n case \"sending\":\n return entry.attemptStage === \"forwarding\" ? \"Forwarding\" : \"Sending\";\n case \"acknowledged\":\n return entry.attemptStage === \"forwarding\" ? \"Accepted by parent\" : \"Reconciling\";\n case \"blocked\":\n return entry.lastError?.actionOutcome === \"unknown\" ? \"Outcome unknown\" : \"Blocked\";\n }\n}\n\nconst relativeTime = new Intl.RelativeTimeFormat(undefined, { numeric: \"auto\" });\n\nfunction formatRelativeTime(timestamp: number, now: number): string {\n const elapsedMs = Math.max(0, now - timestamp);\n if (elapsedMs < 60_000) {\n return \"a few seconds ago\";\n }\n const minutes = -Math.round(elapsedMs / 60_000);\n if (Math.abs(minutes) < 60) {\n return relativeTime.format(minutes, \"minute\");\n }\n const hours = Math.round(minutes / 60);\n if (Math.abs(hours) < 24) {\n return relativeTime.format(hours, \"hour\");\n }\n return relativeTime.format(Math.round(hours / 24), \"day\");\n}\n\nfunction useRelativeTimeNow(): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const interval = setInterval(() => {\n setNow(Date.now());\n }, 60_000);\n return () => {\n clearInterval(interval);\n };\n }, []);\n return now;\n}\n\nfunction cardClass(entry: OntologyOutboxEntry): string {\n return `ps-outbox-card ps-card-${entry.status}`;\n}\n\nexport function OutboxEntryCard({\n entry,\n outbox,\n now,\n}: {\n entry: OntologyOutboxEntry;\n outbox: OntologyOutbox;\n now: number;\n}) {\n const [pending, setPending] = useState<\"retry\" | \"remove\" | undefined>();\n const [actionError, setActionError] = useState<string>();\n const [confirmation, setConfirmation] = useState<\"retry\" | \"remove\">();\n const busy = entry.status === \"sending\" || entry.status === \"acknowledged\";\n const choose = (action: \"retry\" | \"remove\") => {\n if (\n action === \"retry\"\n ? entry.retryRequiresAcknowledgement\n : entry.lastError?.actionOutcome === \"unknown\"\n )\n setConfirmation(action);\n else void run(action);\n };\n\n const run = async (action: \"retry\" | \"remove\"): Promise<void> => {\n setPending(action);\n setActionError(undefined);\n try {\n if (action === \"retry\") {\n await outbox.retry(entry.id, { allowUnknownOutcome: confirmation === \"retry\" });\n } else {\n await outbox.remove(entry.id, { allowUnknownOutcome: confirmation === \"remove\" });\n }\n } catch (error) {\n setActionError(error instanceof Error ? error.message : String(error));\n } finally {\n setPending(undefined);\n setConfirmation(undefined);\n }\n };\n\n return (\n <article className={cardClass(entry)}>\n <div className=\"ps-outbox-card-header\">\n <div className=\"ps-outbox-name\">{entry.request.actionTypeName}</div>\n <span className={statusClass(entry)}>\n <span className=\"ps-status-dot\" />\n {statusLabel(entry)}\n </span>\n </div>\n <div className=\"ps-outbox-meta\">\n <span\n className=\"ps-outbox-attempts\"\n title={\n entry.attemptStage === \"forwarding\"\n ? entry.status === \"acknowledged\"\n ? \"Accepted by the parent; waiting for its replicated action state.\"\n : `${entry.attempts} forwarding attempts; upstream execution has not been observed yet.`\n : \"Attempts to execute at this replica's upstream.\"\n }\n >\n {entry.attemptStage === \"forwarding\" ? (\n entry.status === \"acknowledged\" ? (\n \"Parent accepted\"\n ) : (\n \"Forwarding\"\n )\n ) : (\n <>\n Attempts: <strong>{entry.attempts}</strong>\n </>\n )}\n </span>\n <span aria-hidden=\"true\" className=\"ps-outbox-meta-divider\" />\n <span className=\"ps-outbox-time\" title={new Date(entry.createdAt).toLocaleString()}>\n Queued {formatRelativeTime(entry.createdAt, now)}\n </span>\n {!entry.retryable ? <span className=\"ps-outbox-permanent\">Won&apos;t retry</span> : null}\n </div>\n {entry.lastError ? (\n <div className=\"ps-outbox-error\" role=\"alert\">\n <strong>{entry.lastError.kind}</strong>\n <div>{entry.lastError.message}</div>\n {entry.lastError.actionOutcome === \"unknown\" ? (\n <p>\n The previous attempt may have committed. No definitive result has been received.\n </p>\n ) : null}\n {entry.lastError.issues?.length ? (\n <ul>\n {entry.lastError.issues.map((issue, index) => (\n <li key={index}>\n <code>{issue.path?.join(\".\") || \"Submission\"}</code>: {issue.message}{\" \"}\n <code>({issue.code})</code>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n ) : null}\n <details className=\"ps-outbox-details\">\n <DisclosureSummary>Parameters</DisclosureSummary>\n <pre>{JSON.stringify(entry.request.parameters, null, 2)}</pre>\n </details>\n <div className=\"ps-outbox-actions\">\n <button\n className=\"ps-button ps-button-primary\"\n type=\"button\"\n disabled={busy || pending !== undefined}\n onClick={() => {\n choose(\"retry\");\n }}\n >\n <ArrowPathIcon aria-hidden=\"true\" />\n {pending === \"retry\" ? \"Retrying…\" : \"Retry\"}\n </button>\n <button\n className=\"ps-button ps-button-danger\"\n type=\"button\"\n disabled={busy || pending !== undefined}\n onClick={() => {\n choose(\"remove\");\n }}\n >\n <TrashIcon aria-hidden=\"true\" />\n {pending === \"remove\" ? \"Removing…\" : \"Remove\"}\n </button>\n </div>\n {confirmation ? (\n <div className=\"ps-outbox-error\" role=\"alert\">\n <p>\n {confirmation === \"retry\"\n ? \"Retrying may execute the action again.\"\n : \"Discarding removes local intent; it does not cancel a remote execution.\"}\n </p>\n <button\n className=\"ps-button\"\n type=\"button\"\n disabled={pending !== undefined}\n onClick={() => setConfirmation(undefined)}\n >\n Cancel\n </button>\n <button\n className=\"ps-button ps-button-danger\"\n type=\"button\"\n disabled={pending !== undefined}\n onClick={() => {\n void run(confirmation);\n }}\n >\n {confirmation === \"retry\" ? \"Retry anyway\" : \"Discard local action\"}\n </button>\n </div>\n ) : null}\n {actionError ? <div className=\"ps-outbox-action-error\">{actionError}</div> : null}\n </article>\n );\n}\n\nfunction OutboxRows({ outbox, theme }: { outbox: OntologyOutbox; theme: \"light\" | \"dark\" }) {\n const now = useRelativeTimeNow();\n const { data } = useLiveQuery({\n query: (query) =>\n query.from({ entry: outbox.collection }).orderBy(({ entry }) => entry.sequence, \"asc\"),\n });\n\n return (\n <OutboxPanel theme={theme}>\n {data.length === 0 ? (\n <div className=\"ps-outbox-empty\">\n <div>\n <span className=\"ps-outbox-empty-mark\">\n <CheckIcon aria-hidden=\"true\" />\n </span>\n <strong>Queue is clear</strong>\n Actions will appear here while they wait to sync.\n </div>\n </div>\n ) : (\n <div className=\"ps-outbox-track\">\n {data.map((entry, index) => (\n <div className=\"ps-outbox-step\" key={entry.id}>\n {index > 0 ? <span aria-hidden=\"true\" className=\"ps-outbox-connector\" /> : null}\n <div className=\"ps-outbox-node\">\n <OutboxEntryCard entry={entry} now={now} outbox={outbox} />\n </div>\n </div>\n ))}\n </div>\n )}\n </OutboxPanel>\n );\n}\n\ntype OntologyDevtoolsView =\n | \"objects\"\n | \"schema\"\n | \"outbox\"\n | \"meta\"\n | \"tracing\"\n | \"queries\"\n | \"pinned\"\n | \"storage\";\ntype OutboxActivity = \"idle\" | \"draining\" | \"paused\";\n\nexport function getOutboxActivity(entries: OntologyOutboxEntry[]): OutboxActivity {\n if (entries.length === 0) return \"idle\";\n const head = entries.reduce((first, entry) => (entry.sequence < first.sequence ? entry : first));\n if (head.status === \"blocked\") return \"paused\";\n return \"draining\";\n}\n\nfunction outboxActivityLabel(activity: OutboxActivity): string {\n switch (activity) {\n case \"idle\":\n return \"Idle\";\n case \"draining\":\n return \"Draining\";\n case \"paused\":\n return \"Paused by failure\";\n }\n}\n\nfunction outboxBadgeClass(activity: OutboxActivity): string {\n switch (activity) {\n case \"idle\":\n return \"ps:bg-[var(--ps-raised)] ps:text-[var(--ps-muted)]\";\n case \"draining\":\n return \"ps:bg-sky-500/20 ps:text-sky-300\";\n case \"paused\":\n return \"ps:bg-red-500/20 ps:text-red-300\";\n }\n}\n\nconst ontologyViews: Array<{\n id: OntologyDevtoolsView;\n label: string;\n icon: ComponentType<{\n \"aria-hidden\"?: boolean;\n className?: string;\n style?: CSSProperties;\n }>;\n}> = [\n { id: \"objects\", label: \"Objects\", icon: BoxesIcon },\n { id: \"outbox\", label: \"Outbox\", icon: SendIcon },\n { id: \"queries\", label: \"Queries\", icon: SearchIcon },\n { id: \"pinned\", label: \"Pinned\", icon: PinIcon },\n { id: \"tracing\", label: \"Tracing\", icon: GanttIcon },\n { id: \"schema\", label: \"Schema\", icon: WaypointsIcon },\n { id: \"storage\", label: \"Storage\", icon: HardDriveIcon },\n];\n\nfunction formatObjectValue(value: unknown): string {\n if (value === undefined || value === null) return \"—\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return \"[Unserializable value]\";\n }\n}\n\nconst CONTINENTS = [\n \"15,25 45,20 75,22 110,30 120,35 105,52 100,62 85,68 75,72 60,65 50,42 30,35\",\n \"100,82 118,80 138,90 140,100 130,118 118,132 108,138 100,122 95,100\",\n \"175,38 185,30 198,28 208,32 205,42 198,48 188,48 178,44\",\n \"170,58 185,52 205,56 218,68 215,88 208,108 198,125 185,128 172,112 168,88 165,70\",\n \"212,42 228,32 255,22 282,18 310,22 325,30 330,42 318,55 300,58 282,65 265,78 248,72 232,58 218,50\",\n \"292,112 312,108 332,114 330,126 318,134 298,128 292,118\",\n];\n\nfunction resolvedType(ir: OntologyIR, type: TypeDef): TypeDef {\n if (type.kind !== \"ref\") return type;\n const referenced = ir.types.find((candidate) => candidate.name === type.value.name)?.type;\n return referenced ? resolvedType(ir, referenced) : type;\n}\n\nfunction typeIcon(type: TypeDef): ComponentType<{ \"aria-hidden\"?: boolean; className?: string }> {\n switch (type.kind) {\n case \"ref\":\n return LinkIcon;\n case \"optional\":\n return typeIcon(type.value.type);\n case \"list\":\n return ListBulletIcon;\n case \"map\":\n return Squares2X2Icon;\n case \"objectReference\":\n return LinkIcon;\n case \"string\":\n return CodeBracketSquareIcon;\n case \"boolean\":\n return CheckCircleIcon;\n case \"integer\":\n case \"float\":\n case \"double\":\n return HashtagIcon;\n case \"date\":\n return CalendarDaysIcon;\n case \"timestamp\":\n return ClockIcon;\n case \"geopoint\":\n return MapPinIcon;\n case \"attachment\":\n return PaperClipIcon;\n case \"encrypted\":\n return CodeBracketSquareIcon;\n case \"struct\":\n case \"union\":\n case \"result\":\n return MapIcon;\n case \"unknown\":\n return QuestionMarkCircleIcon;\n }\n}\n\nfunction DevtoolsTooltip({ children, label }: { children: ReactNode; label: ReactNode }) {\n const portal = usePanelPortal();\n return (\n <Tooltip.Root>\n <Tooltip.Trigger render={<span className=\"ps:inline-flex ps:items-center\" />}>\n {children}\n </Tooltip.Trigger>\n <Tooltip.Portal container={portal}>\n <Tooltip.Positioner className=\"ps:z-[100001]\" sideOffset={6}>\n <Tooltip.Popup className=\"ps:max-w-64 ps:rounded-md ps:border ps:border-[var(--ps-border)] ps:bg-[var(--ps-raised)] ps:px-2.5 ps:py-1.5 ps:text-[11px] ps:text-[var(--ps-text)] ps:shadow-xl\">\n {label}\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n}\n\nfunction TypeIndicator({ type }: { type: TypeDef }) {\n const Icon = typeIcon(type);\n return (\n <DevtoolsTooltip label={typeDisplayName(type)}>\n {/* oxlint-disable-next-line react/static-components -- typeIcon selects an imported static icon; it does not create a component. */}\n <Icon aria-hidden className=\"ps:size-3.5 ps:text-[var(--ps-muted)]\" />\n </DevtoolsTooltip>\n );\n}\n\nfunction isGeopoint(value: unknown): value is v.geopoint {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"lat\" in value &&\n typeof value.lat === \"number\" &&\n \"lon\" in value &&\n typeof value.lon === \"number\"\n );\n}\n\n/* oxlint-disable jsx-a11y/prefer-tag-over-role -- Inline SVG is an image, not an HTML img. */\nfunction GeopointPreview({ value }: { value: v.geopoint }) {\n const cx = value.lon + 180;\n const cy = 90 - value.lat;\n const label = `${value.lat.toFixed(4)}, ${value.lon.toFixed(4)}`;\n return (\n <DevtoolsTooltip\n label={\n <svg\n aria-label={`Map preview for ${label}`}\n className=\"ps:block ps:rounded ps:border ps:border-[var(--ps-border)]\"\n height=\"72\"\n role=\"img\"\n viewBox=\"0 0 360 180\"\n width=\"144\"\n >\n <rect className=\"ps:fill-sky-950\" height=\"180\" width=\"360\" />\n {CONTINENTS.map((points) => (\n <polygon\n className=\"ps:fill-zinc-700 ps:stroke-zinc-600\"\n key={points}\n points={points}\n strokeWidth=\"0.5\"\n />\n ))}\n <circle className=\"ps:fill-rose-400\" cx={cx} cy={cy} r=\"5\" />\n </svg>\n }\n >\n <a\n className=\"ps:text-sky-400 ps:underline ps:decoration-dotted ps:underline-offset-4\"\n href={`https://www.google.com/maps?q=${value.lat},${value.lon}`}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n {label}\n </a>\n </DevtoolsTooltip>\n );\n}\n\n/* oxlint-enable jsx-a11y/prefer-tag-over-role */\nexport function timestampPreview(value: unknown): { display: string; exact: string } | undefined {\n if (value === undefined || value === null) return undefined;\n const exact = formatObjectValue(value);\n let epochMilliseconds: number | undefined;\n if (value instanceof Date) {\n epochMilliseconds = value.getTime();\n } else if (\n typeof value === \"object\" &&\n \"epochMilliseconds\" in value &&\n (typeof value.epochMilliseconds === \"number\" || typeof value.epochMilliseconds === \"bigint\")\n ) {\n epochMilliseconds = Number(value.epochMilliseconds);\n } else if (typeof value === \"string\") {\n const parsed = Date.parse(value);\n if (!Number.isNaN(parsed)) epochMilliseconds = parsed;\n }\n if (epochMilliseconds === undefined || !Number.isFinite(epochMilliseconds)) {\n return { display: exact, exact };\n }\n return {\n display: new Intl.DateTimeFormat(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"medium\",\n }).format(new Date(epochMilliseconds)),\n exact,\n };\n}\n\nfunction isAttachment(value: unknown): value is v.attachment {\n return typeof value === \"object\" && value !== null && \"id\" in value && typeof value.id === \"string\";\n}\n\nfunction AttachmentPreview({ attachment, ontology }: { attachment: v.attachment; ontology: LiveOntology }) {\n const portal = usePanelPortal();\n const [preview, setPreview] = useState<{\n metadata: AttachmentMetadata;\n src?: string;\n }>();\n useEffect(() => {\n let cancelled = false;\n let objectUrl: string | undefined;\n void ontology.attachments\n .metadata(attachment)\n .then(async (metadata) => {\n if (metadata.type.startsWith(\"image/\")) {\n objectUrl = URL.createObjectURL(await ontology.attachments.blob(attachment));\n }\n if (!cancelled) setPreview({ metadata, src: objectUrl });\n })\n .catch(() => {\n if (!cancelled) setPreview(undefined);\n });\n return () => {\n cancelled = true;\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n };\n }, [attachment, ontology]);\n\n const label = preview?.metadata.name ?? attachment.id;\n if (!preview?.src) {\n return (\n <DevtoolsTooltip label={label}>\n <span className=\"ps:inline-flex ps:max-w-40 ps:items-center ps:gap-1.5 ps:truncate\">\n <PaperClipIcon\n aria-hidden\n className=\"ps:size-3.5 ps:flex-none ps:text-[var(--ps-muted)]\"\n />\n <span className=\"ps:truncate\">{label}</span>\n </span>\n </DevtoolsTooltip>\n );\n }\n\n return (\n <Dialog.Root>\n <Dialog.Trigger\n aria-label={`Open ${label}`}\n className=\"ps:block ps:overflow-hidden ps:rounded-md ps:border ps:border-[var(--ps-border)] ps:bg-transparent ps:p-0 ps:hover:border-[var(--ps-accent)]\"\n >\n <img alt={label} className=\"ps:block ps:size-7 ps:object-cover\" src={preview.src} />\n </Dialog.Trigger>\n <Dialog.Portal container={portal}>\n <Dialog.Backdrop className=\"ps:fixed ps:inset-0 ps:z-[100002] ps:bg-black/75 ps:backdrop-blur-sm\" />\n <Dialog.Viewport className=\"ps:fixed ps:inset-0 ps:z-[100003] ps:grid ps:place-items-center ps:p-8\">\n <Dialog.Popup className=\"ps:relative ps:max-h-full ps:max-w-4xl ps:rounded-xl ps:border ps:border-[var(--ps-border)] ps:bg-[var(--ps-bg)] ps:p-3 ps:shadow-2xl\">\n <Dialog.Title className=\"ps:sr-only\">{label}</Dialog.Title>\n <img\n alt={label}\n className=\"ps:max-h-[80vh] ps:max-w-[80vw] ps:rounded-lg ps:object-contain\"\n src={preview.src}\n />\n <Dialog.Close className=\"ps:absolute ps:top-4 ps:right-4 ps:rounded-md ps:border ps:border-[var(--ps-border-strong)] ps:bg-[var(--ps-surface)] ps:px-2.5 ps:py-1.5 ps:text-xs ps:text-[var(--ps-text)]\">\n Close\n </Dialog.Close>\n </Dialog.Popup>\n </Dialog.Viewport>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n\nconst PropertyValuePreview = memo(function PropertyValuePreview({\n ir,\n ontology,\n type,\n value,\n}: {\n ir: OntologyIR;\n ontology: LiveOntology;\n type: TypeDef;\n value: unknown;\n}) {\n const resolved = resolvedType(ir, type);\n if (resolved.kind === \"optional\") {\n return <PropertyValuePreview ir={ir} ontology={ontology} type={resolved.value.type} value={value} />;\n }\n if (resolved.kind === \"geopoint\" && isGeopoint(value)) {\n return <GeopointPreview value={value} />;\n }\n if (resolved.kind === \"timestamp\") {\n const preview = timestampPreview(value);\n if (preview) {\n return (\n <DevtoolsTooltip label={preview.exact}>\n <span>{preview.display}</span>\n </DevtoolsTooltip>\n );\n }\n }\n if (resolved.kind === \"attachment\" && isAttachment(value)) {\n return <AttachmentPreview attachment={value} ontology={ontology} />;\n }\n if (\n resolved.kind === \"list\" &&\n resolvedType(ir, resolved.value.elementType).kind === \"attachment\" &&\n Array.isArray(value)\n ) {\n const attachments = value.filter(isAttachment);\n if (attachments.length > 0) {\n return (\n <div className=\"ps:flex ps:items-center ps:gap-1.5\">\n {attachments.slice(0, 3).map((attachment) => (\n <AttachmentPreview attachment={attachment} key={attachment.id} ontology={ontology} />\n ))}\n {attachments.length > 3 ? (\n <span className=\"ps:text-[var(--ps-muted)]\">+{attachments.length - 3}</span>\n ) : null}\n </div>\n );\n }\n }\n const formatted = formatObjectValue(value);\n return (\n <span className=\"ps:block ps:max-w-72 ps:truncate\" title={formatted}>\n {formatted}\n </span>\n );\n});\n\nfunction defaultColumnSize(ir: OntologyIR, type: TypeDef): number {\n switch (resolvedType(ir, type).kind) {\n case \"boolean\":\n return 110;\n case \"integer\":\n case \"float\":\n case \"double\":\n return 130;\n case \"date\":\n case \"timestamp\":\n return 190;\n case \"geopoint\":\n return 175;\n case \"attachment\":\n case \"list\":\n return 150;\n case \"objectReference\":\n return 200;\n case \"string\":\n return 220;\n default:\n return 180;\n }\n}\n\nexport function moveColumn(columnOrder: string[], sourceId: string, targetId: string): string[] {\n const sourceIndex = columnOrder.indexOf(sourceId);\n const targetIndex = columnOrder.indexOf(targetId);\n if (sourceIndex === -1 || targetIndex === -1 || sourceIndex === targetIndex) {\n return columnOrder;\n }\n const next = [...columnOrder];\n next.splice(sourceIndex, 1);\n next.splice(targetIndex, 0, sourceId);\n return next;\n}\n\nconst objectTableFeatures = tableFeatures({\n rowSortingFeature,\n columnOrderingFeature,\n columnSizingFeature,\n columnResizingFeature,\n columnVisibilityFeature,\n});\nconst objectColumnHelper = createColumnHelper<typeof objectTableFeatures, Record<string, unknown>>();\n\nfunction ObjectTable({\n collection,\n objectType,\n ontology,\n pageSize,\n}: {\n collection: LiveOntology[\"objects\"][string];\n objectType: ObjectTypeDef;\n ontology: LiveOntology;\n pageSize: number;\n}) {\n const portal = usePanelPortal();\n const [sorting, setSorting] = useState<SortingState>([]);\n const [columnSizing, setColumnSizing] = useState<ColumnSizingState>({});\n const [columnVisibility, setColumnVisibility] = useState<ColumnVisibilityState>({});\n const [columnOrder, setColumnOrder] = useState<ColumnOrderState>(() =>\n objectType.properties.map((property) => property.name)\n );\n const [draggedColumnId, setDraggedColumnId] = useState<string>();\n const [dragOverColumnId, setDragOverColumnId] = useState<string>();\n const selectedSort = sorting[0];\n const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading } = useLiveInfiniteQuery(\n (query) => {\n const from = query.from({ row: collection });\n const primaryKey = objectType.primaryKey;\n if (selectedSort && selectedSort.id !== primaryKey) {\n return from\n .orderBy(\n ({ row }) => (row as Record<string, unknown>)[selectedSort.id] as string | number,\n selectedSort.desc ? \"desc\" : \"asc\"\n )\n .orderBy(\n ({ row }) => (row as Record<string, unknown>)[primaryKey] as string | number,\n \"asc\"\n )\n .select(({ row }) => row as Record<string, unknown>);\n }\n return from\n .orderBy(\n ({ row }) => (row as Record<string, unknown>)[primaryKey] as string | number,\n selectedSort?.desc ? \"desc\" : \"asc\"\n )\n .select(({ row }) => row as Record<string, unknown>);\n },\n { pageSize }\n );\n // Inspection can follow the app's urgent optimistic render. A wide table\n // must not delay a click's visible result while formatting every cell.\n const rows = useDeferredValue(data) as Array<Record<string, unknown>>;\n const columns = useMemo(\n () =>\n objectType.properties.map((property) =>\n objectColumnHelper.accessor((row) => row[property.name], {\n id: property.name,\n maxSize: 520,\n minSize: 90,\n size:\n property.name === objectType.primaryKey\n ? 220\n : defaultColumnSize(ontology.ir, property.type),\n header: () => (\n <span className=\"ps:inline-flex ps:items-center ps:gap-1.5\">\n <TypeIndicator type={property.type} />\n <span>{property.displayName}</span>\n {property.name === objectType.primaryKey ? (\n <span className=\"ps:ml-1.5 ps:text-[9px] ps:font-bold ps:tracking-wide ps:text-[var(--ps-accent)]\">\n PK\n </span>\n ) : null}\n </span>\n ),\n cell: (info) => (\n <PropertyValuePreview\n ir={ontology.ir}\n ontology={ontology}\n type={property.type}\n value={info.getValue()}\n />\n ),\n })\n ),\n [objectType, ontology]\n );\n const table = useTable({\n features: objectTableFeatures,\n columnResizeMode: \"onEnd\",\n columns,\n data: rows,\n enableColumnResizing: true,\n getRowId: (row, index) => `${formatObjectValue(row[objectType.primaryKey])}-${index}`,\n manualSorting: true,\n onColumnOrderChange: setColumnOrder,\n onColumnSizingChange: setColumnSizing,\n onColumnVisibilityChange: setColumnVisibility,\n onSortingChange: setSorting,\n state: { columnOrder, columnSizing, columnVisibility, sorting },\n });\n const resizingColumnId = table.state.columnResizing.isResizingColumn;\n const resizingColumn =\n typeof resizingColumnId === \"string\" ? table.getColumn(resizingColumnId) : undefined;\n const allColumns = table.getAllLeafColumns();\n\n return (\n <div className=\"ps:flex ps:min-h-0 ps:min-w-0 ps:flex-1 ps:flex-col ps:overflow-hidden\">\n <div className=\"ps:bg-[var(--ps-surface)] ps:flex ps:flex-none ps:items-center ps:border-b ps:border-[var(--ps-border)] ps:px-4 ps:py-2\">\n <h2 className=\"ps:m-0 ps:flex ps:items-center ps:gap-2 ps:text-lg ps:font-semibold\">\n <ObjectTypeIcon\n className=\"ps:size-5 ps:flex-none ps:text-[var(--ps-accent)]\"\n objectType={objectType}\n />\n {objectType.pluralDisplayName}\n </h2>\n <div className=\"ps:ml-auto ps:flex ps:items-center ps:gap-1.5\">\n <button\n className=\"ps:inline-flex ps:items-center ps:gap-1.5 ps:rounded-md ps:border-0 ps:bg-transparent ps:px-2 ps:py-1.5 ps:text-xs ps:text-[var(--ps-muted)] ps:hover:bg-[var(--ps-hover)] ps:hover:text-current ps:disabled:opacity-40\"\n disabled={Object.keys(columnSizing).length === 0}\n title=\"Reset column widths\"\n type=\"button\"\n onClick={() => {\n table.resetColumnSizing();\n }}\n >\n <ArrowPathIcon aria-hidden className=\"ps:size-3.5\" />\n Reset widths\n </button>\n <Menu.Root>\n <Menu.Trigger className=\"ps:inline-flex ps:items-center ps:gap-1.5 ps:rounded-md ps:border ps:border-[var(--ps-border)] ps:bg-[var(--ps-hover)] ps:px-2.5 ps:py-1.5 ps:text-xs ps:text-inherit ps:hover:border-[var(--ps-border-strong)]\">\n <ViewColumnsIcon aria-hidden className=\"ps:size-3.5\" />\n Columns\n </Menu.Trigger>\n <Menu.Portal container={portal}>\n <Menu.Positioner align=\"end\" className=\"ps:z-[100001]\" sideOffset={6}>\n <Menu.Popup className=\"ps:min-w-48 ps:rounded-lg ps:border ps:border-[var(--ps-border)] ps:bg-[var(--ps-raised)] ps:p-1.5 ps:text-xs ps:text-[var(--ps-text)] ps:shadow-2xl\">\n <Menu.Group>\n <Menu.GroupLabel className=\"ps:px-2 ps:py-1.5 ps:text-[10px] ps:font-bold ps:tracking-wider ps:text-[var(--ps-muted)] ps:uppercase\">\n Columns\n </Menu.GroupLabel>\n {allColumns.map((column, columnIndex) => (\n <Menu.CheckboxItem\n aria-label={\n objectType.properties.find(\n (property) => property.name === column.id\n )?.displayName ?? column.id\n }\n checked={column.getIsVisible()}\n className={\n dragOverColumnId === column.id &&\n draggedColumnId !== column.id\n ? \"ps:flex ps:cursor-default ps:items-center ps:gap-2 ps:rounded-md ps:bg-[var(--ps-selected)] ps:px-2 ps:py-1.5 ps:outline-none\"\n : \"ps:flex ps:cursor-default ps:items-center ps:gap-2 ps:rounded-md ps:px-2 ps:py-1.5 ps:outline-none ps:data-[highlighted]:bg-[var(--ps-hover)]\"\n }\n draggable\n key={column.id}\n label={\n objectType.properties.find(\n (property) => property.name === column.id\n )?.displayName ?? column.id\n }\n onCheckedChange={(checked) => {\n column.toggleVisibility(checked);\n }}\n onDragEnd={() => {\n setDraggedColumnId(undefined);\n setDragOverColumnId(undefined);\n }}\n onDragOver={(event) => {\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n setDragOverColumnId(column.id);\n }}\n onDragStart={(event) => {\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", column.id);\n setDraggedColumnId(column.id);\n }}\n onDrop={(event) => {\n event.preventDefault();\n if (draggedColumnId && draggedColumnId !== column.id) {\n setColumnOrder((current) =>\n moveColumn(current, draggedColumnId, column.id)\n );\n }\n setDraggedColumnId(undefined);\n setDragOverColumnId(undefined);\n }}\n onKeyDown={(event) => {\n if (\n !event.altKey ||\n (event.key !== \"ArrowUp\" && event.key !== \"ArrowDown\")\n ) {\n return;\n }\n event.preventDefault();\n const targetIndex =\n event.key === \"ArrowUp\"\n ? columnIndex - 1\n : columnIndex + 1;\n const target = allColumns[targetIndex];\n if (target) {\n setColumnOrder((current) =>\n moveColumn(current, column.id, target.id)\n );\n }\n }}\n >\n <span\n aria-hidden=\"true\"\n className=\"ps:cursor-grab ps:text-[var(--ps-muted)] ps:active:cursor-grabbing\"\n title=\"Drag to reorder\"\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <Bars2Icon aria-hidden className=\"ps:size-3.5\" />\n </span>\n <span className=\"ps:grid ps:size-4 ps:place-items-center ps:rounded ps:border ps:border-[var(--ps-border-strong)]\">\n {column.getIsVisible() ? (\n <CheckIcon\n aria-hidden\n className=\"ps:size-3 ps:text-[var(--ps-accent)]\"\n />\n ) : null}\n </span>\n <span className=\"ps:truncate\">\n {objectType.properties.find(\n (property) => property.name === column.id\n )?.displayName ?? column.id}\n </span>\n </Menu.CheckboxItem>\n ))}\n <p className=\"ps:m-0 ps:px-2 ps:pt-2 ps:pb-1 ps:text-[10px] ps:text-[var(--ps-muted)]\">\n Drag to reorder · Alt+↑/↓ with keyboard\n </p>\n </Menu.Group>\n </Menu.Popup>\n </Menu.Positioner>\n </Menu.Portal>\n </Menu.Root>\n </div>\n </div>\n <div className=\"ps-object-table-scroll ps:min-h-0 ps:flex-1 ps:overflow-auto\">\n <div\n className=\"ps:relative ps:min-h-full\"\n style={{ minWidth: \"100%\", width: table.getTotalSize() }}\n >\n <table className=\"ps:w-full ps:table-fixed ps:border-separate ps:border-spacing-0 ps:text-left ps:text-xs\">\n <colgroup>\n {table.getVisibleLeafColumns().map((column) => (\n <col key={column.id} style={{ width: column.getSize() }} />\n ))}\n </colgroup>\n <thead className=\"ps-object-table-header\">\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const direction = header.column.getIsSorted();\n return (\n <th\n className=\"ps:relative ps:border-b ps:border-[var(--ps-border)] ps:bg-[var(--ps-surface)] ps:px-4 ps:py-3 ps:font-semibold ps:whitespace-nowrap ps:backdrop-blur\"\n key={header.id}\n >\n {header.isPlaceholder ? null : (\n <button\n className=\"ps:flex ps:w-full ps:items-center ps:gap-2 ps:border-0 ps:bg-transparent ps:p-0 ps:text-left ps:text-inherit ps:font-inherit ps:hover:text-[var(--ps-accent)]\"\n title={`Sort by ${header.column.id}`}\n type=\"button\"\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n {direction === \"asc\" ? (\n <ChevronUpIcon\n aria-hidden\n className=\"ps:size-3.5 ps:flex-none ps:text-[var(--ps-accent)]\"\n />\n ) : direction === \"desc\" ? (\n <ChevronDownIcon\n aria-hidden\n className=\"ps:size-3.5 ps:flex-none ps:text-[var(--ps-accent)]\"\n />\n ) : (\n <ChevronUpDownIcon\n aria-hidden\n className=\"ps:size-3.5 ps:flex-none ps:text-[var(--ps-muted)]\"\n />\n )}\n <span className=\"ps:sr-only\">\n {direction === \"asc\"\n ? \"Sorted ascending\"\n : direction === \"desc\"\n ? \"Sorted descending\"\n : \"Not sorted\"}\n </span>\n </button>\n )}\n {\n header.column.getCanResize() ? (\n // oxlint-disable jsx-a11y/prefer-tag-over-role -- This focusable separator adjusts column width; an hr cannot replace it.\n <button\n aria-label={`Resize ${header.column.id} column`}\n aria-orientation=\"vertical\"\n aria-valuemax={header.column.columnDef.maxSize}\n aria-valuemin={header.column.columnDef.minSize}\n aria-valuenow={header.column.getSize()}\n className={\n header.column.getIsResizing()\n ? \"ps:absolute ps:top-0 ps:right-0 ps:z-20 ps:h-full ps:w-1 ps:cursor-col-resize ps:touch-none ps:border-0 ps:bg-transparent ps:p-0\"\n : resizingColumn\n ? \"ps:pointer-events-none ps:invisible ps:absolute ps:top-0 ps:right-0 ps:h-full ps:w-1 ps:border-0 ps:bg-transparent ps:p-0\"\n : \"ps:absolute ps:top-0 ps:right-0 ps:h-full ps:w-1 ps:cursor-col-resize ps:touch-none ps:border-0 ps:bg-transparent ps:p-0 ps:hover:bg-rose-400/70 ps:focus-visible:bg-rose-400/70 ps:focus:outline-none\"\n }\n disabled={\n resizingColumn !== undefined &&\n !header.column.getIsResizing()\n }\n role=\"separator\"\n tabIndex={0}\n type=\"button\"\n onDoubleClick={() => {\n header.column.resetSize();\n }}\n onKeyDown={(event) => {\n if (\n event.key !== \"ArrowLeft\" &&\n event.key !== \"ArrowRight\"\n ) {\n return;\n }\n event.preventDefault();\n const delta =\n event.key === \"ArrowRight\" ? 10 : -10;\n const min =\n header.column.columnDef.minSize ?? 20;\n const max =\n header.column.columnDef.maxSize ??\n Number.MAX_SAFE_INTEGER;\n setColumnSizing((current) => ({\n ...current,\n [header.column.id]: Math.min(\n max,\n Math.max(\n min,\n header.column.getSize() + delta\n )\n ),\n }));\n }}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n ) : null /* oxlint-enable jsx-a11y/prefer-tag-over-role */\n }\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n <tbody>\n {rows.length === 0 && (\n <tr>\n <td\n colSpan={table.getVisibleLeafColumns().length}\n className=\"ps:h-40 ps:px-4 ps:pt-6 ps:align-top ps:text-[var(--ps-muted)]\"\n >\n <output>\n {isLoading ? \"Loading objects…\" : \"No objects loaded\"}\n </output>\n </td>\n </tr>\n )}\n {table.getRowModel().rows.map((row) => (\n <tr className=\"ps-object-data-row ps:hover:bg-[var(--ps-hover)]\" key={row.id}>\n {row.getVisibleCells().map((cell) => (\n <td\n className=\"ps-object-data-cell ps:max-w-80 ps:border-b ps:border-[var(--ps-border)] ps:px-4 ps:text-[11px] ps:whitespace-nowrap\"\n key={cell.id}\n >\n <div className=\"ps-object-cell-content\">\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </div>\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {hasNextPage ? (\n <div className=\"ps:sticky ps:left-0 ps:flex ps:w-full ps:justify-center ps:border-t ps:border-[var(--ps-border)] ps:bg-[var(--ps-surface)] ps:p-3\">\n <button\n className=\"ps:rounded-md ps:border ps:border-[var(--ps-border-strong)] ps:bg-[var(--ps-raised)] ps:px-3 ps:py-1.5 ps:text-xs ps:text-[var(--ps-text)] ps:hover:border-[var(--ps-accent)] ps:hover:text-[var(--ps-accent)] ps:disabled:opacity-50\"\n disabled={isFetchingNextPage}\n type=\"button\"\n onClick={() => void fetchNextPage()}\n >\n {isFetchingNextPage ? \"Loading…\" : `Load ${pageSize} more`}\n </button>\n </div>\n ) : null}\n {resizingColumn ? (\n <div\n className=\"ps:pointer-events-none ps:absolute ps:inset-y-0 ps:z-50 ps:w-0.5 ps:bg-rose-400 ps:shadow-[0_0_0_1px_rgba(251,113,133,0.18)] ps:will-change-transform\"\n style={{\n left: resizingColumn.getStart() + resizingColumn.getSize(),\n transform: `translateX(${table.state.columnResizing.deltaOffset ?? 0}px)`,\n }}\n />\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\n// Outbox badge/status updates must not rerender the inspector's table. Its own\n// live query still updates changed rows; unchanged property previews can be reused.\nconst ObjectsView = memo(function ObjectsView({\n ontology,\n pageSize = 50,\n}: {\n ontology: LiveOntology;\n pageSize?: number;\n}) {\n const objectTypes = ontology.ir.objectTypes;\n const [selectedName, setSelectedName] = useState(() => objectTypes[0]?.name);\n const selected = objectTypes.find((objectType) => objectType.name === selectedName) ?? objectTypes[0];\n const collection = selected ? ontology.cachedObjects[selected.name] : undefined;\n\n if (!selected || !collection) {\n return (\n <div className=\"ps:grid ps:h-full ps:place-items-center ps:text-sm ps:text-[var(--ps-muted)]\">\n This ontology has no object types.\n </div>\n );\n }\n\n return (\n <div className=\"ps:flex ps:h-full ps:min-h-0 ps:w-full ps:min-w-0 ps:overflow-hidden\">\n <aside className=\"ps:w-44 ps:flex-none ps:overflow-y-auto ps:border-r ps:border-[var(--ps-border)] ps:p-3\">\n <p className=\"ps:mt-0 ps:mb-2 ps:px-2 ps:text-[10px] ps:font-bold ps:tracking-[0.14em] ps:text-[var(--ps-muted)] ps:uppercase\">\n Object types\n </p>\n <div className=\"ps:flex ps:flex-col ps:gap-1\">\n {objectTypes.map((objectType) => (\n <button\n className={\n objectType.name === selected.name\n ? \"ps:flex ps:items-center ps:gap-2 ps:rounded-lg ps:border-0 ps:bg-[var(--ps-selected)] ps:px-2.5 ps:py-2 ps:text-left ps:text-xs ps:font-semibold ps:text-[var(--ps-accent)]\"\n : \"ps:flex ps:items-center ps:gap-2 ps:rounded-lg ps:border-0 ps:bg-transparent ps:px-2.5 ps:py-2 ps:text-left ps:text-xs ps:text-inherit ps:hover:bg-[var(--ps-hover)]\"\n }\n key={objectType.name}\n type=\"button\"\n onClick={() => {\n setSelectedName(objectType.name);\n }}\n >\n <ObjectTypeIcon className=\"ps:size-4 ps:flex-none\" objectType={objectType} />\n <span className=\"ps:truncate\">{objectType.pluralDisplayName}</span>\n </button>\n ))}\n </div>\n </aside>\n <ObjectTable\n collection={collection}\n key={selected.name}\n objectType={selected}\n ontology={ontology}\n pageSize={pageSize}\n />\n </div>\n );\n});\n\nexport function OntologyDevtoolsPanel<\n Ontology extends OntologyDefinition,\n MetaOntology extends OntologyDefinition = OntologyDefinition,\n>(props: OntologyDevtoolsPanelProps<Ontology, MetaOntology>) {\n return (\n <PanelBoundary theme={props.theme ?? \"dark\"}>\n <DbProvider client={props.ontology.dbClient}>\n <OntologyDevtoolsContent {...props} />\n </DbProvider>\n </PanelBoundary>\n );\n}\n\nfunction OntologyDevtoolsContent<\n Ontology extends OntologyDefinition,\n MetaOntology extends OntologyDefinition = OntologyDefinition,\n>({ metaOntology, ontology, theme = \"dark\" }: OntologyDevtoolsPanelProps<Ontology, MetaOntology>) {\n const { data: outboxEntries } = useLiveQuery({\n query: (query) => query.from({ entry: ontology.outbox.collection }),\n });\n const outboxActivity = getOutboxActivity(outboxEntries);\n\n return (\n <Tooltip.Provider>\n <Tabs.Root\n data-ps-devtools\n className={`ps-devtools ps-theme-${theme} ps:flex ps:h-full ps:min-h-0 ps:w-full ps:min-w-0 ps:flex-col ps:overflow-hidden ps:font-sans ps:text-[13px]`}\n defaultValue=\"objects\"\n style={{ contain: \"inline-size\" }}\n >\n <Tabs.List\n aria-label=\"Ontology devtools views\"\n className=\"ps:bg-[var(--ps-surface)] ps:flex ps:flex-none ps:items-center ps:gap-1 ps:overflow-x-auto ps:border-b ps:border-[var(--ps-border)] ps:px-4\"\n style={{ height: 40 }}\n >\n {[\n ...ontologyViews,\n ...(metaOntology\n ? [\n {\n id: \"meta\" as const,\n label: \"Meta\",\n icon: CodeBracketSquareIcon,\n },\n ]\n : []),\n ].map((view) => {\n const Icon = view.icon;\n return (\n <Tabs.Tab\n className=\"ps:group ps:flex ps:h-full ps:shrink-0 ps:items-center ps:gap-1.5 ps:border-x-0 ps:border-t-0 ps:border-b-2 ps:border-transparent ps:bg-transparent ps:px-3 ps:text-xs ps:font-medium ps:text-[var(--ps-muted)] ps:hover:text-current ps:data-[active]:border-[var(--ps-accent)] ps:data-[active]:font-semibold ps:data-[active]:text-[var(--ps-accent)]\"\n key={view.id}\n value={view.id}\n >\n <Icon\n aria-hidden\n className=\"ps:flex-none\"\n style={{ height: 16, width: 16 }}\n />\n <span>{view.label}</span>\n {view.id === \"outbox\" ? (\n <>\n <span\n className={`ps:inline-flex ps:min-w-5 ps:items-center ps:justify-center ps:rounded-full ps:px-1.5 ps:py-0.5 ps:text-center ps:text-[10px] ps:leading-none ps:transition-colors ${outboxBadgeClass(\n outboxActivity\n )}`}\n title={`${outboxEntries.length} outbox entries · ${outboxActivityLabel(\n outboxActivity\n )}`}\n >\n <NumberFlow\n className=\"ps:tabular-nums\"\n isolate\n value={outboxEntries.length}\n />\n </span>\n </>\n ) : null}\n </Tabs.Tab>\n );\n })}\n </Tabs.List>\n <Tabs.Panel className=\"ps:min-h-0 ps:min-w-0 ps:flex-1 ps:overflow-hidden\" value=\"outbox\">\n <OutboxRows outbox={ontology.outbox} theme={theme} />\n </Tabs.Panel>\n <Tabs.Panel className=\"ps:min-h-0 ps:min-w-0 ps:flex-1 ps:overflow-hidden\" value=\"schema\">\n <SchemaView ir={ontology.ir} theme={theme} />\n </Tabs.Panel>\n <Tabs.Panel className=\"ps:min-h-0 ps:min-w-0 ps:flex-1 ps:overflow-hidden\" value=\"objects\">\n <ObjectsView ontology={ontology} />\n </Tabs.Panel>\n <Tabs.Panel className=\"ps:min-h-0 ps:min-w-0 ps:flex-1 ps:overflow-hidden\" value=\"tracing\">\n <Tracing ontology={ontology} />\n </Tabs.Panel>\n <Tabs.Panel className=\"ps:min-h-0 ps:min-w-0 ps:flex-1 ps:overflow-hidden\" value=\"queries\">\n <Queries ontology={ontology} />\n </Tabs.Panel>\n <Tabs.Panel className=\"ps:min-h-0 ps:min-w-0 ps:flex-1 ps:overflow-hidden\" value=\"pinned\">\n <Pinned ontology={ontology} />\n </Tabs.Panel>\n <Tabs.Panel className=\"ps:min-h-0 ps:min-w-0 ps:flex-1 ps:overflow-hidden\" value=\"storage\">\n <Storage ontology={ontology} />\n </Tabs.Panel>\n {metaOntology ? (\n <Tabs.Panel className=\"ps:min-h-0 ps:min-w-0 ps:flex-1 ps:overflow-hidden\" value=\"meta\">\n <DbProvider client={metaOntology.dbClient}>\n <ObjectsView ontology={metaOntology} pageSize={25} />\n </DbProvider>\n </Tabs.Panel>\n ) : null}\n </Tabs.Root>\n </Tooltip.Provider>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { ObjectTypeDef } from "@party-stack/ontology";
2
+ import { IconName } from "@party-stack/icons";
3
+ //#region src/OntologyIcons.d.ts
4
+ export declare function OntologyIcon({ className, color, name }: {
5
+ className?: string;
6
+ color?: string;
7
+ name: IconName;
8
+ }): import("react").JSX.Element;
9
+ export declare function ObjectTypeIcon({ className, objectType }: {
10
+ className?: string;
11
+ objectType: ObjectTypeDef;
12
+ }): import("react").JSX.Element;
13
+ //#endregion
14
+ //# sourceMappingURL=OntologyIcons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OntologyIcons.d.ts","names":[],"sources":["../src/OntologyIcons.tsx"],"mappings":";;;wBAIgB,eACZ,WACA,OACA;EAEA;EACA;EACA,MAAM;oBACT,IAAA;wBAUe,iBAAiB,WAAW;EAAgB;EAAoB,YAAY;oBAAe,IAAA"}
@@ -0,0 +1,22 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { LucideIcon } from "@party-stack/icons-lucide/react";
3
+ //#region src/OntologyIcons.tsx
4
+ function OntologyIcon({ className, color, name }) {
5
+ return /* @__PURE__ */ jsx(LucideIcon, {
6
+ "aria-hidden": "true",
7
+ className,
8
+ name,
9
+ style: color ? { color } : void 0
10
+ });
11
+ }
12
+ function ObjectTypeIcon({ className, objectType }) {
13
+ return /* @__PURE__ */ jsx(OntologyIcon, {
14
+ className,
15
+ color: objectType.color,
16
+ name: objectType.icon?.name ?? "database"
17
+ });
18
+ }
19
+ //#endregion
20
+ export { ObjectTypeIcon, OntologyIcon };
21
+
22
+ //# sourceMappingURL=OntologyIcons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OntologyIcons.js","names":[],"sources":["../src/OntologyIcons.tsx"],"sourcesContent":["import { LucideIcon } from \"@party-stack/icons-lucide/react\";\nimport type { IconName } from \"@party-stack/icons\";\nimport type { ObjectTypeDef } from \"@party-stack/ontology\";\n\nexport function OntologyIcon({\n className,\n color,\n name,\n}: {\n className?: string;\n color?: string;\n name: IconName;\n}) {\n return (\n <LucideIcon\n aria-hidden=\"true\"\n className={className}\n name={name}\n style={color ? { color } : undefined}\n />\n );\n}\nexport function ObjectTypeIcon({ className, objectType }: { className?: string; objectType: ObjectTypeDef }) {\n return (\n <OntologyIcon\n className={className}\n color={objectType.color}\n name={objectType.icon?.name ?? \"database\"}\n />\n );\n}\n"],"mappings":";;;AAIA,SAAgB,aAAa,EACzB,WACA,OACA,QAKD;CACC,OACI,oBAAC,YAAD;EACI,eAAY;EACD;EACL;EACN,OAAO,QAAQ,EAAE,MAAM,IAAI,KAAA;CAC9B,CAAA;AAET;AACA,SAAgB,eAAe,EAAE,WAAW,cAAiE;CACzG,OACI,oBAAC,cAAD;EACe;EACX,OAAO,WAAW;EAClB,MAAM,WAAW,MAAM,QAAQ;CAClC,CAAA;AAET"}
@@ -0,0 +1,10 @@
1
+ import { ReactNode } from "react";
2
+ //#region src/PanelBoundary.d.ts
3
+ export declare const usePanelPortal: () => HTMLElement | null;
4
+ /** Keep panel and overlay styles private, while overlays can escape the shell's clipping. */
5
+ export declare function PanelBoundary({ children, theme }: {
6
+ children: ReactNode;
7
+ theme: "light" | "dark";
8
+ }): import("react").JSX.Element;
9
+ //#endregion
10
+ //# sourceMappingURL=PanelBoundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelBoundary.d.ts","names":[],"sources":["../src/PanelBoundary.tsx"],"mappings":";;qBAKa,sBAAc;;wBAQX,gBAAgB,UAAU;EAAW,UAAU;EAAW;oBAAyB,IAAA"}