@principal-ade/dynamic-file-tree 0.2.1 → 0.2.3

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/dist/index.d.ts CHANGED
@@ -19,8 +19,10 @@ export type { GitStatusFileTreeContainerProps } from './src/components/GitStatus
19
19
  export { MultiFileTree, MultiFileTreeCore } from './src/components/MultiFileTree';
20
20
  export type { MultiFileTreeProps, MultiFileTreeCoreProps } from './src/components/MultiFileTree';
21
21
  export { StoryboardWorkflowsTreeCore } from './src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTreeCore';
22
- export type { StoryboardWorkflowsTreeProps, StoryboardWorkflowNodeData, StoryboardWorkflowNodeType, StoryboardFilterMode, DiscoveredStoryboard, DiscoveredWorkflow, DiscoveredWorkflowWithContent, } from './src/components/StoryboardWorkflowsTree/types';
22
+ export type { StoryboardWorkflowsTreeProps, StoryboardWorkflowNodeData, StoryboardWorkflowNodeType, StoryboardFilterMode, DiscoveredStoryboard, DiscoveredWorkflow, DiscoveredWorkflowWithContent, WorkflowScenarioStatus, CanvasNodeStatus, StatusBarDisplay, } from './src/components/StoryboardWorkflowsTree/types';
23
23
  export { hasWorkflowContent } from './src/components/StoryboardWorkflowsTree/types';
24
+ export { StatusBar } from './src/components/StoryboardWorkflowsTree/StatusBar';
25
+ export type { StatusBarProps, StatusBarSegment } from './src/components/StoryboardWorkflowsTree/StatusBar';
24
26
  export { WorkflowScenarioTreeCore } from './src/components/WorkflowScenarioTree';
25
27
  export type { WorkflowScenarioTreeProps, WorkflowScenarioNodeData, WorkflowScenarioNodeType, WorkflowWithScenarios, WorkflowFilterMode, } from './src/components/WorkflowScenarioTree';
26
28
  export { CanvasListTreeCore } from './src/components/CanvasListTree/CanvasListTreeCore';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAG7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,YAAY,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAGxG,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGzF,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAGhG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,YAAY,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAGnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAGjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EACV,sBAAsB,EACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,YAAY,EAAE,+BAA+B,EAAE,MAAM,6CAA6C,CAAC;AAGnG,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAClF,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGjG,OAAO,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACnH,YAAY,EACV,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,6BAA6B,GAC9B,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AAGpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EACL,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,4CAA4C,CAAC;AACpD,YAAY,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,YAAY,EAAE,uCAAuC,EAAE,MAAM,qDAAqD,CAAC;AAGnH,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAG7E,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1951,8 +1951,8 @@ var MultiFileTree = ({
1951
1951
  }, "Selected: ", selectedFile.source.name, " / ", selectedFile.path));
1952
1952
  };
1953
1953
  // src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTreeCore.tsx
1954
- import { Package, FolderKanban, LayoutDashboard, Workflow, BookOpen, FolderOpen, CheckCircle2, GitCommit, CircleDot, Circle } from "lucide-react";
1955
- import React12, { useMemo as useMemo9, useRef as useRef5 } from "react";
1954
+ import { Package, FolderKanban, LayoutDashboard, Workflow, BookOpen, FolderOpen, GitCommit, CircleDot, Circle } from "lucide-react";
1955
+ import React13, { useMemo as useMemo9, useRef as useRef5, useState as useState7, useEffect as useEffect3 } from "react";
1956
1956
  import { Tree as Tree3 } from "react-arborist";
1957
1957
 
1958
1958
  // src/utils/gitStatus.tsx
@@ -2062,8 +2062,67 @@ function lookupGitStatus(filePath, gitStatusMap) {
2062
2062
  return null;
2063
2063
  }
2064
2064
 
2065
+ // src/components/StoryboardWorkflowsTree/StatusBar.tsx
2066
+ import React12 from "react";
2067
+ var StatusBar = ({
2068
+ segments,
2069
+ width = 72,
2070
+ height = 6,
2071
+ gap = 1,
2072
+ borderRadius = 0
2073
+ }) => {
2074
+ const total = segments.reduce((sum, seg) => sum + seg.count, 0);
2075
+ if (total === 0) {
2076
+ return null;
2077
+ }
2078
+ const totalGapWidth = (segments.filter((s) => s.count > 0).length - 1) * gap;
2079
+ const availableWidth = width - totalGapWidth;
2080
+ const segmentWidths = segments.map((seg) => {
2081
+ if (seg.count === 0)
2082
+ return 0;
2083
+ return Math.max(2, Math.round(seg.count / total * availableWidth));
2084
+ });
2085
+ const totalCalculatedWidth = segmentWidths.reduce((sum, w) => sum + w, 0);
2086
+ const diff = availableWidth - totalCalculatedWidth;
2087
+ if (diff !== 0 && segmentWidths.length > 0) {
2088
+ const largestIndex = segmentWidths.indexOf(Math.max(...segmentWidths));
2089
+ if (largestIndex >= 0) {
2090
+ segmentWidths[largestIndex] += diff;
2091
+ }
2092
+ }
2093
+ const tooltipParts = segments.filter((seg) => seg.count > 0 && seg.label).map((seg) => `${seg.label}: ${seg.count}`);
2094
+ const tooltip = tooltipParts.length > 0 ? tooltipParts.join(", ") : undefined;
2095
+ return /* @__PURE__ */ React12.createElement("div", {
2096
+ style: {
2097
+ display: "flex",
2098
+ alignItems: "center",
2099
+ gap: `${gap}px`,
2100
+ width: `${width}px`,
2101
+ height: `${height}px`
2102
+ },
2103
+ title: tooltip
2104
+ }, segments.map((segment, index) => {
2105
+ const segmentWidth = segmentWidths[index];
2106
+ if (segmentWidth === 0)
2107
+ return null;
2108
+ const visibleSegments = segmentWidths.filter((w) => w > 0);
2109
+ const visibleIndex = segmentWidths.slice(0, index + 1).filter((w) => w > 0).length - 1;
2110
+ const isFirst = visibleIndex === 0;
2111
+ const isLast = visibleIndex === visibleSegments.length - 1;
2112
+ return /* @__PURE__ */ React12.createElement("div", {
2113
+ key: index,
2114
+ style: {
2115
+ width: `${segmentWidth}px`,
2116
+ height: "100%",
2117
+ backgroundColor: segment.color,
2118
+ borderRadius: isFirst && isLast ? `${borderRadius}px` : isFirst ? `${borderRadius}px 0 0 ${borderRadius}px` : isLast ? `0 ${borderRadius}px ${borderRadius}px 0` : "0"
2119
+ }
2120
+ });
2121
+ }));
2122
+ };
2123
+
2065
2124
  // src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTreeCore.tsx
2066
- var buildTreeDataFromStoryboards = (storyboards, workflowCoverageMap, traceWorkflowsSet, filterMode, versionPrefix, gitStatusMap) => {
2125
+ var buildTreeDataFromStoryboards = (storyboards, workflowCoverageMap, traceWorkflowsSet, filterMode, versionPrefix, gitStatusMap, scenarioStatusMap, canvasNodeStatusMap) => {
2067
2126
  const packagesMap = new Map;
2068
2127
  const rootStoryboards = [];
2069
2128
  for (const storyboard of storyboards) {
@@ -2079,13 +2138,15 @@ var buildTreeDataFromStoryboards = (storyboards, workflowCoverageMap, traceWorkf
2079
2138
  const children = [];
2080
2139
  const canvasId = versionPrefix ? `canvas:${versionPrefix}:${storyboard.id}` : `canvas:${storyboard.id}`;
2081
2140
  const canvasGitStatus = gitStatusMap ? lookupGitStatus(storyboard.canvas.path, gitStatusMap) : null;
2141
+ const canvasStatus = canvasNodeStatusMap?.[storyboard.canvas.path] ?? canvasNodeStatusMap?.[storyboard.id];
2082
2142
  children.push({
2083
2143
  id: canvasId,
2084
2144
  name: "Storyboard",
2085
2145
  type: "canvas",
2086
2146
  canvas: storyboard.canvas,
2087
2147
  storyboard,
2088
- gitStatus: canvasGitStatus
2148
+ gitStatus: canvasGitStatus,
2149
+ canvasNodeStatus: canvasStatus
2089
2150
  });
2090
2151
  if (storyboard.canvas.markdownPath) {
2091
2152
  const overviewId = versionPrefix ? `overview:${versionPrefix}:${storyboard.id}` : `overview:${storyboard.id}`;
@@ -2104,6 +2165,7 @@ var buildTreeDataFromStoryboards = (storyboards, workflowCoverageMap, traceWorkf
2104
2165
  const workflowHasTraces = traceWorkflowsSet?.has(workflow.id) ?? false;
2105
2166
  const workflowNodeId = versionPrefix ? `workflow:${versionPrefix}:${workflow.id}` : `workflow:${workflow.id}`;
2106
2167
  const workflowGitStatus = gitStatusMap ? lookupGitStatus(workflow.path, gitStatusMap) : null;
2168
+ const scenarioStatus = scenarioStatusMap?.[workflow.id];
2107
2169
  return {
2108
2170
  id: workflowNodeId,
2109
2171
  name: workflow.name,
@@ -2112,7 +2174,8 @@ var buildTreeDataFromStoryboards = (storyboards, workflowCoverageMap, traceWorkf
2112
2174
  storyboard,
2113
2175
  isFullyCovered: workflowCoverageMap?.[workflow.id] ?? false,
2114
2176
  hasTraces: workflowHasTraces,
2115
- gitStatus: workflowGitStatus
2177
+ gitStatus: workflowGitStatus,
2178
+ scenarioStatus
2116
2179
  };
2117
2180
  }).sort((a, b) => a.name.localeCompare(b.name));
2118
2181
  if (filterMode === "with-traces") {
@@ -2197,7 +2260,7 @@ var buildTreeDataFromStoryboards = (storyboards, workflowCoverageMap, traceWorkf
2197
2260
  return allStoryboards.map(buildStoryboardNode).filter((node) => node !== null).sort((a, b) => a.name.localeCompare(b.name));
2198
2261
  }
2199
2262
  };
2200
- var buildTreeDataFromVersions = (versionSnapshots, workflowCoverageMap, filterMode, traceWorkflowsSet, gitStatusMap) => {
2263
+ var buildTreeDataFromVersions = (versionSnapshots, workflowCoverageMap, filterMode, traceWorkflowsSet, gitStatusMap, scenarioStatusMap, canvasNodeStatusMap) => {
2201
2264
  const result = [];
2202
2265
  for (const snapshot of versionSnapshots) {
2203
2266
  const versionKey = `${snapshot.repositoryUrl}@${snapshot.commitSha}`;
@@ -2209,7 +2272,7 @@ var buildTreeDataFromVersions = (versionSnapshots, workflowCoverageMap, filterMo
2209
2272
  if (filterMode === "without-traces" && !versionHasUntracedWorkflows) {
2210
2273
  continue;
2211
2274
  }
2212
- const storyboardChildren = buildTreeDataFromStoryboards(snapshot.storyboards, workflowCoverageMap, traceWorkflowsSet, filterMode, versionKey, gitStatusMap);
2275
+ const storyboardChildren = buildTreeDataFromStoryboards(snapshot.storyboards, workflowCoverageMap, traceWorkflowsSet, filterMode, versionKey, gitStatusMap, scenarioStatusMap, canvasNodeStatusMap);
2213
2276
  if (storyboardChildren.length === 0) {
2214
2277
  continue;
2215
2278
  }
@@ -2347,6 +2410,8 @@ var StoryboardWorkflowsTreeCore = ({
2347
2410
  selectedNodeId,
2348
2411
  defaultOpen = false,
2349
2412
  initialOpenState,
2413
+ openState,
2414
+ onToggle,
2350
2415
  horizontalNodePadding = "16px",
2351
2416
  verticalNodePadding = "6px",
2352
2417
  verticalPadding = "20px",
@@ -2357,7 +2422,10 @@ var StoryboardWorkflowsTreeCore = ({
2357
2422
  traceWorkflowsSet,
2358
2423
  gitStatusData,
2359
2424
  enablePanelDrag = false,
2360
- getDragConfig
2425
+ getDragConfig,
2426
+ scenarioStatusMap,
2427
+ canvasNodeStatusMap,
2428
+ statusBarDisplay = "both"
2361
2429
  }) => {
2362
2430
  const dndProps = getDndProps(enableDragAndDrop);
2363
2431
  const parentDndManager = useParentDndManager();
@@ -2372,78 +2440,135 @@ var StoryboardWorkflowsTreeCore = ({
2372
2440
  }, [verticalNodePadding]);
2373
2441
  const treeData = useMemo9(() => {
2374
2442
  if (versionSnapshots && versionSnapshots.length > 0) {
2375
- return buildTreeDataFromVersions(versionSnapshots, workflowCoverageMap, workflowFilterMode, traceWorkflowsSet, gitStatusMap);
2443
+ return buildTreeDataFromVersions(versionSnapshots, workflowCoverageMap, workflowFilterMode, traceWorkflowsSet, gitStatusMap, scenarioStatusMap, canvasNodeStatusMap);
2376
2444
  } else {
2377
- return buildTreeDataFromStoryboards(storyboards, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode, undefined, gitStatusMap);
2445
+ return buildTreeDataFromStoryboards(storyboards, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode, undefined, gitStatusMap, scenarioStatusMap, canvasNodeStatusMap);
2378
2446
  }
2379
- }, [storyboards, versionSnapshots, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode, gitStatusMap]);
2447
+ }, [storyboards, versionSnapshots, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode, gitStatusMap, scenarioStatusMap, canvasNodeStatusMap]);
2380
2448
  const NodeRenderer = (props) => {
2381
2449
  const { node } = props;
2382
2450
  const data = node.data;
2383
- const icon = data.type === "version" ? /* @__PURE__ */ React12.createElement(GitCommit, {
2451
+ const icon = data.type === "version" ? /* @__PURE__ */ React13.createElement(GitCommit, {
2384
2452
  size: 16
2385
- }) : data.type === "package" ? /* @__PURE__ */ React12.createElement(Package, {
2453
+ }) : data.type === "package" ? /* @__PURE__ */ React13.createElement(Package, {
2386
2454
  size: 16
2387
- }) : data.type === "storyboard" ? /* @__PURE__ */ React12.createElement(FolderKanban, {
2455
+ }) : data.type === "storyboard" ? /* @__PURE__ */ React13.createElement(FolderKanban, {
2388
2456
  size: 16
2389
- }) : data.type === "overview" ? /* @__PURE__ */ React12.createElement(BookOpen, {
2457
+ }) : data.type === "overview" ? /* @__PURE__ */ React13.createElement(BookOpen, {
2390
2458
  size: 16
2391
- }) : data.type === "canvas" ? /* @__PURE__ */ React12.createElement(LayoutDashboard, {
2459
+ }) : data.type === "canvas" ? /* @__PURE__ */ React13.createElement(LayoutDashboard, {
2392
2460
  size: 16
2393
- }) : data.type === "workflows" ? /* @__PURE__ */ React12.createElement(FolderOpen, {
2461
+ }) : data.type === "workflows" ? /* @__PURE__ */ React13.createElement(FolderOpen, {
2394
2462
  size: 16
2395
- }) : /* @__PURE__ */ React12.createElement(Workflow, {
2463
+ }) : /* @__PURE__ */ React13.createElement(Workflow, {
2396
2464
  size: 16
2397
2465
  });
2398
2466
  const nameColor = data.type === "version" ? data.hasTraces ? "#a855f7" : theme.colors.textMuted : data.type === "package" ? theme.colors.primary : data.type === "storyboard" ? data.hasTraces ? theme.colors.success : theme.colors.textSecondary : data.type === "overview" ? theme.colors.info || "#3b82f6" : data.type === "canvas" ? theme.colors.warning || "#f59e0b" : data.type === "workflows" ? theme.colors.text : data.type === "workflow" ? data.hasTraces ? theme.colors.textSecondary : theme.colors.textMuted : theme.colors.textSecondary;
2399
2467
  const nodeHorizontalPadding = data.type === "overview" || data.type === "canvas" || data.type === "workflows" || data.type === "workflow" ? `calc(${horizontalNodePadding} + 12px)` : horizontalNodePadding;
2400
2468
  const rightContent = (() => {
2401
2469
  const indicators = [];
2470
+ if (data.type === "storyboard" && data.storyboard && scenarioStatusMap && (statusBarDisplay === "traces" || statusBarDisplay === "both")) {
2471
+ let totalTraced = 0;
2472
+ let totalScenarios = 0;
2473
+ for (const workflow of data.storyboard.workflows) {
2474
+ const status = scenarioStatusMap[workflow.id];
2475
+ if (status) {
2476
+ totalTraced += status.scenarios.filter((s) => s.hasTrace).length;
2477
+ totalScenarios += status.scenarios.length;
2478
+ }
2479
+ }
2480
+ if (totalScenarios > 0) {
2481
+ indicators.push(/* @__PURE__ */ React13.createElement("div", {
2482
+ key: "storyboard-traces",
2483
+ style: { marginLeft: "6px" }
2484
+ }, /* @__PURE__ */ React13.createElement(StatusBar, {
2485
+ segments: [
2486
+ { count: totalTraced, color: "#3b82f6", label: "Traced" },
2487
+ { count: totalScenarios - totalTraced, color: "#6b7280", label: "Not traced" }
2488
+ ]
2489
+ })));
2490
+ }
2491
+ }
2492
+ if (data.type === "canvas" && data.canvasNodeStatus && statusBarDisplay !== "traces") {
2493
+ const { implemented, approved, draft } = data.canvasNodeStatus;
2494
+ const total = implemented + approved + draft;
2495
+ if (total > 0) {
2496
+ indicators.push(/* @__PURE__ */ React13.createElement("div", {
2497
+ key: "canvas-status",
2498
+ style: { marginLeft: "6px" }
2499
+ }, /* @__PURE__ */ React13.createElement(StatusBar, {
2500
+ segments: [
2501
+ { count: implemented, color: "#10b981", label: "Implemented" },
2502
+ { count: approved, color: "#f59e0b", label: "Approved" },
2503
+ { count: draft, color: "#6b7280", label: "Draft" }
2504
+ ]
2505
+ })));
2506
+ }
2507
+ }
2508
+ if (data.type === "workflow" && data.scenarioStatus) {
2509
+ const { scenarios } = data.scenarioStatus;
2510
+ if (scenarios.length > 0) {
2511
+ const bars = [];
2512
+ if (statusBarDisplay === "implementation" || statusBarDisplay === "both") {
2513
+ const implemented = scenarios.filter((s) => s.implementationStatus === "implemented").length;
2514
+ const partial = scenarios.filter((s) => s.implementationStatus === "partial").length;
2515
+ const draft = scenarios.filter((s) => !s.implementationStatus || s.implementationStatus === "draft").length;
2516
+ if (implemented + partial + draft > 0) {
2517
+ bars.push(/* @__PURE__ */ React13.createElement(StatusBar, {
2518
+ key: "impl",
2519
+ segments: [
2520
+ { count: implemented, color: "#10b981", label: "Implemented" },
2521
+ { count: partial, color: "#f59e0b", label: "Partial" },
2522
+ { count: draft, color: "#6b7280", label: "Draft" }
2523
+ ]
2524
+ }));
2525
+ }
2526
+ }
2527
+ if (statusBarDisplay === "traces" || statusBarDisplay === "both") {
2528
+ const traced = scenarios.filter((s) => s.hasTrace).length;
2529
+ const untraced = scenarios.length - traced;
2530
+ bars.push(/* @__PURE__ */ React13.createElement(StatusBar, {
2531
+ key: "traces",
2532
+ segments: [
2533
+ { count: traced, color: "#3b82f6", label: "Traced" },
2534
+ { count: untraced, color: "#6b7280", label: "Not traced" }
2535
+ ]
2536
+ }));
2537
+ }
2538
+ if (bars.length > 0) {
2539
+ indicators.push(/* @__PURE__ */ React13.createElement("div", {
2540
+ key: "scenario-status",
2541
+ style: { marginLeft: "6px", display: "flex", flexDirection: "column", gap: "2px" }
2542
+ }, bars));
2543
+ }
2544
+ }
2545
+ }
2402
2546
  if (data.gitStatus && (data.type === "canvas" || data.type === "overview" || data.type === "workflow")) {
2403
2547
  const gitDisplay = getGitStatusDisplay3(data.gitStatus, theme);
2404
2548
  if (gitDisplay) {
2405
- indicators.push(/* @__PURE__ */ React12.createElement("div", {
2549
+ indicators.push(/* @__PURE__ */ React13.createElement("div", {
2406
2550
  key: "git",
2407
2551
  style: { display: "flex", alignItems: "center", color: gitDisplay.color, marginLeft: "6px" }
2408
2552
  }, gitDisplay.icon));
2409
2553
  }
2410
2554
  }
2411
- if (data.type === "workflow") {
2412
- if (data.isFullyCovered) {
2413
- indicators.push(/* @__PURE__ */ React12.createElement(CheckCircle2, {
2414
- key: "coverage",
2415
- size: 14,
2416
- style: { color: "#10b981", marginLeft: "6px" }
2417
- }));
2418
- } else if (data.hasTraces !== undefined) {
2419
- indicators.push(data.hasTraces ? /* @__PURE__ */ React12.createElement(CircleDot, {
2420
- key: "traces",
2421
- size: 14,
2422
- style: { color: "#10b981", marginLeft: "6px" }
2423
- }) : /* @__PURE__ */ React12.createElement(Circle, {
2424
- key: "traces",
2425
- size: 14,
2426
- style: { color: theme.colors.textMuted, marginLeft: "6px" }
2427
- }));
2428
- }
2429
- }
2430
- if ((data.type === "version" || data.type === "storyboard") && data.hasTraces !== undefined) {
2431
- indicators.push(data.hasTraces ? /* @__PURE__ */ React12.createElement(CircleDot, {
2555
+ if (data.type === "version" && data.hasTraces !== undefined) {
2556
+ indicators.push(data.hasTraces ? /* @__PURE__ */ React13.createElement(CircleDot, {
2432
2557
  key: "traces",
2433
2558
  size: 14,
2434
2559
  style: { color: "#10b981", marginLeft: "6px" }
2435
- }) : /* @__PURE__ */ React12.createElement(Circle, {
2560
+ }) : /* @__PURE__ */ React13.createElement(Circle, {
2436
2561
  key: "traces",
2437
2562
  size: 14,
2438
2563
  style: { color: theme.colors.textMuted, marginLeft: "6px" }
2439
2564
  }));
2440
2565
  }
2441
- return indicators.length > 0 ? /* @__PURE__ */ React12.createElement("div", {
2566
+ return indicators.length > 0 ? /* @__PURE__ */ React13.createElement("div", {
2442
2567
  style: { display: "flex", alignItems: "center" }
2443
2568
  }, indicators) : undefined;
2444
2569
  })();
2445
2570
  const dragConfig = enablePanelDrag ? getDragConfig ? getDragConfig(data) : getDefaultDragConfig(data) : undefined;
2446
- return /* @__PURE__ */ React12.createElement(TreeNode, {
2571
+ return /* @__PURE__ */ React13.createElement(TreeNode, {
2447
2572
  ...props,
2448
2573
  theme,
2449
2574
  nameColor,
@@ -2472,7 +2597,25 @@ var StoryboardWorkflowsTreeCore = ({
2472
2597
  };
2473
2598
  const initialHeight = 600;
2474
2599
  const [containerRef, containerHeight] = useContainerHeight(initialHeight);
2475
- return /* @__PURE__ */ React12.createElement("div", {
2600
+ const treeRef = useRef5(null);
2601
+ const [treeKey, setTreeKey] = useState7(0);
2602
+ const prevOpenStateRef = useRef5(openState);
2603
+ useEffect3(() => {
2604
+ if (openState !== undefined && openState !== prevOpenStateRef.current) {
2605
+ prevOpenStateRef.current = openState;
2606
+ setTreeKey((k) => k + 1);
2607
+ }
2608
+ }, [openState]);
2609
+ const handleToggle = (id) => {
2610
+ if (onToggle && treeRef.current) {
2611
+ const node = treeRef.current.get(id);
2612
+ if (node) {
2613
+ onToggle(id, node.isOpen);
2614
+ }
2615
+ }
2616
+ };
2617
+ const effectiveInitialOpenState = openState ?? initialOpenState;
2618
+ return /* @__PURE__ */ React13.createElement("div", {
2476
2619
  ref: containerRef,
2477
2620
  style: {
2478
2621
  backgroundColor: theme.colors.background,
@@ -2481,12 +2624,15 @@ var StoryboardWorkflowsTreeCore = ({
2481
2624
  height: "100%",
2482
2625
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2483
2626
  }
2484
- }, /* @__PURE__ */ React12.createElement(Tree3, {
2627
+ }, /* @__PURE__ */ React13.createElement(Tree3, {
2628
+ key: treeKey,
2629
+ ref: treeRef,
2485
2630
  data: treeData,
2486
2631
  onSelect: handleSelect,
2487
2632
  openByDefault: defaultOpen,
2488
- ...initialOpenState !== undefined && { initialOpenState },
2633
+ ...effectiveInitialOpenState !== undefined && { initialOpenState: effectiveInitialOpenState },
2489
2634
  ...selectedNodeId !== undefined && { selection: selectedNodeId },
2635
+ ...onToggle !== undefined && { onToggle: handleToggle },
2490
2636
  width: "100%",
2491
2637
  height: containerHeight,
2492
2638
  rowHeight,
@@ -2500,7 +2646,7 @@ function hasWorkflowContent(node) {
2500
2646
  }
2501
2647
  // src/components/WorkflowScenarioTree/WorkflowScenarioTreeCore.tsx
2502
2648
  import { Package as Package2, Workflow as Workflow2, GitCommit as GitCommit2, ListChecks, List } from "lucide-react";
2503
- import React13, { useMemo as useMemo10 } from "react";
2649
+ import React14, { useMemo as useMemo10 } from "react";
2504
2650
  import { Tree as Tree4 } from "react-arborist";
2505
2651
  var buildTreeDataFromWorkflows = (workflows, workflowTraceCounts, scenarioTraceCounts, filterMode, minTraceCount) => {
2506
2652
  const packagesMap = new Map;
@@ -2666,20 +2812,20 @@ var WorkflowScenarioTreeCore = ({
2666
2812
  const NodeRenderer = (props) => {
2667
2813
  const { node } = props;
2668
2814
  const data = node.data;
2669
- const icon = data.type === "version" ? /* @__PURE__ */ React13.createElement(GitCommit2, {
2815
+ const icon = data.type === "version" ? /* @__PURE__ */ React14.createElement(GitCommit2, {
2670
2816
  size: 16
2671
- }) : data.type === "package" ? /* @__PURE__ */ React13.createElement(Package2, {
2817
+ }) : data.type === "package" ? /* @__PURE__ */ React14.createElement(Package2, {
2672
2818
  size: 16
2673
- }) : data.type === "workflow" ? /* @__PURE__ */ React13.createElement(Workflow2, {
2819
+ }) : data.type === "workflow" ? /* @__PURE__ */ React14.createElement(Workflow2, {
2674
2820
  size: 16
2675
- }) : data.type === "scenario" ? data.hasTraces ? /* @__PURE__ */ React13.createElement(ListChecks, {
2821
+ }) : data.type === "scenario" ? data.hasTraces ? /* @__PURE__ */ React14.createElement(ListChecks, {
2676
2822
  size: 16
2677
- }) : /* @__PURE__ */ React13.createElement(List, {
2823
+ }) : /* @__PURE__ */ React14.createElement(List, {
2678
2824
  size: 16
2679
2825
  }) : null;
2680
2826
  const nameColor = data.type === "version" ? data.hasTraces ? "#a855f7" : theme.colors.textMuted : data.type === "package" ? theme.colors.primary : data.type === "workflow" ? data.hasTraces ? theme.colors.success : theme.colors.textSecondary : data.hasTraces ? theme.colors.secondary : theme.colors.textMuted;
2681
2827
  const nodeHorizontalPadding = data.type === "workflow" || data.type === "scenario" ? `calc(${horizontalNodePadding} + 12px)` : horizontalNodePadding;
2682
- const rightContent = data.traceCount !== undefined ? /* @__PURE__ */ React13.createElement("span", {
2828
+ const rightContent = data.traceCount !== undefined ? /* @__PURE__ */ React14.createElement("span", {
2683
2829
  style: {
2684
2830
  marginLeft: "8px",
2685
2831
  fontSize: "12px",
@@ -2687,7 +2833,7 @@ var WorkflowScenarioTreeCore = ({
2687
2833
  fontWeight: 500
2688
2834
  }
2689
2835
  }, data.traceCount) : undefined;
2690
- return /* @__PURE__ */ React13.createElement(TreeNode, {
2836
+ return /* @__PURE__ */ React14.createElement(TreeNode, {
2691
2837
  ...props,
2692
2838
  theme,
2693
2839
  nameColor,
@@ -2708,7 +2854,7 @@ var WorkflowScenarioTreeCore = ({
2708
2854
  };
2709
2855
  const initialHeight = 600;
2710
2856
  const [containerRef, containerHeight] = useContainerHeight(initialHeight);
2711
- return /* @__PURE__ */ React13.createElement("div", {
2857
+ return /* @__PURE__ */ React14.createElement("div", {
2712
2858
  ref: containerRef,
2713
2859
  style: {
2714
2860
  backgroundColor: theme.colors.background,
@@ -2717,7 +2863,7 @@ var WorkflowScenarioTreeCore = ({
2717
2863
  height: "100%",
2718
2864
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2719
2865
  }
2720
- }, /* @__PURE__ */ React13.createElement(Tree4, {
2866
+ }, /* @__PURE__ */ React14.createElement(Tree4, {
2721
2867
  data: treeData,
2722
2868
  onSelect: handleSelect,
2723
2869
  openByDefault: defaultOpen,
@@ -2731,7 +2877,7 @@ var WorkflowScenarioTreeCore = ({
2731
2877
  };
2732
2878
  // src/components/CanvasListTree/CanvasListTreeCore.tsx
2733
2879
  import { Package as Package3, Folder, LayoutDashboard as LayoutDashboard2, FileText } from "lucide-react";
2734
- import React14, { useMemo as useMemo11, useRef as useRef6 } from "react";
2880
+ import React15, { useMemo as useMemo11, useRef as useRef6, useState as useState8, useEffect as useEffect4 } from "react";
2735
2881
  import { Tree as Tree5 } from "react-arborist";
2736
2882
  var buildTreeData = (canvases, gitStatusMap) => {
2737
2883
  const packagesMap = new Map;
@@ -2909,6 +3055,8 @@ var CanvasListTreeCore = ({
2909
3055
  selectedNodeId,
2910
3056
  defaultOpen = false,
2911
3057
  initialOpenState,
3058
+ openState,
3059
+ onToggle,
2912
3060
  horizontalNodePadding = "16px",
2913
3061
  verticalNodePadding = "6px",
2914
3062
  verticalPadding = "20px",
@@ -2932,13 +3080,13 @@ var CanvasListTreeCore = ({
2932
3080
  const NodeRenderer = (props) => {
2933
3081
  const { node } = props;
2934
3082
  const data = node.data;
2935
- const icon = data.type === "package" ? /* @__PURE__ */ React14.createElement(Package3, {
3083
+ const icon = data.type === "package" ? /* @__PURE__ */ React15.createElement(Package3, {
2936
3084
  size: 16
2937
- }) : data.type === "canvas-folder" ? /* @__PURE__ */ React14.createElement(Folder, {
3085
+ }) : data.type === "canvas-folder" ? /* @__PURE__ */ React15.createElement(Folder, {
2938
3086
  size: 16
2939
- }) : data.type === "overview" ? /* @__PURE__ */ React14.createElement(FileText, {
3087
+ }) : data.type === "overview" ? /* @__PURE__ */ React15.createElement(FileText, {
2940
3088
  size: 16
2941
- }) : /* @__PURE__ */ React14.createElement(LayoutDashboard2, {
3089
+ }) : /* @__PURE__ */ React15.createElement(LayoutDashboard2, {
2942
3090
  size: 16
2943
3091
  });
2944
3092
  const nameColor = data.type === "package" ? theme.colors.primary : data.type === "canvas-folder" ? theme.colors.textSecondary : data.type === "overview" ? theme.colors.info || "#3b82f6" : theme.colors.warning || "#f59e0b";
@@ -2947,7 +3095,7 @@ var CanvasListTreeCore = ({
2947
3095
  if (data.gitStatus && (data.type === "canvas" || data.type === "overview")) {
2948
3096
  const gitDisplay = getGitStatusDisplay3(data.gitStatus, theme);
2949
3097
  if (gitDisplay) {
2950
- return /* @__PURE__ */ React14.createElement("div", {
3098
+ return /* @__PURE__ */ React15.createElement("div", {
2951
3099
  style: { display: "flex", alignItems: "center", color: gitDisplay.color, marginLeft: "6px" }
2952
3100
  }, gitDisplay.icon);
2953
3101
  }
@@ -2955,7 +3103,7 @@ var CanvasListTreeCore = ({
2955
3103
  return;
2956
3104
  })();
2957
3105
  const dragConfig = enablePanelDrag ? getDragConfig ? getDragConfig(data) : getDefaultCanvasDragConfig(data) : undefined;
2958
- return /* @__PURE__ */ React14.createElement(TreeNode, {
3106
+ return /* @__PURE__ */ React15.createElement(TreeNode, {
2959
3107
  ...props,
2960
3108
  theme,
2961
3109
  nameColor,
@@ -2984,7 +3132,25 @@ var CanvasListTreeCore = ({
2984
3132
  };
2985
3133
  const initialHeight = 600;
2986
3134
  const [containerRef, containerHeight] = useContainerHeight(initialHeight);
2987
- return /* @__PURE__ */ React14.createElement("div", {
3135
+ const treeRef = useRef6(null);
3136
+ const [treeKey, setTreeKey] = useState8(0);
3137
+ const prevOpenStateRef = useRef6(openState);
3138
+ useEffect4(() => {
3139
+ if (openState !== undefined && openState !== prevOpenStateRef.current) {
3140
+ prevOpenStateRef.current = openState;
3141
+ setTreeKey((k) => k + 1);
3142
+ }
3143
+ }, [openState]);
3144
+ const handleToggle = (id) => {
3145
+ if (onToggle && treeRef.current) {
3146
+ const node = treeRef.current.get(id);
3147
+ if (node) {
3148
+ onToggle(id, node.isOpen);
3149
+ }
3150
+ }
3151
+ };
3152
+ const effectiveInitialOpenState = openState ?? initialOpenState;
3153
+ return /* @__PURE__ */ React15.createElement("div", {
2988
3154
  ref: containerRef,
2989
3155
  style: {
2990
3156
  backgroundColor: theme.colors.background,
@@ -2993,12 +3159,15 @@ var CanvasListTreeCore = ({
2993
3159
  height: "100%",
2994
3160
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2995
3161
  }
2996
- }, /* @__PURE__ */ React14.createElement(Tree5, {
3162
+ }, /* @__PURE__ */ React15.createElement(Tree5, {
3163
+ key: treeKey,
3164
+ ref: treeRef,
2997
3165
  initialData: treeData,
2998
3166
  onSelect: handleSelect,
2999
3167
  openByDefault: defaultOpen,
3000
- ...initialOpenState !== undefined && { initialOpenState },
3168
+ ...effectiveInitialOpenState !== undefined && { initialOpenState: effectiveInitialOpenState },
3001
3169
  ...selectedNodeId !== undefined && { selection: selectedNodeId },
3170
+ ...onToggle !== undefined && { onToggle: handleToggle },
3002
3171
  width: "100%",
3003
3172
  height: containerHeight,
3004
3173
  rowHeight,
@@ -3008,7 +3177,7 @@ var CanvasListTreeCore = ({
3008
3177
  };
3009
3178
  // src/components/RepositoryTree/RepositoryTreeCore.tsx
3010
3179
  import { Folder as Folder2, FolderGit2 } from "lucide-react";
3011
- import React15, { useMemo as useMemo12 } from "react";
3180
+ import React16, { useMemo as useMemo12 } from "react";
3012
3181
  import { Tree as Tree6 } from "react-arborist";
3013
3182
  var buildRepositoryTree = (repositories) => {
3014
3183
  if (repositories.length === 0)
@@ -3122,15 +3291,15 @@ var RepositoryTreeCore = ({
3122
3291
  const NodeRenderer = (props) => {
3123
3292
  const { node } = props;
3124
3293
  const data = node.data;
3125
- const icon = data.type === "directory" ? /* @__PURE__ */ React15.createElement(Folder2, {
3294
+ const icon = data.type === "directory" ? /* @__PURE__ */ React16.createElement(Folder2, {
3126
3295
  size: 16
3127
- }) : /* @__PURE__ */ React15.createElement(FolderGit2, {
3296
+ }) : /* @__PURE__ */ React16.createElement(FolderGit2, {
3128
3297
  size: 16
3129
3298
  });
3130
3299
  const nameColor = data.type === "directory" ? theme.colors.textSecondary : theme.colors.text;
3131
3300
  let rightContent = undefined;
3132
3301
  if (data.type === "directory" && data.repositoryCount !== undefined) {
3133
- rightContent = /* @__PURE__ */ React15.createElement("span", {
3302
+ rightContent = /* @__PURE__ */ React16.createElement("span", {
3134
3303
  style: {
3135
3304
  marginLeft: "8px",
3136
3305
  fontSize: "12px",
@@ -3142,7 +3311,7 @@ var RepositoryTreeCore = ({
3142
3311
  const { owner, name } = data.entry.github;
3143
3312
  const avatarUrl = `https://github.com/${owner}.png?size=32`;
3144
3313
  const repoFullName = `${owner}/${name}`;
3145
- rightContent = /* @__PURE__ */ React15.createElement("img", {
3314
+ rightContent = /* @__PURE__ */ React16.createElement("img", {
3146
3315
  src: avatarUrl,
3147
3316
  alt: owner,
3148
3317
  title: repoFullName,
@@ -3155,7 +3324,7 @@ var RepositoryTreeCore = ({
3155
3324
  }
3156
3325
  });
3157
3326
  }
3158
- return /* @__PURE__ */ React15.createElement(TreeNode, {
3327
+ return /* @__PURE__ */ React16.createElement(TreeNode, {
3159
3328
  ...props,
3160
3329
  theme,
3161
3330
  nameColor,
@@ -3177,7 +3346,7 @@ var RepositoryTreeCore = ({
3177
3346
  const initialHeight = 600;
3178
3347
  const [containerRef, containerHeight] = useContainerHeight(initialHeight);
3179
3348
  const selection = selectedRepositoryPath ? `repo:${selectedRepositoryPath}` : undefined;
3180
- return /* @__PURE__ */ React15.createElement("div", {
3349
+ return /* @__PURE__ */ React16.createElement("div", {
3181
3350
  ref: containerRef,
3182
3351
  style: {
3183
3352
  backgroundColor: theme.colors.background,
@@ -3186,7 +3355,7 @@ var RepositoryTreeCore = ({
3186
3355
  height: "100%",
3187
3356
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
3188
3357
  }
3189
- }, /* @__PURE__ */ React15.createElement(Tree6, {
3358
+ }, /* @__PURE__ */ React16.createElement(Tree6, {
3190
3359
  data: treeData,
3191
3360
  onSelect: handleSelect,
3192
3361
  openByDefault: defaultOpen,
@@ -3205,9 +3374,9 @@ import {
3205
3374
  Circle as Circle2,
3206
3375
  TestTube
3207
3376
  } from "lucide-react";
3208
- import React16, { useMemo as useMemo13, useRef as useRef7 } from "react";
3377
+ import React17, { useMemo as useMemo13, useRef as useRef7 } from "react";
3209
3378
  import { Tree as Tree7 } from "react-arborist";
3210
- var TelemetryCoverageContext = React16.createContext(null);
3379
+ var TelemetryCoverageContext = React17.createContext(null);
3211
3380
  var DEFAULT_TEST_PATTERNS = [
3212
3381
  /\.test\.[jt]sx?$/,
3213
3382
  /\.spec\.[jt]sx?$/,
@@ -3224,7 +3393,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
3224
3393
  switch (status) {
3225
3394
  case "covered":
3226
3395
  return {
3227
- icon: /* @__PURE__ */ React16.createElement(Activity, {
3396
+ icon: /* @__PURE__ */ React17.createElement(Activity, {
3228
3397
  size: 14
3229
3398
  }),
3230
3399
  color: "#22c55e",
@@ -3233,7 +3402,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
3233
3402
  };
3234
3403
  case "partial":
3235
3404
  return {
3236
- icon: /* @__PURE__ */ React16.createElement(CircleDot2, {
3405
+ icon: /* @__PURE__ */ React17.createElement(CircleDot2, {
3237
3406
  size: 14
3238
3407
  }),
3239
3408
  color: "#eab308",
@@ -3242,7 +3411,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
3242
3411
  };
3243
3412
  case "none":
3244
3413
  return {
3245
- icon: /* @__PURE__ */ React16.createElement(Circle2, {
3414
+ icon: /* @__PURE__ */ React17.createElement(Circle2, {
3246
3415
  size: 14
3247
3416
  }),
3248
3417
  color: "#6b7280",
@@ -3354,7 +3523,7 @@ var TelemetryCoverageFileTree = ({
3354
3523
  }, [coverageData]);
3355
3524
  const NodeRenderer = (props) => {
3356
3525
  const { node } = props;
3357
- const ctx = React16.useContext(TelemetryCoverageContext);
3526
+ const ctx = React17.useContext(TelemetryCoverageContext);
3358
3527
  const coverage = ctx?.coverageMap.get(node.data.id);
3359
3528
  const hasTracedChildren = ctx?.hasTracedChildrenMap.get(node.data.id);
3360
3529
  const coverageDisplay = coverage ? getCoverageStatusDisplay(coverage, theme) : null;
@@ -3366,11 +3535,11 @@ var TelemetryCoverageFileTree = ({
3366
3535
  } else if (node.data.isTestFile) {
3367
3536
  nameColor = "#6b728080";
3368
3537
  }
3369
- const leftIcon = node.data.isTestFile && !coverage ? /* @__PURE__ */ React16.createElement(TestTube, {
3538
+ const leftIcon = node.data.isTestFile && !coverage ? /* @__PURE__ */ React17.createElement(TestTube, {
3370
3539
  size: 14,
3371
3540
  style: { marginRight: 4, color: "#6b7280" }
3372
3541
  }) : null;
3373
- const rightContent = coverageDisplay ? /* @__PURE__ */ React16.createElement("div", {
3542
+ const rightContent = coverageDisplay ? /* @__PURE__ */ React17.createElement("div", {
3374
3543
  style: {
3375
3544
  display: "flex",
3376
3545
  alignItems: "center",
@@ -3378,14 +3547,14 @@ var TelemetryCoverageFileTree = ({
3378
3547
  marginRight: "8px"
3379
3548
  },
3380
3549
  title: coverageDisplay.label
3381
- }, coverageDisplay.icon, /* @__PURE__ */ React16.createElement("span", {
3550
+ }, coverageDisplay.icon, /* @__PURE__ */ React17.createElement("span", {
3382
3551
  style: {
3383
3552
  marginLeft: "4px",
3384
3553
  fontSize: theme.fontSizes[0],
3385
3554
  fontWeight: "bold",
3386
3555
  fontFamily: "monospace"
3387
3556
  }
3388
- }, coverageDisplay.badge)) : node.data.isTestFile ? /* @__PURE__ */ React16.createElement("div", {
3557
+ }, coverageDisplay.badge)) : node.data.isTestFile ? /* @__PURE__ */ React17.createElement("div", {
3389
3558
  style: {
3390
3559
  display: "flex",
3391
3560
  alignItems: "center",
@@ -3394,10 +3563,10 @@ var TelemetryCoverageFileTree = ({
3394
3563
  opacity: 0.5
3395
3564
  },
3396
3565
  title: "No telemetry instrumentation"
3397
- }, /* @__PURE__ */ React16.createElement(Circle2, {
3566
+ }, /* @__PURE__ */ React17.createElement(Circle2, {
3398
3567
  size: 14
3399
3568
  })) : null;
3400
- return /* @__PURE__ */ React16.createElement(TreeNode, {
3569
+ return /* @__PURE__ */ React17.createElement(TreeNode, {
3401
3570
  ...props,
3402
3571
  theme,
3403
3572
  rightContent,
@@ -3470,7 +3639,7 @@ var TelemetryCoverageFileTree = ({
3470
3639
  return initialHeight;
3471
3640
  }, [autoHeight, treeData, openByDefault, initialHeight]);
3472
3641
  const [containerRef, containerHeight] = useContainerHeight(calculatedHeight);
3473
- return /* @__PURE__ */ React16.createElement("div", {
3642
+ return /* @__PURE__ */ React17.createElement("div", {
3474
3643
  ref: containerRef,
3475
3644
  style: {
3476
3645
  backgroundColor: transparentBackground ? "transparent" : theme.colors.background,
@@ -3479,9 +3648,9 @@ var TelemetryCoverageFileTree = ({
3479
3648
  ...autoHeight ? {} : { height: "100%" },
3480
3649
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
3481
3650
  }
3482
- }, /* @__PURE__ */ React16.createElement(TelemetryCoverageContext.Provider, {
3651
+ }, /* @__PURE__ */ React17.createElement(TelemetryCoverageContext.Provider, {
3483
3652
  value: { coverageMap, hasTracedChildrenMap }
3484
- }, /* @__PURE__ */ React16.createElement(Tree7, {
3653
+ }, /* @__PURE__ */ React17.createElement(Tree7, {
3485
3654
  data: treeData,
3486
3655
  onSelect: handleSelect,
3487
3656
  ...selectedFile !== undefined && { selection: selectedFile },
@@ -3511,7 +3680,7 @@ var calculateTelemetryCoverageStats = (coverageData) => {
3511
3680
  };
3512
3681
  // src/components/TelemetryCoverageFileTreeContainer.tsx
3513
3682
  import { RefreshCw as RefreshCw2, Eye as Eye2, EyeOff as EyeOff2, AlertCircle as AlertCircle5, Activity as Activity2 } from "lucide-react";
3514
- import React17, { useState as useState7, useMemo as useMemo14 } from "react";
3683
+ import React18, { useState as useState9, useMemo as useMemo14 } from "react";
3515
3684
  var TelemetryCoverageFileTreeContainer = ({
3516
3685
  fileTree,
3517
3686
  theme,
@@ -3531,8 +3700,8 @@ var TelemetryCoverageFileTreeContainer = ({
3531
3700
  verticalNodePadding,
3532
3701
  verticalPadding
3533
3702
  }) => {
3534
- const [filters, setFilters] = useState7([]);
3535
- const [showUncoveredFiles, setShowUncoveredFiles] = useState7(true);
3703
+ const [filters, setFilters] = useState9([]);
3704
+ const [showUncoveredFiles, setShowUncoveredFiles] = useState9(true);
3536
3705
  const selectedDirectories = useMemo14(() => {
3537
3706
  return filters.filter((f) => f.mode === "include").map((f) => f.path);
3538
3707
  }, [filters]);
@@ -3544,34 +3713,34 @@ var TelemetryCoverageFileTreeContainer = ({
3544
3713
  setShowUncoveredFiles(!showUncoveredFiles);
3545
3714
  };
3546
3715
  const percentageColor = stats.percentage >= 80 ? "#22c55e" : stats.percentage >= 50 ? "#eab308" : stats.percentage > 0 ? "#f97316" : "#6b7280";
3547
- return /* @__PURE__ */ React17.createElement("div", {
3716
+ return /* @__PURE__ */ React18.createElement("div", {
3548
3717
  style: { display: "flex", flexDirection: "column", height: "100%" }
3549
- }, showControls && /* @__PURE__ */ React17.createElement("div", {
3718
+ }, showControls && /* @__PURE__ */ React18.createElement("div", {
3550
3719
  style: {
3551
3720
  padding: "12px",
3552
3721
  borderBottom: `1px solid ${theme.colors.border || "#e0e0e0"}`,
3553
3722
  backgroundColor: theme.colors.backgroundSecondary || theme.colors.background
3554
3723
  }
3555
- }, /* @__PURE__ */ React17.createElement("div", {
3724
+ }, /* @__PURE__ */ React18.createElement("div", {
3556
3725
  style: {
3557
3726
  display: "flex",
3558
3727
  alignItems: "center",
3559
3728
  justifyContent: "space-between",
3560
3729
  marginBottom: "8px"
3561
3730
  }
3562
- }, /* @__PURE__ */ React17.createElement("div", {
3731
+ }, /* @__PURE__ */ React18.createElement("div", {
3563
3732
  style: { display: "flex", alignItems: "center", gap: "8px" }
3564
- }, /* @__PURE__ */ React17.createElement(Activity2, {
3733
+ }, /* @__PURE__ */ React18.createElement(Activity2, {
3565
3734
  size: 16,
3566
3735
  color: theme.colors.primary
3567
- }), /* @__PURE__ */ React17.createElement("h3", {
3736
+ }), /* @__PURE__ */ React18.createElement("h3", {
3568
3737
  style: {
3569
3738
  margin: 0,
3570
3739
  fontSize: theme.fontSizes[1],
3571
3740
  fontWeight: "bold",
3572
3741
  color: theme.colors.text
3573
3742
  }
3574
- }, title), stats.testFiles > 0 && /* @__PURE__ */ React17.createElement("span", {
3743
+ }, title), stats.testFiles > 0 && /* @__PURE__ */ React18.createElement("span", {
3575
3744
  style: {
3576
3745
  backgroundColor: percentageColor,
3577
3746
  color: "#ffffff",
@@ -3581,14 +3750,14 @@ var TelemetryCoverageFileTreeContainer = ({
3581
3750
  fontWeight: "bold",
3582
3751
  fontFamily: "monospace"
3583
3752
  }
3584
- }, stats.percentage, "%"), isLoading && /* @__PURE__ */ React17.createElement(RefreshCw2, {
3753
+ }, stats.percentage, "%"), isLoading && /* @__PURE__ */ React18.createElement(RefreshCw2, {
3585
3754
  size: 16,
3586
3755
  color: theme.colors.text,
3587
3756
  className: "telemetry-coverage-spinner",
3588
3757
  style: { animation: "spin 1s linear infinite" }
3589
- })), /* @__PURE__ */ React17.createElement("div", {
3758
+ })), /* @__PURE__ */ React18.createElement("div", {
3590
3759
  style: { display: "flex", gap: "8px" }
3591
- }, /* @__PURE__ */ React17.createElement("button", {
3760
+ }, /* @__PURE__ */ React18.createElement("button", {
3592
3761
  onClick: toggleShowUncoveredFiles,
3593
3762
  style: {
3594
3763
  background: "none",
@@ -3603,11 +3772,11 @@ var TelemetryCoverageFileTreeContainer = ({
3603
3772
  color: theme.colors.text
3604
3773
  },
3605
3774
  title: showUncoveredFiles ? "Show only covered files" : "Show all test files"
3606
- }, showUncoveredFiles ? /* @__PURE__ */ React17.createElement(EyeOff2, {
3775
+ }, showUncoveredFiles ? /* @__PURE__ */ React18.createElement(EyeOff2, {
3607
3776
  size: 14
3608
- }) : /* @__PURE__ */ React17.createElement(Eye2, {
3777
+ }) : /* @__PURE__ */ React18.createElement(Eye2, {
3609
3778
  size: 14
3610
- }), showUncoveredFiles ? "Hide uncovered" : "Show all"), onRefresh && /* @__PURE__ */ React17.createElement("button", {
3779
+ }), showUncoveredFiles ? "Hide uncovered" : "Show all"), onRefresh && /* @__PURE__ */ React18.createElement("button", {
3611
3780
  onClick: handleRefresh,
3612
3781
  disabled: isLoading,
3613
3782
  style: {
@@ -3624,9 +3793,9 @@ var TelemetryCoverageFileTreeContainer = ({
3624
3793
  opacity: isLoading ? 0.6 : 1
3625
3794
  },
3626
3795
  title: "Refresh coverage data"
3627
- }, /* @__PURE__ */ React17.createElement(RefreshCw2, {
3796
+ }, /* @__PURE__ */ React18.createElement(RefreshCw2, {
3628
3797
  size: 14
3629
- }), "Refresh"))), error && /* @__PURE__ */ React17.createElement("div", {
3798
+ }), "Refresh"))), error && /* @__PURE__ */ React18.createElement("div", {
3630
3799
  style: {
3631
3800
  display: "flex",
3632
3801
  alignItems: "center",
@@ -3639,36 +3808,36 @@ var TelemetryCoverageFileTreeContainer = ({
3639
3808
  color: "#856404",
3640
3809
  marginBottom: "8px"
3641
3810
  }
3642
- }, /* @__PURE__ */ React17.createElement(AlertCircle5, {
3811
+ }, /* @__PURE__ */ React18.createElement(AlertCircle5, {
3643
3812
  size: 14
3644
- }), error), !error && stats.testFiles > 0 && /* @__PURE__ */ React17.createElement("div", {
3813
+ }), error), !error && stats.testFiles > 0 && /* @__PURE__ */ React18.createElement("div", {
3645
3814
  style: {
3646
3815
  display: "flex",
3647
3816
  gap: "16px",
3648
3817
  fontSize: theme.fontSizes[0],
3649
3818
  color: theme.colors.textSecondary || "#666"
3650
3819
  }
3651
- }, /* @__PURE__ */ React17.createElement("span", null, /* @__PURE__ */ React17.createElement("strong", {
3820
+ }, /* @__PURE__ */ React18.createElement("span", null, /* @__PURE__ */ React18.createElement("strong", {
3652
3821
  style: { color: "#22c55e" }
3653
- }, stats.coveredFiles), " covered"), stats.partialFiles > 0 && /* @__PURE__ */ React17.createElement("span", null, /* @__PURE__ */ React17.createElement("strong", {
3822
+ }, stats.coveredFiles), " covered"), stats.partialFiles > 0 && /* @__PURE__ */ React18.createElement("span", null, /* @__PURE__ */ React18.createElement("strong", {
3654
3823
  style: { color: "#eab308" }
3655
- }, stats.partialFiles), " partial"), /* @__PURE__ */ React17.createElement("span", null, /* @__PURE__ */ React17.createElement("strong", {
3824
+ }, stats.partialFiles), " partial"), /* @__PURE__ */ React18.createElement("span", null, /* @__PURE__ */ React18.createElement("strong", {
3656
3825
  style: { color: "#6b7280" }
3657
- }, stats.uncoveredFiles), " uncovered"), /* @__PURE__ */ React17.createElement("span", {
3826
+ }, stats.uncoveredFiles), " uncovered"), /* @__PURE__ */ React18.createElement("span", {
3658
3827
  style: { marginLeft: "auto" }
3659
- }, stats.totalTraced, "/", stats.totalTests, " tests traced")), !error && stats.testFiles === 0 && /* @__PURE__ */ React17.createElement("div", {
3828
+ }, stats.totalTraced, "/", stats.totalTests, " tests traced")), !error && stats.testFiles === 0 && /* @__PURE__ */ React18.createElement("div", {
3660
3829
  style: {
3661
3830
  fontSize: theme.fontSizes[0],
3662
3831
  color: theme.colors.textSecondary || "#666"
3663
3832
  }
3664
- }, "No test files with coverage data found")), /* @__PURE__ */ React17.createElement(DirectoryFilterInput, {
3833
+ }, "No test files with coverage data found")), /* @__PURE__ */ React18.createElement(DirectoryFilterInput, {
3665
3834
  fileTree,
3666
3835
  theme,
3667
3836
  filters,
3668
3837
  onFiltersChange: setFilters
3669
- }), /* @__PURE__ */ React17.createElement("div", {
3838
+ }), /* @__PURE__ */ React18.createElement("div", {
3670
3839
  style: { flex: 1, marginTop: "1rem", overflow: "hidden" }
3671
- }, /* @__PURE__ */ React17.createElement(TelemetryCoverageFileTree, {
3840
+ }, /* @__PURE__ */ React18.createElement(TelemetryCoverageFileTree, {
3672
3841
  fileTree,
3673
3842
  theme,
3674
3843
  coverageData,
@@ -3704,6 +3873,7 @@ export {
3704
3873
  TelemetryCoverageFileTreeContainer,
3705
3874
  TelemetryCoverageFileTree,
3706
3875
  StoryboardWorkflowsTreeCore,
3876
+ StatusBar,
3707
3877
  RepositoryTreeCore,
3708
3878
  OrderedFileList,
3709
3879
  MultiFileTreeCore,
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasListTreeCore.d.ts","sourceRoot":"","sources":["../../../../src/components/CanvasListTree/CanvasListTreeCore.tsx"],"names":[],"mappings":"AACA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAQ/C,OAAO,KAAK,EAEV,mBAAmB,EAEpB,MAAM,SAAS,CAAC;AAuNjB,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAuK5D,CAAC"}
1
+ {"version":3,"file":"CanvasListTreeCore.d.ts","sourceRoot":"","sources":["../../../../src/components/CanvasListTree/CanvasListTreeCore.tsx"],"names":[],"mappings":"AACA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAQpE,OAAO,KAAK,EAEV,mBAAmB,EAEpB,MAAM,SAAS,CAAC;AAuNjB,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA0M5D,CAAC"}
@@ -20,6 +20,19 @@ export interface CanvasListTreeProps {
20
20
  selectedNodeId?: string;
21
21
  defaultOpen?: boolean;
22
22
  initialOpenState?: Record<string, boolean>;
23
+ /**
24
+ * Controlled open state for tree nodes. When provided, the tree becomes controlled.
25
+ * Keys are node IDs, values are boolean (true = open, false = closed).
26
+ * Use with onToggle to handle state changes.
27
+ */
28
+ openState?: Record<string, boolean>;
29
+ /**
30
+ * Callback fired when a node is toggled open/closed.
31
+ * Use with openState for controlled mode.
32
+ * @param nodeId - The ID of the toggled node
33
+ * @param isOpen - Whether the node is now open
34
+ */
35
+ onToggle?: (nodeId: string, isOpen: boolean) => void;
23
36
  horizontalNodePadding?: string;
24
37
  verticalNodePadding?: string;
25
38
  verticalPadding?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/CanvasListTree/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG5D,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,eAAe,GAAG,QAAQ,GAAG,UAAU,CAAC;AAErF,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAGhC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAG5B,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;IAGhC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,UAAU,GAAG,SAAS,CAAC;CACtE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/CanvasListTree/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG5D,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,eAAe,GAAG,QAAQ,GAAG,UAAU,CAAC;AAErF,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAGhC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACrD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAG5B,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;IAGhC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,UAAU,GAAG,SAAS,CAAC;CACtE"}
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ export interface StatusBarSegment {
3
+ /** Number of items in this segment */
4
+ count: number;
5
+ /** Color for this segment (hex or CSS color) */
6
+ color: string;
7
+ /** Optional label for tooltip */
8
+ label?: string;
9
+ }
10
+ export interface StatusBarProps {
11
+ /** Array of segments to display */
12
+ segments: StatusBarSegment[];
13
+ /** Total width of the bar in pixels (default: 72) */
14
+ width?: number;
15
+ /** Height of the bar in pixels (default: 6) */
16
+ height?: number;
17
+ /** Gap between segments in pixels (default: 1) */
18
+ gap?: number;
19
+ /** Border radius in pixels (default: 0) */
20
+ borderRadius?: number;
21
+ }
22
+ /**
23
+ * A small inline status bar showing color-coded segments.
24
+ * Used to visualize scenario coverage or node implementation status.
25
+ */
26
+ export declare const StatusBar: React.FC<StatusBarProps>;
27
+ //# sourceMappingURL=StatusBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/StatusBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAiF9C,CAAC"}
@@ -31,4 +31,5 @@ export declare const GitStatusAllTypes: Story;
31
31
  export declare const GitStatusWithVersionGrouping: Story;
32
32
  export declare const GitStatusMixedScenarios: Story;
33
33
  export declare const DragAndDropTest: Story;
34
+ export declare const WithStatusBars: Story;
34
35
  //# sourceMappingURL=StoryboardWorkflowsTree.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StoryboardWorkflowsTree.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTree.stories.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAyP5E,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,2BAA2B,CAOlD,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE1D,eAAO,MAAM,OAAO,EAAE,KAOrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAuE7B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,KAkEpC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAgE7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAU3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAwB/B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAiBlC,CAAC;AA4CF,eAAO,MAAM,eAAe,EAAE,KAe7B,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAqEvC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAyFvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAiH9B,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,KA2GzC,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,KAyEzC,CAAC;AAMF,eAAO,MAAM,aAAa,EAAE,KAwF3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KA0H/B,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,KAwF1C,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,KAuIrC,CAAC;AAMF,eAAO,MAAM,eAAe,EAAE,KAqK7B,CAAC"}
1
+ {"version":3,"file":"StoryboardWorkflowsTree.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTree.stories.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAyP5E,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,2BAA2B,CAOlD,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE1D,eAAO,MAAM,OAAO,EAAE,KAOrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAuE7B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,KAkEpC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAgE7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAU3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAwB/B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAiBlC,CAAC;AA4CF,eAAO,MAAM,eAAe,EAAE,KAe7B,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAqEvC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAyFvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAiH9B,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,KA2GzC,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,KAyEzC,CAAC;AAMF,eAAO,MAAM,aAAa,EAAE,KAwF3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KA0H/B,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,KAwF1C,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,KAuIrC,CAAC;AAMF,eAAO,MAAM,eAAe,EAAE,KAqK7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAoH5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"StoryboardWorkflowsTreeCore.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTreeCore.tsx"],"names":[],"mappings":"AACA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAQ/C,OAAO,KAAK,EAEV,4BAA4B,EAK7B,MAAM,SAAS,CAAC;AA4XjB,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CA2O9E,CAAC"}
1
+ {"version":3,"file":"StoryboardWorkflowsTreeCore.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTreeCore.tsx"],"names":[],"mappings":"AACA,OAAO,KAA+C,MAAM,OAAO,CAAC;AASpE,OAAO,KAAK,EAEV,4BAA4B,EAO7B,MAAM,SAAS,CAAC;AAwYjB,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAoW9E,CAAC"}
@@ -11,6 +11,35 @@ export type StoryboardWorkflowNodeType = 'version' | 'package' | 'storyboard' |
11
11
  * - 'without-traces': Show only workflows that don't have traces
12
12
  */
13
13
  export type StoryboardFilterMode = 'all' | 'with-traces' | 'without-traces';
14
+ /**
15
+ * Status bar data for workflow scenarios
16
+ * Key is workflow ID
17
+ */
18
+ export interface WorkflowScenarioStatus {
19
+ /** Array of scenario statuses in order */
20
+ scenarios: Array<{
21
+ id: string;
22
+ hasTrace: boolean;
23
+ /** Implementation status of nodes in this scenario */
24
+ implementationStatus?: 'draft' | 'partial' | 'implemented';
25
+ }>;
26
+ }
27
+ /**
28
+ * Which status bars to display
29
+ */
30
+ export type StatusBarDisplay = 'implementation' | 'traces' | 'both';
31
+ /**
32
+ * Status bar data for canvas nodes
33
+ * Key is canvas path or storyboard ID
34
+ */
35
+ export interface CanvasNodeStatus {
36
+ /** Number of implemented nodes */
37
+ implemented: number;
38
+ /** Number of approved (but not implemented) nodes */
39
+ approved: number;
40
+ /** Number of draft nodes */
41
+ draft: number;
42
+ }
14
43
  export interface StoryboardWorkflowNodeData extends TreeNodeData {
15
44
  type: StoryboardWorkflowNodeType;
16
45
  children?: StoryboardWorkflowNodeData[];
@@ -26,6 +55,8 @@ export interface StoryboardWorkflowNodeData extends TreeNodeData {
26
55
  repositoryUrl?: string;
27
56
  commitSha?: string;
28
57
  gitStatus?: GitStatus;
58
+ scenarioStatus?: WorkflowScenarioStatus;
59
+ canvasNodeStatus?: CanvasNodeStatus;
29
60
  }
30
61
  /**
31
62
  * Type guard to check if a workflow node has full content (WorkflowTemplate with scenarios)
@@ -42,6 +73,19 @@ export interface StoryboardWorkflowsTreeProps {
42
73
  selectedNodeId?: string;
43
74
  defaultOpen?: boolean;
44
75
  initialOpenState?: Record<string, boolean>;
76
+ /**
77
+ * Controlled open state for tree nodes. When provided, the tree becomes controlled.
78
+ * Keys are node IDs, values are boolean (true = open, false = closed).
79
+ * Use with onToggle to handle state changes.
80
+ */
81
+ openState?: Record<string, boolean>;
82
+ /**
83
+ * Callback fired when a node is toggled open/closed.
84
+ * Use with openState for controlled mode.
85
+ * @param nodeId - The ID of the toggled node
86
+ * @param isOpen - Whether the node is now open
87
+ */
88
+ onToggle?: (nodeId: string, isOpen: boolean) => void;
45
89
  horizontalNodePadding?: string;
46
90
  verticalNodePadding?: string;
47
91
  verticalPadding?: string;
@@ -51,6 +95,12 @@ export interface StoryboardWorkflowsTreeProps {
51
95
  workflowFilterMode?: StoryboardFilterMode;
52
96
  traceWorkflowsSet?: Set<string>;
53
97
  gitStatusData?: GitFileStatus[];
98
+ /** Map of workflow ID to scenario status (for showing scenario coverage bars) */
99
+ scenarioStatusMap?: Record<string, WorkflowScenarioStatus>;
100
+ /** Map of canvas path (or storyboard ID) to node status (for showing implementation bars) */
101
+ canvasNodeStatusMap?: Record<string, CanvasNodeStatus>;
102
+ /** Which status bars to display: 'implementation', 'traces', or 'both' (default: 'both') */
103
+ statusBarDisplay?: StatusBarDisplay;
54
104
  /**
55
105
  * Enable dragging nodes to other panels (e.g., terminal).
56
106
  * When enabled, nodes will transfer their path/data using the panel-framework-core format.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEtL,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG5D,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAE7I,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;AAEjI;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,aAAa,GAAG,gBAAgB,CAAC;AAE5E,MAAM,WAAW,0BAA2B,SAAQ,YAAY;IAC9D,IAAI,EAAE,0BAA0B,CAAC;IACjC,QAAQ,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAGxC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAI1B,QAAQ,CAAC,EAAE,kBAAkB,GAAG,6BAA6B,CAAC;IAE9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,0BAA0B,GAC/B,IAAI,IAAI,0BAA0B,GAAG;IAAE,QAAQ,EAAE,6BAA6B,CAAA;CAAE,CAMlF;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,CAAC,IAAI,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAG9C,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;IAC1C,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAGhC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;IAGhC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,0BAA0B,KAAK,UAAU,GAAG,SAAS,CAAC;CAC9E"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDndManager.d.ts","sourceRoot":"","sources":["../../../src/hooks/useDndManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,mBAAmB,QAAO,eAAe,GAAG,SAGxD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,2BAAyB,KAAG;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAKnG,CAAC"}
1
+ {"version":3,"file":"useDndManager.d.ts","sourceRoot":"","sources":["../../../src/hooks/useDndManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,mBAAmB,QAAO,eAAe,GAAG,SAGxD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,2BAAyB,KAAG;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAKnG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principal-ade/dynamic-file-tree",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "React component for selective directory filtering and file tree visualization",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",