@party-stack/ontology-devtools 0.6.1 → 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 -49
  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 -2
  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 +26 -9
  130. package/lib/styles.css +0 -2
@@ -0,0 +1,75 @@
1
+ import { Graph, layout } from "@dagrejs/dagre";
2
+ //#region src/schemaLayout.ts
3
+ const SCHEMA_CARD_WIDTH = 230;
4
+ const SCHEMA_CARD_HEIGHT = 176;
5
+ function schemaLinkLabel(ir, side, cardinality) {
6
+ const object = ir.objectTypes.find((type) => type.name === side.objectType);
7
+ return `${cardinality} ${cardinality === "many" && object?.displayName === side.displayName ? object.pluralDisplayName : side.displayName}`;
8
+ }
9
+ /** Diagram arrows run from the referenced object to dependents, so many means one-to-many. */
10
+ function schemaRelationship(link) {
11
+ const label = link.cardinality === "many" ? "one-to-many" : "one-to-one";
12
+ return {
13
+ id: link.id,
14
+ source: link.target.objectType,
15
+ target: link.source.objectType,
16
+ cardinality: link.cardinality,
17
+ label,
18
+ width: Math.min(180, Math.max(72, label.length * 6 + 16))
19
+ };
20
+ }
21
+ function layoutSchema(ir) {
22
+ const graph = new Graph({ multigraph: true }).setGraph({
23
+ marginx: 24,
24
+ marginy: 24,
25
+ nodesep: 32,
26
+ rankdir: "LR",
27
+ ranksep: 100
28
+ }).setDefaultEdgeLabel(() => ({ label: "" }));
29
+ for (const objectType of ir.objectTypes) graph.setNode(objectType.name, {
30
+ height: SCHEMA_CARD_HEIGHT,
31
+ width: SCHEMA_CARD_WIDTH
32
+ });
33
+ for (const link of ir.linkTypes) {
34
+ const edgeLabel = schemaRelationship(link);
35
+ graph.setEdge(edgeLabel.source, edgeLabel.target, {
36
+ height: 24,
37
+ label: edgeLabel.label,
38
+ width: edgeLabel.width
39
+ }, link.id);
40
+ }
41
+ layout(graph);
42
+ const objectTypeByName = new Map(ir.objectTypes.map((objectType) => [objectType.name, objectType]));
43
+ const nodes = graph.nodes().map((name) => {
44
+ const objectType = objectTypeByName.get(name);
45
+ const node = graph.node(name);
46
+ if (!objectType || !node) return void 0;
47
+ return {
48
+ objectType,
49
+ x: (node.x ?? 0) - SCHEMA_CARD_WIDTH / 2,
50
+ y: (node.y ?? 0) - SCHEMA_CARD_HEIGHT / 2
51
+ };
52
+ }).filter((node) => node !== void 0);
53
+ const edges = graph.edges().map((edge) => {
54
+ const value = graph.edge(edge);
55
+ return {
56
+ id: edge.name ?? `${edge.v}-${edge.w}`,
57
+ label: value.label ?? "",
58
+ labelWidth: value.width ?? 72,
59
+ labelX: value.x ?? value.points?.[0]?.x ?? 0,
60
+ labelY: value.y ?? value.points?.[0]?.y ?? 0,
61
+ points: value.points ?? []
62
+ };
63
+ });
64
+ const graphSize = graph.graph();
65
+ return {
66
+ nodes,
67
+ edges,
68
+ width: Math.max(310, graphSize.width ?? 0),
69
+ height: Math.max(256, graphSize.height ?? 0)
70
+ };
71
+ }
72
+ //#endregion
73
+ export { layoutSchema, schemaLinkLabel, schemaRelationship };
74
+
75
+ //# sourceMappingURL=schemaLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaLayout.js","names":[],"sources":["../src/schemaLayout.ts"],"sourcesContent":["import {\n Graph,\n layout as layoutGraph,\n type EdgeLabel,\n type GraphLabel,\n type NodeLabel,\n type Point,\n} from \"@dagrejs/dagre\";\nimport type { ObjectTypeDef, OntologyIR } from \"@party-stack/ontology\";\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\nexport function schemaLinkLabel(\n ir: OntologyIR,\n side: OntologyIR[\"linkTypes\"][number][\"source\"],\n cardinality: \"one\" | \"many\"\n): string {\n const object = ir.objectTypes.find((type) => type.name === side.objectType);\n // Preserve relationship-specific labels; use the type's plural only for a default singular label.\n const label =\n cardinality === \"many\" && object?.displayName === side.displayName\n ? object.pluralDisplayName\n : side.displayName;\n return `${cardinality} ${label}`;\n}\n\n/** Diagram arrows run from the referenced object to dependents, so many means one-to-many. */\nexport function schemaRelationship(link: OntologyIR[\"linkTypes\"][number]) {\n const label = link.cardinality === \"many\" ? \"one-to-many\" : \"one-to-one\";\n return {\n id: link.id,\n source: link.target.objectType,\n target: link.source.objectType,\n cardinality: link.cardinality,\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: 24,\n marginy: 24,\n nodesep: 32,\n rankdir: \"LR\",\n ranksep: 100,\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 = schemaRelationship(link);\n graph.setEdge(\n edgeLabel.source,\n edgeLabel.target,\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"],"mappings":";;AA6BA,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB;AAE3B,SAAgB,gBACZ,IACA,MACA,aACM;CACN,MAAM,SAAS,GAAG,YAAY,MAAM,SAAS,KAAK,SAAS,KAAK,UAAU;CAM1E,OAAO,GAAG,YAAY,GAHlB,gBAAgB,UAAU,QAAQ,gBAAgB,KAAK,cACjD,OAAO,oBACP,KAAK;AAEnB;;AAGA,SAAgB,mBAAmB,MAAuC;CACtE,MAAM,QAAQ,KAAK,gBAAgB,SAAS,gBAAgB;CAC5D,OAAO;EACH,IAAI,KAAK;EACT,QAAQ,KAAK,OAAO;EACpB,QAAQ,KAAK,OAAO;EACpB,aAAa,KAAK;EAClB;EACA,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,SAAS,IAAI,EAAE,CAAC;CAC5D;AACJ;AAEA,SAAgB,aAAa,IAK3B;CACE,MAAM,QAAQ,IAAI,MAAmD,EAAE,YAAY,KAAK,CAAC,CAAC,CACrF,SAAS;EACN,SAAS;EACT,SAAS;EACT,SAAS;EACT,SAAS;EACT,SAAS;CACb,CAAC,CAAC,CACD,2BAA2B,EAAE,OAAO,GAAG,EAAE;CAE9C,KAAK,MAAM,cAAc,GAAG,aACxB,MAAM,QAAQ,WAAW,MAAM;EAC3B,QAAQ;EACR,OAAO;CACX,CAAC;CAEL,KAAK,MAAM,QAAQ,GAAG,WAAW;EAC7B,MAAM,YAAY,mBAAmB,IAAI;EACzC,MAAM,QACF,UAAU,QACV,UAAU,QACV;GACI,QAAQ;GACR,OAAO,UAAU;GACjB,OAAO,UAAU;EACrB,GACA,KAAK,EACT;CACJ;CAEA,OAAY,KAAK;CAEjB,MAAM,mBAAmB,IAAI,IAAI,GAAG,YAAY,KAAK,eAAe,CAAC,WAAW,MAAM,UAAU,CAAC,CAAC;CAClG,MAAM,QAAQ,MACT,MAAM,CAAC,CACP,KAAK,SAAS;EACX,MAAM,aAAa,iBAAiB,IAAI,IAAI;EAC5C,MAAM,OAAO,MAAM,KAAK,IAAI;EAC5B,IAAI,CAAC,cAAc,CAAC,MAAM,OAAO,KAAA;EACjC,OAAO;GACH;GACA,IAAI,KAAK,KAAK,KAAK,oBAAoB;GACvC,IAAI,KAAK,KAAK,KAAK,qBAAqB;EAC5C;CACJ,CAAC,CAAC,CACD,QAAQ,SAA6B,SAAS,KAAA,CAAS;CAC5D,MAAM,QAAQ,MAAM,MAAM,CAAC,CAAC,KAAK,SAAS;EACtC,MAAM,QAAQ,MAAM,KAAK,IAAI;EAC7B,OAAO;GACH,IAAI,KAAK,QAAQ,GAAG,KAAK,EAAE,GAAG,KAAK;GACnC,OAAO,MAAM,SAAS;GACtB,YAAY,MAAM,SAAS;GAC3B,QAAQ,MAAM,KAAK,MAAM,SAAS,EAAE,EAAE,KAAK;GAC3C,QAAQ,MAAM,KAAK,MAAM,SAAS,EAAE,EAAE,KAAK;GAC3C,QAAQ,MAAM,UAAU,CAAC;EAC7B;CACJ,CAAC;CACD,MAAM,YAAY,MAAM,MAAM;CAE9B,OAAO;EACH;EACA;EACA,OAAO,KAAK,IAAI,KAAK,UAAU,SAAS,CAAC;EACzC,QAAQ,KAAK,IAAI,KAAK,UAAU,UAAU,CAAC;CAC/C;AACJ"}
package/lib/styles.js ADDED
@@ -0,0 +1,6 @@
1
+ //#region src/styles.css?inline
2
+ var styles_default = "/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--ps-font-sans:ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";--ps-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;--ps-color-red-300:oklch(80.8% .114 19.571);--ps-color-red-500:oklch(63.7% .237 25.331);--ps-color-sky-300:oklch(82.8% .111 230.318);--ps-color-sky-400:oklch(74.6% .16 232.661);--ps-color-sky-500:oklch(68.5% .169 237.323);--ps-color-sky-950:oklch(29.3% .066 243.157);--ps-color-rose-400:oklch(71.2% .194 13.428);--ps-color-zinc-600:oklch(44.2% .017 285.786);--ps-color-zinc-700:oklch(37% .013 285.805);--ps-color-black:#000;--ps-spacing:.25rem;--ps-container-4xl:56rem;--ps-text-xs:.75rem;--ps-text-xs--line-height:calc(1/.75);--ps-text-sm:.875rem;--ps-text-sm--line-height:calc(1.25/.875);--ps-text-lg:1.125rem;--ps-text-lg--line-height:calc(1.75/1.125);--ps-font-weight-medium:500;--ps-font-weight-semibold:600;--ps-font-weight-bold:700;--ps-tracking-wide:.025em;--ps-tracking-wider:.05em;--ps-radius-md:.375rem;--ps-radius-lg:.5rem;--ps-radius-xl:.75rem;--ps-blur-sm:8px;--ps-default-transition-duration:.15s;--ps-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--ps-default-font-family:var(--ps-font-sans);--ps-default-mono-font-family:var(--ps-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--ps-default-font-family,ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\");font-feature-settings:var(--ps-default-font-feature-settings,normal);font-variation-settings:var(--ps-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--ps-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace);font-feature-settings:var(--ps-default-mono-font-feature-settings,normal);font-variation-settings:var(--ps-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}@layer components{.react-flow{--xy-edge-stroke-default:#b1b1b7;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#555;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#ffffff80;--xy-minimap-background-color-default:#fff;--xy-minimap-mask-background-color-default:#f0f0f099;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#e2e2e2;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:transparent;--xy-background-pattern-dots-color-default:#91919a;--xy-background-pattern-lines-color-default:#eee;--xy-background-pattern-cross-color-default:#e2e2e2;background-color:var(--xy-background-color,var(--xy-background-color-default));--xy-node-color-default:inherit;--xy-node-border-default:1px solid #1a192b;--xy-node-background-color-default:#fff;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #00000014;--xy-node-boxshadow-selected-default:0 0 0 .5px #1a192b;--xy-node-border-radius-default:3px;--xy-handle-background-color-default:#1a192b;--xy-handle-border-color-default:#fff;--xy-selection-background-color-default:#0059dc14;--xy-selection-border-default:1px dotted #0059dccc;--xy-controls-button-background-color-default:#fefefe;--xy-controls-button-background-color-hover-default:#f4f4f4;--xy-controls-button-color-default:inherit;--xy-controls-button-color-hover-default:inherit;--xy-controls-button-border-color-default:#eee;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#fff;--xy-edge-label-color-default:inherit;--xy-resize-background-color-default:#3367d9;direction:ltr}.react-flow.dark{--xy-edge-stroke-default:#3e3e3e;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#727272;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#96969640;--xy-minimap-background-color-default:#141414;--xy-minimap-mask-background-color-default:#3c3c3c99;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#2b2b2b;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:#141414;--xy-background-pattern-dots-color-default:#555;--xy-background-pattern-lines-color-default:#333;--xy-background-pattern-cross-color-default:#333;--xy-node-color-default:#f8f8f8;--xy-node-border-default:1px solid #3c3c3c;--xy-node-background-color-default:#1e1e1e;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #ffffff14;--xy-node-boxshadow-selected-default:0 0 0 .5px #999;--xy-handle-background-color-default:#bebebe;--xy-handle-border-color-default:#1e1e1e;--xy-selection-background-color-default:#c8c8dc14;--xy-selection-border-default:1px dotted #c8c8dccc;--xy-controls-button-background-color-default:#2b2b2b;--xy-controls-button-background-color-hover-default:#3e3e3e;--xy-controls-button-color-default:#f8f8f8;--xy-controls-button-color-hover-default:#fff;--xy-controls-button-border-color-default:#5b5b5b;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#141414;--xy-edge-label-color-default:#f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props,var(--xy-background-color,var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width,var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke,var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width,var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{pointer-events:none;position:absolute;overflow:visible}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:.5s linear infinite dashdraw}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected,var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:.5s linear infinite dashdraw}svg.react-flow__connectionline{z-index:1001;position:absolute;overflow:visible}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{-webkit-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default;position:absolute}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:0 0;pointer-events:none}.react-flow__nodesselection-rect{pointer-events:all;cursor:grab;position:absolute}.react-flow__handle{pointer-events:none;background-color:var(--xy-handle-background-color,var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color,var(--xy-handle-border-color-default));border-radius:100%;width:6px;min-width:5px;height:6px;min-height:5px;position:absolute}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;bottom:0;left:50%;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{z-index:5;margin:15px;position:absolute}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px)translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px)translateY(-50%)}.react-flow__attribution{background:var(--xy-attribution-background-color,var(--xy-attribution-background-color-default));margin:0;padding:2px 3px;font-size:10px}.react-flow__attribution a{color:#999;text-decoration:none}@keyframes dashdraw{0%{stroke-dashoffset:10px}}.react-flow__edgelabel-renderer{pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__viewport-portal{-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__minimap{background:var(--xy-minimap-background-color-props,var(--xy-minimap-background-color,var(--xy-minimap-background-color-default)))}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var(--xy-minimap-mask-background-color-props,var(--xy-minimap-mask-background-color,var(--xy-minimap-mask-background-color-default)));stroke:var(--xy-minimap-mask-stroke-color-props,var(--xy-minimap-mask-stroke-color,var(--xy-minimap-mask-stroke-color-default)));stroke-width:var(--xy-minimap-mask-stroke-width-props,var(--xy-minimap-mask-stroke-width,var(--xy-minimap-mask-stroke-width-default)))}.react-flow__minimap-node{fill:var(--xy-minimap-node-background-color-props,var(--xy-minimap-node-background-color,var(--xy-minimap-node-background-color-default)));stroke:var(--xy-minimap-node-stroke-color-props,var(--xy-minimap-node-stroke-color,var(--xy-minimap-node-stroke-color-default)));stroke-width:var(--xy-minimap-node-stroke-width-props,var(--xy-minimap-node-stroke-width,var(--xy-minimap-node-stroke-width-default)))}.react-flow__background-pattern.dots{fill:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-dots-color-default)))}.react-flow__background-pattern.lines{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-lines-color-default)))}.react-flow__background-pattern.cross{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-cross-color-default)))}.react-flow__controls{box-shadow:var(--xy-controls-box-shadow,var(--xy-controls-box-shadow-default));flex-direction:column;display:flex}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{background:var(--xy-controls-button-background-color,var(--xy-controls-button-background-color-default));border:none;border-bottom:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)));width:26px;height:26px;color:var(--xy-controls-button-color-props,var(--xy-controls-button-color,var(--xy-controls-button-color-default)));cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;padding:4px;display:flex}.react-flow__controls-button svg{fill:currentColor;width:100%;max-width:12px;max-height:12px}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{border-radius:var(--xy-node-border-radius,var(--xy-node-border-radius-default));width:150px;color:var(--xy-node-color,var(--xy-node-color-default));text-align:center;border:var(--xy-node-border,var(--xy-node-border-default));background-color:var(--xy-node-background-color,var(--xy-node-background-color-default));padding:10px;font-size:12px}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover,var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected,var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color,var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color,var(--xy-selection-background-color-default));border:var(--xy-selection-border,var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var(--xy-controls-button-background-color-hover-props,var(--xy-controls-button-background-color-hover,var(--xy-controls-button-background-color-hover-default)));color:var(--xy-controls-button-color-hover-props,var(--xy-controls-button-color-hover,var(--xy-controls-button-color-hover-default)))}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)))}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{background-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border:1px solid #fff;border-radius:1px;width:5px;height:5px;translate:-50% -50%}.react-flow__resize-control.handle.left{top:50%;left:0}.react-flow__resize-control.handle.right{top:50%;left:100%}.react-flow__resize-control.handle.top{top:0;left:50%}.react-flow__resize-control.handle.bottom{top:100%;left:50%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border-style:solid;border-width:0}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;height:100%;top:0;transform:translate(-50%)}.react-flow__resize-control.line.left{border-left-width:1px;left:0}.react-flow__resize-control.line.right{border-right-width:1px;left:100%}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{width:100%;height:1px;left:0;transform:translateY(-50%)}.react-flow__resize-control.line.top{border-top-width:1px;top:0}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color,var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color,var(--xy-edge-label-color-default))}.ps-devtools,.ps-outbox-root{--ps-bg:var(--party-dark-bg);--ps-surface:var(--party-dark-surface);--ps-raised:var(--party-dark-raised);--ps-inset:var(--party-dark-inset);--ps-border:var(--party-dark-border);--ps-border-strong:var(--party-dark-border-strong);--ps-text:var(--party-dark-text);--ps-muted:var(--party-dark-muted);--ps-hover:var(--party-dark-hover);--ps-selected:var(--party-dark-selected);--ps-accent:var(--party-dark-accent);--ps-shadow:var(--party-dark-shadow);--ps-inspector-bg:var(--ps-bg);--ps-inspector-border:var(--ps-border);--ps-inspector-muted:var(--ps-muted);--ps-inspector-text:var(--ps-text);color:var(--ps-text);background:var(--ps-bg);color-scheme:dark}.ps-devtools.ps-theme-light,.ps-outbox-root.ps-theme-light{--ps-bg:var(--party-light-bg);--ps-surface:var(--party-light-surface);--ps-raised:var(--party-light-raised);--ps-inset:var(--party-light-inset);--ps-border:var(--party-light-border);--ps-border-strong:var(--party-light-border-strong);--ps-text:var(--party-light-text);--ps-muted:var(--party-light-muted);--ps-hover:var(--party-light-hover);--ps-selected:var(--party-light-selected);--ps-accent:var(--party-light-accent);--ps-shadow:var(--party-light-shadow);color-scheme:light}.ps-devtools :where(button:not(:disabled),select:not(:disabled),a[href]){cursor:pointer}.ps-devtools,.ps-devtools *,.ps-devtools :before,.ps-devtools :after{box-sizing:border-box}.ps-object-table-scroll{scrollbar-gutter:stable;overscroll-behavior:none;scrollbar-color:var(--ps-muted)var(--ps-surface);scrollbar-width:thin}.ps-object-data-row{height:40px}.ps-object-data-cell{padding-top:0;padding-bottom:0}.ps-object-cell-content{align-items:center;min-width:0;height:39px;line-height:16px;display:flex;overflow:hidden}.ps-object-cell-content>*{min-width:0;max-width:100%;max-height:100%}.ps-object-table-header{z-index:30;backface-visibility:hidden;position:sticky;top:0;transform:translateZ(0)}.ps-object-table-scroll::-webkit-scrollbar{width:10px;height:10px}.ps-object-table-scroll::-webkit-scrollbar-track{background:var(--ps-surface)}.ps-object-table-scroll::-webkit-scrollbar-thumb{background:var(--ps-muted);border:2px solid var(--ps-surface);border-radius:999px}.ps-object-table-scroll::-webkit-scrollbar-thumb:hover{background:#a1a1aa}.ps-theme-light .ps-object-table-scroll{scrollbar-color:var(--ps-muted)var(--ps-surface)}.ps-theme-light .ps-object-table-scroll::-webkit-scrollbar-track{background:var(--ps-surface)}.ps-theme-light .ps-object-table-scroll::-webkit-scrollbar-thumb{background:var(--ps-muted);border-color:var(--ps-surface)}.ps-theme-light .ps-object-table-scroll::-webkit-scrollbar-thumb:hover{background:#78716c}.ps-outbox-root{width:100%;min-width:0;height:100%;min-height:0}.ps-outbox{box-sizing:border-box;overscroll-behavior:contain;width:100%;min-width:0;height:100%;min-height:0;color:var(--ps-text);background:var(--ps-bg);padding:20px 22px;font:13px/1.45 Inter,ui-sans-serif,system-ui,sans-serif;overflow:hidden auto}.ps-outbox *{box-sizing:border-box}.ps-outbox-header{align-items:center;gap:16px;margin-bottom:20px;display:flex}.ps-outbox-heading{align-items:center;gap:11px;display:flex}.ps-outbox-mark{border:1px solid var(--ps-border);background:var(--ps-surface);width:30px;height:30px;box-shadow:var(--ps-shadow);color:#fb7185;border-radius:10px;padding:5px}.ps-outbox-mark svg{width:100%;height:100%;display:block}.ps-outbox-title-row{align-items:center;gap:8px;display:flex}.ps-outbox-title{color:var(--ps-text);letter-spacing:-.015em;margin:0;font-size:17px;font-weight:700}.ps-outbox-subtitle{color:var(--ps-muted);margin:2px 0 0;font-size:12px}.ps-outbox-count{border:1px solid var(--ps-border);min-width:25px;color:var(--ps-muted);background:var(--ps-surface);text-align:center;font-variant-numeric:tabular-nums;border-radius:999px;justify-content:center;align-items:center;padding:2px 7px;font-size:11px;display:inline-flex}.ps-outbox-track{overscroll-behavior-x:contain;scrollbar-width:thin;scrollbar-color:#52525b transparent;scroll-snap-type:x proximity;align-items:flex-start;width:100%;padding:4px 2px 16px;display:flex;overflow-x:auto}.ps-outbox-step{flex:none;align-items:flex-start;display:flex}.ps-outbox-node{scroll-snap-align:start;flex:0 0 clamp(250px,31vw,330px);min-width:0}.ps-outbox-connector{background:linear-gradient(90deg,#3f3f46,#52525b);border-radius:999px;flex:0 0 52px;align-self:flex-start;height:2px;margin:30px 8px 0;position:relative}.ps-outbox-connector:before{z-index:1;content:\"\";border-top:2px solid #71717a;border-right:2px solid #71717a;width:7px;height:7px;position:absolute;top:-3px;right:0;transform:rotate(45deg)}.ps-outbox-card{border:1px solid var(--ps-border);background:var(--ps-surface);min-height:190px;box-shadow:var(--ps-shadow);border-radius:14px;padding:15px;position:relative;overflow:hidden}.ps-outbox-card:before{content:\"\";background:#38bdf8;width:3px;position:absolute;inset:0 auto 0 0}.ps-card-sending:before,.ps-card-acknowledged:before{background:#f59e0b}.ps-card-blocked:before{background:#ef4444}.ps-outbox-card-header{justify-content:space-between;align-items:center;gap:12px;display:flex}.ps-outbox-name{min-width:0;color:var(--ps-text);text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:680;overflow:hidden}.ps-outbox-status{letter-spacing:.03em;border:1px solid;border-radius:999px;flex:none;align-items:center;gap:5px;padding:3px 8px;font-size:10px;font-weight:700;display:inline-flex}.ps-status-dot{background:currentColor;border-radius:999px;width:5px;height:5px}.ps-status-queued{color:#7dd3fc;background:#0c4a6e73}.ps-status-sending,.ps-status-acknowledged{color:#fcd34d;background:#78350f6b}.ps-status-blocked{color:#fca5a5;background:#7f1d1d6b}.ps-outbox-meta{color:var(--ps-muted);flex-wrap:wrap;gap:6px 13px;margin-top:10px;font-size:11px;display:flex}.ps-outbox-attempts{font-variant-numeric:tabular-nums;min-width:88px}.ps-outbox-meta strong{color:var(--ps-muted);font-weight:600}.ps-outbox-meta-divider{opacity:.65;background:currentColor;border-radius:999px;align-self:center;width:3px;height:3px}.ps-outbox-permanent{color:#fca5a5}.ps-outbox-time{cursor:help;font-variant-numeric:tabular-nums}.ps-outbox-error strong{margin-bottom:4px;display:block}.ps-outbox-error ul{gap:4px;margin:8px 0 0;padding:0;list-style:none;display:grid}.ps-outbox-error code{color:var(--ps-text);font-size:11px}.ps-outbox-error{color:#fecaca;white-space:pre-wrap;background:#450a0a8c;border:1px solid #ef444459;border-radius:8px;margin-top:11px;padding:8px 10px;font-size:11px}.ps-outbox-details{color:var(--ps-muted);margin-top:11px;font-size:11px}.ps-outbox-details summary{cursor:pointer;-webkit-user-select:none;user-select:none;transition:color .12s}.ps-outbox-details summary:hover{color:var(--ps-text)}.ps-outbox-details pre{border:1px solid var(--ps-border);max-height:150px;color:var(--ps-text);background:var(--ps-inset);border-radius:8px;margin:8px 0 0;padding:10px;font:11px/1.5 ui-monospace,SFMono-Regular,monospace;overflow:auto}.ps-outbox-actions{gap:7px;margin-top:13px;display:flex}.ps-button{appearance:none;font:inherit;cursor:pointer;border:1px solid #0000;border-radius:7px;align-items:center;gap:5px;padding:5px 10px;font-weight:600;transition:background .12s,border-color .12s,opacity .12s;display:inline-flex}.ps-button svg{width:13px;height:13px}.ps-button:disabled{cursor:not-allowed;opacity:.4}.ps-button-primary{color:#e0f2fe;background:#075985b3;border-color:#075985}.ps-button-primary:not(:disabled):hover{background:#0369a1}.ps-button-danger{color:#fca5a5;background:#450a0a29;border-color:#7f1d1d}.ps-button-danger:not(:disabled):hover{background:#7f1d1db3}.ps-outbox-action-error{color:#fca5a5;margin-top:8px;font-size:12px}.ps-outbox-empty{border:1px dashed var(--ps-border);min-height:150px;color:var(--ps-muted);background:var(--ps-surface);text-align:center;border-radius:14px;place-items:center;padding:28px 16px;display:grid}.ps-outbox-empty-mark{border:1px solid var(--ps-border);color:#86efac;background:#1c2920;border-radius:999px;place-items:center;width:34px;height:34px;margin:0 auto 9px;display:grid}.ps-outbox-empty-mark svg{width:17px;height:17px}.ps-outbox-empty strong{color:var(--ps-text);margin-bottom:2px;display:block}.ps-theme-light .ps-outbox{color:var(--ps-text);background:var(--ps-bg)}.ps-theme-light .ps-outbox-mark{color:#dc2626;border-color:var(--ps-border);background:var(--ps-surface);box-shadow:var(--ps-shadow)}.ps-theme-light .ps-outbox-title,.ps-theme-light .ps-outbox-name,.ps-theme-light .ps-outbox-empty strong{color:var(--ps-text)}.ps-theme-light .ps-outbox-subtitle,.ps-theme-light .ps-outbox-meta,.ps-theme-light .ps-outbox-details{color:var(--ps-muted)}.ps-theme-light .ps-outbox-meta strong{color:var(--ps-text)}.ps-theme-light .ps-outbox-count{color:var(--ps-muted);border-color:var(--ps-border);background:var(--ps-surface)}.ps-theme-light .ps-outbox-card{border-color:var(--ps-border);background:var(--ps-surface);box-shadow:var(--ps-shadow)}.ps-theme-light .ps-outbox-connector{background:#d6d3d1}.ps-theme-light .ps-outbox-details summary:hover{color:var(--ps-text)}.ps-theme-light .ps-outbox-details pre{color:var(--ps-text);border-color:var(--ps-border);background:var(--ps-surface)}.ps-theme-light .ps-outbox-empty{color:var(--ps-muted);border-color:var(--ps-border);background:var(--ps-surface)}.ps-theme-light .ps-outbox-empty-mark{color:#15803d;background:#f0fdf4;border-color:#bbf7d0}.ps-theme-light .ps-button-primary{color:#075985;background:#e0f2fe;border-color:#7dd3fc}.ps-theme-light .ps-button-primary:not(:disabled):hover{background:#bae6fd}.ps-theme-light .ps-button-danger{color:#b91c1c;background:#fff7f7;border-color:#fecaca}.ps-theme-light .ps-button-danger:not(:disabled):hover{background:#fee2e2}.ps-diagnostics-screen{width:100%;min-width:0;height:100%;min-height:0;color:var(--ps-inspector-text);background:var(--ps-inspector-bg);flex-direction:column;font:12px/1.5 Inter,ui-sans-serif,system-ui,sans-serif;display:flex;overflow:hidden}.ps-diagnostics-screen button,.ps-diagnostics-screen select,.ps-diagnostics-screen input{font:inherit}.ps-diagnostics-context{border-bottom:1px solid var(--ps-inspector-border);flex:0 0 32px;align-items:center;gap:10px;padding:0 12px;font-size:11px;display:flex}.ps-diagnostics-context>span{color:var(--ps-inspector-muted)}.ps-diagnostics-context select{color:inherit;outline-offset:2px;cursor:pointer;background:#818cf80d;border:0;border-radius:4px;padding:3px 6px}.ps-diagnostics-context option{color:var(--ps-text);background:#181a20}.ps-diagnostics-toolbar{background:var(--ps-surface);border-bottom:1px solid var(--ps-inspector-border);white-space:nowrap;flex:0 0 36px;align-items:center;gap:14px;padding:0 12px;display:flex;overflow:hidden}.ps-diagnostics-toolbar>span,.ps-diagnostics-toolbar>small{color:var(--ps-inspector-muted);text-overflow:ellipsis;font-size:11px;overflow:hidden}.ps-diagnostics-toolbar>button{border:1px solid var(--ps-inspector-border);color:inherit;cursor:pointer;background:0 0;border-radius:4px;margin-left:auto;padding:2px 9px;font-size:11px}.ps-diagnostics-toolbar>input{border:1px solid var(--ps-inspector-border);width:200px;height:27px;color:inherit;outline-offset:2px;background:0 0;border-radius:5px;margin-left:auto;padding:3px 9px}.ps-timeline-scroll{scrollbar-gutter:stable;flex:1;min-height:0;overflow:auto}.ps-timeline{table-layout:fixed;border-collapse:collapse;width:100%;min-width:650px;font-size:11px}.ps-timeline th{z-index:2;border-bottom:1px solid var(--ps-inspector-border);background:var(--ps-surface);height:29px;color:var(--ps-inspector-muted);text-align:left;padding:0 10px;font-size:10px;font-weight:500;position:sticky;top:0}.ps-timeline td{border-bottom:1px solid var(--ps-inspector-border);height:27px;padding:0}.ps-timeline tbody tr[data-selected=true]{background:var(--ps-selected)}.ps-timeline tbody tr:hover{background:var(--ps-hover)}.ps-timeline-ruler{height:29px;position:relative}.ps-timeline-ruler>span{white-space:nowrap;font-variant-numeric:tabular-nums;position:absolute;top:7px}.ps-timeline-name{text-overflow:ellipsis;white-space:nowrap;width:100%;height:26px;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;padding:0 10px;display:block;overflow:hidden;font:10px/26px ui-monospace,monospace!important}.ps-timeline-name small,.ps-timeline-branch{color:var(--ps-inspector-muted)}.ps-timeline-hit{cursor:pointer;background:repeating-linear-gradient(90deg,#818cf810 0 1px,#0000 1px 33.3333%);border:0;width:100%;height:26px;padding:0;display:block;position:relative;overflow:hidden}.ps-timeline-bar{color:#c7d2fe;text-overflow:clip;white-space:nowrap;text-align:left;background:#818cf83b;border:1px solid #818cf88a;border-radius:3px;min-width:2px;height:18px;font-size:10px;line-height:16px;position:absolute;top:4px;overflow:hidden}.ps-timeline-bar[data-outcome=failure]{color:#fca5a5;background:#f871713b;border-color:#f8717190}.ps-timeline-bar[data-outcome=running]{background:#38bdf825;border-style:dashed;border-color:#38bdf890}.ps-timeline-bar[data-outcome=interrupted]{border-color:var(--ps-border);background:#71717a30}.ps-timeline-bar[data-clipped-start=true]{border-left-style:dashed;border-top-left-radius:0;border-bottom-left-radius:0}.ps-timeline-duration{text-align:right;font-variant-numeric:tabular-nums;color:var(--ps-inspector-muted);white-space:nowrap;padding:0 10px!important}.ps-timeline-details{border-top:1px solid var(--ps-inspector-border);flex:0 0 68px;min-height:0;padding:8px 12px;overflow:auto}.ps-timeline-details>p{color:var(--ps-inspector-muted);margin:4px 0;font-size:11px}.ps-timeline-details-heading{align-items:center;gap:12px;min-width:0;margin-bottom:5px;font-size:11px;display:flex}.ps-timeline-details-heading strong{text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,monospace;font-weight:500;overflow:hidden}.ps-timeline-details-heading>span{color:var(--ps-inspector-muted);font-variant-numeric:tabular-nums;white-space:nowrap}.ps-timeline-details-heading button{color:var(--ps-inspector-muted);cursor:pointer;background:0 0;border:0;margin-left:0;padding:0 4px;font-size:16px}.ps-timeline-attributes{color:var(--ps-inspector-muted);flex-wrap:wrap;gap:6px 16px;font-size:11px;display:flex}.ps-query-list{flex-direction:column;flex:1;gap:12px;min-height:0;padding:14px;display:flex;overflow:auto}.ps-query-card{background:var(--ps-surface);border:1px solid var(--ps-inspector-border);border-radius:6px;flex:none;padding:14px 16px}.ps-query-card[data-attributed]:hover,.ps-query-card[data-attributed]:focus-within{outline-offset:1px;border-color:#60a5fa;outline:1px solid #60a5fa}.ps-query-card>header{min-height:20px;padding-right:90px;position:relative}.ps-query-refreshing{color:var(--ps-muted);background:var(--ps-raised);border:1px solid var(--ps-border);visibility:hidden;border-radius:4px;padding:1px 6px;font-size:10px;position:absolute;top:0;right:0}.ps-query-refreshing[data-refreshing=true]{visibility:visible}.ps-query-component-target{cursor:pointer;color:inherit;font:inherit;text-align:left;background:0 0;border:0;outline:none;width:100%;padding:0}.ps-query-pushdown{border-top:1px solid var(--ps-inspector-border);margin-top:10px;padding-top:6px}.ps-disclosure-summary{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;min-height:28px;line-height:18px;list-style:none;display:flex}.ps-disclosure-summary::-webkit-details-marker{display:none}.ps-disclosure-label{min-width:0;display:block}.ps-query-pushdown>summary{color:var(--ps-inspector-muted);font-size:11px}.ps-query-pushdown>summary:hover{color:var(--ps-inspector-text)}.ps-disclosure-chevron{flex:none;width:12px;height:12px;transition:transform .12s;display:block}details[open]>.ps-disclosure-summary>.ps-disclosure-chevron{transform:rotate(90deg)}.ps-query-execution{color:var(--ps-inspector-muted);gap:18px;padding-top:10px;font-size:11px;display:grid}.ps-query-step{min-width:0;padding-left:28px}.ps-query-step h4{color:var(--ps-inspector-text);flex-wrap:wrap;align-items:center;gap:7px;margin:0 0 8px -28px;font-size:11px;font-weight:600;display:flex}.ps-query-step h4>span:first-child{border:1px solid var(--ps-inspector-border);font-variant-numeric:tabular-nums;border-radius:50%;place-items:center;width:19px;height:19px;margin-right:2px;display:inline-grid}.ps-query-source-status{color:var(--ps-inspector-muted);border:1px solid var(--ps-inspector-border);border-radius:4px;padding:2px 6px;font-weight:400}.ps-query-step[data-source-state=cached] h4{color:var(--ps-inspector-muted)}.ps-query-step-note,.ps-query-step>.ps-query-residual{margin:6px 0 8px;line-height:1.65}.ps-query-data-details{border-left:1px solid var(--ps-inspector-border);margin:0 0 10px 10px;padding-left:12px}.ps-query-data-section+.ps-query-data-section{margin-top:14px}.ps-query-data-section h5{color:var(--ps-inspector-text);margin:0 0 6px;font-size:11px;font-weight:600}.ps-query-comparison[data-execution]{border-left:2px solid;border-radius:3px;padding:4px 8px}.ps-query-comparison[data-execution=source]{background:#34d39908;border-color:#34d39980}.ps-query-comparison[data-execution=candidate]{background:#fbbf2408;border-color:#fbbf2480}.ps-query-comparison[data-execution=adapter],.ps-query-comparison[data-execution=engine]{background:#94a3b808;border-color:#94a3b880}.ps-query-execution-label{margin-left:auto;padding-left:12px;font-size:10px}[data-execution=source]>.ps-query-execution-label{color:#34d399}[data-execution=candidate]>.ps-query-execution-label{color:#fbbf24}.ps-query-native{margin:8px 0}.ps-query-native summary{cursor:pointer;font-size:10px}.ps-native-code{border:1px solid var(--ps-inspector-border);background:var(--ps-inset);max-height:280px;color:var(--ps-text);font:11px/1.65 var(--ps-font-mono);text-align:left;white-space:pre;tab-size:2;border-radius:6px;margin:8px 0 0;padding:12px 14px;overflow:auto}.ps-native-code code{font:inherit}.ps-native-code .hljs-attr{color:#7dd3fc}.ps-native-code .hljs-string{color:#a7f3d0}.ps-native-code .hljs-number{color:#fbbf24}.ps-native-code :is(.hljs-literal,.hljs-built_in,.hljs-type){color:#c4b5fd}.ps-native-code :is(.hljs-keyword,.hljs-operator){color:#93c5fd}.ps-native-code .hljs-comment{color:#929aa8}.ps-theme-light .ps-native-code{background:var(--ps-inset);color:var(--ps-text)}.ps-theme-light .ps-native-code .hljs-attr{color:#0369a1}.ps-theme-light .ps-native-code .hljs-string{color:#047857}.ps-theme-light .ps-native-code .hljs-number{color:#b45309}.ps-theme-light .ps-native-code :is(.hljs-literal,.hljs-built_in,.hljs-type){color:#7c3aed}.ps-theme-light .ps-native-code :is(.hljs-keyword,.hljs-operator){color:#1d4ed8}.ps-theme-light .ps-native-code .hljs-comment{color:#64748b}.ps-query-residual{color:#d97706}.ps-query-source-note{font-size:10px;line-height:20px;display:block}.ps-query-owners{color:var(--ps-inspector-muted);flex-wrap:wrap;align-items:baseline;gap:4px 10px;margin-bottom:10px;font-size:11px;line-height:18px;display:flex}.ps-query-owner-name{color:var(--ps-inspector-text);font-family:var(--ps-font-mono);overflow-wrap:anywhere}.ps-demand-highlights{pointer-events:none;z-index:1;position:fixed;inset:0}.ps-demand-highlight{box-sizing:border-box;pointer-events:none;background:#60a5fa16;border:2px solid #60a5fa;position:fixed}.ps-demand-highlight>span{color:#fff;background:#2563eb;border-radius:0 0 3px;padding:3px 6px;font:11px/1.4 ui-sans-serif,sans-serif;position:absolute;top:0;left:0}.ps-query-expression{font-size:12px}.ps-pinned-screen{flex-direction:column;gap:18px;padding:18px;display:flex;overflow:auto}.ps-pinned-screen>*{flex-shrink:0}.ps-pinned-header,.ps-pinned-meta,.ps-pinned-status,.ps-pinned-attachments{align-items:center;gap:7px;display:flex}.ps-pinned-header{flex-wrap:wrap;justify-content:space-between;gap:12px}.ps-pinned-meta{flex-wrap:wrap;gap:14px}.ps-pinned-header h2{margin:0 0 7px;font-size:14px;font-weight:600}.ps-pinned-status,.ps-pinned-attachments,.ps-pinned-retained{color:var(--ps-inspector-muted);font-size:12px}.ps-pinned-status[data-state=ready]{color:#34b77e}.ps-pinned-status[data-state=loading]{color:#cba33c}.ps-pinned-status[data-state=error]{color:#ef7878}.ps-pinned-empty{height:100%;min-height:180px;color:var(--ps-inspector-muted);flex-direction:column;justify-content:center;align-items:center;gap:10px;display:flex}.ps-pinned-logo{width:40px;height:40px;display:block}.ps-pinned-inputs{max-width:100%}.ps-query-document{min-width:0;font-size:12px}.ps-query-input-definitions{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:12px;display:flex}.ps-query-node{border:1px solid var(--ps-border);background:var(--ps-surface);border-radius:10px;min-width:0}.ps-query-node>summary{padding:10px 12px}.ps-query-node>summary .ps-disclosure-label{flex-wrap:wrap;align-items:center;gap:9px;display:flex}.ps-query-node-body{border-left:1px solid var(--ps-border);margin:0 12px 12px 20px;padding-left:14px}.ps-query-selections{flex-direction:column;gap:8px;min-width:0;display:flex}.ps-query-node-body>.ps-query-selections{margin-top:12px}.ps-query-relation,.ps-query-relation-origin,.ps-query-link{align-items:center;gap:6px;min-width:0;display:inline-flex}.ps-query-relation{flex-wrap:wrap;gap:6px 8px;min-height:30px;display:flex}.ps-query-relation-origin{color:var(--ps-inspector-text);flex-wrap:wrap}.ps-query-relation-origin>.ps-query-field{color:var(--ps-inspector-muted);background:0 0;border:0;padding:0}.ps-query-relation-origin>.ps-query-field:before{content:\"(\"}.ps-query-relation-origin>.ps-query-field:after{content:\")\"}.ps-query-link{color:#c4b5fd;overflow-wrap:anywhere;background:#a78bfa12;border:1px solid #a78bfa40;border-radius:5px;padding:3px 7px}.ps-query-link>svg{flex-shrink:0}.ps-query-selection{flex-wrap:wrap;align-items:center;gap:7px;min-height:25px;display:flex}.ps-query-output{font:600 11px/1.5 var(--ps-font-mono);color:var(--ps-inspector-text);overflow-wrap:anywhere}.ps-query-binding{color:var(--ps-inspector-muted);font-size:10px}.ps-query-cardinality{border:1px solid var(--ps-border);color:var(--ps-inspector-muted);font:10px/1.5 var(--ps-font-mono);border-radius:5px;padding:1px 5px}.ps-query-selection-case{border-left:1px solid #a78bfa40;flex-direction:column;gap:8px;padding-left:12px;display:flex}.ps-query-sentence{flex-wrap:wrap;align-items:flex-start;gap:8px;display:flex}.ps-query-subject{min-height:26px;color:var(--ps-inspector-text);align-items:center;gap:7px;display:inline-flex}.ps-query-object-icon{flex-shrink:0;width:16px;height:16px}.ps-query-keyword,.ps-query-operator{color:var(--ps-inspector-muted)}.ps-query-sentence>.ps-query-keyword{align-items:center;min-height:26px;display:inline-flex}.ps-query-comparison,.ps-query-values,.ps-query-clause{flex-wrap:wrap;align-items:center;gap:7px;min-height:26px;display:flex}.ps-query-field,.ps-query-literal{overflow-wrap:anywhere;max-width:100%;padding:2px 7px;font:11px/1.5 ui-monospace,monospace;display:inline-block}.ps-query-field{color:#93c5fd;background:#60a5fa12;border:1px solid #60a5fa40;border-radius:3px}.ps-query-literal{color:#6ee7b7;background:#34d3990c;border:1px solid #34d39930;border-radius:12px}.ps-query-operator{padding:0 2px;font:11px/1.5 ui-monospace,monospace}.ps-query-group{align-items:flex-start;gap:9px;display:flex}.ps-query-sentence>.ps-query-group{flex-basis:100%;margin-top:2px;margin-left:20px}.ps-query-connector{color:#c4b5fd;min-width:23px;padding:5px 0;font:10px/1.5 ui-monospace,monospace}.ps-query-branches{border-left:1px solid #a78bfa40;flex-direction:column;gap:5px;min-width:0;padding-left:12px;display:flex}.ps-query-clause{margin-top:8px}.ps-theme-light .ps-query-field{color:#1d4ed8;background:#60a5fa0c}.ps-theme-light .ps-query-literal{color:#047857}.ps-theme-light .ps-query-connector{color:#7c3aed}.ps-theme-light .ps-timeline-bar{color:#3730a3}.ps-diagnostics-screen{position:relative}.ps-trace-source{flex-shrink:0;align-items:center;gap:8px;font-size:11px;display:flex}.ps-trace-source>span{color:var(--ps-inspector-muted)}.ps-trace-source-select{align-items:center;display:inline-flex;position:relative}.ps-trace-source-select>svg{pointer-events:none;color:var(--ps-inspector-muted);position:absolute;right:7px}.ps-trace-toolbar select{appearance:none;border:1px solid var(--ps-inspector-border);background:var(--ps-inspector-bg);width:118px;max-width:180px;color:inherit;cursor:pointer;border-radius:4px;padding:4px 24px 4px 8px;font-size:11px}.ps-trace-toolbar label{color:var(--ps-inspector-muted);align-items:center;gap:6px;margin-left:0;font-size:11px;display:flex}.ps-trace-toolbar>button{margin-left:0}.ps-timeline th button{cursor:pointer;width:100%;color:inherit;font:inherit;background:0 0;border:0;justify-content:space-between;align-items:center;gap:10px;padding:0;display:flex}.ps-timeline th[aria-sort]:not([aria-sort=none]),.ps-timeline th button:hover{color:var(--ps-accent)}.ps-timeline th{height:34px;font-size:11px;font-weight:600}.ps-timeline td{height:30px;padding:0 10px}.ps-timeline>tbody>tr>td:first-child{padding:0}.ps-timeline th.ps-trace-numeric{text-align:right}.ps-timeline th.ps-trace-numeric button{justify-content:flex-end;gap:6px}.ps-timeline td:nth-child(2),.ps-timeline td:last-child{padding:0 10px}.ps-timeline-time{color:var(--ps-inspector-muted);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:10px}.ps-timeline-name{align-items:center;gap:7px;height:29px;display:flex;font-size:11px!important}.ps-timeline-name>small{text-overflow:ellipsis;overflow:hidden}.ps-trace-icon{color:var(--ps-muted);flex-shrink:0}.ps-trace-icon[data-outcome=running]{color:#38bdf8}.ps-trace-icon[data-outcome=failure]{color:#fb7185}.ps-timeline-messages{color:var(--ps-inspector-muted);font-variant-numeric:tabular-nums;text-align:right}.ps-trace-status{color:var(--ps-muted);align-items:center;gap:6px;font-size:10px;display:inline-flex}.ps-trace-status[data-outcome=success]{color:#6ee7b7}.ps-trace-status[data-outcome=running]{color:#38bdf8}.ps-trace-status[data-outcome=failure]{color:#fb7185}.ps-trace-status[data-outcome=interrupted]{color:var(--ps-inspector-muted)}.ps-trace-status-dot{background:currentColor;border-radius:50%;width:5px;height:5px}.ps-timeline td:nth-child(2){padding:0 10px}.ps-timeline-details-heading button{flex-shrink:0;margin-left:0}.ps-query-special{border:1px dashed var(--ps-inspector-border);color:var(--ps-inspector-muted);border-radius:3px;padding:2px 5px;font:italic 11px/1.5 ui-monospace,monospace}.ps-query-wildcard{color:#fbbf24;background:#fbbf2414;border-radius:2px;font-weight:700}.ps-theme-light .ps-query-wildcard{color:#a16207}.ps-theme-light .ps-trace-status[data-outcome=success]{color:#047857}.ps-theme-light .ps-trace-status[data-outcome=running]{color:#0369a1}.ps-theme-light .ps-trace-status[data-outcome=failure]{color:#be123c}.ps-timeline-details{z-index:4;border-top:0;border-left:1px solid var(--ps-inspector-border);background:var(--ps-surface);flex-direction:column;width:min(540px,65%);padding:0;display:flex;position:absolute;top:36px;bottom:0;right:0;overflow:hidden;box-shadow:-6px 0 16px #0002}.ps-timeline-details-heading{border-bottom:1px solid var(--ps-inspector-border);flex-shrink:0;margin:0;padding:10px 12px}.ps-trace-detail-body{min-height:0;padding:12px;overflow:auto}.ps-trace-detail-body>.ps-query-expression{margin-top:12px}.ps-trace-detail-body h4{gap:10px;margin:16px 0 8px;font-size:11px;font-weight:500;display:flex}.ps-trace-detail-body h4>span,.ps-trace-note{color:var(--ps-inspector-muted);font-size:10px}.ps-trace-waterfall,.ps-trace-messages{table-layout:fixed;border-collapse:collapse;width:100%;font:10px/1.5 ui-monospace,monospace}.ps-trace-waterfall td,.ps-trace-messages td{border-bottom:1px solid var(--ps-inspector-border);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ps-trace-waterfall td:first-child{width:48%}.ps-trace-waterfall td:last-child{text-align:right;width:65px}.ps-trace-messages th{text-align:left;color:var(--ps-inspector-muted);padding:6px 0;font-weight:400}.ps-trace-messages td{padding:6px 0}.ps-trace-messages td:first-child,.ps-trace-messages th:first-child{width:100px}.ps-replication-empty{color:var(--ps-inspector-muted);padding:24px 14px}.ps-replication-error{color:#fca5a5;overflow-wrap:anywhere;white-space:pre-wrap;border-bottom:1px solid #ef444433;margin:0;padding:8px 12px;font-size:11px}.ps-query-step-note b{color:var(--ps-inspector-text);font-variant-numeric:tabular-nums;font-weight:500}.ps-schema{width:100%;height:100%;min-height:0;color:var(--ps-text);background:var(--ps-bg);position:relative}.ps-theme-light .ps-schema{color:var(--ps-text);background:var(--ps-bg)}.ps-schema .react-flow{--xy-background-color-default:var(--ps-bg);--xy-controls-button-background-color-hover-default:var(--ps-raised);--xy-edge-stroke-default:var(--ps-muted);--xy-edge-stroke-selected-default:#fb7185;--xy-edge-label-color-default:var(--ps-text);--xy-edge-label-background-color-default:var(--ps-surface);--xy-controls-button-background-color-default:var(--ps-surface);--xy-controls-button-color-default:var(--ps-text);--xy-controls-button-border-color-default:var(--ps-border);--xy-background-pattern-dots-color-default:#35353e}.ps-theme-light .ps-schema .react-flow{--xy-edge-stroke-default:var(--ps-muted);--xy-edge-label-color-default:var(--ps-text);--xy-edge-label-background-color-default:var(--ps-surface);--xy-controls-button-background-color-default:var(--ps-surface);--xy-controls-button-color-default:var(--ps-text);--xy-controls-button-border-color-default:var(--ps-border);--xy-background-pattern-dots-color-default:#dedee3}.ps-schema-card{border:1px solid var(--ps-border);background:var(--ps-surface);width:230px;height:176px;box-shadow:var(--ps-shadow);border-radius:7px;font:12px/1.5 ui-sans-serif,system-ui,sans-serif;overflow:hidden}.ps-schema .react-flow__node.selected .ps-schema-card{border-color:#fb7185;box-shadow:0 0 0 1px #fb71854d}.ps-schema-card header{align-items:center;gap:8px;padding:11px 12px 1px;display:flex}.ps-schema-card header strong{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ps-schema-card header>span{color:var(--ps-muted);margin-left:auto;font-size:10px}.ps-schema-object-icon{flex-shrink:0;width:17px;height:17px}.ps-schema-card>code{color:var(--ps-muted);border-bottom:1px solid var(--ps-border);padding:0 12px 8px;font-size:10px;display:block}.ps-schema-preview{padding:5px 12px}.ps-schema-preview>div{justify-content:space-between;align-items:center;gap:8px;padding:4px 0;font-size:11px;display:flex}.ps-schema-preview>div>span{text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:4px;min-width:0;display:flex;overflow:hidden}.ps-schema-preview svg{color:#fbbf24;flex-shrink:0}.ps-schema-preview small{text-overflow:ellipsis;white-space:nowrap;max-width:84px;color:var(--ps-muted);font-size:9px;overflow:hidden}.ps-schema-card footer{color:var(--ps-muted);padding:0 12px;font-size:10px}.ps-schema .react-flow__handle{background:#71717a;border:1px solid #18181b;width:6px;height:6px}.ps-theme-light .ps-schema-card{background:var(--ps-surface);border-color:var(--ps-border)}.ps-theme-light .ps-schema-preview small{color:var(--ps-muted)}.ps-schema-details{z-index:6;background:var(--ps-surface);border-left:1px solid var(--ps-border);flex-direction:column;width:min(360px,55%);height:100%;display:flex;position:absolute;top:0;right:0;box-shadow:-6px 0 20px #0002}.ps-theme-light .ps-schema-details{background:var(--ps-surface);border-color:var(--ps-border)}.ps-schema-details header{border-bottom:1px solid var(--ps-border);align-items:center;gap:9px;padding:10px 12px;font-size:12px;display:flex}.ps-schema-details header button{color:inherit;cursor:pointer;background:0 0;border:0;padding:0;display:flex}.ps-schema-detail-body{min-height:0;padding:12px;overflow:auto}.ps-schema-detail-body code{color:var(--ps-muted);font-size:10px}.ps-schema-detail-body table{border-collapse:collapse;width:100%;margin-top:14px;font-size:11px}.ps-schema-detail-body th{text-align:left;color:var(--ps-muted);font-size:10px;font-weight:500}.ps-schema-detail-body td{border-bottom:1px solid var(--ps-border);padding:7px 0}.ps-schema-detail-body td:first-child>span{align-items:center;gap:5px;display:flex}.ps-schema-detail-body td code{font-size:9px;display:block}.ps-schema-detail-body td:last-child{text-align:right;color:var(--ps-muted);padding-left:8px}.ps-schema-detail-body h4{margin:18px 0 8px;font-size:11px;font-weight:500}.ps-schema-relationship{border-bottom:1px solid var(--ps-border);flex-direction:column;gap:3px;padding:8px 0;font-size:10px;display:flex}.ps-schema-relationship strong{font-size:11px;font-weight:500}.ps-schema-relationship span{color:var(--ps-muted)}.ps-schema-empty{height:100%;color:var(--ps-muted);place-items:center;display:grid}.ps-trace-toolbar{gap:10px}.ps-trace-toolbar-separator{background:var(--ps-inspector-border);flex-shrink:0;width:1px;height:16px}.ps-timeline>tbody>tr>td:last-child{padding:0}.ps-devtools .ps-trace-source-select>select{background:var(--ps-inspector-bg);border-color:var(--ps-inspector-border);color:var(--ps-inspector-text);color-scheme:dark;border-radius:3px}.ps-devtools.ps-theme-light .ps-trace-source-select>select{color-scheme:light}.ps-devtools .ps-trace-source-select>select:hover{border-color:var(--ps-inspector-muted)}.ps-devtools .ps-trace-source-select>select:focus-visible{outline:2px solid var(--ps-inspector-muted);outline-offset:2px}.ps-storage-content{padding:20px;overflow:auto}.ps-storage-summary{background:var(--ps-surface);border:1px solid var(--ps-border);border-radius:8px;padding:16px}.ps-storage-summary+.ps-storage-summary{margin-top:20px}.ps-trace-toolbar select[aria-label=Storage\\ view]{width:190px}.ps-storage-chart{margin:0}.ps-storage-footnote{margin-top:18px}.ps-storage-budget-note{color:var(--ps-muted);margin:12px 0 0}.ps-storage-heading{justify-content:space-between;align-items:baseline;gap:16px;margin-bottom:16px;display:flex}.ps-storage-heading h2{margin:0}.ps-storage-heading>strong{font-variant-numeric:tabular-nums;color:var(--ps-muted);font-size:14px}.ps-storage-bar{background:var(--ps-border);border-radius:5px;height:24px;margin:0;display:flex;position:relative;overflow:hidden}.ps-storage-free{color:var(--ps-muted);background:var(--ps-hover);white-space:nowrap;place-items:center;font-size:11px;display:grid}.ps-storage-target{background:var(--ps-inspector-text);width:2px;position:absolute;top:0;bottom:0}.ps-storage-bar>span{border-right:1px solid var(--ps-surface)}.ps-storage-legend{color:var(--ps-muted);flex-wrap:wrap;gap:10px 20px;margin-top:12px;display:flex}.ps-storage-legend>button{color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0;display:inline-flex}.ps-storage-bar>span{flex-shrink:0;transition:opacity .12s}.ps-storage-bar>span[data-dimmed=true]{opacity:.18}.ps-storage-legend i{border-radius:50%;width:8px;height:8px}.ps-storage-legend strong{color:var(--ps-inspector-text);font-variant-numeric:tabular-nums;font-weight:500}.ps-storage-content h2{margin:0 0 12px;font-size:13px;font-weight:600}.ps-storage-content h2:not(:first-child){margin-top:24px}.ps-storage-note{color:var(--ps-muted);font-size:12px;line-height:1.6}.ps-storage-over{color:var(--ps-accent);margin-bottom:0;font-size:12px;line-height:1.6}.ps-devtools .ps-trace-source-select option{background:var(--ps-inspector-bg);color:var(--ps-inspector-text)}.ps-pinned-remove{border:1px solid var(--ps-border);color:inherit;font:inherit;cursor:pointer;background:0 0;border-radius:7px;flex-shrink:0;padding:6px 10px;transition:background .18s}.ps-pinned-remove:hover{background:currentColor}@supports (color:color-mix(in lab, red, red)){.ps-pinned-remove:hover{background:color-mix(in srgb,currentColor 8%,transparent)}}.ps-pinned-header{justify-content:space-between;gap:16px}.ps-pinned-screen{border-bottom:1px solid var(--ps-border)}.ps-pinned-inventory{height:100%;min-height:0;overflow:auto}.ps-pinned-inventory .ps-pinned-screen{height:auto;min-height:0;overflow:visible}.ps-pin-revision{flex-direction:column;gap:14px;min-width:0;display:flex}.ps-pin-downloads{border:1px solid var(--ps-border);border-radius:9px}.ps-pin-download{flex-wrap:wrap;align-items:center;gap:14px;padding:12px;display:flex}.ps-pin-download+.ps-pin-download{border-top:1px solid var(--ps-border)}.ps-pin-inputs{overflow-wrap:anywhere;flex:1;min-width:160px}.ps-pin-download .ps-pinned-status{white-space:nowrap}.ps-pin-download .ps-pinned-status[data-state=loading] svg{animation:1.2s linear infinite ps-pin-spin}@keyframes ps-pin-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.ps-pin-download .ps-pinned-status[data-state=loading] svg{animation:none}}}@layer utilities{.ps\\:pointer-events-none{pointer-events:none}.ps\\:invisible{visibility:hidden}.ps\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.ps\\:absolute{position:absolute}.ps\\:fixed{position:fixed}.ps\\:relative{position:relative}.ps\\:sticky{position:sticky}.ps\\:inset-0{inset:calc(var(--ps-spacing)*0)}.ps\\:inset-y-0{inset-block:calc(var(--ps-spacing)*0)}.ps\\:top-0{top:calc(var(--ps-spacing)*0)}.ps\\:top-4{top:calc(var(--ps-spacing)*4)}.ps\\:right-0{right:calc(var(--ps-spacing)*0)}.ps\\:right-4{right:calc(var(--ps-spacing)*4)}.ps\\:left-0{left:calc(var(--ps-spacing)*0)}.ps\\:z-20{z-index:20}.ps\\:z-50{z-index:50}.ps\\:z-\\[100001\\]{z-index:100001}.ps\\:z-\\[100002\\]{z-index:100002}.ps\\:z-\\[100003\\]{z-index:100003}.ps\\:m-0{margin:calc(var(--ps-spacing)*0)}.ps\\:mt-0{margin-top:calc(var(--ps-spacing)*0)}.ps\\:mb-2{margin-bottom:calc(var(--ps-spacing)*2)}.ps\\:ml-1\\.5{margin-left:calc(var(--ps-spacing)*1.5)}.ps\\:ml-auto{margin-left:auto}.ps\\:block{display:block}.ps\\:flex{display:flex}.ps\\:grid{display:grid}.ps\\:inline-flex{display:inline-flex}.ps\\:size-3{width:calc(var(--ps-spacing)*3);height:calc(var(--ps-spacing)*3)}.ps\\:size-3\\.5{width:calc(var(--ps-spacing)*3.5);height:calc(var(--ps-spacing)*3.5)}.ps\\:size-4{width:calc(var(--ps-spacing)*4);height:calc(var(--ps-spacing)*4)}.ps\\:size-5{width:calc(var(--ps-spacing)*5);height:calc(var(--ps-spacing)*5)}.ps\\:size-7{width:calc(var(--ps-spacing)*7);height:calc(var(--ps-spacing)*7)}.ps\\:h-40{height:calc(var(--ps-spacing)*40)}.ps\\:h-full{height:100%}.ps\\:max-h-\\[80vh\\]{max-height:80vh}.ps\\:max-h-full{max-height:100%}.ps\\:min-h-0{min-height:calc(var(--ps-spacing)*0)}.ps\\:min-h-full{min-height:100%}.ps\\:w-0\\.5{width:calc(var(--ps-spacing)*.5)}.ps\\:w-1{width:calc(var(--ps-spacing)*1)}.ps\\:w-44{width:calc(var(--ps-spacing)*44)}.ps\\:w-full{width:100%}.ps\\:max-w-4xl{max-width:var(--ps-container-4xl)}.ps\\:max-w-40{max-width:calc(var(--ps-spacing)*40)}.ps\\:max-w-64{max-width:calc(var(--ps-spacing)*64)}.ps\\:max-w-72{max-width:calc(var(--ps-spacing)*72)}.ps\\:max-w-80{max-width:calc(var(--ps-spacing)*80)}.ps\\:max-w-\\[80vw\\]{max-width:80vw}.ps\\:min-w-0{min-width:calc(var(--ps-spacing)*0)}.ps\\:min-w-5{min-width:calc(var(--ps-spacing)*5)}.ps\\:min-w-48{min-width:calc(var(--ps-spacing)*48)}.ps\\:flex-1{flex:1}.ps\\:flex-none{flex:none}.ps\\:shrink-0{flex-shrink:0}.ps\\:table-fixed{table-layout:fixed}.ps\\:border-separate{border-collapse:separate}.ps\\:border-spacing-0{--tw-border-spacing-x:calc(var(--ps-spacing)*0);--tw-border-spacing-y:calc(var(--ps-spacing)*0);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.ps\\:cursor-col-resize{cursor:col-resize}.ps\\:cursor-default{cursor:default}.ps\\:cursor-grab{cursor:grab}.ps\\:touch-none{touch-action:none}.ps\\:flex-col{flex-direction:column}.ps\\:place-items-center{place-items:center}.ps\\:items-center{align-items:center}.ps\\:justify-center{justify-content:center}.ps\\:gap-1{gap:calc(var(--ps-spacing)*1)}.ps\\:gap-1\\.5{gap:calc(var(--ps-spacing)*1.5)}.ps\\:gap-2{gap:calc(var(--ps-spacing)*2)}.ps\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ps\\:overflow-auto{overflow:auto}.ps\\:overflow-hidden{overflow:hidden}.ps\\:overflow-x-auto{overflow-x:auto}.ps\\:overflow-y-auto{overflow-y:auto}.ps\\:rounded{border-radius:.25rem}.ps\\:rounded-full{border-radius:3.40282e38px}.ps\\:rounded-lg{border-radius:var(--ps-radius-lg)}.ps\\:rounded-md{border-radius:var(--ps-radius-md)}.ps\\:rounded-xl{border-radius:var(--ps-radius-xl)}.ps\\:border{border-style:var(--tw-border-style);border-width:1px}.ps\\:border-0{border-style:var(--tw-border-style);border-width:0}.ps\\:border-x-0{border-inline-style:var(--tw-border-style);border-inline-width:0}.ps\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.ps\\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.ps\\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.ps\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.ps\\:border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.ps\\:border-\\[var\\(--ps-border\\)\\]{border-color:var(--ps-border)}.ps\\:border-\\[var\\(--ps-border-strong\\)\\]{border-color:var(--ps-border-strong)}.ps\\:border-transparent{border-color:#0000}.ps\\:bg-\\[var\\(--ps-bg\\)\\]{background-color:var(--ps-bg)}.ps\\:bg-\\[var\\(--ps-hover\\)\\]{background-color:var(--ps-hover)}.ps\\:bg-\\[var\\(--ps-raised\\)\\]{background-color:var(--ps-raised)}.ps\\:bg-\\[var\\(--ps-selected\\)\\]{background-color:var(--ps-selected)}.ps\\:bg-\\[var\\(--ps-surface\\)\\]{background-color:var(--ps-surface)}.ps\\:bg-black\\/75{background-color:var(--ps-color-black)}@supports (color:color-mix(in lab, red, red)){.ps\\:bg-black\\/75{background-color:color-mix(in oklab,var(--ps-color-black)75%,transparent)}}.ps\\:bg-red-500\\/20{background-color:var(--ps-color-red-500)}@supports (color:color-mix(in lab, red, red)){.ps\\:bg-red-500\\/20{background-color:color-mix(in oklab,var(--ps-color-red-500)20%,transparent)}}.ps\\:bg-rose-400{background-color:var(--ps-color-rose-400)}.ps\\:bg-sky-500\\/20{background-color:var(--ps-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.ps\\:bg-sky-500\\/20{background-color:color-mix(in oklab,var(--ps-color-sky-500)20%,transparent)}}.ps\\:bg-transparent{background-color:#0000}.ps\\:fill-rose-400{fill:var(--ps-color-rose-400)}.ps\\:fill-sky-950{fill:var(--ps-color-sky-950)}.ps\\:fill-zinc-700{fill:var(--ps-color-zinc-700)}.ps\\:stroke-zinc-600{stroke:var(--ps-color-zinc-600)}.ps\\:object-contain{object-fit:contain}.ps\\:object-cover{object-fit:cover}.ps\\:p-0{padding:calc(var(--ps-spacing)*0)}.ps\\:p-1\\.5{padding:calc(var(--ps-spacing)*1.5)}.ps\\:p-3{padding:calc(var(--ps-spacing)*3)}.ps\\:p-8{padding:calc(var(--ps-spacing)*8)}.ps\\:px-1\\.5{padding-inline:calc(var(--ps-spacing)*1.5)}.ps\\:px-2{padding-inline:calc(var(--ps-spacing)*2)}.ps\\:px-2\\.5{padding-inline:calc(var(--ps-spacing)*2.5)}.ps\\:px-3{padding-inline:calc(var(--ps-spacing)*3)}.ps\\:px-4{padding-inline:calc(var(--ps-spacing)*4)}.ps\\:py-0\\.5{padding-block:calc(var(--ps-spacing)*.5)}.ps\\:py-1\\.5{padding-block:calc(var(--ps-spacing)*1.5)}.ps\\:py-2{padding-block:calc(var(--ps-spacing)*2)}.ps\\:py-3{padding-block:calc(var(--ps-spacing)*3)}.ps\\:pt-2{padding-top:calc(var(--ps-spacing)*2)}.ps\\:pt-6{padding-top:calc(var(--ps-spacing)*6)}.ps\\:pb-1{padding-bottom:calc(var(--ps-spacing)*1)}.ps\\:text-center{text-align:center}.ps\\:text-left{text-align:left}.ps\\:align-top{vertical-align:top}.ps\\:font-sans{font-family:var(--ps-font-sans)}.ps\\:text-lg{font-size:var(--ps-text-lg);line-height:var(--tw-leading,var(--ps-text-lg--line-height))}.ps\\:text-sm{font-size:var(--ps-text-sm);line-height:var(--tw-leading,var(--ps-text-sm--line-height))}.ps\\:text-xs{font-size:var(--ps-text-xs);line-height:var(--tw-leading,var(--ps-text-xs--line-height))}.ps\\:text-\\[9px\\]{font-size:9px}.ps\\:text-\\[10px\\]{font-size:10px}.ps\\:text-\\[11px\\]{font-size:11px}.ps\\:text-\\[13px\\]{font-size:13px}.ps\\:leading-none{--tw-leading:1;line-height:1}.ps\\:font-bold{--tw-font-weight:var(--ps-font-weight-bold);font-weight:var(--ps-font-weight-bold)}.ps\\:font-medium{--tw-font-weight:var(--ps-font-weight-medium);font-weight:var(--ps-font-weight-medium)}.ps\\:font-semibold{--tw-font-weight:var(--ps-font-weight-semibold);font-weight:var(--ps-font-weight-semibold)}.ps\\:tracking-\\[0\\.14em\\]{--tw-tracking:.14em;letter-spacing:.14em}.ps\\:tracking-wide{--tw-tracking:var(--ps-tracking-wide);letter-spacing:var(--ps-tracking-wide)}.ps\\:tracking-wider{--tw-tracking:var(--ps-tracking-wider);letter-spacing:var(--ps-tracking-wider)}.ps\\:whitespace-nowrap{white-space:nowrap}.ps\\:text-\\[var\\(--ps-accent\\)\\]{color:var(--ps-accent)}.ps\\:text-\\[var\\(--ps-muted\\)\\]{color:var(--ps-muted)}.ps\\:text-\\[var\\(--ps-text\\)\\]{color:var(--ps-text)}.ps\\:text-inherit{color:inherit}.ps\\:text-red-300{color:var(--ps-color-red-300)}.ps\\:text-sky-300{color:var(--ps-color-sky-300)}.ps\\:text-sky-400{color:var(--ps-color-sky-400)}.ps\\:uppercase{text-transform:uppercase}.ps\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.ps\\:underline{text-decoration-line:underline}.ps\\:decoration-dotted{text-decoration-style:dotted}.ps\\:underline-offset-4{text-underline-offset:4px}.ps\\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ps\\:shadow-\\[0_0_0_1px_rgba\\(251\\,113\\,133\\,0\\.18\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#fb71852e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ps\\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ps\\:backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.ps\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--ps-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.ps\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--ps-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ps-default-transition-duration))}.ps\\:will-change-transform{will-change:transform}.ps\\:outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.ps\\:hover\\:border-\\[var\\(--ps-accent\\)\\]:hover{border-color:var(--ps-accent)}.ps\\:hover\\:border-\\[var\\(--ps-border-strong\\)\\]:hover{border-color:var(--ps-border-strong)}.ps\\:hover\\:bg-\\[var\\(--ps-hover\\)\\]:hover{background-color:var(--ps-hover)}.ps\\:hover\\:bg-rose-400\\/70:hover{background-color:var(--ps-color-rose-400)}@supports (color:color-mix(in lab, red, red)){.ps\\:hover\\:bg-rose-400\\/70:hover{background-color:color-mix(in oklab,var(--ps-color-rose-400)70%,transparent)}}.ps\\:hover\\:text-\\[var\\(--ps-accent\\)\\]:hover{color:var(--ps-accent)}.ps\\:hover\\:text-current:hover{color:currentColor}}.ps\\:focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.ps\\:focus-visible\\:bg-rose-400\\/70:focus-visible{background-color:var(--ps-color-rose-400)}@supports (color:color-mix(in lab, red, red)){.ps\\:focus-visible\\:bg-rose-400\\/70:focus-visible{background-color:color-mix(in oklab,var(--ps-color-rose-400)70%,transparent)}}.ps\\:active\\:cursor-grabbing:active{cursor:grabbing}.ps\\:disabled\\:opacity-40:disabled{opacity:.4}.ps\\:disabled\\:opacity-50:disabled{opacity:.5}.ps\\:data-\\[active\\]\\:border-\\[var\\(--ps-accent\\)\\][data-active]{border-color:var(--ps-accent)}.ps\\:data-\\[active\\]\\:font-semibold[data-active]{--tw-font-weight:var(--ps-font-weight-semibold);font-weight:var(--ps-font-weight-semibold)}.ps\\:data-\\[active\\]\\:text-\\[var\\(--ps-accent\\)\\][data-active]{color:var(--ps-accent)}.ps\\:data-\\[highlighted\\]\\:bg-\\[var\\(--ps-hover\\)\\][data-highlighted]{background-color:var(--ps-hover)}}:root,:host{--party-brand:#e83b32;--party-font-sans:Inter,ui-sans-serif,system-ui,sans-serif;--party-light-bg:#fafafa;--party-light-surface:#fff;--party-light-raised:#f1f2f4;--party-light-inset:#f5f6f8;--party-light-border:#e4e4e7;--party-light-border-strong:#c5c7ce;--party-light-text:#27272a;--party-light-muted:#71717a;--party-light-hover:#00000005;--party-light-selected:#e11d4810;--party-light-accent:#be123c;--party-light-shadow:0 4px 16px #0000000a;--party-dark-bg:#101114;--party-dark-surface:#18191e;--party-dark-raised:#222329;--party-dark-inset:#121318;--party-dark-border:#2d2f36;--party-dark-border-strong:#454852;--party-dark-text:#e4e4e7;--party-dark-muted:#a1a1aa;--party-dark-hover:#ffffff08;--party-dark-selected:#fb718518;--party-dark-accent:#fb7185;--party-dark-shadow:0 4px 16px #0002}@property --tw-border-spacing-x{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-tracking{syntax:\"*\";inherits:false}@property --tw-ordinal{syntax:\"*\";inherits:false}@property --tw-slashed-zero{syntax:\"*\";inherits:false}@property --tw-numeric-figure{syntax:\"*\";inherits:false}@property --tw-numeric-spacing{syntax:\"*\";inherits:false}@property --tw-numeric-fraction{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:\"*\";inherits:false}@property --tw-backdrop-brightness{syntax:\"*\";inherits:false}@property --tw-backdrop-contrast{syntax:\"*\";inherits:false}@property --tw-backdrop-grayscale{syntax:\"*\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\"*\";inherits:false}@property --tw-backdrop-invert{syntax:\"*\";inherits:false}@property --tw-backdrop-opacity{syntax:\"*\";inherits:false}@property --tw-backdrop-saturate{syntax:\"*\";inherits:false}@property --tw-backdrop-sepia{syntax:\"*\";inherits:false}\n";
3
+ //#endregion
4
+ export { styles_default as default };
5
+
6
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","names":[],"sources":["../src/styles.css?inline"],"sourcesContent":["@layer theme, base, components, utilities;\n@import \"@party-stack/design-system/tokens.css\";\n@import \"@xyflow/react/dist/style.css\" layer(components);\n@import \"tailwindcss/theme.css\" layer(theme) prefix(ps);\n@import \"tailwindcss/preflight.css\" layer(base);\n@import \"tailwindcss/utilities.css\" layer(utilities) prefix(ps) source(none);\n@source \"./OntologyDevtools.tsx\";\n@source \"./Tracing.tsx\";\n@source \"./Queries.tsx\";\n@source \"./QueryPills.tsx\";\n\n/* Browsers don't register @property declarations inside shadow stylesheets.\n Supply Tailwind's per-element defaults locally, without relying on host CSS. */\n@layer base {\n *,\n ::before,\n ::after,\n ::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-border-style: solid;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-tracking: initial;\n --tw-ordinal: initial;\n --tw-slashed-zero: initial;\n --tw-numeric-figure: initial;\n --tw-numeric-spacing: initial;\n --tw-numeric-fraction: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-backdrop-blur: initial;\n --tw-backdrop-brightness: initial;\n --tw-backdrop-contrast: initial;\n --tw-backdrop-grayscale: initial;\n --tw-backdrop-hue-rotate: initial;\n --tw-backdrop-invert: initial;\n --tw-backdrop-opacity: initial;\n --tw-backdrop-saturate: initial;\n --tw-backdrop-sepia: initial;\n }\n}\n\n@layer components {\n .ps-devtools,\n .ps-outbox-root {\n --ps-bg: var(--party-dark-bg);\n --ps-surface: var(--party-dark-surface);\n --ps-raised: var(--party-dark-raised);\n --ps-inset: var(--party-dark-inset);\n --ps-border: var(--party-dark-border);\n --ps-border-strong: var(--party-dark-border-strong);\n --ps-text: var(--party-dark-text);\n --ps-muted: var(--party-dark-muted);\n --ps-hover: var(--party-dark-hover);\n --ps-selected: var(--party-dark-selected);\n --ps-accent: var(--party-dark-accent);\n --ps-shadow: var(--party-dark-shadow);\n --ps-inspector-bg: var(--ps-bg);\n --ps-inspector-border: var(--ps-border);\n --ps-inspector-muted: var(--ps-muted);\n --ps-inspector-text: var(--ps-text);\n color: var(--ps-text);\n background: var(--ps-bg);\n color-scheme: dark;\n }\n .ps-devtools.ps-theme-light,\n .ps-outbox-root.ps-theme-light {\n --ps-bg: var(--party-light-bg);\n --ps-surface: var(--party-light-surface);\n --ps-raised: var(--party-light-raised);\n --ps-inset: var(--party-light-inset);\n --ps-border: var(--party-light-border);\n --ps-border-strong: var(--party-light-border-strong);\n --ps-text: var(--party-light-text);\n --ps-muted: var(--party-light-muted);\n --ps-hover: var(--party-light-hover);\n --ps-selected: var(--party-light-selected);\n --ps-accent: var(--party-light-accent);\n --ps-shadow: var(--party-light-shadow);\n color-scheme: light;\n }\n}\n\n@layer components {\n .ps-devtools :where(button:not(:disabled), select:not(:disabled), a[href]) {\n cursor: pointer;\n }\n .ps-devtools,\n .ps-devtools *,\n .ps-devtools *::before,\n .ps-devtools *::after {\n box-sizing: border-box;\n }\n\n .ps-object-table-scroll {\n scrollbar-gutter: stable;\n overscroll-behavior: none;\n scrollbar-color: var(--ps-muted) var(--ps-surface);\n scrollbar-width: thin;\n }\n .ps-object-data-row {\n height: 40px;\n }\n .ps-object-data-cell {\n padding-top: 0;\n padding-bottom: 0;\n }\n .ps-object-cell-content {\n display: flex;\n align-items: center;\n height: 39px;\n min-width: 0;\n overflow: hidden;\n line-height: 16px;\n }\n .ps-object-cell-content > * {\n min-width: 0;\n max-width: 100%;\n max-height: 100%;\n }\n .ps-object-table-header {\n position: sticky;\n z-index: 30;\n top: 0;\n transform: translateZ(0);\n backface-visibility: hidden;\n }\n .ps-object-table-scroll::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n .ps-object-table-scroll::-webkit-scrollbar-track {\n background: var(--ps-surface);\n }\n .ps-object-table-scroll::-webkit-scrollbar-thumb {\n background: var(--ps-muted);\n border: 2px solid var(--ps-surface);\n border-radius: 999px;\n }\n .ps-object-table-scroll::-webkit-scrollbar-thumb:hover {\n background: #a1a1aa;\n }\n .ps-theme-light .ps-object-table-scroll {\n scrollbar-color: var(--ps-muted) var(--ps-surface);\n }\n .ps-theme-light .ps-object-table-scroll::-webkit-scrollbar-track {\n background: var(--ps-surface);\n }\n .ps-theme-light .ps-object-table-scroll::-webkit-scrollbar-thumb {\n background: var(--ps-muted);\n border-color: var(--ps-surface);\n }\n .ps-theme-light .ps-object-table-scroll::-webkit-scrollbar-thumb:hover {\n background: #78716c;\n }\n\n .ps-outbox-root {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n }\n .ps-outbox {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n overflow: hidden auto;\n overscroll-behavior: contain;\n padding: 20px 22px;\n color: var(--ps-text);\n background: var(--ps-bg);\n font:\n 13px/1.45 Inter,\n ui-sans-serif,\n system-ui,\n sans-serif;\n }\n .ps-outbox * {\n box-sizing: border-box;\n }\n .ps-outbox-header {\n display: flex;\n align-items: center;\n gap: 16px;\n margin-bottom: 20px;\n }\n .ps-outbox-heading {\n display: flex;\n align-items: center;\n gap: 11px;\n }\n .ps-outbox-mark {\n width: 30px;\n height: 30px;\n padding: 5px;\n border: 1px solid var(--ps-border);\n border-radius: 10px;\n background: var(--ps-surface);\n box-shadow: var(--ps-shadow);\n color: #fb7185;\n }\n .ps-outbox-mark svg {\n display: block;\n width: 100%;\n height: 100%;\n }\n .ps-outbox-title-row {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .ps-outbox-title {\n margin: 0;\n color: var(--ps-text);\n font-size: 17px;\n font-weight: 700;\n letter-spacing: -0.015em;\n }\n .ps-outbox-subtitle {\n margin: 2px 0 0;\n color: var(--ps-muted);\n font-size: 12px;\n }\n .ps-outbox-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 25px;\n padding: 2px 7px;\n border: 1px solid var(--ps-border);\n border-radius: 999px;\n color: var(--ps-muted);\n background: var(--ps-surface);\n text-align: center;\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n }\n .ps-outbox-track {\n display: flex;\n align-items: flex-start;\n width: 100%;\n padding: 4px 2px 16px;\n overflow-x: auto;\n overscroll-behavior-x: contain;\n scrollbar-width: thin;\n scrollbar-color: #52525b transparent;\n scroll-snap-type: x proximity;\n }\n .ps-outbox-step {\n display: flex;\n flex: none;\n align-items: flex-start;\n }\n .ps-outbox-node {\n flex: 0 0 clamp(250px, 31vw, 330px);\n min-width: 0;\n scroll-snap-align: start;\n }\n .ps-outbox-connector {\n position: relative;\n flex: 0 0 52px;\n align-self: flex-start;\n height: 2px;\n margin: 30px 8px 0;\n border-radius: 999px;\n background: linear-gradient(90deg, #3f3f46, #52525b);\n }\n .ps-outbox-connector::before {\n position: absolute;\n z-index: 1;\n right: 0;\n top: -3px;\n width: 7px;\n height: 7px;\n content: \"\";\n border-top: 2px solid #71717a;\n border-right: 2px solid #71717a;\n transform: rotate(45deg);\n }\n .ps-outbox-card {\n position: relative;\n min-height: 190px;\n padding: 15px;\n overflow: hidden;\n border: 1px solid var(--ps-border);\n border-radius: 14px;\n background: var(--ps-surface);\n box-shadow: var(--ps-shadow);\n }\n .ps-outbox-card::before {\n position: absolute;\n inset: 0 auto 0 0;\n width: 3px;\n content: \"\";\n background: #38bdf8;\n }\n .ps-card-sending::before,\n .ps-card-acknowledged::before {\n background: #f59e0b;\n }\n .ps-card-blocked::before {\n background: #ef4444;\n }\n .ps-outbox-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n }\n .ps-outbox-name {\n min-width: 0;\n overflow: hidden;\n color: var(--ps-text);\n font-size: 14px;\n font-weight: 680;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .ps-outbox-status {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n border: 1px solid currentColor;\n border-radius: 999px;\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.03em;\n }\n .ps-status-dot {\n width: 5px;\n height: 5px;\n border-radius: 999px;\n background: currentColor;\n }\n .ps-status-queued {\n color: #7dd3fc;\n background: rgba(12, 74, 110, 0.45);\n }\n .ps-status-sending,\n .ps-status-acknowledged {\n color: #fcd34d;\n background: rgba(120, 53, 15, 0.42);\n }\n .ps-status-blocked {\n color: #fca5a5;\n background: rgba(127, 29, 29, 0.42);\n }\n .ps-outbox-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 6px 13px;\n margin-top: 10px;\n color: var(--ps-muted);\n font-size: 11px;\n }\n .ps-outbox-attempts {\n min-width: 88px;\n font-variant-numeric: tabular-nums;\n }\n .ps-outbox-meta strong {\n color: var(--ps-muted);\n font-weight: 600;\n }\n .ps-outbox-meta-divider {\n align-self: center;\n width: 3px;\n height: 3px;\n border-radius: 999px;\n background: currentColor;\n opacity: 0.65;\n }\n .ps-outbox-permanent {\n color: #fca5a5;\n }\n .ps-outbox-time {\n cursor: help;\n font-variant-numeric: tabular-nums;\n }\n .ps-outbox-error strong {\n display: block;\n margin-bottom: 4px;\n }\n .ps-outbox-error ul {\n list-style: none;\n padding: 0;\n margin: 8px 0 0;\n display: grid;\n gap: 4px;\n }\n .ps-outbox-error code {\n font-size: 11px;\n color: var(--ps-text);\n }\n .ps-outbox-error {\n margin-top: 11px;\n padding: 8px 10px;\n border: 1px solid rgba(239, 68, 68, 0.35);\n border-radius: 8px;\n color: #fecaca;\n background: rgba(69, 10, 10, 0.55);\n font-size: 11px;\n white-space: pre-wrap;\n }\n .ps-outbox-details {\n margin-top: 11px;\n color: var(--ps-muted);\n font-size: 11px;\n }\n .ps-outbox-details summary {\n cursor: pointer;\n user-select: none;\n transition: color 120ms ease;\n }\n .ps-outbox-details summary:hover {\n color: var(--ps-text);\n }\n .ps-outbox-details pre {\n max-height: 150px;\n margin: 8px 0 0;\n padding: 10px;\n overflow: auto;\n border: 1px solid var(--ps-border);\n border-radius: 8px;\n color: var(--ps-text);\n background: var(--ps-inset);\n font:\n 11px/1.5 ui-monospace,\n SFMono-Regular,\n monospace;\n }\n .ps-outbox-actions {\n display: flex;\n gap: 7px;\n margin-top: 13px;\n }\n .ps-button {\n appearance: none;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 10px;\n border: 1px solid transparent;\n border-radius: 7px;\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n transition:\n background 120ms ease,\n border-color 120ms ease,\n opacity 120ms ease;\n }\n .ps-button svg {\n width: 13px;\n height: 13px;\n }\n .ps-button:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n .ps-button-primary {\n color: #e0f2fe;\n border-color: #075985;\n background: rgba(7, 89, 133, 0.7);\n }\n .ps-button-primary:not(:disabled):hover {\n background: #0369a1;\n }\n .ps-button-danger {\n color: #fca5a5;\n border-color: #7f1d1d;\n background: rgba(69, 10, 10, 0.16);\n }\n .ps-button-danger:not(:disabled):hover {\n background: rgba(127, 29, 29, 0.7);\n }\n .ps-outbox-action-error {\n margin-top: 8px;\n color: #fca5a5;\n font-size: 12px;\n }\n .ps-outbox-empty {\n display: grid;\n place-items: center;\n min-height: 150px;\n padding: 28px 16px;\n border: 1px dashed var(--ps-border);\n border-radius: 14px;\n color: var(--ps-muted);\n background: var(--ps-surface);\n text-align: center;\n }\n .ps-outbox-empty-mark {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n margin: 0 auto 9px;\n border: 1px solid var(--ps-border);\n border-radius: 999px;\n color: #86efac;\n background: #1c2920;\n }\n .ps-outbox-empty-mark svg {\n width: 17px;\n height: 17px;\n }\n .ps-outbox-empty strong {\n display: block;\n margin-bottom: 2px;\n color: var(--ps-text);\n }\n .ps-theme-light .ps-outbox {\n color: var(--ps-text);\n background: var(--ps-bg);\n }\n .ps-theme-light .ps-outbox-mark {\n color: #dc2626;\n border-color: var(--ps-border);\n background: var(--ps-surface);\n box-shadow: var(--ps-shadow);\n }\n .ps-theme-light .ps-outbox-title,\n .ps-theme-light .ps-outbox-name,\n .ps-theme-light .ps-outbox-empty strong {\n color: var(--ps-text);\n }\n .ps-theme-light .ps-outbox-subtitle,\n .ps-theme-light .ps-outbox-meta,\n .ps-theme-light .ps-outbox-details {\n color: var(--ps-muted);\n }\n .ps-theme-light .ps-outbox-meta strong {\n color: var(--ps-text);\n }\n .ps-theme-light .ps-outbox-count {\n color: var(--ps-muted);\n border-color: var(--ps-border);\n background: var(--ps-surface);\n }\n .ps-theme-light .ps-outbox-card {\n border-color: var(--ps-border);\n background: var(--ps-surface);\n box-shadow: var(--ps-shadow);\n }\n .ps-theme-light .ps-outbox-connector {\n background: #d6d3d1;\n }\n .ps-theme-light .ps-outbox-details summary:hover {\n color: var(--ps-text);\n }\n .ps-theme-light .ps-outbox-details pre {\n color: var(--ps-text);\n border-color: var(--ps-border);\n background: var(--ps-surface);\n }\n .ps-theme-light .ps-outbox-empty {\n color: var(--ps-muted);\n border-color: var(--ps-border);\n background: var(--ps-surface);\n }\n .ps-theme-light .ps-outbox-empty-mark {\n color: #15803d;\n border-color: #bbf7d0;\n background: #f0fdf4;\n }\n .ps-theme-light .ps-button-primary {\n color: #075985;\n border-color: #7dd3fc;\n background: #e0f2fe;\n }\n .ps-theme-light .ps-button-primary:not(:disabled):hover {\n background: #bae6fd;\n }\n .ps-theme-light .ps-button-danger {\n color: #b91c1c;\n border-color: #fecaca;\n background: #fff7f7;\n }\n .ps-theme-light .ps-button-danger:not(:disabled):hover {\n background: #fee2e2;\n }\n}\n\n@layer components {\n .ps-diagnostics-screen {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n color: var(--ps-inspector-text);\n background: var(--ps-inspector-bg);\n font:\n 12px/1.5 Inter,\n ui-sans-serif,\n system-ui,\n sans-serif;\n }\n .ps-diagnostics-screen button,\n .ps-diagnostics-screen select,\n .ps-diagnostics-screen input {\n font: inherit;\n }\n .ps-diagnostics-context {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 0 0 32px;\n padding: 0 12px;\n border-bottom: 1px solid var(--ps-inspector-border);\n font-size: 11px;\n }\n .ps-diagnostics-context > span {\n color: var(--ps-inspector-muted);\n }\n .ps-diagnostics-context select {\n border: 0;\n border-radius: 4px;\n padding: 3px 6px;\n background: #818cf80d;\n color: inherit;\n outline-offset: 2px;\n cursor: pointer;\n }\n .ps-diagnostics-context option {\n color: var(--ps-text);\n background: #181a20;\n }\n .ps-diagnostics-toolbar {\n background: var(--ps-surface);\n display: flex;\n align-items: center;\n flex: 0 0 36px;\n gap: 14px;\n padding: 0 12px;\n border-bottom: 1px solid var(--ps-inspector-border);\n white-space: nowrap;\n overflow: hidden;\n }\n .ps-diagnostics-toolbar > span,\n .ps-diagnostics-toolbar > small {\n color: var(--ps-inspector-muted);\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .ps-diagnostics-toolbar > button {\n margin-left: auto;\n border: 1px solid var(--ps-inspector-border);\n border-radius: 4px;\n padding: 2px 9px;\n color: inherit;\n background: transparent;\n cursor: pointer;\n font-size: 11px;\n }\n .ps-diagnostics-toolbar > input {\n width: 200px;\n height: 27px;\n margin-left: auto;\n padding: 3px 9px;\n border: 1px solid var(--ps-inspector-border);\n border-radius: 5px;\n color: inherit;\n background: transparent;\n outline-offset: 2px;\n }\n .ps-timeline-scroll {\n flex: 1;\n min-height: 0;\n overflow: auto;\n scrollbar-gutter: stable;\n }\n .ps-timeline {\n table-layout: fixed;\n width: 100%;\n min-width: 650px;\n border-collapse: collapse;\n font-size: 11px;\n }\n .ps-timeline th {\n position: sticky;\n top: 0;\n z-index: 2;\n height: 29px;\n padding: 0 10px;\n border-bottom: 1px solid var(--ps-inspector-border);\n background: var(--ps-surface);\n color: var(--ps-inspector-muted);\n text-align: left;\n font-size: 10px;\n font-weight: 500;\n }\n .ps-timeline td {\n padding: 0;\n height: 27px;\n border-bottom: 1px solid var(--ps-inspector-border);\n }\n .ps-timeline td:nth-child(2) {\n padding: 0 10px;\n }\n .ps-timeline tbody tr[data-selected=\"true\"] {\n background: var(--ps-selected);\n }\n .ps-timeline tbody tr:hover {\n background: var(--ps-hover);\n }\n .ps-timeline-ruler {\n position: relative;\n height: 29px;\n }\n .ps-timeline-ruler > span {\n position: absolute;\n top: 7px;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n }\n .ps-timeline-name {\n display: block;\n width: 100%;\n padding: 0 10px;\n height: 26px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n border: 0;\n background: transparent;\n color: inherit;\n text-align: left;\n font:\n 10px/26px ui-monospace,\n monospace !important;\n cursor: pointer;\n }\n .ps-timeline-name small,\n .ps-timeline-branch {\n color: var(--ps-inspector-muted);\n }\n .ps-timeline-hit {\n position: relative;\n display: block;\n width: 100%;\n height: 26px;\n padding: 0;\n border: 0;\n overflow: hidden;\n cursor: pointer;\n background: repeating-linear-gradient(\n 90deg,\n #818cf810 0,\n #818cf810 1px,\n transparent 1px,\n transparent 33.333333%\n );\n }\n .ps-timeline-bar {\n position: absolute;\n top: 4px;\n height: 18px;\n min-width: 2px;\n border: 1px solid #818cf88a;\n border-radius: 3px;\n background: #818cf83b;\n color: #c7d2fe;\n font-size: 10px;\n line-height: 16px;\n overflow: hidden;\n text-overflow: clip;\n white-space: nowrap;\n text-align: left;\n }\n .ps-timeline-bar[data-outcome=\"failure\"] {\n border-color: #f8717190;\n background: #f871713b;\n color: #fca5a5;\n }\n .ps-timeline-bar[data-outcome=\"running\"] {\n border-style: dashed;\n background: #38bdf825;\n border-color: #38bdf890;\n }\n .ps-timeline-bar[data-outcome=\"interrupted\"] {\n background: #71717a30;\n border-color: var(--ps-border);\n }\n .ps-timeline-bar[data-clipped-start=\"true\"] {\n border-left-style: dashed;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .ps-timeline-duration {\n padding: 0 10px !important;\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--ps-inspector-muted);\n white-space: nowrap;\n }\n .ps-timeline-details {\n flex: 0 0 68px;\n min-height: 0;\n padding: 8px 12px;\n border-top: 1px solid var(--ps-inspector-border);\n overflow: auto;\n }\n .ps-timeline-details > p {\n margin: 4px 0;\n color: var(--ps-inspector-muted);\n font-size: 11px;\n }\n .ps-timeline-details-heading {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n margin-bottom: 5px;\n font-size: 11px;\n }\n .ps-timeline-details-heading strong {\n font-family: ui-monospace, monospace;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .ps-timeline-details-heading > span {\n color: var(--ps-inspector-muted);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n }\n .ps-timeline-details-heading button {\n margin-left: 0;\n border: 0;\n padding: 0 4px;\n background: transparent;\n color: var(--ps-inspector-muted);\n cursor: pointer;\n font-size: 16px;\n }\n .ps-timeline-attributes {\n display: flex;\n flex-wrap: wrap;\n gap: 6px 16px;\n color: var(--ps-inspector-muted);\n font-size: 11px;\n }\n .ps-query-list {\n flex: 1;\n min-height: 0;\n overflow: auto;\n padding: 14px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .ps-query-card {\n background: var(--ps-surface);\n flex: 0 0 auto;\n padding: 14px 16px;\n border: 1px solid var(--ps-inspector-border);\n border-radius: 6px;\n }\n .ps-query-card[data-attributed]:hover,\n .ps-query-card[data-attributed]:focus-within {\n border-color: #60a5fa;\n outline: 1px solid #60a5fa;\n outline-offset: 1px;\n }\n .ps-query-card > header {\n position: relative;\n padding-right: 90px;\n min-height: 20px;\n }\n .ps-query-refreshing {\n position: absolute;\n top: 0;\n right: 0;\n color: var(--ps-muted);\n background: var(--ps-raised);\n border: 1px solid var(--ps-border);\n border-radius: 4px;\n padding: 1px 6px;\n font-size: 10px;\n visibility: hidden;\n }\n .ps-query-refreshing[data-refreshing=\"true\"] {\n visibility: visible;\n }\n .ps-query-component-target {\n outline: none;\n cursor: pointer;\n border: 0;\n padding: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n width: 100%;\n }\n .ps-query-pushdown {\n margin-top: 10px;\n border-top: 1px solid var(--ps-inspector-border);\n padding-top: 6px;\n }\n .ps-disclosure-summary {\n display: flex;\n align-items: center;\n gap: 6px;\n min-height: 28px;\n cursor: pointer;\n list-style: none;\n line-height: 18px;\n user-select: none;\n }\n .ps-disclosure-summary::-webkit-details-marker {\n display: none;\n }\n .ps-disclosure-label {\n display: block;\n min-width: 0;\n }\n .ps-query-pushdown > summary {\n color: var(--ps-inspector-muted);\n font-size: 11px;\n }\n .ps-query-pushdown > summary:hover {\n color: var(--ps-inspector-text);\n }\n .ps-disclosure-chevron {\n display: block;\n flex: none;\n width: 12px;\n height: 12px;\n transition: transform 120ms;\n }\n details[open] > .ps-disclosure-summary > .ps-disclosure-chevron {\n transform: rotate(90deg);\n }\n .ps-query-execution {\n padding-top: 10px;\n display: grid;\n gap: 18px;\n font-size: 11px;\n color: var(--ps-inspector-muted);\n }\n .ps-query-step {\n padding-left: 28px;\n min-width: 0;\n }\n .ps-query-step h4 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 7px;\n margin: 0 0 8px -28px;\n color: var(--ps-inspector-text);\n font-size: 11px;\n font-weight: 600;\n }\n .ps-query-step h4 > span:first-child {\n display: inline-grid;\n place-items: center;\n width: 19px;\n height: 19px;\n border: 1px solid var(--ps-inspector-border);\n border-radius: 50%;\n margin-right: 2px;\n font-variant-numeric: tabular-nums;\n }\n .ps-query-source-status {\n color: var(--ps-inspector-muted);\n font-weight: 400;\n padding: 2px 6px;\n border: 1px solid var(--ps-inspector-border);\n border-radius: 4px;\n }\n .ps-query-step[data-source-state=\"cached\"] h4 {\n color: var(--ps-inspector-muted);\n }\n .ps-query-step-note,\n .ps-query-step > .ps-query-residual {\n margin: 6px 0 8px;\n line-height: 1.65;\n }\n .ps-query-data-details {\n margin: 0 0 10px 10px;\n padding-left: 12px;\n border-left: 1px solid var(--ps-inspector-border);\n }\n .ps-query-data-section + .ps-query-data-section {\n margin-top: 14px;\n }\n .ps-query-data-section h5 {\n margin: 0 0 6px;\n font-size: 11px;\n font-weight: 600;\n color: var(--ps-inspector-text);\n }\n .ps-query-comparison[data-execution] {\n border-left: 2px solid;\n border-radius: 3px;\n padding: 4px 8px;\n }\n .ps-query-comparison[data-execution=\"source\"] {\n border-color: #34d39980;\n background: #34d39908;\n }\n .ps-query-comparison[data-execution=\"candidate\"] {\n border-color: #fbbf2480;\n background: #fbbf2408;\n }\n .ps-query-comparison[data-execution=\"adapter\"],\n .ps-query-comparison[data-execution=\"engine\"] {\n border-color: #94a3b880;\n background: #94a3b808;\n }\n .ps-query-execution-label {\n font-size: 10px;\n margin-left: auto;\n padding-left: 12px;\n }\n [data-execution=\"source\"] > .ps-query-execution-label {\n color: #34d399;\n }\n [data-execution=\"candidate\"] > .ps-query-execution-label {\n color: #fbbf24;\n }\n .ps-query-native {\n margin: 8px 0;\n }\n .ps-query-native summary {\n cursor: pointer;\n font-size: 10px;\n }\n .ps-native-code {\n max-height: 280px;\n margin: 8px 0 0;\n padding: 12px 14px;\n overflow: auto;\n border: 1px solid var(--ps-inspector-border);\n border-radius: 6px;\n background: var(--ps-inset);\n color: var(--ps-text);\n font: 11px/1.65 var(--ps-font-mono);\n text-align: left;\n white-space: pre;\n tab-size: 2;\n }\n .ps-native-code code {\n font: inherit;\n }\n .ps-native-code .hljs-attr {\n color: #7dd3fc;\n }\n .ps-native-code .hljs-string {\n color: #a7f3d0;\n }\n .ps-native-code .hljs-number {\n color: #fbbf24;\n }\n .ps-native-code :is(.hljs-literal, .hljs-built_in, .hljs-type) {\n color: #c4b5fd;\n }\n .ps-native-code :is(.hljs-keyword, .hljs-operator) {\n color: #93c5fd;\n }\n .ps-native-code .hljs-comment {\n color: #929aa8;\n }\n .ps-theme-light .ps-native-code {\n background: var(--ps-inset);\n color: var(--ps-text);\n }\n .ps-theme-light .ps-native-code .hljs-attr {\n color: #0369a1;\n }\n .ps-theme-light .ps-native-code .hljs-string {\n color: #047857;\n }\n .ps-theme-light .ps-native-code .hljs-number {\n color: #b45309;\n }\n .ps-theme-light .ps-native-code :is(.hljs-literal, .hljs-built_in, .hljs-type) {\n color: #7c3aed;\n }\n .ps-theme-light .ps-native-code :is(.hljs-keyword, .hljs-operator) {\n color: #1d4ed8;\n }\n .ps-theme-light .ps-native-code .hljs-comment {\n color: #64748b;\n }\n .ps-query-residual {\n color: #d97706;\n }\n .ps-query-source-note {\n display: block;\n font-size: 10px;\n line-height: 20px;\n }\n .ps-query-owners {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: 4px 10px;\n margin-bottom: 10px;\n color: var(--ps-inspector-muted);\n font-size: 11px;\n line-height: 18px;\n }\n .ps-query-owner-name {\n color: var(--ps-inspector-text);\n font-family: var(--ps-font-mono);\n overflow-wrap: anywhere;\n }\n .ps-demand-highlights {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 1;\n }\n .ps-demand-highlight {\n position: fixed;\n box-sizing: border-box;\n border: 2px solid #60a5fa;\n background: #60a5fa16;\n pointer-events: none;\n }\n .ps-demand-highlight > span {\n position: absolute;\n top: 0;\n left: 0;\n padding: 3px 6px;\n border-radius: 0 0 3px 0;\n background: #2563eb;\n color: white;\n font:\n 11px/1.4 ui-sans-serif,\n sans-serif;\n }\n .ps-query-expression {\n font-size: 12px;\n }\n .ps-pinned-screen {\n display: flex;\n flex-direction: column;\n gap: 18px;\n padding: 18px;\n overflow: auto;\n }\n .ps-pinned-screen > * {\n flex-shrink: 0;\n }\n .ps-pinned-header,\n .ps-pinned-meta,\n .ps-pinned-status,\n .ps-pinned-attachments {\n display: flex;\n align-items: center;\n gap: 7px;\n }\n .ps-pinned-header {\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 12px;\n }\n .ps-pinned-meta {\n flex-wrap: wrap;\n gap: 14px;\n }\n .ps-pinned-header h2 {\n font-size: 14px;\n font-weight: 600;\n margin: 0 0 7px;\n }\n .ps-pinned-status,\n .ps-pinned-attachments,\n .ps-pinned-retained {\n font-size: 12px;\n color: var(--ps-inspector-muted);\n }\n .ps-pinned-status[data-state=\"ready\"] {\n color: #34b77e;\n }\n .ps-pinned-status[data-state=\"loading\"] {\n color: #cba33c;\n }\n .ps-pinned-status[data-state=\"error\"] {\n color: #ef7878;\n }\n .ps-pinned-empty {\n min-height: 180px;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n color: var(--ps-inspector-muted);\n }\n .ps-pinned-logo {\n display: block;\n width: 40px;\n height: 40px;\n }\n .ps-pinned-inputs {\n max-width: 100%;\n }\n .ps-query-document {\n font-size: 12px;\n min-width: 0;\n }\n .ps-query-input-definitions {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 12px;\n }\n .ps-query-node {\n border: 1px solid var(--ps-border);\n border-radius: 10px;\n background: var(--ps-surface);\n min-width: 0;\n }\n .ps-query-node > summary {\n padding: 10px 12px;\n }\n .ps-query-node > summary .ps-disclosure-label {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 9px;\n }\n .ps-query-node-body {\n margin: 0 12px 12px 20px;\n border-left: 1px solid var(--ps-border);\n padding-left: 14px;\n }\n .ps-query-selections {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n }\n .ps-query-node-body > .ps-query-selections {\n margin-top: 12px;\n }\n .ps-query-relation,\n .ps-query-relation-origin,\n .ps-query-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n }\n .ps-query-relation {\n display: flex;\n flex-wrap: wrap;\n gap: 6px 8px;\n min-height: 30px;\n }\n .ps-query-relation-origin {\n flex-wrap: wrap;\n color: var(--ps-inspector-text);\n }\n .ps-query-relation-origin > .ps-query-field {\n border: 0;\n background: none;\n padding: 0;\n color: var(--ps-inspector-muted);\n }\n .ps-query-relation-origin > .ps-query-field::before {\n content: \"(\";\n }\n .ps-query-relation-origin > .ps-query-field::after {\n content: \")\";\n }\n .ps-query-link {\n padding: 3px 7px;\n border: 1px solid #a78bfa40;\n border-radius: 5px;\n background: #a78bfa12;\n color: #c4b5fd;\n overflow-wrap: anywhere;\n }\n .ps-query-link > svg {\n flex-shrink: 0;\n }\n .ps-query-selection {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 7px;\n min-height: 25px;\n }\n .ps-query-output {\n font: 600 11px/1.5 var(--ps-font-mono);\n color: var(--ps-inspector-text);\n overflow-wrap: anywhere;\n }\n .ps-query-binding {\n color: var(--ps-inspector-muted);\n font-size: 10px;\n }\n .ps-query-cardinality {\n border: 1px solid var(--ps-border);\n border-radius: 5px;\n padding: 1px 5px;\n color: var(--ps-inspector-muted);\n font: 10px/1.5 var(--ps-font-mono);\n }\n .ps-query-selection-case {\n border-left: 1px solid #a78bfa40;\n padding-left: 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .ps-query-sentence {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: 8px;\n }\n .ps-query-subject {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n min-height: 26px;\n color: var(--ps-inspector-text);\n }\n .ps-query-object-icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n }\n .ps-query-keyword,\n .ps-query-operator {\n color: var(--ps-inspector-muted);\n }\n .ps-query-sentence > .ps-query-keyword {\n display: inline-flex;\n align-items: center;\n min-height: 26px;\n }\n .ps-query-comparison,\n .ps-query-values,\n .ps-query-clause {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 7px;\n min-height: 26px;\n }\n .ps-query-field,\n .ps-query-literal {\n display: inline-block;\n padding: 2px 7px;\n max-width: 100%;\n overflow-wrap: anywhere;\n font:\n 11px/1.5 ui-monospace,\n monospace;\n }\n .ps-query-field {\n border: 1px solid #60a5fa40;\n border-radius: 3px;\n color: #93c5fd;\n background: #60a5fa12;\n }\n .ps-query-literal {\n border: 1px solid #34d39930;\n border-radius: 12px;\n color: #6ee7b7;\n background: #34d3990c;\n }\n .ps-query-operator {\n padding: 0 2px;\n font:\n 11px/1.5 ui-monospace,\n monospace;\n }\n .ps-query-group {\n display: flex;\n align-items: flex-start;\n gap: 9px;\n }\n .ps-query-sentence > .ps-query-group {\n flex-basis: 100%;\n margin-left: 20px;\n margin-top: 2px;\n }\n .ps-query-connector {\n padding: 5px 0;\n color: #c4b5fd;\n font:\n 10px/1.5 ui-monospace,\n monospace;\n min-width: 23px;\n }\n .ps-query-branches {\n border-left: 1px solid #a78bfa40;\n padding-left: 12px;\n display: flex;\n flex-direction: column;\n gap: 5px;\n min-width: 0;\n }\n .ps-query-clause {\n margin-top: 8px;\n }\n .ps-theme-light .ps-query-field {\n color: #1d4ed8;\n background: #60a5fa0c;\n }\n .ps-theme-light .ps-query-literal {\n color: #047857;\n }\n .ps-theme-light .ps-query-connector {\n color: #7c3aed;\n }\n .ps-theme-light .ps-timeline-bar {\n color: #3730a3;\n }\n .ps-diagnostics-screen {\n position: relative;\n }\n .ps-trace-toolbar {\n gap: 16px;\n }\n .ps-trace-source {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n font-size: 11px;\n }\n .ps-trace-source > span {\n color: var(--ps-inspector-muted);\n }\n .ps-trace-source-select {\n display: inline-flex;\n align-items: center;\n position: relative;\n }\n .ps-trace-source-select > svg {\n position: absolute;\n right: 7px;\n pointer-events: none;\n color: var(--ps-inspector-muted);\n }\n .ps-trace-toolbar select {\n appearance: none;\n width: 118px;\n max-width: 180px;\n border: 1px solid var(--ps-inspector-border);\n border-radius: 4px;\n background: var(--ps-inspector-bg);\n color: inherit;\n padding: 4px 24px 4px 8px;\n font-size: 11px;\n cursor: pointer;\n }\n .ps-trace-toolbar label {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: 0;\n color: var(--ps-inspector-muted);\n font-size: 11px;\n }\n .ps-trace-toolbar > button {\n margin-left: 0;\n }\n .ps-timeline th button {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n border: 0;\n padding: 0;\n width: 100%;\n cursor: pointer;\n background: transparent;\n color: inherit;\n font: inherit;\n }\n .ps-timeline th[aria-sort]:not([aria-sort=\"none\"]) {\n color: var(--ps-accent);\n }\n .ps-timeline th button:hover {\n color: var(--ps-accent);\n }\n .ps-timeline th {\n height: 34px;\n font-size: 11px;\n font-weight: 600;\n }\n .ps-timeline td {\n height: 30px;\n padding: 0 10px;\n }\n .ps-timeline > tbody > tr > td:first-child {\n padding: 0;\n }\n .ps-timeline th.ps-trace-numeric {\n text-align: right;\n }\n .ps-timeline th.ps-trace-numeric button {\n justify-content: flex-end;\n gap: 6px;\n }\n .ps-timeline td:nth-child(2) {\n padding: 0 10px;\n }\n .ps-timeline td:last-child {\n padding: 0 10px;\n }\n .ps-timeline-time {\n color: var(--ps-inspector-muted);\n font-variant-numeric: tabular-nums;\n font-size: 10px;\n white-space: nowrap;\n }\n .ps-timeline-name {\n display: flex;\n align-items: center;\n gap: 7px;\n font-size: 11px !important;\n height: 29px;\n }\n .ps-timeline-name > small {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .ps-trace-icon {\n flex-shrink: 0;\n color: var(--ps-muted);\n }\n .ps-trace-icon[data-outcome=\"running\"] {\n color: #38bdf8;\n }\n .ps-trace-icon[data-outcome=\"failure\"] {\n color: #fb7185;\n }\n .ps-timeline-messages {\n color: var(--ps-inspector-muted);\n font-variant-numeric: tabular-nums;\n text-align: right;\n }\n .ps-trace-status {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 10px;\n color: var(--ps-muted);\n }\n .ps-trace-status[data-outcome=\"success\"] {\n color: #6ee7b7;\n }\n .ps-trace-status[data-outcome=\"running\"] {\n color: #38bdf8;\n }\n .ps-trace-status[data-outcome=\"failure\"] {\n color: #fb7185;\n }\n .ps-trace-status[data-outcome=\"interrupted\"] {\n color: var(--ps-inspector-muted);\n }\n .ps-trace-status-dot {\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: currentColor;\n }\n .ps-timeline td:nth-child(2) {\n padding: 0 10px;\n }\n .ps-timeline-details-heading button {\n margin-left: 0;\n flex-shrink: 0;\n }\n .ps-query-special {\n padding: 2px 5px;\n border: 1px dashed var(--ps-inspector-border);\n border-radius: 3px;\n color: var(--ps-inspector-muted);\n font:\n italic 11px/1.5 ui-monospace,\n monospace;\n }\n .ps-query-wildcard {\n color: #fbbf24;\n background: #fbbf2414;\n border-radius: 2px;\n font-weight: 700;\n }\n .ps-theme-light .ps-query-wildcard {\n color: #a16207;\n }\n .ps-theme-light .ps-trace-status[data-outcome=\"success\"] {\n color: #047857;\n }\n .ps-theme-light .ps-trace-status[data-outcome=\"running\"] {\n color: #0369a1;\n }\n .ps-theme-light .ps-trace-status[data-outcome=\"failure\"] {\n color: #be123c;\n }\n .ps-timeline-details {\n position: absolute;\n z-index: 4;\n top: 36px;\n bottom: 0;\n right: 0;\n width: min(540px, 65%);\n padding: 0;\n border-top: 0;\n border-left: 1px solid var(--ps-inspector-border);\n background: var(--ps-surface);\n box-shadow: -6px 0 16px #0002;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n .ps-timeline-details-heading {\n margin: 0;\n padding: 10px 12px;\n border-bottom: 1px solid var(--ps-inspector-border);\n flex-shrink: 0;\n }\n .ps-trace-detail-body {\n min-height: 0;\n overflow: auto;\n padding: 12px;\n }\n .ps-trace-detail-body > .ps-query-expression {\n margin-top: 12px;\n }\n .ps-trace-detail-body h4 {\n display: flex;\n gap: 10px;\n font-size: 11px;\n font-weight: 500;\n margin: 16px 0 8px;\n }\n .ps-trace-detail-body h4 > span,\n .ps-trace-note {\n color: var(--ps-inspector-muted);\n font-size: 10px;\n }\n .ps-trace-waterfall,\n .ps-trace-messages {\n table-layout: fixed;\n width: 100%;\n border-collapse: collapse;\n font:\n 10px/1.5 ui-monospace,\n monospace;\n }\n .ps-trace-waterfall td,\n .ps-trace-messages td {\n border-bottom: 1px solid var(--ps-inspector-border);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .ps-trace-waterfall td:first-child {\n width: 48%;\n }\n .ps-trace-waterfall td:last-child {\n width: 65px;\n text-align: right;\n }\n .ps-trace-messages th {\n padding: 6px 0;\n text-align: left;\n color: var(--ps-inspector-muted);\n font-weight: 400;\n }\n .ps-trace-messages td {\n padding: 6px 0;\n }\n .ps-trace-messages td:first-child,\n .ps-trace-messages th:first-child {\n width: 100px;\n }\n .ps-replication-empty {\n padding: 24px 14px;\n color: var(--ps-inspector-muted);\n }\n .ps-replication-error {\n margin: 0;\n border-bottom: 1px solid #ef444433;\n padding: 8px 12px;\n color: #fca5a5;\n font-size: 11px;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n}\n\n@layer components {\n .ps-query-step-note b {\n color: var(--ps-inspector-text);\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n }\n .ps-schema {\n position: relative;\n height: 100%;\n width: 100%;\n min-height: 0;\n color: var(--ps-text);\n background: var(--ps-bg);\n }\n .ps-theme-light .ps-schema {\n color: var(--ps-text);\n background: var(--ps-bg);\n }\n .ps-schema .react-flow {\n --xy-background-color-default: var(--ps-bg);\n --xy-controls-button-background-color-hover-default: var(--ps-raised);\n --xy-edge-stroke-default: var(--ps-muted);\n --xy-edge-stroke-selected-default: #fb7185;\n --xy-edge-label-color-default: var(--ps-text);\n --xy-edge-label-background-color-default: var(--ps-surface);\n --xy-controls-button-background-color-default: var(--ps-surface);\n --xy-controls-button-color-default: var(--ps-text);\n --xy-controls-button-border-color-default: var(--ps-border);\n --xy-background-pattern-dots-color-default: #35353e;\n }\n .ps-theme-light .ps-schema .react-flow {\n --xy-edge-stroke-default: var(--ps-muted);\n --xy-edge-label-color-default: var(--ps-text);\n --xy-edge-label-background-color-default: var(--ps-surface);\n --xy-controls-button-background-color-default: var(--ps-surface);\n --xy-controls-button-color-default: var(--ps-text);\n --xy-controls-button-border-color-default: var(--ps-border);\n --xy-background-pattern-dots-color-default: #dedee3;\n }\n .ps-schema-card {\n width: 230px;\n height: 176px;\n border: 1px solid var(--ps-border);\n border-radius: 7px;\n background: var(--ps-surface);\n box-shadow: var(--ps-shadow);\n font:\n 12px/1.5 ui-sans-serif,\n system-ui,\n sans-serif;\n overflow: hidden;\n }\n .ps-schema .react-flow__node.selected .ps-schema-card {\n border-color: #fb7185;\n box-shadow: 0 0 0 1px #fb71854d;\n }\n .ps-schema-card header {\n display: flex;\n gap: 8px;\n align-items: center;\n padding: 11px 12px 1px;\n }\n .ps-schema-card header strong {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .ps-schema-card header > span {\n margin-left: auto;\n color: var(--ps-muted);\n font-size: 10px;\n }\n .ps-schema-object-icon {\n width: 17px;\n height: 17px;\n flex-shrink: 0;\n }\n .ps-schema-card > code {\n display: block;\n padding: 0 12px 8px;\n font-size: 10px;\n color: var(--ps-muted);\n border-bottom: 1px solid var(--ps-border);\n }\n .ps-schema-preview {\n padding: 5px 12px;\n }\n .ps-schema-preview > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 4px 0;\n font-size: 11px;\n }\n .ps-schema-preview > div > span {\n display: flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .ps-schema-preview svg {\n color: #fbbf24;\n flex-shrink: 0;\n }\n .ps-schema-preview small {\n max-width: 84px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--ps-muted);\n font-size: 9px;\n }\n .ps-schema-card footer {\n padding: 0 12px;\n color: var(--ps-muted);\n font-size: 10px;\n }\n .ps-schema .react-flow__handle {\n width: 6px;\n height: 6px;\n background: #71717a;\n border: 1px solid #18181b;\n }\n .ps-theme-light .ps-schema-card {\n background: var(--ps-surface);\n border-color: var(--ps-border);\n }\n .ps-theme-light .ps-schema-preview small {\n color: var(--ps-muted);\n }\n .ps-schema-details {\n position: absolute;\n z-index: 6;\n right: 0;\n top: 0;\n height: 100%;\n width: min(360px, 55%);\n background: var(--ps-surface);\n border-left: 1px solid var(--ps-border);\n box-shadow: -6px 0 20px #0002;\n display: flex;\n flex-direction: column;\n }\n .ps-theme-light .ps-schema-details {\n background: var(--ps-surface);\n border-color: var(--ps-border);\n }\n .ps-schema-details header {\n display: flex;\n gap: 9px;\n align-items: center;\n padding: 10px 12px;\n border-bottom: 1px solid var(--ps-border);\n font-size: 12px;\n }\n .ps-schema-details header button {\n border: 0;\n background: transparent;\n color: inherit;\n display: flex;\n padding: 0;\n cursor: pointer;\n }\n .ps-schema-detail-body {\n min-height: 0;\n overflow: auto;\n padding: 12px;\n }\n .ps-schema-detail-body code {\n color: var(--ps-muted);\n font-size: 10px;\n }\n .ps-schema-detail-body table {\n width: 100%;\n border-collapse: collapse;\n font-size: 11px;\n margin-top: 14px;\n }\n .ps-schema-detail-body th {\n text-align: left;\n color: var(--ps-muted);\n font-weight: 500;\n font-size: 10px;\n }\n .ps-schema-detail-body td {\n padding: 7px 0;\n border-bottom: 1px solid var(--ps-border);\n }\n .ps-schema-detail-body td:first-child > span {\n display: flex;\n align-items: center;\n gap: 5px;\n }\n .ps-schema-detail-body td code {\n display: block;\n font-size: 9px;\n }\n .ps-schema-detail-body td:last-child {\n text-align: right;\n color: var(--ps-muted);\n padding-left: 8px;\n }\n .ps-schema-detail-body h4 {\n margin: 18px 0 8px;\n font-size: 11px;\n font-weight: 500;\n }\n .ps-schema-relationship {\n display: flex;\n flex-direction: column;\n gap: 3px;\n padding: 8px 0;\n border-bottom: 1px solid var(--ps-border);\n font-size: 10px;\n }\n .ps-schema-relationship strong {\n font-size: 11px;\n font-weight: 500;\n }\n .ps-schema-relationship span {\n color: var(--ps-muted);\n }\n .ps-schema-empty {\n display: grid;\n place-items: center;\n height: 100%;\n color: var(--ps-muted);\n }\n}\n\n@layer components {\n .ps-trace-toolbar {\n gap: 10px;\n }\n .ps-trace-toolbar-separator {\n width: 1px;\n height: 16px;\n background: var(--ps-inspector-border);\n flex-shrink: 0;\n }\n .ps-timeline > tbody > tr > td:last-child {\n padding: 0;\n }\n}\n\n@layer components {\n .ps-devtools .ps-trace-source-select > select {\n background: var(--ps-inspector-bg);\n border-color: var(--ps-inspector-border);\n color: var(--ps-inspector-text);\n color-scheme: dark;\n border-radius: 3px;\n }\n .ps-devtools.ps-theme-light .ps-trace-source-select > select {\n color-scheme: light;\n }\n .ps-devtools .ps-trace-source-select > select:hover {\n border-color: var(--ps-inspector-muted);\n }\n .ps-devtools .ps-trace-source-select > select:focus-visible {\n outline: 2px solid var(--ps-inspector-muted);\n outline-offset: 2px;\n }\n .ps-storage-content {\n overflow: auto;\n padding: 20px;\n }\n .ps-storage-summary {\n padding: 16px;\n background: var(--ps-surface);\n border: 1px solid var(--ps-border);\n border-radius: 8px;\n }\n .ps-storage-summary + .ps-storage-summary {\n margin-top: 20px;\n }\n .ps-trace-toolbar select[aria-label=\"Storage view\"] {\n width: 190px;\n }\n .ps-storage-chart {\n margin: 0;\n }\n .ps-storage-footnote {\n margin-top: 18px;\n }\n .ps-storage-budget-note {\n color: var(--ps-muted);\n margin: 12px 0 0;\n }\n .ps-storage-heading {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 16px;\n margin-bottom: 16px;\n }\n .ps-storage-heading h2 {\n margin: 0;\n }\n .ps-storage-heading > strong {\n font-variant-numeric: tabular-nums;\n color: var(--ps-muted);\n font-size: 14px;\n }\n .ps-storage-bar {\n position: relative;\n margin: 0;\n display: flex;\n height: 24px;\n overflow: hidden;\n border-radius: 5px;\n background: var(--ps-border);\n }\n .ps-storage-free {\n display: grid;\n place-items: center;\n color: var(--ps-muted);\n background: var(--ps-hover);\n font-size: 11px;\n white-space: nowrap;\n }\n .ps-storage-target {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--ps-inspector-text);\n }\n .ps-storage-bar > span {\n border-right: 1px solid var(--ps-surface);\n }\n .ps-storage-legend {\n display: flex;\n flex-wrap: wrap;\n gap: 10px 20px;\n margin-top: 12px;\n color: var(--ps-muted);\n }\n .ps-storage-legend > button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n .ps-storage-legend > button {\n border: 0;\n padding: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: pointer;\n }\n .ps-storage-bar > span {\n transition: opacity 120ms;\n flex-shrink: 0;\n }\n .ps-storage-bar > span[data-dimmed=\"true\"] {\n opacity: 0.18;\n }\n .ps-storage-legend i {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n }\n .ps-storage-legend strong {\n color: var(--ps-inspector-text);\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n }\n .ps-storage-content h2 {\n margin: 0 0 12px;\n font-size: 13px;\n font-weight: 600;\n }\n .ps-storage-content h2:not(:first-child) {\n margin-top: 24px;\n }\n .ps-storage-note {\n color: var(--ps-muted);\n font-size: 12px;\n line-height: 1.6;\n }\n .ps-storage-over {\n color: var(--ps-accent);\n font-size: 12px;\n line-height: 1.6;\n margin-bottom: 0;\n }\n .ps-devtools .ps-trace-source-select option {\n background: var(--ps-inspector-bg);\n color: var(--ps-inspector-text);\n }\n}\n\n@layer components {\n .ps-pinned-remove {\n flex-shrink: 0;\n padding: 6px 10px;\n border: 1px solid var(--ps-border);\n border-radius: 7px;\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: pointer;\n transition: background 180ms ease;\n }\n .ps-pinned-remove:hover {\n background: color-mix(in srgb, currentColor 8%, transparent);\n }\n .ps-pinned-header {\n justify-content: space-between;\n gap: 16px;\n }\n .ps-pinned-screen {\n border-bottom: 1px solid var(--ps-border);\n }\n}\n\n@layer components {\n .ps-pinned-inventory {\n height: 100%;\n min-height: 0;\n overflow: auto;\n }\n .ps-pinned-inventory .ps-pinned-screen {\n height: auto;\n min-height: 0;\n overflow: visible;\n }\n}\n\n@layer components {\n .ps-pin-revision {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n }\n .ps-pin-downloads {\n border: 1px solid var(--ps-border);\n border-radius: 9px;\n }\n .ps-pin-download {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 14px;\n padding: 12px;\n }\n .ps-pin-download + .ps-pin-download {\n border-top: 1px solid var(--ps-border);\n }\n .ps-pin-inputs {\n flex: 1;\n min-width: 160px;\n overflow-wrap: anywhere;\n }\n .ps-pin-download .ps-pinned-status {\n white-space: nowrap;\n }\n .ps-pin-download .ps-pinned-status[data-state=\"loading\"] svg {\n animation: ps-pin-spin 1.2s linear infinite;\n }\n @keyframes ps-pin-spin {\n to {\n transform: rotate(360deg);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .ps-pin-download .ps-pinned-status[data-state=\"loading\"] svg {\n animation: none;\n }\n }\n}\n"],"mappings":";AAAA,IAAA,iBAAe"}
@@ -0,0 +1,15 @@
1
+ import { PerformanceSpan } from "./traceWaterfall.js";
2
+ //#region src/traceTimeline.d.ts
3
+ export declare const spanKey: (span: Pick<PerformanceSpan, "id" | "traceId">) => string;
4
+ export declare const isSubscription: (span: PerformanceSpan) => boolean;
5
+ export declare const traceStatus: (span: PerformanceSpan) => "Cancelled" | "Closed" | "Failed" | "Open" | "Running" | "Stopped" | "Success";
6
+ /** Trace-qualified hierarchy for the operation table, independent of the selected waterfall. */
7
+ export declare function operationRows(spans: readonly PerformanceSpan[], now: number): {
8
+ span: import("@party-stack/runtime/tracing").TraceRecord;
9
+ depth: number;
10
+ durationMs: number;
11
+ }[];
12
+ /** Selection is a subtree, not every operation sharing a trace ID. */
13
+ export declare function spanSubtree(spans: readonly PerformanceSpan[], root: PerformanceSpan): import("@party-stack/runtime/tracing").TraceRecord[];
14
+ //#endregion
15
+ //# sourceMappingURL=traceTimeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceTimeline.d.ts","names":[],"sources":["../src/traceTimeline.ts"],"mappings":";;qBAGa,UAAO,MAAU,KAAK;qBACtB,iBAAc,MAAU;qBACxB,cAAW,MAAU;;wBAgBlB,cAAc,gBAAgB,mBAAmB;;;;;;wBAuBjD,YAAY,gBAAgB,mBAAmB,MAAM,yDAAe"}
@@ -0,0 +1,36 @@
1
+ import { traceWaterfall } from "./traceWaterfall.js";
2
+ //#region src/traceTimeline.ts
3
+ const spanKey = (span) => `${span.traceId}:${span.id}`;
4
+ const isSubscription = (span) => span.attributes.activity === "subscription";
5
+ const traceStatus = (span) => span.outcome === "running" ? isSubscription(span) ? "Open" : "Running" : span.outcome === "success" ? isSubscription(span) ? "Closed" : "Success" : span.outcome === "interrupted" ? isSubscription(span) ? "Stopped" : "Cancelled" : "Failed";
6
+ /** Trace-qualified hierarchy for the operation table, independent of the selected waterfall. */
7
+ function operationRows(spans, now) {
8
+ const originals = new Map(spans.map((span) => [spanKey(span), span]));
9
+ return traceWaterfall(spans.map((span) => {
10
+ const parent = span.parentId ? `${span.traceId}:${span.parentId}` : void 0;
11
+ return {
12
+ ...span,
13
+ id: spanKey(span),
14
+ parentId: isSubscription(span) || parent && isSubscription(originals.get(parent) ?? span) ? void 0 : parent
15
+ };
16
+ }), now).rows.map((row) => ({
17
+ span: originals.get(row.span.id),
18
+ depth: row.depth,
19
+ durationMs: row.duration
20
+ }));
21
+ }
22
+ /** Selection is a subtree, not every operation sharing a trace ID. */
23
+ function spanSubtree(spans, root) {
24
+ const ids = /* @__PURE__ */ new Set([root.id]);
25
+ const candidates = spans.filter((span) => span.traceId === root.traceId);
26
+ let size = 0;
27
+ while (size !== ids.size) {
28
+ size = ids.size;
29
+ for (const span of candidates) if (span.parentId && ids.has(span.parentId)) ids.add(span.id);
30
+ }
31
+ return candidates.filter((span) => ids.has(span.id));
32
+ }
33
+ //#endregion
34
+ export { isSubscription, operationRows, spanKey, spanSubtree, traceStatus };
35
+
36
+ //# sourceMappingURL=traceTimeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceTimeline.js","names":[],"sources":["../src/traceTimeline.ts"],"sourcesContent":["import { traceWaterfall } from \"./traceWaterfall.js\";\nimport type { PerformanceSpan } from \"./traceWaterfall.js\";\n\nexport const spanKey = (span: Pick<PerformanceSpan, \"id\" | \"traceId\">) => `${span.traceId}:${span.id}`;\nexport const isSubscription = (span: PerformanceSpan) => span.attributes.activity === \"subscription\";\nexport const traceStatus = (span: PerformanceSpan) =>\n span.outcome === \"running\"\n ? isSubscription(span)\n ? \"Open\"\n : \"Running\"\n : span.outcome === \"success\"\n ? isSubscription(span)\n ? \"Closed\"\n : \"Success\"\n : span.outcome === \"interrupted\"\n ? isSubscription(span)\n ? \"Stopped\"\n : \"Cancelled\"\n : \"Failed\";\n\n/** Trace-qualified hierarchy for the operation table, independent of the selected waterfall. */\nexport function operationRows(spans: readonly PerformanceSpan[], now: number) {\n const originals = new Map(spans.map((span) => [spanKey(span), span]));\n const chart = traceWaterfall(\n spans.map((span) => {\n const parent = span.parentId ? `${span.traceId}:${span.parentId}` : undefined;\n return {\n ...span,\n id: spanKey(span),\n parentId:\n isSubscription(span) || (parent && isSubscription(originals.get(parent) ?? span))\n ? undefined\n : parent,\n };\n }),\n now\n );\n return chart.rows.map((row) => ({\n span: originals.get(row.span.id)!,\n depth: row.depth,\n durationMs: row.duration,\n }));\n}\n/** Selection is a subtree, not every operation sharing a trace ID. */\nexport function spanSubtree(spans: readonly PerformanceSpan[], root: PerformanceSpan) {\n const ids = new Set([root.id]);\n const candidates = spans.filter((span) => span.traceId === root.traceId);\n let size = 0;\n while (size !== ids.size) {\n size = ids.size;\n for (const span of candidates) if (span.parentId && ids.has(span.parentId)) ids.add(span.id);\n }\n return candidates.filter((span) => ids.has(span.id));\n}\n"],"mappings":";;AAGA,MAAa,WAAW,SAAkD,GAAG,KAAK,QAAQ,GAAG,KAAK;AAClG,MAAa,kBAAkB,SAA0B,KAAK,WAAW,aAAa;AACtF,MAAa,eAAe,SACxB,KAAK,YAAY,YACX,eAAe,IAAI,IACf,SACA,YACJ,KAAK,YAAY,YACf,eAAe,IAAI,IACf,WACA,YACJ,KAAK,YAAY,gBACf,eAAe,IAAI,IACf,YACA,cACJ;;AAGd,SAAgB,cAAc,OAAmC,KAAa;CAC1E,MAAM,YAAY,IAAI,IAAI,MAAM,KAAK,SAAS,CAAC,QAAQ,IAAI,GAAG,IAAI,CAAC,CAAC;CAepE,OAdc,eACV,MAAM,KAAK,SAAS;EAChB,MAAM,SAAS,KAAK,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,aAAa,KAAA;EACpE,OAAO;GACH,GAAG;GACH,IAAI,QAAQ,IAAI;GAChB,UACI,eAAe,IAAI,KAAM,UAAU,eAAe,UAAU,IAAI,MAAM,KAAK,IAAI,IACzE,KAAA,IACA;EACd;CACJ,CAAC,GACD,GAEO,CAAC,CAAC,KAAK,KAAK,SAAS;EAC5B,MAAM,UAAU,IAAI,IAAI,KAAK,EAAE;EAC/B,OAAO,IAAI;EACX,YAAY,IAAI;CACpB,EAAE;AACN;;AAEA,SAAgB,YAAY,OAAmC,MAAuB;CAClF,MAAM,sBAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;CAC7B,MAAM,aAAa,MAAM,QAAQ,SAAS,KAAK,YAAY,KAAK,OAAO;CACvE,IAAI,OAAO;CACX,OAAO,SAAS,IAAI,MAAM;EACtB,OAAO,IAAI;EACX,KAAK,MAAM,QAAQ,YAAY,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,QAAQ,GAAG,IAAI,IAAI,KAAK,EAAE;CAC/F;CACA,OAAO,WAAW,QAAQ,SAAS,IAAI,IAAI,KAAK,EAAE,CAAC;AACvD"}
@@ -0,0 +1,25 @@
1
+ import { LiveOntology } from "@party-stack/ontology";
2
+ //#region src/traceWaterfall.d.ts
3
+ export type PerformanceSpan = ReturnType<NonNullable<LiveOntology["traces"]>["getSnapshot"]>[number];
4
+ export declare function groupTraces(spans: readonly PerformanceSpan[]): {
5
+ id: string;
6
+ spans: import("@party-stack/runtime/tracing").TraceRecord[];
7
+ name: string;
8
+ startedAt: number;
9
+ failed: boolean;
10
+ running: boolean;
11
+ }[];
12
+ /** Keeps gaps and overlapping children on the same clock; evicted parents become visible roots. */
13
+ export declare function traceWaterfall(spans: readonly PerformanceSpan[], now: number): {
14
+ start: number;
15
+ duration: number;
16
+ rows: {
17
+ span: PerformanceSpan;
18
+ depth: number;
19
+ offset: number;
20
+ duration: number;
21
+ self: number;
22
+ }[];
23
+ };
24
+ //#endregion
25
+ //# sourceMappingURL=traceWaterfall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceWaterfall.d.ts","names":[],"sources":["../src/traceWaterfall.ts"],"mappings":";;YAEY,kBAAkB,WAAW,YAAY;wBACrC,YAAY,gBAAgB;;;;;;;;;wBAwB5B,eAAe,gBAAgB,mBAAmB;;;;IAe1C,MAAA;IAAwB;IAAgB;IAAkB;IAAc"}
@@ -0,0 +1,70 @@
1
+ //#region src/traceWaterfall.ts
2
+ function groupTraces(spans) {
3
+ const groups = /* @__PURE__ */ new Map();
4
+ for (const span of spans) {
5
+ const group = groups.get(span.traceId) ?? [];
6
+ group.push(span);
7
+ groups.set(span.traceId, group);
8
+ }
9
+ return [...groups.entries()].map(([id, spans]) => {
10
+ const ids = new Set(spans.map((span) => span.id));
11
+ return {
12
+ id,
13
+ spans,
14
+ name: (spans.find((span) => !span.parentId || !ids.has(span.parentId)) ?? spans[0]).name,
15
+ startedAt: Math.min(...spans.map((span) => span.startedAt)),
16
+ failed: spans.some((span) => span.outcome === "failure"),
17
+ running: spans.some((span) => span.outcome === "running")
18
+ };
19
+ }).sort((a, b) => b.startedAt - a.startedAt);
20
+ }
21
+ /** Keeps gaps and overlapping children on the same clock; evicted parents become visible roots. */
22
+ function traceWaterfall(spans, now) {
23
+ const endOf = (span) => span.startedAt + (span.outcome === "running" ? Math.max(0, now - span.startedAt) : span.durationMs);
24
+ const start = spans.length ? Math.min(...spans.map((span) => span.startedAt)) : 0;
25
+ const end = spans.length ? Math.max(...spans.map(endOf)) : start;
26
+ const duration = Math.max(end - start, .001);
27
+ const ids = new Set(spans.map((span) => span.id));
28
+ const children = /* @__PURE__ */ new Map();
29
+ for (const span of spans) {
30
+ const parent = span.parentId && ids.has(span.parentId) ? span.parentId : "";
31
+ const list = children.get(parent) ?? [];
32
+ list.push(span);
33
+ children.set(parent, list);
34
+ }
35
+ for (const list of children.values()) list.sort((a, b) => a.startedAt - b.startedAt);
36
+ const rows = [];
37
+ const visited = /* @__PURE__ */ new Set();
38
+ const visit = (span, depth) => {
39
+ if (visited.has(span.id)) return;
40
+ visited.add(span.id);
41
+ const nested = children.get(span.id) ?? [];
42
+ const intervals = nested.map((child) => [Math.max(span.startedAt, child.startedAt), Math.min(endOf(span), endOf(child))]).filter(([a, b]) => b > a).sort((a, b) => a[0] - b[0]);
43
+ let covered = 0;
44
+ let until = span.startedAt;
45
+ for (const [a, b] of intervals) {
46
+ covered += Math.max(0, b - Math.max(a, until));
47
+ until = Math.max(until, b);
48
+ }
49
+ const elapsed = Math.max(0, endOf(span) - span.startedAt);
50
+ rows.push({
51
+ span,
52
+ depth,
53
+ offset: span.startedAt - start,
54
+ duration: elapsed,
55
+ self: Math.max(0, elapsed - covered)
56
+ });
57
+ for (const child of nested) visit(child, depth + 1);
58
+ };
59
+ for (const root of children.get("") ?? []) visit(root, 0);
60
+ for (const span of spans) if (!visited.has(span.id)) visit(span, 0);
61
+ return {
62
+ start,
63
+ duration,
64
+ rows
65
+ };
66
+ }
67
+ //#endregion
68
+ export { groupTraces, traceWaterfall };
69
+
70
+ //# sourceMappingURL=traceWaterfall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceWaterfall.js","names":[],"sources":["../src/traceWaterfall.ts"],"sourcesContent":["import type { LiveOntology } from \"@party-stack/ontology\";\n\nexport type PerformanceSpan = ReturnType<NonNullable<LiveOntology[\"traces\"]>[\"getSnapshot\"]>[number];\nexport function groupTraces(spans: readonly PerformanceSpan[]) {\n const groups = new Map<string, PerformanceSpan[]>();\n for (const span of spans) {\n const group = groups.get(span.traceId) ?? [];\n group.push(span);\n groups.set(span.traceId, group);\n }\n return [...groups.entries()]\n .map(([id, spans]) => {\n const ids = new Set(spans.map((span) => span.id));\n const root = spans.find((span) => !span.parentId || !ids.has(span.parentId)) ?? spans[0]!;\n return {\n id,\n spans,\n name: root.name,\n startedAt: Math.min(...spans.map((span) => span.startedAt)),\n failed: spans.some((span) => span.outcome === \"failure\"),\n running: spans.some((span) => span.outcome === \"running\"),\n };\n })\n .sort((a, b) => b.startedAt - a.startedAt);\n}\n\n/** Keeps gaps and overlapping children on the same clock; evicted parents become visible roots. */\nexport function traceWaterfall(spans: readonly PerformanceSpan[], now: number) {\n const endOf = (span: PerformanceSpan) =>\n span.startedAt + (span.outcome === \"running\" ? Math.max(0, now - span.startedAt) : span.durationMs);\n const start = spans.length ? Math.min(...spans.map((span) => span.startedAt)) : 0;\n const end = spans.length ? Math.max(...spans.map(endOf)) : start;\n const duration = Math.max(end - start, 0.001);\n const ids = new Set(spans.map((span) => span.id));\n const children = new Map<string, PerformanceSpan[]>();\n for (const span of spans) {\n const parent = span.parentId && ids.has(span.parentId) ? span.parentId : \"\";\n const list = children.get(parent) ?? [];\n list.push(span);\n children.set(parent, list);\n }\n for (const list of children.values()) list.sort((a, b) => a.startedAt - b.startedAt);\n const rows: { span: PerformanceSpan; depth: number; offset: number; duration: number; self: number }[] =\n [];\n const visited = new Set<string>();\n const visit = (span: PerformanceSpan, depth: number) => {\n if (visited.has(span.id)) return;\n visited.add(span.id);\n const nested = children.get(span.id) ?? [];\n const intervals = nested\n .map(\n (child) =>\n [Math.max(span.startedAt, child.startedAt), Math.min(endOf(span), endOf(child))] as const\n )\n .filter(([a, b]) => b > a)\n .sort((a, b) => a[0] - b[0]);\n let covered = 0;\n let until = span.startedAt;\n for (const [a, b] of intervals) {\n covered += Math.max(0, b - Math.max(a, until));\n until = Math.max(until, b);\n }\n const elapsed = Math.max(0, endOf(span) - span.startedAt);\n rows.push({\n span,\n depth,\n offset: span.startedAt - start,\n duration: elapsed,\n self: Math.max(0, elapsed - covered),\n });\n for (const child of nested) visit(child, depth + 1);\n };\n for (const root of children.get(\"\") ?? []) visit(root, 0);\n // A damaged or partial buffer must not hide spans or recurse indefinitely.\n for (const span of spans) if (!visited.has(span.id)) visit(span, 0);\n return { start, duration, rows };\n}\n"],"mappings":";AAGA,SAAgB,YAAY,OAAmC;CAC3D,MAAM,yBAAS,IAAI,IAA+B;CAClD,KAAK,MAAM,QAAQ,OAAO;EACtB,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,KAAK,CAAC;EAC3C,MAAM,KAAK,IAAI;EACf,OAAO,IAAI,KAAK,SAAS,KAAK;CAClC;CACA,OAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC,CACvB,KAAK,CAAC,IAAI,WAAW;EAClB,MAAM,MAAM,IAAI,IAAI,MAAM,KAAK,SAAS,KAAK,EAAE,CAAC;EAEhD,OAAO;GACH;GACA;GACA,OAJS,MAAM,MAAM,SAAS,CAAC,KAAK,YAAY,CAAC,IAAI,IAAI,KAAK,QAAQ,CAAC,KAAK,MAAM,GAAA,CAIvE;GACX,WAAW,KAAK,IAAI,GAAG,MAAM,KAAK,SAAS,KAAK,SAAS,CAAC;GAC1D,QAAQ,MAAM,MAAM,SAAS,KAAK,YAAY,SAAS;GACvD,SAAS,MAAM,MAAM,SAAS,KAAK,YAAY,SAAS;EAC5D;CACJ,CAAC,CAAC,CACD,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AACjD;;AAGA,SAAgB,eAAe,OAAmC,KAAa;CAC3E,MAAM,SAAS,SACX,KAAK,aAAa,KAAK,YAAY,YAAY,KAAK,IAAI,GAAG,MAAM,KAAK,SAAS,IAAI,KAAK;CAC5F,MAAM,QAAQ,MAAM,SAAS,KAAK,IAAI,GAAG,MAAM,KAAK,SAAS,KAAK,SAAS,CAAC,IAAI;CAChF,MAAM,MAAM,MAAM,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI;CAC3D,MAAM,WAAW,KAAK,IAAI,MAAM,OAAO,IAAK;CAC5C,MAAM,MAAM,IAAI,IAAI,MAAM,KAAK,SAAS,KAAK,EAAE,CAAC;CAChD,MAAM,2BAAW,IAAI,IAA+B;CACpD,KAAK,MAAM,QAAQ,OAAO;EACtB,MAAM,SAAS,KAAK,YAAY,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,WAAW;EACzE,MAAM,OAAO,SAAS,IAAI,MAAM,KAAK,CAAC;EACtC,KAAK,KAAK,IAAI;EACd,SAAS,IAAI,QAAQ,IAAI;CAC7B;CACA,KAAK,MAAM,QAAQ,SAAS,OAAO,GAAG,KAAK,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;CACnF,MAAM,OACF,CAAC;CACL,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,SAAS,MAAuB,UAAkB;EACpD,IAAI,QAAQ,IAAI,KAAK,EAAE,GAAG;EAC1B,QAAQ,IAAI,KAAK,EAAE;EACnB,MAAM,SAAS,SAAS,IAAI,KAAK,EAAE,KAAK,CAAC;EACzC,MAAM,YAAY,OACb,KACI,UACG,CAAC,KAAK,IAAI,KAAK,WAAW,MAAM,SAAS,GAAG,KAAK,IAAI,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,CAAC,CACvF,CAAC,CACA,QAAQ,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CACzB,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;EAC/B,IAAI,UAAU;EACd,IAAI,QAAQ,KAAK;EACjB,KAAK,MAAM,CAAC,GAAG,MAAM,WAAW;GAC5B,WAAW,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,KAAK,CAAC;GAC7C,QAAQ,KAAK,IAAI,OAAO,CAAC;EAC7B;EACA,MAAM,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,IAAI,KAAK,SAAS;EACxD,KAAK,KAAK;GACN;GACA;GACA,QAAQ,KAAK,YAAY;GACzB,UAAU;GACV,MAAM,KAAK,IAAI,GAAG,UAAU,OAAO;EACvC,CAAC;EACD,KAAK,MAAM,SAAS,QAAQ,MAAM,OAAO,QAAQ,CAAC;CACtD;CACA,KAAK,MAAM,QAAQ,SAAS,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,MAAM,CAAC;CAExD,KAAK,MAAM,QAAQ,OAAO,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC;CAClE,OAAO;EAAE;EAAO;EAAU;CAAK;AACnC"}
@@ -0,0 +1,5 @@
1
+ import { TypeDef } from "@party-stack/ontology";
2
+ //#region src/typeDisplayName.d.ts
3
+ export declare function typeDisplayName(type: TypeDef): string;
4
+ //#endregion
5
+ //# sourceMappingURL=typeDisplayName.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeDisplayName.d.ts","names":[],"sources":["../src/typeDisplayName.ts"],"mappings":";;wBAEgB,gBAAgB,MAAM"}