@cjlapao/ui-kit 0.2.4 → 0.2.6

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.js CHANGED
@@ -5338,6 +5338,15 @@ var getSurfacePaddingClass = (padding) => surfacePaddingClasses[padding] ?? surf
5338
5338
  var getSurfacePaddingClasses = () => ({
5339
5339
  ...surfacePaddingClasses
5340
5340
  });
5341
+ var SURFACE_GUTTER_AXES = ["top", "right", "bottom", "left"];
5342
+ var surfaceGutterClasses = {
5343
+ top: { none: "mt-0", xs: "mt-2", sm: "mt-4", md: "mt-6", lg: "mt-8", xl: "mt-10" },
5344
+ right: { none: "mr-0", xs: "mr-2", sm: "mr-4", md: "mr-6", lg: "mr-8", xl: "mr-10" },
5345
+ bottom: { none: "mb-0", xs: "mb-2", sm: "mb-4", md: "mb-6", lg: "mb-8", xl: "mb-10" },
5346
+ left: { none: "ml-0", xs: "ml-2", sm: "ml-4", md: "ml-6", lg: "ml-8", xl: "ml-10" }
5347
+ };
5348
+ var DEFAULT_SURFACE_GUTTER = "none";
5349
+ var getSurfaceGutterClass = (axis, gutter) => surfaceGutterClasses[axis][gutter] ?? surfaceGutterClasses[axis][DEFAULT_SURFACE_GUTTER];
5341
5350
  var NEUTRAL_TONES = [
5342
5351
  "neutral",
5343
5352
  "slate",
@@ -15755,12 +15764,23 @@ var ScrollArea = ({
15755
15764
  mask = false,
15756
15765
  tabIndex = 0,
15757
15766
  contentClassName,
15767
+ viewportClassName,
15768
+ viewportRef: viewportRefProp,
15758
15769
  children,
15759
15770
  className = "",
15760
15771
  ...rest
15761
15772
  }) => {
15762
15773
  const viewportId = useId7();
15763
15774
  const viewportRef = useRef9(null);
15775
+ const setViewportRef = useCallback4(
15776
+ (el) => {
15777
+ viewportRef.current = el;
15778
+ if (typeof viewportRefProp === "function") viewportRefProp(el);
15779
+ else if (viewportRefProp)
15780
+ viewportRefProp.current = el;
15781
+ },
15782
+ [viewportRefProp]
15783
+ );
15764
15784
  const contentRef = useRef9(null);
15765
15785
  const yTrackRef = useRef9(null);
15766
15786
  const xTrackRef = useRef9(null);
@@ -15902,7 +15922,7 @@ var ScrollArea = ({
15902
15922
  /* @__PURE__ */ jsx182(
15903
15923
  "div",
15904
15924
  {
15905
- ref: viewportRef,
15925
+ ref: setViewportRef,
15906
15926
  id: viewportId,
15907
15927
  "data-slot": "scrollarea-viewport",
15908
15928
  tabIndex: overflow.x || overflow.y ? tabIndex : -1,
@@ -15917,7 +15937,8 @@ var ScrollArea = ({
15917
15937
  // and the viewport would simply grow past the frame's cap, get
15918
15938
  // clipped by `overflow-hidden` and never learn it was scrollable.
15919
15939
  "[scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden",
15920
- "focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-400"
15940
+ "focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-400",
15941
+ viewportClassName
15921
15942
  ),
15922
15943
  children: /* @__PURE__ */ jsx182(
15923
15944
  "div",
@@ -21519,10 +21540,23 @@ var PageHeader = ({
21519
21540
  children,
21520
21541
  variant = "default",
21521
21542
  accentColor = "blue",
21543
+ padding,
21544
+ paddingTop,
21545
+ paddingRight,
21546
+ paddingBottom,
21547
+ paddingLeft,
21548
+ corner = DEFAULT_SURFACE_CORNER,
21522
21549
  className = "",
21523
21550
  ...rest
21524
21551
  }) => {
21525
21552
  const surface = variant === "default" ? null : getSidebarSurfaceTokens(variant, accentColor);
21553
+ const pair = surface ? "xs" : "none";
21554
+ const gutter = {
21555
+ top: paddingTop ?? padding ?? pair,
21556
+ right: paddingRight ?? padding ?? pair,
21557
+ bottom: paddingBottom ?? padding ?? "none",
21558
+ left: paddingLeft ?? padding ?? "none"
21559
+ };
21526
21560
  return /* @__PURE__ */ jsxs97(
21527
21561
  "header",
21528
21562
  {
@@ -21530,9 +21564,12 @@ var PageHeader = ({
21530
21564
  className: classNames51(
21531
21565
  "flex w-full items-center justify-between gap-4 px-5",
21532
21566
  SIDE_MENU_HEADER_HEIGHT,
21567
+ getSurfaceGutterClass("top", gutter.top),
21568
+ getSurfaceGutterClass("right", gutter.right),
21569
+ getSurfaceGutterClass("bottom", gutter.bottom),
21570
+ getSurfaceGutterClass("left", gutter.left),
21571
+ getSurfaceCornerClass(corner),
21533
21572
  surface ? classNames51(
21534
- surface.offset,
21535
- surface.radius,
21536
21573
  "border",
21537
21574
  surface.border,
21538
21575
  surface.shadow,
@@ -55697,6 +55734,7 @@ var CONNECTION_FLOW_EDGE_STYLES = [
55697
55734
  "curved",
55698
55735
  "straight"
55699
55736
  ];
55737
+ var CONNECTION_FLOW_CHILD_LAYOUTS = ["fan", "chain"];
55700
55738
  var CONNECTION_FLOW_LOADERS = [
55701
55739
  "skeleton",
55702
55740
  "spinner",
@@ -55835,6 +55873,8 @@ var DEFAULT_LAYOUT_OPTIONS = {
55835
55873
  laneGap: 16,
55836
55874
  childGap: 12,
55837
55875
  childIndent: 28,
55876
+ rowGap: 12,
55877
+ gridIndent: 28,
55838
55878
  edgeStyle: "orthogonal",
55839
55879
  cornerRadius: 8,
55840
55880
  bypassLift: 18,
@@ -55860,6 +55900,8 @@ var NODE_CORNER_RADIUS = Object.fromEntries(
55860
55900
  var nodeTone = (node) => node?.tone ?? (node?.status ? STATUS_TONE[node.status] : "neutral");
55861
55901
  var nodeIcon = (node) => node?.icon ?? (node?.status ? STATUS_ICON2[node.status] : void 0);
55862
55902
  var nodeIsActive = (node) => node?.active ?? node?.status === "running";
55903
+ var nodeHasFailed = (node) => node?.status === "failed";
55904
+ var toRows = (node) => node.rows ?? (node.children ?? []).map((child) => [child]);
55863
55905
  var nodeIsSkipped = (node) => node?.skipped ?? (node?.status === "skipped" ? true : void 0);
55864
55906
 
55865
55907
  // ../common/connectionFlow/measure.ts
@@ -55940,6 +55982,15 @@ var nodeScrolls = (node, options, expanded) => {
55940
55982
  };
55941
55983
  var measureBranch = (node, options, expanded) => {
55942
55984
  const own = measureNode(node, options, expanded);
55985
+ if (node.childLayout === "chain") {
55986
+ const rows = toRows(node);
55987
+ if (rows.length === 0) return own;
55988
+ const rowsHeight = rows.reduce(
55989
+ (sum, row, index) => sum + Math.max(0, ...row.map((c) => measureBranch(c, options, expanded))) + (index > 0 ? options.rowGap : 0),
55990
+ 0
55991
+ );
55992
+ return own + options.childGap + rowsHeight;
55993
+ }
55943
55994
  const children = node.children ?? [];
55944
55995
  if (children.length === 0) return own;
55945
55996
  const childHeight = children.reduce(
@@ -56335,6 +56386,7 @@ var layoutConnectionFlow = (input) => {
56335
56386
  const skipped = resolveSkipped(columns, input.autoState ?? false);
56336
56387
  const laidOut = [];
56337
56388
  const byId = /* @__PURE__ */ new Map();
56389
+ const chains = /* @__PURE__ */ new Map();
56338
56390
  let x = options.padding;
56339
56391
  const columnBounds = [];
56340
56392
  columns.forEach((column, columnIndex) => {
@@ -56385,15 +56437,68 @@ var layoutConnectionFlow = (input) => {
56385
56437
  placeChildren(child, depth + 1, indentX + options.childIndent);
56386
56438
  });
56387
56439
  };
56388
- placeChildren(node, 1, x + options.childIndent);
56440
+ if (node.childLayout === "chain") {
56441
+ const rows = toRows(node);
56442
+ if (rows.length > 0) {
56443
+ const cardWidth = options.metrics.width;
56444
+ const gridX = x + options.gridIndent;
56445
+ let rowY = y + ownHeight + options.childGap;
56446
+ const walk2 = [];
56447
+ let maxCols = 1;
56448
+ rows.forEach((row, rowIdx) => {
56449
+ maxCols = Math.max(maxCols, row.length);
56450
+ let rowBottom = rowY;
56451
+ row.forEach((card, col) => {
56452
+ const cardHeight = measureNode(card, options, input.expanded);
56453
+ const cardEntry = {
56454
+ id: card.id,
56455
+ node: card,
56456
+ outline: "",
56457
+ x: gridX + col * (cardWidth + options.connectorWidth),
56458
+ y: rowY,
56459
+ width: cardWidth,
56460
+ height: cardHeight,
56461
+ anchorY: cardHeight / 2,
56462
+ column: columnIndex,
56463
+ depth: 1,
56464
+ tone: toneOf(card),
56465
+ scrollable: nodeScrolls(card, options, input.expanded)
56466
+ };
56467
+ laidOut.push(cardEntry);
56468
+ byId.set(card.id, cardEntry);
56469
+ walk2.push({ card: cardEntry, row: rowIdx });
56470
+ rowBottom = Math.max(rowBottom, rowY + cardHeight);
56471
+ });
56472
+ rowY = rowBottom + options.rowGap;
56473
+ });
56474
+ const live = walk2.filter((w) => !nodeIsSkipped(w.card.node));
56475
+ const exitCard = live.length > 0 ? live[live.length - 1].card : null;
56476
+ chains.set(node.id, {
56477
+ parentNode: node,
56478
+ walk: walk2,
56479
+ exitCard,
56480
+ exitHasBranch: Boolean(exitCard?.node.success?.to),
56481
+ gridWidth: options.gridIndent + maxCols * cardWidth + (maxCols - 1) * options.connectorWidth
56482
+ });
56483
+ } else {
56484
+ placeChildren(node, 1, x + options.childIndent);
56485
+ }
56486
+ } else {
56487
+ placeChildren(node, 1, x + options.childIndent);
56488
+ }
56389
56489
  y += heights[laneIndex] + options.laneGap;
56390
56490
  });
56491
+ const chainInfo = column.parallel ? void 0 : chains.get(column.nodes[0].id);
56492
+ const columnWidth = Math.max(
56493
+ options.metrics.width,
56494
+ chainInfo?.gridWidth ?? 0
56495
+ );
56391
56496
  columnBounds.push({
56392
56497
  start: x,
56393
- end: x + options.metrics.width,
56498
+ end: x + columnWidth,
56394
56499
  centre: options.padding + stackHeight / 2
56395
56500
  });
56396
- x += options.metrics.width + options.connectorWidth;
56501
+ x += columnWidth + options.connectorWidth;
56397
56502
  });
56398
56503
  const edges = [];
56399
56504
  const connectors = /* @__PURE__ */ new Map();
@@ -56451,7 +56556,10 @@ var layoutConnectionFlow = (input) => {
56451
56556
  if (columnIsTerminal(sourceIndex)) return;
56452
56557
  if (skipped.has(columnIndex)) return;
56453
56558
  const isBypass = sourceIndex !== columnIndex - 1;
56454
- const sourceNodes = columns[sourceIndex].nodes;
56559
+ const chainSrc = columns[sourceIndex].parallel ? void 0 : chains.get(columns[sourceIndex].nodes[0].id);
56560
+ if (chainSrc && (!chainSrc.exitCard || chainSrc.exitHasBranch)) return;
56561
+ if (chainSrc?.exitCard?.node.terminal === true) return;
56562
+ const sourceNodes = chainSrc?.exitCard ? [chainSrc.exitCard.node] : columns[sourceIndex].nodes;
56455
56563
  const targetNodes = column.nodes;
56456
56564
  const state = (sourceNode, targetNode) => targetNode.connector?.state ?? (input.autoState ? toneOf(sourceNode) !== "neutral" ? nodeIsActive(targetNode) ? "flowing" : "stopped" : "disabled" : input.flowState ?? "flowing");
56457
56565
  const animatedFor = (cfg, edgeState) => (cfg?.animated ?? input.animated ?? true) && (edgeState === "flowing" || edgeState === "stopped" && (cfg?.animateCompleted ?? false));
@@ -56461,7 +56569,7 @@ var layoutConnectionFlow = (input) => {
56461
56569
  labelUsed = true;
56462
56570
  return label;
56463
56571
  };
56464
- const sourceSpan = columnBox(sourceIndex);
56572
+ const sourceSpan = chainSrc?.exitCard ? boxOf(chainSrc.exitCard) : columnBox(sourceIndex);
56465
56573
  const targetSpan = columnBox(columnIndex);
56466
56574
  if (!sourceSpan || !targetSpan) return;
56467
56575
  const sides = selectSides(sourceSpan, targetSpan);
@@ -56545,6 +56653,7 @@ var layoutConnectionFlow = (input) => {
56545
56653
  });
56546
56654
  });
56547
56655
  const childEdges = (parent) => {
56656
+ if (parent.childLayout === "chain") return;
56548
56657
  const parentEntry = byId.get(parent.id);
56549
56658
  if (!parentEntry) return;
56550
56659
  (parent.children ?? []).forEach((child) => {
@@ -56606,6 +56715,146 @@ var layoutConnectionFlow = (input) => {
56606
56715
  });
56607
56716
  };
56608
56717
  input.nodes.forEach(childEdges);
56718
+ const emitFlowEdge = (o) => {
56719
+ const route = routePorts(o.fromPort, o.toPort, {
56720
+ style: o.cfg?.edgeStyle ?? options.edgeStyle,
56721
+ stub: Math.min(18, options.connectorWidth / 3),
56722
+ radius: options.cornerRadius,
56723
+ trim: trimFor(o.cfg),
56724
+ via: o.via
56725
+ });
56726
+ const animated = (o.cfg?.animated ?? input.animated ?? true) && (o.state === "flowing" || o.state === "stopped" && (o.cfg?.animateCompleted ?? false));
56727
+ addConnector(o.fromEntry.id, o.fromPort, o.sourceTone, o.state, animated, o.id, o.cfg);
56728
+ addConnector(o.toEntry.id, o.toPort, o.targetTone, o.state, animated, o.id, o.cfg);
56729
+ edges.push({
56730
+ id: o.id,
56731
+ fromId: o.fromEntry.id,
56732
+ toId: o.toEntry.id,
56733
+ state: o.state,
56734
+ points: route.points,
56735
+ d: route.d,
56736
+ sourceTone: o.sourceTone,
56737
+ targetTone: o.targetTone,
56738
+ bypass: false,
56739
+ emitIndex: 0,
56740
+ emitCount: 1,
56741
+ emitSpan: 0,
56742
+ animated,
56743
+ label: o.label,
56744
+ kind: o.kind,
56745
+ branchKind: o.branchKind
56746
+ });
56747
+ };
56748
+ const sidePort = (entry, side) => port(boxOf(entry), side, entry.anchorY / entry.height);
56749
+ const branchToneOf = (branch, kind) => branch.tone ?? (kind === "success" ? STATUS_TONE.succeeded : STATUS_TONE.failed);
56750
+ const emitBranch = (fromEntry, branch, kind) => {
56751
+ if (!branch.to) return;
56752
+ const target = byId.get(branch.to);
56753
+ if (!target || target.id === fromEntry.id) return;
56754
+ const tone = branchToneOf(branch, kind);
56755
+ const state = kind === "failure" ? nodeHasFailed(fromEntry.node) ? "flowing" : "stopped" : nodeHasFailed(fromEntry.node) ? "stopped" : "flowing";
56756
+ const srcBox = boxOf(fromEntry);
56757
+ const tgtBox = boxOf(target);
56758
+ const upstream = tgtBox.y + tgtBox.height <= srcBox.y + 1 || tgtBox.x + tgtBox.width <= srcBox.x + 1;
56759
+ if (upstream && kind === "failure") {
56760
+ emitFlowEdge({
56761
+ id: `${fromEntry.id}~fail>${target.id}`,
56762
+ fromEntry,
56763
+ toEntry: target,
56764
+ fromPort: port(srcBox, "left", fromEntry.anchorY / fromEntry.height),
56765
+ toPort: port(tgtBox, "top", 0.5),
56766
+ via: { x: Math.min(srcBox.x, tgtBox.x) - options.bypassLift },
56767
+ state,
56768
+ sourceTone: tone,
56769
+ targetTone: tone,
56770
+ label: branch.label,
56771
+ kind: "branch",
56772
+ branchKind: kind
56773
+ });
56774
+ return;
56775
+ }
56776
+ const sides = selectSides(srcBox, tgtBox);
56777
+ emitFlowEdge({
56778
+ id: `${fromEntry.id}~${kind === "failure" ? "fail" : "ok"}>${target.id}`,
56779
+ fromEntry,
56780
+ toEntry: target,
56781
+ fromPort: sidePort(fromEntry, sides.from),
56782
+ toPort: sidePort(target, sides.to),
56783
+ state,
56784
+ sourceTone: tone,
56785
+ targetTone: tone,
56786
+ label: branch.label,
56787
+ kind: "branch",
56788
+ branchKind: kind
56789
+ });
56790
+ };
56791
+ chains.forEach((chain) => {
56792
+ const parentEntry = byId.get(chain.parentNode.id);
56793
+ if (!parentEntry) return;
56794
+ if (nodeIsSkipped(chain.parentNode) === true) return;
56795
+ const live = chain.walk.filter((w) => !nodeIsSkipped(w.card.node));
56796
+ if (live.length === 0) return;
56797
+ const first = live[0].card;
56798
+ const parentBox = boxOf(parentEntry);
56799
+ const firstBox = boxOf(first);
56800
+ emitFlowEdge({
56801
+ id: `${parentEntry.id}~in>${first.id}`,
56802
+ fromEntry: parentEntry,
56803
+ toEntry: first,
56804
+ fromPort: portAt(
56805
+ parentBox,
56806
+ "bottom",
56807
+ firstBox.x + firstBox.width / 2 - parentBox.x
56808
+ ),
56809
+ toPort: port(firstBox, "top", 0.5),
56810
+ state: first.node.connector?.state ?? (nodeHasFailed(parentEntry.node) ? "stopped" : nodeIsActive(first.node) ? "flowing" : "stopped"),
56811
+ sourceTone: toneOf(parentEntry.node),
56812
+ targetTone: toneOf(first.node),
56813
+ cfg: first.node.connector,
56814
+ kind: "chain"
56815
+ });
56816
+ live.forEach((w, i) => {
56817
+ const src = w.card;
56818
+ if (src.node.success?.to) {
56819
+ emitBranch(src, src.node.success, "success");
56820
+ return;
56821
+ }
56822
+ const next = live[i + 1];
56823
+ if (!next) return;
56824
+ const tgt = next.card;
56825
+ const srcBox = boxOf(src);
56826
+ const tgtBox = boxOf(tgt);
56827
+ const sameRow = next.row === w.row;
56828
+ const gapStart = srcBox.x + srcBox.width;
56829
+ const gapEnd = tgtBox.x;
56830
+ emitFlowEdge({
56831
+ id: `${src.id}~walk>${tgt.id}`,
56832
+ fromEntry: src,
56833
+ toEntry: tgt,
56834
+ fromPort: sameRow ? port(srcBox, "right", src.anchorY / src.height) : port(srcBox, "bottom", 0.5),
56835
+ toPort: sameRow ? port(tgtBox, "left", tgt.anchorY / tgt.height) : port(tgtBox, "top", 0.5),
56836
+ via: sameRow && gapEnd > gapStart ? { x: (gapStart + gapEnd) / 2 } : void 0,
56837
+ state: tgt.node.connector?.state ?? (nodeHasFailed(src.node) ? "stopped" : nodeIsActive(tgt.node) ? "flowing" : "stopped"),
56838
+ sourceTone: src.node.success ? branchToneOf(src.node.success, "success") : toneOf(src.node),
56839
+ targetTone: toneOf(tgt.node),
56840
+ cfg: tgt.node.connector,
56841
+ label: src.node.success?.label ?? tgt.node.connector?.label,
56842
+ kind: "chain"
56843
+ });
56844
+ });
56845
+ chain.walk.forEach((w) => {
56846
+ if (w.card.node.failure) emitBranch(w.card, w.card.node.failure, "failure");
56847
+ });
56848
+ });
56849
+ const chainCardIds = /* @__PURE__ */ new Set();
56850
+ chains.forEach(
56851
+ (chain) => chain.walk.forEach((w) => chainCardIds.add(w.card.id))
56852
+ );
56853
+ laidOut.forEach((entry) => {
56854
+ if (chainCardIds.has(entry.id)) return;
56855
+ if (entry.node.success?.to) emitBranch(entry, entry.node.success, "success");
56856
+ if (entry.node.failure?.to) emitBranch(entry, entry.node.failure, "failure");
56857
+ });
56609
56858
  const emittedBySource = /* @__PURE__ */ new Map();
56610
56859
  edges.forEach((edge) => {
56611
56860
  if (!edge.animated) return;
@@ -57134,6 +57383,29 @@ var ConnectionFlowSvg = ({
57134
57383
  const isLit = (edge) => highlightEdges.size === 0 || highlightEdges.has(edge.id);
57135
57384
  const nodeOpacity = (node) => highlightNodes.size === 0 || highlightNodes.has(node.id) ? 1 : 0.22;
57136
57385
  const connectorOpacity = (connector) => highlightEdges.size === 0 || connector.edgeIds.some((id) => highlightEdges.has(id)) ? 1 : 0.22;
57386
+ const cardContent = (laid) => {
57387
+ const content = renderNode ? renderNode(laid) : /* @__PURE__ */ jsx289(
57388
+ ConnectionFlowNodeBody_default,
57389
+ {
57390
+ node: laid,
57391
+ metrics,
57392
+ showProgress,
57393
+ options,
57394
+ scrollable: laid.scrollable,
57395
+ expanded,
57396
+ onToggleExpanded
57397
+ }
57398
+ );
57399
+ return laid.scrollable ? /* @__PURE__ */ jsx289(
57400
+ ScrollArea_default,
57401
+ {
57402
+ variant: "auto",
57403
+ className: "h-full w-full",
57404
+ contentClassName: "block w-full",
57405
+ children: content
57406
+ }
57407
+ ) : content;
57408
+ };
57137
57409
  return /* @__PURE__ */ jsxs172("div", { className: "relative h-full w-full overflow-hidden", children: [
57138
57410
  /* @__PURE__ */ jsxs172(
57139
57411
  "svg",
@@ -57297,10 +57569,6 @@ var ConnectionFlowSvg = ({
57297
57569
  children: /* @__PURE__ */ jsx289(
57298
57570
  "div",
57299
57571
  {
57300
- "data-scrolls": laid.scrollable ? "" : void 0,
57301
- className: classNames101(
57302
- laid.scrollable && `overflow-y-auto ${THIN_SCROLLBAR_FIELD}`
57303
- ),
57304
57572
  style: {
57305
57573
  width: laid.width,
57306
57574
  height: laid.height,
@@ -57308,19 +57576,7 @@ var ConnectionFlowSvg = ({
57308
57576
  transform: `scale(${scale})`,
57309
57577
  transformOrigin: "top left"
57310
57578
  },
57311
- onWheel: laid.scrollable ? (event) => event.stopPropagation() : void 0,
57312
- children: renderNode ? renderNode(laid) : /* @__PURE__ */ jsx289(
57313
- ConnectionFlowNodeBody_default,
57314
- {
57315
- node: laid,
57316
- metrics,
57317
- showProgress,
57318
- options,
57319
- scrollable: laid.scrollable,
57320
- expanded,
57321
- onToggleExpanded
57322
- }
57323
- )
57579
+ children: cardContent(laid)
57324
57580
  }
57325
57581
  )
57326
57582
  },
@@ -57539,6 +57795,21 @@ var ConnectionFlow = React81.forwardRef(function ConnectionFlow2({
57539
57795
  observer.observe(element);
57540
57796
  return () => observer.disconnect();
57541
57797
  }, []);
57798
+ useEffect66(() => {
57799
+ const element = viewportRef.current;
57800
+ if (!element || !interactive) return;
57801
+ const onWheel = (event) => {
57802
+ if (!(event.ctrlKey || event.metaKey)) return;
57803
+ event.preventDefault();
57804
+ const rect = element.getBoundingClientRect();
57805
+ setZoom(
57806
+ scale * (event.deltaY < 0 ? 1.1 : 1 / 1.1),
57807
+ { x: event.clientX - rect.left, y: event.clientY - rect.top }
57808
+ );
57809
+ };
57810
+ element.addEventListener("wheel", onWheel, { passive: false });
57811
+ return () => element.removeEventListener("wheel", onWheel);
57812
+ }, [interactive, scale, setZoom]);
57542
57813
  useEffect66(() => {
57543
57814
  if (fitOnLoad && viewport.width) fit();
57544
57815
  }, [fitOnLoad, nodes, viewport.width, viewport.height]);
@@ -57652,22 +57923,17 @@ var ConnectionFlow = React81.forwardRef(function ConnectionFlow2({
57652
57923
  style: { height: typeof height === "number" ? `${height}px` : height },
57653
57924
  children: [
57654
57925
  /* @__PURE__ */ jsx290(
57655
- "div",
57926
+ ScrollArea_default,
57656
57927
  {
57657
- ref: viewportRef,
57658
- className: `h-full w-full select-none overflow-auto overscroll-contain [&::-webkit-scrollbar]:h-2 ${THIN_SCROLLBAR_FIELD}`,
57928
+ variant: "auto",
57929
+ viewportRef,
57930
+ viewportClassName: "overscroll-contain",
57931
+ className: "h-full w-full select-none",
57659
57932
  style: { cursor: panning ? "grabbing" : void 0 },
57660
- onWheel: (event) => {
57661
- if (!interactive) return;
57662
- if (event.target.closest("[data-scrolls]")) return;
57663
- const rect = viewportRef.current?.getBoundingClientRect();
57664
- const anchor = rect ? { x: event.clientX - rect.left, y: event.clientY - rect.top } : void 0;
57665
- setZoom(scale * (event.deltaY < 0 ? 1.1 : 1 / 1.1), anchor);
57666
- },
57667
57933
  onPointerDown: (event) => {
57668
57934
  if (!interactive || event.button !== 0) return;
57669
57935
  if (event.target.closest(
57670
- "button, a, input, select, textarea, [data-no-pan]"
57936
+ 'button, a, input, select, textarea, [data-no-pan], [data-slot="scrollarea-scrollbar"]'
57671
57937
  )) {
57672
57938
  return;
57673
57939
  }
@@ -57680,7 +57946,7 @@ var ConnectionFlow = React81.forwardRef(function ConnectionFlow2({
57680
57946
  scrollLeft: element.scrollLeft,
57681
57947
  scrollTop: element.scrollTop
57682
57948
  };
57683
- element.setPointerCapture(event.pointerId);
57949
+ event.currentTarget.setPointerCapture(event.pointerId);
57684
57950
  },
57685
57951
  onPointerMove: (event) => {
57686
57952
  if (!panning) return;
@@ -59840,14 +60106,97 @@ var TreeView = ({
59840
60106
  var TreeView_default = TreeView;
59841
60107
 
59842
60108
  // src/components/WorkflowTracker/WorkflowTracker.tsx
59843
- import { useMemo as useMemo55 } from "react";
59844
- import classNames118 from "classnames";
60109
+ import { useMemo as useMemo56 } from "react";
60110
+ import classNames119 from "classnames";
59845
60111
 
59846
- // src/components/WorkflowTracker/WorkflowSummaryCard.tsx
59847
- import classNames109 from "classnames";
60112
+ // src/components/WorkflowTracker/WorkflowTrackerRail.tsx
60113
+ import { useMemo as useMemo52 } from "react";
60114
+ import classNames112 from "classnames";
59848
60115
 
59849
- // src/components/WorkflowTracker/WorkflowStatusNode.tsx
60116
+ // src/components/WorkflowTracker/WorkflowTimeline.tsx
60117
+ import React87 from "react";
60118
+ import classNames111 from "classnames";
60119
+
60120
+ // src/components/WorkflowTracker/WorkflowSkeleton.tsx
59850
60121
  import classNames107 from "classnames";
60122
+ import { jsx as jsx296, jsxs as jsxs179 } from "react/jsx-runtime";
60123
+ var Bar3 = ({
60124
+ width,
60125
+ className
60126
+ }) => /* @__PURE__ */ jsx296(
60127
+ "span",
60128
+ {
60129
+ className: classNames107(
60130
+ "block h-2.5 rounded-full bg-neutral-200 dark:bg-neutral-800",
60131
+ className
60132
+ ),
60133
+ style: { width }
60134
+ }
60135
+ );
60136
+ var Dot = () => /* @__PURE__ */ jsx296("span", { className: "h-5 w-5 shrink-0 rounded-full bg-neutral-200 dark:bg-neutral-800" });
60137
+ var WorkflowHeaderSkeleton = ({ hasIcon = false, iconCorner = DEFAULT_SURFACE_CORNER }) => /* @__PURE__ */ jsxs179("div", { className: "mb-5 flex animate-pulse flex-wrap items-start justify-between gap-3 motion-reduce:animate-none", children: [
60138
+ /* @__PURE__ */ jsxs179("div", { className: "flex items-center gap-3", children: [
60139
+ hasIcon && /* @__PURE__ */ jsx296(
60140
+ Bar3,
60141
+ {
60142
+ width: "3rem",
60143
+ className: classNames107("h-12", getSurfaceCornerClass(iconCorner))
60144
+ }
60145
+ ),
60146
+ /* @__PURE__ */ jsxs179("div", { className: "space-y-3", children: [
60147
+ /* @__PURE__ */ jsx296(Bar3, { width: "11rem", className: "h-2" }),
60148
+ /* @__PURE__ */ jsx296(Bar3, { width: "16rem", className: "h-6" })
60149
+ ] })
60150
+ ] }),
60151
+ /* @__PURE__ */ jsx296(Bar3, { width: "9rem", className: "h-6 rounded-full" })
60152
+ ] });
60153
+ var WorkflowRailSkeleton = ({
60154
+ rows = 6
60155
+ }) => /* @__PURE__ */ jsxs179("div", { className: "animate-pulse motion-reduce:animate-none", children: [
60156
+ /* @__PURE__ */ jsxs179("div", { className: "border-b border-neutral-200 px-5 pb-4 pt-5 dark:border-neutral-800", children: [
60157
+ /* @__PURE__ */ jsxs179("div", { className: "flex items-center justify-between", children: [
60158
+ /* @__PURE__ */ jsx296(Bar3, { width: "4.5rem" }),
60159
+ /* @__PURE__ */ jsx296(Bar3, { width: "2rem" })
60160
+ ] }),
60161
+ /* @__PURE__ */ jsx296("span", { className: "mt-3 block h-1 w-full rounded-full bg-neutral-200 dark:bg-neutral-800" }),
60162
+ /* @__PURE__ */ jsx296(Bar3, { width: "80%", className: "mt-3" })
60163
+ ] }),
60164
+ /* @__PURE__ */ jsx296("div", { className: "space-y-5 px-5 py-5", children: Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ jsxs179("div", { className: "flex items-start gap-3", children: [
60165
+ /* @__PURE__ */ jsx296(Dot, {}),
60166
+ /* @__PURE__ */ jsxs179("div", { className: "flex-1 space-y-2", children: [
60167
+ /* @__PURE__ */ jsx296(Bar3, { width: index % 2 === 0 ? "62%" : "48%" }),
60168
+ /* @__PURE__ */ jsx296(Bar3, { width: "34%", className: "h-2" })
60169
+ ] })
60170
+ ] }, index)) })
60171
+ ] });
60172
+ var WorkflowDetailSkeleton = () => /* @__PURE__ */ jsxs179("div", { className: "animate-pulse motion-reduce:animate-none", children: [
60173
+ /* @__PURE__ */ jsxs179("div", { className: "space-y-4 px-5 pb-6 pt-5 sm:px-6", children: [
60174
+ /* @__PURE__ */ jsxs179("div", { className: "flex items-center justify-between", children: [
60175
+ /* @__PURE__ */ jsx296(Bar3, { width: "6rem" }),
60176
+ /* @__PURE__ */ jsx296(Bar3, { width: "4rem" })
60177
+ ] }),
60178
+ /* @__PURE__ */ jsx296(Bar3, { width: "45%", className: "h-5" }),
60179
+ /* @__PURE__ */ jsxs179("div", { className: "space-y-2", children: [
60180
+ /* @__PURE__ */ jsx296(Bar3, { width: "92%", className: "h-2" }),
60181
+ /* @__PURE__ */ jsx296(Bar3, { width: "70%", className: "h-2" })
60182
+ ] }),
60183
+ /* @__PURE__ */ jsxs179("div", { className: "flex gap-10 pt-2", children: [
60184
+ /* @__PURE__ */ jsx296(Bar3, { width: "5rem" }),
60185
+ /* @__PURE__ */ jsx296(Bar3, { width: "6rem" }),
60186
+ /* @__PURE__ */ jsx296(Bar3, { width: "4rem" })
60187
+ ] })
60188
+ ] }),
60189
+ /* @__PURE__ */ jsx296("div", { className: "border-y border-neutral-200 bg-neutral-50 px-5 py-3 dark:border-neutral-800 dark:bg-white/5 sm:px-6", children: /* @__PURE__ */ jsx296(Bar3, { width: "5rem" }) }),
60190
+ /* @__PURE__ */ jsx296("div", { className: "divide-y divide-neutral-200 dark:divide-neutral-800", children: Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ jsxs179("div", { className: "flex items-center gap-3 px-5 py-4 sm:px-6", children: [
60191
+ /* @__PURE__ */ jsx296(Dot, {}),
60192
+ /* @__PURE__ */ jsx296(Bar3, { width: index === 1 ? "38%" : "30%" }),
60193
+ /* @__PURE__ */ jsx296("span", { className: "flex-1" }),
60194
+ /* @__PURE__ */ jsx296(Bar3, { width: "3rem" })
60195
+ ] }, index)) })
60196
+ ] });
60197
+
60198
+ // src/components/WorkflowTracker/WorkflowStatusNode.tsx
60199
+ import classNames108 from "classnames";
59851
60200
 
59852
60201
  // src/components/WorkflowTracker/surfaces.ts
59853
60202
  var isTranslucentVariant = (variant) => getSurfaceTextTokens(variant).translucent;
@@ -59985,13 +60334,13 @@ var getStatusTokens = (status, palette) => {
59985
60334
  };
59986
60335
 
59987
60336
  // src/components/WorkflowTracker/WorkflowStatusNode.tsx
59988
- import { jsx as jsx296, jsxs as jsxs179 } from "react/jsx-runtime";
60337
+ import { jsx as jsx297, jsxs as jsxs180 } from "react/jsx-runtime";
59989
60338
  var sizeTokens11 = {
59990
60339
  sm: { node: "h-4 w-4", glyph: "h-2.5 w-2.5" },
59991
60340
  md: { node: "h-5 w-5", glyph: "h-3 w-3" },
59992
60341
  lg: { node: "h-9 w-9", glyph: "h-5 w-5" }
59993
60342
  };
59994
- var DashedRing = ({ className }) => /* @__PURE__ */ jsx296("svg", { viewBox: "0 0 20 20", "aria-hidden": "true", className, children: /* @__PURE__ */ jsx296(
60343
+ var DashedRing = ({ className }) => /* @__PURE__ */ jsx297("svg", { viewBox: "0 0 20 20", "aria-hidden": "true", className, children: /* @__PURE__ */ jsx297(
59995
60344
  "circle",
59996
60345
  {
59997
60346
  cx: "10",
@@ -60004,7 +60353,7 @@ var DashedRing = ({ className }) => /* @__PURE__ */ jsx296("svg", { viewBox: "0
60004
60353
  strokeLinecap: "round"
60005
60354
  }
60006
60355
  ) });
60007
- var AlertGlyph = ({ className }) => /* @__PURE__ */ jsx296("svg", { viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", className, children: /* @__PURE__ */ jsx296(
60356
+ var AlertGlyph = ({ className }) => /* @__PURE__ */ jsx297("svg", { viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", className, children: /* @__PURE__ */ jsx297(
60008
60357
  "path",
60009
60358
  {
60010
60359
  d: "M12 6.5a1 1 0 0 1 1 1v6a1 1 0 1 1-2 0v-6a1 1 0 0 1 1-1Zm0 9.25a1.15 1.15 0 1 1 0 2.3 1.15 1.15 0 0 1 0-2.3Z",
@@ -60019,33 +60368,33 @@ var WorkflowStatusNode = ({
60019
60368
  }) => {
60020
60369
  const tokens = getStatusTokens(status, palette);
60021
60370
  const { node, glyph } = sizeTokens11[size];
60022
- return /* @__PURE__ */ jsxs179(
60371
+ return /* @__PURE__ */ jsxs180(
60023
60372
  "span",
60024
60373
  {
60025
60374
  "aria-hidden": "true",
60026
- className: classNames107("relative inline-flex shrink-0", node, className),
60375
+ className: classNames108("relative inline-flex shrink-0", node, className),
60027
60376
  children: [
60028
- tokens.pulse && /* @__PURE__ */ jsx296(
60377
+ tokens.pulse && /* @__PURE__ */ jsx297(
60029
60378
  "span",
60030
60379
  {
60031
- className: classNames107(
60380
+ className: classNames108(
60032
60381
  "absolute inset-0 animate-ping rounded-full opacity-60 motion-reduce:hidden",
60033
60382
  `bg-${tokens.tone}-300 dark:bg-${tokens.tone}-500`
60034
60383
  )
60035
60384
  }
60036
60385
  ),
60037
- /* @__PURE__ */ jsxs179(
60386
+ /* @__PURE__ */ jsxs180(
60038
60387
  "span",
60039
60388
  {
60040
- className: classNames107(
60389
+ className: classNames108(
60041
60390
  "relative inline-flex h-full w-full items-center justify-center rounded-full",
60042
60391
  tokens.node
60043
60392
  ),
60044
60393
  children: [
60045
- tokens.glyph === "check" && /* @__PURE__ */ jsx296(Check, { className: classNames107(glyph, tokens.glyphClass) }),
60046
- tokens.glyph === "pause" && /* @__PURE__ */ jsx296(Pause, { className: classNames107(glyph, tokens.glyphClass) }),
60047
- tokens.glyph === "alert" && /* @__PURE__ */ jsx296(AlertGlyph, { className: classNames107(glyph, tokens.glyphClass) }),
60048
- tokens.glyph === "dashed" && /* @__PURE__ */ jsx296(DashedRing, { className: classNames107("h-full w-full", tokens.glyphClass) })
60394
+ tokens.glyph === "check" && /* @__PURE__ */ jsx297(Check, { className: classNames108(glyph, tokens.glyphClass) }),
60395
+ tokens.glyph === "pause" && /* @__PURE__ */ jsx297(Pause, { className: classNames108(glyph, tokens.glyphClass) }),
60396
+ tokens.glyph === "alert" && /* @__PURE__ */ jsx297(AlertGlyph, { className: classNames108(glyph, tokens.glyphClass) }),
60397
+ tokens.glyph === "dashed" && /* @__PURE__ */ jsx297(DashedRing, { className: classNames108("h-full w-full", tokens.glyphClass) })
60049
60398
  ]
60050
60399
  }
60051
60400
  )
@@ -60055,34 +60404,73 @@ var WorkflowStatusNode = ({
60055
60404
  };
60056
60405
  var WorkflowStatusNode_default = WorkflowStatusNode;
60057
60406
 
60407
+ // src/components/WorkflowTracker/WorkflowQuickActions.tsx
60408
+ import classNames109 from "classnames";
60409
+ import { jsx as jsx298 } from "react/jsx-runtime";
60410
+ var WorkflowQuickActions = ({
60411
+ stepId,
60412
+ actions,
60413
+ palette,
60414
+ groupLabel,
60415
+ onAction,
60416
+ className,
60417
+ style
60418
+ }) => {
60419
+ if (!onAction || actions.length === 0) return null;
60420
+ return /* @__PURE__ */ jsx298(
60421
+ "div",
60422
+ {
60423
+ role: "group",
60424
+ "aria-label": groupLabel,
60425
+ className: classNames109("flex flex-wrap gap-1.5", className),
60426
+ style,
60427
+ children: actions.map((action) => /* @__PURE__ */ jsx298(
60428
+ Button_default,
60429
+ {
60430
+ size: "xs",
60431
+ weight: "medium",
60432
+ variant: action.variant ?? "soft",
60433
+ color: action.tone ?? palette.accent,
60434
+ leadingIcon: action.leadingIcon,
60435
+ disabled: action.disabled,
60436
+ onClick: () => onAction(stepId, action.id),
60437
+ children: action.label
60438
+ },
60439
+ action.id
60440
+ ))
60441
+ }
60442
+ );
60443
+ };
60444
+ var WorkflowQuickActions_default = WorkflowQuickActions;
60445
+
60058
60446
  // src/components/WorkflowTracker/parts.tsx
60059
- import classNames108 from "classnames";
60060
- import { jsx as jsx297, jsxs as jsxs180 } from "react/jsx-runtime";
60447
+ import classNames110 from "classnames";
60448
+ import { jsx as jsx299, jsxs as jsxs181 } from "react/jsx-runtime";
60061
60449
  var resolve = (surfaces) => surfaces ?? getSurfaceTokens(false);
60062
- var WorkflowPlaceholder = ({ title, subtitle, palette, surfaces, className }) => /* @__PURE__ */ jsxs180(
60450
+ var WorkflowPlaceholder = ({ title, subtitle, palette, surfaces, className }) => /* @__PURE__ */ jsxs181(
60063
60451
  "div",
60064
60452
  {
60065
- className: classNames108(
60453
+ className: classNames110(
60066
60454
  "flex flex-col items-center justify-center gap-3 px-6 py-10 text-center",
60067
60455
  className
60068
60456
  ),
60069
60457
  children: [
60070
- /* @__PURE__ */ jsx297(WorkflowStatusNode_default, { status: "not_started", palette, size: "lg" }),
60071
- /* @__PURE__ */ jsxs180("div", { className: "space-y-1", children: [
60072
- /* @__PURE__ */ jsx297(
60458
+ /* @__PURE__ */ jsx299(WorkflowStatusNode_default, { status: "not_started", palette, size: "lg" }),
60459
+ /* @__PURE__ */ jsxs181("div", { className: "space-y-1", children: [
60460
+ /* @__PURE__ */ jsx299(
60073
60461
  "p",
60074
60462
  {
60075
- className: classNames108(
60463
+ className: classNames110(
60076
60464
  "text-sm font-semibold",
60077
60465
  resolve(surfaces).mutedText
60078
60466
  ),
60079
60467
  children: title
60080
60468
  }
60081
60469
  ),
60082
- subtitle && /* @__PURE__ */ jsx297(
60470
+ subtitle && /* @__PURE__ */ jsx299(
60083
60471
  "p",
60084
60472
  {
60085
- className: classNames108(
60473
+ className: classNames110(
60086
60474
  "max-w-xs text-xs leading-5",
60087
60475
  resolve(surfaces).faintText
60088
60476
  ),
@@ -60093,10 +60481,10 @@ var WorkflowPlaceholder = ({ title, subtitle, palette, surfaces, className }) =>
60093
60481
  ]
60094
60482
  }
60095
60483
  );
60096
- var SectionTitle = ({ children, surfaces, className }) => /* @__PURE__ */ jsx297(
60484
+ var SectionTitle = ({ children, surfaces, className }) => /* @__PURE__ */ jsx299(
60097
60485
  "span",
60098
60486
  {
60099
- className: classNames108(
60487
+ className: classNames110(
60100
60488
  "text-[10px] font-semibold uppercase tracking-widest",
60101
60489
  resolve(surfaces).faintText,
60102
60490
  className
@@ -60104,7 +60492,7 @@ var SectionTitle = ({ children, surfaces, className }) => /* @__PURE__ */ jsx297
60104
60492
  children
60105
60493
  }
60106
60494
  );
60107
- var SectionMeta = ({ children, surfaces, className }) => /* @__PURE__ */ jsx297("span", { className: classNames108("text-xs", resolve(surfaces).mutedText, className), children });
60495
+ var SectionMeta = ({ children, surfaces, className }) => /* @__PURE__ */ jsx299("span", { className: classNames110("text-xs", resolve(surfaces).mutedText, className), children });
60108
60496
  var WorkflowBadge = ({
60109
60497
  children,
60110
60498
  status,
@@ -60112,14 +60500,14 @@ var WorkflowBadge = ({
60112
60500
  tone
60113
60501
  }) => {
60114
60502
  const tokens = getStatusTokens(status, palette);
60115
- return /* @__PURE__ */ jsx297(
60503
+ return /* @__PURE__ */ jsx299(
60116
60504
  Pill_default,
60117
60505
  {
60118
60506
  size: "xs",
60119
60507
  uppercase: true,
60120
60508
  tone: tone ?? tokens.pillTone,
60121
60509
  variant: "outline",
60122
- className: classNames108(
60510
+ className: classNames110(
60123
60511
  "shrink-0 font-medium",
60124
60512
  tone ? `bg-${tone}-100 dark:bg-${tone}-900` : tokens.pillFill
60125
60513
  ),
@@ -60127,177 +60515,17 @@ var WorkflowBadge = ({
60127
60515
  }
60128
60516
  );
60129
60517
  };
60130
- var MetaField = ({ label, value, surfaces }) => /* @__PURE__ */ jsxs180("div", { className: "min-w-0", children: [
60131
- /* @__PURE__ */ jsx297(SectionTitle, { surfaces, children: label }),
60132
- /* @__PURE__ */ jsx297("p", { className: "mt-1 text-sm font-medium text-neutral-800 dark:text-neutral-100", children: value })
60133
- ] });
60134
- var Tally = ({ count, label, surfaces }) => /* @__PURE__ */ jsxs180("span", { className: "inline-flex items-center gap-1", children: [
60135
- /* @__PURE__ */ jsx297("span", { className: "font-semibold text-neutral-900 dark:text-white", children: count }),
60136
- /* @__PURE__ */ jsx297("span", { className: resolve(surfaces).mutedText, children: label })
60137
- ] });
60138
-
60139
- // src/components/WorkflowTracker/WorkflowSummaryCard.tsx
60140
- import { jsx as jsx298, jsxs as jsxs181 } from "react/jsx-runtime";
60141
- var WorkflowSummaryCard = ({
60142
- title,
60143
- steps,
60144
- palette,
60145
- surfaces
60146
- }) => /* @__PURE__ */ jsxs181("div", { className: "px-5 py-4", children: [
60147
- /* @__PURE__ */ jsx298(SectionTitle, { surfaces, children: title }),
60148
- /* @__PURE__ */ jsx298("ul", { className: "mt-3 space-y-3", children: steps.map((step) => /* @__PURE__ */ jsxs181("li", { className: "flex items-start gap-3", children: [
60149
- /* @__PURE__ */ jsx298(
60150
- WorkflowStatusNode_default,
60151
- {
60152
- status: normalizeStatus(step.status),
60153
- palette,
60154
- className: "mt-0.5"
60155
- }
60156
- ),
60157
- /* @__PURE__ */ jsxs181("div", { className: "min-w-0 flex-1", children: [
60158
- /* @__PURE__ */ jsx298("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: step.label }),
60159
- step.meta && /* @__PURE__ */ jsx298(
60160
- "p",
60161
- {
60162
- className: classNames109(
60163
- "mt-0.5 text-xs leading-5",
60164
- surfaces.mutedText
60165
- ),
60166
- children: step.meta
60167
- }
60168
- )
60169
- ] })
60170
- ] }, step.id)) })
60171
- ] });
60172
- var WorkflowSummaryCard_default = WorkflowSummaryCard;
60173
-
60174
- // src/components/WorkflowTracker/WorkflowTrackerRail.tsx
60175
- import { useMemo as useMemo52 } from "react";
60176
- import classNames113 from "classnames";
60177
-
60178
- // src/components/WorkflowTracker/WorkflowTimeline.tsx
60179
- import React87 from "react";
60180
- import classNames112 from "classnames";
60181
-
60182
- // src/components/WorkflowTracker/WorkflowSkeleton.tsx
60183
- import classNames110 from "classnames";
60184
- import { jsx as jsx299, jsxs as jsxs182 } from "react/jsx-runtime";
60185
- var Bar3 = ({
60186
- width,
60187
- className
60188
- }) => /* @__PURE__ */ jsx299(
60189
- "span",
60190
- {
60191
- className: classNames110(
60192
- "block h-2.5 rounded-full bg-neutral-200 dark:bg-neutral-800",
60193
- className
60194
- ),
60195
- style: { width }
60196
- }
60197
- );
60198
- var Dot = () => /* @__PURE__ */ jsx299("span", { className: "h-5 w-5 shrink-0 rounded-full bg-neutral-200 dark:bg-neutral-800" });
60199
- var WorkflowHeaderSkeleton = ({ hasIcon = false, iconCorner = DEFAULT_SURFACE_CORNER }) => /* @__PURE__ */ jsxs182("div", { className: "mb-5 flex animate-pulse flex-wrap items-start justify-between gap-3 motion-reduce:animate-none", children: [
60200
- /* @__PURE__ */ jsxs182("div", { className: "flex items-center gap-3", children: [
60201
- hasIcon && /* @__PURE__ */ jsx299(
60202
- Bar3,
60203
- {
60204
- width: "3rem",
60205
- className: classNames110("h-12", getSurfaceCornerClass(iconCorner))
60206
- }
60207
- ),
60208
- /* @__PURE__ */ jsxs182("div", { className: "space-y-3", children: [
60209
- /* @__PURE__ */ jsx299(Bar3, { width: "11rem", className: "h-2" }),
60210
- /* @__PURE__ */ jsx299(Bar3, { width: "16rem", className: "h-6" })
60211
- ] })
60212
- ] }),
60213
- /* @__PURE__ */ jsx299(Bar3, { width: "9rem", className: "h-6 rounded-full" })
60518
+ var MetaField = ({ label, value, surfaces }) => /* @__PURE__ */ jsxs181("div", { className: "min-w-0", children: [
60519
+ /* @__PURE__ */ jsx299(SectionTitle, { surfaces, children: label }),
60520
+ /* @__PURE__ */ jsx299("p", { className: "mt-1 text-sm font-medium text-neutral-800 dark:text-neutral-100", children: value })
60214
60521
  ] });
60215
- var WorkflowRailSkeleton = ({
60216
- rows = 6
60217
- }) => /* @__PURE__ */ jsxs182("div", { className: "animate-pulse motion-reduce:animate-none", children: [
60218
- /* @__PURE__ */ jsxs182("div", { className: "border-b border-neutral-200 px-5 pb-4 pt-5 dark:border-neutral-800", children: [
60219
- /* @__PURE__ */ jsxs182("div", { className: "flex items-center justify-between", children: [
60220
- /* @__PURE__ */ jsx299(Bar3, { width: "4.5rem" }),
60221
- /* @__PURE__ */ jsx299(Bar3, { width: "2rem" })
60222
- ] }),
60223
- /* @__PURE__ */ jsx299("span", { className: "mt-3 block h-1 w-full rounded-full bg-neutral-200 dark:bg-neutral-800" }),
60224
- /* @__PURE__ */ jsx299(Bar3, { width: "80%", className: "mt-3" })
60225
- ] }),
60226
- /* @__PURE__ */ jsx299("div", { className: "space-y-5 px-5 py-5", children: Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ jsxs182("div", { className: "flex items-start gap-3", children: [
60227
- /* @__PURE__ */ jsx299(Dot, {}),
60228
- /* @__PURE__ */ jsxs182("div", { className: "flex-1 space-y-2", children: [
60229
- /* @__PURE__ */ jsx299(Bar3, { width: index % 2 === 0 ? "62%" : "48%" }),
60230
- /* @__PURE__ */ jsx299(Bar3, { width: "34%", className: "h-2" })
60231
- ] })
60232
- ] }, index)) })
60522
+ var Tally = ({ count, label, surfaces }) => /* @__PURE__ */ jsxs181("span", { className: "inline-flex items-center gap-1", children: [
60523
+ /* @__PURE__ */ jsx299("span", { className: "font-semibold text-neutral-900 dark:text-white", children: count }),
60524
+ /* @__PURE__ */ jsx299("span", { className: resolve(surfaces).mutedText, children: label })
60233
60525
  ] });
60234
- var WorkflowDetailSkeleton = () => /* @__PURE__ */ jsxs182("div", { className: "animate-pulse motion-reduce:animate-none", children: [
60235
- /* @__PURE__ */ jsxs182("div", { className: "space-y-4 px-5 pb-6 pt-5 sm:px-6", children: [
60236
- /* @__PURE__ */ jsxs182("div", { className: "flex items-center justify-between", children: [
60237
- /* @__PURE__ */ jsx299(Bar3, { width: "6rem" }),
60238
- /* @__PURE__ */ jsx299(Bar3, { width: "4rem" })
60239
- ] }),
60240
- /* @__PURE__ */ jsx299(Bar3, { width: "45%", className: "h-5" }),
60241
- /* @__PURE__ */ jsxs182("div", { className: "space-y-2", children: [
60242
- /* @__PURE__ */ jsx299(Bar3, { width: "92%", className: "h-2" }),
60243
- /* @__PURE__ */ jsx299(Bar3, { width: "70%", className: "h-2" })
60244
- ] }),
60245
- /* @__PURE__ */ jsxs182("div", { className: "flex gap-10 pt-2", children: [
60246
- /* @__PURE__ */ jsx299(Bar3, { width: "5rem" }),
60247
- /* @__PURE__ */ jsx299(Bar3, { width: "6rem" }),
60248
- /* @__PURE__ */ jsx299(Bar3, { width: "4rem" })
60249
- ] })
60250
- ] }),
60251
- /* @__PURE__ */ jsx299("div", { className: "border-y border-neutral-200 bg-neutral-50 px-5 py-3 dark:border-neutral-800 dark:bg-white/5 sm:px-6", children: /* @__PURE__ */ jsx299(Bar3, { width: "5rem" }) }),
60252
- /* @__PURE__ */ jsx299("div", { className: "divide-y divide-neutral-200 dark:divide-neutral-800", children: Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ jsxs182("div", { className: "flex items-center gap-3 px-5 py-4 sm:px-6", children: [
60253
- /* @__PURE__ */ jsx299(Dot, {}),
60254
- /* @__PURE__ */ jsx299(Bar3, { width: index === 1 ? "38%" : "30%" }),
60255
- /* @__PURE__ */ jsx299("span", { className: "flex-1" }),
60256
- /* @__PURE__ */ jsx299(Bar3, { width: "3rem" })
60257
- ] }, index)) })
60258
- ] });
60259
-
60260
- // src/components/WorkflowTracker/WorkflowQuickActions.tsx
60261
- import classNames111 from "classnames";
60262
- import { jsx as jsx300 } from "react/jsx-runtime";
60263
- var WorkflowQuickActions = ({
60264
- stepId,
60265
- actions,
60266
- palette,
60267
- groupLabel,
60268
- onAction,
60269
- className,
60270
- style
60271
- }) => {
60272
- if (!onAction || actions.length === 0) return null;
60273
- return /* @__PURE__ */ jsx300(
60274
- "div",
60275
- {
60276
- role: "group",
60277
- "aria-label": groupLabel,
60278
- className: classNames111("flex flex-wrap gap-1.5", className),
60279
- style,
60280
- children: actions.map((action) => /* @__PURE__ */ jsx300(
60281
- Button_default,
60282
- {
60283
- size: "xs",
60284
- weight: "medium",
60285
- variant: action.variant ?? "soft",
60286
- color: action.tone ?? palette.accent,
60287
- leadingIcon: action.leadingIcon,
60288
- disabled: action.disabled,
60289
- onClick: () => onAction(stepId, action.id),
60290
- children: action.label
60291
- },
60292
- action.id
60293
- ))
60294
- }
60295
- );
60296
- };
60297
- var WorkflowQuickActions_default = WorkflowQuickActions;
60298
60526
 
60299
60527
  // src/components/WorkflowTracker/WorkflowTimeline.tsx
60300
- import { Fragment as Fragment46, jsx as jsx301, jsxs as jsxs183 } from "react/jsx-runtime";
60528
+ import { Fragment as Fragment46, jsx as jsx300, jsxs as jsxs182 } from "react/jsx-runtime";
60301
60529
  var CONNECTOR_LEFT = 9;
60302
60530
  var CONNECTOR_TOP = 24;
60303
60531
  var NESTED_INDENT = 32;
@@ -60315,16 +60543,16 @@ var NestedSubSteps = ({
60315
60543
  palette,
60316
60544
  surfaces,
60317
60545
  onSubStepSelect
60318
- }) => /* @__PURE__ */ jsx301(
60546
+ }) => /* @__PURE__ */ jsx300(
60319
60547
  "div",
60320
60548
  {
60321
- className: classNames112("mt-3 rounded-lg p-3", surfaces.nestedBox),
60549
+ className: classNames111("mt-3 rounded-lg p-3", surfaces.nestedBox),
60322
60550
  style: { marginLeft: NESTED_INDENT },
60323
- children: /* @__PURE__ */ jsx301("ul", { className: "space-y-2.5", children: subSteps.map((subStep) => {
60551
+ children: /* @__PURE__ */ jsx300("ul", { className: "space-y-2.5", children: subSteps.map((subStep) => {
60324
60552
  const status = normalizeStatus(subStep.status);
60325
60553
  const isActive = status === "running" || status === "in_progress";
60326
- const content = /* @__PURE__ */ jsxs183(Fragment46, { children: [
60327
- /* @__PURE__ */ jsx301(
60554
+ const content = /* @__PURE__ */ jsxs182(Fragment46, { children: [
60555
+ /* @__PURE__ */ jsx300(
60328
60556
  WorkflowStatusNode_default,
60329
60557
  {
60330
60558
  status,
@@ -60332,10 +60560,10 @@ var NestedSubSteps = ({
60332
60560
  size: "sm"
60333
60561
  }
60334
60562
  ),
60335
- /* @__PURE__ */ jsx301(
60563
+ /* @__PURE__ */ jsx300(
60336
60564
  "span",
60337
60565
  {
60338
- className: classNames112(
60566
+ className: classNames111(
60339
60567
  "text-sm",
60340
60568
  isActive ? "font-semibold text-neutral-900 dark:text-white" : "text-neutral-600 dark:text-neutral-300"
60341
60569
  ),
@@ -60343,7 +60571,7 @@ var NestedSubSteps = ({
60343
60571
  }
60344
60572
  )
60345
60573
  ] });
60346
- return /* @__PURE__ */ jsx301("li", { children: onSubStepSelect ? /* @__PURE__ */ jsx301(
60574
+ return /* @__PURE__ */ jsx300("li", { children: onSubStepSelect ? /* @__PURE__ */ jsx300(
60347
60575
  "button",
60348
60576
  {
60349
60577
  type: "button",
@@ -60351,7 +60579,7 @@ var NestedSubSteps = ({
60351
60579
  className: "flex w-full items-center gap-2.5 rounded-sm text-left focus:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 focus-visible:ring-offset-2 dark:focus-visible:ring-neutral-500",
60352
60580
  children: content
60353
60581
  }
60354
- ) : /* @__PURE__ */ jsx301("div", { className: "flex items-center gap-2.5", children: content }) }, subStep.id);
60582
+ ) : /* @__PURE__ */ jsx300("div", { className: "flex items-center gap-2.5", children: content }) }, subStep.id);
60355
60583
  }) })
60356
60584
  }
60357
60585
  );
@@ -60372,7 +60600,7 @@ var WorkflowTimeline = ({
60372
60600
  onStepAction
60373
60601
  }) => {
60374
60602
  if (loading) {
60375
- return /* @__PURE__ */ jsx301(WorkflowRailSkeleton, { rows: loadingRows });
60603
+ return /* @__PURE__ */ jsx300(WorkflowRailSkeleton, { rows: loadingRows });
60376
60604
  }
60377
60605
  const isEmpty2 = steps.length === 0;
60378
60606
  const tallyEntries = [
@@ -60381,19 +60609,19 @@ var WorkflowTimeline = ({
60381
60609
  { count: tallies.flagged, label: labels.flagged },
60382
60610
  { count: tallies.remaining, label: labels.remaining }
60383
60611
  ].filter((entry) => entry.count > 0);
60384
- return /* @__PURE__ */ jsxs183("div", { className: "flex flex-col", children: [
60385
- !isEmpty2 && /* @__PURE__ */ jsxs183("div", { className: classNames112("border-b px-5 pb-4 pt-5", surfaces.border), children: [
60386
- /* @__PURE__ */ jsxs183("div", { className: "flex items-baseline justify-between gap-3", children: [
60387
- /* @__PURE__ */ jsx301(SectionTitle, { surfaces, children: labels.progress }),
60388
- /* @__PURE__ */ jsxs183("span", { className: "text-sm font-semibold text-neutral-900 dark:text-white", children: [
60612
+ return /* @__PURE__ */ jsxs182("div", { className: "flex flex-col", children: [
60613
+ !isEmpty2 && /* @__PURE__ */ jsxs182("div", { className: classNames111("border-b px-5 pb-4 pt-5", surfaces.border), children: [
60614
+ /* @__PURE__ */ jsxs182("div", { className: "flex items-baseline justify-between gap-3", children: [
60615
+ /* @__PURE__ */ jsx300(SectionTitle, { surfaces, children: labels.progress }),
60616
+ /* @__PURE__ */ jsxs182("span", { className: "text-sm font-semibold text-neutral-900 dark:text-white", children: [
60389
60617
  progress,
60390
60618
  "%"
60391
60619
  ] })
60392
60620
  ] }),
60393
- /* @__PURE__ */ jsx301(
60621
+ /* @__PURE__ */ jsx300(
60394
60622
  Progress_default,
60395
60623
  {
60396
- className: classNames112(
60624
+ className: classNames111(
60397
60625
  "mt-2",
60398
60626
  surfaces.translucent ? "bg-white/40 dark:bg-white/15" : "bg-neutral-200 dark:bg-neutral-700"
60399
60627
  ),
@@ -60403,8 +60631,8 @@ var WorkflowTimeline = ({
60403
60631
  motion: "none"
60404
60632
  }
60405
60633
  ),
60406
- tallyEntries.length > 0 && /* @__PURE__ */ jsx301("div", { className: "mt-3 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs", children: tallyEntries.map((entry, index) => /* @__PURE__ */ jsxs183(React87.Fragment, { children: [
60407
- index > 0 && /* @__PURE__ */ jsx301(
60634
+ tallyEntries.length > 0 && /* @__PURE__ */ jsx300("div", { className: "mt-3 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs", children: tallyEntries.map((entry, index) => /* @__PURE__ */ jsxs182(React87.Fragment, { children: [
60635
+ index > 0 && /* @__PURE__ */ jsx300(
60408
60636
  "span",
60409
60637
  {
60410
60638
  "aria-hidden": "true",
@@ -60412,7 +60640,7 @@ var WorkflowTimeline = ({
60412
60640
  children: "\xB7"
60413
60641
  }
60414
60642
  ),
60415
- /* @__PURE__ */ jsx301(
60643
+ /* @__PURE__ */ jsx300(
60416
60644
  Tally,
60417
60645
  {
60418
60646
  count: entry.count,
@@ -60422,7 +60650,7 @@ var WorkflowTimeline = ({
60422
60650
  )
60423
60651
  ] }, entry.label)) })
60424
60652
  ] }),
60425
- /* @__PURE__ */ jsx301("div", { className: classNames112(isEmpty2 ? "" : "px-5 py-5"), children: isEmpty2 ? emptyState ?? /* @__PURE__ */ jsx301(
60653
+ /* @__PURE__ */ jsx300("div", { className: classNames111(isEmpty2 ? "" : "px-5 py-5"), children: isEmpty2 ? emptyState ?? /* @__PURE__ */ jsx300(
60426
60654
  WorkflowPlaceholder,
60427
60655
  {
60428
60656
  title: labels.empty,
@@ -60430,14 +60658,14 @@ var WorkflowTimeline = ({
60430
60658
  palette,
60431
60659
  surfaces
60432
60660
  }
60433
- ) : /* @__PURE__ */ jsx301("ol", { className: "m-0 list-none p-0", children: steps.map((step, index) => {
60661
+ ) : /* @__PURE__ */ jsx300("ol", { className: "m-0 list-none p-0", children: steps.map((step, index) => {
60434
60662
  const status = normalizeStatus(step.status);
60435
60663
  const tokens = getStatusTokens(status, palette);
60436
60664
  const isActive = step.id === activeStepId;
60437
60665
  const isLast = index === steps.length - 1;
60438
60666
  const nested = isActive && step.subSteps && step.subSteps.length > 0 ? step.subSteps : void 0;
60439
- const rowContent = /* @__PURE__ */ jsxs183(Fragment46, { children: [
60440
- /* @__PURE__ */ jsx301(
60667
+ const rowContent = /* @__PURE__ */ jsxs182(Fragment46, { children: [
60668
+ /* @__PURE__ */ jsx300(
60441
60669
  WorkflowStatusNode_default,
60442
60670
  {
60443
60671
  status,
@@ -60445,19 +60673,19 @@ var WorkflowTimeline = ({
60445
60673
  className: "mt-0.5"
60446
60674
  }
60447
60675
  ),
60448
- /* @__PURE__ */ jsxs183("div", { className: "min-w-0 flex-1", children: [
60449
- /* @__PURE__ */ jsxs183("div", { className: "flex flex-wrap items-center gap-2", children: [
60450
- /* @__PURE__ */ jsx301(
60676
+ /* @__PURE__ */ jsxs182("div", { className: "min-w-0 flex-1", children: [
60677
+ /* @__PURE__ */ jsxs182("div", { className: "flex flex-wrap items-center gap-2", children: [
60678
+ /* @__PURE__ */ jsx300(
60451
60679
  "span",
60452
60680
  {
60453
- className: classNames112(
60681
+ className: classNames111(
60454
60682
  "text-sm",
60455
60683
  isActive ? "font-semibold text-neutral-900 dark:text-white" : "font-medium text-neutral-700 dark:text-neutral-200"
60456
60684
  ),
60457
60685
  children: step.label
60458
60686
  }
60459
60687
  ),
60460
- step.badge && /* @__PURE__ */ jsx301(
60688
+ step.badge && /* @__PURE__ */ jsx300(
60461
60689
  WorkflowBadge,
60462
60690
  {
60463
60691
  status,
@@ -60467,10 +60695,10 @@ var WorkflowTimeline = ({
60467
60695
  }
60468
60696
  )
60469
60697
  ] }),
60470
- step.meta && /* @__PURE__ */ jsx301(
60698
+ step.meta && /* @__PURE__ */ jsx300(
60471
60699
  "p",
60472
60700
  {
60473
- className: classNames112(
60701
+ className: classNames111(
60474
60702
  "mt-1 text-xs leading-5",
60475
60703
  surfaces.mutedText
60476
60704
  ),
@@ -60479,24 +60707,24 @@ var WorkflowTimeline = ({
60479
60707
  )
60480
60708
  ] })
60481
60709
  ] });
60482
- return /* @__PURE__ */ jsxs183(
60710
+ return /* @__PURE__ */ jsxs182(
60483
60711
  "li",
60484
60712
  {
60485
- className: classNames112("relative", !isLast && "pb-5"),
60713
+ className: classNames111("relative", !isLast && "pb-5"),
60486
60714
  "aria-current": isActive ? "step" : void 0,
60487
60715
  children: [
60488
- !isLast && /* @__PURE__ */ jsx301(
60716
+ !isLast && /* @__PURE__ */ jsx300(
60489
60717
  "span",
60490
60718
  {
60491
60719
  "aria-hidden": "true",
60492
- className: classNames112(
60720
+ className: classNames111(
60493
60721
  "absolute bottom-0",
60494
60722
  tokens.connectorDashed ? `border-l-2 border-dashed ${tokens.connector}` : `w-0.5 rounded-full ${tokens.connector}`
60495
60723
  ),
60496
60724
  style: { left: CONNECTOR_LEFT, top: CONNECTOR_TOP }
60497
60725
  }
60498
60726
  ),
60499
- onStepSelect ? /* @__PURE__ */ jsx301(
60727
+ onStepSelect ? /* @__PURE__ */ jsx300(
60500
60728
  "button",
60501
60729
  {
60502
60730
  type: "button",
@@ -60504,8 +60732,8 @@ var WorkflowTimeline = ({
60504
60732
  className: "flex w-full items-start gap-3 rounded-sm text-left focus:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 focus-visible:ring-offset-2 dark:focus-visible:ring-neutral-500",
60505
60733
  children: rowContent
60506
60734
  }
60507
- ) : /* @__PURE__ */ jsx301("div", { className: "flex items-start gap-3", children: rowContent }),
60508
- /* @__PURE__ */ jsx301(
60735
+ ) : /* @__PURE__ */ jsx300("div", { className: "flex items-start gap-3", children: rowContent }),
60736
+ /* @__PURE__ */ jsx300(
60509
60737
  WorkflowQuickActions_default,
60510
60738
  {
60511
60739
  stepId: step.id,
@@ -60516,7 +60744,7 @@ var WorkflowTimeline = ({
60516
60744
  className: "ml-8 mt-2"
60517
60745
  }
60518
60746
  ),
60519
- nested && /* @__PURE__ */ jsx301(
60747
+ nested && /* @__PURE__ */ jsx300(
60520
60748
  NestedSubSteps,
60521
60749
  {
60522
60750
  stepId: step.id,
@@ -60531,8 +60759,8 @@ var WorkflowTimeline = ({
60531
60759
  step.id
60532
60760
  );
60533
60761
  }) }) }),
60534
- showLegend && !isEmpty2 && /* @__PURE__ */ jsx301("div", { className: classNames112("mt-auto border-t px-5 py-4", surfaces.border), children: /* @__PURE__ */ jsx301("ul", { className: "flex flex-wrap gap-x-4 gap-y-2", children: LEGEND_ORDER.map((status) => /* @__PURE__ */ jsxs183("li", { className: "flex items-center gap-2", children: [
60535
- /* @__PURE__ */ jsx301(
60762
+ showLegend && !isEmpty2 && /* @__PURE__ */ jsx300("div", { className: classNames111("mt-auto border-t px-5 py-4", surfaces.border), children: /* @__PURE__ */ jsx300("ul", { className: "flex flex-wrap gap-x-4 gap-y-2", children: LEGEND_ORDER.map((status) => /* @__PURE__ */ jsxs182("li", { className: "flex items-center gap-2", children: [
60763
+ /* @__PURE__ */ jsx300(
60536
60764
  WorkflowStatusNode_default,
60537
60765
  {
60538
60766
  status,
@@ -60540,7 +60768,7 @@ var WorkflowTimeline = ({
60540
60768
  size: "sm"
60541
60769
  }
60542
60770
  ),
60543
- /* @__PURE__ */ jsx301("span", { className: classNames112("text-xs", surfaces.mutedText), children: labels.statuses[status] })
60771
+ /* @__PURE__ */ jsx300("span", { className: classNames111("text-xs", surfaces.mutedText), children: labels.statuses[status] })
60544
60772
  ] }, status)) }) })
60545
60773
  ] });
60546
60774
  };
@@ -60701,7 +60929,7 @@ var resolveActiveStep = (steps, activeStepId) => {
60701
60929
  };
60702
60930
 
60703
60931
  // src/components/WorkflowTracker/sampleWorkflow.tsx
60704
- import { jsx as jsx302, jsxs as jsxs184 } from "react/jsx-runtime";
60932
+ import { jsx as jsx301, jsxs as jsxs183 } from "react/jsx-runtime";
60705
60933
  var sampleWorkflow = {
60706
60934
  eyebrow: "VENDOR ONBOARDING \xB7 REQ-4128",
60707
60935
  title: "Northwind Logistics GmbH",
@@ -60746,9 +60974,9 @@ var sampleWorkflow = {
60746
60974
  status: "attention",
60747
60975
  badge: "Needs attention",
60748
60976
  meta: "1h 06m \xB7 Liability certificate expired 12 Aug",
60749
- details: /* @__PURE__ */ jsxs184("div", { className: "space-y-3 px-5 py-4 sm:px-6", children: [
60750
- /* @__PURE__ */ jsx302("p", { className: "text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: "The liability certificate expired on 12 Aug. A reminder went to the vendor\u2019s compliance contact; the underwriter quote is still pending." }),
60751
- /* @__PURE__ */ jsx302("ul", { className: "flex flex-wrap gap-2", children: ["reminder-12-aug.pdf", "underwriter-quote.pdf"].map((file) => /* @__PURE__ */ jsx302(
60977
+ details: /* @__PURE__ */ jsxs183("div", { className: "space-y-3 px-5 py-4 sm:px-6", children: [
60978
+ /* @__PURE__ */ jsx301("p", { className: "text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: "The liability certificate expired on 12 Aug. A reminder went to the vendor\u2019s compliance contact; the underwriter quote is still pending." }),
60979
+ /* @__PURE__ */ jsx301("ul", { className: "flex flex-wrap gap-2", children: ["reminder-12-aug.pdf", "underwriter-quote.pdf"].map((file) => /* @__PURE__ */ jsx301(
60752
60980
  "li",
60753
60981
  {
60754
60982
  className: "rounded-full border border-neutral-200 px-2.5 py-0.5 text-xs text-neutral-500 dark:border-neutral-700 dark:text-neutral-400",
@@ -60779,18 +61007,18 @@ var sampleWorkflow = {
60779
61007
  owner: "D. Okafor",
60780
61008
  startedAt: "19 Aug \xB7 09:12",
60781
61009
  sla: "Due in 6h",
60782
- details: /* @__PURE__ */ jsxs184("div", { className: "space-y-5 px-5 py-4 sm:px-6", children: [
60783
- /* @__PURE__ */ jsxs184("div", { children: [
60784
- /* @__PURE__ */ jsx302("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Review activity" }),
60785
- /* @__PURE__ */ jsx302("p", { className: "mt-2 text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: "Reviewer A. Lindqvist is cross-checking the subprocessor list against the master agreement. Uploads appear here as the vendor submits them." })
61010
+ details: /* @__PURE__ */ jsxs183("div", { className: "space-y-5 px-5 py-4 sm:px-6", children: [
61011
+ /* @__PURE__ */ jsxs183("div", { children: [
61012
+ /* @__PURE__ */ jsx301("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Review activity" }),
61013
+ /* @__PURE__ */ jsx301("p", { className: "mt-2 text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: "Reviewer A. Lindqvist is cross-checking the subprocessor list against the master agreement. Uploads appear here as the vendor submits them." })
60786
61014
  ] }),
60787
- /* @__PURE__ */ jsxs184("div", { children: [
60788
- /* @__PURE__ */ jsx302("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Files received" }),
60789
- /* @__PURE__ */ jsx302("ul", { className: "mt-2 flex flex-wrap gap-2", children: [
61015
+ /* @__PURE__ */ jsxs183("div", { children: [
61016
+ /* @__PURE__ */ jsx301("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Files received" }),
61017
+ /* @__PURE__ */ jsx301("ul", { className: "mt-2 flex flex-wrap gap-2", children: [
60790
61018
  "data-handling-v3.pdf",
60791
61019
  "pentest-2026.pdf",
60792
61020
  "soc2-typeii.pdf"
60793
- ].map((file) => /* @__PURE__ */ jsx302(
61021
+ ].map((file) => /* @__PURE__ */ jsx301(
60794
61022
  "li",
60795
61023
  {
60796
61024
  className: "rounded-full border border-neutral-200 px-2.5 py-0.5 text-xs text-neutral-500 dark:border-neutral-700 dark:text-neutral-400",
@@ -60799,11 +61027,11 @@ var sampleWorkflow = {
60799
61027
  file
60800
61028
  )) })
60801
61029
  ] }),
60802
- /* @__PURE__ */ jsxs184("div", { children: [
60803
- /* @__PURE__ */ jsx302("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Open findings" }),
60804
- /* @__PURE__ */ jsxs184("ul", { className: "mt-2 space-y-2", children: [
60805
- /* @__PURE__ */ jsxs184("li", { className: "flex items-start gap-2 text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: [
60806
- /* @__PURE__ */ jsx302(
61030
+ /* @__PURE__ */ jsxs183("div", { children: [
61031
+ /* @__PURE__ */ jsx301("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Open findings" }),
61032
+ /* @__PURE__ */ jsxs183("ul", { className: "mt-2 space-y-2", children: [
61033
+ /* @__PURE__ */ jsxs183("li", { className: "flex items-start gap-2 text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: [
61034
+ /* @__PURE__ */ jsx301(
60807
61035
  "span",
60808
61036
  {
60809
61037
  "aria-hidden": "true",
@@ -60812,8 +61040,8 @@ var sampleWorkflow = {
60812
61040
  ),
60813
61041
  "Subprocessor \u201CCloudDot BV\u201D is not covered by the DPA yet"
60814
61042
  ] }),
60815
- /* @__PURE__ */ jsxs184("li", { className: "flex items-start gap-2 text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: [
60816
- /* @__PURE__ */ jsx302(
61043
+ /* @__PURE__ */ jsxs183("li", { className: "flex items-start gap-2 text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: [
61044
+ /* @__PURE__ */ jsx301(
60817
61045
  "span",
60818
61046
  {
60819
61047
  "aria-hidden": "true",
@@ -60891,7 +61119,7 @@ var sampleWorkflow = {
60891
61119
  };
60892
61120
 
60893
61121
  // src/components/WorkflowTracker/WorkflowTrackerRail.tsx
60894
- import { jsx as jsx303 } from "react/jsx-runtime";
61122
+ import { jsx as jsx302 } from "react/jsx-runtime";
60895
61123
  var WorkflowTrackerRail = ({
60896
61124
  data = sampleWorkflow,
60897
61125
  loading = false,
@@ -60918,14 +61146,14 @@ var WorkflowTrackerRail = ({
60918
61146
  );
60919
61147
  const progress = useMemo52(() => computeProgress(steps), [steps]);
60920
61148
  const tallies = useMemo52(() => computeTallies(steps), [steps]);
60921
- return /* @__PURE__ */ jsx303(
61149
+ return /* @__PURE__ */ jsx302(
60922
61150
  Panel_default,
60923
61151
  {
60924
61152
  ...cardProps,
60925
61153
  scrollable: cardScrollable ?? false,
60926
- className: classNames113(className, cardClassName),
61154
+ className: classNames112(className, cardClassName),
60927
61155
  style,
60928
- children: /* @__PURE__ */ jsx303(
61156
+ children: /* @__PURE__ */ jsx302(
60929
61157
  WorkflowTimeline_default,
60930
61158
  {
60931
61159
  steps,
@@ -60951,11 +61179,11 @@ var WorkflowTrackerRail_default = WorkflowTrackerRail;
60951
61179
 
60952
61180
  // src/components/WorkflowTracker/WorkflowTrackerStepDetails.tsx
60953
61181
  import { useMemo as useMemo53 } from "react";
60954
- import classNames115 from "classnames";
61182
+ import classNames114 from "classnames";
60955
61183
 
60956
61184
  // src/components/WorkflowTracker/WorkflowDetailPanel.tsx
60957
- import classNames114 from "classnames";
60958
- import { Fragment as Fragment47, jsx as jsx304, jsxs as jsxs185 } from "react/jsx-runtime";
61185
+ import classNames113 from "classnames";
61186
+ import { Fragment as Fragment47, jsx as jsx303, jsxs as jsxs184 } from "react/jsx-runtime";
60959
61187
  var WorkflowDetailPanel = ({
60960
61188
  active,
60961
61189
  totalSteps,
@@ -60967,10 +61195,10 @@ var WorkflowDetailPanel = ({
60967
61195
  onStepAction
60968
61196
  }) => {
60969
61197
  if (loading) {
60970
- return /* @__PURE__ */ jsx304(WorkflowDetailSkeleton, {});
61198
+ return /* @__PURE__ */ jsx303(WorkflowDetailSkeleton, {});
60971
61199
  }
60972
61200
  if (!active) {
60973
- return /* @__PURE__ */ jsx304(
61201
+ return /* @__PURE__ */ jsx303(
60974
61202
  WorkflowPlaceholder,
60975
61203
  {
60976
61204
  title: labels.noActiveStep,
@@ -60988,11 +61216,11 @@ var WorkflowDetailPanel = ({
60988
61216
  step.startedAt ? { label: labels.started, value: step.startedAt } : void 0,
60989
61217
  step.sla ? { label: labels.sla, value: step.sla } : void 0
60990
61218
  ].filter(Boolean);
60991
- return /* @__PURE__ */ jsxs185("div", { className: "flex flex-col", children: [
60992
- /* @__PURE__ */ jsxs185("div", { className: "px-5 pb-6 pt-5 sm:px-6", children: [
60993
- /* @__PURE__ */ jsxs185("div", { className: "flex flex-wrap items-center justify-between gap-x-4 gap-y-2", children: [
60994
- /* @__PURE__ */ jsxs185("div", { className: "flex flex-wrap items-center gap-3", children: [
60995
- /* @__PURE__ */ jsxs185(SectionTitle, { surfaces, children: [
61219
+ return /* @__PURE__ */ jsxs184("div", { className: "flex flex-col", children: [
61220
+ /* @__PURE__ */ jsxs184("div", { className: "px-5 pb-6 pt-5 sm:px-6", children: [
61221
+ /* @__PURE__ */ jsxs184("div", { className: "flex flex-wrap items-center justify-between gap-x-4 gap-y-2", children: [
61222
+ /* @__PURE__ */ jsxs184("div", { className: "flex flex-wrap items-center gap-3", children: [
61223
+ /* @__PURE__ */ jsxs184(SectionTitle, { surfaces, children: [
60996
61224
  labels.step,
60997
61225
  " ",
60998
61226
  index,
@@ -61001,7 +61229,7 @@ var WorkflowDetailPanel = ({
61001
61229
  " ",
61002
61230
  totalSteps
61003
61231
  ] }),
61004
- step.badge && /* @__PURE__ */ jsx304(
61232
+ step.badge && /* @__PURE__ */ jsx303(
61005
61233
  WorkflowBadge,
61006
61234
  {
61007
61235
  status,
@@ -61011,13 +61239,13 @@ var WorkflowDetailPanel = ({
61011
61239
  }
61012
61240
  )
61013
61241
  ] }),
61014
- /* @__PURE__ */ jsxs185("div", { className: "flex flex-wrap items-center justify-end gap-x-4 gap-y-2", children: [
61015
- step.elapsed && /* @__PURE__ */ jsxs185(SectionMeta, { surfaces, children: [
61242
+ /* @__PURE__ */ jsxs184("div", { className: "flex flex-wrap items-center justify-end gap-x-4 gap-y-2", children: [
61243
+ step.elapsed && /* @__PURE__ */ jsxs184(SectionMeta, { surfaces, children: [
61016
61244
  labels.elapsed,
61017
61245
  " ",
61018
61246
  step.elapsed
61019
61247
  ] }),
61020
- /* @__PURE__ */ jsx304(
61248
+ /* @__PURE__ */ jsx303(
61021
61249
  WorkflowQuickActions_default,
61022
61250
  {
61023
61251
  stepId: step.id,
@@ -61029,18 +61257,18 @@ var WorkflowDetailPanel = ({
61029
61257
  )
61030
61258
  ] })
61031
61259
  ] }),
61032
- /* @__PURE__ */ jsx304("h3", { className: "mt-3 text-xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-2xl", children: step.label }),
61033
- step.description && /* @__PURE__ */ jsx304(
61260
+ /* @__PURE__ */ jsx303("h3", { className: "mt-3 text-xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-2xl", children: step.label }),
61261
+ step.description && /* @__PURE__ */ jsx303(
61034
61262
  "p",
61035
61263
  {
61036
- className: classNames114(
61264
+ className: classNames113(
61037
61265
  "mt-2 max-w-3xl text-sm leading-6",
61038
61266
  surfaces.mutedText
61039
61267
  ),
61040
61268
  children: step.description
61041
61269
  }
61042
61270
  ),
61043
- metaFields.length > 0 && /* @__PURE__ */ jsx304("div", { className: "mt-5 flex flex-wrap gap-x-10 gap-y-4", children: metaFields.map((field) => /* @__PURE__ */ jsx304(
61271
+ metaFields.length > 0 && /* @__PURE__ */ jsx303("div", { className: "mt-5 flex flex-wrap gap-x-10 gap-y-4", children: metaFields.map((field) => /* @__PURE__ */ jsx303(
61044
61272
  MetaField,
61045
61273
  {
61046
61274
  label: field.label,
@@ -61050,18 +61278,18 @@ var WorkflowDetailPanel = ({
61050
61278
  field.label
61051
61279
  )) })
61052
61280
  ] }),
61053
- subSteps.length > 0 && /* @__PURE__ */ jsxs185(Fragment47, { children: [
61054
- /* @__PURE__ */ jsxs185(
61281
+ subSteps.length > 0 && /* @__PURE__ */ jsxs184(Fragment47, { children: [
61282
+ /* @__PURE__ */ jsxs184(
61055
61283
  "div",
61056
61284
  {
61057
- className: classNames114(
61285
+ className: classNames113(
61058
61286
  "flex flex-wrap items-center justify-between gap-2 border-y px-5 py-2.5 sm:px-6",
61059
61287
  surfaces.border,
61060
61288
  surfaces.strip
61061
61289
  ),
61062
61290
  children: [
61063
- /* @__PURE__ */ jsx304(SectionTitle, { surfaces, children: labels.subSteps }),
61064
- /* @__PURE__ */ jsxs185(SectionMeta, { surfaces, children: [
61291
+ /* @__PURE__ */ jsx303(SectionTitle, { surfaces, children: labels.subSteps }),
61292
+ /* @__PURE__ */ jsxs184(SectionMeta, { surfaces, children: [
61065
61293
  summary.accepted,
61066
61294
  " ",
61067
61295
  labels.accepted,
@@ -61077,24 +61305,24 @@ var WorkflowDetailPanel = ({
61077
61305
  ]
61078
61306
  }
61079
61307
  ),
61080
- /* @__PURE__ */ jsx304(
61308
+ /* @__PURE__ */ jsx303(
61081
61309
  "ul",
61082
61310
  {
61083
- className: classNames114(
61311
+ className: classNames113(
61084
61312
  "m-0 list-none divide-y p-0",
61085
61313
  surfaces.divider
61086
61314
  ),
61087
61315
  children: subSteps.map((subStep) => {
61088
61316
  const subStatus = normalizeStatus(subStep.status);
61089
61317
  const isRunning = subStatus === "running";
61090
- const rowContent = /* @__PURE__ */ jsxs185(Fragment47, { children: [
61091
- /* @__PURE__ */ jsx304(WorkflowStatusNode_default, { status: subStatus, palette }),
61092
- /* @__PURE__ */ jsxs185("div", { className: "min-w-0 flex-1", children: [
61093
- /* @__PURE__ */ jsx304("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: subStep.label }),
61094
- subStep.note && /* @__PURE__ */ jsx304(
61318
+ const rowContent = /* @__PURE__ */ jsxs184(Fragment47, { children: [
61319
+ /* @__PURE__ */ jsx303(WorkflowStatusNode_default, { status: subStatus, palette }),
61320
+ /* @__PURE__ */ jsxs184("div", { className: "min-w-0 flex-1", children: [
61321
+ /* @__PURE__ */ jsx303("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: subStep.label }),
61322
+ subStep.note && /* @__PURE__ */ jsx303(
61095
61323
  "p",
61096
61324
  {
61097
- className: classNames114(
61325
+ className: classNames113(
61098
61326
  "mt-0.5 text-xs leading-5",
61099
61327
  surfaces.mutedText
61100
61328
  ),
@@ -61102,7 +61330,7 @@ var WorkflowDetailPanel = ({
61102
61330
  }
61103
61331
  )
61104
61332
  ] }),
61105
- subStep.badge && /* @__PURE__ */ jsx304(
61333
+ subStep.badge && /* @__PURE__ */ jsx303(
61106
61334
  WorkflowBadge,
61107
61335
  {
61108
61336
  status: subStatus,
@@ -61111,10 +61339,10 @@ var WorkflowDetailPanel = ({
61111
61339
  children: subStep.badge
61112
61340
  }
61113
61341
  ),
61114
- /* @__PURE__ */ jsx304(
61342
+ /* @__PURE__ */ jsx303(
61115
61343
  "span",
61116
61344
  {
61117
- className: classNames114(
61345
+ className: classNames113(
61118
61346
  "w-10 shrink-0 text-right text-xs tabular-nums",
61119
61347
  surfaces.faintText
61120
61348
  ),
@@ -61122,22 +61350,22 @@ var WorkflowDetailPanel = ({
61122
61350
  }
61123
61351
  )
61124
61352
  ] });
61125
- const rowClasses = classNames114(
61353
+ const rowClasses = classNames113(
61126
61354
  "flex w-full items-center gap-3 px-5 py-3 text-left sm:px-6",
61127
61355
  isRunning && getRowHighlight(palette.accent, surfaces.translucent)
61128
61356
  );
61129
- return /* @__PURE__ */ jsx304("li", { children: onSubStepSelect ? /* @__PURE__ */ jsx304(
61357
+ return /* @__PURE__ */ jsx303("li", { children: onSubStepSelect ? /* @__PURE__ */ jsx303(
61130
61358
  "button",
61131
61359
  {
61132
61360
  type: "button",
61133
61361
  onClick: () => onSubStepSelect(step.id, subStep.id),
61134
- className: classNames114(
61362
+ className: classNames113(
61135
61363
  rowClasses,
61136
61364
  "focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-neutral-400 dark:focus-visible:ring-neutral-500"
61137
61365
  ),
61138
61366
  children: rowContent
61139
61367
  }
61140
- ) : /* @__PURE__ */ jsx304("div", { className: rowClasses, children: rowContent }) }, subStep.id);
61368
+ ) : /* @__PURE__ */ jsx303("div", { className: rowClasses, children: rowContent }) }, subStep.id);
61141
61369
  })
61142
61370
  }
61143
61371
  )
@@ -61147,7 +61375,7 @@ var WorkflowDetailPanel = ({
61147
61375
  var WorkflowDetailPanel_default = WorkflowDetailPanel;
61148
61376
 
61149
61377
  // src/components/WorkflowTracker/WorkflowTrackerStepDetails.tsx
61150
- import { jsx as jsx305 } from "react/jsx-runtime";
61378
+ import { jsx as jsx304 } from "react/jsx-runtime";
61151
61379
  var WorkflowTrackerStepDetails = ({
61152
61380
  data = sampleWorkflow,
61153
61381
  loading = false,
@@ -61170,13 +61398,13 @@ var WorkflowTrackerStepDetails = ({
61170
61398
  () => resolveActiveStep(steps, data?.activeStepId),
61171
61399
  [steps, data?.activeStepId]
61172
61400
  );
61173
- return /* @__PURE__ */ jsx305(
61401
+ return /* @__PURE__ */ jsx304(
61174
61402
  Panel_default,
61175
61403
  {
61176
61404
  ...cardProps,
61177
- className: classNames115(className, cardClassName),
61405
+ className: classNames114(className, cardClassName),
61178
61406
  style,
61179
- children: /* @__PURE__ */ jsx305(
61407
+ children: /* @__PURE__ */ jsx304(
61180
61408
  WorkflowDetailPanel_default,
61181
61409
  {
61182
61410
  active,
@@ -61196,31 +61424,31 @@ var WorkflowTrackerStepDetails_default = WorkflowTrackerStepDetails;
61196
61424
 
61197
61425
  // src/components/WorkflowTracker/WorkflowTrackerDetails.tsx
61198
61426
  import { useMemo as useMemo54 } from "react";
61199
- import classNames117 from "classnames";
61427
+ import classNames116 from "classnames";
61200
61428
 
61201
61429
  // src/components/WorkflowTracker/WorkflowDetailsCard.tsx
61202
- import classNames116 from "classnames";
61203
- import { jsx as jsx306 } from "react/jsx-runtime";
61430
+ import classNames115 from "classnames";
61431
+ import { jsx as jsx305 } from "react/jsx-runtime";
61204
61432
  var WorkflowDetailsCard = ({
61205
61433
  details,
61206
61434
  ariaLabel,
61207
61435
  cardProps,
61208
61436
  className,
61209
61437
  style
61210
- }) => /* @__PURE__ */ jsx306(
61438
+ }) => /* @__PURE__ */ jsx305(
61211
61439
  Panel_default,
61212
61440
  {
61213
61441
  ...cardProps,
61214
61442
  flexBody: true,
61215
- className: classNames116("flex-1", className),
61443
+ className: classNames115("flex-1", className),
61216
61444
  style,
61217
- children: /* @__PURE__ */ jsx306(ScrollArea_default, { className: "h-full", mask: true, role: "region", "aria-label": ariaLabel, children: details })
61445
+ children: /* @__PURE__ */ jsx305(ScrollArea_default, { className: "h-full", mask: true, role: "region", "aria-label": ariaLabel, children: details })
61218
61446
  }
61219
61447
  );
61220
61448
  var WorkflowDetailsCard_default = WorkflowDetailsCard;
61221
61449
 
61222
61450
  // src/components/WorkflowTracker/WorkflowTrackerDetails.tsx
61223
- import { jsx as jsx307 } from "react/jsx-runtime";
61451
+ import { jsx as jsx306 } from "react/jsx-runtime";
61224
61452
  var WorkflowTrackerDetails = ({
61225
61453
  data = sampleWorkflow,
61226
61454
  loading = false,
@@ -61239,21 +61467,110 @@ var WorkflowTrackerDetails = ({
61239
61467
  );
61240
61468
  const details = active?.step.details;
61241
61469
  if (loading || details == null || details === "") return null;
61242
- return /* @__PURE__ */ jsx307(
61470
+ return /* @__PURE__ */ jsx306(
61243
61471
  WorkflowDetailsCard_default,
61244
61472
  {
61245
61473
  details,
61246
61474
  ariaLabel: labels.details,
61247
61475
  cardProps,
61248
- className: classNames117(className, cardClassName),
61476
+ className: classNames116(className, cardClassName),
61249
61477
  style
61250
61478
  }
61251
61479
  );
61252
61480
  };
61253
61481
  var WorkflowTrackerDetails_default = WorkflowTrackerDetails;
61254
61482
 
61255
- // src/components/WorkflowTracker/WorkflowTracker.tsx
61483
+ // src/components/WorkflowTracker/WorkflowTrackerRollups.tsx
61484
+ import { useMemo as useMemo55 } from "react";
61485
+ import classNames118 from "classnames";
61486
+
61487
+ // src/components/WorkflowTracker/WorkflowSummaryCard.tsx
61488
+ import classNames117 from "classnames";
61489
+ import { jsx as jsx307, jsxs as jsxs185 } from "react/jsx-runtime";
61490
+ var WorkflowSummaryCard = ({
61491
+ title,
61492
+ steps,
61493
+ palette,
61494
+ surfaces
61495
+ }) => /* @__PURE__ */ jsxs185("div", { className: "px-5 py-4", children: [
61496
+ /* @__PURE__ */ jsx307(SectionTitle, { surfaces, children: title }),
61497
+ /* @__PURE__ */ jsx307("ul", { className: "mt-3 space-y-3", children: steps.map((step) => /* @__PURE__ */ jsxs185("li", { className: "flex items-start gap-3", children: [
61498
+ /* @__PURE__ */ jsx307(
61499
+ WorkflowStatusNode_default,
61500
+ {
61501
+ status: normalizeStatus(step.status),
61502
+ palette,
61503
+ className: "mt-0.5"
61504
+ }
61505
+ ),
61506
+ /* @__PURE__ */ jsxs185("div", { className: "min-w-0 flex-1", children: [
61507
+ /* @__PURE__ */ jsx307("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: step.label }),
61508
+ step.meta && /* @__PURE__ */ jsx307(
61509
+ "p",
61510
+ {
61511
+ className: classNames117(
61512
+ "mt-0.5 text-xs leading-5",
61513
+ surfaces.mutedText
61514
+ ),
61515
+ children: step.meta
61516
+ }
61517
+ )
61518
+ ] })
61519
+ ] }, step.id)) })
61520
+ ] });
61521
+ var WorkflowSummaryCard_default = WorkflowSummaryCard;
61522
+
61523
+ // src/components/WorkflowTracker/WorkflowTrackerRollups.tsx
61256
61524
  import { jsx as jsx308, jsxs as jsxs186 } from "react/jsx-runtime";
61525
+ var WorkflowTrackerRollups = ({
61526
+ data = sampleWorkflow,
61527
+ loading = false,
61528
+ labels: labelOverrides,
61529
+ className,
61530
+ style,
61531
+ ...styleProps
61532
+ }) => {
61533
+ const steps = data?.steps ?? [];
61534
+ const { palette, surfaces } = useWorkflowChrome(styleProps);
61535
+ const labels = useMemo55(() => resolveLabels(labelOverrides), [labelOverrides]);
61536
+ const cardProps = buildCardProps(styleProps);
61537
+ const attentionSteps = useMemo55(() => getAttentionSteps(steps), [steps]);
61538
+ const skippedSteps = useMemo55(() => getSkippedSteps(steps), [steps]);
61539
+ if (loading || attentionSteps.length === 0 && skippedSteps.length === 0) {
61540
+ return null;
61541
+ }
61542
+ return /* @__PURE__ */ jsxs186(
61543
+ "div",
61544
+ {
61545
+ className: classNames118("grid grid-cols-1 gap-5 @xl:grid-cols-2", className),
61546
+ style,
61547
+ children: [
61548
+ attentionSteps.length > 0 && /* @__PURE__ */ jsx308(Panel_default, { ...cardProps, children: /* @__PURE__ */ jsx308(
61549
+ WorkflowSummaryCard_default,
61550
+ {
61551
+ title: labels.needsAttention,
61552
+ steps: attentionSteps,
61553
+ palette,
61554
+ surfaces
61555
+ }
61556
+ ) }),
61557
+ skippedSteps.length > 0 && /* @__PURE__ */ jsx308(Panel_default, { ...cardProps, children: /* @__PURE__ */ jsx308(
61558
+ WorkflowSummaryCard_default,
61559
+ {
61560
+ title: labels.skippedSteps,
61561
+ steps: skippedSteps,
61562
+ palette,
61563
+ surfaces
61564
+ }
61565
+ ) })
61566
+ ]
61567
+ }
61568
+ );
61569
+ };
61570
+ var WorkflowTrackerRollups_default = WorkflowTrackerRollups;
61571
+
61572
+ // src/components/WorkflowTracker/WorkflowTracker.tsx
61573
+ import { jsx as jsx309, jsxs as jsxs187 } from "react/jsx-runtime";
61257
61574
  var WorkflowTracker = ({
61258
61575
  data = sampleWorkflow,
61259
61576
  accentColor = "blue",
@@ -61287,7 +61604,6 @@ var WorkflowTracker = ({
61287
61604
  style,
61288
61605
  ...rest
61289
61606
  }) => {
61290
- const steps = data?.steps ?? [];
61291
61607
  const styleProps = {
61292
61608
  accentColor,
61293
61609
  attentionColor,
@@ -61302,38 +61618,35 @@ var WorkflowTracker = ({
61302
61618
  padding,
61303
61619
  translucentSurfaces
61304
61620
  };
61305
- const { palette, surfaces } = useWorkflowChrome(styleProps);
61306
- const labels = useMemo55(() => resolveLabels(labelOverrides), [labelOverrides]);
61307
- const cardProps = buildCardProps(styleProps);
61308
- const attentionSteps = useMemo55(() => getAttentionSteps(steps), [steps]);
61309
- const skippedSteps = useMemo55(() => getSkippedSteps(steps), [steps]);
61621
+ const { surfaces } = useWorkflowChrome(styleProps);
61622
+ const labels = useMemo56(() => resolveLabels(labelOverrides), [labelOverrides]);
61310
61623
  const railStyle = {
61311
61624
  "--wt-rail-width": typeof railWidth === "number" ? `${railWidth}px` : railWidth,
61312
61625
  "--wt-fill-offset": typeof fillHeightOffset === "number" ? `${fillHeightOffset}px` : fillHeightOffset
61313
61626
  };
61314
- return /* @__PURE__ */ jsxs186(
61627
+ return /* @__PURE__ */ jsxs187(
61315
61628
  "div",
61316
61629
  {
61317
- className: classNames118("@container w-full", className),
61630
+ className: classNames119("@container w-full", className),
61318
61631
  style: { maxWidth, ...railStyle, ...style },
61319
61632
  "aria-busy": loading || void 0,
61320
61633
  ...rest,
61321
61634
  children: [
61322
- showHeader && loading && /* @__PURE__ */ jsx308(
61635
+ showHeader && loading && /* @__PURE__ */ jsx309(
61323
61636
  WorkflowHeaderSkeleton,
61324
61637
  {
61325
61638
  hasIcon: Boolean(data?.icon),
61326
61639
  iconCorner
61327
61640
  }
61328
61641
  ),
61329
- showHeader && !loading && /* @__PURE__ */ jsxs186("header", { className: "mb-5 flex flex-wrap items-start justify-between gap-3", children: [
61330
- /* @__PURE__ */ jsxs186("div", { className: "flex min-w-0 items-center gap-3", children: [
61642
+ showHeader && !loading && /* @__PURE__ */ jsxs187("header", { className: "mb-5 flex flex-wrap items-start justify-between gap-3", children: [
61643
+ /* @__PURE__ */ jsxs187("div", { className: "flex min-w-0 items-center gap-3", children: [
61331
61644
  data?.icon && // `overflow-hidden` plus the shared corner class clips whatever
61332
61645
  // the caller passes, so an <img> needs no rounding of its own.
61333
- /* @__PURE__ */ jsx308(
61646
+ /* @__PURE__ */ jsx309(
61334
61647
  "span",
61335
61648
  {
61336
- className: classNames118(
61649
+ className: classNames119(
61337
61650
  "flex h-12 w-12 shrink-0 items-center justify-center overflow-hidden [&>img]:h-full [&>img]:w-full [&>img]:object-cover",
61338
61651
  getSurfaceCornerClass(iconCorner),
61339
61652
  surfaces.chip
@@ -61341,33 +61654,33 @@ var WorkflowTracker = ({
61341
61654
  children: data.icon
61342
61655
  }
61343
61656
  ),
61344
- /* @__PURE__ */ jsxs186("div", { className: "min-w-0", children: [
61345
- data?.eyebrow && /* @__PURE__ */ jsx308(
61657
+ /* @__PURE__ */ jsxs187("div", { className: "min-w-0", children: [
61658
+ data?.eyebrow && /* @__PURE__ */ jsx309(
61346
61659
  "p",
61347
61660
  {
61348
- className: classNames118(
61661
+ className: classNames119(
61349
61662
  "text-[11px] font-semibold uppercase tracking-widest",
61350
61663
  surfaces.faintText
61351
61664
  ),
61352
61665
  children: data.eyebrow
61353
61666
  }
61354
61667
  ),
61355
- /* @__PURE__ */ jsx308("h2", { className: "mt-1 text-2xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-3xl", children: data?.title })
61668
+ /* @__PURE__ */ jsx309("h2", { className: "mt-1 text-2xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-3xl", children: data?.title })
61356
61669
  ] })
61357
61670
  ] }),
61358
- data?.live && /* @__PURE__ */ jsxs186(
61671
+ data?.live && /* @__PURE__ */ jsxs187(
61359
61672
  Pill_default,
61360
61673
  {
61361
61674
  size: "md",
61362
61675
  tone: mutedColor,
61363
61676
  variant: "outline",
61364
- className: classNames118("tracking-wide", surfaces.chip),
61677
+ className: classNames119("tracking-wide", surfaces.chip),
61365
61678
  children: [
61366
- /* @__PURE__ */ jsx308(
61679
+ /* @__PURE__ */ jsx309(
61367
61680
  "span",
61368
61681
  {
61369
61682
  "aria-hidden": "true",
61370
- className: classNames118(
61683
+ className: classNames119(
61371
61684
  "mr-2 inline-block h-1.5 w-1.5 rounded-full",
61372
61685
  `bg-${accentColor}-500 dark:bg-${accentColor}-400`
61373
61686
  )
@@ -61378,15 +61691,15 @@ var WorkflowTracker = ({
61378
61691
  }
61379
61692
  )
61380
61693
  ] }),
61381
- /* @__PURE__ */ jsxs186(
61694
+ /* @__PURE__ */ jsxs187(
61382
61695
  "div",
61383
61696
  {
61384
- className: classNames118(
61697
+ className: classNames119(
61385
61698
  "grid grid-cols-1 items-start gap-5 @4xl:grid-cols-[var(--wt-rail-width)_minmax(0,1fr)]",
61386
61699
  fillHeight && "@4xl:h-[calc(100dvh-var(--wt-fill-offset))]"
61387
61700
  ),
61388
61701
  children: [
61389
- /* @__PURE__ */ jsx308(
61702
+ /* @__PURE__ */ jsx309(
61390
61703
  WorkflowTrackerRail_default,
61391
61704
  {
61392
61705
  ...styleProps,
@@ -61397,7 +61710,7 @@ var WorkflowTracker = ({
61397
61710
  emptyState,
61398
61711
  labels: labelOverrides,
61399
61712
  cardScrollable: fillHeight,
61400
- cardClassName: classNames118(
61713
+ cardClassName: classNames119(
61401
61714
  stickyRail && !fillHeight && "@4xl:sticky @4xl:top-6",
61402
61715
  fillHeight && "@4xl:min-h-0 @4xl:self-stretch"
61403
61716
  ),
@@ -61406,15 +61719,15 @@ var WorkflowTracker = ({
61406
61719
  onStepAction
61407
61720
  }
61408
61721
  ),
61409
- /* @__PURE__ */ jsxs186(
61722
+ /* @__PURE__ */ jsxs187(
61410
61723
  "div",
61411
61724
  {
61412
- className: classNames118(
61725
+ className: classNames119(
61413
61726
  "@container flex min-w-0 flex-col gap-5",
61414
61727
  fillHeight && "@4xl:min-h-0 @4xl:self-stretch"
61415
61728
  ),
61416
61729
  children: [
61417
- /* @__PURE__ */ jsx308(
61730
+ /* @__PURE__ */ jsx309(
61418
61731
  WorkflowTrackerStepDetails_default,
61419
61732
  {
61420
61733
  ...styleProps,
@@ -61425,7 +61738,7 @@ var WorkflowTracker = ({
61425
61738
  onStepAction
61426
61739
  }
61427
61740
  ),
61428
- /* @__PURE__ */ jsx308(
61741
+ /* @__PURE__ */ jsx309(
61429
61742
  WorkflowTrackerDetails_default,
61430
61743
  {
61431
61744
  ...styleProps,
@@ -61434,26 +61747,15 @@ var WorkflowTracker = ({
61434
61747
  labels: labelOverrides
61435
61748
  }
61436
61749
  ),
61437
- !loading && (attentionSteps.length > 0 || skippedSteps.length > 0) && /* @__PURE__ */ jsxs186("div", { className: "grid grid-cols-1 gap-5 @xl:grid-cols-2", children: [
61438
- attentionSteps.length > 0 && /* @__PURE__ */ jsx308(Panel_default, { ...cardProps, children: /* @__PURE__ */ jsx308(
61439
- WorkflowSummaryCard_default,
61440
- {
61441
- title: labels.needsAttention,
61442
- steps: attentionSteps,
61443
- palette,
61444
- surfaces
61445
- }
61446
- ) }),
61447
- skippedSteps.length > 0 && /* @__PURE__ */ jsx308(Panel_default, { ...cardProps, children: /* @__PURE__ */ jsx308(
61448
- WorkflowSummaryCard_default,
61449
- {
61450
- title: labels.skippedSteps,
61451
- steps: skippedSteps,
61452
- palette,
61453
- surfaces
61454
- }
61455
- ) })
61456
- ] })
61750
+ /* @__PURE__ */ jsx309(
61751
+ WorkflowTrackerRollups_default,
61752
+ {
61753
+ ...styleProps,
61754
+ data,
61755
+ loading,
61756
+ labels: labelOverrides
61757
+ }
61758
+ )
61457
61759
  ]
61458
61760
  }
61459
61761
  )
@@ -61467,9 +61769,9 @@ var WorkflowTracker = ({
61467
61769
  var WorkflowTracker_default = WorkflowTracker;
61468
61770
 
61469
61771
  // src/components/Gantt/Gantt.tsx
61470
- import { useCallback as useCallback42, useEffect as useEffect71, useMemo as useMemo59, useRef as useRef68, useState as useState79 } from "react";
61772
+ import { useCallback as useCallback42, useEffect as useEffect71, useMemo as useMemo60, useRef as useRef68, useState as useState79 } from "react";
61471
61773
  import { createPortal as createPortal15 } from "react-dom";
61472
- import classNames122 from "classnames";
61774
+ import classNames123 from "classnames";
61473
61775
 
61474
61776
  // ../common/gantt/types.ts
61475
61777
  var GANTT_ZOOM_PRESETS = [
@@ -62815,38 +63117,38 @@ var sampleGantt = {
62815
63117
  };
62816
63118
 
62817
63119
  // src/components/Gantt/GanttScale.tsx
62818
- import classNames119 from "classnames";
62819
- import { jsx as jsx309, jsxs as jsxs187 } from "react/jsx-runtime";
63120
+ import classNames120 from "classnames";
63121
+ import { jsx as jsx310, jsxs as jsxs188 } from "react/jsx-runtime";
62820
63122
  var GanttScale = ({ levels, height }) => {
62821
63123
  if (levels.length === 0) {
62822
- return /* @__PURE__ */ jsx309("div", { style: { height } });
63124
+ return /* @__PURE__ */ jsx310("div", { style: { height } });
62823
63125
  }
62824
63126
  const coarseHeight = levels.length > 1 ? 24 : height;
62825
- return /* @__PURE__ */ jsx309("div", { className: "flex h-full w-full flex-col", children: levels.map((level, li) => /* @__PURE__ */ jsx309(
63127
+ return /* @__PURE__ */ jsx310("div", { className: "flex h-full w-full flex-col", children: levels.map((level, li) => /* @__PURE__ */ jsx310(
62826
63128
  "div",
62827
63129
  {
62828
- className: classNames119("flex w-full", li === 0 ? "shrink-0" : "min-h-0 flex-1"),
63130
+ className: classNames120("flex w-full", li === 0 ? "shrink-0" : "min-h-0 flex-1"),
62829
63131
  style: li === 0 ? { height: coarseHeight } : void 0,
62830
- children: level.columns.map((col) => /* @__PURE__ */ jsxs187(
63132
+ children: level.columns.map((col) => /* @__PURE__ */ jsxs188(
62831
63133
  "div",
62832
63134
  {
62833
- className: classNames119(
63135
+ className: classNames120(
62834
63136
  "flex shrink-0 flex-col items-center justify-center overflow-hidden border-r border-neutral-200/70 dark:border-neutral-800/70",
62835
63137
  li === 0 ? "bg-neutral-50/60 dark:bg-neutral-800/40" : "bg-white dark:bg-neutral-900"
62836
63138
  ),
62837
63139
  style: { width: col.width },
62838
63140
  children: [
62839
- /* @__PURE__ */ jsx309(
63141
+ /* @__PURE__ */ jsx310(
62840
63142
  "span",
62841
63143
  {
62842
- className: classNames119(
63144
+ className: classNames120(
62843
63145
  "max-w-full truncate px-1 text-[10px] font-semibold uppercase leading-none tracking-wide",
62844
63146
  li === 0 ? "text-neutral-700 dark:text-neutral-200" : "text-neutral-500 dark:text-neutral-400"
62845
63147
  ),
62846
63148
  children: col.label
62847
63149
  }
62848
63150
  ),
62849
- col.subLabel != null && /* @__PURE__ */ jsx309("span", { className: "max-w-full truncate px-1 text-[9px] font-medium leading-none text-neutral-400 dark:text-neutral-500", children: col.subLabel })
63151
+ col.subLabel != null && /* @__PURE__ */ jsx310("span", { className: "max-w-full truncate px-1 text-[9px] font-medium leading-none text-neutral-400 dark:text-neutral-500", children: col.subLabel })
62850
63152
  ]
62851
63153
  },
62852
63154
  col.id
@@ -62859,7 +63161,7 @@ GanttScale.displayName = "GanttScale";
62859
63161
 
62860
63162
  // src/components/Gantt/GanttLinkLayer.tsx
62861
63163
  import { forwardRef as forwardRef160, useRef as useRef66 } from "react";
62862
- import { jsx as jsx310, jsxs as jsxs188 } from "react/jsx-runtime";
63164
+ import { jsx as jsx311, jsxs as jsxs189 } from "react/jsx-runtime";
62863
63165
  var GanttLinkLayer = forwardRef160(
62864
63166
  function GanttLinkLayer2({
62865
63167
  width,
@@ -62895,24 +63197,24 @@ var GanttLinkLayer = forwardRef160(
62895
63197
  const pick = pickFromEvent(e) ?? clicked;
62896
63198
  if (interactive && onDeleteLink) onDeleteLink(pick.link);
62897
63199
  };
62898
- return /* @__PURE__ */ jsxs188(
63200
+ return /* @__PURE__ */ jsxs189(
62899
63201
  "div",
62900
63202
  {
62901
63203
  ref,
62902
63204
  className: "pointer-events-none absolute top-0 z-10",
62903
63205
  style: { left: offsetLeft, width, height },
62904
63206
  children: [
62905
- /* @__PURE__ */ jsxs188("svg", { ref: svgRef, width, height, className: "block overflow-visible", children: [
63207
+ /* @__PURE__ */ jsxs189("svg", { ref: svgRef, width, height, className: "block overflow-visible", children: [
62906
63208
  paths.map((p, i) => {
62907
63209
  const tokens = getGanttLinkTokens(p.color ?? color);
62908
63210
  const sel = selected != null && p.link === selected;
62909
63211
  const nodeR = sel ? 4.5 : 3.5;
62910
- return /* @__PURE__ */ jsxs188(
63212
+ return /* @__PURE__ */ jsxs189(
62911
63213
  "g",
62912
63214
  {
62913
63215
  style: sel ? { filter: `drop-shadow(0 0 3px var(--color-${p.color ?? color}-500))` } : void 0,
62914
63216
  children: [
62915
- /* @__PURE__ */ jsx310(
63217
+ /* @__PURE__ */ jsx311(
62916
63218
  "path",
62917
63219
  {
62918
63220
  d: p.d,
@@ -62928,10 +63230,10 @@ var GanttLinkLayer = forwardRef160(
62928
63230
  },
62929
63231
  onClick: (e) => handlePick(e, p),
62930
63232
  onDoubleClick: (e) => handleDelete(e, p),
62931
- children: /* @__PURE__ */ jsx310("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
63233
+ children: /* @__PURE__ */ jsx311("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
62932
63234
  }
62933
63235
  ),
62934
- /* @__PURE__ */ jsx310(
63236
+ /* @__PURE__ */ jsx311(
62935
63237
  "path",
62936
63238
  {
62937
63239
  d: p.d,
@@ -62947,14 +63249,14 @@ var GanttLinkLayer = forwardRef160(
62947
63249
  },
62948
63250
  onClick: (e) => handlePick(e, p),
62949
63251
  onDoubleClick: (e) => handleDelete(e, p),
62950
- children: /* @__PURE__ */ jsx310("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
63252
+ children: /* @__PURE__ */ jsx311("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
62951
63253
  }
62952
63254
  ),
62953
- p.arrow && /* @__PURE__ */ jsx310("polygon", { points: p.arrow, className: tokens.fill }),
62954
- /* @__PURE__ */ jsx310("circle", { cx: p.from.x, cy: p.from.y, r: nodeR + 2.5, className: tokens.halo }),
62955
- /* @__PURE__ */ jsx310("circle", { cx: p.from.x, cy: p.from.y, r: nodeR, className: tokens.fill }),
62956
- /* @__PURE__ */ jsx310("circle", { cx: p.to.x, cy: p.to.y, r: nodeR + 2.5, className: tokens.halo }),
62957
- /* @__PURE__ */ jsx310("circle", { cx: p.to.x, cy: p.to.y, r: nodeR, className: tokens.fill })
63255
+ p.arrow && /* @__PURE__ */ jsx311("polygon", { points: p.arrow, className: tokens.fill }),
63256
+ /* @__PURE__ */ jsx311("circle", { cx: p.from.x, cy: p.from.y, r: nodeR + 2.5, className: tokens.halo }),
63257
+ /* @__PURE__ */ jsx311("circle", { cx: p.from.x, cy: p.from.y, r: nodeR, className: tokens.fill }),
63258
+ /* @__PURE__ */ jsx311("circle", { cx: p.to.x, cy: p.to.y, r: nodeR + 2.5, className: tokens.halo }),
63259
+ /* @__PURE__ */ jsx311("circle", { cx: p.to.x, cy: p.to.y, r: nodeR, className: tokens.fill })
62958
63260
  ]
62959
63261
  },
62960
63262
  `${p.link.source}->${p.link.target}-${p.type}-${i}`
@@ -62962,8 +63264,8 @@ var GanttLinkLayer = forwardRef160(
62962
63264
  }),
62963
63265
  rubber && (() => {
62964
63266
  const tokens = getGanttLinkTokens(rubber.color);
62965
- return /* @__PURE__ */ jsxs188("g", { children: [
62966
- /* @__PURE__ */ jsx310(
63267
+ return /* @__PURE__ */ jsxs189("g", { children: [
63268
+ /* @__PURE__ */ jsx311(
62967
63269
  "path",
62968
63270
  {
62969
63271
  d: rubber.d,
@@ -62974,15 +63276,15 @@ var GanttLinkLayer = forwardRef160(
62974
63276
  strokeDasharray: "5 3"
62975
63277
  }
62976
63278
  ),
62977
- rubber.arrow && /* @__PURE__ */ jsx310("polygon", { points: rubber.arrow, className: tokens.fill }),
62978
- /* @__PURE__ */ jsx310("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 6, className: tokens.halo }),
62979
- /* @__PURE__ */ jsx310("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 3.5, className: tokens.fill }),
62980
- /* @__PURE__ */ jsx310("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 6, className: tokens.halo }),
62981
- /* @__PURE__ */ jsx310("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 3.5, className: tokens.fill })
63279
+ rubber.arrow && /* @__PURE__ */ jsx311("polygon", { points: rubber.arrow, className: tokens.fill }),
63280
+ /* @__PURE__ */ jsx311("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 6, className: tokens.halo }),
63281
+ /* @__PURE__ */ jsx311("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 3.5, className: tokens.fill }),
63282
+ /* @__PURE__ */ jsx311("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 6, className: tokens.halo }),
63283
+ /* @__PURE__ */ jsx311("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 3.5, className: tokens.fill })
62982
63284
  ] });
62983
63285
  })()
62984
63286
  ] }),
62985
- canDelete && selMid && /* @__PURE__ */ jsxs188(
63287
+ canDelete && selMid && /* @__PURE__ */ jsxs189(
62986
63288
  "button",
62987
63289
  {
62988
63290
  type: "button",
@@ -63000,7 +63302,7 @@ var GanttLinkLayer = forwardRef160(
63000
63302
  onClick: () => onDeleteLink(selected),
63001
63303
  title: t("kit.gantt.removeDependency"),
63002
63304
  children: [
63003
- /* @__PURE__ */ jsx310("span", { "aria-hidden": true, children: "\u2715" }),
63305
+ /* @__PURE__ */ jsx311("span", { "aria-hidden": true, children: "\u2715" }),
63004
63306
  " ",
63005
63307
  t("kit.gantt.delete")
63006
63308
  ]
@@ -63014,9 +63316,9 @@ var GanttLinkLayer = forwardRef160(
63014
63316
  GanttLinkLayer.displayName = "GanttLinkLayer";
63015
63317
 
63016
63318
  // src/components/Gantt/GanttBodyRow.tsx
63017
- import { useMemo as useMemo56 } from "react";
63018
- import classNames120 from "classnames";
63019
- import { Fragment as Fragment48, jsx as jsx311, jsxs as jsxs189 } from "react/jsx-runtime";
63319
+ import { useMemo as useMemo57 } from "react";
63320
+ import classNames121 from "classnames";
63321
+ import { Fragment as Fragment48, jsx as jsx312, jsxs as jsxs190 } from "react/jsx-runtime";
63020
63322
  var BAR_HEIGHT = 24;
63021
63323
  var MILESTONE_SIZE = 14;
63022
63324
  var GanttBodyRow = ({
@@ -63055,11 +63357,11 @@ var GanttBodyRow = ({
63055
63357
  const t = useKitT();
63056
63358
  const isDraggingThis = row.task != null && drag?.taskId === row.task.id;
63057
63359
  const reorderDragging = isDraggingThis && drag?.kind === "reorder";
63058
- return /* @__PURE__ */ jsx311(
63360
+ return /* @__PURE__ */ jsx312(
63059
63361
  "div",
63060
63362
  {
63061
63363
  "data-row-key": row.key,
63062
- className: classNames120(
63364
+ className: classNames121(
63063
63365
  // No overflow here: an overflow-hidden row root would become the
63064
63366
  // sticky halves' (non-scrolling) scrollport and stop them pinning to
63065
63367
  // the left edge while the timeline scrolls. The halves pin the
@@ -63076,7 +63378,7 @@ var GanttBodyRow = ({
63076
63378
  boxShadow: `inset 2px 0 0 var(--color-${color}-500)`
63077
63379
  } : {}
63078
63380
  },
63079
- children: row.task == null ? /* @__PURE__ */ jsx311(
63381
+ children: row.task == null ? /* @__PURE__ */ jsx312(
63080
63382
  LaneHeader,
63081
63383
  {
63082
63384
  row,
@@ -63087,20 +63389,20 @@ var GanttBodyRow = ({
63087
63389
  dividerClass,
63088
63390
  liveProgress: liveLane
63089
63391
  }
63090
- ) : /* @__PURE__ */ jsxs189(Fragment48, { children: [
63091
- /* @__PURE__ */ jsxs189(
63392
+ ) : /* @__PURE__ */ jsxs190(Fragment48, { children: [
63393
+ /* @__PURE__ */ jsxs190(
63092
63394
  "div",
63093
63395
  {
63094
- className: classNames120(
63396
+ className: classNames121(
63095
63397
  "sticky left-0 z-20 flex items-stretch overflow-hidden border-r border-b bg-white dark:bg-neutral-900",
63096
63398
  dividerClass
63097
63399
  ),
63098
63400
  style: { width: leftWidth },
63099
63401
  children: [
63100
- /* @__PURE__ */ jsx311("div", { className: "flex w-9 shrink-0 items-center justify-center", children: interactive && !row.task.locked && /* @__PURE__ */ jsx311(
63402
+ /* @__PURE__ */ jsx312("div", { className: "flex w-9 shrink-0 items-center justify-center", children: interactive && !row.task.locked && /* @__PURE__ */ jsx312(
63101
63403
  "span",
63102
63404
  {
63103
- className: classNames120(
63405
+ className: classNames121(
63104
63406
  "flex cursor-grab touch-none items-center text-neutral-300 transition-opacity active:cursor-grabbing dark:text-neutral-600",
63105
63407
  reorderDragging ? "opacity-100" : "opacity-0 group-hover/row:opacity-100"
63106
63408
  ),
@@ -63108,10 +63410,10 @@ var GanttBodyRow = ({
63108
63410
  onPointerDown: (e) => onGripPointerDown(row.key, row.task, e),
63109
63411
  title: t("kit.gantt.dragReorder"),
63110
63412
  "aria-hidden": "true",
63111
- children: /* @__PURE__ */ jsx311(Drag, { className: "h-3.5 w-3.5" })
63413
+ children: /* @__PURE__ */ jsx312(Drag, { className: "h-3.5 w-3.5" })
63112
63414
  }
63113
63415
  ) }),
63114
- columns.map((col, i) => /* @__PURE__ */ jsx311(
63416
+ columns.map((col, i) => /* @__PURE__ */ jsx312(
63115
63417
  Cell,
63116
63418
  {
63117
63419
  col,
@@ -63132,12 +63434,12 @@ var GanttBodyRow = ({
63132
63434
  ]
63133
63435
  }
63134
63436
  ),
63135
- /* @__PURE__ */ jsx311(
63437
+ /* @__PURE__ */ jsx312(
63136
63438
  "div",
63137
63439
  {
63138
- className: classNames120("relative shrink-0 border-b", dividerClass),
63440
+ className: classNames121("relative shrink-0 border-b", dividerClass),
63139
63441
  style: { width: timelineWidth },
63140
- children: /* @__PURE__ */ jsx311(
63442
+ children: /* @__PURE__ */ jsx312(
63141
63443
  TaskBar,
63142
63444
  {
63143
63445
  task: row.task,
@@ -63178,57 +63480,57 @@ var LaneHeader = ({ row, columns, leftWidth, color, onCaretClick, dividerClass =
63178
63480
  const laneColor = lane.color ?? color;
63179
63481
  const tokens = getGanttLaneTokens(laneColor);
63180
63482
  const isOpen = lane.open !== false;
63181
- return /* @__PURE__ */ jsxs189(Fragment48, { children: [
63182
- /* @__PURE__ */ jsxs189(
63483
+ return /* @__PURE__ */ jsxs190(Fragment48, { children: [
63484
+ /* @__PURE__ */ jsxs190(
63183
63485
  "div",
63184
63486
  {
63185
- className: classNames120(
63487
+ className: classNames121(
63186
63488
  "sticky left-0 z-20 flex items-stretch overflow-hidden border-r border-b bg-white dark:bg-neutral-900",
63187
63489
  dividerClass
63188
63490
  ),
63189
63491
  style: { width: leftWidth },
63190
63492
  children: [
63191
- /* @__PURE__ */ jsx311("div", { className: classNames120("pointer-events-none absolute inset-0", tokens.band) }),
63192
- /* @__PURE__ */ jsx311("div", { className: "relative flex w-9 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx311(
63493
+ /* @__PURE__ */ jsx312("div", { className: classNames121("pointer-events-none absolute inset-0", tokens.band) }),
63494
+ /* @__PURE__ */ jsx312("div", { className: "relative flex w-9 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx312(
63193
63495
  "button",
63194
63496
  {
63195
63497
  type: "button",
63196
63498
  className: "flex h-5 w-5 shrink-0 items-center justify-center rounded text-neutral-500 hover:bg-white/60 focus-visible:ring-2 focus-visible:ring-neutral-400 dark:text-neutral-400 dark:hover:bg-white/10",
63197
63499
  onClick: () => onCaretClick(lane.id, isOpen),
63198
63500
  "aria-label": t(isOpen ? "kit.gantt.collapse" : "kit.gantt.expand", { name: lane.label }),
63199
- children: /* @__PURE__ */ jsx311(ChevronRight, { className: classNames120("h-3 w-3 transition-transform", isOpen && "rotate-90") })
63501
+ children: /* @__PURE__ */ jsx312(ChevronRight, { className: classNames121("h-3 w-3 transition-transform", isOpen && "rotate-90") })
63200
63502
  }
63201
63503
  ) }),
63202
- columns.map((col, i) => /* @__PURE__ */ jsx311(
63504
+ columns.map((col, i) => /* @__PURE__ */ jsx312(
63203
63505
  "div",
63204
63506
  {
63205
- className: classNames120(
63507
+ className: classNames121(
63206
63508
  "relative flex shrink-0 items-center gap-2 overflow-hidden border-r px-2 last:border-r-0",
63207
63509
  dividerClass
63208
63510
  ),
63209
63511
  style: { width: col.width ?? "160px" },
63210
- children: i === 0 ? /* @__PURE__ */ jsxs189(Fragment48, { children: [
63211
- /* @__PURE__ */ jsx311("span", { className: classNames120("truncate text-[13px] font-semibold", tokens.label), children: lane.label }),
63212
- lane.description && /* @__PURE__ */ jsx311("span", { className: "hidden truncate text-[11px] text-neutral-500 dark:text-neutral-400 lg:inline", children: lane.description }),
63213
- row.childCount > 0 && /* @__PURE__ */ jsx311("span", { className: "shrink-0 rounded-full bg-white/70 px-1.5 py-0.5 text-[10px] font-semibold text-neutral-600 dark:bg-white/10 dark:text-neutral-300", children: row.childCount })
63214
- ] }) : col.key === "progress" ? /* @__PURE__ */ jsx311(ProgressCell, { value: liveProgress ?? row.progress ?? 0, barClass: tokens.chip }) : null
63512
+ children: i === 0 ? /* @__PURE__ */ jsxs190(Fragment48, { children: [
63513
+ /* @__PURE__ */ jsx312("span", { className: classNames121("truncate text-[13px] font-semibold", tokens.label), children: lane.label }),
63514
+ lane.description && /* @__PURE__ */ jsx312("span", { className: "hidden truncate text-[11px] text-neutral-500 dark:text-neutral-400 lg:inline", children: lane.description }),
63515
+ row.childCount > 0 && /* @__PURE__ */ jsx312("span", { className: "shrink-0 rounded-full bg-white/70 px-1.5 py-0.5 text-[10px] font-semibold text-neutral-600 dark:bg-white/10 dark:text-neutral-300", children: row.childCount })
63516
+ ] }) : col.key === "progress" ? /* @__PURE__ */ jsx312(ProgressCell, { value: liveProgress ?? row.progress ?? 0, barClass: tokens.chip }) : null
63215
63517
  },
63216
63518
  col.key
63217
63519
  ))
63218
63520
  ]
63219
63521
  }
63220
63522
  ),
63221
- /* @__PURE__ */ jsx311("div", { className: classNames120("relative min-w-0 flex-1 border-b", dividerClass), children: /* @__PURE__ */ jsx311("div", { className: classNames120("absolute inset-0", tokens.band) }) })
63523
+ /* @__PURE__ */ jsx312("div", { className: classNames121("relative min-w-0 flex-1 border-b", dividerClass), children: /* @__PURE__ */ jsx312("div", { className: classNames121("absolute inset-0", tokens.band) }) })
63222
63524
  ] });
63223
63525
  };
63224
63526
  var Cell = ({ col, task, depth, isGroup, childCount, first, onCaretClick, renderCell, liveProgress, liveRollup, rowProgress, dividerClass = "border-neutral-100 dark:border-neutral-800" }) => {
63225
63527
  const t = useKitT();
63226
63528
  const value = col.key === "name" ? task.name : col.key === "owner" ? task.owner : col.key === "progress" ? isGroup ? liveRollup ?? rowProgress ?? 0 : liveProgress ?? task.progress ?? 0 : task.values?.[col.key] ?? null;
63227
63529
  const custom = col.key !== "name" && renderCell ? renderCell(value, task, col) : null;
63228
- return /* @__PURE__ */ jsx311(
63530
+ return /* @__PURE__ */ jsx312(
63229
63531
  "div",
63230
63532
  {
63231
- className: classNames120(
63533
+ className: classNames121(
63232
63534
  "flex shrink-0 items-center gap-1.5 overflow-hidden border-r px-2 text-[12.5px] last:border-r-0",
63233
63535
  dividerClass
63234
63536
  ),
@@ -63236,50 +63538,50 @@ var Cell = ({ col, task, depth, isGroup, childCount, first, onCaretClick, render
63236
63538
  width: col.width ?? "160px",
63237
63539
  justifyContent: col.align === "center" ? "center" : col.align === "right" ? "flex-end" : "flex-start"
63238
63540
  },
63239
- children: first ? /* @__PURE__ */ jsxs189(Fragment48, { children: [
63240
- /* @__PURE__ */ jsx311("span", { className: "shrink-0", style: { width: depth * 14 + 18 }, children: isGroup && /* @__PURE__ */ jsx311(
63541
+ children: first ? /* @__PURE__ */ jsxs190(Fragment48, { children: [
63542
+ /* @__PURE__ */ jsx312("span", { className: "shrink-0", style: { width: depth * 14 + 18 }, children: isGroup && /* @__PURE__ */ jsx312(
63241
63543
  "button",
63242
63544
  {
63243
63545
  type: "button",
63244
63546
  className: "flex h-4 w-4 items-center justify-center rounded text-neutral-400 hover:bg-neutral-100 hover:text-neutral-600 focus-visible:ring-2 focus-visible:ring-neutral-400 dark:hover:bg-white/10 dark:hover:text-neutral-300",
63245
63547
  onClick: () => onCaretClick(task.id, task.open !== false),
63246
63548
  "aria-label": t(task.open === false ? "kit.gantt.expand" : "kit.gantt.collapse", { name: task.name }),
63247
- children: /* @__PURE__ */ jsx311(ChevronRight, { className: classNames120("h-3 w-3 transition-transform", task.open !== false && "rotate-90") })
63549
+ children: /* @__PURE__ */ jsx312(ChevronRight, { className: classNames121("h-3 w-3 transition-transform", task.open !== false && "rotate-90") })
63248
63550
  }
63249
63551
  ) }),
63250
- isGroup && childCount > 0 ? /* @__PURE__ */ jsxs189("span", { className: "flex min-w-0 items-center gap-1 font-semibold text-neutral-800 dark:text-neutral-100", children: [
63251
- /* @__PURE__ */ jsx311("span", { className: "truncate", children: task.name }),
63252
- /* @__PURE__ */ jsx311("span", { className: "shrink-0 rounded-full bg-neutral-100 px-1 text-[10px] font-semibold text-neutral-500 dark:bg-white/10 dark:text-neutral-400", children: childCount })
63253
- ] }) : /* @__PURE__ */ jsx311("span", { className: "truncate font-medium text-neutral-700 dark:text-neutral-300", children: task.name })
63254
- ] }) : col.kind === "owner" ? value != null ? /* @__PURE__ */ jsxs189("span", { className: "flex min-w-0 items-center gap-1.5 text-neutral-600 dark:text-neutral-400", children: [
63255
- /* @__PURE__ */ jsx311(
63552
+ isGroup && childCount > 0 ? /* @__PURE__ */ jsxs190("span", { className: "flex min-w-0 items-center gap-1 font-semibold text-neutral-800 dark:text-neutral-100", children: [
63553
+ /* @__PURE__ */ jsx312("span", { className: "truncate", children: task.name }),
63554
+ /* @__PURE__ */ jsx312("span", { className: "shrink-0 rounded-full bg-neutral-100 px-1 text-[10px] font-semibold text-neutral-500 dark:bg-white/10 dark:text-neutral-400", children: childCount })
63555
+ ] }) : /* @__PURE__ */ jsx312("span", { className: "truncate font-medium text-neutral-700 dark:text-neutral-300", children: task.name })
63556
+ ] }) : col.kind === "owner" ? value != null ? /* @__PURE__ */ jsxs190("span", { className: "flex min-w-0 items-center gap-1.5 text-neutral-600 dark:text-neutral-400", children: [
63557
+ /* @__PURE__ */ jsx312(
63256
63558
  "span",
63257
63559
  {
63258
- className: classNames120(
63560
+ className: classNames121(
63259
63561
  "flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-[8px] font-bold uppercase text-white",
63260
63562
  getGanttBarTokens(task.color ?? "blue").fill
63261
63563
  ),
63262
63564
  children: String(value).slice(0, 1)
63263
63565
  }
63264
63566
  ),
63265
- /* @__PURE__ */ jsx311("span", { className: "truncate", children: String(value) })
63266
- ] }) : /* @__PURE__ */ jsx311("span", { className: "text-neutral-400 dark:text-neutral-600", children: "\u2014" }) : col.kind === "progress" ? /* @__PURE__ */ jsx311(ProgressCell, { value: typeof value === "number" ? value : 0 }) : col.kind === "badge" ? task.badge != null ? /* @__PURE__ */ jsx311(
63567
+ /* @__PURE__ */ jsx312("span", { className: "truncate", children: String(value) })
63568
+ ] }) : /* @__PURE__ */ jsx312("span", { className: "text-neutral-400 dark:text-neutral-600", children: "\u2014" }) : col.kind === "progress" ? /* @__PURE__ */ jsx312(ProgressCell, { value: typeof value === "number" ? value : 0 }) : col.kind === "badge" ? task.badge != null ? /* @__PURE__ */ jsx312(
63267
63569
  "span",
63268
63570
  {
63269
- className: classNames120(
63571
+ className: classNames121(
63270
63572
  "rounded-full px-1.5 py-0.5 text-[10px] font-semibold",
63271
63573
  getGanttBarTokens(task.badgeColor ?? "neutral").fill,
63272
63574
  "text-white"
63273
63575
  ),
63274
63576
  children: task.badge
63275
63577
  }
63276
- ) : /* @__PURE__ */ jsx311("span", { className: "text-neutral-400 dark:text-neutral-600", children: "\u2014" }) : custom != null ? custom : /* @__PURE__ */ jsx311("span", { className: "truncate text-neutral-600 dark:text-neutral-400", children: value == null || value === "" ? "\u2014" : String(value) })
63578
+ ) : /* @__PURE__ */ jsx312("span", { className: "text-neutral-400 dark:text-neutral-600", children: "\u2014" }) : custom != null ? custom : /* @__PURE__ */ jsx312("span", { className: "truncate text-neutral-600 dark:text-neutral-400", children: value == null || value === "" ? "\u2014" : String(value) })
63277
63579
  }
63278
63580
  );
63279
63581
  };
63280
- var ProgressCell = ({ value, barClass = "bg-emerald-500" }) => /* @__PURE__ */ jsxs189("span", { className: "flex w-full items-center gap-1.5", children: [
63281
- /* @__PURE__ */ jsx311("span", { className: "h-1.5 min-w-0 flex-1 overflow-hidden rounded-full bg-neutral-200/80 dark:bg-white/10", children: /* @__PURE__ */ jsx311("span", { className: classNames120("block h-full rounded-full", barClass), style: { width: `${Math.round(value * 100)}%` } }) }),
63282
- /* @__PURE__ */ jsxs189("span", { className: "w-7 shrink-0 text-right text-[10px] font-semibold tabular-nums text-neutral-500 dark:text-neutral-400", children: [
63582
+ var ProgressCell = ({ value, barClass = "bg-emerald-500" }) => /* @__PURE__ */ jsxs190("span", { className: "flex w-full items-center gap-1.5", children: [
63583
+ /* @__PURE__ */ jsx312("span", { className: "h-1.5 min-w-0 flex-1 overflow-hidden rounded-full bg-neutral-200/80 dark:bg-white/10", children: /* @__PURE__ */ jsx312("span", { className: classNames121("block h-full rounded-full", barClass), style: { width: `${Math.round(value * 100)}%` } }) }),
63584
+ /* @__PURE__ */ jsxs190("span", { className: "w-7 shrink-0 text-right text-[10px] font-semibold tabular-nums text-neutral-500 dark:text-neutral-400", children: [
63283
63585
  Math.round(value * 100),
63284
63586
  "%"
63285
63587
  ] })
@@ -63311,7 +63613,7 @@ var TaskBar = ({
63311
63613
  const t = useKitT();
63312
63614
  const milestone = task.type === "milestone";
63313
63615
  const barColor = task.color ?? color;
63314
- const tokens = useMemo56(() => getGanttBarTokens(barColor), [barColor]);
63616
+ const tokens = useMemo57(() => getGanttBarTokens(barColor), [barColor]);
63315
63617
  const startMs = liveDates ? liveDates.start : toMs(task.start);
63316
63618
  const endMs = liveDates ? liveDates.end : toMs(task.end);
63317
63619
  const left = dateToX(startMs, rangeStart, zoom);
@@ -63336,7 +63638,7 @@ var TaskBar = ({
63336
63638
  pct: progressPct
63337
63639
  });
63338
63640
  if (milestone) {
63339
- return /* @__PURE__ */ jsxs189(
63641
+ return /* @__PURE__ */ jsxs190(
63340
63642
  "div",
63341
63643
  {
63342
63644
  role: "button",
@@ -63344,7 +63646,7 @@ var TaskBar = ({
63344
63646
  "aria-label": ariaLabel,
63345
63647
  title: ariaLabel,
63346
63648
  "data-gantt-bar": task.id,
63347
- className: classNames120(
63649
+ className: classNames121(
63348
63650
  "absolute z-10 flex cursor-pointer items-center gap-1.5 outline-none",
63349
63651
  selected && selectionTokens.ring,
63350
63652
  "rounded"
@@ -63354,13 +63656,13 @@ var TaskBar = ({
63354
63656
  onClick: () => onSelect(task.id),
63355
63657
  onKeyDown: (e) => onBarKeyDown(e, task),
63356
63658
  children: [
63357
- /* @__PURE__ */ jsx311("span", { className: classNames120("h-3.5 w-3.5 shrink-0 rotate-45 rounded-[2px] shadow-sm", tokens.milestone) }),
63358
- /* @__PURE__ */ jsx311("span", { className: "truncate text-[11px] font-semibold text-neutral-700 dark:text-neutral-300", children: task.name })
63659
+ /* @__PURE__ */ jsx312("span", { className: classNames121("h-3.5 w-3.5 shrink-0 rotate-45 rounded-[2px] shadow-sm", tokens.milestone) }),
63660
+ /* @__PURE__ */ jsx312("span", { className: "truncate text-[11px] font-semibold text-neutral-700 dark:text-neutral-300", children: task.name })
63359
63661
  ]
63360
63662
  }
63361
63663
  );
63362
63664
  }
63363
- return /* @__PURE__ */ jsxs189(
63665
+ return /* @__PURE__ */ jsxs190(
63364
63666
  "div",
63365
63667
  {
63366
63668
  role: "button",
@@ -63368,7 +63670,7 @@ var TaskBar = ({
63368
63670
  "aria-label": ariaLabel,
63369
63671
  title: `${task.name} \xB7 ${formatDateTime(startMs, locale)} \u2192 ${formatDateTime(endMs, locale)} \xB7 ${progressPct}%`,
63370
63672
  "data-gantt-bar": task.id,
63371
- className: classNames120(
63673
+ className: classNames121(
63372
63674
  "group/bar absolute z-10 cursor-grab touch-none rounded-md shadow-sm outline-none transition-shadow active:cursor-grabbing",
63373
63675
  tokens.base,
63374
63676
  tokens.rim,
@@ -63385,17 +63687,17 @@ var TaskBar = ({
63385
63687
  onClick: () => onSelect(task.id),
63386
63688
  onKeyDown: (e) => onBarKeyDown(e, task),
63387
63689
  children: [
63388
- progress > 0 && /* @__PURE__ */ jsx311(
63690
+ progress > 0 && /* @__PURE__ */ jsx312(
63389
63691
  "div",
63390
63692
  {
63391
- className: classNames120("absolute inset-y-0 left-0 rounded-l-md", tokens.progress),
63693
+ className: classNames121("absolute inset-y-0 left-0 rounded-l-md", tokens.progress),
63392
63694
  style: { width: `${progress * 100}%` }
63393
63695
  }
63394
63696
  ),
63395
- canEdit && !row.isGroup && progress > 0 && progress < 1 && /* @__PURE__ */ jsx311(
63697
+ canEdit && !row.isGroup && progress > 0 && progress < 1 && /* @__PURE__ */ jsx312(
63396
63698
  "div",
63397
63699
  {
63398
- className: classNames120(
63700
+ className: classNames121(
63399
63701
  "absolute inset-y-0 z-20 w-2 cursor-ew-resize touch-none opacity-0 transition-opacity group-hover/bar:opacity-100",
63400
63702
  liveProgress != null && "opacity-100"
63401
63703
  ),
@@ -63403,10 +63705,10 @@ var TaskBar = ({
63403
63705
  onPointerDown: (e) => onProgressPointerDown(task, e),
63404
63706
  title: labels.progress,
63405
63707
  "aria-hidden": "true",
63406
- children: /* @__PURE__ */ jsx311("div", { className: "mx-auto h-full w-0.5 rounded-full bg-white/90" })
63708
+ children: /* @__PURE__ */ jsx312("div", { className: "mx-auto h-full w-0.5 rounded-full bg-white/90" })
63407
63709
  }
63408
63710
  ),
63409
- liveProgress != null && /* @__PURE__ */ jsxs189(
63711
+ liveProgress != null && /* @__PURE__ */ jsxs190(
63410
63712
  "div",
63411
63713
  {
63412
63714
  className: "pointer-events-none absolute -top-5 z-30 -translate-x-1/2 rounded-full bg-neutral-900/90 px-1.5 py-px text-[10px] font-semibold tabular-nums text-white shadow-md",
@@ -63417,31 +63719,31 @@ var TaskBar = ({
63417
63719
  ]
63418
63720
  }
63419
63721
  ),
63420
- showName && (renderBar != null ? /* @__PURE__ */ jsx311("div", { className: classNames120("pointer-events-none absolute inset-0 flex items-center px-1.5 text-[11px] font-medium", labelText), children: renderBar(task, { taskId: task.id, left, width, top, height: row.height, milestone: false }) }) : /* @__PURE__ */ jsx311("span", { className: classNames120("pointer-events-none absolute inset-0 flex items-center truncate px-1.5 text-[11px] font-medium", labelText), children: task.name })),
63421
- canEdit && /* @__PURE__ */ jsxs189(Fragment48, { children: [
63422
- /* @__PURE__ */ jsx311(
63722
+ showName && (renderBar != null ? /* @__PURE__ */ jsx312("div", { className: classNames121("pointer-events-none absolute inset-0 flex items-center px-1.5 text-[11px] font-medium", labelText), children: renderBar(task, { taskId: task.id, left, width, top, height: row.height, milestone: false }) }) : /* @__PURE__ */ jsx312("span", { className: classNames121("pointer-events-none absolute inset-0 flex items-center truncate px-1.5 text-[11px] font-medium", labelText), children: task.name })),
63723
+ canEdit && /* @__PURE__ */ jsxs190(Fragment48, { children: [
63724
+ /* @__PURE__ */ jsx312(
63423
63725
  "div",
63424
63726
  {
63425
63727
  className: "absolute inset-y-0 -left-1 z-20 w-2 cursor-ew-resize touch-none",
63426
63728
  onPointerDown: (e) => onResizePointerDown(task, "start", e),
63427
63729
  title: t("kit.gantt.resizeStart"),
63428
63730
  "aria-hidden": "true",
63429
- children: /* @__PURE__ */ jsx311("div", { className: "mx-auto h-full w-1 rounded-full bg-white/0 opacity-0 transition-opacity group-hover/bar:opacity-100" })
63731
+ children: /* @__PURE__ */ jsx312("div", { className: "mx-auto h-full w-1 rounded-full bg-white/0 opacity-0 transition-opacity group-hover/bar:opacity-100" })
63430
63732
  }
63431
63733
  ),
63432
- /* @__PURE__ */ jsx311(
63734
+ /* @__PURE__ */ jsx312(
63433
63735
  "div",
63434
63736
  {
63435
63737
  className: "absolute inset-y-0 -right-1 z-20 w-2 cursor-ew-resize touch-none",
63436
63738
  onPointerDown: (e) => onResizePointerDown(task, "end", e),
63437
63739
  title: t("kit.gantt.resizeEnd"),
63438
63740
  "aria-hidden": "true",
63439
- children: /* @__PURE__ */ jsx311("div", { className: "mx-auto h-full w-1 rounded-full bg-white/0 opacity-0 transition-opacity group-hover/bar:opacity-100" })
63741
+ children: /* @__PURE__ */ jsx312("div", { className: "mx-auto h-full w-1 rounded-full bg-white/0 opacity-0 transition-opacity group-hover/bar:opacity-100" })
63440
63742
  }
63441
63743
  )
63442
63744
  ] }),
63443
- canEdit && /* @__PURE__ */ jsxs189(Fragment48, { children: [
63444
- /* @__PURE__ */ jsx311(
63745
+ canEdit && /* @__PURE__ */ jsxs190(Fragment48, { children: [
63746
+ /* @__PURE__ */ jsx312(
63445
63747
  "button",
63446
63748
  {
63447
63749
  type: "button",
@@ -63452,7 +63754,7 @@ var TaskBar = ({
63452
63754
  "aria-label": t("kit.gantt.linkFromStart", { task: task.name })
63453
63755
  }
63454
63756
  ),
63455
- /* @__PURE__ */ jsx311(
63757
+ /* @__PURE__ */ jsx312(
63456
63758
  "button",
63457
63759
  {
63458
63760
  type: "button",
@@ -63470,9 +63772,9 @@ var TaskBar = ({
63470
63772
  };
63471
63773
 
63472
63774
  // src/components/Gantt/GanttToolbar.tsx
63473
- import { useMemo as useMemo57 } from "react";
63474
- import classNames121 from "classnames";
63475
- import { jsx as jsx312, jsxs as jsxs190 } from "react/jsx-runtime";
63775
+ import { useMemo as useMemo58 } from "react";
63776
+ import classNames122 from "classnames";
63777
+ import { jsx as jsx313, jsxs as jsxs191 } from "react/jsx-runtime";
63476
63778
  function nearestPreset(zoom, presets) {
63477
63779
  let best = null;
63478
63780
  let bestDist = Infinity;
@@ -63499,25 +63801,25 @@ var GanttToolbar = ({
63499
63801
  Month: t("kit.gantt.zoomMonth"),
63500
63802
  Quarter: t("kit.gantt.zoomQuarter")
63501
63803
  };
63502
- const active = useMemo57(() => nearestPreset(zoom, presets), [zoom, presets]);
63503
- const chrome = useMemo57(
63804
+ const active = useMemo58(() => nearestPreset(zoom, presets), [zoom, presets]);
63805
+ const chrome = useMemo58(
63504
63806
  () => getSurfaceVariantClasses(variant, "neutral"),
63505
63807
  [variant]
63506
63808
  );
63507
- return /* @__PURE__ */ jsxs190(
63809
+ return /* @__PURE__ */ jsxs191(
63508
63810
  "div",
63509
63811
  {
63510
- className: classNames121(
63812
+ className: classNames122(
63511
63813
  "pointer-events-auto flex items-center gap-1 rounded-lg p-1",
63512
63814
  chrome
63513
63815
  ),
63514
63816
  children: [
63515
- /* @__PURE__ */ jsx312("div", { className: "flex items-center rounded-md bg-neutral-100 p-0.5 dark:bg-neutral-800", children: presets.map((p) => /* @__PURE__ */ jsx312(
63817
+ /* @__PURE__ */ jsx313("div", { className: "flex items-center rounded-md bg-neutral-100 p-0.5 dark:bg-neutral-800", children: presets.map((p) => /* @__PURE__ */ jsx313(
63516
63818
  "button",
63517
63819
  {
63518
63820
  type: "button",
63519
63821
  onClick: () => onZoomTo(p.value),
63520
- className: classNames121(
63822
+ className: classNames122(
63521
63823
  "rounded px-1.5 py-0.5 text-[10.5px] font-semibold transition-colors",
63522
63824
  active === p.value ? "bg-white text-neutral-900 shadow-sm dark:bg-neutral-600 dark:text-white" : "text-neutral-500 hover:text-neutral-800 dark:text-neutral-400 dark:hover:text-neutral-200"
63523
63825
  ),
@@ -63525,9 +63827,9 @@ var GanttToolbar = ({
63525
63827
  },
63526
63828
  p.label
63527
63829
  )) }),
63528
- /* @__PURE__ */ jsx312("div", { className: "mx-0.5 h-4 w-px bg-neutral-200 dark:bg-neutral-700" }),
63529
- /* @__PURE__ */ jsx312(Button_default, { variant: "ghost", size: "xs", onClick: () => onZoomBy(1 / 1.25), "aria-label": t("kit.gantt.zoomOut"), children: /* @__PURE__ */ jsx312("span", { className: "text-xs font-semibold leading-none", children: "\u2212" }) }),
63530
- /* @__PURE__ */ jsx312(Button_default, { variant: "ghost", size: "xs", onClick: () => onZoomBy(1.25), "aria-label": t("kit.gantt.zoomIn"), children: /* @__PURE__ */ jsx312("span", { className: "text-xs font-semibold leading-none", children: "+" }) })
63830
+ /* @__PURE__ */ jsx313("div", { className: "mx-0.5 h-4 w-px bg-neutral-200 dark:bg-neutral-700" }),
63831
+ /* @__PURE__ */ jsx313(Button_default, { variant: "ghost", size: "xs", onClick: () => onZoomBy(1 / 1.25), "aria-label": t("kit.gantt.zoomOut"), children: /* @__PURE__ */ jsx313("span", { className: "text-xs font-semibold leading-none", children: "\u2212" }) }),
63832
+ /* @__PURE__ */ jsx313(Button_default, { variant: "ghost", size: "xs", onClick: () => onZoomBy(1.25), "aria-label": t("kit.gantt.zoomIn"), children: /* @__PURE__ */ jsx313("span", { className: "text-xs font-semibold leading-none", children: "+" }) })
63531
63833
  ]
63532
63834
  }
63533
63835
  );
@@ -63535,7 +63837,7 @@ var GanttToolbar = ({
63535
63837
  GanttToolbar.displayName = "GanttToolbar";
63536
63838
 
63537
63839
  // src/components/Gantt/useGanttDrag.ts
63538
- import { useCallback as useCallback41, useEffect as useEffect70, useMemo as useMemo58, useRef as useRef67, useState as useState78 } from "react";
63840
+ import { useCallback as useCallback41, useEffect as useEffect70, useMemo as useMemo59, useRef as useRef67, useState as useState78 } from "react";
63539
63841
  function useGanttDrag(opts) {
63540
63842
  const [drag, setDrag] = useState78(null);
63541
63843
  const [linkSelected, setLinkSelected] = useState78(null);
@@ -63853,7 +64155,7 @@ function useGanttDrag(opts) {
63853
64155
  },
63854
64156
  [beginDrag, timelineX, rowY]
63855
64157
  );
63856
- const rubber = useMemo58(() => {
64158
+ const rubber = useMemo59(() => {
63857
64159
  if (!drag || drag.kind !== "link") return null;
63858
64160
  const source = barGeom(drag.taskId);
63859
64161
  if (!source) return null;
@@ -63885,7 +64187,7 @@ function useGanttDrag(opts) {
63885
64187
  }
63886
64188
 
63887
64189
  // src/components/Gantt/Gantt.tsx
63888
- import { jsx as jsx313, jsxs as jsxs191 } from "react/jsx-runtime";
64190
+ import { jsx as jsx314, jsxs as jsxs192 } from "react/jsx-runtime";
63889
64191
  var HEADER_HEIGHT = 52;
63890
64192
  var GRIP_WIDTH = 36;
63891
64193
  var DEFAULT_COLUMNS = [
@@ -63944,7 +64246,7 @@ var Gantt = ({
63944
64246
  const t = useKitT();
63945
64247
  const kitEngine = useKitEngine();
63946
64248
  const dateLocale = locale ?? kitEngine.locale;
63947
- const allLabels = useMemo59(
64249
+ const allLabels = useMemo60(
63948
64250
  () => ({
63949
64251
  loading: t("kit.gantt.loading"),
63950
64252
  empty: t("kit.gantt.empty"),
@@ -63967,7 +64269,7 @@ var Gantt = ({
63967
64269
  title: c.key === "name" ? allLabels.task : c.key === "owner" ? t("kit.gantt.colOwner") : t("kit.gantt.colProgress")
63968
64270
  }));
63969
64271
  const interactive = editable ?? Boolean(onTasksChange || onLinksChange || onReorder);
63970
- const surfaceText = useMemo59(() => getSurfaceTextTokens(variant), [variant]);
64272
+ const surfaceText = useMemo60(() => getSurfaceTextTokens(variant), [variant]);
63971
64273
  const [internalZoom, setInternalZoom] = useState79(initialZoom);
63972
64274
  const zoom = zoomProp ?? internalZoom;
63973
64275
  const setZoom = useCallback42(
@@ -64030,30 +64332,30 @@ var Gantt = ({
64030
64332
  return next;
64031
64333
  });
64032
64334
  }, []);
64033
- const effectiveTasks = useMemo59(() => {
64335
+ const effectiveTasks = useMemo60(() => {
64034
64336
  let out = tasks;
64035
64337
  if (collapsed.size > 0) {
64036
64338
  out = out.map((t2) => collapsed.has(t2.id) ? { ...t2, open: false } : t2);
64037
64339
  }
64038
64340
  return out;
64039
64341
  }, [tasks, collapsed]);
64040
- const effectiveLanes = useMemo59(() => {
64342
+ const effectiveLanes = useMemo60(() => {
64041
64343
  if (closedLanes.size === 0) return lanes;
64042
64344
  return (lanes ?? []).map(
64043
64345
  (l) => closedLanes.has(l.id) ? { ...l, open: false } : l
64044
64346
  );
64045
64347
  }, [lanes, closedLanes]);
64046
- const committedModel = useMemo59(
64348
+ const committedModel = useMemo60(
64047
64349
  () => buildRows(effectiveTasks, effectiveLanes, rowOrder, rowHeight2),
64048
64350
  [effectiveTasks, effectiveLanes, rowOrder, rowHeight2]
64049
64351
  );
64050
- const range = useMemo59(() => {
64352
+ const range = useMemo60(() => {
64051
64353
  const starts = tasks.map((t2) => toMs(t2.start));
64052
64354
  const ends = tasks.map((t2) => toMs(t2.end));
64053
64355
  return computeViewRange(starts, ends);
64054
64356
  }, [tasks]);
64055
64357
  const timelineWidth = rangeWidth(range.start, range.end, zoom);
64056
- const scaleLevels = useMemo59(
64358
+ const scaleLevels = useMemo60(
64057
64359
  () => buildTimeScale(range.start, range.end, zoom, dateLocale),
64058
64360
  [range, zoom, dateLocale]
64059
64361
  );
@@ -64070,7 +64372,7 @@ var Gantt = ({
64070
64372
  const m = /^(\d+(?:\.\d+)?)px$/.exec(col.width ?? "");
64071
64373
  return m ? Number(m[1]) : 160;
64072
64374
  };
64073
- const sizedColumns = useMemo59(
64375
+ const sizedColumns = useMemo60(
64074
64376
  () => resolvedColumns.map((c) => ({ ...c, width: `${effectiveColWidth(c)}px` })),
64075
64377
  [resolvedColumns, colWidths]
64076
64378
  );
@@ -64078,7 +64380,7 @@ var Gantt = ({
64078
64380
  effectiveWidthsRef.current = Object.fromEntries(
64079
64381
  sizedColumns.map((c) => [c.key, effectiveColWidth(c)])
64080
64382
  );
64081
- const leftWidth = useMemo59(
64383
+ const leftWidth = useMemo60(
64082
64384
  () => GRIP_WIDTH + resolvedColumns.reduce((sum, c) => sum + effectiveColWidth(c), 0),
64083
64385
  [resolvedColumns, colWidths]
64084
64386
  );
@@ -64187,12 +64489,12 @@ var Gantt = ({
64187
64489
  rowOrder,
64188
64490
  setSelected
64189
64491
  });
64190
- const liveReorder = useMemo59(() => {
64492
+ const liveReorder = useMemo60(() => {
64191
64493
  const d = dragApi.drag;
64192
64494
  if (d?.kind !== "reorder" || d.beforeId === void 0) return null;
64193
64495
  return applyRowReorder(effectiveTasks, d.taskId, d.beforeId, rowOrder);
64194
64496
  }, [dragApi.drag, effectiveTasks, rowOrder]);
64195
- const liveModel = useMemo59(
64497
+ const liveModel = useMemo60(
64196
64498
  () => liveReorder ? buildRows(
64197
64499
  liveReorder.tasks,
64198
64500
  effectiveLanes,
@@ -64202,7 +64504,7 @@ var Gantt = ({
64202
64504
  [liveReorder, effectiveLanes, rowHeight2, committedModel]
64203
64505
  );
64204
64506
  liveRowsRef.current = liveModel.rows;
64205
- const bars = useMemo59(() => {
64507
+ const bars = useMemo60(() => {
64206
64508
  const map = /* @__PURE__ */ new Map();
64207
64509
  for (const row of liveModel.rows) {
64208
64510
  if (!row.task) continue;
@@ -64358,22 +64660,22 @@ var Gantt = ({
64358
64660
  const drag = dragApi.drag;
64359
64661
  const dragTask = drag?.taskId ? committedModel.tasksById.get(drag.taskId) : void 0;
64360
64662
  const reorderLineY = drag?.kind === "reorder" && drag.beforeId !== void 0 ? reorderPreviewTop(liveModel.rows, `task:${drag.taskId}`, drag.beforeId) : null;
64361
- const dragSubtree = useMemo59(() => {
64663
+ const dragSubtree = useMemo60(() => {
64362
64664
  if (dragApi.drag?.kind !== "reorder") return null;
64363
64665
  return reorderDragSubtree(
64364
64666
  liveModel.rows,
64365
64667
  `task:${dragApi.drag.taskId}`
64366
64668
  );
64367
64669
  }, [dragApi.drag, liveModel.rows]);
64368
- const dragSubtreeKeys = useMemo59(
64670
+ const dragSubtreeKeys = useMemo60(
64369
64671
  () => new Set((dragSubtree ?? []).map((r) => r.key)),
64370
64672
  [dragSubtree]
64371
64673
  );
64372
- const dragSubtreeHeight = useMemo59(
64674
+ const dragSubtreeHeight = useMemo60(
64373
64675
  () => (dragSubtree ?? []).reduce((sum, r) => sum + r.height, 0),
64374
64676
  [dragSubtree]
64375
64677
  );
64376
- const liveDragDates = useMemo59(() => {
64678
+ const liveDragDates = useMemo60(() => {
64377
64679
  if (!drag || !dragTask) return null;
64378
64680
  if (drag.kind !== "move" && drag.kind !== "resize-start" && drag.kind !== "resize-end") return null;
64379
64681
  return applyDragDates(
@@ -64384,7 +64686,7 @@ var Gantt = ({
64384
64686
  );
64385
64687
  }, [drag, dragTask, zoom, snap2]);
64386
64688
  const liveDragProgress = drag?.kind === "progress" && drag.liveProgress != null ? drag.liveProgress : null;
64387
- const dragOverride = useMemo59(() => {
64689
+ const dragOverride = useMemo60(() => {
64388
64690
  if (!drag || !dragTask) return null;
64389
64691
  if (drag.kind === "progress" && drag.liveProgress != null) {
64390
64692
  return { ...dragTask, progress: drag.liveProgress };
@@ -64394,11 +64696,11 @@ var Gantt = ({
64394
64696
  }
64395
64697
  return null;
64396
64698
  }, [drag, dragTask, liveDragDates]);
64397
- const liveLaneProgress = useMemo59(
64699
+ const liveLaneProgress = useMemo60(
64398
64700
  () => dragOverride && dragTask ? laneRollupProgress(effectiveTasks, dragTask.id, dragOverride) : null,
64399
64701
  [dragOverride, dragTask, effectiveTasks]
64400
64702
  );
64401
- const liveGroupProgress = useMemo59(() => {
64703
+ const liveGroupProgress = useMemo60(() => {
64402
64704
  if (!dragOverride || !dragTask) return null;
64403
64705
  const byId = new Map(effectiveTasks.map((t2) => [t2.id, t2]));
64404
64706
  const m = /* @__PURE__ */ new Map();
@@ -64410,7 +64712,7 @@ var Gantt = ({
64410
64712
  }
64411
64713
  return m.size > 0 ? m : null;
64412
64714
  }, [dragOverride, dragTask, effectiveTasks]);
64413
- const liveLinkBars = useMemo59(() => {
64715
+ const liveLinkBars = useMemo60(() => {
64414
64716
  if (!liveDragDates || !dragTask) return bars;
64415
64717
  const g = bars.get(dragTask.id);
64416
64718
  if (!g) return bars;
@@ -64419,12 +64721,12 @@ var Gantt = ({
64419
64721
  if (left === g.left && width === g.width) return bars;
64420
64722
  return new Map(bars).set(dragTask.id, { ...g, left, width });
64421
64723
  }, [bars, liveDragDates, dragTask, range, zoom]);
64422
- const linkPaths = useMemo59(
64724
+ const linkPaths = useMemo60(
64423
64725
  () => computeLinkPaths(links, liveLinkBars, color),
64424
64726
  [links, liveLinkBars, color]
64425
64727
  );
64426
- const linkFan = useMemo59(() => computeLinkFanOffsets(links, bars), [links, bars]);
64427
- return /* @__PURE__ */ jsx313(
64728
+ const linkFan = useMemo60(() => computeLinkFanOffsets(links, bars), [links, bars]);
64729
+ return /* @__PURE__ */ jsx314(
64428
64730
  Panel_default,
64429
64731
  {
64430
64732
  ref: rootRef,
@@ -64442,31 +64744,31 @@ var Gantt = ({
64442
64744
  "aria-label": t("kit.gantt.root"),
64443
64745
  onKeyDown: onRootKeyDown,
64444
64746
  onPointerDown: handleRootPointerDown,
64445
- children: /* @__PURE__ */ jsxs191("div", { className: "flex h-full min-h-0 flex-col", children: [
64446
- /* @__PURE__ */ jsxs191(
64747
+ children: /* @__PURE__ */ jsxs192("div", { className: "flex h-full min-h-0 flex-col", children: [
64748
+ /* @__PURE__ */ jsxs192(
64447
64749
  "div",
64448
64750
  {
64449
- className: classNames122(
64751
+ className: classNames123(
64450
64752
  "flex shrink-0 items-center gap-3 border-b px-4 py-3",
64451
64753
  surfaceText.divider
64452
64754
  ),
64453
64755
  children: [
64454
- hasNode(icon) && /* @__PURE__ */ jsx313(
64756
+ hasNode(icon) && /* @__PURE__ */ jsx314(
64455
64757
  "div",
64456
64758
  {
64457
- className: classNames122(
64759
+ className: classNames123(
64458
64760
  "flex h-10 w-10 shrink-0 items-center justify-center rounded-xl",
64459
64761
  getSurfaceVariantClasses(variant, "neutral")
64460
64762
  ),
64461
64763
  children: icon
64462
64764
  }
64463
64765
  ),
64464
- (title != null || subtitle != null) && /* @__PURE__ */ jsxs191("div", { className: "min-w-0 flex-1", children: [
64465
- subtitle != null && /* @__PURE__ */ jsx313("div", { className: "truncate text-[11px] font-semibold uppercase tracking-wider text-neutral-500 dark:text-neutral-400", children: subtitle }),
64466
- title != null && /* @__PURE__ */ jsx313("div", { className: "truncate text-lg font-semibold text-neutral-900 dark:text-white", children: title })
64766
+ (title != null || subtitle != null) && /* @__PURE__ */ jsxs192("div", { className: "min-w-0 flex-1", children: [
64767
+ subtitle != null && /* @__PURE__ */ jsx314("div", { className: "truncate text-[11px] font-semibold uppercase tracking-wider text-neutral-500 dark:text-neutral-400", children: subtitle }),
64768
+ title != null && /* @__PURE__ */ jsx314("div", { className: "truncate text-lg font-semibold text-neutral-900 dark:text-white", children: title })
64467
64769
  ] }),
64468
- hasNode(actions) && /* @__PURE__ */ jsx313("div", { className: "flex shrink-0 items-center gap-2", children: actions }),
64469
- /* @__PURE__ */ jsx313("div", { className: "ml-auto shrink-0", children: /* @__PURE__ */ jsx313(
64770
+ hasNode(actions) && /* @__PURE__ */ jsx314("div", { className: "flex shrink-0 items-center gap-2", children: actions }),
64771
+ /* @__PURE__ */ jsx314("div", { className: "ml-auto shrink-0", children: /* @__PURE__ */ jsx314(
64470
64772
  GanttToolbar,
64471
64773
  {
64472
64774
  variant,
@@ -64479,31 +64781,31 @@ var Gantt = ({
64479
64781
  ]
64480
64782
  }
64481
64783
  ),
64482
- /* @__PURE__ */ jsxs191(
64784
+ /* @__PURE__ */ jsxs192(
64483
64785
  "div",
64484
64786
  {
64485
- className: classNames122(
64787
+ className: classNames123(
64486
64788
  "relative flex shrink-0 items-stretch border-b",
64487
64789
  surfaceText.divider
64488
64790
  ),
64489
64791
  style: { height: HEADER_HEIGHT },
64490
64792
  children: [
64491
- /* @__PURE__ */ jsxs191(
64793
+ /* @__PURE__ */ jsxs192(
64492
64794
  "div",
64493
64795
  {
64494
- className: classNames122(
64796
+ className: classNames123(
64495
64797
  "flex items-stretch border-r bg-white dark:bg-neutral-900",
64496
64798
  surfaceText.divider
64497
64799
  ),
64498
64800
  style: { width: leftWidth },
64499
64801
  children: [
64500
- /* @__PURE__ */ jsx313("div", { className: "w-9 shrink-0" }),
64802
+ /* @__PURE__ */ jsx314("div", { className: "w-9 shrink-0" }),
64501
64803
  sizedColumns.map((col) => {
64502
64804
  const resizable = resizableColumns && col.resizable !== false;
64503
- return /* @__PURE__ */ jsxs191(
64805
+ return /* @__PURE__ */ jsxs192(
64504
64806
  "div",
64505
64807
  {
64506
- className: classNames122(
64808
+ className: classNames123(
64507
64809
  "relative flex shrink-0 items-center border-r px-2 text-[11px] font-semibold uppercase tracking-wide text-neutral-600 last:border-r-0 dark:text-neutral-400",
64508
64810
  surfaceText.divider
64509
64811
  ),
@@ -64512,7 +64814,7 @@ var Gantt = ({
64512
64814
  justifyContent: col.align === "center" ? "center" : col.align === "right" ? "flex-end" : "flex-start"
64513
64815
  },
64514
64816
  children: [
64515
- /* @__PURE__ */ jsx313("span", { className: "truncate", children: col.title }),
64817
+ /* @__PURE__ */ jsx314("span", { className: "truncate", children: col.title }),
64516
64818
  resizable && /* Resize handle — Table's header-edge pattern: an 8px hit
64517
64819
  area whose 1px line sits exactly on the column border.
64518
64820
  Absolute insets stop at the padding edge (1px inside
@@ -64521,7 +64823,7 @@ var Gantt = ({
64521
64823
  the border's own pixel. The cell carries no
64522
64824
  overflow-hidden so the line can paint over the border
64523
64825
  (the title span truncates itself). */
64524
- /* @__PURE__ */ jsx313(
64826
+ /* @__PURE__ */ jsx314(
64525
64827
  "div",
64526
64828
  {
64527
64829
  role: "separator",
@@ -64530,7 +64832,7 @@ var Gantt = ({
64530
64832
  className: "group/rh absolute inset-y-0 -right-px z-10 flex w-2 cursor-col-resize select-none items-stretch justify-end",
64531
64833
  onPointerDown: (e) => startColumnResize(e, col.key),
64532
64834
  title: t("kit.gantt.resizeColumn", { column: col.title }),
64533
- children: /* @__PURE__ */ jsx313(
64835
+ children: /* @__PURE__ */ jsx314(
64534
64836
  "div",
64535
64837
  {
64536
64838
  className: "h-full w-px bg-neutral-300 transition-colors group-hover/rh:bg-neutral-400 dark:bg-neutral-600 dark:group-hover/rh:bg-neutral-500",
@@ -64547,30 +64849,30 @@ var Gantt = ({
64547
64849
  ]
64548
64850
  }
64549
64851
  ),
64550
- /* @__PURE__ */ jsx313("div", { className: "relative min-w-0 flex-1 overflow-hidden", children: /* @__PURE__ */ jsxs191(
64852
+ /* @__PURE__ */ jsx314("div", { className: "relative min-w-0 flex-1 overflow-hidden", children: /* @__PURE__ */ jsxs192(
64551
64853
  "div",
64552
64854
  {
64553
64855
  ref: headerScaleRef,
64554
64856
  className: "relative h-full",
64555
64857
  style: { width: timelineWidth },
64556
64858
  children: [
64557
- /* @__PURE__ */ jsx313(GanttScale, { levels: scaleLevels, height: HEADER_HEIGHT }),
64558
- todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ jsx313(
64859
+ /* @__PURE__ */ jsx314(GanttScale, { levels: scaleLevels, height: HEADER_HEIGHT }),
64860
+ todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ jsx314(
64559
64861
  "div",
64560
64862
  {
64561
- className: classNames122(
64863
+ className: classNames123(
64562
64864
  "pointer-events-none absolute inset-y-0 z-[1] border-l-2",
64563
64865
  todayTokens.line
64564
64866
  ),
64565
64867
  style: { left: todayX }
64566
64868
  }
64567
64869
  ),
64568
- todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ jsx313(
64870
+ todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ jsx314(
64569
64871
  "div",
64570
64872
  {
64571
64873
  className: "pointer-events-none absolute top-1 z-10 -translate-x-1/2",
64572
64874
  style: { left: todayX },
64573
- children: /* @__PURE__ */ jsx313("span", { className: classNames122("rounded-full px-2 py-0.5 text-[10px] font-semibold text-white shadow-sm", todayTokens.chip), children: allLabels.today })
64875
+ children: /* @__PURE__ */ jsx314("span", { className: classNames123("rounded-full px-2 py-0.5 text-[10px] font-semibold text-white shadow-sm", todayTokens.chip), children: allLabels.today })
64574
64876
  }
64575
64877
  )
64576
64878
  ]
@@ -64579,20 +64881,20 @@ var Gantt = ({
64579
64881
  ]
64580
64882
  }
64581
64883
  ),
64582
- /* @__PURE__ */ jsx313(
64884
+ /* @__PURE__ */ jsx314(
64583
64885
  "div",
64584
64886
  {
64585
64887
  ref: scrollRef,
64586
64888
  className: `gantt-scroller min-h-0 flex-1 overflow-auto overscroll-contain [&::-webkit-scrollbar]:h-1.5 ${THIN_SCROLLBAR}`,
64587
64889
  onScroll: syncHeaderScale,
64588
- children: /* @__PURE__ */ jsx313("div", { style: { width: leftWidth + timelineWidth + LINK_RIGHT_GUTTER, minWidth: "100%" }, children: loading ? /* @__PURE__ */ jsx313(GanttSkeleton, { rows: 12, rowHeight: rowHeight2, leftWidth }) : isEmpty2 ? /* @__PURE__ */ jsx313("div", { className: "flex items-center justify-center text-sm text-neutral-500", style: { height: bodyHeight || 160, width: leftWidth + timelineWidth }, children: emptyState ?? allLabels.empty }) : /* @__PURE__ */ jsxs191("div", { className: "relative", style: { height: bodyHeight }, children: [
64589
- /* @__PURE__ */ jsxs191(
64890
+ children: /* @__PURE__ */ jsx314("div", { style: { width: leftWidth + timelineWidth + LINK_RIGHT_GUTTER, minWidth: "100%" }, children: loading ? /* @__PURE__ */ jsx314(GanttSkeleton, { rows: 12, rowHeight: rowHeight2, leftWidth }) : isEmpty2 ? /* @__PURE__ */ jsx314("div", { className: "flex items-center justify-center text-sm text-neutral-500", style: { height: bodyHeight || 160, width: leftWidth + timelineWidth }, children: emptyState ?? allLabels.empty }) : /* @__PURE__ */ jsxs192("div", { className: "relative", style: { height: bodyHeight }, children: [
64891
+ /* @__PURE__ */ jsxs192(
64590
64892
  "div",
64591
64893
  {
64592
64894
  className: "pointer-events-none absolute inset-y-0 z-0",
64593
64895
  style: { left: leftWidth, width: timelineWidth },
64594
64896
  children: [
64595
- scaleLevels.length > 0 && scaleLevels[scaleLevels.length - 1].columns.map((c) => /* @__PURE__ */ jsx313(
64897
+ scaleLevels.length > 0 && scaleLevels[scaleLevels.length - 1].columns.map((c) => /* @__PURE__ */ jsx314(
64596
64898
  "div",
64597
64899
  {
64598
64900
  className: "absolute inset-y-0 border-r border-neutral-100 dark:border-neutral-800",
@@ -64600,10 +64902,10 @@ var Gantt = ({
64600
64902
  },
64601
64903
  c.id
64602
64904
  )),
64603
- todayVisible && /* @__PURE__ */ jsx313(
64905
+ todayVisible && /* @__PURE__ */ jsx314(
64604
64906
  "div",
64605
64907
  {
64606
- className: classNames122("absolute inset-y-0 border-l-2", todayTokens.line),
64908
+ className: classNames123("absolute inset-y-0 border-l-2", todayTokens.line),
64607
64909
  style: { left: todayX }
64608
64910
  }
64609
64911
  )
@@ -64613,7 +64915,7 @@ var Gantt = ({
64613
64915
  liveModel.rows.map((row) => {
64614
64916
  const isDragSource = drag?.kind === "reorder" && row.task != null && row.task.id === drag.taskId;
64615
64917
  if (isDragSource) {
64616
- return /* @__PURE__ */ jsx313(
64918
+ return /* @__PURE__ */ jsx314(
64617
64919
  "div",
64618
64920
  {
64619
64921
  "data-row-key": row.key,
@@ -64621,7 +64923,7 @@ var Gantt = ({
64621
64923
  "aria-hidden": "true",
64622
64924
  className: "pointer-events-none flex border-b",
64623
64925
  style: { height: dragSubtreeHeight || row.height },
64624
- children: /* @__PURE__ */ jsx313(
64926
+ children: /* @__PURE__ */ jsx314(
64625
64927
  "div",
64626
64928
  {
64627
64929
  className: "m-1 flex-1 rounded-md border-2 border-dashed",
@@ -64638,7 +64940,7 @@ var Gantt = ({
64638
64940
  if (drag?.kind === "reorder" && dragSubtreeKeys.has(row.key)) {
64639
64941
  return null;
64640
64942
  }
64641
- return /* @__PURE__ */ jsx313(
64943
+ return /* @__PURE__ */ jsx314(
64642
64944
  GanttBodyRow,
64643
64945
  {
64644
64946
  row,
@@ -64676,7 +64978,7 @@ var Gantt = ({
64676
64978
  row.key
64677
64979
  );
64678
64980
  }),
64679
- /* @__PURE__ */ jsx313(
64981
+ /* @__PURE__ */ jsx314(
64680
64982
  GanttLinkLayer,
64681
64983
  {
64682
64984
  ref: overlayRef,
@@ -64692,7 +64994,7 @@ var Gantt = ({
64692
64994
  onDeleteLink: interactive && onLinksChange ? deleteSelectedLink : void 0
64693
64995
  }
64694
64996
  ),
64695
- drag?.kind === "reorder" && reorderLineY != null && /* @__PURE__ */ jsx313(
64997
+ drag?.kind === "reorder" && reorderLineY != null && /* @__PURE__ */ jsx314(
64696
64998
  "div",
64697
64999
  {
64698
65000
  className: "pointer-events-none absolute z-30 h-0.5 rounded-full",
@@ -64712,7 +65014,7 @@ var Gantt = ({
64712
65014
  // there is no filtered/overflowing ancestor and the fixed
64713
65015
  // clone always tracks the viewport pointer.
64714
65016
  createPortal15(
64715
- /* @__PURE__ */ jsx313(
65017
+ /* @__PURE__ */ jsx314(
64716
65018
  "div",
64717
65019
  {
64718
65020
  "data-gantt-drag-clone": "true",
@@ -64723,14 +65025,14 @@ var Gantt = ({
64723
65025
  top: drag.clientY - (drag.grabOffset?.y ?? 0),
64724
65026
  width: leftWidth + timelineWidth + LINK_RIGHT_GUTTER
64725
65027
  },
64726
- children: /* @__PURE__ */ jsx313(
65028
+ children: /* @__PURE__ */ jsx314(
64727
65029
  "div",
64728
65030
  {
64729
65031
  className: "overflow-hidden rounded-lg bg-white/95 shadow-2xl backdrop-blur-sm dark:bg-neutral-900/95",
64730
65032
  style: {
64731
65033
  boxShadow: `0 8px 32px rgba(0, 0, 0, 0.28), inset 2px 0 0 var(--color-${color}-500)`
64732
65034
  },
64733
- children: dragSubtree.map((row) => /* @__PURE__ */ jsx313(
65035
+ children: dragSubtree.map((row) => /* @__PURE__ */ jsx314(
64734
65036
  GanttBodyRow,
64735
65037
  {
64736
65038
  row,
@@ -64773,7 +65075,7 @@ var Gantt = ({
64773
65075
  ),
64774
65076
  document.body
64775
65077
  ),
64776
- drag && drag.kind !== "reorder" && dragTask && liveDragDates && /* @__PURE__ */ jsx313(
65078
+ drag && drag.kind !== "reorder" && dragTask && liveDragDates && /* @__PURE__ */ jsx314(
64777
65079
  "div",
64778
65080
  {
64779
65081
  className: "pointer-events-none absolute z-50 rounded-md bg-neutral-900/90 px-2 py-1 text-[11px] font-medium text-white shadow-lg dark:bg-neutral-700/95",
@@ -64804,13 +65106,13 @@ var GanttSkeleton = ({
64804
65106
  rows,
64805
65107
  rowHeight: rowHeight2,
64806
65108
  leftWidth
64807
- }) => /* @__PURE__ */ jsx313("div", { className: "animate-pulse", "aria-busy": "true", children: Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ jsxs191("div", { className: "flex", style: { height: rowHeight2 }, children: [
64808
- /* @__PURE__ */ jsx313(
65109
+ }) => /* @__PURE__ */ jsx314("div", { className: "animate-pulse", "aria-busy": "true", children: Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ jsxs192("div", { className: "flex", style: { height: rowHeight2 }, children: [
65110
+ /* @__PURE__ */ jsx314(
64809
65111
  "div",
64810
65112
  {
64811
65113
  className: "sticky left-0 flex items-center border-b border-neutral-100 bg-white px-3 dark:border-neutral-800 dark:bg-neutral-900",
64812
65114
  style: { width: leftWidth },
64813
- children: /* @__PURE__ */ jsx313(
65115
+ children: /* @__PURE__ */ jsx314(
64814
65116
  "div",
64815
65117
  {
64816
65118
  className: "h-3 rounded-full bg-neutral-200 dark:bg-neutral-700",
@@ -64819,7 +65121,7 @@ var GanttSkeleton = ({
64819
65121
  )
64820
65122
  }
64821
65123
  ),
64822
- /* @__PURE__ */ jsx313("div", { className: "relative flex-1", children: /* @__PURE__ */ jsx313(
65124
+ /* @__PURE__ */ jsx314("div", { className: "relative flex-1", children: /* @__PURE__ */ jsx314(
64823
65125
  "div",
64824
65126
  {
64825
65127
  className: "absolute top-1/2 h-4 -translate-y-1/2 rounded-md bg-neutral-200/80 dark:bg-neutral-700/60",
@@ -64837,13 +65139,13 @@ import {
64837
65139
  useCallback as useCallback43,
64838
65140
  useContext as useContext8,
64839
65141
  useEffect as useEffect72,
64840
- useMemo as useMemo60,
65142
+ useMemo as useMemo61,
64841
65143
  useRef as useRef69,
64842
65144
  useState as useState80
64843
65145
  } from "react";
64844
65146
  import { createPortal as createPortal16 } from "react-dom";
64845
- import classNames123 from "classnames";
64846
- import { jsx as jsx314, jsxs as jsxs192 } from "react/jsx-runtime";
65147
+ import classNames124 from "classnames";
65148
+ import { jsx as jsx315, jsxs as jsxs193 } from "react/jsx-runtime";
64847
65149
  var BottomSheetContext = createContext8(null);
64848
65150
  var TRANSITION_MS2 = 260;
64849
65151
  var renderSlot = (slot, controls) => {
@@ -64897,13 +65199,13 @@ var BottomSheetProvider = ({
64897
65199
  },
64898
65200
  []
64899
65201
  );
64900
- const controls = useMemo60(
65202
+ const controls = useMemo61(
64901
65203
  () => ({
64902
65204
  dismiss: dismissSheet
64903
65205
  }),
64904
65206
  [dismissSheet]
64905
65207
  );
64906
- const contextValue = useMemo60(
65208
+ const contextValue = useMemo61(
64907
65209
  () => ({
64908
65210
  presentSheet,
64909
65211
  dismissSheet,
@@ -64913,11 +65215,11 @@ var BottomSheetProvider = ({
64913
65215
  [presentSheet, dismissSheet, sheet, isVisible]
64914
65216
  );
64915
65217
  const overlayNode = typeof document !== "undefined" && sheet ? createPortal16(
64916
- /* @__PURE__ */ jsxs192("div", { className: "pointer-events-none fixed inset-0 z-[70] flex items-end justify-center", children: [
64917
- /* @__PURE__ */ jsx314(
65218
+ /* @__PURE__ */ jsxs193("div", { className: "pointer-events-none fixed inset-0 z-[70] flex items-end justify-center", children: [
65219
+ /* @__PURE__ */ jsx315(
64918
65220
  "div",
64919
65221
  {
64920
- className: classNames123(
65222
+ className: classNames124(
64921
65223
  "absolute inset-0 bg-neutral-900/40 transition-opacity duration-300",
64922
65224
  isVisible ? "opacity-100 pointer-events-auto" : "opacity-0"
64923
65225
  ),
@@ -64927,24 +65229,24 @@ var BottomSheetProvider = ({
64927
65229
  }
64928
65230
  }
64929
65231
  ),
64930
- /* @__PURE__ */ jsx314("div", { className: "relative w-full max-w-4xl px-4 pb-4 sm:px-8", children: /* @__PURE__ */ jsxs192(
65232
+ /* @__PURE__ */ jsx315("div", { className: "relative w-full max-w-4xl px-4 pb-4 sm:px-8", children: /* @__PURE__ */ jsxs193(
64931
65233
  "section",
64932
65234
  {
64933
65235
  role: "dialog",
64934
65236
  "aria-modal": "true",
64935
- className: classNames123(
65237
+ className: classNames124(
64936
65238
  "pointer-events-auto ml-auto flex w-full flex-col rounded-t-3xl border border-slate-200 bg-white shadow-2xl transition-transform duration-300 dark:border-slate-700 dark:bg-slate-900",
64937
65239
  sheet.className,
64938
65240
  isVisible ? "translate-y-0" : "translate-y-full"
64939
65241
  ),
64940
65242
  style: { minHeight: "25vh", maxHeight: "85vh" },
64941
65243
  children: [
64942
- /* @__PURE__ */ jsxs192("header", { className: "flex items-start justify-between gap-3 border-b border-slate-200 px-6 py-4 dark:border-slate-800", children: [
64943
- /* @__PURE__ */ jsxs192("div", { className: "space-y-1", children: [
64944
- sheet.title && /* @__PURE__ */ jsx314("div", { className: "text-base font-semibold text-slate-900 dark:text-slate-100", children: sheet.title }),
64945
- sheet.description && /* @__PURE__ */ jsx314("p", { className: "text-sm text-slate-500 dark:text-slate-300", children: sheet.description })
65244
+ /* @__PURE__ */ jsxs193("header", { className: "flex items-start justify-between gap-3 border-b border-slate-200 px-6 py-4 dark:border-slate-800", children: [
65245
+ /* @__PURE__ */ jsxs193("div", { className: "space-y-1", children: [
65246
+ sheet.title && /* @__PURE__ */ jsx315("div", { className: "text-base font-semibold text-slate-900 dark:text-slate-100", children: sheet.title }),
65247
+ sheet.description && /* @__PURE__ */ jsx315("p", { className: "text-sm text-slate-500 dark:text-slate-300", children: sheet.description })
64946
65248
  ] }),
64947
- (sheet.showCloseButton ?? true) && /* @__PURE__ */ jsx314(
65249
+ (sheet.showCloseButton ?? true) && /* @__PURE__ */ jsx315(
64948
65250
  IconButton_default,
64949
65251
  {
64950
65252
  icon: "Close",
@@ -64956,15 +65258,15 @@ var BottomSheetProvider = ({
64956
65258
  }
64957
65259
  )
64958
65260
  ] }),
64959
- /* @__PURE__ */ jsx314("div", { className: "flex-1 overflow-y-auto px-6 py-4", children: renderSlot(sheet.content, controls) ?? /* @__PURE__ */ jsx314("p", { className: "text-sm text-slate-500", children: "No content provided." }) }),
64960
- sheet.actions && /* @__PURE__ */ jsx314("div", { className: "flex flex-wrap items-center justify-end gap-3 border-t border-slate-200 px-6 py-4 dark:border-slate-800", children: renderSlot(sheet.actions, controls) })
65261
+ /* @__PURE__ */ jsx315("div", { className: "flex-1 overflow-y-auto px-6 py-4", children: renderSlot(sheet.content, controls) ?? /* @__PURE__ */ jsx315("p", { className: "text-sm text-slate-500", children: "No content provided." }) }),
65262
+ sheet.actions && /* @__PURE__ */ jsx315("div", { className: "flex flex-wrap items-center justify-end gap-3 border-t border-slate-200 px-6 py-4 dark:border-slate-800", children: renderSlot(sheet.actions, controls) })
64961
65263
  ]
64962
65264
  }
64963
65265
  ) })
64964
65266
  ] }),
64965
65267
  document.body
64966
65268
  ) : null;
64967
- return /* @__PURE__ */ jsxs192(BottomSheetContext.Provider, { value: contextValue, children: [
65269
+ return /* @__PURE__ */ jsxs193(BottomSheetContext.Provider, { value: contextValue, children: [
64968
65270
  children,
64969
65271
  overlayNode
64970
65272
  ] });
@@ -65604,8 +65906,8 @@ var SYSTEM_VARIABLES = [
65604
65906
  ];
65605
65907
 
65606
65908
  // src/components/MetricBar.tsx
65607
- import classNames124 from "classnames";
65608
- import { jsx as jsx315 } from "react/jsx-runtime";
65909
+ import classNames125 from "classnames";
65910
+ import { jsx as jsx316 } from "react/jsx-runtime";
65609
65911
  var MetricBar = ({
65610
65912
  label,
65611
65913
  value,
@@ -65615,7 +65917,7 @@ var MetricBar = ({
65615
65917
  size = "sm",
65616
65918
  className,
65617
65919
  ...rest
65618
- }) => /* @__PURE__ */ jsx315(
65920
+ }) => /* @__PURE__ */ jsx316(
65619
65921
  Progress_default,
65620
65922
  {
65621
65923
  ...rest,
@@ -65625,7 +65927,7 @@ var MetricBar = ({
65625
65927
  formatValue: value !== void 0 ? () => String(value) : void 0,
65626
65928
  size,
65627
65929
  color: tone ?? color ?? "blue",
65628
- className: classNames124("w-full", className)
65930
+ className: classNames125("w-full", className)
65629
65931
  }
65630
65932
  );
65631
65933
  MetricBar.displayName = "MetricBar";
@@ -65666,6 +65968,7 @@ export {
65666
65968
  COLLAPSIBLE_HELP_VARIANTS,
65667
65969
  COMBOBOX_TONE_CLASSES,
65668
65970
  COMBOBOX_VALIDATION_STATUSES,
65971
+ CONNECTION_FLOW_CHILD_LAYOUTS,
65669
65972
  CONNECTION_FLOW_EDGE_STYLES,
65670
65973
  CONNECTION_FLOW_ITEM_PROGRESS,
65671
65974
  CONNECTION_FLOW_LOADERS,
@@ -65704,6 +66007,7 @@ export {
65704
66007
  DEFAULT_LAYOUT_OPTIONS,
65705
66008
  DEFAULT_SERIES_PALETTE,
65706
66009
  DEFAULT_SURFACE_CORNER,
66010
+ DEFAULT_SURFACE_GUTTER,
65707
66011
  DEFAULT_SURFACE_PADDING,
65708
66012
  DEFAULT_SURFACE_TONE,
65709
66013
  DEFAULT_TOAST_GAP_PX,
@@ -65854,6 +66158,7 @@ export {
65854
66158
  STAT_PAGER_PLACEMENTS,
65855
66159
  SURFACE_CORNERS,
65856
66160
  SURFACE_GLASS_RIM,
66161
+ SURFACE_GUTTER_AXES,
65857
66162
  SURFACE_PADDINGS,
65858
66163
  SURFACE_TO_BUTTON_VARIANT,
65859
66164
  SURFACE_VARIANTS,
@@ -65948,6 +66253,7 @@ export {
65948
66253
  WorkflowTracker_default as WorkflowTracker,
65949
66254
  WorkflowTrackerDetails_default as WorkflowTrackerDetails,
65950
66255
  WorkflowTrackerRail_default as WorkflowTrackerRail,
66256
+ WorkflowTrackerRollups_default as WorkflowTrackerRollups,
65951
66257
  WorkflowTrackerStepDetails_default as WorkflowTrackerStepDetails,
65952
66258
  areaPathFromPoints,
65953
66259
  bandAreaPath,
@@ -66086,6 +66392,7 @@ export {
66086
66392
  getStepperTonePalette,
66087
66393
  getSurfaceCornerClass,
66088
66394
  getSurfaceCornerRem,
66395
+ getSurfaceGutterClass,
66089
66396
  getSurfacePaddingClass,
66090
66397
  getSurfacePaddingClasses,
66091
66398
  getSurfaceTextTokens,
@@ -66150,6 +66457,7 @@ export {
66150
66457
  mixHex,
66151
66458
  nicePolarMax,
66152
66459
  niceRadarMax,
66460
+ nodeHasFailed,
66153
66461
  nodeIcon,
66154
66462
  nodeIsActive,
66155
66463
  nodeIsSkipped,
@@ -66205,6 +66513,7 @@ export {
66205
66513
  tintColor,
66206
66514
  toBoolean,
66207
66515
  toDate,
66516
+ toRows,
66208
66517
  toSmartVariable,
66209
66518
  tracePathTo,
66210
66519
  usageTotals,