@pipelex/mthds-ui 0.13.0 → 0.15.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.
@@ -1,4 +1,4 @@
1
- import "../chunk-L24K3TZU.js";
1
+ import "../chunk-QD5YDMWV.js";
2
2
  import {
3
3
  DARK_PALETTE_COLORS,
4
4
  DEFAULT_GRAPH_CONFIG,
@@ -7,6 +7,7 @@ import {
7
7
  MAX_VISIBLE_CONTROLLER_CHILDREN,
8
8
  applyControllers,
9
9
  applyFolds,
10
+ applyValidationDecorations,
10
11
  asPipeCallNode,
11
12
  buildChildToControllerMap,
12
13
  buildContainmentChain,
@@ -16,6 +17,7 @@ import {
16
17
  buildElkGraph,
17
18
  buildGraph,
18
19
  buildPipeCardPayload,
20
+ buildValidationDecorations,
19
21
  estimateNodeDimensions,
20
22
  extractAbsolutePositions,
21
23
  findCousinControllers,
@@ -28,8 +30,9 @@ import {
28
30
  outermostFoldedAncestor,
29
31
  outputPortId,
30
32
  resolveConceptRef,
33
+ resolveIssueTargetNodeId,
31
34
  validateGraphSpec
32
- } from "../chunk-XCZLRCEJ.js";
35
+ } from "../chunk-O62372BD.js";
33
36
  import {
34
37
  ARROW_CLOSED_MARKER,
35
38
  CONTROLLER_PADDING_BOTTOM,
@@ -52,13 +55,15 @@ import {
52
55
  isDryGraphSpec,
53
56
  isStaticGraphSpec,
54
57
  isStuffNodeId,
58
+ makePipeRef,
55
59
  nodeHeight,
56
60
  nodeWidth,
61
+ parsePipeRef,
57
62
  stuffDigestFromId,
58
63
  stuffNodeId,
59
64
  toolbarOrientation,
60
65
  toolbarSide
61
- } from "../chunk-IMQ7MVYL.js";
66
+ } from "../chunk-YC7TW3BW.js";
62
67
  import "../chunk-2NMEKWO5.js";
63
68
  export {
64
69
  ARROW_CLOSED_MARKER,
@@ -85,6 +90,7 @@ export {
85
90
  VALIDATION_STATE,
86
91
  applyControllers,
87
92
  applyFolds,
93
+ applyValidationDecorations,
88
94
  asPipeCallNode,
89
95
  buildChildToControllerMap,
90
96
  buildContainmentChain,
@@ -94,6 +100,7 @@ export {
94
100
  buildElkGraph,
95
101
  buildGraph,
96
102
  buildPipeCardPayload,
103
+ buildValidationDecorations,
97
104
  estimateNodeDimensions,
98
105
  extractAbsolutePositions,
99
106
  findCousinControllers,
@@ -107,11 +114,14 @@ export {
107
114
  isDryGraphSpec,
108
115
  isStaticGraphSpec,
109
116
  isStuffNodeId,
117
+ makePipeRef,
110
118
  nodeHeight,
111
119
  nodeWidth,
112
120
  outermostFoldedAncestor,
113
121
  outputPortId,
122
+ parsePipeRef,
114
123
  resolveConceptRef,
124
+ resolveIssueTargetNodeId,
115
125
  stuffDigestFromId,
116
126
  stuffNodeId,
117
127
  toolbarOrientation,
@@ -126,16 +126,22 @@
126
126
  var(--shadow-lg) !important;
127
127
  z-index: 1000 !important;
128
128
  }
129
- /* Pipe cards handle their own selection styling — suppress the wrapper outline */
129
+ /* Pipe cards handle their own selection styling — suppress the wrapper outline.
130
+ The outline reset excludes .node-validation-flash: the flash animates the
131
+ wrapper outline, and an !important reset would override the animation. */
130
132
  .react-flow__node-pipeCard {
131
133
  background: transparent !important;
132
134
  border: none !important;
133
135
  box-shadow: none !important;
134
- outline: none !important;
135
136
  padding: 0 !important;
136
137
  }
138
+ .react-flow__node-pipeCard:not(.node-validation-flash) {
139
+ outline: none !important;
140
+ }
137
141
  .react-flow__node-pipeCard.selected {
138
142
  box-shadow: none !important;
143
+ }
144
+ .react-flow__node-pipeCard.selected:not(.node-validation-flash) {
139
145
  outline: none !important;
140
146
  }
141
147
  .react-flow__node-pipeCard.selected .pipe-card {
@@ -586,3 +592,66 @@
586
592
  .pipe-card--tb .pipe-card-io-pill-concept {
587
593
  max-width: 100px;
588
594
  }
595
+
596
+ /* ─── Validation decorations (severity ring + count badge) ─────────────────
597
+ Stamped by GraphViewer from targeted ValidationIssues. The ring is an
598
+ outline so node geometry (and therefore layout) never changes; the badge
599
+ lives in the header flow, which is size-locked by the ELK dimensions. */
600
+
601
+ .node-validation-ring--error {
602
+ outline: 2px solid var(--color-error);
603
+ outline-offset: 1px;
604
+ }
605
+ .node-validation-ring--warning {
606
+ outline: 1.5px solid var(--color-warning);
607
+ outline-offset: 1px;
608
+ }
609
+
610
+ .node-validation-badge {
611
+ flex-shrink: 0;
612
+ min-width: 16px;
613
+ height: 16px;
614
+ padding: 0 4px;
615
+ border: none;
616
+ border-radius: 999px;
617
+ font-family: var(--font-sans);
618
+ font-size: 10px;
619
+ font-weight: 700;
620
+ line-height: 16px;
621
+ text-align: center;
622
+ box-sizing: border-box;
623
+ }
624
+ .node-validation-badge--error {
625
+ background: var(--color-error);
626
+ color: #fff;
627
+ }
628
+ .node-validation-badge--warning {
629
+ background: var(--color-warning);
630
+ color: rgba(0, 0, 0, 0.85);
631
+ }
632
+ button.node-validation-badge {
633
+ cursor: pointer;
634
+ }
635
+ /* The controller header disables pointer events (it overlays children); the
636
+ badge re-enables them for its tooltip and click-through to the panel. */
637
+ .controller-group-header .node-validation-badge {
638
+ pointer-events: auto;
639
+ }
640
+
641
+ /* Transient highlight when a validation-panel row navigates to its node.
642
+ Applied to the ReactFlow node wrapper; the animation fades the halo out and
643
+ the class is cleared (or dropped by the next rebuild) once it has played. */
644
+ .react-flow__node.node-validation-flash {
645
+ animation: node-validation-flash 1.6s ease-out;
646
+ }
647
+ @keyframes node-validation-flash {
648
+ 0%,
649
+ 50% {
650
+ outline: 3px solid var(--color-accent-strong);
651
+ outline-offset: 5px;
652
+ }
653
+ 100% {
654
+ outline: 3px solid transparent;
655
+ outline-offset: 5px;
656
+ }
657
+ }
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React from 'react';
3
- import { a as GraphNodeData, b as GraphEdge, c as GraphNode, G as GraphSpec, d as GraphConfig, e as GraphDirection, F as FoldMode, f as GraphThemeMode, T as ToolbarPosition, g as GraphTheme, h as PipeStatus, i as ValidationState, V as ValidationIssue, L as LabelDescriptor, j as PipeControllerType, k as FoldToggleOptions, l as PipeType, m as GraphSpecMode, n as GraphSpecNode, C as ConceptInfo, o as GraphSpecNodeIoItem } from '../../types-Cm4147S5.js';
4
- export { p as PipeOperatorType } from '../../types-Cm4147S5.js';
3
+ import { a as GraphNodeData, b as GraphEdge, c as GraphNode, G as GraphSpec, d as GraphConfig, e as GraphDirection, F as FoldMode, f as GraphThemeMode, T as ToolbarPosition, g as GraphTheme, h as PipeStatus, i as ValidationState, V as ValidationIssue, L as LabelDescriptor, j as PipeControllerType, k as FoldToggleOptions, N as NodeValidationSummary, l as PipeType, m as GraphSpecMode, n as GraphSpecNode, C as ConceptInfo, o as GraphSpecNodeIoItem } from '../../types-DFIZ_rx6.js';
4
+ export { p as PipeOperatorType } from '../../types-DFIZ_rx6.js';
5
5
  import { Edge, Node, ReactFlowInstance } from '@xyflow/react';
6
6
 
7
7
  /** Data for rendering a stuff (data item) in the StuffViewer component. */
@@ -237,6 +237,8 @@ interface ControllerGroupData {
237
237
  isCollapsed?: boolean;
238
238
  onToggleCollapse?: () => void;
239
239
  onToggleFold?: (options?: FoldToggleOptions) => void;
240
+ validation?: NodeValidationSummary;
241
+ onValidationBadgeClick?: () => void;
240
242
  }
241
243
  declare function ControllerGroupNode({ data }: {
242
244
  data: ControllerGroupData;
@@ -266,6 +268,10 @@ interface PipeCardData {
266
268
  direction?: PipeCardDirection;
267
269
  /** When set, the card renders an unfold button that invokes this callback. */
268
270
  onExpand?: (options?: FoldToggleOptions) => void;
271
+ /** Validation decoration (severity ring + count badge), stamped by GraphViewer. */
272
+ validation?: NodeValidationSummary;
273
+ /** Badge click handler (opens the validation panel), stamped alongside `validation`. */
274
+ onValidationBadgeClick?: () => void;
269
275
  }
270
276
 
271
277
  interface PipeCardNodeProps {