@pipelex/mthds-ui 0.25.0 → 0.26.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.
@@ -2,7 +2,7 @@ import { FieldEnv } from '@pipelex/mthds-form/react';
2
2
  export * from '@pipelex/mthds-form/react';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { ValidationMessageKey, PipeIOContract, RunField, RunInputError, PipeInputFormDescriptor } from '@pipelex/mthds-form';
5
- import { G as GraphTheme } from '../../types-Bcsh7Z0U.js';
5
+ import { G as GraphTheme } from '../../types-DgqW3Jg4.js';
6
6
 
7
7
  /**
8
8
  * The panel's submit path, kept React-free.
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import {
3
3
  getPaletteForTheme
4
- } from "../../chunk-MQ33HVWG.js";
4
+ } from "../../chunk-XBHDA3PQ.js";
5
5
  import {
6
6
  GRAPH_THEME
7
- } from "../../chunk-F3GBNU2I.js";
7
+ } from "../../chunk-VCO4GZDZ.js";
8
8
  import {
9
9
  __spreadProps,
10
10
  __spreadValues
@@ -1,5 +1,5 @@
1
- import { p as GraphSpecNode, r as PipeCallNode, b as GraphSpec, D as DataflowAnalysis, C as ConceptInfo, P as PipeBlueprintUnion, s as GraphData, o as GraphSpecMode, t as PipeCardPayload, m as FoldToggleOptions, e as GraphNode, d as GraphEdge, c as GraphNodeData, N as NodeValidationSummary, V as ValidationIssue, j as GraphSpecNodeIoItem, g as GraphDirection, u as LayoutConfig, f as GraphConfig, T as ToolbarPosition, G as GraphTheme } from '../types-Bcsh7Z0U.js';
2
- export { A as ARROW_CLOSED_MARKER, v as CONTROLLER_PADDING_BOTTOM, w as CONTROLLER_PADDING_TOP, x as CONTROLLER_PADDING_X, E as EDGE_TYPE, y as EdgeType, z as FOLD_MODE, B as FieldResolution, F as FoldMode, H as GRAPH_DIRECTION, I as GRAPH_SPEC_MODE, J as GRAPH_THEME, K as GRAPH_THEME_MODE, M as GraphSpecEdge, O as GraphSpecEdgeKind, Q as GraphSpecMeta, R as GraphSpecModelUsage, S as GraphSpecNodeError, U as GraphSpecNodeIo, W as GraphSpecNodeTiming, X as GraphSpecNodeUsage, Y as GraphSpecUsage, h as GraphThemeMode, Z as KNOWN_PIPE_TYPES, L as LabelDescriptor, _ as NODE_TYPE_CONTROLLER, $ as NODE_TYPE_PIPE_CARD, a0 as NODE_TYPE_STUFF, a1 as NodeKind, a2 as PipeBatchBlueprint, a3 as PipeBlueprintBase, a4 as PipeComposeBlueprint, a5 as PipeComposeConstructBlueprint, a6 as PipeComposeConstructField, a7 as PipeConditionBlueprint, l as PipeControllerType, a8 as PipeExtractBlueprint, a9 as PipeFuncBlueprint, aa as PipeImgGenBlueprint, ab as PipeLLMBlueprint, q as PipeOperatorType, ac as PipeParallelBlueprint, ad as PipeSearchBlueprint, ae as PipeSequenceBlueprint, af as PipeSignatureBlueprint, i as PipeStatus, ag as PipeStructureBlueprint, n as PipeType, a as PresenceMarker, ah as STUFF_ID_PREFIX, ai as StuffRole, aj as StuffSpecInfo, ak as SubPipeSpec, al as TOOLBAR_POSITION, am as TemplateBlueprint, an as ToolbarOrientation, ao as ToolbarSide, ap as VALIDATION_STATE, k as ValidationState, aq as graphSpecMode, ar as isDryGraphSpec, as as isStaticGraphSpec, at as isStuffNodeId, au as nodeHeight, av as nodeWidth, aw as stuffDigestFromId, ax as stuffNodeId, ay as toolbarOrientation, az as toolbarSide } from '../types-Bcsh7Z0U.js';
1
+ import { p as GraphSpecNode, r as PipeCallNode, b as GraphSpec, D as DataflowAnalysis, C as ConceptInfo, P as PipeBlueprintUnion, s as GraphData, o as GraphSpecMode, t as PipeCardPayload, m as FoldToggleOptions, e as GraphNode, d as GraphEdge, c as GraphNodeData, N as NodeValidationSummary, V as ValidationIssue, j as GraphSpecNodeIoItem, g as GraphDirection, u as LayoutConfig, f as GraphConfig, T as ToolbarPosition, G as GraphTheme } from '../types-DgqW3Jg4.js';
2
+ export { A as ARROW_CLOSED_MARKER, v as CONTROLLER_PADDING_BOTTOM, w as CONTROLLER_PADDING_TOP, x as CONTROLLER_PADDING_X, E as EDGE_TYPE, y as EdgeType, z as FOLD_MODE, B as FieldResolution, F as FoldMode, H as GRAPH_DIRECTION, I as GRAPH_SPEC_MODE, J as GRAPH_THEME, K as GRAPH_THEME_MODE, M as GraphSpecEdge, O as GraphSpecEdgeKind, Q as GraphSpecMeta, R as GraphSpecModelUsage, S as GraphSpecNodeError, U as GraphSpecNodeIo, W as GraphSpecNodeTiming, X as GraphSpecNodeUsage, Y as GraphSpecUsage, h as GraphThemeMode, Z as KNOWN_PIPE_TYPES, L as LabelDescriptor, _ as NODE_TYPE_CONTROLLER, $ as NODE_TYPE_PIPE_CARD, a0 as NODE_TYPE_STUFF, a1 as NodeKind, a2 as PipeBatchBlueprint, a3 as PipeBlueprintBase, a4 as PipeComposeBlueprint, a5 as PipeComposeConstructBlueprint, a6 as PipeComposeConstructField, a7 as PipeConditionBlueprint, l as PipeControllerType, a8 as PipeExtractBlueprint, a9 as PipeFuncBlueprint, aa as PipeImgGenBlueprint, ab as PipeLLMBlueprint, q as PipeOperatorType, ac as PipeParallelBlueprint, ad as PipeSearchBlueprint, ae as PipeSequenceBlueprint, af as PipeSignatureBlueprint, i as PipeStatus, ag as PipeStructureBlueprint, n as PipeType, a as PresenceMarker, ah as STUFF_ID_PREFIX, ai as StuffMultiplicity, aj as StuffRegistryEntry, ak as StuffRole, al as StuffSpecInfo, am as SubPipeSpec, an as TOOLBAR_POSITION, ao as TemplateBlueprint, ap as ToolbarOrientation, aq as ToolbarSide, ar as VALIDATION_STATE, k as ValidationState, as as graphSpecMode, at as isDryGraphSpec, au as isPluralMultiplicity, av as isStaticGraphSpec, aw as isStuffNodeId, ax as multiplicitySuffix, ay as nodeHeight, az as nodeWidth, aA as stuffDigestFromId, aB as stuffNodeId, aC as toolbarOrientation, aD as toolbarSide } from '../types-DgqW3Jg4.js';
3
3
  export { P as ParsedPipeRef, m as makePipeRef, p as parsePipeRef } from '../pipeRefs-BQJO5nh5.js';
4
4
  import { ElkNode } from 'elkjs/lib/elk-api';
5
5
 
@@ -34,9 +34,11 @@ declare class GraphSpecValidationError extends Error {
34
34
  * `GraphSpecValidationError` on the first violation.
35
35
  *
36
36
  * **Mutates the input in place:** on success it returns the *same* object
37
- * (typed as `GraphSpec`), and where a node has no `io` key it writes
37
+ * (typed as `GraphSpec`), with its normalizations written directly onto the
38
+ * passed-in object: where a node has no `io` key it writes
38
39
  * `io = { inputs: [], outputs: [] }` (and fills absent `io.inputs` /
39
- * `io.outputs` arrays) directly onto the passed-in object. Pass a fresh
40
+ * `io.outputs` arrays), and an absent unrated cost is written as `null`, so
41
+ * code downstream never meets `undefined` where the types promise `null`. Pass a fresh
40
42
  * parse result (e.g. straight from `JSON.parse`) — do not pass a frozen or
41
43
  * externally shared object.
42
44
  */
@@ -29,7 +29,7 @@ import {
29
29
  resolveConceptRef,
30
30
  resolveIssueTargetNodeId,
31
31
  validateGraphSpec
32
- } from "../chunk-LMGMRLIK.js";
32
+ } from "../chunk-K3BWHQVX.js";
33
33
  import {
34
34
  makePipeRef,
35
35
  parsePipeRef
@@ -40,7 +40,7 @@ import {
40
40
  LIGHT_PALETTE_COLORS,
41
41
  getPaletteColors,
42
42
  getPaletteForTheme
43
- } from "../chunk-MQ33HVWG.js";
43
+ } from "../chunk-XBHDA3PQ.js";
44
44
  import {
45
45
  ARROW_CLOSED_MARKER,
46
46
  CONTROLLER_PADDING_BOTTOM,
@@ -61,15 +61,17 @@ import {
61
61
  VALIDATION_STATE,
62
62
  graphSpecMode,
63
63
  isDryGraphSpec,
64
+ isPluralMultiplicity,
64
65
  isStaticGraphSpec,
65
66
  isStuffNodeId,
67
+ multiplicitySuffix,
66
68
  nodeHeight,
67
69
  nodeWidth,
68
70
  stuffDigestFromId,
69
71
  stuffNodeId,
70
72
  toolbarOrientation,
71
73
  toolbarSide
72
- } from "../chunk-F3GBNU2I.js";
74
+ } from "../chunk-VCO4GZDZ.js";
73
75
  import "../chunk-2NMEKWO5.js";
74
76
  export {
75
77
  ARROW_CLOSED_MARKER,
@@ -119,9 +121,11 @@ export {
119
121
  graphSpecMode,
120
122
  inputPortId,
121
123
  isDryGraphSpec,
124
+ isPluralMultiplicity,
122
125
  isStaticGraphSpec,
123
126
  isStuffNodeId,
124
127
  makePipeRef,
128
+ multiplicitySuffix,
125
129
  nodeHeight,
126
130
  nodeWidth,
127
131
  outermostFoldedAncestor,
@@ -569,6 +569,11 @@
569
569
  color: var(--text-muted);
570
570
  }
571
571
 
572
+ .detail-multiplicity {
573
+ font-size: 12px;
574
+ color: var(--text-muted);
575
+ }
576
+
572
577
  .detail-refines-code {
573
578
  font-family: var(--font-mono);
574
579
  color: var(--color-accent);
@@ -11,7 +11,10 @@
11
11
  * cases still render with valid colors / fonts / shadows:
12
12
  * - first paint before the React inline-palette effect runs
13
13
  * - SSR / hydration mismatches
14
- * - a consumer rendering a graph subcomponent outside `GraphViewer`
14
+ * - a consumer rendering a graph subcomponent outside `GraphViewer`, as
15
+ * long as it wraps that subcomponent in an element carrying the
16
+ * `.react-flow-container` class: the defaults are scoped to that class,
17
+ * never to `:root`, so they do not leak into the host page
15
18
  * - JS disabled / failed
16
19
  * Values mirror `DARK_PALETTE_COLORS` in `graphConfig.ts`. The runtime
17
20
  * palette (dark or light) is applied as higher-specificity inline styles
@@ -448,6 +448,10 @@
448
448
  font-size: 11px;
449
449
  color: var(--text-muted);
450
450
  }
451
+ .detail-multiplicity {
452
+ font-size: 12px;
453
+ color: var(--text-muted);
454
+ }
451
455
  .detail-refines-code {
452
456
  font-family: var(--font-mono);
453
457
  color: var(--color-accent);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/graph/react/detail/DetailPanel.css","../../../src/graph/react/viewer/GraphToolbar.css"],"sourcesContent":["/* ─── Detail Panel — sliding side panel for node inspection ─────────────── */\n/* Token-only — all colors come from the active theme palette on the */\n/* container. See `graphConfig.ts` for token definitions. */\n\n.detail-panel {\n position: absolute;\n top: 0;\n right: 0;\n width: 380px;\n height: 100%;\n background: var(--surface-panel);\n border-left: 1px solid var(--border-default);\n z-index: 10;\n display: flex;\n flex-direction: column;\n font-family: var(--font-sans);\n color: var(--text-default);\n overflow: hidden;\n transition: transform 0.2s ease;\n}\n\n.detail-panel--closed {\n transform: translateX(100%);\n pointer-events: none;\n}\n\n/* ─── Resize handle — left edge drag target ────────────────────────────── */\n\n.detail-panel-resize-handle {\n position: absolute;\n top: 0;\n left: -6px;\n width: 12px;\n height: 100%;\n cursor: col-resize;\n z-index: 2;\n background: transparent;\n}\n\n/* Visible bar — narrower than the hit area */\n.detail-panel-resize-handle::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 5px;\n width: 2px;\n height: 100%;\n background: transparent;\n transition: background 0.15s;\n}\n\n.detail-panel-resize-handle:hover::before,\n.detail-panel--dragging .detail-panel-resize-handle::before {\n background: var(--color-accent);\n opacity: 0.6;\n}\n\n/* Grip indicator — visible on hover */\n.detail-panel-resize-handle::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 2px;\n height: 24px;\n border-radius: 1px;\n background: transparent;\n transition: background 0.15s;\n}\n\n.detail-panel-resize-handle:hover::after,\n.detail-panel--dragging .detail-panel-resize-handle::after {\n background: var(--color-accent);\n}\n\n/* Disable transition during drag for smooth resizing */\n.detail-panel--dragging {\n transition: none;\n}\n\n.detail-panel--dragging .detail-panel-content {\n pointer-events: none;\n}\n\n/* ─── Close row — scrolls away with the content (intentionally NOT pinned) ─ */\n/* The close button is part of the content's top, not panel chrome: it\n * scrolls out of view with the content, and closing the panel means\n * scrolling back up. The negative margin tucks the following section up\n * beside it so the row doesn't cost a full line of vertical space. */\n\n.detail-panel-close-row {\n display: flex;\n justify-content: flex-end;\n /* Pull the next section up by exactly this row's height + the column\n * gap, so the close button sits ON the first content line (concept /\n * pipe header), right-aligned — not on its own line above it. */\n margin-bottom: -40px;\n}\n\n.detail-panel-close {\n all: unset;\n cursor: pointer;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n color: var(--text-dim);\n font-size: 18px;\n line-height: 1;\n /* Above the sticky pipe header (z 1) so the X is visible at rest while\n * sharing its line; on scroll it briefly slides over the stuck header's\n * empty right side before leaving the viewport. */\n z-index: 2;\n}\n\n.detail-panel-close:hover {\n color: var(--text-muted);\n background: var(--surface-elevated);\n}\n\n.detail-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 12px 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* ─── Sticky header (pipe info + IO stays pinned at top) ───────────────── */\n\n.detail-sticky-header {\n position: sticky;\n top: -12px; /* must mirror .detail-panel-content's top padding */\n z-index: 1;\n background: var(--surface-panel);\n padding-top: 12px;\n margin-top: -12px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* ─── Shared detail components ──────────────────────────────────────────── */\n\n.detail-section-label {\n font-size: 9px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--text-dim);\n margin-bottom: 6px;\n}\n\n.detail-header {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-badge {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 2px 7px;\n border-radius: 4px;\n white-space: nowrap;\n}\n\n.detail-badge--operator {\n background: var(--color-pipe);\n color: var(--text-on-accent);\n}\n\n.detail-badge--controller {\n background: var(--color-batch-item);\n color: var(--text-on-accent);\n}\n\n.detail-pipe-code {\n font-family: var(--font-mono);\n font-size: 14px;\n font-weight: 600;\n color: var(--color-pipe);\n}\n\n.detail-pipe-code--controller {\n color: var(--color-batch-item);\n}\n\n.detail-status {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n display: inline-block;\n}\n\n.detail-status-label {\n font-size: 12px;\n font-weight: 600;\n text-transform: capitalize;\n}\n\n.detail-duration {\n font-size: 11px;\n color: var(--text-dim);\n font-family: var(--font-mono);\n}\n\n.detail-description {\n font-size: 12px;\n color: var(--text-muted);\n line-height: 1.5;\n}\n\n/* ─── IO Pills ──────────────────────────────────────────────────────────── */\n\n.detail-io-pill {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n padding: 3px 8px;\n border-radius: 4px;\n background: var(--surface-sunken);\n border: 1px solid var(--border-subtle);\n}\n\n.detail-io-name {\n font-family: var(--font-mono);\n color: var(--text-default);\n}\n\n.detail-io-concept {\n color: var(--text-dim);\n font-size: 10px;\n}\n\n.detail-io-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n/* ─── Blueprint-specific sections ───────────────────────────────────────── */\n\n.detail-prompt-block {\n font-family: var(--font-mono);\n font-size: 11px;\n color: var(--text-muted);\n background: var(--surface-sunken);\n border: 1px solid var(--border-subtle);\n border-radius: 6px;\n padding: 10px 12px;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-y: auto;\n line-height: 1.5;\n}\n\n.detail-prompt-block--collapsed {\n max-height: 300px;\n}\n\n.detail-prompt-block--expanded {\n max-height: none;\n overflow-y: visible;\n}\n\n.detail-prompt-expand-btn {\n all: unset;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 9px;\n color: var(--text-dim);\n padding: 2px 6px;\n border-radius: 3px;\n background: var(--surface-sunken);\n border: 1px solid var(--border-subtle);\n transition: color 0.15s;\n}\n\n.detail-prompt-expand-btn:hover {\n color: var(--text-muted);\n}\n\n.detail-kv-row {\n display: flex;\n justify-content: space-between;\n align-items: flex-start; /* top-align so the label stays next to the first line of a wrapped value */\n gap: 12px;\n font-size: 11px;\n padding: 3px 0;\n}\n\n.detail-kv-key {\n color: var(--text-dim);\n flex-shrink: 0; /* label stays at its natural width */\n}\n\n.detail-kv-value {\n font-family: var(--font-mono);\n color: var(--text-default);\n flex: 1 1 0;\n min-width: 0;\n text-align: right;\n word-break: break-word;\n overflow-wrap: anywhere;\n}\n\n/* ─── Field block: labeled multi-line text (for long resolved values) ─── */\n\n.detail-field-block {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-field-block-label {\n font-family: var(--font-mono);\n font-size: 10px;\n color: var(--text-dim);\n}\n\n.detail-field-block-value {\n font-family: var(--font-mono);\n font-size: 11px;\n color: var(--text-default);\n background: var(--surface-sunken);\n border: 1px solid var(--border-subtle);\n border-radius: 6px;\n padding: 8px 10px;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-wrap: anywhere;\n line-height: 1.5;\n max-height: 240px;\n overflow-y: auto;\n}\n\n/* ─── Nested construct sub-section header ───────────────────────────────── */\n/* Rendered before each nested sub-construct's recursive contents. The left\n * border + indent provides a visual \"branch\" cue so the tree structure is\n * obvious without needing collapse state. */\n\n.detail-nested-header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n margin-top: 6px;\n margin-bottom: 4px;\n padding: 4px 0 4px 8px;\n border-left: 2px solid var(--color-success);\n}\n\n.detail-nested-header-name {\n font-family: var(--font-mono);\n font-size: 11px;\n font-weight: 600;\n color: var(--text-default);\n}\n\n.detail-nested-header-meta {\n font-family: var(--font-mono);\n font-size: 9px;\n color: var(--text-dim);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n/* ─── Concept schema table ──────────────────────────────────────────────── */\n\n.detail-schema-table {\n width: 100%;\n font-size: 11px;\n border-collapse: collapse;\n}\n\n.detail-schema-table th {\n text-align: left;\n font-weight: 700;\n color: var(--text-dim);\n font-size: 9px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n padding: 4px 6px;\n border-bottom: 1px solid var(--border-default);\n}\n\n.detail-schema-table td {\n padding: 4px 6px;\n border-bottom: 1px solid var(--border-subtle);\n color: var(--text-muted);\n}\n\n.detail-schema-field {\n font-family: var(--font-mono);\n color: var(--text-default);\n}\n\n.detail-schema-type {\n color: var(--color-accent);\n}\n\n.detail-schema-required {\n color: var(--color-pipe);\n font-size: 9px;\n}\n\n/* ─── Error section ─────────────────────────────────────────────────────── */\n\n.detail-error {\n background: var(--color-error-bg);\n border: 1px solid var(--color-error-border);\n border-radius: 6px;\n padding: 10px 12px;\n}\n\n.detail-error-type {\n font-size: 12px;\n font-weight: 600;\n color: var(--color-error);\n margin-bottom: 4px;\n}\n\n.detail-error-message {\n font-size: 11px;\n color: var(--text-muted);\n line-height: 1.5;\n}\n\n.detail-error-stack {\n font-family: var(--font-mono);\n font-size: 10px;\n color: var(--text-dim);\n margin-top: 8px;\n max-height: 150px;\n overflow-y: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* ─── Steps list (PipeSequence, PipeCondition outcomes) ─────────────────── */\n\n.detail-steps-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-step-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n padding: 4px 8px;\n border-radius: 4px;\n background: var(--surface-sunken);\n border: 1px solid var(--border-subtle);\n}\n\n.detail-step-index {\n color: var(--text-dim);\n font-size: 10px;\n font-weight: 700;\n min-width: 16px;\n}\n\n.detail-step-code {\n font-family: var(--font-mono);\n color: var(--text-default);\n}\n\n/* ─── Tags/Metrics ──────────────────────────────────────────────────────── */\n\n.detail-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.detail-tag {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 3px;\n background: var(--surface-sunken);\n border: 1px solid var(--border-subtle);\n}\n\n.detail-tag-key {\n color: var(--text-dim);\n}\n\n.detail-tag-value {\n color: var(--text-default);\n font-family: var(--font-mono);\n}\n\n/* ─── Detail tabs (Data / Structure) ────────────────────────────────────── */\n\n.detail-tabs {\n display: flex;\n gap: 2px;\n border-bottom: 1px solid var(--border-default);\n}\n\n.detail-tab {\n all: unset;\n cursor: pointer;\n font-size: 11px;\n font-weight: 600;\n color: var(--text-dim);\n padding: 5px 10px;\n border-radius: 4px 4px 0 0;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n transition:\n color 0.15s,\n border-color 0.15s;\n}\n\n.detail-tab:hover {\n color: var(--text-muted);\n}\n\n.detail-tab--active {\n color: var(--text-default);\n border-bottom-color: var(--color-accent);\n}\n\n/* `all: unset` strips the UA focus ring — restore a visible indicator for\n * keyboard users (WCAG 2.4.7) on every unset button in the panel. */\n.detail-tab:focus-visible,\n.detail-panel-close:focus-visible,\n.detail-prompt-expand-btn:focus-visible {\n outline: 2px solid var(--color-accent);\n outline-offset: 2px;\n}\n\n/* ─── Concept panel header ──────────────────────────────────────────────── */\n\n.detail-concept-code {\n font-family: var(--font-mono);\n font-size: 14px;\n font-weight: 600;\n color: var(--color-success);\n}\n\n.detail-concept-domain {\n font-size: 11px;\n color: var(--text-dim);\n}\n\n.detail-refines {\n font-size: 11px;\n color: var(--text-muted);\n}\n\n.detail-refines-code {\n font-family: var(--font-mono);\n color: var(--color-accent);\n}\n\n/* ─── Not available fallback ────────────────────────────────────────────── */\n\n.detail-not-available {\n font-size: 12px;\n color: var(--text-dim);\n font-style: italic;\n padding: 8px 0;\n}\n\n/* ─── Usage (inline cost + disclosure) ──────────────────────────────────── */\n\n/* Cost sits on the status line, formatted exactly like the duration beside it:\n they are two facts of the same kind about the same run. The button carries no\n chrome of its own — only the chevron marks it as expandable. */\n.detail-usage-inline {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 0;\n background: none;\n border: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n}\n\n.detail-usage-value {\n font-size: 11px;\n color: var(--text-dim);\n font-family: var(--font-mono);\n font-variant-numeric: tabular-nums;\n}\n\n.detail-usage-inline:hover .detail-usage-value {\n color: var(--text-muted);\n}\n\n/* Quieter than the number it follows: it is an affordance, not information. */\n.detail-usage-chevron {\n color: var(--text-dim);\n opacity: 0.55;\n transition:\n transform 120ms ease,\n opacity 120ms ease;\n}\n\n.detail-usage-inline:hover .detail-usage-chevron {\n opacity: 0.9;\n}\n\n.detail-usage-chevron--open {\n transform: rotate(180deg);\n}\n\n.detail-usage-details {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* Model row: request on top, what it resolved to underneath. The secondary line\n is dimmer so the pair reads as one fact with its consequence, not two facts. */\n.detail-model-value {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 1px;\n}\n\n.detail-model-resolved {\n color: var(--text-dim);\n font-size: 10px;\n}\n","/* ─── Graph Toolbar — floating controls over the graph background ─────── */\n/* Token-only styling: theme switching happens by swapping `--surface-*`, */\n/* `--text-*`, `--border-*`, and `--color-accent` values on the container. */\n\n/* The ReactFlow <Panel> owns positioning now (anchor + margin). It sits above\n the graph but the old code used z-index 11, so keep parity. */\n.graph-toolbar-panel {\n z-index: 11;\n}\n\n.graph-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n pointer-events: auto;\n}\n\n/* Vertical bar — `center-left` / `center-right` anchors. Stack the buttons in a\n column and rotate the separators so they divide rows instead of columns. */\n.graph-toolbar--vertical {\n flex-direction: column;\n}\n\n.graph-toolbar--vertical .graph-toolbar-separator {\n width: 18px;\n height: 1px;\n margin: 2px 0;\n}\n\n.graph-toolbar-btn {\n all: unset;\n box-sizing: border-box;\n cursor: pointer;\n width: 28px;\n height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: var(--surface-overlay);\n border: 1px solid var(--border-default);\n color: var(--text-secondary);\n backdrop-filter: blur(6px);\n transition:\n background 0.15s,\n color 0.15s,\n border-color 0.15s;\n}\n\n.graph-toolbar-btn:hover {\n background: var(--surface-overlay-hover);\n color: var(--text-primary);\n border-color: var(--border-strong);\n}\n\n.graph-toolbar-btn:focus-visible {\n outline: 2px solid var(--focus-ring);\n outline-offset: 1px;\n}\n\n.graph-toolbar-btn--active {\n background: var(--color-accent);\n border-color: var(--color-accent);\n color: var(--text-on-accent);\n}\n\n.graph-toolbar-btn--active:hover {\n background: var(--color-accent);\n border-color: var(--color-accent);\n color: var(--text-on-accent);\n filter: brightness(1.1);\n}\n\n.graph-toolbar-btn:disabled,\n.graph-toolbar-btn:disabled:hover {\n opacity: 0.4;\n cursor: not-allowed;\n background: var(--surface-overlay-disabled);\n color: var(--text-dim);\n border-color: var(--border-subtle);\n}\n\n.graph-toolbar-separator {\n width: 1px;\n height: 18px;\n background: var(--border-default);\n margin: 0 2px;\n}\n\n/* ─── Validation widget ─────────────────────────────────────────────────── */\n/* Lives in GraphToolbar.css on purpose: the VS Code extension copies exactly\n this stylesheet into its webview, so a separate file would need host build\n changes for no benefit. */\n\n.graph-toolbar-validation {\n position: relative;\n display: inline-flex;\n}\n\n.graph-toolbar-validation-btn {\n position: relative;\n}\n\n.graph-toolbar-validation-btn--valid,\n.graph-toolbar-validation-btn--valid:hover {\n color: var(--color-success);\n}\n\n.graph-toolbar-validation-btn--invalid,\n.graph-toolbar-validation-btn--invalid:hover {\n color: var(--color-error);\n}\n\n.graph-toolbar-validation-btn--error,\n.graph-toolbar-validation-btn--error:hover {\n color: var(--color-warning);\n}\n\n.graph-toolbar-validation-spin {\n animation: graph-toolbar-validation-rotate 1s linear infinite;\n}\n\n@keyframes graph-toolbar-validation-rotate {\n to {\n transform: rotate(360deg);\n }\n}\n\n.graph-toolbar-validation-badge {\n position: absolute;\n top: -5px;\n right: -5px;\n min-width: 14px;\n height: 14px;\n padding: 0 3px;\n box-sizing: border-box;\n border-radius: 7px;\n background: var(--color-error);\n color: var(--text-on-accent);\n font-family: var(--font-sans);\n font-size: 9px;\n line-height: 14px;\n font-weight: 600;\n text-align: center;\n pointer-events: none;\n}\n\n/* `unvalidated` keeps the button's neutral colour — there is no verdict to\n colour it with — and badges its notes in the warning tone, like the other\n states whose issues are notes rather than a rejection. */\n.graph-toolbar-validation-btn--valid .graph-toolbar-validation-badge,\n.graph-toolbar-validation-btn--error .graph-toolbar-validation-badge,\n.graph-toolbar-validation-btn--unvalidated .graph-toolbar-validation-badge {\n background: var(--color-warning);\n}\n\n/* ─── Validation dropdown panel ─────────────────────────────────────────── */\n\n.graph-validation-panel {\n position: absolute;\n z-index: 12;\n /* Viewport clamp: narrow webviews (VS Code panels) can be under 260px wide. */\n min-width: min(260px, calc(100vw - 24px));\n max-width: min(360px, calc(100vw - 24px));\n max-height: 320px;\n overflow-y: auto;\n padding: 6px;\n border-radius: 8px;\n background: var(--surface-overlay);\n border: 1px solid var(--border-default);\n box-shadow: var(--shadow-md);\n backdrop-filter: blur(6px);\n pointer-events: auto;\n font-family: var(--font-sans);\n cursor: default;\n}\n\n/* Placement relative to the widget button — always unfolds toward the graph. */\n.graph-validation-panel--down-start {\n top: calc(100% + 6px);\n left: 0;\n}\n.graph-validation-panel--down-end {\n top: calc(100% + 6px);\n right: 0;\n}\n.graph-validation-panel--up-start {\n bottom: calc(100% + 6px);\n left: 0;\n}\n.graph-validation-panel--up-end {\n bottom: calc(100% + 6px);\n right: 0;\n}\n.graph-validation-panel--side-end {\n left: calc(100% + 6px);\n top: 0;\n}\n.graph-validation-panel--side-start {\n right: calc(100% + 6px);\n top: 0;\n}\n\n.graph-validation-panel-header {\n padding: 4px 6px 6px;\n font-size: 11px;\n font-weight: 600;\n color: var(--text-secondary);\n}\n\n.graph-validation-empty {\n padding: 2px 6px 6px;\n font-size: 12px;\n color: var(--text-secondary);\n}\n\n.graph-validation-issues {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.graph-validation-issue {\n padding: 6px 8px;\n border-radius: 6px;\n border-left: 3px solid var(--color-error);\n background: var(--color-error-bg);\n font-size: 12px;\n color: var(--text-primary);\n}\n\n/* The focusable/clickable element inside each <li> (keeps listitem semantics). */\n.graph-validation-issue-body {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.graph-validation-issue--warning {\n border-left-color: var(--color-warning);\n background: var(--surface-sunken);\n}\n\n.graph-validation-issue--clickable {\n cursor: pointer;\n}\n\n.graph-validation-issue--clickable:hover {\n filter: brightness(1.1);\n}\n\n.graph-validation-issue-body:focus-visible {\n outline: 2px solid var(--focus-ring);\n outline-offset: 1px;\n border-radius: 4px;\n}\n\n.graph-validation-issue-meta {\n display: flex;\n align-items: baseline;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.graph-validation-issue-context {\n font-family: var(--font-mono);\n font-size: 11px;\n font-weight: 600;\n color: var(--text-secondary);\n}\n\n.graph-validation-issue-file {\n font-size: 10px;\n color: var(--text-dim);\n}\n\n.graph-validation-issue-message {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n.graph-validation-issue-fix {\n font-size: 11px;\n color: var(--text-secondary);\n}\n\n.graph-validation-issue-fix::before {\n content: \"Fix: \";\n font-weight: 600;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/graph/react/detail/DetailPanel.css","../../../src/graph/react/viewer/GraphToolbar.css"],"sourcesContent":["/* ─── Detail Panel — sliding side panel for node inspection ─────────────── */\n/* Token-only — all colors come from the active theme palette on the */\n/* container. See `graphConfig.ts` for token definitions. */\n\n.detail-panel {\n position: absolute;\n top: 0;\n right: 0;\n width: 380px;\n height: 100%;\n background: var(--surface-panel);\n border-left: 1px solid var(--border-default);\n z-index: 10;\n display: flex;\n flex-direction: column;\n font-family: var(--font-sans);\n color: var(--text-default);\n overflow: hidden;\n transition: transform 0.2s ease;\n}\n\n.detail-panel--closed {\n transform: translateX(100%);\n pointer-events: none;\n}\n\n/* ─── Resize handle — left edge drag target ────────────────────────────── */\n\n.detail-panel-resize-handle {\n position: absolute;\n top: 0;\n left: -6px;\n width: 12px;\n height: 100%;\n cursor: col-resize;\n z-index: 2;\n background: transparent;\n}\n\n/* Visible bar — narrower than the hit area */\n.detail-panel-resize-handle::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 5px;\n width: 2px;\n height: 100%;\n background: transparent;\n transition: background 0.15s;\n}\n\n.detail-panel-resize-handle:hover::before,\n.detail-panel--dragging .detail-panel-resize-handle::before {\n background: var(--color-accent);\n opacity: 0.6;\n}\n\n/* Grip indicator — visible on hover */\n.detail-panel-resize-handle::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 2px;\n height: 24px;\n border-radius: 1px;\n background: transparent;\n transition: background 0.15s;\n}\n\n.detail-panel-resize-handle:hover::after,\n.detail-panel--dragging .detail-panel-resize-handle::after {\n background: var(--color-accent);\n}\n\n/* Disable transition during drag for smooth resizing */\n.detail-panel--dragging {\n transition: none;\n}\n\n.detail-panel--dragging .detail-panel-content {\n pointer-events: none;\n}\n\n/* ─── Close row — scrolls away with the content (intentionally NOT pinned) ─ */\n/* The close button is part of the content's top, not panel chrome: it\n * scrolls out of view with the content, and closing the panel means\n * scrolling back up. The negative margin tucks the following section up\n * beside it so the row doesn't cost a full line of vertical space. */\n\n.detail-panel-close-row {\n display: flex;\n justify-content: flex-end;\n /* Pull the next section up by exactly this row's height + the column\n * gap, so the close button sits ON the first content line (concept /\n * pipe header), right-aligned — not on its own line above it. */\n margin-bottom: -40px;\n}\n\n.detail-panel-close {\n all: unset;\n cursor: pointer;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n color: var(--text-dim);\n font-size: 18px;\n line-height: 1;\n /* Above the sticky pipe header (z 1) so the X is visible at rest while\n * sharing its line; on scroll it briefly slides over the stuck header's\n * empty right side before leaving the viewport. */\n z-index: 2;\n}\n\n.detail-panel-close:hover {\n color: var(--text-muted);\n background: var(--surface-elevated);\n}\n\n.detail-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 12px 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* ─── Sticky header (pipe info + IO stays pinned at top) ───────────────── */\n\n.detail-sticky-header {\n position: sticky;\n top: -12px; /* must mirror .detail-panel-content's top padding */\n z-index: 1;\n background: var(--surface-panel);\n padding-top: 12px;\n margin-top: -12px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* ─── Shared detail components ──────────────────────────────────────────── */\n\n.detail-section-label {\n font-size: 9px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--text-dim);\n margin-bottom: 6px;\n}\n\n.detail-header {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-badge {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 2px 7px;\n border-radius: 4px;\n white-space: nowrap;\n}\n\n.detail-badge--operator {\n background: var(--color-pipe);\n color: var(--text-on-accent);\n}\n\n.detail-badge--controller {\n background: var(--color-batch-item);\n color: var(--text-on-accent);\n}\n\n.detail-pipe-code {\n font-family: var(--font-mono);\n font-size: 14px;\n font-weight: 600;\n color: var(--color-pipe);\n}\n\n.detail-pipe-code--controller {\n color: var(--color-batch-item);\n}\n\n.detail-status {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n display: inline-block;\n}\n\n.detail-status-label {\n font-size: 12px;\n font-weight: 600;\n text-transform: capitalize;\n}\n\n.detail-duration {\n font-size: 11px;\n color: var(--text-dim);\n font-family: var(--font-mono);\n}\n\n.detail-description {\n font-size: 12px;\n color: var(--text-muted);\n line-height: 1.5;\n}\n\n/* ─── IO Pills ──────────────────────────────────────────────────────────── */\n\n.detail-io-pill {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n padding: 3px 8px;\n border-radius: 4px;\n background: var(--surface-sunken);\n border: 1px solid var(--border-subtle);\n}\n\n.detail-io-name {\n font-family: var(--font-mono);\n color: var(--text-default);\n}\n\n.detail-io-concept {\n color: var(--text-dim);\n font-size: 10px;\n}\n\n.detail-io-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n/* ─── Blueprint-specific sections ───────────────────────────────────────── */\n\n.detail-prompt-block {\n font-family: var(--font-mono);\n font-size: 11px;\n color: var(--text-muted);\n background: var(--surface-sunken);\n border: 1px solid var(--border-subtle);\n border-radius: 6px;\n padding: 10px 12px;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-y: auto;\n line-height: 1.5;\n}\n\n.detail-prompt-block--collapsed {\n max-height: 300px;\n}\n\n.detail-prompt-block--expanded {\n max-height: none;\n overflow-y: visible;\n}\n\n.detail-prompt-expand-btn {\n all: unset;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 9px;\n color: var(--text-dim);\n padding: 2px 6px;\n border-radius: 3px;\n background: var(--surface-sunken);\n border: 1px solid var(--border-subtle);\n transition: color 0.15s;\n}\n\n.detail-prompt-expand-btn:hover {\n color: var(--text-muted);\n}\n\n.detail-kv-row {\n display: flex;\n justify-content: space-between;\n align-items: flex-start; /* top-align so the label stays next to the first line of a wrapped value */\n gap: 12px;\n font-size: 11px;\n padding: 3px 0;\n}\n\n.detail-kv-key {\n color: var(--text-dim);\n flex-shrink: 0; /* label stays at its natural width */\n}\n\n.detail-kv-value {\n font-family: var(--font-mono);\n color: var(--text-default);\n flex: 1 1 0;\n min-width: 0;\n text-align: right;\n word-break: break-word;\n overflow-wrap: anywhere;\n}\n\n/* ─── Field block: labeled multi-line text (for long resolved values) ─── */\n\n.detail-field-block {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-field-block-label {\n font-family: var(--font-mono);\n font-size: 10px;\n color: var(--text-dim);\n}\n\n.detail-field-block-value {\n font-family: var(--font-mono);\n font-size: 11px;\n color: var(--text-default);\n background: var(--surface-sunken);\n border: 1px solid var(--border-subtle);\n border-radius: 6px;\n padding: 8px 10px;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-wrap: anywhere;\n line-height: 1.5;\n max-height: 240px;\n overflow-y: auto;\n}\n\n/* ─── Nested construct sub-section header ───────────────────────────────── */\n/* Rendered before each nested sub-construct's recursive contents. The left\n * border + indent provides a visual \"branch\" cue so the tree structure is\n * obvious without needing collapse state. */\n\n.detail-nested-header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n margin-top: 6px;\n margin-bottom: 4px;\n padding: 4px 0 4px 8px;\n border-left: 2px solid var(--color-success);\n}\n\n.detail-nested-header-name {\n font-family: var(--font-mono);\n font-size: 11px;\n font-weight: 600;\n color: var(--text-default);\n}\n\n.detail-nested-header-meta {\n font-family: var(--font-mono);\n font-size: 9px;\n color: var(--text-dim);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n/* ─── Concept schema table ──────────────────────────────────────────────── */\n\n.detail-schema-table {\n width: 100%;\n font-size: 11px;\n border-collapse: collapse;\n}\n\n.detail-schema-table th {\n text-align: left;\n font-weight: 700;\n color: var(--text-dim);\n font-size: 9px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n padding: 4px 6px;\n border-bottom: 1px solid var(--border-default);\n}\n\n.detail-schema-table td {\n padding: 4px 6px;\n border-bottom: 1px solid var(--border-subtle);\n color: var(--text-muted);\n}\n\n.detail-schema-field {\n font-family: var(--font-mono);\n color: var(--text-default);\n}\n\n.detail-schema-type {\n color: var(--color-accent);\n}\n\n.detail-schema-required {\n color: var(--color-pipe);\n font-size: 9px;\n}\n\n/* ─── Error section ─────────────────────────────────────────────────────── */\n\n.detail-error {\n background: var(--color-error-bg);\n border: 1px solid var(--color-error-border);\n border-radius: 6px;\n padding: 10px 12px;\n}\n\n.detail-error-type {\n font-size: 12px;\n font-weight: 600;\n color: var(--color-error);\n margin-bottom: 4px;\n}\n\n.detail-error-message {\n font-size: 11px;\n color: var(--text-muted);\n line-height: 1.5;\n}\n\n.detail-error-stack {\n font-family: var(--font-mono);\n font-size: 10px;\n color: var(--text-dim);\n margin-top: 8px;\n max-height: 150px;\n overflow-y: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* ─── Steps list (PipeSequence, PipeCondition outcomes) ─────────────────── */\n\n.detail-steps-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-step-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n padding: 4px 8px;\n border-radius: 4px;\n background: var(--surface-sunken);\n border: 1px solid var(--border-subtle);\n}\n\n.detail-step-index {\n color: var(--text-dim);\n font-size: 10px;\n font-weight: 700;\n min-width: 16px;\n}\n\n.detail-step-code {\n font-family: var(--font-mono);\n color: var(--text-default);\n}\n\n/* ─── Tags/Metrics ──────────────────────────────────────────────────────── */\n\n.detail-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.detail-tag {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 3px;\n background: var(--surface-sunken);\n border: 1px solid var(--border-subtle);\n}\n\n.detail-tag-key {\n color: var(--text-dim);\n}\n\n.detail-tag-value {\n color: var(--text-default);\n font-family: var(--font-mono);\n}\n\n/* ─── Detail tabs (Data / Structure) ────────────────────────────────────── */\n\n.detail-tabs {\n display: flex;\n gap: 2px;\n border-bottom: 1px solid var(--border-default);\n}\n\n.detail-tab {\n all: unset;\n cursor: pointer;\n font-size: 11px;\n font-weight: 600;\n color: var(--text-dim);\n padding: 5px 10px;\n border-radius: 4px 4px 0 0;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n transition:\n color 0.15s,\n border-color 0.15s;\n}\n\n.detail-tab:hover {\n color: var(--text-muted);\n}\n\n.detail-tab--active {\n color: var(--text-default);\n border-bottom-color: var(--color-accent);\n}\n\n/* `all: unset` strips the UA focus ring — restore a visible indicator for\n * keyboard users (WCAG 2.4.7) on every unset button in the panel. */\n.detail-tab:focus-visible,\n.detail-panel-close:focus-visible,\n.detail-prompt-expand-btn:focus-visible {\n outline: 2px solid var(--color-accent);\n outline-offset: 2px;\n}\n\n/* ─── Concept panel header ──────────────────────────────────────────────── */\n\n.detail-concept-code {\n font-family: var(--font-mono);\n font-size: 14px;\n font-weight: 600;\n color: var(--color-success);\n}\n\n.detail-concept-domain {\n font-size: 11px;\n color: var(--text-dim);\n}\n\n.detail-refines {\n font-size: 11px;\n color: var(--text-muted);\n}\n\n.detail-multiplicity {\n font-size: 12px;\n color: var(--text-muted);\n}\n\n.detail-refines-code {\n font-family: var(--font-mono);\n color: var(--color-accent);\n}\n\n/* ─── Not available fallback ────────────────────────────────────────────── */\n\n.detail-not-available {\n font-size: 12px;\n color: var(--text-dim);\n font-style: italic;\n padding: 8px 0;\n}\n\n/* ─── Usage (inline cost + disclosure) ──────────────────────────────────── */\n\n/* Cost sits on the status line, formatted exactly like the duration beside it:\n they are two facts of the same kind about the same run. The button carries no\n chrome of its own — only the chevron marks it as expandable. */\n.detail-usage-inline {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 0;\n background: none;\n border: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n}\n\n.detail-usage-value {\n font-size: 11px;\n color: var(--text-dim);\n font-family: var(--font-mono);\n font-variant-numeric: tabular-nums;\n}\n\n.detail-usage-inline:hover .detail-usage-value {\n color: var(--text-muted);\n}\n\n/* Quieter than the number it follows: it is an affordance, not information. */\n.detail-usage-chevron {\n color: var(--text-dim);\n opacity: 0.55;\n transition:\n transform 120ms ease,\n opacity 120ms ease;\n}\n\n.detail-usage-inline:hover .detail-usage-chevron {\n opacity: 0.9;\n}\n\n.detail-usage-chevron--open {\n transform: rotate(180deg);\n}\n\n.detail-usage-details {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* Model row: request on top, what it resolved to underneath. The secondary line\n is dimmer so the pair reads as one fact with its consequence, not two facts. */\n.detail-model-value {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 1px;\n}\n\n.detail-model-resolved {\n color: var(--text-dim);\n font-size: 10px;\n}\n","/* ─── Graph Toolbar — floating controls over the graph background ─────── */\n/* Token-only styling: theme switching happens by swapping `--surface-*`, */\n/* `--text-*`, `--border-*`, and `--color-accent` values on the container. */\n\n/* The ReactFlow <Panel> owns positioning now (anchor + margin). It sits above\n the graph but the old code used z-index 11, so keep parity. */\n.graph-toolbar-panel {\n z-index: 11;\n}\n\n.graph-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n pointer-events: auto;\n}\n\n/* Vertical bar — `center-left` / `center-right` anchors. Stack the buttons in a\n column and rotate the separators so they divide rows instead of columns. */\n.graph-toolbar--vertical {\n flex-direction: column;\n}\n\n.graph-toolbar--vertical .graph-toolbar-separator {\n width: 18px;\n height: 1px;\n margin: 2px 0;\n}\n\n.graph-toolbar-btn {\n all: unset;\n box-sizing: border-box;\n cursor: pointer;\n width: 28px;\n height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: var(--surface-overlay);\n border: 1px solid var(--border-default);\n color: var(--text-secondary);\n backdrop-filter: blur(6px);\n transition:\n background 0.15s,\n color 0.15s,\n border-color 0.15s;\n}\n\n.graph-toolbar-btn:hover {\n background: var(--surface-overlay-hover);\n color: var(--text-primary);\n border-color: var(--border-strong);\n}\n\n.graph-toolbar-btn:focus-visible {\n outline: 2px solid var(--focus-ring);\n outline-offset: 1px;\n}\n\n.graph-toolbar-btn--active {\n background: var(--color-accent);\n border-color: var(--color-accent);\n color: var(--text-on-accent);\n}\n\n.graph-toolbar-btn--active:hover {\n background: var(--color-accent);\n border-color: var(--color-accent);\n color: var(--text-on-accent);\n filter: brightness(1.1);\n}\n\n.graph-toolbar-btn:disabled,\n.graph-toolbar-btn:disabled:hover {\n opacity: 0.4;\n cursor: not-allowed;\n background: var(--surface-overlay-disabled);\n color: var(--text-dim);\n border-color: var(--border-subtle);\n}\n\n.graph-toolbar-separator {\n width: 1px;\n height: 18px;\n background: var(--border-default);\n margin: 0 2px;\n}\n\n/* ─── Validation widget ─────────────────────────────────────────────────── */\n/* Lives in GraphToolbar.css on purpose: the VS Code extension copies exactly\n this stylesheet into its webview, so a separate file would need host build\n changes for no benefit. */\n\n.graph-toolbar-validation {\n position: relative;\n display: inline-flex;\n}\n\n.graph-toolbar-validation-btn {\n position: relative;\n}\n\n.graph-toolbar-validation-btn--valid,\n.graph-toolbar-validation-btn--valid:hover {\n color: var(--color-success);\n}\n\n.graph-toolbar-validation-btn--invalid,\n.graph-toolbar-validation-btn--invalid:hover {\n color: var(--color-error);\n}\n\n.graph-toolbar-validation-btn--error,\n.graph-toolbar-validation-btn--error:hover {\n color: var(--color-warning);\n}\n\n.graph-toolbar-validation-spin {\n animation: graph-toolbar-validation-rotate 1s linear infinite;\n}\n\n@keyframes graph-toolbar-validation-rotate {\n to {\n transform: rotate(360deg);\n }\n}\n\n.graph-toolbar-validation-badge {\n position: absolute;\n top: -5px;\n right: -5px;\n min-width: 14px;\n height: 14px;\n padding: 0 3px;\n box-sizing: border-box;\n border-radius: 7px;\n background: var(--color-error);\n color: var(--text-on-accent);\n font-family: var(--font-sans);\n font-size: 9px;\n line-height: 14px;\n font-weight: 600;\n text-align: center;\n pointer-events: none;\n}\n\n/* `unvalidated` keeps the button's neutral colour — there is no verdict to\n colour it with — and badges its notes in the warning tone, like the other\n states whose issues are notes rather than a rejection. */\n.graph-toolbar-validation-btn--valid .graph-toolbar-validation-badge,\n.graph-toolbar-validation-btn--error .graph-toolbar-validation-badge,\n.graph-toolbar-validation-btn--unvalidated .graph-toolbar-validation-badge {\n background: var(--color-warning);\n}\n\n/* ─── Validation dropdown panel ─────────────────────────────────────────── */\n\n.graph-validation-panel {\n position: absolute;\n z-index: 12;\n /* Viewport clamp: narrow webviews (VS Code panels) can be under 260px wide. */\n min-width: min(260px, calc(100vw - 24px));\n max-width: min(360px, calc(100vw - 24px));\n max-height: 320px;\n overflow-y: auto;\n padding: 6px;\n border-radius: 8px;\n background: var(--surface-overlay);\n border: 1px solid var(--border-default);\n box-shadow: var(--shadow-md);\n backdrop-filter: blur(6px);\n pointer-events: auto;\n font-family: var(--font-sans);\n cursor: default;\n}\n\n/* Placement relative to the widget button — always unfolds toward the graph. */\n.graph-validation-panel--down-start {\n top: calc(100% + 6px);\n left: 0;\n}\n.graph-validation-panel--down-end {\n top: calc(100% + 6px);\n right: 0;\n}\n.graph-validation-panel--up-start {\n bottom: calc(100% + 6px);\n left: 0;\n}\n.graph-validation-panel--up-end {\n bottom: calc(100% + 6px);\n right: 0;\n}\n.graph-validation-panel--side-end {\n left: calc(100% + 6px);\n top: 0;\n}\n.graph-validation-panel--side-start {\n right: calc(100% + 6px);\n top: 0;\n}\n\n.graph-validation-panel-header {\n padding: 4px 6px 6px;\n font-size: 11px;\n font-weight: 600;\n color: var(--text-secondary);\n}\n\n.graph-validation-empty {\n padding: 2px 6px 6px;\n font-size: 12px;\n color: var(--text-secondary);\n}\n\n.graph-validation-issues {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.graph-validation-issue {\n padding: 6px 8px;\n border-radius: 6px;\n border-left: 3px solid var(--color-error);\n background: var(--color-error-bg);\n font-size: 12px;\n color: var(--text-primary);\n}\n\n/* The focusable/clickable element inside each <li> (keeps listitem semantics). */\n.graph-validation-issue-body {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.graph-validation-issue--warning {\n border-left-color: var(--color-warning);\n background: var(--surface-sunken);\n}\n\n.graph-validation-issue--clickable {\n cursor: pointer;\n}\n\n.graph-validation-issue--clickable:hover {\n filter: brightness(1.1);\n}\n\n.graph-validation-issue-body:focus-visible {\n outline: 2px solid var(--focus-ring);\n outline-offset: 1px;\n border-radius: 4px;\n}\n\n.graph-validation-issue-meta {\n display: flex;\n align-items: baseline;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.graph-validation-issue-context {\n font-family: var(--font-mono);\n font-size: 11px;\n font-weight: 600;\n color: var(--text-secondary);\n}\n\n.graph-validation-issue-file {\n font-size: 10px;\n color: var(--text-dim);\n}\n\n.graph-validation-issue-message {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n.graph-validation-issue-fix {\n font-size: 11px;\n color: var(--text-secondary);\n}\n\n.graph-validation-issue-fix::before {\n content: \"Fix: \";\n font-weight: 600;\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React from 'react';
3
- import { c as GraphNodeData, d as GraphEdge, e as GraphNode, b as GraphSpec, f as GraphConfig, g as GraphDirection, F as FoldMode, h as GraphThemeMode, T as ToolbarPosition, G as GraphTheme, i as PipeStatus, j as GraphSpecNodeIoItem, k as ValidationState, V as ValidationIssue, L as LabelDescriptor, l as PipeControllerType, m as FoldToggleOptions, N as NodeValidationSummary, n as PipeType, o as GraphSpecMode, C as ConceptInfo, p as GraphSpecNode } from '../../types-Bcsh7Z0U.js';
4
- export { q as PipeOperatorType } from '../../types-Bcsh7Z0U.js';
3
+ import { c as GraphNodeData, d as GraphEdge, e as GraphNode, b as GraphSpec, f as GraphConfig, g as GraphDirection, F as FoldMode, h as GraphThemeMode, T as ToolbarPosition, G as GraphTheme, i as PipeStatus, j as GraphSpecNodeIoItem, k as ValidationState, V as ValidationIssue, L as LabelDescriptor, l as PipeControllerType, m as FoldToggleOptions, N as NodeValidationSummary, n as PipeType, o as GraphSpecMode, C as ConceptInfo, p as GraphSpecNode } from '../../types-DgqW3Jg4.js';
4
+ export { q as PipeOperatorType } from '../../types-DgqW3Jg4.js';
5
5
  import { PipeIOContracts, OutputForm, InputForm } from '@pipelex/mthds-form';
6
6
  import { ResolveUrl, ResolveShareUrl } from '@pipelex/mthds-form/react';
7
7
  import { Edge, Node, ReactFlowInstance } from '@xyflow/react';
@@ -14,14 +14,14 @@ import {
14
14
  resolveConceptRef,
15
15
  resolveIssueTargetNodeId,
16
16
  validateGraphSpec
17
- } from "../../chunk-LMGMRLIK.js";
17
+ } from "../../chunk-K3BWHQVX.js";
18
18
  import {
19
19
  parsePipeRef
20
20
  } from "../../chunk-2N65P32H.js";
21
21
  import {
22
22
  DEFAULT_GRAPH_CONFIG,
23
23
  getPaletteForTheme
24
- } from "../../chunk-MQ33HVWG.js";
24
+ } from "../../chunk-XBHDA3PQ.js";
25
25
  import {
26
26
  EDGE_TYPE,
27
27
  FOLD_MODE,
@@ -33,11 +33,13 @@ import {
33
33
  VALIDATION_STATE,
34
34
  graphSpecMode,
35
35
  isDryGraphSpec,
36
+ isPluralMultiplicity,
36
37
  isStaticGraphSpec,
38
+ multiplicitySuffix,
37
39
  stuffDigestFromId,
38
40
  toolbarOrientation,
39
41
  toolbarSide
40
- } from "../../chunk-F3GBNU2I.js";
42
+ } from "../../chunk-VCO4GZDZ.js";
41
43
  import {
42
44
  __spreadProps,
43
45
  __spreadValues
@@ -903,7 +905,7 @@ function PipeComposeSection({
903
905
  const composeMode = executionData == null ? void 0 : executionData.compose_mode;
904
906
  const fieldResolutions = (_a = executionData == null ? void 0 : executionData.fields) != null ? _a : null;
905
907
  const constructBlueprint = blueprint.construct_blueprint;
906
- const hasConstruct = constructBlueprint !== null && Object.keys(constructBlueprint.fields).length > 0;
908
+ const hasConstruct = constructBlueprint != null && Object.keys(constructBlueprint.fields).length > 0;
907
909
  return /* @__PURE__ */ jsxs10(Fragment6, { children: [
908
910
  /* @__PURE__ */ jsx10(KV, { label: "Mode", value: composeMode || (hasConstruct ? "construct" : "template") }),
909
911
  /* @__PURE__ */ jsx10(KV, { label: "Category", value: blueprint.category }),
@@ -1141,7 +1143,7 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1141
1143
  onClick: () => input.concept && (onConceptClick == null ? void 0 : onConceptClick(input.concept)),
1142
1144
  children: [
1143
1145
  /* @__PURE__ */ jsx15("span", { className: "detail-io-name", children: input.name }),
1144
- input.concept && /* @__PURE__ */ jsx15("span", { className: "detail-io-concept", children: input.concept })
1146
+ input.concept && /* @__PURE__ */ jsx15("span", { className: "detail-io-concept", children: input.concept + multiplicitySuffix(input.multiplicity) })
1145
1147
  ]
1146
1148
  },
1147
1149
  idx
@@ -1157,7 +1159,7 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1157
1159
  onClick: () => output.concept && (onConceptClick == null ? void 0 : onConceptClick(output.concept)),
1158
1160
  children: [
1159
1161
  /* @__PURE__ */ jsx15("span", { className: "detail-io-name", children: output.name }),
1160
- output.concept && /* @__PURE__ */ jsx15("span", { className: "detail-io-concept", children: output.concept })
1162
+ output.concept && /* @__PURE__ */ jsx15("span", { className: "detail-io-concept", children: output.concept + multiplicitySuffix(output.multiplicity) })
1161
1163
  ]
1162
1164
  },
1163
1165
  idx
@@ -1313,11 +1315,13 @@ function ConceptDetailPanel({
1313
1315
  instanceKey
1314
1316
  }) {
1315
1317
  var _a;
1318
+ const multiplicity = ioData == null ? void 0 : ioData.multiplicity;
1316
1319
  return /* @__PURE__ */ jsxs16(Fragment11, { children: [
1317
1320
  /* @__PURE__ */ jsxs16("div", { className: "detail-header", children: [
1318
- /* @__PURE__ */ jsx16("span", { className: "detail-concept-code", children: concept.code }),
1321
+ /* @__PURE__ */ jsx16("span", { className: "detail-concept-code", children: concept.code + multiplicitySuffix(multiplicity) }),
1319
1322
  /* @__PURE__ */ jsx16("span", { className: "detail-concept-domain", children: concept.domain_code })
1320
1323
  ] }),
1324
+ isPluralMultiplicity(multiplicity) && /* @__PURE__ */ jsx16("div", { className: "detail-multiplicity", children: multiplicity === true ? `A variable-length list of ${concept.code} items` : `A fixed-length list of exactly ${multiplicity} ${concept.code} items` }),
1321
1325
  concept.description && /* @__PURE__ */ jsx16("div", { className: "detail-description", children: concept.description }),
1322
1326
  concept.refines && /* @__PURE__ */ jsxs16("div", { className: "detail-refines", children: [
1323
1327
  "refines ",