@principal-ade/dynamic-file-tree 0.2.0 → 0.2.2

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":"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"}
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 } 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
  }
@@ -2357,7 +2420,10 @@ var StoryboardWorkflowsTreeCore = ({
2357
2420
  traceWorkflowsSet,
2358
2421
  gitStatusData,
2359
2422
  enablePanelDrag = false,
2360
- getDragConfig
2423
+ getDragConfig,
2424
+ scenarioStatusMap,
2425
+ canvasNodeStatusMap,
2426
+ statusBarDisplay = "both"
2361
2427
  }) => {
2362
2428
  const dndProps = getDndProps(enableDragAndDrop);
2363
2429
  const parentDndManager = useParentDndManager();
@@ -2372,78 +2438,135 @@ var StoryboardWorkflowsTreeCore = ({
2372
2438
  }, [verticalNodePadding]);
2373
2439
  const treeData = useMemo9(() => {
2374
2440
  if (versionSnapshots && versionSnapshots.length > 0) {
2375
- return buildTreeDataFromVersions(versionSnapshots, workflowCoverageMap, workflowFilterMode, traceWorkflowsSet, gitStatusMap);
2441
+ return buildTreeDataFromVersions(versionSnapshots, workflowCoverageMap, workflowFilterMode, traceWorkflowsSet, gitStatusMap, scenarioStatusMap, canvasNodeStatusMap);
2376
2442
  } else {
2377
- return buildTreeDataFromStoryboards(storyboards, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode, undefined, gitStatusMap);
2443
+ return buildTreeDataFromStoryboards(storyboards, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode, undefined, gitStatusMap, scenarioStatusMap, canvasNodeStatusMap);
2378
2444
  }
2379
- }, [storyboards, versionSnapshots, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode, gitStatusMap]);
2445
+ }, [storyboards, versionSnapshots, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode, gitStatusMap, scenarioStatusMap, canvasNodeStatusMap]);
2380
2446
  const NodeRenderer = (props) => {
2381
2447
  const { node } = props;
2382
2448
  const data = node.data;
2383
- const icon = data.type === "version" ? /* @__PURE__ */ React12.createElement(GitCommit, {
2449
+ const icon = data.type === "version" ? /* @__PURE__ */ React13.createElement(GitCommit, {
2384
2450
  size: 16
2385
- }) : data.type === "package" ? /* @__PURE__ */ React12.createElement(Package, {
2451
+ }) : data.type === "package" ? /* @__PURE__ */ React13.createElement(Package, {
2386
2452
  size: 16
2387
- }) : data.type === "storyboard" ? /* @__PURE__ */ React12.createElement(FolderKanban, {
2453
+ }) : data.type === "storyboard" ? /* @__PURE__ */ React13.createElement(FolderKanban, {
2388
2454
  size: 16
2389
- }) : data.type === "overview" ? /* @__PURE__ */ React12.createElement(BookOpen, {
2455
+ }) : data.type === "overview" ? /* @__PURE__ */ React13.createElement(BookOpen, {
2390
2456
  size: 16
2391
- }) : data.type === "canvas" ? /* @__PURE__ */ React12.createElement(LayoutDashboard, {
2457
+ }) : data.type === "canvas" ? /* @__PURE__ */ React13.createElement(LayoutDashboard, {
2392
2458
  size: 16
2393
- }) : data.type === "workflows" ? /* @__PURE__ */ React12.createElement(FolderOpen, {
2459
+ }) : data.type === "workflows" ? /* @__PURE__ */ React13.createElement(FolderOpen, {
2394
2460
  size: 16
2395
- }) : /* @__PURE__ */ React12.createElement(Workflow, {
2461
+ }) : /* @__PURE__ */ React13.createElement(Workflow, {
2396
2462
  size: 16
2397
2463
  });
2398
2464
  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
2465
  const nodeHorizontalPadding = data.type === "overview" || data.type === "canvas" || data.type === "workflows" || data.type === "workflow" ? `calc(${horizontalNodePadding} + 12px)` : horizontalNodePadding;
2400
2466
  const rightContent = (() => {
2401
2467
  const indicators = [];
2468
+ if (data.type === "storyboard" && data.storyboard && scenarioStatusMap && (statusBarDisplay === "traces" || statusBarDisplay === "both")) {
2469
+ let totalTraced = 0;
2470
+ let totalScenarios = 0;
2471
+ for (const workflow of data.storyboard.workflows) {
2472
+ const status = scenarioStatusMap[workflow.id];
2473
+ if (status) {
2474
+ totalTraced += status.scenarios.filter((s) => s.hasTrace).length;
2475
+ totalScenarios += status.scenarios.length;
2476
+ }
2477
+ }
2478
+ if (totalScenarios > 0) {
2479
+ indicators.push(/* @__PURE__ */ React13.createElement("div", {
2480
+ key: "storyboard-traces",
2481
+ style: { marginLeft: "6px" }
2482
+ }, /* @__PURE__ */ React13.createElement(StatusBar, {
2483
+ segments: [
2484
+ { count: totalTraced, color: "#3b82f6", label: "Traced" },
2485
+ { count: totalScenarios - totalTraced, color: "#6b7280", label: "Not traced" }
2486
+ ]
2487
+ })));
2488
+ }
2489
+ }
2490
+ if (data.type === "canvas" && data.canvasNodeStatus && statusBarDisplay !== "traces") {
2491
+ const { implemented, approved, draft } = data.canvasNodeStatus;
2492
+ const total = implemented + approved + draft;
2493
+ if (total > 0) {
2494
+ indicators.push(/* @__PURE__ */ React13.createElement("div", {
2495
+ key: "canvas-status",
2496
+ style: { marginLeft: "6px" }
2497
+ }, /* @__PURE__ */ React13.createElement(StatusBar, {
2498
+ segments: [
2499
+ { count: implemented, color: "#10b981", label: "Implemented" },
2500
+ { count: approved, color: "#f59e0b", label: "Approved" },
2501
+ { count: draft, color: "#6b7280", label: "Draft" }
2502
+ ]
2503
+ })));
2504
+ }
2505
+ }
2506
+ if (data.type === "workflow" && data.scenarioStatus) {
2507
+ const { scenarios } = data.scenarioStatus;
2508
+ if (scenarios.length > 0) {
2509
+ const bars = [];
2510
+ if (statusBarDisplay === "implementation" || statusBarDisplay === "both") {
2511
+ const implemented = scenarios.filter((s) => s.implementationStatus === "implemented").length;
2512
+ const partial = scenarios.filter((s) => s.implementationStatus === "partial").length;
2513
+ const draft = scenarios.filter((s) => !s.implementationStatus || s.implementationStatus === "draft").length;
2514
+ if (implemented + partial + draft > 0) {
2515
+ bars.push(/* @__PURE__ */ React13.createElement(StatusBar, {
2516
+ key: "impl",
2517
+ segments: [
2518
+ { count: implemented, color: "#10b981", label: "Implemented" },
2519
+ { count: partial, color: "#f59e0b", label: "Partial" },
2520
+ { count: draft, color: "#6b7280", label: "Draft" }
2521
+ ]
2522
+ }));
2523
+ }
2524
+ }
2525
+ if (statusBarDisplay === "traces" || statusBarDisplay === "both") {
2526
+ const traced = scenarios.filter((s) => s.hasTrace).length;
2527
+ const untraced = scenarios.length - traced;
2528
+ bars.push(/* @__PURE__ */ React13.createElement(StatusBar, {
2529
+ key: "traces",
2530
+ segments: [
2531
+ { count: traced, color: "#3b82f6", label: "Traced" },
2532
+ { count: untraced, color: "#6b7280", label: "Not traced" }
2533
+ ]
2534
+ }));
2535
+ }
2536
+ if (bars.length > 0) {
2537
+ indicators.push(/* @__PURE__ */ React13.createElement("div", {
2538
+ key: "scenario-status",
2539
+ style: { marginLeft: "6px", display: "flex", flexDirection: "column", gap: "2px" }
2540
+ }, bars));
2541
+ }
2542
+ }
2543
+ }
2402
2544
  if (data.gitStatus && (data.type === "canvas" || data.type === "overview" || data.type === "workflow")) {
2403
2545
  const gitDisplay = getGitStatusDisplay3(data.gitStatus, theme);
2404
2546
  if (gitDisplay) {
2405
- indicators.push(/* @__PURE__ */ React12.createElement("div", {
2547
+ indicators.push(/* @__PURE__ */ React13.createElement("div", {
2406
2548
  key: "git",
2407
2549
  style: { display: "flex", alignItems: "center", color: gitDisplay.color, marginLeft: "6px" }
2408
2550
  }, gitDisplay.icon));
2409
2551
  }
2410
2552
  }
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, {
2553
+ if (data.type === "version" && data.hasTraces !== undefined) {
2554
+ indicators.push(data.hasTraces ? /* @__PURE__ */ React13.createElement(CircleDot, {
2432
2555
  key: "traces",
2433
2556
  size: 14,
2434
2557
  style: { color: "#10b981", marginLeft: "6px" }
2435
- }) : /* @__PURE__ */ React12.createElement(Circle, {
2558
+ }) : /* @__PURE__ */ React13.createElement(Circle, {
2436
2559
  key: "traces",
2437
2560
  size: 14,
2438
2561
  style: { color: theme.colors.textMuted, marginLeft: "6px" }
2439
2562
  }));
2440
2563
  }
2441
- return indicators.length > 0 ? /* @__PURE__ */ React12.createElement("div", {
2564
+ return indicators.length > 0 ? /* @__PURE__ */ React13.createElement("div", {
2442
2565
  style: { display: "flex", alignItems: "center" }
2443
2566
  }, indicators) : undefined;
2444
2567
  })();
2445
2568
  const dragConfig = enablePanelDrag ? getDragConfig ? getDragConfig(data) : getDefaultDragConfig(data) : undefined;
2446
- return /* @__PURE__ */ React12.createElement(TreeNode, {
2569
+ return /* @__PURE__ */ React13.createElement(TreeNode, {
2447
2570
  ...props,
2448
2571
  theme,
2449
2572
  nameColor,
@@ -2472,7 +2595,7 @@ var StoryboardWorkflowsTreeCore = ({
2472
2595
  };
2473
2596
  const initialHeight = 600;
2474
2597
  const [containerRef, containerHeight] = useContainerHeight(initialHeight);
2475
- return /* @__PURE__ */ React12.createElement("div", {
2598
+ return /* @__PURE__ */ React13.createElement("div", {
2476
2599
  ref: containerRef,
2477
2600
  style: {
2478
2601
  backgroundColor: theme.colors.background,
@@ -2481,7 +2604,7 @@ var StoryboardWorkflowsTreeCore = ({
2481
2604
  height: "100%",
2482
2605
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2483
2606
  }
2484
- }, /* @__PURE__ */ React12.createElement(Tree3, {
2607
+ }, /* @__PURE__ */ React13.createElement(Tree3, {
2485
2608
  data: treeData,
2486
2609
  onSelect: handleSelect,
2487
2610
  openByDefault: defaultOpen,
@@ -2500,7 +2623,7 @@ function hasWorkflowContent(node) {
2500
2623
  }
2501
2624
  // src/components/WorkflowScenarioTree/WorkflowScenarioTreeCore.tsx
2502
2625
  import { Package as Package2, Workflow as Workflow2, GitCommit as GitCommit2, ListChecks, List } from "lucide-react";
2503
- import React13, { useMemo as useMemo10 } from "react";
2626
+ import React14, { useMemo as useMemo10 } from "react";
2504
2627
  import { Tree as Tree4 } from "react-arborist";
2505
2628
  var buildTreeDataFromWorkflows = (workflows, workflowTraceCounts, scenarioTraceCounts, filterMode, minTraceCount) => {
2506
2629
  const packagesMap = new Map;
@@ -2666,20 +2789,20 @@ var WorkflowScenarioTreeCore = ({
2666
2789
  const NodeRenderer = (props) => {
2667
2790
  const { node } = props;
2668
2791
  const data = node.data;
2669
- const icon = data.type === "version" ? /* @__PURE__ */ React13.createElement(GitCommit2, {
2792
+ const icon = data.type === "version" ? /* @__PURE__ */ React14.createElement(GitCommit2, {
2670
2793
  size: 16
2671
- }) : data.type === "package" ? /* @__PURE__ */ React13.createElement(Package2, {
2794
+ }) : data.type === "package" ? /* @__PURE__ */ React14.createElement(Package2, {
2672
2795
  size: 16
2673
- }) : data.type === "workflow" ? /* @__PURE__ */ React13.createElement(Workflow2, {
2796
+ }) : data.type === "workflow" ? /* @__PURE__ */ React14.createElement(Workflow2, {
2674
2797
  size: 16
2675
- }) : data.type === "scenario" ? data.hasTraces ? /* @__PURE__ */ React13.createElement(ListChecks, {
2798
+ }) : data.type === "scenario" ? data.hasTraces ? /* @__PURE__ */ React14.createElement(ListChecks, {
2676
2799
  size: 16
2677
- }) : /* @__PURE__ */ React13.createElement(List, {
2800
+ }) : /* @__PURE__ */ React14.createElement(List, {
2678
2801
  size: 16
2679
2802
  }) : null;
2680
2803
  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
2804
  const nodeHorizontalPadding = data.type === "workflow" || data.type === "scenario" ? `calc(${horizontalNodePadding} + 12px)` : horizontalNodePadding;
2682
- const rightContent = data.traceCount !== undefined ? /* @__PURE__ */ React13.createElement("span", {
2805
+ const rightContent = data.traceCount !== undefined ? /* @__PURE__ */ React14.createElement("span", {
2683
2806
  style: {
2684
2807
  marginLeft: "8px",
2685
2808
  fontSize: "12px",
@@ -2687,7 +2810,7 @@ var WorkflowScenarioTreeCore = ({
2687
2810
  fontWeight: 500
2688
2811
  }
2689
2812
  }, data.traceCount) : undefined;
2690
- return /* @__PURE__ */ React13.createElement(TreeNode, {
2813
+ return /* @__PURE__ */ React14.createElement(TreeNode, {
2691
2814
  ...props,
2692
2815
  theme,
2693
2816
  nameColor,
@@ -2708,7 +2831,7 @@ var WorkflowScenarioTreeCore = ({
2708
2831
  };
2709
2832
  const initialHeight = 600;
2710
2833
  const [containerRef, containerHeight] = useContainerHeight(initialHeight);
2711
- return /* @__PURE__ */ React13.createElement("div", {
2834
+ return /* @__PURE__ */ React14.createElement("div", {
2712
2835
  ref: containerRef,
2713
2836
  style: {
2714
2837
  backgroundColor: theme.colors.background,
@@ -2717,7 +2840,7 @@ var WorkflowScenarioTreeCore = ({
2717
2840
  height: "100%",
2718
2841
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2719
2842
  }
2720
- }, /* @__PURE__ */ React13.createElement(Tree4, {
2843
+ }, /* @__PURE__ */ React14.createElement(Tree4, {
2721
2844
  data: treeData,
2722
2845
  onSelect: handleSelect,
2723
2846
  openByDefault: defaultOpen,
@@ -2731,7 +2854,7 @@ var WorkflowScenarioTreeCore = ({
2731
2854
  };
2732
2855
  // src/components/CanvasListTree/CanvasListTreeCore.tsx
2733
2856
  import { Package as Package3, Folder, LayoutDashboard as LayoutDashboard2, FileText } from "lucide-react";
2734
- import React14, { useMemo as useMemo11, useRef as useRef6 } from "react";
2857
+ import React15, { useMemo as useMemo11, useRef as useRef6 } from "react";
2735
2858
  import { Tree as Tree5 } from "react-arborist";
2736
2859
  var buildTreeData = (canvases, gitStatusMap) => {
2737
2860
  const packagesMap = new Map;
@@ -2932,13 +3055,13 @@ var CanvasListTreeCore = ({
2932
3055
  const NodeRenderer = (props) => {
2933
3056
  const { node } = props;
2934
3057
  const data = node.data;
2935
- const icon = data.type === "package" ? /* @__PURE__ */ React14.createElement(Package3, {
3058
+ const icon = data.type === "package" ? /* @__PURE__ */ React15.createElement(Package3, {
2936
3059
  size: 16
2937
- }) : data.type === "canvas-folder" ? /* @__PURE__ */ React14.createElement(Folder, {
3060
+ }) : data.type === "canvas-folder" ? /* @__PURE__ */ React15.createElement(Folder, {
2938
3061
  size: 16
2939
- }) : data.type === "overview" ? /* @__PURE__ */ React14.createElement(FileText, {
3062
+ }) : data.type === "overview" ? /* @__PURE__ */ React15.createElement(FileText, {
2940
3063
  size: 16
2941
- }) : /* @__PURE__ */ React14.createElement(LayoutDashboard2, {
3064
+ }) : /* @__PURE__ */ React15.createElement(LayoutDashboard2, {
2942
3065
  size: 16
2943
3066
  });
2944
3067
  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 +3070,7 @@ var CanvasListTreeCore = ({
2947
3070
  if (data.gitStatus && (data.type === "canvas" || data.type === "overview")) {
2948
3071
  const gitDisplay = getGitStatusDisplay3(data.gitStatus, theme);
2949
3072
  if (gitDisplay) {
2950
- return /* @__PURE__ */ React14.createElement("div", {
3073
+ return /* @__PURE__ */ React15.createElement("div", {
2951
3074
  style: { display: "flex", alignItems: "center", color: gitDisplay.color, marginLeft: "6px" }
2952
3075
  }, gitDisplay.icon);
2953
3076
  }
@@ -2955,7 +3078,7 @@ var CanvasListTreeCore = ({
2955
3078
  return;
2956
3079
  })();
2957
3080
  const dragConfig = enablePanelDrag ? getDragConfig ? getDragConfig(data) : getDefaultCanvasDragConfig(data) : undefined;
2958
- return /* @__PURE__ */ React14.createElement(TreeNode, {
3081
+ return /* @__PURE__ */ React15.createElement(TreeNode, {
2959
3082
  ...props,
2960
3083
  theme,
2961
3084
  nameColor,
@@ -2984,7 +3107,7 @@ var CanvasListTreeCore = ({
2984
3107
  };
2985
3108
  const initialHeight = 600;
2986
3109
  const [containerRef, containerHeight] = useContainerHeight(initialHeight);
2987
- return /* @__PURE__ */ React14.createElement("div", {
3110
+ return /* @__PURE__ */ React15.createElement("div", {
2988
3111
  ref: containerRef,
2989
3112
  style: {
2990
3113
  backgroundColor: theme.colors.background,
@@ -2993,7 +3116,7 @@ var CanvasListTreeCore = ({
2993
3116
  height: "100%",
2994
3117
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2995
3118
  }
2996
- }, /* @__PURE__ */ React14.createElement(Tree5, {
3119
+ }, /* @__PURE__ */ React15.createElement(Tree5, {
2997
3120
  initialData: treeData,
2998
3121
  onSelect: handleSelect,
2999
3122
  openByDefault: defaultOpen,
@@ -3008,7 +3131,7 @@ var CanvasListTreeCore = ({
3008
3131
  };
3009
3132
  // src/components/RepositoryTree/RepositoryTreeCore.tsx
3010
3133
  import { Folder as Folder2, FolderGit2 } from "lucide-react";
3011
- import React15, { useMemo as useMemo12 } from "react";
3134
+ import React16, { useMemo as useMemo12 } from "react";
3012
3135
  import { Tree as Tree6 } from "react-arborist";
3013
3136
  var buildRepositoryTree = (repositories) => {
3014
3137
  if (repositories.length === 0)
@@ -3122,15 +3245,15 @@ var RepositoryTreeCore = ({
3122
3245
  const NodeRenderer = (props) => {
3123
3246
  const { node } = props;
3124
3247
  const data = node.data;
3125
- const icon = data.type === "directory" ? /* @__PURE__ */ React15.createElement(Folder2, {
3248
+ const icon = data.type === "directory" ? /* @__PURE__ */ React16.createElement(Folder2, {
3126
3249
  size: 16
3127
- }) : /* @__PURE__ */ React15.createElement(FolderGit2, {
3250
+ }) : /* @__PURE__ */ React16.createElement(FolderGit2, {
3128
3251
  size: 16
3129
3252
  });
3130
3253
  const nameColor = data.type === "directory" ? theme.colors.textSecondary : theme.colors.text;
3131
3254
  let rightContent = undefined;
3132
3255
  if (data.type === "directory" && data.repositoryCount !== undefined) {
3133
- rightContent = /* @__PURE__ */ React15.createElement("span", {
3256
+ rightContent = /* @__PURE__ */ React16.createElement("span", {
3134
3257
  style: {
3135
3258
  marginLeft: "8px",
3136
3259
  fontSize: "12px",
@@ -3142,7 +3265,7 @@ var RepositoryTreeCore = ({
3142
3265
  const { owner, name } = data.entry.github;
3143
3266
  const avatarUrl = `https://github.com/${owner}.png?size=32`;
3144
3267
  const repoFullName = `${owner}/${name}`;
3145
- rightContent = /* @__PURE__ */ React15.createElement("img", {
3268
+ rightContent = /* @__PURE__ */ React16.createElement("img", {
3146
3269
  src: avatarUrl,
3147
3270
  alt: owner,
3148
3271
  title: repoFullName,
@@ -3155,7 +3278,7 @@ var RepositoryTreeCore = ({
3155
3278
  }
3156
3279
  });
3157
3280
  }
3158
- return /* @__PURE__ */ React15.createElement(TreeNode, {
3281
+ return /* @__PURE__ */ React16.createElement(TreeNode, {
3159
3282
  ...props,
3160
3283
  theme,
3161
3284
  nameColor,
@@ -3177,7 +3300,7 @@ var RepositoryTreeCore = ({
3177
3300
  const initialHeight = 600;
3178
3301
  const [containerRef, containerHeight] = useContainerHeight(initialHeight);
3179
3302
  const selection = selectedRepositoryPath ? `repo:${selectedRepositoryPath}` : undefined;
3180
- return /* @__PURE__ */ React15.createElement("div", {
3303
+ return /* @__PURE__ */ React16.createElement("div", {
3181
3304
  ref: containerRef,
3182
3305
  style: {
3183
3306
  backgroundColor: theme.colors.background,
@@ -3186,7 +3309,7 @@ var RepositoryTreeCore = ({
3186
3309
  height: "100%",
3187
3310
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
3188
3311
  }
3189
- }, /* @__PURE__ */ React15.createElement(Tree6, {
3312
+ }, /* @__PURE__ */ React16.createElement(Tree6, {
3190
3313
  data: treeData,
3191
3314
  onSelect: handleSelect,
3192
3315
  openByDefault: defaultOpen,
@@ -3205,9 +3328,9 @@ import {
3205
3328
  Circle as Circle2,
3206
3329
  TestTube
3207
3330
  } from "lucide-react";
3208
- import React16, { useMemo as useMemo13, useRef as useRef7 } from "react";
3331
+ import React17, { useMemo as useMemo13, useRef as useRef7 } from "react";
3209
3332
  import { Tree as Tree7 } from "react-arborist";
3210
- var TelemetryCoverageContext = React16.createContext(null);
3333
+ var TelemetryCoverageContext = React17.createContext(null);
3211
3334
  var DEFAULT_TEST_PATTERNS = [
3212
3335
  /\.test\.[jt]sx?$/,
3213
3336
  /\.spec\.[jt]sx?$/,
@@ -3224,7 +3347,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
3224
3347
  switch (status) {
3225
3348
  case "covered":
3226
3349
  return {
3227
- icon: /* @__PURE__ */ React16.createElement(Activity, {
3350
+ icon: /* @__PURE__ */ React17.createElement(Activity, {
3228
3351
  size: 14
3229
3352
  }),
3230
3353
  color: "#22c55e",
@@ -3233,7 +3356,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
3233
3356
  };
3234
3357
  case "partial":
3235
3358
  return {
3236
- icon: /* @__PURE__ */ React16.createElement(CircleDot2, {
3359
+ icon: /* @__PURE__ */ React17.createElement(CircleDot2, {
3237
3360
  size: 14
3238
3361
  }),
3239
3362
  color: "#eab308",
@@ -3242,7 +3365,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
3242
3365
  };
3243
3366
  case "none":
3244
3367
  return {
3245
- icon: /* @__PURE__ */ React16.createElement(Circle2, {
3368
+ icon: /* @__PURE__ */ React17.createElement(Circle2, {
3246
3369
  size: 14
3247
3370
  }),
3248
3371
  color: "#6b7280",
@@ -3354,7 +3477,7 @@ var TelemetryCoverageFileTree = ({
3354
3477
  }, [coverageData]);
3355
3478
  const NodeRenderer = (props) => {
3356
3479
  const { node } = props;
3357
- const ctx = React16.useContext(TelemetryCoverageContext);
3480
+ const ctx = React17.useContext(TelemetryCoverageContext);
3358
3481
  const coverage = ctx?.coverageMap.get(node.data.id);
3359
3482
  const hasTracedChildren = ctx?.hasTracedChildrenMap.get(node.data.id);
3360
3483
  const coverageDisplay = coverage ? getCoverageStatusDisplay(coverage, theme) : null;
@@ -3366,11 +3489,11 @@ var TelemetryCoverageFileTree = ({
3366
3489
  } else if (node.data.isTestFile) {
3367
3490
  nameColor = "#6b728080";
3368
3491
  }
3369
- const leftIcon = node.data.isTestFile && !coverage ? /* @__PURE__ */ React16.createElement(TestTube, {
3492
+ const leftIcon = node.data.isTestFile && !coverage ? /* @__PURE__ */ React17.createElement(TestTube, {
3370
3493
  size: 14,
3371
3494
  style: { marginRight: 4, color: "#6b7280" }
3372
3495
  }) : null;
3373
- const rightContent = coverageDisplay ? /* @__PURE__ */ React16.createElement("div", {
3496
+ const rightContent = coverageDisplay ? /* @__PURE__ */ React17.createElement("div", {
3374
3497
  style: {
3375
3498
  display: "flex",
3376
3499
  alignItems: "center",
@@ -3378,14 +3501,14 @@ var TelemetryCoverageFileTree = ({
3378
3501
  marginRight: "8px"
3379
3502
  },
3380
3503
  title: coverageDisplay.label
3381
- }, coverageDisplay.icon, /* @__PURE__ */ React16.createElement("span", {
3504
+ }, coverageDisplay.icon, /* @__PURE__ */ React17.createElement("span", {
3382
3505
  style: {
3383
3506
  marginLeft: "4px",
3384
3507
  fontSize: theme.fontSizes[0],
3385
3508
  fontWeight: "bold",
3386
3509
  fontFamily: "monospace"
3387
3510
  }
3388
- }, coverageDisplay.badge)) : node.data.isTestFile ? /* @__PURE__ */ React16.createElement("div", {
3511
+ }, coverageDisplay.badge)) : node.data.isTestFile ? /* @__PURE__ */ React17.createElement("div", {
3389
3512
  style: {
3390
3513
  display: "flex",
3391
3514
  alignItems: "center",
@@ -3394,10 +3517,10 @@ var TelemetryCoverageFileTree = ({
3394
3517
  opacity: 0.5
3395
3518
  },
3396
3519
  title: "No telemetry instrumentation"
3397
- }, /* @__PURE__ */ React16.createElement(Circle2, {
3520
+ }, /* @__PURE__ */ React17.createElement(Circle2, {
3398
3521
  size: 14
3399
3522
  })) : null;
3400
- return /* @__PURE__ */ React16.createElement(TreeNode, {
3523
+ return /* @__PURE__ */ React17.createElement(TreeNode, {
3401
3524
  ...props,
3402
3525
  theme,
3403
3526
  rightContent,
@@ -3470,7 +3593,7 @@ var TelemetryCoverageFileTree = ({
3470
3593
  return initialHeight;
3471
3594
  }, [autoHeight, treeData, openByDefault, initialHeight]);
3472
3595
  const [containerRef, containerHeight] = useContainerHeight(calculatedHeight);
3473
- return /* @__PURE__ */ React16.createElement("div", {
3596
+ return /* @__PURE__ */ React17.createElement("div", {
3474
3597
  ref: containerRef,
3475
3598
  style: {
3476
3599
  backgroundColor: transparentBackground ? "transparent" : theme.colors.background,
@@ -3479,9 +3602,9 @@ var TelemetryCoverageFileTree = ({
3479
3602
  ...autoHeight ? {} : { height: "100%" },
3480
3603
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
3481
3604
  }
3482
- }, /* @__PURE__ */ React16.createElement(TelemetryCoverageContext.Provider, {
3605
+ }, /* @__PURE__ */ React17.createElement(TelemetryCoverageContext.Provider, {
3483
3606
  value: { coverageMap, hasTracedChildrenMap }
3484
- }, /* @__PURE__ */ React16.createElement(Tree7, {
3607
+ }, /* @__PURE__ */ React17.createElement(Tree7, {
3485
3608
  data: treeData,
3486
3609
  onSelect: handleSelect,
3487
3610
  ...selectedFile !== undefined && { selection: selectedFile },
@@ -3511,7 +3634,7 @@ var calculateTelemetryCoverageStats = (coverageData) => {
3511
3634
  };
3512
3635
  // src/components/TelemetryCoverageFileTreeContainer.tsx
3513
3636
  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";
3637
+ import React18, { useState as useState7, useMemo as useMemo14 } from "react";
3515
3638
  var TelemetryCoverageFileTreeContainer = ({
3516
3639
  fileTree,
3517
3640
  theme,
@@ -3544,34 +3667,34 @@ var TelemetryCoverageFileTreeContainer = ({
3544
3667
  setShowUncoveredFiles(!showUncoveredFiles);
3545
3668
  };
3546
3669
  const percentageColor = stats.percentage >= 80 ? "#22c55e" : stats.percentage >= 50 ? "#eab308" : stats.percentage > 0 ? "#f97316" : "#6b7280";
3547
- return /* @__PURE__ */ React17.createElement("div", {
3670
+ return /* @__PURE__ */ React18.createElement("div", {
3548
3671
  style: { display: "flex", flexDirection: "column", height: "100%" }
3549
- }, showControls && /* @__PURE__ */ React17.createElement("div", {
3672
+ }, showControls && /* @__PURE__ */ React18.createElement("div", {
3550
3673
  style: {
3551
3674
  padding: "12px",
3552
3675
  borderBottom: `1px solid ${theme.colors.border || "#e0e0e0"}`,
3553
3676
  backgroundColor: theme.colors.backgroundSecondary || theme.colors.background
3554
3677
  }
3555
- }, /* @__PURE__ */ React17.createElement("div", {
3678
+ }, /* @__PURE__ */ React18.createElement("div", {
3556
3679
  style: {
3557
3680
  display: "flex",
3558
3681
  alignItems: "center",
3559
3682
  justifyContent: "space-between",
3560
3683
  marginBottom: "8px"
3561
3684
  }
3562
- }, /* @__PURE__ */ React17.createElement("div", {
3685
+ }, /* @__PURE__ */ React18.createElement("div", {
3563
3686
  style: { display: "flex", alignItems: "center", gap: "8px" }
3564
- }, /* @__PURE__ */ React17.createElement(Activity2, {
3687
+ }, /* @__PURE__ */ React18.createElement(Activity2, {
3565
3688
  size: 16,
3566
3689
  color: theme.colors.primary
3567
- }), /* @__PURE__ */ React17.createElement("h3", {
3690
+ }), /* @__PURE__ */ React18.createElement("h3", {
3568
3691
  style: {
3569
3692
  margin: 0,
3570
3693
  fontSize: theme.fontSizes[1],
3571
3694
  fontWeight: "bold",
3572
3695
  color: theme.colors.text
3573
3696
  }
3574
- }, title), stats.testFiles > 0 && /* @__PURE__ */ React17.createElement("span", {
3697
+ }, title), stats.testFiles > 0 && /* @__PURE__ */ React18.createElement("span", {
3575
3698
  style: {
3576
3699
  backgroundColor: percentageColor,
3577
3700
  color: "#ffffff",
@@ -3581,14 +3704,14 @@ var TelemetryCoverageFileTreeContainer = ({
3581
3704
  fontWeight: "bold",
3582
3705
  fontFamily: "monospace"
3583
3706
  }
3584
- }, stats.percentage, "%"), isLoading && /* @__PURE__ */ React17.createElement(RefreshCw2, {
3707
+ }, stats.percentage, "%"), isLoading && /* @__PURE__ */ React18.createElement(RefreshCw2, {
3585
3708
  size: 16,
3586
3709
  color: theme.colors.text,
3587
3710
  className: "telemetry-coverage-spinner",
3588
3711
  style: { animation: "spin 1s linear infinite" }
3589
- })), /* @__PURE__ */ React17.createElement("div", {
3712
+ })), /* @__PURE__ */ React18.createElement("div", {
3590
3713
  style: { display: "flex", gap: "8px" }
3591
- }, /* @__PURE__ */ React17.createElement("button", {
3714
+ }, /* @__PURE__ */ React18.createElement("button", {
3592
3715
  onClick: toggleShowUncoveredFiles,
3593
3716
  style: {
3594
3717
  background: "none",
@@ -3603,11 +3726,11 @@ var TelemetryCoverageFileTreeContainer = ({
3603
3726
  color: theme.colors.text
3604
3727
  },
3605
3728
  title: showUncoveredFiles ? "Show only covered files" : "Show all test files"
3606
- }, showUncoveredFiles ? /* @__PURE__ */ React17.createElement(EyeOff2, {
3729
+ }, showUncoveredFiles ? /* @__PURE__ */ React18.createElement(EyeOff2, {
3607
3730
  size: 14
3608
- }) : /* @__PURE__ */ React17.createElement(Eye2, {
3731
+ }) : /* @__PURE__ */ React18.createElement(Eye2, {
3609
3732
  size: 14
3610
- }), showUncoveredFiles ? "Hide uncovered" : "Show all"), onRefresh && /* @__PURE__ */ React17.createElement("button", {
3733
+ }), showUncoveredFiles ? "Hide uncovered" : "Show all"), onRefresh && /* @__PURE__ */ React18.createElement("button", {
3611
3734
  onClick: handleRefresh,
3612
3735
  disabled: isLoading,
3613
3736
  style: {
@@ -3624,9 +3747,9 @@ var TelemetryCoverageFileTreeContainer = ({
3624
3747
  opacity: isLoading ? 0.6 : 1
3625
3748
  },
3626
3749
  title: "Refresh coverage data"
3627
- }, /* @__PURE__ */ React17.createElement(RefreshCw2, {
3750
+ }, /* @__PURE__ */ React18.createElement(RefreshCw2, {
3628
3751
  size: 14
3629
- }), "Refresh"))), error && /* @__PURE__ */ React17.createElement("div", {
3752
+ }), "Refresh"))), error && /* @__PURE__ */ React18.createElement("div", {
3630
3753
  style: {
3631
3754
  display: "flex",
3632
3755
  alignItems: "center",
@@ -3639,36 +3762,36 @@ var TelemetryCoverageFileTreeContainer = ({
3639
3762
  color: "#856404",
3640
3763
  marginBottom: "8px"
3641
3764
  }
3642
- }, /* @__PURE__ */ React17.createElement(AlertCircle5, {
3765
+ }, /* @__PURE__ */ React18.createElement(AlertCircle5, {
3643
3766
  size: 14
3644
- }), error), !error && stats.testFiles > 0 && /* @__PURE__ */ React17.createElement("div", {
3767
+ }), error), !error && stats.testFiles > 0 && /* @__PURE__ */ React18.createElement("div", {
3645
3768
  style: {
3646
3769
  display: "flex",
3647
3770
  gap: "16px",
3648
3771
  fontSize: theme.fontSizes[0],
3649
3772
  color: theme.colors.textSecondary || "#666"
3650
3773
  }
3651
- }, /* @__PURE__ */ React17.createElement("span", null, /* @__PURE__ */ React17.createElement("strong", {
3774
+ }, /* @__PURE__ */ React18.createElement("span", null, /* @__PURE__ */ React18.createElement("strong", {
3652
3775
  style: { color: "#22c55e" }
3653
- }, stats.coveredFiles), " covered"), stats.partialFiles > 0 && /* @__PURE__ */ React17.createElement("span", null, /* @__PURE__ */ React17.createElement("strong", {
3776
+ }, stats.coveredFiles), " covered"), stats.partialFiles > 0 && /* @__PURE__ */ React18.createElement("span", null, /* @__PURE__ */ React18.createElement("strong", {
3654
3777
  style: { color: "#eab308" }
3655
- }, stats.partialFiles), " partial"), /* @__PURE__ */ React17.createElement("span", null, /* @__PURE__ */ React17.createElement("strong", {
3778
+ }, stats.partialFiles), " partial"), /* @__PURE__ */ React18.createElement("span", null, /* @__PURE__ */ React18.createElement("strong", {
3656
3779
  style: { color: "#6b7280" }
3657
- }, stats.uncoveredFiles), " uncovered"), /* @__PURE__ */ React17.createElement("span", {
3780
+ }, stats.uncoveredFiles), " uncovered"), /* @__PURE__ */ React18.createElement("span", {
3658
3781
  style: { marginLeft: "auto" }
3659
- }, stats.totalTraced, "/", stats.totalTests, " tests traced")), !error && stats.testFiles === 0 && /* @__PURE__ */ React17.createElement("div", {
3782
+ }, stats.totalTraced, "/", stats.totalTests, " tests traced")), !error && stats.testFiles === 0 && /* @__PURE__ */ React18.createElement("div", {
3660
3783
  style: {
3661
3784
  fontSize: theme.fontSizes[0],
3662
3785
  color: theme.colors.textSecondary || "#666"
3663
3786
  }
3664
- }, "No test files with coverage data found")), /* @__PURE__ */ React17.createElement(DirectoryFilterInput, {
3787
+ }, "No test files with coverage data found")), /* @__PURE__ */ React18.createElement(DirectoryFilterInput, {
3665
3788
  fileTree,
3666
3789
  theme,
3667
3790
  filters,
3668
3791
  onFiltersChange: setFilters
3669
- }), /* @__PURE__ */ React17.createElement("div", {
3792
+ }), /* @__PURE__ */ React18.createElement("div", {
3670
3793
  style: { flex: 1, marginTop: "1rem", overflow: "hidden" }
3671
- }, /* @__PURE__ */ React17.createElement(TelemetryCoverageFileTree, {
3794
+ }, /* @__PURE__ */ React18.createElement(TelemetryCoverageFileTree, {
3672
3795
  fileTree,
3673
3796
  theme,
3674
3797
  coverageData,
@@ -3704,6 +3827,7 @@ export {
3704
3827
  TelemetryCoverageFileTreeContainer,
3705
3828
  TelemetryCoverageFileTree,
3706
3829
  StoryboardWorkflowsTreeCore,
3830
+ StatusBar,
3707
3831
  RepositoryTreeCore,
3708
3832
  OrderedFileList,
3709
3833
  MultiFileTreeCore,
@@ -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,KAA0B,MAAM,OAAO,CAAC;AAS/C,OAAO,KAAK,EAEV,4BAA4B,EAO7B,MAAM,SAAS,CAAC;AAwYjB,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAiU9E,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)
@@ -51,6 +82,12 @@ export interface StoryboardWorkflowsTreeProps {
51
82
  workflowFilterMode?: StoryboardFilterMode;
52
83
  traceWorkflowsSet?: Set<string>;
53
84
  gitStatusData?: GitFileStatus[];
85
+ /** Map of workflow ID to scenario status (for showing scenario coverage bars) */
86
+ scenarioStatusMap?: Record<string, WorkflowScenarioStatus>;
87
+ /** Map of canvas path (or storyboard ID) to node status (for showing implementation bars) */
88
+ canvasNodeStatusMap?: Record<string, CanvasNodeStatus>;
89
+ /** Which status bars to display: 'implementation', 'traces', or 'both' (default: 'both') */
90
+ statusBarDisplay?: StatusBarDisplay;
54
91
  /**
55
92
  * Enable dragging nodes to other panels (e.g., terminal).
56
93
  * 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.0",
3
+ "version": "0.2.2",
4
4
  "description": "React component for selective directory filtering and file tree visualization",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -50,7 +50,7 @@
50
50
  "@principal-ade/industry-theme": ">=0.1.0",
51
51
  "@principal-ade/panel-framework-core": ">=0.5.0",
52
52
  "@principal-ai/alexandria-core-library": ">=0.3.0",
53
- "@principal-ai/principal-view-core": "^0.24.8",
53
+ "@principal-ai/principal-view-core": ">=0.24.8",
54
54
  "@principal-ai/repository-abstraction": "^0.5.7",
55
55
  "lucide-react": ">=0.263.0",
56
56
  "react": ">=19.0.0",