@pipelex/mthds-ui 0.12.0 → 0.14.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.
- package/README.md +22 -0
- package/dist/chunk-GS2KODND.js +163 -0
- package/dist/chunk-GS2KODND.js.map +1 -0
- package/dist/chunk-LJQS5ZNA.js +1 -0
- package/dist/{chunk-R34J4GFM.js → chunk-V4FKGLKA.js} +113 -144
- package/dist/chunk-V4FKGLKA.js.map +1 -0
- package/dist/graph/index.d.ts +38 -4
- package/dist/graph/index.js +40 -22
- package/dist/graph/react/graph-core.css +105 -2
- package/dist/graph/react/index.css +165 -0
- package/dist/graph/react/index.css.map +1 -1
- package/dist/graph/react/index.d.ts +60 -3
- package/dist/graph/react/index.js +705 -269
- package/dist/graph/react/index.js.map +1 -1
- package/dist/graph/react/viewer/GraphToolbar.css +201 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +40 -22
- package/dist/standalone/graph-standalone.html +317 -12
- package/dist/standalone/graph-viewer.css +306 -2
- package/dist/standalone/graph-viewer.js +11 -10
- package/dist/static-graph/index.d.ts +121 -0
- package/dist/static-graph/index.js +1287 -0
- package/dist/static-graph/index.js.map +1 -0
- package/dist/{types-B3nefYpV.d.ts → types-CIH1Ae16.d.ts} +93 -4
- package/package.json +7 -2
- package/dist/chunk-L24K3TZU.js +0 -1
- package/dist/chunk-R34J4GFM.js.map +0 -1
- /package/dist/{chunk-L24K3TZU.js.map → chunk-LJQS5ZNA.js.map} +0 -0
|
@@ -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 {
|
|
@@ -384,6 +390,40 @@
|
|
|
384
390
|
.pipe-card--controller {
|
|
385
391
|
--pipe-card-accent: var(--text-muted);
|
|
386
392
|
}
|
|
393
|
+
.pipe-card--static {
|
|
394
|
+
background: var(--surface-sunken);
|
|
395
|
+
border-left-style: solid;
|
|
396
|
+
}
|
|
397
|
+
.pipe-card-annotations {
|
|
398
|
+
display: flex;
|
|
399
|
+
flex-wrap: wrap;
|
|
400
|
+
gap: 4px;
|
|
401
|
+
min-width: 0;
|
|
402
|
+
}
|
|
403
|
+
.pipe-card-annotation {
|
|
404
|
+
display: inline-flex;
|
|
405
|
+
align-items: center;
|
|
406
|
+
max-width: 100%;
|
|
407
|
+
overflow: hidden;
|
|
408
|
+
text-overflow: ellipsis;
|
|
409
|
+
white-space: nowrap;
|
|
410
|
+
border-radius: 4px;
|
|
411
|
+
border: 1px solid var(--border-subtle);
|
|
412
|
+
background: var(--surface-pill);
|
|
413
|
+
color: var(--text-muted);
|
|
414
|
+
font-family: var(--font-mono);
|
|
415
|
+
font-size: 10px;
|
|
416
|
+
line-height: 1.4;
|
|
417
|
+
padding: 1px 6px;
|
|
418
|
+
}
|
|
419
|
+
.pipe-card-annotation--outcome {
|
|
420
|
+
color: var(--color-warning);
|
|
421
|
+
border-color: var(--ctrl-condition-border);
|
|
422
|
+
}
|
|
423
|
+
.pipe-card-annotation--batch {
|
|
424
|
+
color: var(--ctrl-batch-text);
|
|
425
|
+
border-color: var(--ctrl-batch-border);
|
|
426
|
+
}
|
|
387
427
|
|
|
388
428
|
/* Signature (unimplemented stub) — dashed + muted so it reads as "declared,
|
|
389
429
|
not built yet", distinct from operator (solid accent) and controller (tinted). */
|
|
@@ -552,3 +592,66 @@
|
|
|
552
592
|
.pipe-card--tb .pipe-card-io-pill-concept {
|
|
553
593
|
max-width: 100px;
|
|
554
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
|
+
}
|
|
@@ -795,4 +795,169 @@ button.stuff-viewer-local-file--button:focus-visible {
|
|
|
795
795
|
background: var(--border-default);
|
|
796
796
|
margin: 0 2px;
|
|
797
797
|
}
|
|
798
|
+
.graph-toolbar-validation {
|
|
799
|
+
position: relative;
|
|
800
|
+
display: inline-flex;
|
|
801
|
+
}
|
|
802
|
+
.graph-toolbar-validation-btn {
|
|
803
|
+
position: relative;
|
|
804
|
+
}
|
|
805
|
+
.graph-toolbar-validation-btn--valid,
|
|
806
|
+
.graph-toolbar-validation-btn--valid:hover {
|
|
807
|
+
color: var(--color-success);
|
|
808
|
+
}
|
|
809
|
+
.graph-toolbar-validation-btn--invalid,
|
|
810
|
+
.graph-toolbar-validation-btn--invalid:hover {
|
|
811
|
+
color: var(--color-error);
|
|
812
|
+
}
|
|
813
|
+
.graph-toolbar-validation-btn--error,
|
|
814
|
+
.graph-toolbar-validation-btn--error:hover {
|
|
815
|
+
color: var(--color-warning);
|
|
816
|
+
}
|
|
817
|
+
.graph-toolbar-validation-spin {
|
|
818
|
+
animation: graph-toolbar-validation-rotate 1s linear infinite;
|
|
819
|
+
}
|
|
820
|
+
@keyframes graph-toolbar-validation-rotate {
|
|
821
|
+
to {
|
|
822
|
+
transform: rotate(360deg);
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
.graph-toolbar-validation-badge {
|
|
826
|
+
position: absolute;
|
|
827
|
+
top: -5px;
|
|
828
|
+
right: -5px;
|
|
829
|
+
min-width: 14px;
|
|
830
|
+
height: 14px;
|
|
831
|
+
padding: 0 3px;
|
|
832
|
+
box-sizing: border-box;
|
|
833
|
+
border-radius: 7px;
|
|
834
|
+
background: var(--color-error);
|
|
835
|
+
color: var(--text-on-accent);
|
|
836
|
+
font-family: var(--font-sans);
|
|
837
|
+
font-size: 9px;
|
|
838
|
+
line-height: 14px;
|
|
839
|
+
font-weight: 600;
|
|
840
|
+
text-align: center;
|
|
841
|
+
pointer-events: none;
|
|
842
|
+
}
|
|
843
|
+
.graph-toolbar-validation-btn--valid .graph-toolbar-validation-badge,
|
|
844
|
+
.graph-toolbar-validation-btn--error .graph-toolbar-validation-badge {
|
|
845
|
+
background: var(--color-warning);
|
|
846
|
+
}
|
|
847
|
+
.graph-validation-panel {
|
|
848
|
+
position: absolute;
|
|
849
|
+
z-index: 12;
|
|
850
|
+
min-width: min(260px, calc(100vw - 24px));
|
|
851
|
+
max-width: min(360px, calc(100vw - 24px));
|
|
852
|
+
max-height: 320px;
|
|
853
|
+
overflow-y: auto;
|
|
854
|
+
padding: 6px;
|
|
855
|
+
border-radius: 8px;
|
|
856
|
+
background: var(--surface-overlay);
|
|
857
|
+
border: 1px solid var(--border-default);
|
|
858
|
+
box-shadow: var(--shadow-md);
|
|
859
|
+
backdrop-filter: blur(6px);
|
|
860
|
+
pointer-events: auto;
|
|
861
|
+
font-family: var(--font-sans);
|
|
862
|
+
cursor: default;
|
|
863
|
+
}
|
|
864
|
+
.graph-validation-panel--down-start {
|
|
865
|
+
top: calc(100% + 6px);
|
|
866
|
+
left: 0;
|
|
867
|
+
}
|
|
868
|
+
.graph-validation-panel--down-end {
|
|
869
|
+
top: calc(100% + 6px);
|
|
870
|
+
right: 0;
|
|
871
|
+
}
|
|
872
|
+
.graph-validation-panel--up-start {
|
|
873
|
+
bottom: calc(100% + 6px);
|
|
874
|
+
left: 0;
|
|
875
|
+
}
|
|
876
|
+
.graph-validation-panel--up-end {
|
|
877
|
+
bottom: calc(100% + 6px);
|
|
878
|
+
right: 0;
|
|
879
|
+
}
|
|
880
|
+
.graph-validation-panel--side-end {
|
|
881
|
+
left: calc(100% + 6px);
|
|
882
|
+
top: 0;
|
|
883
|
+
}
|
|
884
|
+
.graph-validation-panel--side-start {
|
|
885
|
+
right: calc(100% + 6px);
|
|
886
|
+
top: 0;
|
|
887
|
+
}
|
|
888
|
+
.graph-validation-panel-header {
|
|
889
|
+
padding: 4px 6px 6px;
|
|
890
|
+
font-size: 11px;
|
|
891
|
+
font-weight: 600;
|
|
892
|
+
color: var(--text-secondary);
|
|
893
|
+
}
|
|
894
|
+
.graph-validation-empty {
|
|
895
|
+
padding: 2px 6px 6px;
|
|
896
|
+
font-size: 12px;
|
|
897
|
+
color: var(--text-secondary);
|
|
898
|
+
}
|
|
899
|
+
.graph-validation-issues {
|
|
900
|
+
list-style: none;
|
|
901
|
+
margin: 0;
|
|
902
|
+
padding: 0;
|
|
903
|
+
display: flex;
|
|
904
|
+
flex-direction: column;
|
|
905
|
+
gap: 4px;
|
|
906
|
+
}
|
|
907
|
+
.graph-validation-issue {
|
|
908
|
+
padding: 6px 8px;
|
|
909
|
+
border-radius: 6px;
|
|
910
|
+
border-left: 3px solid var(--color-error);
|
|
911
|
+
background: var(--color-error-bg);
|
|
912
|
+
font-size: 12px;
|
|
913
|
+
color: var(--text-primary);
|
|
914
|
+
}
|
|
915
|
+
.graph-validation-issue-body {
|
|
916
|
+
display: flex;
|
|
917
|
+
flex-direction: column;
|
|
918
|
+
gap: 2px;
|
|
919
|
+
}
|
|
920
|
+
.graph-validation-issue--warning {
|
|
921
|
+
border-left-color: var(--color-warning);
|
|
922
|
+
background: var(--surface-sunken);
|
|
923
|
+
}
|
|
924
|
+
.graph-validation-issue--clickable {
|
|
925
|
+
cursor: pointer;
|
|
926
|
+
}
|
|
927
|
+
.graph-validation-issue--clickable:hover {
|
|
928
|
+
filter: brightness(1.1);
|
|
929
|
+
}
|
|
930
|
+
.graph-validation-issue-body:focus-visible {
|
|
931
|
+
outline: 2px solid var(--focus-ring);
|
|
932
|
+
outline-offset: 1px;
|
|
933
|
+
border-radius: 4px;
|
|
934
|
+
}
|
|
935
|
+
.graph-validation-issue-meta {
|
|
936
|
+
display: flex;
|
|
937
|
+
align-items: baseline;
|
|
938
|
+
gap: 6px;
|
|
939
|
+
flex-wrap: wrap;
|
|
940
|
+
}
|
|
941
|
+
.graph-validation-issue-context {
|
|
942
|
+
font-family: var(--font-mono);
|
|
943
|
+
font-size: 11px;
|
|
944
|
+
font-weight: 600;
|
|
945
|
+
color: var(--text-secondary);
|
|
946
|
+
}
|
|
947
|
+
.graph-validation-issue-file {
|
|
948
|
+
font-size: 10px;
|
|
949
|
+
color: var(--text-dim);
|
|
950
|
+
}
|
|
951
|
+
.graph-validation-issue-message {
|
|
952
|
+
white-space: pre-wrap;
|
|
953
|
+
overflow-wrap: anywhere;
|
|
954
|
+
}
|
|
955
|
+
.graph-validation-issue-fix {
|
|
956
|
+
font-size: 11px;
|
|
957
|
+
color: var(--text-secondary);
|
|
958
|
+
}
|
|
959
|
+
.graph-validation-issue-fix::before {
|
|
960
|
+
content: "Fix: ";
|
|
961
|
+
font-weight: 600;
|
|
962
|
+
}
|
|
798
963
|
/*# sourceMappingURL=index.css.map */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/graph/react/stuff/StuffViewer.css","../../../src/graph/react/detail/DetailPanel.css","../../../src/graph/react/viewer/GraphToolbar.css"],"sourcesContent":["/* ─── StuffViewer component styles ────────────────────────────────────────── */\n/* StuffViewer is also exported standalone (used outside GraphViewer — e.g.\n * docs pages, embedded previews). The theme tokens are normally applied to\n * the GraphViewer container, but when this component is rendered on its own\n * those tokens may not be set. The fallbacks below match the dark palette\n * from `graphConfig.ts` (DARK_PALETTE_COLORS) so the component always\n * renders with valid colors and fonts. */\n\n.stuff-viewer {\n --sv-bg: var(--surface-page, #0a0a0a);\n --sv-surface: var(--surface-panel, #111118);\n --sv-surface-hover: var(--surface-elevated, rgba(255, 255, 255, 0.06));\n --sv-border: var(--border-default, rgba(255, 255, 255, 0.1));\n --sv-text: var(--text-default, #e2e8f0);\n --sv-text-muted: var(--text-muted, #94a3b8);\n --sv-accent: var(--color-accent, #8be9fd);\n --sv-success: var(--color-success, #50fa7b);\n --sv-success-bg: var(--color-success-bg, rgba(80, 250, 123, 0.15));\n --sv-radius: 4px;\n --sv-font-sans: var(\n --font-sans,\n \"Inter\",\n -apple-system,\n BlinkMacSystemFont,\n \"Segoe UI\",\n sans-serif\n );\n --sv-font-mono: var(--font-mono, \"JetBrains Mono\", \"Monaco\", \"Menlo\", monospace);\n\n font-family: var(--sv-font-sans);\n color: var(--sv-text);\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n/* ─── Header ─────────────────────────────────────────────────────────────── */\n\n.stuff-viewer-header {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 12px 16px 8px;\n border-bottom: 1px solid var(--sv-border);\n flex-shrink: 0;\n}\n\n.stuff-viewer-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--sv-text);\n margin: 0;\n}\n\n.stuff-viewer-subtitle {\n font-size: 12px;\n color: var(--sv-text-muted);\n margin: 0;\n}\n\n/* ─── Toolbar: tabs + action buttons ─────────────────────────────────────── */\n\n.stuff-viewer-toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.stuff-viewer-tabs {\n display: flex;\n gap: 4px;\n}\n\n.stuff-viewer-tab {\n padding: 5px 10px;\n border-radius: var(--sv-radius);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n background: var(--sv-surface-hover);\n color: var(--sv-text-muted);\n border: none;\n transition:\n background 0.15s,\n color 0.15s;\n}\n\n.stuff-viewer-tab:hover {\n background: var(--sv-border);\n color: var(--sv-text);\n}\n\n.stuff-viewer-tab--active {\n background: var(--sv-accent);\n color: var(--text-on-accent, #0e0e0e);\n}\n\n/* ─── Action buttons ─────────────────────────────────────────────────────── */\n\n.stuff-viewer-actions {\n display: flex;\n gap: 4px;\n}\n\n.stuff-viewer-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: var(--sv-radius);\n cursor: pointer;\n background: var(--sv-surface-hover);\n color: var(--sv-text-muted);\n border: none;\n transition:\n background 0.15s,\n color 0.15s;\n}\n\n.stuff-viewer-action-btn:hover {\n background: var(--sv-border);\n color: var(--sv-text);\n}\n\n.stuff-viewer-action-btn--copied {\n background: var(--sv-success-bg);\n color: var(--sv-success);\n}\n\n.stuff-viewer-action-btn svg {\n width: 14px;\n height: 14px;\n fill: currentColor;\n}\n\n/* ─── Content area ───────────────────────────────────────────────────────── */\n\n.stuff-viewer-content {\n flex: 1;\n overflow: auto;\n padding: 12px 16px 16px;\n min-height: 0;\n}\n\n/* Pre-formatted text (JSON and Pretty tabs) */\n.stuff-viewer-pre {\n font-family: var(--sv-font-mono);\n font-size: 11px;\n line-height: 1.5;\n white-space: pre-wrap;\n word-wrap: break-word;\n margin: 0;\n color: var(--sv-text-muted);\n}\n\n.stuff-viewer-pre--nowrap {\n white-space: pre;\n word-wrap: normal;\n line-height: 1;\n overflow-x: auto;\n padding-right: 20px;\n}\n\n/* HTML content */\n.stuff-viewer-html {\n font-family: var(--sv-font-sans);\n font-size: 11px;\n color: var(--sv-text-muted);\n line-height: 1.5;\n}\n\n.stuff-viewer-html table {\n border-collapse: collapse;\n width: 100%;\n}\n\n.stuff-viewer-html th,\n.stuff-viewer-html td {\n border: 1px solid var(--sv-border);\n padding: 8px 12px;\n text-align: left;\n}\n\n.stuff-viewer-html th {\n background: var(--sv-surface-hover);\n color: var(--sv-text);\n font-weight: 600;\n}\n\n.stuff-viewer-html tr:hover {\n background: var(--sv-surface-hover);\n}\n\n.stuff-viewer-html a {\n color: var(--sv-accent);\n text-decoration: none;\n}\n\n.stuff-viewer-html a:hover {\n text-decoration: underline;\n}\n\n.stuff-viewer-html ul {\n list-style: none;\n padding-left: 0;\n margin: 0;\n}\n\n/* Native `Html` concept — rendered in a sandboxed iframe so the document's own\n <style>/layout is faithful and isolated from the host. White backdrop because\n these documents (invoices, quotes, reports) are authored for print/light. */\n.stuff-viewer-html-frame {\n width: 100%;\n height: 100%;\n min-height: 480px;\n border: none;\n border-radius: var(--sv-radius);\n background: #fff;\n}\n\n/* PDF embed */\n.stuff-viewer-pdf {\n min-height: 400px;\n height: 100%;\n}\n\n.stuff-viewer-pdf embed {\n width: 100%;\n height: 100%;\n min-height: 500px;\n border: none;\n}\n\n/* Image content */\n.stuff-viewer-image {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n}\n\n.stuff-viewer-image img {\n max-width: 100%;\n max-height: 70vh;\n object-fit: contain;\n}\n\n/* Local file fallback (file:// URLs that can't render inline) */\n.stuff-viewer-local-file {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-radius: 6px;\n background: var(--sv-surface);\n border: 1px solid var(--sv-border);\n}\n\n/* Clickable variant — used when an open-externally action is bound (e.g. PDF\n fallback in hosts that can't render <embed type=\"application/pdf\">). */\nbutton.stuff-viewer-local-file--button {\n width: 100%;\n text-align: left;\n font: inherit;\n color: inherit;\n cursor: pointer;\n transition:\n background 0.15s ease,\n border-color 0.15s ease;\n}\n\nbutton.stuff-viewer-local-file--button:hover {\n background: var(--sv-surface-hover, var(--sv-surface));\n border-color: var(--sv-accent, var(--sv-border));\n}\n\nbutton.stuff-viewer-local-file--button:focus-visible {\n outline: 2px solid var(--sv-accent, var(--sv-border));\n outline-offset: 2px;\n}\n\n.stuff-viewer-local-file-icon {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n color: var(--sv-text-muted);\n}\n\n.stuff-viewer-local-file-icon svg {\n width: 100%;\n height: 100%;\n fill: currentColor;\n}\n\n.stuff-viewer-local-file-info {\n flex: 1;\n min-width: 0;\n}\n\n.stuff-viewer-local-file-name {\n font-family: var(--sv-font-mono);\n font-size: 12px;\n color: var(--sv-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.stuff-viewer-local-file-hint {\n font-size: 11px;\n color: var(--sv-text-muted);\n margin-top: 2px;\n}\n\n/* Placeholder for missing data */\n.stuff-viewer-placeholder {\n color: var(--sv-text-muted);\n font-style: italic;\n font-size: 13px;\n}\n\n.stuff-viewer-error {\n border: 1px solid var(--color-status-failed, #ff5555);\n border-radius: 6px;\n padding: 12px;\n background: rgba(255, 85, 85, 0.08);\n}\n\n.stuff-viewer-error-title {\n color: var(--color-status-failed, #ff5555);\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 4px;\n}\n\n.stuff-viewer-error-detail {\n color: var(--sv-text-muted);\n font-family: var(--font-mono, monospace);\n font-size: 12px;\n white-space: pre-wrap;\n word-break: break-word;\n}\n","/* ─── 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","/* ─── 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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/graph/react/stuff/StuffViewer.css","../../../src/graph/react/detail/DetailPanel.css","../../../src/graph/react/viewer/GraphToolbar.css"],"sourcesContent":["/* ─── StuffViewer component styles ────────────────────────────────────────── */\n/* StuffViewer is also exported standalone (used outside GraphViewer — e.g.\n * docs pages, embedded previews). The theme tokens are normally applied to\n * the GraphViewer container, but when this component is rendered on its own\n * those tokens may not be set. The fallbacks below match the dark palette\n * from `graphConfig.ts` (DARK_PALETTE_COLORS) so the component always\n * renders with valid colors and fonts. */\n\n.stuff-viewer {\n --sv-bg: var(--surface-page, #0a0a0a);\n --sv-surface: var(--surface-panel, #111118);\n --sv-surface-hover: var(--surface-elevated, rgba(255, 255, 255, 0.06));\n --sv-border: var(--border-default, rgba(255, 255, 255, 0.1));\n --sv-text: var(--text-default, #e2e8f0);\n --sv-text-muted: var(--text-muted, #94a3b8);\n --sv-accent: var(--color-accent, #8be9fd);\n --sv-success: var(--color-success, #50fa7b);\n --sv-success-bg: var(--color-success-bg, rgba(80, 250, 123, 0.15));\n --sv-radius: 4px;\n --sv-font-sans: var(\n --font-sans,\n \"Inter\",\n -apple-system,\n BlinkMacSystemFont,\n \"Segoe UI\",\n sans-serif\n );\n --sv-font-mono: var(--font-mono, \"JetBrains Mono\", \"Monaco\", \"Menlo\", monospace);\n\n font-family: var(--sv-font-sans);\n color: var(--sv-text);\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n/* ─── Header ─────────────────────────────────────────────────────────────── */\n\n.stuff-viewer-header {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 12px 16px 8px;\n border-bottom: 1px solid var(--sv-border);\n flex-shrink: 0;\n}\n\n.stuff-viewer-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--sv-text);\n margin: 0;\n}\n\n.stuff-viewer-subtitle {\n font-size: 12px;\n color: var(--sv-text-muted);\n margin: 0;\n}\n\n/* ─── Toolbar: tabs + action buttons ─────────────────────────────────────── */\n\n.stuff-viewer-toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.stuff-viewer-tabs {\n display: flex;\n gap: 4px;\n}\n\n.stuff-viewer-tab {\n padding: 5px 10px;\n border-radius: var(--sv-radius);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n background: var(--sv-surface-hover);\n color: var(--sv-text-muted);\n border: none;\n transition:\n background 0.15s,\n color 0.15s;\n}\n\n.stuff-viewer-tab:hover {\n background: var(--sv-border);\n color: var(--sv-text);\n}\n\n.stuff-viewer-tab--active {\n background: var(--sv-accent);\n color: var(--text-on-accent, #0e0e0e);\n}\n\n/* ─── Action buttons ─────────────────────────────────────────────────────── */\n\n.stuff-viewer-actions {\n display: flex;\n gap: 4px;\n}\n\n.stuff-viewer-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: var(--sv-radius);\n cursor: pointer;\n background: var(--sv-surface-hover);\n color: var(--sv-text-muted);\n border: none;\n transition:\n background 0.15s,\n color 0.15s;\n}\n\n.stuff-viewer-action-btn:hover {\n background: var(--sv-border);\n color: var(--sv-text);\n}\n\n.stuff-viewer-action-btn--copied {\n background: var(--sv-success-bg);\n color: var(--sv-success);\n}\n\n.stuff-viewer-action-btn svg {\n width: 14px;\n height: 14px;\n fill: currentColor;\n}\n\n/* ─── Content area ───────────────────────────────────────────────────────── */\n\n.stuff-viewer-content {\n flex: 1;\n overflow: auto;\n padding: 12px 16px 16px;\n min-height: 0;\n}\n\n/* Pre-formatted text (JSON and Pretty tabs) */\n.stuff-viewer-pre {\n font-family: var(--sv-font-mono);\n font-size: 11px;\n line-height: 1.5;\n white-space: pre-wrap;\n word-wrap: break-word;\n margin: 0;\n color: var(--sv-text-muted);\n}\n\n.stuff-viewer-pre--nowrap {\n white-space: pre;\n word-wrap: normal;\n line-height: 1;\n overflow-x: auto;\n padding-right: 20px;\n}\n\n/* HTML content */\n.stuff-viewer-html {\n font-family: var(--sv-font-sans);\n font-size: 11px;\n color: var(--sv-text-muted);\n line-height: 1.5;\n}\n\n.stuff-viewer-html table {\n border-collapse: collapse;\n width: 100%;\n}\n\n.stuff-viewer-html th,\n.stuff-viewer-html td {\n border: 1px solid var(--sv-border);\n padding: 8px 12px;\n text-align: left;\n}\n\n.stuff-viewer-html th {\n background: var(--sv-surface-hover);\n color: var(--sv-text);\n font-weight: 600;\n}\n\n.stuff-viewer-html tr:hover {\n background: var(--sv-surface-hover);\n}\n\n.stuff-viewer-html a {\n color: var(--sv-accent);\n text-decoration: none;\n}\n\n.stuff-viewer-html a:hover {\n text-decoration: underline;\n}\n\n.stuff-viewer-html ul {\n list-style: none;\n padding-left: 0;\n margin: 0;\n}\n\n/* Native `Html` concept — rendered in a sandboxed iframe so the document's own\n <style>/layout is faithful and isolated from the host. White backdrop because\n these documents (invoices, quotes, reports) are authored for print/light. */\n.stuff-viewer-html-frame {\n width: 100%;\n height: 100%;\n min-height: 480px;\n border: none;\n border-radius: var(--sv-radius);\n background: #fff;\n}\n\n/* PDF embed */\n.stuff-viewer-pdf {\n min-height: 400px;\n height: 100%;\n}\n\n.stuff-viewer-pdf embed {\n width: 100%;\n height: 100%;\n min-height: 500px;\n border: none;\n}\n\n/* Image content */\n.stuff-viewer-image {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n}\n\n.stuff-viewer-image img {\n max-width: 100%;\n max-height: 70vh;\n object-fit: contain;\n}\n\n/* Local file fallback (file:// URLs that can't render inline) */\n.stuff-viewer-local-file {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-radius: 6px;\n background: var(--sv-surface);\n border: 1px solid var(--sv-border);\n}\n\n/* Clickable variant — used when an open-externally action is bound (e.g. PDF\n fallback in hosts that can't render <embed type=\"application/pdf\">). */\nbutton.stuff-viewer-local-file--button {\n width: 100%;\n text-align: left;\n font: inherit;\n color: inherit;\n cursor: pointer;\n transition:\n background 0.15s ease,\n border-color 0.15s ease;\n}\n\nbutton.stuff-viewer-local-file--button:hover {\n background: var(--sv-surface-hover, var(--sv-surface));\n border-color: var(--sv-accent, var(--sv-border));\n}\n\nbutton.stuff-viewer-local-file--button:focus-visible {\n outline: 2px solid var(--sv-accent, var(--sv-border));\n outline-offset: 2px;\n}\n\n.stuff-viewer-local-file-icon {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n color: var(--sv-text-muted);\n}\n\n.stuff-viewer-local-file-icon svg {\n width: 100%;\n height: 100%;\n fill: currentColor;\n}\n\n.stuff-viewer-local-file-info {\n flex: 1;\n min-width: 0;\n}\n\n.stuff-viewer-local-file-name {\n font-family: var(--sv-font-mono);\n font-size: 12px;\n color: var(--sv-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.stuff-viewer-local-file-hint {\n font-size: 11px;\n color: var(--sv-text-muted);\n margin-top: 2px;\n}\n\n/* Placeholder for missing data */\n.stuff-viewer-placeholder {\n color: var(--sv-text-muted);\n font-style: italic;\n font-size: 13px;\n}\n\n.stuff-viewer-error {\n border: 1px solid var(--color-status-failed, #ff5555);\n border-radius: 6px;\n padding: 12px;\n background: rgba(255, 85, 85, 0.08);\n}\n\n.stuff-viewer-error-title {\n color: var(--color-status-failed, #ff5555);\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 4px;\n}\n\n.stuff-viewer-error-detail {\n color: var(--sv-text-muted);\n font-family: var(--font-mono, monospace);\n font-size: 12px;\n white-space: pre-wrap;\n word-break: break-word;\n}\n","/* ─── 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","/* ─── 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.graph-toolbar-validation-btn--valid .graph-toolbar-validation-badge,\n.graph-toolbar-validation-btn--error .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":";AAQA,CAAC;AACC,WAAS,IAAI,cAAc,EAAE;AAC7B,gBAAc,IAAI,eAAe,EAAE;AACnC,sBAAoB,IAAI,kBAAkB,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAChE,eAAa,IAAI,gBAAgB,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACvD,aAAW,IAAI,cAAc,EAAE;AAC/B,mBAAiB,IAAI,YAAY,EAAE;AACnC,eAAa,IAAI,cAAc,EAAE;AACjC,gBAAc,IAAI,eAAe,EAAE;AACnC,mBAAiB,IAAI,kBAAkB,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;AAC5D,eAAa;AACb,kBAAgB,KACd,WAAW,EACX,OAAO,EACP,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV;AAEF,kBAAgB,IAAI,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,OAAO,EAAE;AAEtE,eAAa,IAAI;AACjB,SAAO,IAAI;AACX,WAAS;AACT,kBAAgB;AAChB,UAAQ;AACV;AAIA,CAAC;AACC,WAAS;AACT,kBAAgB;AAChB,OAAK;AACL,WAAS,KAAK,KAAK;AACnB,iBAAe,IAAI,MAAM,IAAI;AAC7B,eAAa;AACf;AAEA,CAAC;AACC,aAAW;AACX,eAAa;AACb,SAAO,IAAI;AACX,UAAQ;AACV;AAEA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACX,UAAQ;AACV;AAIA,CAAC;AACC,WAAS;AACT,mBAAiB;AACjB,eAAa;AACb,WAAS,IAAI;AACb,OAAK;AACL,eAAa;AACf;AAEA,CAAC;AACC,WAAS;AACT,OAAK;AACP;AAEA,CAAC;AACC,WAAS,IAAI;AACb,iBAAe,IAAI;AACnB,UAAQ;AACR,aAAW;AACX,eAAa;AACb,cAAY,IAAI;AAChB,SAAO,IAAI;AACX,UAAQ;AACR,cACE,WAAW,KAAK,EAChB,MAAM;AACV;AAEA,CAdC,gBAcgB;AACf,cAAY,IAAI;AAChB,SAAO,IAAI;AACb;AAEA,CAAC;AACC,cAAY,IAAI;AAChB,SAAO,IAAI,gBAAgB,EAAE;AAC/B;AAIA,CAAC;AACC,WAAS;AACT,OAAK;AACP;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,mBAAiB;AACjB,SAAO;AACP,UAAQ;AACR,iBAAe,IAAI;AACnB,UAAQ;AACR,cAAY,IAAI;AAChB,SAAO,IAAI;AACX,UAAQ;AACR,cACE,WAAW,KAAK,EAChB,MAAM;AACV;AAEA,CAhBC,uBAgBuB;AACtB,cAAY,IAAI;AAChB,SAAO,IAAI;AACb;AAEA,CAAC;AACC,cAAY,IAAI;AAChB,SAAO,IAAI;AACb;AAEA,CA1BC,wBA0BwB;AACvB,SAAO;AACP,UAAQ;AACR,QAAM;AACR;AAIA,CAAC;AACC,QAAM;AACN,YAAU;AACV,WAAS,KAAK,KAAK;AACnB,cAAY;AACd;AAGA,CAAC;AACC,eAAa,IAAI;AACjB,aAAW;AACX,eAAa;AACb,eAAa;AACb,aAAW;AACX,UAAQ;AACR,SAAO,IAAI;AACb;AAEA,CAAC;AACC,eAAa;AACb,aAAW;AACX,eAAa;AACb,cAAY;AACZ,iBAAe;AACjB;AAGA,CAAC;AACC,eAAa,IAAI;AACjB,aAAW;AACX,SAAO,IAAI;AACX,eAAa;AACf;AAEA,CAPC,kBAOkB;AACjB,mBAAiB;AACjB,SAAO;AACT;AAEA,CAZC,kBAYkB;AACnB,CAbC,kBAakB;AACjB,UAAQ,IAAI,MAAM,IAAI;AACtB,WAAS,IAAI;AACb,cAAY;AACd;AAEA,CAnBC,kBAmBkB;AACjB,cAAY,IAAI;AAChB,SAAO,IAAI;AACX,eAAa;AACf;AAEA,CAzBC,kBAyBkB,EAAE;AACnB,cAAY,IAAI;AAClB;AAEA,CA7BC,kBA6BkB;AACjB,SAAO,IAAI;AACX,mBAAiB;AACnB;AAEA,CAlCC,kBAkCkB,CAAC;AAClB,mBAAiB;AACnB;AAEA,CAtCC,kBAsCkB;AACjB,cAAY;AACZ,gBAAc;AACd,UAAQ;AACV;AAKA,CAAC;AACC,SAAO;AACP,UAAQ;AACR,cAAY;AACZ,UAAQ;AACR,iBAAe,IAAI;AACnB,cAAY;AACd;AAGA,CAAC;AACC,cAAY;AACZ,UAAQ;AACV;AAEA,CALC,iBAKiB;AAChB,SAAO;AACP,UAAQ;AACR,cAAY;AACZ,UAAQ;AACV;AAGA,CAAC;AACC,WAAS;AACT,mBAAiB;AACjB,eAAa;AACb,cAAY;AACd;AAEA,CAPC,mBAOmB;AAClB,aAAW;AACX,cAAY;AACZ,cAAY;AACd;AAGA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACL,WAAS;AACT,iBAAe;AACf,cAAY,IAAI;AAChB,UAAQ,IAAI,MAAM,IAAI;AACxB;AAIA,MAAM,CAAC;AACL,SAAO;AACP,cAAY;AACZ,QAAM;AACN,SAAO;AACP,UAAQ;AACR,cACE,WAAW,MAAM,IAAI,EACrB,aAAa,MAAM;AACvB;AAEA,MAAM,CAXC,+BAW+B;AACpC,cAAY,IAAI,kBAAkB,EAAE,IAAI;AACxC,gBAAc,IAAI,WAAW,EAAE,IAAI;AACrC;AAEA,MAAM,CAhBC,+BAgB+B;AACpC,WAAS,IAAI,MAAM,IAAI,WAAW,EAAE,IAAI;AACxC,kBAAgB;AAClB;AAEA,CAAC;AACC,eAAa;AACb,SAAO;AACP,UAAQ;AACR,SAAO,IAAI;AACb;AAEA,CAPC,6BAO6B;AAC5B,SAAO;AACP,UAAQ;AACR,QAAM;AACR;AAEA,CAAC;AACC,QAAM;AACN,aAAW;AACb;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,aAAW;AACX,SAAO,IAAI;AACX,YAAU;AACV,iBAAe;AACf,eAAa;AACf;AAEA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACX,cAAY;AACd;AAGA,CAAC;AACC,SAAO,IAAI;AACX,cAAY;AACZ,aAAW;AACb;AAEA,CAAC;AACC,UAAQ,IAAI,MAAM,IAAI,qBAAqB,EAAE;AAC7C,iBAAe;AACf,WAAS;AACT,cAAY,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE;AAChC;AAEA,CAAC;AACC,SAAO,IAAI,qBAAqB,EAAE;AAClC,eAAa;AACb,aAAW;AACX,iBAAe;AACjB;AAEA,CAAC;AACC,SAAO,IAAI;AACX,eAAa,IAAI,WAAW,EAAE;AAC9B,aAAW;AACX,eAAa;AACb,cAAY;AACd;;;ACrVA,CAAC;AACC,YAAU;AACV,OAAK;AACL,SAAO;AACP,SAAO;AACP,UAAQ;AACR,cAAY,IAAI;AAChB,eAAa,IAAI,MAAM,IAAI;AAC3B,WAAS;AACT,WAAS;AACT,kBAAgB;AAChB,eAAa,IAAI;AACjB,SAAO,IAAI;AACX,YAAU;AACV,cAAY,UAAU,KAAK;AAC7B;AAEA,CAAC;AACC,aAAW,WAAW;AACtB,kBAAgB;AAClB;AAIA,CAAC;AACC,YAAU;AACV,OAAK;AACL,QAAM;AACN,SAAO;AACP,UAAQ;AACR,UAAQ;AACR,WAAS;AACT,cAAY;AACd;AAGA,CAZC,0BAY0B;AACzB,WAAS;AACT,YAAU;AACV,OAAK;AACL,QAAM;AACN,SAAO;AACP,UAAQ;AACR,cAAY;AACZ,cAAY,WAAW;AACzB;AAEA,CAvBC,0BAuB0B,MAAM;AACjC,CAAC,uBAAuB,CAxBvB,0BAwBkD;AACjD,cAAY,IAAI;AAChB,WAAS;AACX;AAGA,CA9BC,0BA8B0B;AACzB,WAAS;AACT,YAAU;AACV,OAAK;AACL,QAAM;AACN,aAAW,UAAU,IAAI,EAAE;AAC3B,SAAO;AACP,UAAQ;AACR,iBAAe;AACf,cAAY;AACZ,cAAY,WAAW;AACzB;AAEA,CA3CC,0BA2C0B,MAAM;AACjC,CApBC,uBAoBuB,CA5CvB,0BA4CkD;AACjD,cAAY,IAAI;AAClB;AAGA,CAzBC;AA0BC,cAAY;AACd;AAEA,CA7BC,uBA6BuB,CAAC;AACvB,kBAAgB;AAClB;AAQA,CAAC;AACC,WAAS;AACT,mBAAiB;AAIjB,iBAAe;AACjB;AAEA,CAAC;AACC,OAAK;AACL,UAAQ;AACR,SAAO;AACP,UAAQ;AACR,WAAS;AACT,eAAa;AACb,mBAAiB;AACjB,iBAAe;AACf,SAAO,IAAI;AACX,aAAW;AACX,eAAa;AAIb,WAAS;AACX;AAEA,CAlBC,kBAkBkB;AACjB,SAAO,IAAI;AACX,cAAY,IAAI;AAClB;AAEA,CA1CyB;AA2CvB,QAAM;AACN,cAAY;AACZ,WAAS,KAAK,KAAK;AACnB,WAAS;AACT,kBAAgB;AAChB,OAAK;AACP;AAIA,CAAC;AACC,YAAU;AACV,OAAK;AACL,WAAS;AACT,cAAY,IAAI;AAChB,eAAa;AACb,cAAY;AACZ,WAAS;AACT,kBAAgB;AAChB,OAAK;AACP;AAIA,CAAC;AACC,aAAW;AACX,eAAa;AACb,kBAAgB;AAChB,kBAAgB;AAChB,SAAO,IAAI;AACX,iBAAe;AACjB;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACP;AAEA,CAAC;AACC,aAAW;AACX,eAAa;AACb,kBAAgB;AAChB,kBAAgB;AAChB,WAAS,IAAI;AACb,iBAAe;AACf,eAAa;AACf;AAEA,CAAC;AACC,cAAY,IAAI;AAChB,SAAO,IAAI;AACb;AAEA,CAAC;AACC,cAAY,IAAI;AAChB,SAAO,IAAI;AACb;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,aAAW;AACX,eAAa;AACb,SAAO,IAAI;AACb;AAEA,CAAC;AACC,SAAO,IAAI;AACb;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACP;AAEA,CAAC;AACC,SAAO;AACP,UAAQ;AACR,iBAAe;AACf,WAAS;AACX;AAEA,CAAC;AACC,aAAW;AACX,eAAa;AACb,kBAAgB;AAClB;AAEA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACX,eAAa,IAAI;AACnB;AAEA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACX,eAAa;AACf;AAIA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACL,aAAW;AACX,WAAS,IAAI;AACb,iBAAe;AACf,cAAY,IAAI;AAChB,UAAQ,IAAI,MAAM,IAAI;AACxB;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,SAAO,IAAI;AACb;AAEA,CAAC;AACC,SAAO,IAAI;AACX,aAAW;AACb;AAEA,CAAC;AACC,WAAS;AACT,kBAAgB;AAChB,OAAK;AACP;AAIA,CAAC;AACC,eAAa,IAAI;AACjB,aAAW;AACX,SAAO,IAAI;AACX,cAAY,IAAI;AAChB,UAAQ,IAAI,MAAM,IAAI;AACtB,iBAAe;AACf,WAAS,KAAK;AACd,eAAa;AACb,cAAY;AACZ,cAAY;AACZ,eAAa;AACf;AAEA,CAAC;AACC,cAAY;AACd;AAEA,CAAC;AACC,cAAY;AACZ,cAAY;AACd;AAEA,CAAC;AACC,OAAK;AACL,UAAQ;AACR,WAAS;AACT,eAAa;AACb,OAAK;AACL,aAAW;AACX,SAAO,IAAI;AACX,WAAS,IAAI;AACb,iBAAe;AACf,cAAY,IAAI;AAChB,UAAQ,IAAI,MAAM,IAAI;AACtB,cAAY,MAAM;AACpB;AAEA,CAfC,wBAewB;AACvB,SAAO,IAAI;AACb;AAEA,CAAC;AACC,WAAS;AACT,mBAAiB;AACjB,eAAa;AACb,OAAK;AACL,aAAW;AACX,WAAS,IAAI;AACf;AAEA,CAAC;AACC,SAAO,IAAI;AACX,eAAa;AACf;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,SAAO,IAAI;AACX,QAAM,EAAE,EAAE;AACV,aAAW;AACX,cAAY;AACZ,cAAY;AACZ,iBAAe;AACjB;AAIA,CAAC;AACC,WAAS;AACT,kBAAgB;AAChB,OAAK;AACP;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,aAAW;AACX,SAAO,IAAI;AACb;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,aAAW;AACX,SAAO,IAAI;AACX,cAAY,IAAI;AAChB,UAAQ,IAAI,MAAM,IAAI;AACtB,iBAAe;AACf,WAAS,IAAI;AACb,eAAa;AACb,cAAY;AACZ,iBAAe;AACf,eAAa;AACb,cAAY;AACZ,cAAY;AACd;AAOA,CAAC;AACC,WAAS;AACT,eAAa;AACb,mBAAiB;AACjB,OAAK;AACL,cAAY;AACZ,iBAAe;AACf,WAAS,IAAI,EAAE,IAAI;AACnB,eAAa,IAAI,MAAM,IAAI;AAC7B;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,aAAW;AACX,eAAa;AACb,SAAO,IAAI;AACb;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,aAAW;AACX,SAAO,IAAI;AACX,kBAAgB;AAChB,kBAAgB;AAClB;AAIA,CAAC;AACC,SAAO;AACP,aAAW;AACX,mBAAiB;AACnB;AAEA,CANC,oBAMoB;AACnB,cAAY;AACZ,eAAa;AACb,SAAO,IAAI;AACX,aAAW;AACX,kBAAgB;AAChB,kBAAgB;AAChB,WAAS,IAAI;AACb,iBAAe,IAAI,MAAM,IAAI;AAC/B;AAEA,CAjBC,oBAiBoB;AACnB,WAAS,IAAI;AACb,iBAAe,IAAI,MAAM,IAAI;AAC7B,SAAO,IAAI;AACb;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,SAAO,IAAI;AACb;AAEA,CAAC;AACC,SAAO,IAAI;AACb;AAEA,CAAC;AACC,SAAO,IAAI;AACX,aAAW;AACb;AAIA,CAAC;AACC,cAAY,IAAI;AAChB,UAAQ,IAAI,MAAM,IAAI;AACtB,iBAAe;AACf,WAAS,KAAK;AAChB;AAEA,CAAC;AACC,aAAW;AACX,eAAa;AACb,SAAO,IAAI;AACX,iBAAe;AACjB;AAEA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACX,eAAa;AACf;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,aAAW;AACX,SAAO,IAAI;AACX,cAAY;AACZ,cAAY;AACZ,cAAY;AACZ,eAAa;AACb,cAAY;AACd;AAIA,CAAC;AACC,WAAS;AACT,kBAAgB;AAChB,OAAK;AACP;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACL,aAAW;AACX,WAAS,IAAI;AACb,iBAAe;AACf,cAAY,IAAI;AAChB,UAAQ,IAAI,MAAM,IAAI;AACxB;AAEA,CAAC;AACC,SAAO,IAAI;AACX,aAAW;AACX,eAAa;AACb,aAAW;AACb;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,SAAO,IAAI;AACb;AAIA,CAAC;AACC,WAAS;AACT,aAAW;AACX,OAAK;AACP;AAEA,CAAC;AACC,aAAW;AACX,WAAS,IAAI;AACb,iBAAe;AACf,cAAY,IAAI;AAChB,UAAQ,IAAI,MAAM,IAAI;AACxB;AAEA,CAAC;AACC,SAAO,IAAI;AACb;AAEA,CAAC;AACC,SAAO,IAAI;AACX,eAAa,IAAI;AACnB;AAIA,CAAC;AACC,WAAS;AACT,OAAK;AACL,iBAAe,IAAI,MAAM,IAAI;AAC/B;AAEA,CAAC;AACC,OAAK;AACL,UAAQ;AACR,aAAW;AACX,eAAa;AACb,SAAO,IAAI;AACX,WAAS,IAAI;AACb,iBAAe,IAAI,IAAI,EAAE;AACzB,iBAAe,IAAI,MAAM;AACzB,iBAAe;AACf,cACE,MAAM,KAAK,EACX,aAAa;AACjB;AAEA,CAfC,UAeU;AACT,SAAO,IAAI;AACb;AAEA,CAAC;AACC,SAAO,IAAI;AACX,uBAAqB,IAAI;AAC3B;AAIA,CA1BC,UA0BU;AACX,CA9bC,kBA8bkB;AACnB,CA5QC,wBA4QwB;AACvB,WAAS,IAAI,MAAM,IAAI;AACvB,kBAAgB;AAClB;AAIA,CAAC;AACC,eAAa,IAAI;AACjB,aAAW;AACX,eAAa;AACb,SAAO,IAAI;AACb;AAEA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACb;AAEA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACb;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,SAAO,IAAI;AACb;AAIA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACX,cAAY;AACZ,WAAS,IAAI;AACf;;;ACjkBA,CAAC;AACC,WAAS;AACX;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACL,kBAAgB;AAClB;AAIA,CAAC;AACC,kBAAgB;AAClB;AAEA,CAJC,wBAIwB,CAAC;AACxB,SAAO;AACP,UAAQ;AACR,UAAQ,IAAI;AACd;AAEA,CAAC;AACC,OAAK;AACL,cAAY;AACZ,UAAQ;AACR,SAAO;AACP,UAAQ;AACR,WAAS;AACT,eAAa;AACb,mBAAiB;AACjB,iBAAe;AACf,cAAY,IAAI;AAChB,UAAQ,IAAI,MAAM,IAAI;AACtB,SAAO,IAAI;AACX,mBAAiB,KAAK;AACtB;AAAA,IACE,WAAW,KAAK;AAAA,IAChB,MAAM,KAAK;AAAA,IACX,aAAa;AACjB;AAEA,CApBC,iBAoBiB;AAChB,cAAY,IAAI;AAChB,SAAO,IAAI;AACX,gBAAc,IAAI;AACpB;AAEA,CA1BC,iBA0BiB;AAChB,WAAS,IAAI,MAAM,IAAI;AACvB,kBAAgB;AAClB;AAEA,CAAC;AACC,cAAY,IAAI;AAChB,gBAAc,IAAI;AAClB,SAAO,IAAI;AACb;AAEA,CANC,yBAMyB;AACxB,cAAY,IAAI;AAChB,gBAAc,IAAI;AAClB,SAAO,IAAI;AACX,UAAQ,WAAW;AACrB;AAEA,CA5CC,iBA4CiB;AAClB,CA7CC,iBA6CiB,SAAS;AACzB,WAAS;AACT,UAAQ;AACR,cAAY,IAAI;AAChB,SAAO,IAAI;AACX,gBAAc,IAAI;AACpB;AAEA,CA3D0B;AA4DxB,SAAO;AACP,UAAQ;AACR,cAAY,IAAI;AAChB,UAAQ,EAAE;AACZ;AAOA,CAAC;AACC,YAAU;AACV,WAAS;AACX;AAEA,CAAC;AACC,YAAU;AACZ;AAEA,CAAC;AACD,CADC,mCACmC;AAClC,SAAO,IAAI;AACb;AAEA,CAAC;AACD,CADC,qCACqC;AACpC,SAAO,IAAI;AACb;AAEA,CAAC;AACD,CADC,mCACmC;AAClC,SAAO,IAAI;AACb;AAEA,CAAC;AACC,aAAW,gCAAgC,GAAG,OAAO;AACvD;AAEA,WAHa;AAIX;AACE,eAAW,OAAO;AACpB;AACF;AAEA,CAAC;AACC,YAAU;AACV,OAAK;AACL,SAAO;AACP,aAAW;AACX,UAAQ;AACR,WAAS,EAAE;AACX,cAAY;AACZ,iBAAe;AACf,cAAY,IAAI;AAChB,SAAO,IAAI;AACX,eAAa,IAAI;AACjB,aAAW;AACX,eAAa;AACb,eAAa;AACb,cAAY;AACZ,kBAAgB;AAClB;AAEA,CA5CC,oCA4CoC,CAnBpC;AAoBD,CAnCC,oCAmCoC,CApBpC;AAqBC,cAAY,IAAI;AAClB;AAIA,CAAC;AACC,YAAU;AACV,WAAS;AAET,aAAW,IAAI,KAAK,EAAE,KAAK,MAAM,EAAE;AACnC,aAAW,IAAI,KAAK,EAAE,KAAK,MAAM,EAAE;AACnC,cAAY;AACZ,cAAY;AACZ,WAAS;AACT,iBAAe;AACf,cAAY,IAAI;AAChB,UAAQ,IAAI,MAAM,IAAI;AACtB,cAAY,IAAI;AAChB,mBAAiB,KAAK;AACtB,kBAAgB;AAChB,eAAa,IAAI;AACjB,UAAQ;AACV;AAGA,CAAC;AACC,OAAK,KAAK,KAAK,EAAE;AACjB,QAAM;AACR;AACA,CAAC;AACC,OAAK,KAAK,KAAK,EAAE;AACjB,SAAO;AACT;AACA,CAAC;AACC,UAAQ,KAAK,KAAK,EAAE;AACpB,QAAM;AACR;AACA,CAAC;AACC,UAAQ,KAAK,KAAK,EAAE;AACpB,SAAO;AACT;AACA,CAAC;AACC,QAAM,KAAK,KAAK,EAAE;AAClB,OAAK;AACP;AACA,CAAC;AACC,SAAO,KAAK,KAAK,EAAE;AACnB,OAAK;AACP;AAEA,CAAC;AACC,WAAS,IAAI,IAAI;AACjB,aAAW;AACX,eAAa;AACb,SAAO,IAAI;AACb;AAEA,CAAC;AACC,WAAS,IAAI,IAAI;AACjB,aAAW;AACX,SAAO,IAAI;AACb;AAEA,CAAC;AACC,cAAY;AACZ,UAAQ;AACR,WAAS;AACT,WAAS;AACT,kBAAgB;AAChB,OAAK;AACP;AAEA,CAAC;AACC,WAAS,IAAI;AACb,iBAAe;AACf,eAAa,IAAI,MAAM,IAAI;AAC3B,cAAY,IAAI;AAChB,aAAW;AACX,SAAO,IAAI;AACb;AAGA,CAAC;AACC,WAAS;AACT,kBAAgB;AAChB,OAAK;AACP;AAEA,CAAC;AACC,qBAAmB,IAAI;AACvB,cAAY,IAAI;AAClB;AAEA,CAAC;AACC,UAAQ;AACV;AAEA,CAJC,iCAIiC;AAChC,UAAQ,WAAW;AACrB;AAEA,CAnBC,2BAmB2B;AAC1B,WAAS,IAAI,MAAM,IAAI;AACvB,kBAAgB;AAChB,iBAAe;AACjB;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACL,aAAW;AACb;AAEA,CAAC;AACC,eAAa,IAAI;AACjB,aAAW;AACX,eAAa;AACb,SAAO,IAAI;AACb;AAEA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACb;AAEA,CAAC;AACC,eAAa;AACb,iBAAe;AACjB;AAEA,CAAC;AACC,aAAW;AACX,SAAO,IAAI;AACb;AAEA,CALC,0BAK0B;AACzB,WAAS;AACT,eAAa;AACf;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import {
|
|
4
|
-
export {
|
|
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-CIH1Ae16.js';
|
|
4
|
+
export { p as PipeOperatorType } from '../../types-CIH1Ae16.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. */
|
|
@@ -148,6 +148,25 @@ interface GraphViewerProps {
|
|
|
148
148
|
* external-open mechanism (e.g. `vscode.env.openExternal` via postMessage).
|
|
149
149
|
*/
|
|
150
150
|
onOpenExternally?: (url: string, filename?: string) => void;
|
|
151
|
+
/**
|
|
152
|
+
* State of the toolbar's validation widget. The widget renders only when this
|
|
153
|
+
* is set — `undefined` (the default) disables the feature entirely. Reactive:
|
|
154
|
+
* a host typically drives `validating → valid | invalid | error` as its
|
|
155
|
+
* validator progresses, without re-mounting the viewer.
|
|
156
|
+
*/
|
|
157
|
+
validationState?: ValidationState;
|
|
158
|
+
/**
|
|
159
|
+
* Issues listed in the validation widget's dropdown (the badge shows their
|
|
160
|
+
* count). Presentation-only — the host decides which issues to surface per
|
|
161
|
+
* state (validator errors, static-analysis diagnostics, or a mix; see
|
|
162
|
+
* `staticDiagnosticsToValidationIssues` in `@pipelex/mthds-ui/static-graph`).
|
|
163
|
+
*/
|
|
164
|
+
validationIssues?: ValidationIssue[];
|
|
165
|
+
/**
|
|
166
|
+
* Called when an issue row is clicked, with the row's index in
|
|
167
|
+
* `validationIssues`. Wire this to source navigation in the host.
|
|
168
|
+
*/
|
|
169
|
+
onValidationIssueClick?: (index: number, issue: ValidationIssue) => void;
|
|
151
170
|
}
|
|
152
171
|
/** Apply Layer 2 execution state overrides to rendered nodes. */
|
|
153
172
|
declare function applyStatusOverrides(nodes: AppNode[], statusMap: Record<string, PipeStatus> | undefined): AppNode[];
|
|
@@ -157,6 +176,37 @@ declare function renderLabel(desc: LabelDescriptor): React.ReactNode;
|
|
|
157
176
|
/** Convert label descriptors to React elements on all nodes */
|
|
158
177
|
declare function hydrateLabels(nodes: GraphNode[]): GraphNode[];
|
|
159
178
|
|
|
179
|
+
/**
|
|
180
|
+
* Human label for a validation state + issue count. Used as the widget button's
|
|
181
|
+
* title/aria-label and as the panel header. Pure, unit-testable.
|
|
182
|
+
*/
|
|
183
|
+
declare function validationLabel(state: ValidationState, issueCount: number): string;
|
|
184
|
+
/**
|
|
185
|
+
* How the dropdown opens relative to the validation button, derived from the
|
|
186
|
+
* toolbar anchor so the panel always unfolds toward the graph, never off-screen:
|
|
187
|
+
* `down-*`/`up-*` for horizontal bars (top vs bottom anchors), aligned to the
|
|
188
|
+
* button's `start` (left) or `end` (right) edge; `side-end`/`side-start` for the
|
|
189
|
+
* vertical bars, opening away from the hugged edge.
|
|
190
|
+
*/
|
|
191
|
+
type ValidationPanelPlacement = "down-start" | "down-end" | "up-start" | "up-end" | "side-start" | "side-end";
|
|
192
|
+
/** Derive the dropdown placement from the toolbar anchor. Pure, unit-testable. */
|
|
193
|
+
declare function validationPanelPlacement(position: ToolbarPosition): ValidationPanelPlacement;
|
|
194
|
+
interface ValidationPanelProps {
|
|
195
|
+
state: ValidationState;
|
|
196
|
+
issues: ValidationIssue[];
|
|
197
|
+
/** Row-click handler; rows render as buttons only when this is set. */
|
|
198
|
+
onIssueClick?: (index: number, issue: ValidationIssue) => void;
|
|
199
|
+
placement: ValidationPanelPlacement;
|
|
200
|
+
/** Id of the panel root, referenced by the toolbar button's aria-controls. */
|
|
201
|
+
id?: string;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* The dropdown listing validation issues, opened from the toolbar's validation
|
|
205
|
+
* widget. Purely presentational: the host owns the issue list and what a row
|
|
206
|
+
* click does (typically: navigate to the issue's source location).
|
|
207
|
+
*/
|
|
208
|
+
declare function ValidationPanel({ state, issues, onIssueClick, placement, id, }: ValidationPanelProps): react_jsx_runtime.JSX.Element;
|
|
209
|
+
|
|
160
210
|
/**
|
|
161
211
|
* Read the environment's current color scheme once. SSR / no-`matchMedia` safe:
|
|
162
212
|
* defaults to `dark` when `window.matchMedia` is unavailable. Exported so
|
|
@@ -187,6 +237,8 @@ interface ControllerGroupData {
|
|
|
187
237
|
isCollapsed?: boolean;
|
|
188
238
|
onToggleCollapse?: () => void;
|
|
189
239
|
onToggleFold?: (options?: FoldToggleOptions) => void;
|
|
240
|
+
validation?: NodeValidationSummary;
|
|
241
|
+
onValidationBadgeClick?: () => void;
|
|
190
242
|
}
|
|
191
243
|
declare function ControllerGroupNode({ data }: {
|
|
192
244
|
data: ControllerGroupData;
|
|
@@ -201,6 +253,7 @@ interface PipeCardData {
|
|
|
201
253
|
pipeType: PipeType;
|
|
202
254
|
description?: string;
|
|
203
255
|
status: PipeStatus;
|
|
256
|
+
graphMode?: GraphSpecMode;
|
|
204
257
|
inputs: {
|
|
205
258
|
name: string;
|
|
206
259
|
concept: string;
|
|
@@ -215,6 +268,10 @@ interface PipeCardData {
|
|
|
215
268
|
direction?: PipeCardDirection;
|
|
216
269
|
/** When set, the card renders an unfold button that invokes this callback. */
|
|
217
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;
|
|
218
275
|
}
|
|
219
276
|
|
|
220
277
|
interface PipeCardNodeProps {
|
|
@@ -372,4 +429,4 @@ interface UseResizableResult {
|
|
|
372
429
|
}
|
|
373
430
|
declare function useResizable({ defaultWidth, minWidth, maxWidth, containerRef, }: UseResizableOptions): UseResizableResult;
|
|
374
431
|
|
|
375
|
-
export { type AppEdge, type AppNode, type AppRFInstance, ConceptDetailPanel, type ConceptDetailPanelProps, ControllerGroupNode, DetailPanel, type DetailPanelProps, GraphViewer, type GraphViewerProps, PipeCardBase, type PipeCardBaseProps, type PipeCardData, PipeCardNode, PipeDetailPanel, type PipeDetailPanelProps, PipeStatus, type ResolveStorageUrl, StuffViewer, type StuffViewerData, type StuffViewerProps, type UseResizableOptions, type UseResizableResult, applyStatusOverrides, controllerNodeTypes, detectSystemTheme, extractFilename, extractInlineUrl, extractStorageUri, extractUrl, findStuffDataByDigest, getHtmlTabLabel, hydrateLabels, isInlineRenderableUrl, isSafeDisplayUrl, renderLabel, resolveMimeType, toAppEdges, toAppNodes, useResizable, useSystemTheme };
|
|
432
|
+
export { type AppEdge, type AppNode, type AppRFInstance, ConceptDetailPanel, type ConceptDetailPanelProps, ControllerGroupNode, DetailPanel, type DetailPanelProps, GraphViewer, type GraphViewerProps, PipeCardBase, type PipeCardBaseProps, type PipeCardData, PipeCardNode, PipeDetailPanel, type PipeDetailPanelProps, PipeStatus, type ResolveStorageUrl, StuffViewer, type StuffViewerData, type StuffViewerProps, type UseResizableOptions, type UseResizableResult, ValidationPanel, type ValidationPanelPlacement, type ValidationPanelProps, applyStatusOverrides, controllerNodeTypes, detectSystemTheme, extractFilename, extractInlineUrl, extractStorageUri, extractUrl, findStuffDataByDigest, getHtmlTabLabel, hydrateLabels, isInlineRenderableUrl, isSafeDisplayUrl, renderLabel, resolveMimeType, toAppEdges, toAppNodes, useResizable, useSystemTheme, validationLabel, validationPanelPlacement };
|