@cjlapao/ui-kit 0.2.3 → 0.2.5

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.
Files changed (102) hide show
  1. package/dist/{CapsuleBlueprint-DwDZ7nii.d.cts → CapsuleBlueprint-BI0jdbTt.d.cts} +16 -1
  2. package/dist/{CapsuleBlueprint-DwDZ7nii.d.ts → CapsuleBlueprint-BI0jdbTt.d.ts} +16 -1
  3. package/dist/index.cjs +1158 -713
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.css +73 -0
  6. package/dist/index.d.cts +320 -46
  7. package/dist/index.d.ts +320 -46
  8. package/dist/index.js +1077 -639
  9. package/dist/index.js.map +1 -1
  10. package/dist/markdown.cjs.map +1 -1
  11. package/dist/markdown.d.cts +2 -2
  12. package/dist/markdown.d.ts +2 -2
  13. package/dist/markdown.js.map +1 -1
  14. package/package.json +3 -3
  15. package/dist/CapsuleBlueprint--CgRT7dr.d.cts +0 -426
  16. package/dist/CapsuleBlueprint--CgRT7dr.d.ts +0 -426
  17. package/dist/CapsuleBlueprint-12uQWAvU.d.cts +0 -732
  18. package/dist/CapsuleBlueprint-12uQWAvU.d.ts +0 -732
  19. package/dist/CapsuleBlueprint-1FP6avn4.d.cts +0 -1017
  20. package/dist/CapsuleBlueprint-1FP6avn4.d.ts +0 -1017
  21. package/dist/CapsuleBlueprint-6DmJgar9.d.cts +0 -358
  22. package/dist/CapsuleBlueprint-6DmJgar9.d.ts +0 -358
  23. package/dist/CapsuleBlueprint-B7MPc5wu.d.cts +0 -835
  24. package/dist/CapsuleBlueprint-B7MPc5wu.d.ts +0 -835
  25. package/dist/CapsuleBlueprint-BFHAMKUF.d.cts +0 -991
  26. package/dist/CapsuleBlueprint-BFHAMKUF.d.ts +0 -991
  27. package/dist/CapsuleBlueprint-BG23ZWsl.d.cts +0 -460
  28. package/dist/CapsuleBlueprint-BG23ZWsl.d.ts +0 -460
  29. package/dist/CapsuleBlueprint-BGx-KPqS.d.cts +0 -925
  30. package/dist/CapsuleBlueprint-BGx-KPqS.d.ts +0 -925
  31. package/dist/CapsuleBlueprint-BJYVRyFD.d.cts +0 -449
  32. package/dist/CapsuleBlueprint-BJYVRyFD.d.ts +0 -449
  33. package/dist/CapsuleBlueprint-BQq4ywG4.d.cts +0 -835
  34. package/dist/CapsuleBlueprint-BQq4ywG4.d.ts +0 -835
  35. package/dist/CapsuleBlueprint-BTgmUcyF.d.cts +0 -278
  36. package/dist/CapsuleBlueprint-BTgmUcyF.d.ts +0 -278
  37. package/dist/CapsuleBlueprint-BX2YI1yC.d.cts +0 -415
  38. package/dist/CapsuleBlueprint-BX2YI1yC.d.ts +0 -415
  39. package/dist/CapsuleBlueprint-BfPODmvJ.d.cts +0 -822
  40. package/dist/CapsuleBlueprint-BfPODmvJ.d.ts +0 -822
  41. package/dist/CapsuleBlueprint-BfSPPu5k.d.cts +0 -616
  42. package/dist/CapsuleBlueprint-BfSPPu5k.d.ts +0 -616
  43. package/dist/CapsuleBlueprint-BoPkPR2J.d.cts +0 -785
  44. package/dist/CapsuleBlueprint-BoPkPR2J.d.ts +0 -785
  45. package/dist/CapsuleBlueprint-CJeLH0j2.d.cts +0 -228
  46. package/dist/CapsuleBlueprint-CJeLH0j2.d.ts +0 -228
  47. package/dist/CapsuleBlueprint-CJwXDMzM.d.cts +0 -622
  48. package/dist/CapsuleBlueprint-CJwXDMzM.d.ts +0 -622
  49. package/dist/CapsuleBlueprint-CM125BJI.d.cts +0 -811
  50. package/dist/CapsuleBlueprint-CM125BJI.d.ts +0 -811
  51. package/dist/CapsuleBlueprint-CQPeacGV.d.cts +0 -426
  52. package/dist/CapsuleBlueprint-CQPeacGV.d.ts +0 -426
  53. package/dist/CapsuleBlueprint-CQy2O0UN.d.cts +0 -889
  54. package/dist/CapsuleBlueprint-CQy2O0UN.d.ts +0 -889
  55. package/dist/CapsuleBlueprint-CRy04iCR.d.cts +0 -695
  56. package/dist/CapsuleBlueprint-CRy04iCR.d.ts +0 -695
  57. package/dist/CapsuleBlueprint-CixXdjMu.d.cts +0 -925
  58. package/dist/CapsuleBlueprint-CixXdjMu.d.ts +0 -925
  59. package/dist/CapsuleBlueprint-CjCxwO1O.d.cts +0 -786
  60. package/dist/CapsuleBlueprint-CjCxwO1O.d.ts +0 -786
  61. package/dist/CapsuleBlueprint-Cm10IA2w.d.cts +0 -342
  62. package/dist/CapsuleBlueprint-Cm10IA2w.d.ts +0 -342
  63. package/dist/CapsuleBlueprint-CoGsooJJ.d.cts +0 -492
  64. package/dist/CapsuleBlueprint-CoGsooJJ.d.ts +0 -492
  65. package/dist/CapsuleBlueprint-CpHqUsJK.d.cts +0 -786
  66. package/dist/CapsuleBlueprint-CpHqUsJK.d.ts +0 -786
  67. package/dist/CapsuleBlueprint-CrRg8EVW.d.cts +0 -358
  68. package/dist/CapsuleBlueprint-CrRg8EVW.d.ts +0 -358
  69. package/dist/CapsuleBlueprint-DGxsd0aY.d.cts +0 -785
  70. package/dist/CapsuleBlueprint-DGxsd0aY.d.ts +0 -785
  71. package/dist/CapsuleBlueprint-DYnwizSo.d.cts +0 -698
  72. package/dist/CapsuleBlueprint-DYnwizSo.d.ts +0 -698
  73. package/dist/CapsuleBlueprint-DbLSB78P.d.cts +0 -235
  74. package/dist/CapsuleBlueprint-DbLSB78P.d.ts +0 -235
  75. package/dist/CapsuleBlueprint-DfV8XBEZ.d.cts +0 -1001
  76. package/dist/CapsuleBlueprint-DfV8XBEZ.d.ts +0 -1001
  77. package/dist/CapsuleBlueprint-DiG1FUoM.d.cts +0 -757
  78. package/dist/CapsuleBlueprint-DiG1FUoM.d.ts +0 -757
  79. package/dist/CapsuleBlueprint-DvdeHC13.d.cts +0 -289
  80. package/dist/CapsuleBlueprint-DvdeHC13.d.ts +0 -289
  81. package/dist/CapsuleBlueprint-DvinXyHp.d.cts +0 -342
  82. package/dist/CapsuleBlueprint-DvinXyHp.d.ts +0 -342
  83. package/dist/CapsuleBlueprint-DwW8YOJg.d.cts +0 -925
  84. package/dist/CapsuleBlueprint-DwW8YOJg.d.ts +0 -925
  85. package/dist/CapsuleBlueprint-E069msDY.d.cts +0 -310
  86. package/dist/CapsuleBlueprint-E069msDY.d.ts +0 -310
  87. package/dist/CapsuleBlueprint-LECoxlXA.d.cts +0 -497
  88. package/dist/CapsuleBlueprint-LECoxlXA.d.ts +0 -497
  89. package/dist/CapsuleBlueprint-V9pDg6lh.d.cts +0 -247
  90. package/dist/CapsuleBlueprint-V9pDg6lh.d.ts +0 -247
  91. package/dist/CapsuleBlueprint-bOLrWbIc.d.cts +0 -858
  92. package/dist/CapsuleBlueprint-bOLrWbIc.d.ts +0 -858
  93. package/dist/CapsuleBlueprint-if_tP8K8.d.cts +0 -1022
  94. package/dist/CapsuleBlueprint-if_tP8K8.d.ts +0 -1022
  95. package/dist/CapsuleBlueprint-pP0Ima0I.d.cts +0 -768
  96. package/dist/CapsuleBlueprint-pP0Ima0I.d.ts +0 -768
  97. package/dist/CapsuleBlueprint-w82xP6zg.d.cts +0 -222
  98. package/dist/CapsuleBlueprint-w82xP6zg.d.ts +0 -222
  99. package/dist/CapsuleBlueprint-wdlxOX4L.d.cts +0 -472
  100. package/dist/CapsuleBlueprint-wdlxOX4L.d.ts +0 -472
  101. package/dist/CapsuleBlueprint-wxqu6jA3.d.cts +0 -529
  102. package/dist/CapsuleBlueprint-wxqu6jA3.d.ts +0 -529
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",
@@ -21517,27 +21526,54 @@ var PageHeader = ({
21517
21526
  center,
21518
21527
  end,
21519
21528
  children,
21529
+ variant = "default",
21530
+ accentColor = "blue",
21531
+ padding,
21532
+ paddingTop,
21533
+ paddingRight,
21534
+ paddingBottom,
21535
+ paddingLeft,
21536
+ corner = DEFAULT_SURFACE_CORNER,
21520
21537
  className = "",
21521
21538
  ...rest
21522
- }) => /* @__PURE__ */ jsxs97(
21523
- "header",
21524
- {
21525
- ...rest,
21526
- className: classNames51(
21527
- "flex w-full items-center justify-between gap-4 border-b px-5",
21528
- SIDE_MENU_HEADER_HEIGHT,
21529
- SIDE_MENU_HEADER_FILL,
21530
- SIDE_MENU_HEADER_SEAM,
21531
- className
21532
- ),
21533
- children: [
21534
- /* @__PURE__ */ jsx201("div", { className: GROUP_CLASS2, children: start }),
21535
- /* @__PURE__ */ jsx201("div", { className: GROUP_CLASS2, children: center }),
21536
- /* @__PURE__ */ jsx201("div", { className: GROUP_CLASS2, children: end }),
21537
- children != null && /* @__PURE__ */ jsx201("div", { className: GROUP_CLASS2, children })
21538
- ]
21539
- }
21540
- );
21539
+ }) => {
21540
+ const surface = variant === "default" ? null : getSidebarSurfaceTokens(variant, accentColor);
21541
+ const pair = surface ? "xs" : "none";
21542
+ const gutter = {
21543
+ top: paddingTop ?? padding ?? pair,
21544
+ right: paddingRight ?? padding ?? pair,
21545
+ bottom: paddingBottom ?? padding ?? "none",
21546
+ left: paddingLeft ?? padding ?? "none"
21547
+ };
21548
+ return /* @__PURE__ */ jsxs97(
21549
+ "header",
21550
+ {
21551
+ ...rest,
21552
+ className: classNames51(
21553
+ "flex w-full items-center justify-between gap-4 px-5",
21554
+ SIDE_MENU_HEADER_HEIGHT,
21555
+ getSurfaceGutterClass("top", gutter.top),
21556
+ getSurfaceGutterClass("right", gutter.right),
21557
+ getSurfaceGutterClass("bottom", gutter.bottom),
21558
+ getSurfaceGutterClass("left", gutter.left),
21559
+ getSurfaceCornerClass(corner),
21560
+ surface ? classNames51(
21561
+ "border",
21562
+ surface.border,
21563
+ surface.shadow,
21564
+ surface.fill
21565
+ ) : classNames51("border-b", SIDE_MENU_HEADER_FILL, SIDE_MENU_HEADER_SEAM),
21566
+ className
21567
+ ),
21568
+ children: [
21569
+ /* @__PURE__ */ jsx201("div", { className: GROUP_CLASS2, children: start }),
21570
+ /* @__PURE__ */ jsx201("div", { className: GROUP_CLASS2, children: center }),
21571
+ /* @__PURE__ */ jsx201("div", { className: GROUP_CLASS2, children: end }),
21572
+ children != null && /* @__PURE__ */ jsx201("div", { className: GROUP_CLASS2, children })
21573
+ ]
21574
+ }
21575
+ );
21576
+ };
21541
21577
  PageHeader.displayName = "PageHeader";
21542
21578
  var PageHeader_default = PageHeader;
21543
21579
 
@@ -42312,7 +42348,8 @@ var SideMenu = ({
42312
42348
  const hasVisibleLink = visibleItems2.some(
42313
42349
  (item) => item.type !== "group" && item.type !== "divider"
42314
42350
  );
42315
- const heightClass = fullHeight ? "h-full" : "sticky top-16 h-[calc(100vh-64px)]";
42351
+ const detached = Boolean(surface.offset);
42352
+ const heightClass = fullHeight ? detached ? "h-[calc(100%-1rem)]" : "h-full" : detached ? "sticky top-16 h-[calc(100vh-64px-1rem)]" : "sticky top-16 h-[calc(100vh-64px)]";
42316
42353
  const isLeft = side === "left";
42317
42354
  const isHoverMode = openOnHover && !isMobile;
42318
42355
  const borderClasses = surface.border ? `${surface.border} ${surface.borderSides === "all" ? "border" : isLeft ? "border-r" : "border-l"}` : "";
@@ -42485,48 +42522,56 @@ var SideMenu = ({
42485
42522
  ]
42486
42523
  }
42487
42524
  ),
42488
- /* @__PURE__ */ jsx257("div", { className: `flex-1 px-3 py-1 overflow-y-auto w-full ${THIN_SCROLLBAR}`, children: /* @__PURE__ */ jsxs145("nav", { "aria-label": title || "Side menu", className: "space-y-1 w-full", children: [
42489
- visibleItems2.map((item, index) => {
42490
- if (item.type === "divider") {
42491
- return /* @__PURE__ */ jsx257(
42492
- "div",
42493
- {
42494
- className: `my-2 border-t ${surface.divider} ${contentCollapsed2 && !isMobileView ? "mx-1" : "mx-0"}`
42495
- },
42496
- `divider-${index}-${item.slug}`
42497
- );
42498
- }
42499
- if (item.type === "group") {
42500
- if (contentCollapsed2 && !isMobileView) return null;
42501
- return /* @__PURE__ */ jsxs145(React59.Fragment, { children: [
42502
- item.hasDivider && /* @__PURE__ */ jsx257(
42503
- "div",
42504
- {
42505
- className: `my-2 border-t ${surface.divider} ${contentCollapsed2 && !isMobileView ? "mx-1" : "mx-0"}`
42506
- }
42507
- ),
42508
- /* @__PURE__ */ jsx257(
42509
- "div",
42510
- {
42511
- className: `px-3 py-1 mb-1 text-xs font-semibold uppercase tracking-wider ${surface.muted} ${index === 0 ? "mt-1" : "mt-4"}`,
42512
- children: item.label
42513
- }
42514
- )
42515
- ] }, `group-${index}-${item.slug}`);
42516
- }
42517
- return renderLinkRow(
42518
- item,
42519
- 0,
42520
- `link-${index}-${item.slug}`,
42521
- contentCollapsed2
42522
- );
42523
- }),
42524
- searchActive && !hasVisibleLink && /* @__PURE__ */ jsxs145("p", { className: `px-3 py-6 text-center text-xs ${surface.muted}`, children: [
42525
- 'No results for "',
42526
- searchQuery.trim(),
42527
- '"'
42528
- ] })
42529
- ] }) }),
42525
+ /* @__PURE__ */ jsx257(
42526
+ ScrollArea_default,
42527
+ {
42528
+ variant: "hover",
42529
+ className: "flex-1 w-full",
42530
+ contentClassName: "px-3 py-1",
42531
+ children: /* @__PURE__ */ jsxs145("nav", { "aria-label": title || "Side menu", className: "space-y-1 w-full", children: [
42532
+ visibleItems2.map((item, index) => {
42533
+ if (item.type === "divider") {
42534
+ return /* @__PURE__ */ jsx257(
42535
+ "div",
42536
+ {
42537
+ className: `my-2 border-t ${surface.divider} ${contentCollapsed2 && !isMobileView ? "mx-1" : "mx-0"}`
42538
+ },
42539
+ `divider-${index}-${item.slug}`
42540
+ );
42541
+ }
42542
+ if (item.type === "group") {
42543
+ if (contentCollapsed2 && !isMobileView) return null;
42544
+ return /* @__PURE__ */ jsxs145(React59.Fragment, { children: [
42545
+ item.hasDivider && /* @__PURE__ */ jsx257(
42546
+ "div",
42547
+ {
42548
+ className: `my-2 border-t ${surface.divider} ${contentCollapsed2 && !isMobileView ? "mx-1" : "mx-0"}`
42549
+ }
42550
+ ),
42551
+ /* @__PURE__ */ jsx257(
42552
+ "div",
42553
+ {
42554
+ className: `px-3 py-1 mb-1 text-xs font-semibold uppercase tracking-wider ${surface.muted} ${index === 0 ? "mt-1" : "mt-4"}`,
42555
+ children: item.label
42556
+ }
42557
+ )
42558
+ ] }, `group-${index}-${item.slug}`);
42559
+ }
42560
+ return renderLinkRow(
42561
+ item,
42562
+ 0,
42563
+ `link-${index}-${item.slug}`,
42564
+ contentCollapsed2
42565
+ );
42566
+ }),
42567
+ searchActive && !hasVisibleLink && /* @__PURE__ */ jsxs145("p", { className: `px-3 py-6 text-center text-xs ${surface.muted}`, children: [
42568
+ 'No results for "',
42569
+ searchQuery.trim(),
42570
+ '"'
42571
+ ] })
42572
+ ] })
42573
+ }
42574
+ ),
42530
42575
  footerItem && /* @__PURE__ */ jsx257("div", { className: "shrink-0 px-3 pb-1", children: /* @__PURE__ */ jsx257(
42531
42576
  SideMenuDropdownRow,
42532
42577
  {
@@ -59820,12 +59865,16 @@ var TreeView = ({
59820
59865
  var TreeView_default = TreeView;
59821
59866
 
59822
59867
  // src/components/WorkflowTracker/WorkflowTracker.tsx
59823
- import { useMemo as useMemo51 } from "react";
59824
- import classNames113 from "classnames";
59868
+ import { useMemo as useMemo56 } from "react";
59869
+ import classNames119 from "classnames";
59870
+
59871
+ // src/components/WorkflowTracker/WorkflowTrackerRail.tsx
59872
+ import { useMemo as useMemo52 } from "react";
59873
+ import classNames112 from "classnames";
59825
59874
 
59826
59875
  // src/components/WorkflowTracker/WorkflowTimeline.tsx
59827
59876
  import React87 from "react";
59828
- import classNames110 from "classnames";
59877
+ import classNames111 from "classnames";
59829
59878
 
59830
59879
  // src/components/WorkflowTracker/WorkflowSkeleton.tsx
59831
59880
  import classNames107 from "classnames";
@@ -60114,34 +60163,73 @@ var WorkflowStatusNode = ({
60114
60163
  };
60115
60164
  var WorkflowStatusNode_default = WorkflowStatusNode;
60116
60165
 
60117
- // src/components/WorkflowTracker/parts.tsx
60166
+ // src/components/WorkflowTracker/WorkflowQuickActions.tsx
60118
60167
  import classNames109 from "classnames";
60119
- import { jsx as jsx298, jsxs as jsxs181 } from "react/jsx-runtime";
60168
+ import { jsx as jsx298 } from "react/jsx-runtime";
60169
+ var WorkflowQuickActions = ({
60170
+ stepId,
60171
+ actions,
60172
+ palette,
60173
+ groupLabel,
60174
+ onAction,
60175
+ className,
60176
+ style
60177
+ }) => {
60178
+ if (!onAction || actions.length === 0) return null;
60179
+ return /* @__PURE__ */ jsx298(
60180
+ "div",
60181
+ {
60182
+ role: "group",
60183
+ "aria-label": groupLabel,
60184
+ className: classNames109("flex flex-wrap gap-1.5", className),
60185
+ style,
60186
+ children: actions.map((action) => /* @__PURE__ */ jsx298(
60187
+ Button_default,
60188
+ {
60189
+ size: "xs",
60190
+ weight: "medium",
60191
+ variant: action.variant ?? "soft",
60192
+ color: action.tone ?? palette.accent,
60193
+ leadingIcon: action.leadingIcon,
60194
+ disabled: action.disabled,
60195
+ onClick: () => onAction(stepId, action.id),
60196
+ children: action.label
60197
+ },
60198
+ action.id
60199
+ ))
60200
+ }
60201
+ );
60202
+ };
60203
+ var WorkflowQuickActions_default = WorkflowQuickActions;
60204
+
60205
+ // src/components/WorkflowTracker/parts.tsx
60206
+ import classNames110 from "classnames";
60207
+ import { jsx as jsx299, jsxs as jsxs181 } from "react/jsx-runtime";
60120
60208
  var resolve = (surfaces) => surfaces ?? getSurfaceTokens(false);
60121
60209
  var WorkflowPlaceholder = ({ title, subtitle, palette, surfaces, className }) => /* @__PURE__ */ jsxs181(
60122
60210
  "div",
60123
60211
  {
60124
- className: classNames109(
60212
+ className: classNames110(
60125
60213
  "flex flex-col items-center justify-center gap-3 px-6 py-10 text-center",
60126
60214
  className
60127
60215
  ),
60128
60216
  children: [
60129
- /* @__PURE__ */ jsx298(WorkflowStatusNode_default, { status: "not_started", palette, size: "lg" }),
60217
+ /* @__PURE__ */ jsx299(WorkflowStatusNode_default, { status: "not_started", palette, size: "lg" }),
60130
60218
  /* @__PURE__ */ jsxs181("div", { className: "space-y-1", children: [
60131
- /* @__PURE__ */ jsx298(
60219
+ /* @__PURE__ */ jsx299(
60132
60220
  "p",
60133
60221
  {
60134
- className: classNames109(
60222
+ className: classNames110(
60135
60223
  "text-sm font-semibold",
60136
60224
  resolve(surfaces).mutedText
60137
60225
  ),
60138
60226
  children: title
60139
60227
  }
60140
60228
  ),
60141
- subtitle && /* @__PURE__ */ jsx298(
60229
+ subtitle && /* @__PURE__ */ jsx299(
60142
60230
  "p",
60143
60231
  {
60144
- className: classNames109(
60232
+ className: classNames110(
60145
60233
  "max-w-xs text-xs leading-5",
60146
60234
  resolve(surfaces).faintText
60147
60235
  ),
@@ -60152,10 +60240,10 @@ var WorkflowPlaceholder = ({ title, subtitle, palette, surfaces, className }) =>
60152
60240
  ]
60153
60241
  }
60154
60242
  );
60155
- var SectionTitle = ({ children, surfaces, className }) => /* @__PURE__ */ jsx298(
60243
+ var SectionTitle = ({ children, surfaces, className }) => /* @__PURE__ */ jsx299(
60156
60244
  "span",
60157
60245
  {
60158
- className: classNames109(
60246
+ className: classNames110(
60159
60247
  "text-[10px] font-semibold uppercase tracking-widest",
60160
60248
  resolve(surfaces).faintText,
60161
60249
  className
@@ -60163,7 +60251,7 @@ var SectionTitle = ({ children, surfaces, className }) => /* @__PURE__ */ jsx298
60163
60251
  children
60164
60252
  }
60165
60253
  );
60166
- var SectionMeta = ({ children, surfaces, className }) => /* @__PURE__ */ jsx298("span", { className: classNames109("text-xs", resolve(surfaces).mutedText, className), children });
60254
+ var SectionMeta = ({ children, surfaces, className }) => /* @__PURE__ */ jsx299("span", { className: classNames110("text-xs", resolve(surfaces).mutedText, className), children });
60167
60255
  var WorkflowBadge = ({
60168
60256
  children,
60169
60257
  status,
@@ -60171,14 +60259,14 @@ var WorkflowBadge = ({
60171
60259
  tone
60172
60260
  }) => {
60173
60261
  const tokens = getStatusTokens(status, palette);
60174
- return /* @__PURE__ */ jsx298(
60262
+ return /* @__PURE__ */ jsx299(
60175
60263
  Pill_default,
60176
60264
  {
60177
60265
  size: "xs",
60178
60266
  uppercase: true,
60179
60267
  tone: tone ?? tokens.pillTone,
60180
60268
  variant: "outline",
60181
- className: classNames109(
60269
+ className: classNames110(
60182
60270
  "shrink-0 font-medium",
60183
60271
  tone ? `bg-${tone}-100 dark:bg-${tone}-900` : tokens.pillFill
60184
60272
  ),
@@ -60187,16 +60275,16 @@ var WorkflowBadge = ({
60187
60275
  );
60188
60276
  };
60189
60277
  var MetaField = ({ label, value, surfaces }) => /* @__PURE__ */ jsxs181("div", { className: "min-w-0", children: [
60190
- /* @__PURE__ */ jsx298(SectionTitle, { surfaces, children: label }),
60191
- /* @__PURE__ */ jsx298("p", { className: "mt-1 text-sm font-medium text-neutral-800 dark:text-neutral-100", children: value })
60278
+ /* @__PURE__ */ jsx299(SectionTitle, { surfaces, children: label }),
60279
+ /* @__PURE__ */ jsx299("p", { className: "mt-1 text-sm font-medium text-neutral-800 dark:text-neutral-100", children: value })
60192
60280
  ] });
60193
60281
  var Tally = ({ count, label, surfaces }) => /* @__PURE__ */ jsxs181("span", { className: "inline-flex items-center gap-1", children: [
60194
- /* @__PURE__ */ jsx298("span", { className: "font-semibold text-neutral-900 dark:text-white", children: count }),
60195
- /* @__PURE__ */ jsx298("span", { className: resolve(surfaces).mutedText, children: label })
60282
+ /* @__PURE__ */ jsx299("span", { className: "font-semibold text-neutral-900 dark:text-white", children: count }),
60283
+ /* @__PURE__ */ jsx299("span", { className: resolve(surfaces).mutedText, children: label })
60196
60284
  ] });
60197
60285
 
60198
60286
  // src/components/WorkflowTracker/WorkflowTimeline.tsx
60199
- import { Fragment as Fragment46, jsx as jsx299, jsxs as jsxs182 } from "react/jsx-runtime";
60287
+ import { Fragment as Fragment46, jsx as jsx300, jsxs as jsxs182 } from "react/jsx-runtime";
60200
60288
  var CONNECTOR_LEFT = 9;
60201
60289
  var CONNECTOR_TOP = 24;
60202
60290
  var NESTED_INDENT = 32;
@@ -60214,16 +60302,16 @@ var NestedSubSteps = ({
60214
60302
  palette,
60215
60303
  surfaces,
60216
60304
  onSubStepSelect
60217
- }) => /* @__PURE__ */ jsx299(
60305
+ }) => /* @__PURE__ */ jsx300(
60218
60306
  "div",
60219
60307
  {
60220
- className: classNames110("mt-3 rounded-lg p-3", surfaces.nestedBox),
60308
+ className: classNames111("mt-3 rounded-lg p-3", surfaces.nestedBox),
60221
60309
  style: { marginLeft: NESTED_INDENT },
60222
- children: /* @__PURE__ */ jsx299("ul", { className: "space-y-2.5", children: subSteps.map((subStep) => {
60310
+ children: /* @__PURE__ */ jsx300("ul", { className: "space-y-2.5", children: subSteps.map((subStep) => {
60223
60311
  const status = normalizeStatus(subStep.status);
60224
60312
  const isActive = status === "running" || status === "in_progress";
60225
60313
  const content = /* @__PURE__ */ jsxs182(Fragment46, { children: [
60226
- /* @__PURE__ */ jsx299(
60314
+ /* @__PURE__ */ jsx300(
60227
60315
  WorkflowStatusNode_default,
60228
60316
  {
60229
60317
  status,
@@ -60231,10 +60319,10 @@ var NestedSubSteps = ({
60231
60319
  size: "sm"
60232
60320
  }
60233
60321
  ),
60234
- /* @__PURE__ */ jsx299(
60322
+ /* @__PURE__ */ jsx300(
60235
60323
  "span",
60236
60324
  {
60237
- className: classNames110(
60325
+ className: classNames111(
60238
60326
  "text-sm",
60239
60327
  isActive ? "font-semibold text-neutral-900 dark:text-white" : "text-neutral-600 dark:text-neutral-300"
60240
60328
  ),
@@ -60242,7 +60330,7 @@ var NestedSubSteps = ({
60242
60330
  }
60243
60331
  )
60244
60332
  ] });
60245
- return /* @__PURE__ */ jsx299("li", { children: onSubStepSelect ? /* @__PURE__ */ jsx299(
60333
+ return /* @__PURE__ */ jsx300("li", { children: onSubStepSelect ? /* @__PURE__ */ jsx300(
60246
60334
  "button",
60247
60335
  {
60248
60336
  type: "button",
@@ -60250,7 +60338,7 @@ var NestedSubSteps = ({
60250
60338
  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",
60251
60339
  children: content
60252
60340
  }
60253
- ) : /* @__PURE__ */ jsx299("div", { className: "flex items-center gap-2.5", children: content }) }, subStep.id);
60341
+ ) : /* @__PURE__ */ jsx300("div", { className: "flex items-center gap-2.5", children: content }) }, subStep.id);
60254
60342
  }) })
60255
60343
  }
60256
60344
  );
@@ -60267,10 +60355,11 @@ var WorkflowTimeline = ({
60267
60355
  loadingRows,
60268
60356
  emptyState,
60269
60357
  onStepSelect,
60270
- onSubStepSelect
60358
+ onSubStepSelect,
60359
+ onStepAction
60271
60360
  }) => {
60272
60361
  if (loading) {
60273
- return /* @__PURE__ */ jsx299(WorkflowRailSkeleton, { rows: loadingRows });
60362
+ return /* @__PURE__ */ jsx300(WorkflowRailSkeleton, { rows: loadingRows });
60274
60363
  }
60275
60364
  const isEmpty2 = steps.length === 0;
60276
60365
  const tallyEntries = [
@@ -60280,18 +60369,18 @@ var WorkflowTimeline = ({
60280
60369
  { count: tallies.remaining, label: labels.remaining }
60281
60370
  ].filter((entry) => entry.count > 0);
60282
60371
  return /* @__PURE__ */ jsxs182("div", { className: "flex flex-col", children: [
60283
- !isEmpty2 && /* @__PURE__ */ jsxs182("div", { className: classNames110("border-b px-5 pb-4 pt-5", surfaces.border), children: [
60372
+ !isEmpty2 && /* @__PURE__ */ jsxs182("div", { className: classNames111("border-b px-5 pb-4 pt-5", surfaces.border), children: [
60284
60373
  /* @__PURE__ */ jsxs182("div", { className: "flex items-baseline justify-between gap-3", children: [
60285
- /* @__PURE__ */ jsx299(SectionTitle, { surfaces, children: labels.progress }),
60374
+ /* @__PURE__ */ jsx300(SectionTitle, { surfaces, children: labels.progress }),
60286
60375
  /* @__PURE__ */ jsxs182("span", { className: "text-sm font-semibold text-neutral-900 dark:text-white", children: [
60287
60376
  progress,
60288
60377
  "%"
60289
60378
  ] })
60290
60379
  ] }),
60291
- /* @__PURE__ */ jsx299(
60380
+ /* @__PURE__ */ jsx300(
60292
60381
  Progress_default,
60293
60382
  {
60294
- className: classNames110(
60383
+ className: classNames111(
60295
60384
  "mt-2",
60296
60385
  surfaces.translucent ? "bg-white/40 dark:bg-white/15" : "bg-neutral-200 dark:bg-neutral-700"
60297
60386
  ),
@@ -60301,8 +60390,8 @@ var WorkflowTimeline = ({
60301
60390
  motion: "none"
60302
60391
  }
60303
60392
  ),
60304
- tallyEntries.length > 0 && /* @__PURE__ */ jsx299("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: [
60305
- index > 0 && /* @__PURE__ */ jsx299(
60393
+ 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: [
60394
+ index > 0 && /* @__PURE__ */ jsx300(
60306
60395
  "span",
60307
60396
  {
60308
60397
  "aria-hidden": "true",
@@ -60310,7 +60399,7 @@ var WorkflowTimeline = ({
60310
60399
  children: "\xB7"
60311
60400
  }
60312
60401
  ),
60313
- /* @__PURE__ */ jsx299(
60402
+ /* @__PURE__ */ jsx300(
60314
60403
  Tally,
60315
60404
  {
60316
60405
  count: entry.count,
@@ -60320,7 +60409,7 @@ var WorkflowTimeline = ({
60320
60409
  )
60321
60410
  ] }, entry.label)) })
60322
60411
  ] }),
60323
- /* @__PURE__ */ jsx299("div", { className: classNames110(isEmpty2 ? "" : "px-5 py-5"), children: isEmpty2 ? emptyState ?? /* @__PURE__ */ jsx299(
60412
+ /* @__PURE__ */ jsx300("div", { className: classNames111(isEmpty2 ? "" : "px-5 py-5"), children: isEmpty2 ? emptyState ?? /* @__PURE__ */ jsx300(
60324
60413
  WorkflowPlaceholder,
60325
60414
  {
60326
60415
  title: labels.empty,
@@ -60328,14 +60417,14 @@ var WorkflowTimeline = ({
60328
60417
  palette,
60329
60418
  surfaces
60330
60419
  }
60331
- ) : /* @__PURE__ */ jsx299("ol", { className: "m-0 list-none p-0", children: steps.map((step, index) => {
60420
+ ) : /* @__PURE__ */ jsx300("ol", { className: "m-0 list-none p-0", children: steps.map((step, index) => {
60332
60421
  const status = normalizeStatus(step.status);
60333
60422
  const tokens = getStatusTokens(status, palette);
60334
60423
  const isActive = step.id === activeStepId;
60335
60424
  const isLast = index === steps.length - 1;
60336
60425
  const nested = isActive && step.subSteps && step.subSteps.length > 0 ? step.subSteps : void 0;
60337
60426
  const rowContent = /* @__PURE__ */ jsxs182(Fragment46, { children: [
60338
- /* @__PURE__ */ jsx299(
60427
+ /* @__PURE__ */ jsx300(
60339
60428
  WorkflowStatusNode_default,
60340
60429
  {
60341
60430
  status,
@@ -60345,17 +60434,17 @@ var WorkflowTimeline = ({
60345
60434
  ),
60346
60435
  /* @__PURE__ */ jsxs182("div", { className: "min-w-0 flex-1", children: [
60347
60436
  /* @__PURE__ */ jsxs182("div", { className: "flex flex-wrap items-center gap-2", children: [
60348
- /* @__PURE__ */ jsx299(
60437
+ /* @__PURE__ */ jsx300(
60349
60438
  "span",
60350
60439
  {
60351
- className: classNames110(
60440
+ className: classNames111(
60352
60441
  "text-sm",
60353
60442
  isActive ? "font-semibold text-neutral-900 dark:text-white" : "font-medium text-neutral-700 dark:text-neutral-200"
60354
60443
  ),
60355
60444
  children: step.label
60356
60445
  }
60357
60446
  ),
60358
- step.badge && /* @__PURE__ */ jsx299(
60447
+ step.badge && /* @__PURE__ */ jsx300(
60359
60448
  WorkflowBadge,
60360
60449
  {
60361
60450
  status,
@@ -60365,10 +60454,10 @@ var WorkflowTimeline = ({
60365
60454
  }
60366
60455
  )
60367
60456
  ] }),
60368
- step.meta && /* @__PURE__ */ jsx299(
60457
+ step.meta && /* @__PURE__ */ jsx300(
60369
60458
  "p",
60370
60459
  {
60371
- className: classNames110(
60460
+ className: classNames111(
60372
60461
  "mt-1 text-xs leading-5",
60373
60462
  surfaces.mutedText
60374
60463
  ),
@@ -60380,21 +60469,21 @@ var WorkflowTimeline = ({
60380
60469
  return /* @__PURE__ */ jsxs182(
60381
60470
  "li",
60382
60471
  {
60383
- className: classNames110("relative", !isLast && "pb-5"),
60472
+ className: classNames111("relative", !isLast && "pb-5"),
60384
60473
  "aria-current": isActive ? "step" : void 0,
60385
60474
  children: [
60386
- !isLast && /* @__PURE__ */ jsx299(
60475
+ !isLast && /* @__PURE__ */ jsx300(
60387
60476
  "span",
60388
60477
  {
60389
60478
  "aria-hidden": "true",
60390
- className: classNames110(
60479
+ className: classNames111(
60391
60480
  "absolute bottom-0",
60392
60481
  tokens.connectorDashed ? `border-l-2 border-dashed ${tokens.connector}` : `w-0.5 rounded-full ${tokens.connector}`
60393
60482
  ),
60394
60483
  style: { left: CONNECTOR_LEFT, top: CONNECTOR_TOP }
60395
60484
  }
60396
60485
  ),
60397
- onStepSelect ? /* @__PURE__ */ jsx299(
60486
+ onStepSelect ? /* @__PURE__ */ jsx300(
60398
60487
  "button",
60399
60488
  {
60400
60489
  type: "button",
@@ -60402,8 +60491,19 @@ var WorkflowTimeline = ({
60402
60491
  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",
60403
60492
  children: rowContent
60404
60493
  }
60405
- ) : /* @__PURE__ */ jsx299("div", { className: "flex items-start gap-3", children: rowContent }),
60406
- nested && /* @__PURE__ */ jsx299(
60494
+ ) : /* @__PURE__ */ jsx300("div", { className: "flex items-start gap-3", children: rowContent }),
60495
+ /* @__PURE__ */ jsx300(
60496
+ WorkflowQuickActions_default,
60497
+ {
60498
+ stepId: step.id,
60499
+ actions: step.actions ?? [],
60500
+ palette,
60501
+ groupLabel: labels.quickActions,
60502
+ onAction: onStepAction,
60503
+ className: "ml-8 mt-2"
60504
+ }
60505
+ ),
60506
+ nested && /* @__PURE__ */ jsx300(
60407
60507
  NestedSubSteps,
60408
60508
  {
60409
60509
  stepId: step.id,
@@ -60418,8 +60518,8 @@ var WorkflowTimeline = ({
60418
60518
  step.id
60419
60519
  );
60420
60520
  }) }) }),
60421
- showLegend && !isEmpty2 && /* @__PURE__ */ jsx299("div", { className: classNames110("mt-auto border-t px-5 py-4", surfaces.border), children: /* @__PURE__ */ jsx299("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: [
60422
- /* @__PURE__ */ jsx299(
60521
+ 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: [
60522
+ /* @__PURE__ */ jsx300(
60423
60523
  WorkflowStatusNode_default,
60424
60524
  {
60425
60525
  status,
@@ -60427,14 +60527,92 @@ var WorkflowTimeline = ({
60427
60527
  size: "sm"
60428
60528
  }
60429
60529
  ),
60430
- /* @__PURE__ */ jsx299("span", { className: classNames110("text-xs", surfaces.mutedText), children: labels.statuses[status] })
60530
+ /* @__PURE__ */ jsx300("span", { className: classNames111("text-xs", surfaces.mutedText), children: labels.statuses[status] })
60431
60531
  ] }, status)) }) })
60432
60532
  ] });
60433
60533
  };
60434
60534
  var WorkflowTimeline_default = WorkflowTimeline;
60435
60535
 
60436
- // src/components/WorkflowTracker/WorkflowDetailPanel.tsx
60437
- import classNames111 from "classnames";
60536
+ // src/components/WorkflowTracker/chrome.ts
60537
+ import { useMemo as useMemo51 } from "react";
60538
+ var DEFAULT_LABELS = {
60539
+ progress: "Progress",
60540
+ done: "done",
60541
+ skipped: "skipped",
60542
+ flagged: "flagged",
60543
+ remaining: "remaining",
60544
+ step: "Step",
60545
+ of: "of",
60546
+ elapsed: "Elapsed",
60547
+ owner: "Owner",
60548
+ started: "Started",
60549
+ sla: "SLA",
60550
+ subSteps: "Sub-steps",
60551
+ accepted: "accepted",
60552
+ open: "open",
60553
+ needsAttention: "Needs attention",
60554
+ skippedSteps: "Skipped steps",
60555
+ live: "LIVE \xB7 read-only view",
60556
+ empty: "No steps yet",
60557
+ emptySubtitle: "Steps appear here as soon as the workflow starts.",
60558
+ noActiveStep: "No step selected",
60559
+ details: "Step details",
60560
+ quickActions: "Quick actions",
60561
+ statuses: {
60562
+ done: "Done",
60563
+ in_progress: "In progress",
60564
+ running: "Running",
60565
+ skipped: "Skipped",
60566
+ blocked: "Blocked",
60567
+ attention: "Attention",
60568
+ not_started: "Not started"
60569
+ }
60570
+ };
60571
+ var useWorkflowChrome = ({
60572
+ accentColor = "blue",
60573
+ attentionColor = "rose",
60574
+ blockedColor = "amber",
60575
+ mutedColor = "neutral",
60576
+ variant = "outlined",
60577
+ translucentSurfaces
60578
+ }) => {
60579
+ const translucent = translucentSurfaces ?? isTranslucentVariant(variant);
60580
+ const palette = useMemo51(
60581
+ () => ({
60582
+ accent: accentColor,
60583
+ attention: attentionColor,
60584
+ blocked: blockedColor,
60585
+ muted: mutedColor,
60586
+ translucent
60587
+ }),
60588
+ [accentColor, attentionColor, blockedColor, mutedColor, translucent]
60589
+ );
60590
+ const surfaces = useMemo51(() => getSurfaceTokens(translucent), [translucent]);
60591
+ return { translucent, palette, surfaces };
60592
+ };
60593
+ var resolveLabels = (labelOverrides) => labelOverrides ? {
60594
+ ...DEFAULT_LABELS,
60595
+ ...labelOverrides,
60596
+ statuses: { ...DEFAULT_LABELS.statuses, ...labelOverrides.statuses }
60597
+ } : DEFAULT_LABELS;
60598
+ var buildCardProps = ({
60599
+ variant = "outlined",
60600
+ cardTone = "neutral",
60601
+ corner = DEFAULT_SURFACE_CORNER,
60602
+ glassOpacity = "light",
60603
+ vibrancy,
60604
+ specularMode,
60605
+ padding = "none"
60606
+ }) => ({
60607
+ variant,
60608
+ tone: cardTone,
60609
+ corner,
60610
+ glassOpacity,
60611
+ vibrancy,
60612
+ specularMode,
60613
+ padding,
60614
+ scrollable: false
60615
+ });
60438
60616
 
60439
60617
  // src/components/WorkflowTracker/derive.ts
60440
60618
  var computeProgress = (steps) => {
@@ -60509,8 +60687,262 @@ var resolveActiveStep = (steps, activeStepId) => {
60509
60687
  return { step: steps[0], index: 1 };
60510
60688
  };
60511
60689
 
60690
+ // src/components/WorkflowTracker/sampleWorkflow.tsx
60691
+ import { jsx as jsx301, jsxs as jsxs183 } from "react/jsx-runtime";
60692
+ var sampleWorkflow = {
60693
+ eyebrow: "VENDOR ONBOARDING \xB7 REQ-4128",
60694
+ title: "Northwind Logistics GmbH",
60695
+ live: true,
60696
+ activeStepId: "security_questionnaire",
60697
+ steps: [
60698
+ {
60699
+ id: "request_submitted",
60700
+ label: "Request submitted",
60701
+ status: "done",
60702
+ meta: "2m"
60703
+ },
60704
+ {
60705
+ id: "duplicate_check",
60706
+ label: "Duplicate check",
60707
+ status: "skipped",
60708
+ badge: "Not needed",
60709
+ meta: "No match in registry"
60710
+ },
60711
+ {
60712
+ id: "business_verification",
60713
+ label: "Business verification",
60714
+ status: "done",
60715
+ meta: "12m \xB7 3 of 3 sub-steps"
60716
+ },
60717
+ {
60718
+ id: "sanctions_screening",
60719
+ label: "Sanctions screening",
60720
+ status: "done",
60721
+ meta: "4m"
60722
+ },
60723
+ {
60724
+ id: "tax_documents",
60725
+ label: "Tax documents",
60726
+ status: "skipped",
60727
+ badge: "Skipped",
60728
+ meta: "Skipped by M. Reyes \xB7 resume anytime"
60729
+ },
60730
+ {
60731
+ id: "insurance_certificates",
60732
+ label: "Insurance certificates",
60733
+ status: "attention",
60734
+ badge: "Needs attention",
60735
+ meta: "1h 06m \xB7 Liability certificate expired 12 Aug",
60736
+ details: /* @__PURE__ */ jsxs183("div", { className: "space-y-3 px-5 py-4 sm:px-6", children: [
60737
+ /* @__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." }),
60738
+ /* @__PURE__ */ jsx301("ul", { className: "flex flex-wrap gap-2", children: ["reminder-12-aug.pdf", "underwriter-quote.pdf"].map((file) => /* @__PURE__ */ jsx301(
60739
+ "li",
60740
+ {
60741
+ 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",
60742
+ children: file
60743
+ },
60744
+ file
60745
+ )) })
60746
+ ] }),
60747
+ actions: [
60748
+ { id: "review", label: "Review" },
60749
+ { id: "remind", label: "Remind vendor", tone: "amber" }
60750
+ ]
60751
+ },
60752
+ {
60753
+ id: "contract_drafting",
60754
+ label: "Contract drafting",
60755
+ status: "done",
60756
+ meta: "1h 10m"
60757
+ },
60758
+ {
60759
+ id: "security_questionnaire",
60760
+ label: "Security questionnaire",
60761
+ status: "in_progress",
60762
+ badge: "In progress",
60763
+ meta: "24m \xB7 3 of 6 sub-steps",
60764
+ elapsed: "24m",
60765
+ description: "Vendor is completing the long-form questionnaire. Each sub-step unlocks once its evidence file is accepted by the reviewer.",
60766
+ owner: "D. Okafor",
60767
+ startedAt: "19 Aug \xB7 09:12",
60768
+ sla: "Due in 6h",
60769
+ details: /* @__PURE__ */ jsxs183("div", { className: "space-y-5 px-5 py-4 sm:px-6", children: [
60770
+ /* @__PURE__ */ jsxs183("div", { children: [
60771
+ /* @__PURE__ */ jsx301("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Review activity" }),
60772
+ /* @__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." })
60773
+ ] }),
60774
+ /* @__PURE__ */ jsxs183("div", { children: [
60775
+ /* @__PURE__ */ jsx301("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Files received" }),
60776
+ /* @__PURE__ */ jsx301("ul", { className: "mt-2 flex flex-wrap gap-2", children: [
60777
+ "data-handling-v3.pdf",
60778
+ "pentest-2026.pdf",
60779
+ "soc2-typeii.pdf"
60780
+ ].map((file) => /* @__PURE__ */ jsx301(
60781
+ "li",
60782
+ {
60783
+ 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",
60784
+ children: file
60785
+ },
60786
+ file
60787
+ )) })
60788
+ ] }),
60789
+ /* @__PURE__ */ jsxs183("div", { children: [
60790
+ /* @__PURE__ */ jsx301("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Open findings" }),
60791
+ /* @__PURE__ */ jsxs183("ul", { className: "mt-2 space-y-2", children: [
60792
+ /* @__PURE__ */ jsxs183("li", { className: "flex items-start gap-2 text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: [
60793
+ /* @__PURE__ */ jsx301(
60794
+ "span",
60795
+ {
60796
+ "aria-hidden": "true",
60797
+ className: "mt-[9px] size-1.5 shrink-0 rounded-full bg-amber-400"
60798
+ }
60799
+ ),
60800
+ "Subprocessor \u201CCloudDot BV\u201D is not covered by the DPA yet"
60801
+ ] }),
60802
+ /* @__PURE__ */ jsxs183("li", { className: "flex items-start gap-2 text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: [
60803
+ /* @__PURE__ */ jsx301(
60804
+ "span",
60805
+ {
60806
+ "aria-hidden": "true",
60807
+ className: "mt-[9px] size-1.5 shrink-0 rounded-full bg-neutral-300 dark:bg-neutral-600"
60808
+ }
60809
+ ),
60810
+ "Waiting on the incident-contact annex"
60811
+ ] })
60812
+ ] })
60813
+ ] })
60814
+ ] }),
60815
+ subSteps: [
60816
+ {
60817
+ id: "data_handling",
60818
+ label: "Data handling policy",
60819
+ status: "done",
60820
+ badge: "Accepted",
60821
+ duration: "5m"
60822
+ },
60823
+ {
60824
+ id: "pentest",
60825
+ label: "Penetration test report",
60826
+ status: "done",
60827
+ badge: "Accepted",
60828
+ duration: "8m"
60829
+ },
60830
+ {
60831
+ id: "soc2",
60832
+ label: "SOC 2 Type II evidence",
60833
+ status: "done",
60834
+ badge: "Accepted",
60835
+ duration: "11m"
60836
+ },
60837
+ {
60838
+ id: "subprocessor_list",
60839
+ label: "Subprocessor list",
60840
+ status: "running",
60841
+ badge: "Running",
60842
+ note: "Vendor uploading \u2014 2 of 3 files received"
60843
+ },
60844
+ {
60845
+ id: "incident_response",
60846
+ label: "Incident response plan",
60847
+ status: "skipped",
60848
+ badge: "Skipped",
60849
+ note: "Covered by master agreement \xA77"
60850
+ },
60851
+ {
60852
+ id: "business_continuity",
60853
+ label: "Business continuity plan",
60854
+ status: "not_started"
60855
+ }
60856
+ ]
60857
+ },
60858
+ {
60859
+ id: "legal_review",
60860
+ label: "Legal review",
60861
+ status: "blocked",
60862
+ badge: "Blocked",
60863
+ meta: "Waiting on Legal \xB7 queued 2d",
60864
+ actions: [{ id: "nudge", label: "Nudge Legal", tone: "violet" }]
60865
+ },
60866
+ {
60867
+ id: "banking_details",
60868
+ label: "Banking details",
60869
+ status: "not_started"
60870
+ },
60871
+ {
60872
+ id: "system_provisioning",
60873
+ label: "System provisioning",
60874
+ status: "not_started"
60875
+ },
60876
+ { id: "go_live", label: "Go-live", status: "not_started" }
60877
+ ]
60878
+ };
60879
+
60880
+ // src/components/WorkflowTracker/WorkflowTrackerRail.tsx
60881
+ import { jsx as jsx302 } from "react/jsx-runtime";
60882
+ var WorkflowTrackerRail = ({
60883
+ data = sampleWorkflow,
60884
+ loading = false,
60885
+ loadingRows = 6,
60886
+ showLegend = true,
60887
+ emptyState,
60888
+ labels: labelOverrides,
60889
+ cardClassName,
60890
+ cardScrollable,
60891
+ onStepSelect,
60892
+ onSubStepSelect,
60893
+ onStepAction,
60894
+ className,
60895
+ style,
60896
+ ...styleProps
60897
+ }) => {
60898
+ const steps = data?.steps ?? [];
60899
+ const { palette, surfaces } = useWorkflowChrome(styleProps);
60900
+ const labels = useMemo52(() => resolveLabels(labelOverrides), [labelOverrides]);
60901
+ const cardProps = buildCardProps(styleProps);
60902
+ const active = useMemo52(
60903
+ () => resolveActiveStep(steps, data?.activeStepId),
60904
+ [steps, data?.activeStepId]
60905
+ );
60906
+ const progress = useMemo52(() => computeProgress(steps), [steps]);
60907
+ const tallies = useMemo52(() => computeTallies(steps), [steps]);
60908
+ return /* @__PURE__ */ jsx302(
60909
+ Panel_default,
60910
+ {
60911
+ ...cardProps,
60912
+ scrollable: cardScrollable ?? false,
60913
+ className: classNames112(className, cardClassName),
60914
+ style,
60915
+ children: /* @__PURE__ */ jsx302(
60916
+ WorkflowTimeline_default,
60917
+ {
60918
+ steps,
60919
+ activeStepId: active?.step.id,
60920
+ palette,
60921
+ surfaces,
60922
+ labels,
60923
+ progress,
60924
+ tallies,
60925
+ showLegend: showLegend && !loading,
60926
+ loading,
60927
+ loadingRows,
60928
+ emptyState,
60929
+ onStepSelect,
60930
+ onSubStepSelect,
60931
+ onStepAction
60932
+ }
60933
+ )
60934
+ }
60935
+ );
60936
+ };
60937
+ var WorkflowTrackerRail_default = WorkflowTrackerRail;
60938
+
60939
+ // src/components/WorkflowTracker/WorkflowTrackerStepDetails.tsx
60940
+ import { useMemo as useMemo53 } from "react";
60941
+ import classNames114 from "classnames";
60942
+
60512
60943
  // src/components/WorkflowTracker/WorkflowDetailPanel.tsx
60513
- import { Fragment as Fragment47, jsx as jsx300, jsxs as jsxs183 } from "react/jsx-runtime";
60944
+ import classNames113 from "classnames";
60945
+ import { Fragment as Fragment47, jsx as jsx303, jsxs as jsxs184 } from "react/jsx-runtime";
60514
60946
  var WorkflowDetailPanel = ({
60515
60947
  active,
60516
60948
  totalSteps,
@@ -60518,13 +60950,14 @@ var WorkflowDetailPanel = ({
60518
60950
  surfaces,
60519
60951
  labels,
60520
60952
  loading,
60521
- onSubStepSelect
60953
+ onSubStepSelect,
60954
+ onStepAction
60522
60955
  }) => {
60523
60956
  if (loading) {
60524
- return /* @__PURE__ */ jsx300(WorkflowDetailSkeleton, {});
60957
+ return /* @__PURE__ */ jsx303(WorkflowDetailSkeleton, {});
60525
60958
  }
60526
60959
  if (!active) {
60527
- return /* @__PURE__ */ jsx300(
60960
+ return /* @__PURE__ */ jsx303(
60528
60961
  WorkflowPlaceholder,
60529
60962
  {
60530
60963
  title: labels.noActiveStep,
@@ -60542,11 +60975,11 @@ var WorkflowDetailPanel = ({
60542
60975
  step.startedAt ? { label: labels.started, value: step.startedAt } : void 0,
60543
60976
  step.sla ? { label: labels.sla, value: step.sla } : void 0
60544
60977
  ].filter(Boolean);
60545
- return /* @__PURE__ */ jsxs183("div", { className: "flex flex-col", children: [
60546
- /* @__PURE__ */ jsxs183("div", { className: "px-5 pb-6 pt-5 sm:px-6", children: [
60547
- /* @__PURE__ */ jsxs183("div", { className: "flex flex-wrap items-center justify-between gap-x-4 gap-y-2", children: [
60548
- /* @__PURE__ */ jsxs183("div", { className: "flex flex-wrap items-center gap-3", children: [
60549
- /* @__PURE__ */ jsxs183(SectionTitle, { surfaces, children: [
60978
+ return /* @__PURE__ */ jsxs184("div", { className: "flex flex-col", children: [
60979
+ /* @__PURE__ */ jsxs184("div", { className: "px-5 pb-6 pt-5 sm:px-6", children: [
60980
+ /* @__PURE__ */ jsxs184("div", { className: "flex flex-wrap items-center justify-between gap-x-4 gap-y-2", children: [
60981
+ /* @__PURE__ */ jsxs184("div", { className: "flex flex-wrap items-center gap-3", children: [
60982
+ /* @__PURE__ */ jsxs184(SectionTitle, { surfaces, children: [
60550
60983
  labels.step,
60551
60984
  " ",
60552
60985
  index,
@@ -60555,7 +60988,7 @@ var WorkflowDetailPanel = ({
60555
60988
  " ",
60556
60989
  totalSteps
60557
60990
  ] }),
60558
- step.badge && /* @__PURE__ */ jsx300(
60991
+ step.badge && /* @__PURE__ */ jsx303(
60559
60992
  WorkflowBadge,
60560
60993
  {
60561
60994
  status,
@@ -60565,24 +60998,36 @@ var WorkflowDetailPanel = ({
60565
60998
  }
60566
60999
  )
60567
61000
  ] }),
60568
- step.elapsed && /* @__PURE__ */ jsxs183(SectionMeta, { surfaces, children: [
60569
- labels.elapsed,
60570
- " ",
60571
- step.elapsed
61001
+ /* @__PURE__ */ jsxs184("div", { className: "flex flex-wrap items-center justify-end gap-x-4 gap-y-2", children: [
61002
+ step.elapsed && /* @__PURE__ */ jsxs184(SectionMeta, { surfaces, children: [
61003
+ labels.elapsed,
61004
+ " ",
61005
+ step.elapsed
61006
+ ] }),
61007
+ /* @__PURE__ */ jsx303(
61008
+ WorkflowQuickActions_default,
61009
+ {
61010
+ stepId: step.id,
61011
+ actions: step.actions ?? [],
61012
+ palette,
61013
+ groupLabel: labels.quickActions,
61014
+ onAction: onStepAction
61015
+ }
61016
+ )
60572
61017
  ] })
60573
61018
  ] }),
60574
- /* @__PURE__ */ jsx300("h3", { className: "mt-3 text-xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-2xl", children: step.label }),
60575
- step.description && /* @__PURE__ */ jsx300(
61019
+ /* @__PURE__ */ jsx303("h3", { className: "mt-3 text-xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-2xl", children: step.label }),
61020
+ step.description && /* @__PURE__ */ jsx303(
60576
61021
  "p",
60577
61022
  {
60578
- className: classNames111(
61023
+ className: classNames113(
60579
61024
  "mt-2 max-w-3xl text-sm leading-6",
60580
61025
  surfaces.mutedText
60581
61026
  ),
60582
61027
  children: step.description
60583
61028
  }
60584
61029
  ),
60585
- metaFields.length > 0 && /* @__PURE__ */ jsx300("div", { className: "mt-5 flex flex-wrap gap-x-10 gap-y-4", children: metaFields.map((field) => /* @__PURE__ */ jsx300(
61030
+ metaFields.length > 0 && /* @__PURE__ */ jsx303("div", { className: "mt-5 flex flex-wrap gap-x-10 gap-y-4", children: metaFields.map((field) => /* @__PURE__ */ jsx303(
60586
61031
  MetaField,
60587
61032
  {
60588
61033
  label: field.label,
@@ -60592,18 +61037,18 @@ var WorkflowDetailPanel = ({
60592
61037
  field.label
60593
61038
  )) })
60594
61039
  ] }),
60595
- subSteps.length > 0 && /* @__PURE__ */ jsxs183(Fragment47, { children: [
60596
- /* @__PURE__ */ jsxs183(
61040
+ subSteps.length > 0 && /* @__PURE__ */ jsxs184(Fragment47, { children: [
61041
+ /* @__PURE__ */ jsxs184(
60597
61042
  "div",
60598
61043
  {
60599
- className: classNames111(
61044
+ className: classNames113(
60600
61045
  "flex flex-wrap items-center justify-between gap-2 border-y px-5 py-2.5 sm:px-6",
60601
61046
  surfaces.border,
60602
61047
  surfaces.strip
60603
61048
  ),
60604
61049
  children: [
60605
- /* @__PURE__ */ jsx300(SectionTitle, { surfaces, children: labels.subSteps }),
60606
- /* @__PURE__ */ jsxs183(SectionMeta, { surfaces, children: [
61050
+ /* @__PURE__ */ jsx303(SectionTitle, { surfaces, children: labels.subSteps }),
61051
+ /* @__PURE__ */ jsxs184(SectionMeta, { surfaces, children: [
60607
61052
  summary.accepted,
60608
61053
  " ",
60609
61054
  labels.accepted,
@@ -60619,24 +61064,24 @@ var WorkflowDetailPanel = ({
60619
61064
  ]
60620
61065
  }
60621
61066
  ),
60622
- /* @__PURE__ */ jsx300(
61067
+ /* @__PURE__ */ jsx303(
60623
61068
  "ul",
60624
61069
  {
60625
- className: classNames111(
61070
+ className: classNames113(
60626
61071
  "m-0 list-none divide-y p-0",
60627
61072
  surfaces.divider
60628
61073
  ),
60629
61074
  children: subSteps.map((subStep) => {
60630
61075
  const subStatus = normalizeStatus(subStep.status);
60631
61076
  const isRunning = subStatus === "running";
60632
- const rowContent = /* @__PURE__ */ jsxs183(Fragment47, { children: [
60633
- /* @__PURE__ */ jsx300(WorkflowStatusNode_default, { status: subStatus, palette }),
60634
- /* @__PURE__ */ jsxs183("div", { className: "min-w-0 flex-1", children: [
60635
- /* @__PURE__ */ jsx300("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: subStep.label }),
60636
- subStep.note && /* @__PURE__ */ jsx300(
61077
+ const rowContent = /* @__PURE__ */ jsxs184(Fragment47, { children: [
61078
+ /* @__PURE__ */ jsx303(WorkflowStatusNode_default, { status: subStatus, palette }),
61079
+ /* @__PURE__ */ jsxs184("div", { className: "min-w-0 flex-1", children: [
61080
+ /* @__PURE__ */ jsx303("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: subStep.label }),
61081
+ subStep.note && /* @__PURE__ */ jsx303(
60637
61082
  "p",
60638
61083
  {
60639
- className: classNames111(
61084
+ className: classNames113(
60640
61085
  "mt-0.5 text-xs leading-5",
60641
61086
  surfaces.mutedText
60642
61087
  ),
@@ -60644,7 +61089,7 @@ var WorkflowDetailPanel = ({
60644
61089
  }
60645
61090
  )
60646
61091
  ] }),
60647
- subStep.badge && /* @__PURE__ */ jsx300(
61092
+ subStep.badge && /* @__PURE__ */ jsx303(
60648
61093
  WorkflowBadge,
60649
61094
  {
60650
61095
  status: subStatus,
@@ -60653,10 +61098,10 @@ var WorkflowDetailPanel = ({
60653
61098
  children: subStep.badge
60654
61099
  }
60655
61100
  ),
60656
- /* @__PURE__ */ jsx300(
61101
+ /* @__PURE__ */ jsx303(
60657
61102
  "span",
60658
61103
  {
60659
- className: classNames111(
61104
+ className: classNames113(
60660
61105
  "w-10 shrink-0 text-right text-xs tabular-nums",
60661
61106
  surfaces.faintText
60662
61107
  ),
@@ -60664,22 +61109,22 @@ var WorkflowDetailPanel = ({
60664
61109
  }
60665
61110
  )
60666
61111
  ] });
60667
- const rowClasses = classNames111(
61112
+ const rowClasses = classNames113(
60668
61113
  "flex w-full items-center gap-3 px-5 py-3 text-left sm:px-6",
60669
61114
  isRunning && getRowHighlight(palette.accent, surfaces.translucent)
60670
61115
  );
60671
- return /* @__PURE__ */ jsx300("li", { children: onSubStepSelect ? /* @__PURE__ */ jsx300(
61116
+ return /* @__PURE__ */ jsx303("li", { children: onSubStepSelect ? /* @__PURE__ */ jsx303(
60672
61117
  "button",
60673
61118
  {
60674
61119
  type: "button",
60675
61120
  onClick: () => onSubStepSelect(step.id, subStep.id),
60676
- className: classNames111(
61121
+ className: classNames113(
60677
61122
  rowClasses,
60678
61123
  "focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-neutral-400 dark:focus-visible:ring-neutral-500"
60679
61124
  ),
60680
61125
  children: rowContent
60681
61126
  }
60682
- ) : /* @__PURE__ */ jsx300("div", { className: rowClasses, children: rowContent }) }, subStep.id);
61127
+ ) : /* @__PURE__ */ jsx303("div", { className: rowClasses, children: rowContent }) }, subStep.id);
60683
61128
  })
60684
61129
  }
60685
61130
  )
@@ -60688,18 +61133,128 @@ var WorkflowDetailPanel = ({
60688
61133
  };
60689
61134
  var WorkflowDetailPanel_default = WorkflowDetailPanel;
60690
61135
 
61136
+ // src/components/WorkflowTracker/WorkflowTrackerStepDetails.tsx
61137
+ import { jsx as jsx304 } from "react/jsx-runtime";
61138
+ var WorkflowTrackerStepDetails = ({
61139
+ data = sampleWorkflow,
61140
+ loading = false,
61141
+ labels: labelOverrides,
61142
+ cardClassName,
61143
+ onSubStepSelect,
61144
+ onStepAction,
61145
+ className,
61146
+ style,
61147
+ ...styleProps
61148
+ }) => {
61149
+ const steps = data?.steps ?? [];
61150
+ const { palette, surfaces } = useWorkflowChrome(styleProps);
61151
+ const labels = useMemo53(
61152
+ () => resolveLabels(labelOverrides),
61153
+ [labelOverrides]
61154
+ );
61155
+ const cardProps = buildCardProps(styleProps);
61156
+ const active = useMemo53(
61157
+ () => resolveActiveStep(steps, data?.activeStepId),
61158
+ [steps, data?.activeStepId]
61159
+ );
61160
+ return /* @__PURE__ */ jsx304(
61161
+ Panel_default,
61162
+ {
61163
+ ...cardProps,
61164
+ className: classNames114(className, cardClassName),
61165
+ style,
61166
+ children: /* @__PURE__ */ jsx304(
61167
+ WorkflowDetailPanel_default,
61168
+ {
61169
+ active,
61170
+ totalSteps: steps.length,
61171
+ palette,
61172
+ surfaces,
61173
+ labels,
61174
+ loading,
61175
+ onSubStepSelect,
61176
+ onStepAction
61177
+ }
61178
+ )
61179
+ }
61180
+ );
61181
+ };
61182
+ var WorkflowTrackerStepDetails_default = WorkflowTrackerStepDetails;
61183
+
61184
+ // src/components/WorkflowTracker/WorkflowTrackerDetails.tsx
61185
+ import { useMemo as useMemo54 } from "react";
61186
+ import classNames116 from "classnames";
61187
+
61188
+ // src/components/WorkflowTracker/WorkflowDetailsCard.tsx
61189
+ import classNames115 from "classnames";
61190
+ import { jsx as jsx305 } from "react/jsx-runtime";
61191
+ var WorkflowDetailsCard = ({
61192
+ details,
61193
+ ariaLabel,
61194
+ cardProps,
61195
+ className,
61196
+ style
61197
+ }) => /* @__PURE__ */ jsx305(
61198
+ Panel_default,
61199
+ {
61200
+ ...cardProps,
61201
+ flexBody: true,
61202
+ className: classNames115("flex-1", className),
61203
+ style,
61204
+ children: /* @__PURE__ */ jsx305(ScrollArea_default, { className: "h-full", mask: true, role: "region", "aria-label": ariaLabel, children: details })
61205
+ }
61206
+ );
61207
+ var WorkflowDetailsCard_default = WorkflowDetailsCard;
61208
+
61209
+ // src/components/WorkflowTracker/WorkflowTrackerDetails.tsx
61210
+ import { jsx as jsx306 } from "react/jsx-runtime";
61211
+ var WorkflowTrackerDetails = ({
61212
+ data = sampleWorkflow,
61213
+ loading = false,
61214
+ labels: labelOverrides,
61215
+ cardClassName,
61216
+ className,
61217
+ style,
61218
+ ...styleProps
61219
+ }) => {
61220
+ const steps = data?.steps ?? [];
61221
+ const labels = useMemo54(() => resolveLabels(labelOverrides), [labelOverrides]);
61222
+ const cardProps = buildCardProps(styleProps);
61223
+ const active = useMemo54(
61224
+ () => resolveActiveStep(steps, data?.activeStepId),
61225
+ [steps, data?.activeStepId]
61226
+ );
61227
+ const details = active?.step.details;
61228
+ if (loading || details == null || details === "") return null;
61229
+ return /* @__PURE__ */ jsx306(
61230
+ WorkflowDetailsCard_default,
61231
+ {
61232
+ details,
61233
+ ariaLabel: labels.details,
61234
+ cardProps,
61235
+ className: classNames116(className, cardClassName),
61236
+ style
61237
+ }
61238
+ );
61239
+ };
61240
+ var WorkflowTrackerDetails_default = WorkflowTrackerDetails;
61241
+
61242
+ // src/components/WorkflowTracker/WorkflowTrackerRollups.tsx
61243
+ import { useMemo as useMemo55 } from "react";
61244
+ import classNames118 from "classnames";
61245
+
60691
61246
  // src/components/WorkflowTracker/WorkflowSummaryCard.tsx
60692
- import classNames112 from "classnames";
60693
- import { jsx as jsx301, jsxs as jsxs184 } from "react/jsx-runtime";
61247
+ import classNames117 from "classnames";
61248
+ import { jsx as jsx307, jsxs as jsxs185 } from "react/jsx-runtime";
60694
61249
  var WorkflowSummaryCard = ({
60695
61250
  title,
60696
61251
  steps,
60697
61252
  palette,
60698
61253
  surfaces
60699
- }) => /* @__PURE__ */ jsxs184("div", { className: "px-5 py-4", children: [
60700
- /* @__PURE__ */ jsx301(SectionTitle, { surfaces, children: title }),
60701
- /* @__PURE__ */ jsx301("ul", { className: "mt-3 space-y-3", children: steps.map((step) => /* @__PURE__ */ jsxs184("li", { className: "flex items-start gap-3", children: [
60702
- /* @__PURE__ */ jsx301(
61254
+ }) => /* @__PURE__ */ jsxs185("div", { className: "px-5 py-4", children: [
61255
+ /* @__PURE__ */ jsx307(SectionTitle, { surfaces, children: title }),
61256
+ /* @__PURE__ */ jsx307("ul", { className: "mt-3 space-y-3", children: steps.map((step) => /* @__PURE__ */ jsxs185("li", { className: "flex items-start gap-3", children: [
61257
+ /* @__PURE__ */ jsx307(
60703
61258
  WorkflowStatusNode_default,
60704
61259
  {
60705
61260
  status: normalizeStatus(step.status),
@@ -60707,12 +61262,12 @@ var WorkflowSummaryCard = ({
60707
61262
  className: "mt-0.5"
60708
61263
  }
60709
61264
  ),
60710
- /* @__PURE__ */ jsxs184("div", { className: "min-w-0 flex-1", children: [
60711
- /* @__PURE__ */ jsx301("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: step.label }),
60712
- step.meta && /* @__PURE__ */ jsx301(
61265
+ /* @__PURE__ */ jsxs185("div", { className: "min-w-0 flex-1", children: [
61266
+ /* @__PURE__ */ jsx307("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: step.label }),
61267
+ step.meta && /* @__PURE__ */ jsx307(
60713
61268
  "p",
60714
61269
  {
60715
- className: classNames112(
61270
+ className: classNames117(
60716
61271
  "mt-0.5 text-xs leading-5",
60717
61272
  surfaces.mutedText
60718
61273
  ),
@@ -60724,166 +61279,57 @@ var WorkflowSummaryCard = ({
60724
61279
  ] });
60725
61280
  var WorkflowSummaryCard_default = WorkflowSummaryCard;
60726
61281
 
60727
- // src/components/WorkflowTracker/sampleWorkflow.ts
60728
- var sampleWorkflow = {
60729
- eyebrow: "VENDOR ONBOARDING \xB7 REQ-4128",
60730
- title: "Northwind Logistics GmbH",
60731
- live: true,
60732
- activeStepId: "security_questionnaire",
60733
- steps: [
60734
- {
60735
- id: "request_submitted",
60736
- label: "Request submitted",
60737
- status: "done",
60738
- meta: "2m"
60739
- },
60740
- {
60741
- id: "duplicate_check",
60742
- label: "Duplicate check",
60743
- status: "skipped",
60744
- badge: "Not needed",
60745
- meta: "No match in registry"
60746
- },
60747
- {
60748
- id: "business_verification",
60749
- label: "Business verification",
60750
- status: "done",
60751
- meta: "12m \xB7 3 of 3 sub-steps"
60752
- },
60753
- {
60754
- id: "sanctions_screening",
60755
- label: "Sanctions screening",
60756
- status: "done",
60757
- meta: "4m"
60758
- },
60759
- {
60760
- id: "tax_documents",
60761
- label: "Tax documents",
60762
- status: "skipped",
60763
- badge: "Skipped",
60764
- meta: "Skipped by M. Reyes \xB7 resume anytime"
60765
- },
60766
- {
60767
- id: "insurance_certificates",
60768
- label: "Insurance certificates",
60769
- status: "attention",
60770
- badge: "Needs attention",
60771
- meta: "1h 06m \xB7 Liability certificate expired 12 Aug"
60772
- },
60773
- {
60774
- id: "contract_drafting",
60775
- label: "Contract drafting",
60776
- status: "done",
60777
- meta: "1h 10m"
60778
- },
61282
+ // src/components/WorkflowTracker/WorkflowTrackerRollups.tsx
61283
+ import { jsx as jsx308, jsxs as jsxs186 } from "react/jsx-runtime";
61284
+ var WorkflowTrackerRollups = ({
61285
+ data = sampleWorkflow,
61286
+ loading = false,
61287
+ labels: labelOverrides,
61288
+ className,
61289
+ style,
61290
+ ...styleProps
61291
+ }) => {
61292
+ const steps = data?.steps ?? [];
61293
+ const { palette, surfaces } = useWorkflowChrome(styleProps);
61294
+ const labels = useMemo55(() => resolveLabels(labelOverrides), [labelOverrides]);
61295
+ const cardProps = buildCardProps(styleProps);
61296
+ const attentionSteps = useMemo55(() => getAttentionSteps(steps), [steps]);
61297
+ const skippedSteps = useMemo55(() => getSkippedSteps(steps), [steps]);
61298
+ if (loading || attentionSteps.length === 0 && skippedSteps.length === 0) {
61299
+ return null;
61300
+ }
61301
+ return /* @__PURE__ */ jsxs186(
61302
+ "div",
60779
61303
  {
60780
- id: "security_questionnaire",
60781
- label: "Security questionnaire",
60782
- status: "in_progress",
60783
- badge: "In progress",
60784
- meta: "24m \xB7 3 of 6 sub-steps",
60785
- elapsed: "24m",
60786
- description: "Vendor is completing the long-form questionnaire. Each sub-step unlocks once its evidence file is accepted by the reviewer.",
60787
- owner: "D. Okafor",
60788
- startedAt: "19 Aug \xB7 09:12",
60789
- sla: "Due in 6h",
60790
- subSteps: [
60791
- {
60792
- id: "data_handling",
60793
- label: "Data handling policy",
60794
- status: "done",
60795
- badge: "Accepted",
60796
- duration: "5m"
60797
- },
60798
- {
60799
- id: "pentest",
60800
- label: "Penetration test report",
60801
- status: "done",
60802
- badge: "Accepted",
60803
- duration: "8m"
60804
- },
60805
- {
60806
- id: "soc2",
60807
- label: "SOC 2 Type II evidence",
60808
- status: "done",
60809
- badge: "Accepted",
60810
- duration: "11m"
60811
- },
60812
- {
60813
- id: "subprocessor_list",
60814
- label: "Subprocessor list",
60815
- status: "running",
60816
- badge: "Running",
60817
- note: "Vendor uploading \u2014 2 of 3 files received"
60818
- },
60819
- {
60820
- id: "incident_response",
60821
- label: "Incident response plan",
60822
- status: "skipped",
60823
- badge: "Skipped",
60824
- note: "Covered by master agreement \xA77"
60825
- },
60826
- {
60827
- id: "business_continuity",
60828
- label: "Business continuity plan",
60829
- status: "not_started"
60830
- }
61304
+ className: classNames118("grid grid-cols-1 gap-5 @xl:grid-cols-2", className),
61305
+ style,
61306
+ children: [
61307
+ attentionSteps.length > 0 && /* @__PURE__ */ jsx308(Panel_default, { ...cardProps, children: /* @__PURE__ */ jsx308(
61308
+ WorkflowSummaryCard_default,
61309
+ {
61310
+ title: labels.needsAttention,
61311
+ steps: attentionSteps,
61312
+ palette,
61313
+ surfaces
61314
+ }
61315
+ ) }),
61316
+ skippedSteps.length > 0 && /* @__PURE__ */ jsx308(Panel_default, { ...cardProps, children: /* @__PURE__ */ jsx308(
61317
+ WorkflowSummaryCard_default,
61318
+ {
61319
+ title: labels.skippedSteps,
61320
+ steps: skippedSteps,
61321
+ palette,
61322
+ surfaces
61323
+ }
61324
+ ) })
60831
61325
  ]
60832
- },
60833
- {
60834
- id: "legal_review",
60835
- label: "Legal review",
60836
- status: "blocked",
60837
- badge: "Blocked",
60838
- meta: "Waiting on Legal \xB7 queued 2d"
60839
- },
60840
- {
60841
- id: "banking_details",
60842
- label: "Banking details",
60843
- status: "not_started"
60844
- },
60845
- {
60846
- id: "system_provisioning",
60847
- label: "System provisioning",
60848
- status: "not_started"
60849
- },
60850
- { id: "go_live", label: "Go-live", status: "not_started" }
60851
- ]
61326
+ }
61327
+ );
60852
61328
  };
61329
+ var WorkflowTrackerRollups_default = WorkflowTrackerRollups;
60853
61330
 
60854
61331
  // src/components/WorkflowTracker/WorkflowTracker.tsx
60855
- import { jsx as jsx302, jsxs as jsxs185 } from "react/jsx-runtime";
60856
- var DEFAULT_LABELS = {
60857
- progress: "Progress",
60858
- done: "done",
60859
- skipped: "skipped",
60860
- flagged: "flagged",
60861
- remaining: "remaining",
60862
- step: "Step",
60863
- of: "of",
60864
- elapsed: "Elapsed",
60865
- owner: "Owner",
60866
- started: "Started",
60867
- sla: "SLA",
60868
- subSteps: "Sub-steps",
60869
- accepted: "accepted",
60870
- open: "open",
60871
- needsAttention: "Needs attention",
60872
- skippedSteps: "Skipped steps",
60873
- live: "LIVE \xB7 read-only view",
60874
- empty: "No steps yet",
60875
- emptySubtitle: "Steps appear here as soon as the workflow starts.",
60876
- noActiveStep: "No step selected",
60877
- statuses: {
60878
- done: "Done",
60879
- in_progress: "In progress",
60880
- running: "Running",
60881
- skipped: "Skipped",
60882
- blocked: "Blocked",
60883
- attention: "Attention",
60884
- not_started: "Not started"
60885
- }
60886
- };
61332
+ import { jsx as jsx309, jsxs as jsxs187 } from "react/jsx-runtime";
60887
61333
  var WorkflowTracker = ({
60888
61334
  data = sampleWorkflow,
60889
61335
  accentColor = "blue",
@@ -60902,6 +61348,8 @@ var WorkflowTracker = ({
60902
61348
  maxWidth = 1180,
60903
61349
  railWidth = 360,
60904
61350
  stickyRail = false,
61351
+ fillHeight = false,
61352
+ fillHeightOffset = 0,
60905
61353
  loading = false,
60906
61354
  loadingRows = 6,
60907
61355
  emptyState,
@@ -60910,81 +61358,54 @@ var WorkflowTracker = ({
60910
61358
  labels: labelOverrides,
60911
61359
  onStepSelect,
60912
61360
  onSubStepSelect,
61361
+ onStepAction,
60913
61362
  className,
60914
61363
  style,
60915
61364
  ...rest
60916
61365
  }) => {
60917
- const steps = data?.steps ?? [];
60918
- const translucent = translucentSurfaces ?? isTranslucentVariant(variant);
60919
- const surfaces = useMemo51(
60920
- () => getSurfaceTokens(translucent),
60921
- [translucent]
60922
- );
60923
- const palette = useMemo51(
60924
- () => ({
60925
- accent: accentColor,
60926
- attention: attentionColor,
60927
- blocked: blockedColor,
60928
- muted: mutedColor,
60929
- translucent
60930
- }),
60931
- [accentColor, attentionColor, blockedColor, mutedColor, translucent]
60932
- );
60933
- const labels = useMemo51(
60934
- () => ({
60935
- ...DEFAULT_LABELS,
60936
- ...labelOverrides,
60937
- statuses: {
60938
- ...DEFAULT_LABELS.statuses,
60939
- ...labelOverrides?.statuses
60940
- }
60941
- }),
60942
- [labelOverrides]
60943
- );
60944
- const progress = useMemo51(() => computeProgress(steps), [steps]);
60945
- const tallies = useMemo51(() => computeTallies(steps), [steps]);
60946
- const active = useMemo51(
60947
- () => resolveActiveStep(steps, data?.activeStepId),
60948
- [steps, data?.activeStepId]
60949
- );
60950
- const attentionSteps = useMemo51(() => getAttentionSteps(steps), [steps]);
60951
- const skippedSteps = useMemo51(() => getSkippedSteps(steps), [steps]);
60952
- const cardProps = {
61366
+ const styleProps = {
61367
+ accentColor,
61368
+ attentionColor,
61369
+ blockedColor,
61370
+ mutedColor,
60953
61371
  variant,
60954
- tone: cardTone,
61372
+ cardTone,
60955
61373
  corner,
60956
61374
  glassOpacity,
60957
61375
  vibrancy,
60958
61376
  specularMode,
60959
61377
  padding,
60960
- scrollable: false
61378
+ translucentSurfaces
60961
61379
  };
61380
+ const { surfaces } = useWorkflowChrome(styleProps);
61381
+ const labels = useMemo56(() => resolveLabels(labelOverrides), [labelOverrides]);
60962
61382
  const railStyle = {
60963
- "--wt-rail-width": typeof railWidth === "number" ? `${railWidth}px` : railWidth
61383
+ "--wt-rail-width": typeof railWidth === "number" ? `${railWidth}px` : railWidth,
61384
+ "--wt-fill-offset": typeof fillHeightOffset === "number" ? `${fillHeightOffset}px` : fillHeightOffset
60964
61385
  };
60965
- return /* @__PURE__ */ jsxs185(
61386
+ return /* @__PURE__ */ jsxs187(
60966
61387
  "div",
60967
61388
  {
60968
- className: classNames113("@container w-full", className),
61389
+ className: classNames119("@container w-full", className),
60969
61390
  style: { maxWidth, ...railStyle, ...style },
60970
61391
  "aria-busy": loading || void 0,
60971
61392
  ...rest,
60972
61393
  children: [
60973
- showHeader && loading && /* @__PURE__ */ jsx302(
61394
+ showHeader && loading && /* @__PURE__ */ jsx309(
60974
61395
  WorkflowHeaderSkeleton,
60975
61396
  {
60976
61397
  hasIcon: Boolean(data?.icon),
60977
61398
  iconCorner
60978
61399
  }
60979
61400
  ),
60980
- showHeader && !loading && /* @__PURE__ */ jsxs185("header", { className: "mb-5 flex flex-wrap items-start justify-between gap-3", children: [
60981
- /* @__PURE__ */ jsxs185("div", { className: "flex min-w-0 items-center gap-3", children: [
61401
+ showHeader && !loading && /* @__PURE__ */ jsxs187("header", { className: "mb-5 flex flex-wrap items-start justify-between gap-3", children: [
61402
+ /* @__PURE__ */ jsxs187("div", { className: "flex min-w-0 items-center gap-3", children: [
60982
61403
  data?.icon && // `overflow-hidden` plus the shared corner class clips whatever
60983
61404
  // the caller passes, so an <img> needs no rounding of its own.
60984
- /* @__PURE__ */ jsx302(
61405
+ /* @__PURE__ */ jsx309(
60985
61406
  "span",
60986
61407
  {
60987
- className: classNames113(
61408
+ className: classNames119(
60988
61409
  "flex h-12 w-12 shrink-0 items-center justify-center overflow-hidden [&>img]:h-full [&>img]:w-full [&>img]:object-cover",
60989
61410
  getSurfaceCornerClass(iconCorner),
60990
61411
  surfaces.chip
@@ -60992,33 +61413,33 @@ var WorkflowTracker = ({
60992
61413
  children: data.icon
60993
61414
  }
60994
61415
  ),
60995
- /* @__PURE__ */ jsxs185("div", { className: "min-w-0", children: [
60996
- data?.eyebrow && /* @__PURE__ */ jsx302(
61416
+ /* @__PURE__ */ jsxs187("div", { className: "min-w-0", children: [
61417
+ data?.eyebrow && /* @__PURE__ */ jsx309(
60997
61418
  "p",
60998
61419
  {
60999
- className: classNames113(
61420
+ className: classNames119(
61000
61421
  "text-[11px] font-semibold uppercase tracking-widest",
61001
61422
  surfaces.faintText
61002
61423
  ),
61003
61424
  children: data.eyebrow
61004
61425
  }
61005
61426
  ),
61006
- /* @__PURE__ */ jsx302("h2", { className: "mt-1 text-2xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-3xl", children: data?.title })
61427
+ /* @__PURE__ */ jsx309("h2", { className: "mt-1 text-2xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-3xl", children: data?.title })
61007
61428
  ] })
61008
61429
  ] }),
61009
- data?.live && /* @__PURE__ */ jsxs185(
61430
+ data?.live && /* @__PURE__ */ jsxs187(
61010
61431
  Pill_default,
61011
61432
  {
61012
61433
  size: "md",
61013
61434
  tone: mutedColor,
61014
61435
  variant: "outline",
61015
- className: classNames113("tracking-wide", surfaces.chip),
61436
+ className: classNames119("tracking-wide", surfaces.chip),
61016
61437
  children: [
61017
- /* @__PURE__ */ jsx302(
61438
+ /* @__PURE__ */ jsx309(
61018
61439
  "span",
61019
61440
  {
61020
61441
  "aria-hidden": "true",
61021
- className: classNames113(
61442
+ className: classNames119(
61022
61443
  "mr-2 inline-block h-1.5 w-1.5 rounded-full",
61023
61444
  `bg-${accentColor}-500 dark:bg-${accentColor}-400`
61024
61445
  )
@@ -61029,67 +61450,77 @@ var WorkflowTracker = ({
61029
61450
  }
61030
61451
  )
61031
61452
  ] }),
61032
- /* @__PURE__ */ jsxs185("div", { className: "grid grid-cols-1 items-start gap-5 @4xl:grid-cols-[var(--wt-rail-width)_minmax(0,1fr)]", children: [
61033
- /* @__PURE__ */ jsx302(
61034
- Panel_default,
61035
- {
61036
- ...cardProps,
61037
- className: classNames113(stickyRail && "@4xl:sticky @4xl:top-6"),
61038
- children: /* @__PURE__ */ jsx302(
61039
- WorkflowTimeline_default,
61453
+ /* @__PURE__ */ jsxs187(
61454
+ "div",
61455
+ {
61456
+ className: classNames119(
61457
+ "grid grid-cols-1 items-start gap-5 @4xl:grid-cols-[var(--wt-rail-width)_minmax(0,1fr)]",
61458
+ fillHeight && "@4xl:h-[calc(100dvh-var(--wt-fill-offset))]"
61459
+ ),
61460
+ children: [
61461
+ /* @__PURE__ */ jsx309(
61462
+ WorkflowTrackerRail_default,
61040
61463
  {
61041
- steps,
61042
- activeStepId: active?.step.id,
61043
- palette,
61044
- surfaces,
61045
- labels,
61046
- progress,
61047
- tallies,
61048
- showLegend: showLegend && !loading,
61464
+ ...styleProps,
61465
+ data,
61049
61466
  loading,
61050
61467
  loadingRows,
61468
+ showLegend,
61051
61469
  emptyState,
61470
+ labels: labelOverrides,
61471
+ cardScrollable: fillHeight,
61472
+ cardClassName: classNames119(
61473
+ stickyRail && !fillHeight && "@4xl:sticky @4xl:top-6",
61474
+ fillHeight && "@4xl:min-h-0 @4xl:self-stretch"
61475
+ ),
61052
61476
  onStepSelect,
61053
- onSubStepSelect
61477
+ onSubStepSelect,
61478
+ onStepAction
61054
61479
  }
61055
- )
61056
- }
61057
- ),
61058
- /* @__PURE__ */ jsxs185("div", { className: "@container flex min-w-0 flex-col gap-5", children: [
61059
- /* @__PURE__ */ jsx302(Panel_default, { ...cardProps, children: /* @__PURE__ */ jsx302(
61060
- WorkflowDetailPanel_default,
61061
- {
61062
- active,
61063
- totalSteps: steps.length,
61064
- palette,
61065
- surfaces,
61066
- labels,
61067
- loading,
61068
- onSubStepSelect
61069
- }
61070
- ) }),
61071
- !loading && (attentionSteps.length > 0 || skippedSteps.length > 0) && /* @__PURE__ */ jsxs185("div", { className: "grid grid-cols-1 gap-5 @xl:grid-cols-2", children: [
61072
- attentionSteps.length > 0 && /* @__PURE__ */ jsx302(Panel_default, { ...cardProps, children: /* @__PURE__ */ jsx302(
61073
- WorkflowSummaryCard_default,
61074
- {
61075
- title: labels.needsAttention,
61076
- steps: attentionSteps,
61077
- palette,
61078
- surfaces
61079
- }
61080
- ) }),
61081
- skippedSteps.length > 0 && /* @__PURE__ */ jsx302(Panel_default, { ...cardProps, children: /* @__PURE__ */ jsx302(
61082
- WorkflowSummaryCard_default,
61480
+ ),
61481
+ /* @__PURE__ */ jsxs187(
61482
+ "div",
61083
61483
  {
61084
- title: labels.skippedSteps,
61085
- steps: skippedSteps,
61086
- palette,
61087
- surfaces
61484
+ className: classNames119(
61485
+ "@container flex min-w-0 flex-col gap-5",
61486
+ fillHeight && "@4xl:min-h-0 @4xl:self-stretch"
61487
+ ),
61488
+ children: [
61489
+ /* @__PURE__ */ jsx309(
61490
+ WorkflowTrackerStepDetails_default,
61491
+ {
61492
+ ...styleProps,
61493
+ data,
61494
+ loading,
61495
+ labels: labelOverrides,
61496
+ onSubStepSelect,
61497
+ onStepAction
61498
+ }
61499
+ ),
61500
+ /* @__PURE__ */ jsx309(
61501
+ WorkflowTrackerDetails_default,
61502
+ {
61503
+ ...styleProps,
61504
+ data,
61505
+ loading,
61506
+ labels: labelOverrides
61507
+ }
61508
+ ),
61509
+ /* @__PURE__ */ jsx309(
61510
+ WorkflowTrackerRollups_default,
61511
+ {
61512
+ ...styleProps,
61513
+ data,
61514
+ loading,
61515
+ labels: labelOverrides
61516
+ }
61517
+ )
61518
+ ]
61088
61519
  }
61089
- ) })
61090
- ] })
61091
- ] })
61092
- ] })
61520
+ )
61521
+ ]
61522
+ }
61523
+ )
61093
61524
  ]
61094
61525
  }
61095
61526
  );
@@ -61097,9 +61528,9 @@ var WorkflowTracker = ({
61097
61528
  var WorkflowTracker_default = WorkflowTracker;
61098
61529
 
61099
61530
  // src/components/Gantt/Gantt.tsx
61100
- import { useCallback as useCallback42, useEffect as useEffect71, useMemo as useMemo55, useRef as useRef68, useState as useState79 } from "react";
61531
+ import { useCallback as useCallback42, useEffect as useEffect71, useMemo as useMemo60, useRef as useRef68, useState as useState79 } from "react";
61101
61532
  import { createPortal as createPortal15 } from "react-dom";
61102
- import classNames117 from "classnames";
61533
+ import classNames123 from "classnames";
61103
61534
 
61104
61535
  // ../common/gantt/types.ts
61105
61536
  var GANTT_ZOOM_PRESETS = [
@@ -62445,38 +62876,38 @@ var sampleGantt = {
62445
62876
  };
62446
62877
 
62447
62878
  // src/components/Gantt/GanttScale.tsx
62448
- import classNames114 from "classnames";
62449
- import { jsx as jsx303, jsxs as jsxs186 } from "react/jsx-runtime";
62879
+ import classNames120 from "classnames";
62880
+ import { jsx as jsx310, jsxs as jsxs188 } from "react/jsx-runtime";
62450
62881
  var GanttScale = ({ levels, height }) => {
62451
62882
  if (levels.length === 0) {
62452
- return /* @__PURE__ */ jsx303("div", { style: { height } });
62883
+ return /* @__PURE__ */ jsx310("div", { style: { height } });
62453
62884
  }
62454
62885
  const coarseHeight = levels.length > 1 ? 24 : height;
62455
- return /* @__PURE__ */ jsx303("div", { className: "flex h-full w-full flex-col", children: levels.map((level, li) => /* @__PURE__ */ jsx303(
62886
+ return /* @__PURE__ */ jsx310("div", { className: "flex h-full w-full flex-col", children: levels.map((level, li) => /* @__PURE__ */ jsx310(
62456
62887
  "div",
62457
62888
  {
62458
- className: classNames114("flex w-full", li === 0 ? "shrink-0" : "min-h-0 flex-1"),
62889
+ className: classNames120("flex w-full", li === 0 ? "shrink-0" : "min-h-0 flex-1"),
62459
62890
  style: li === 0 ? { height: coarseHeight } : void 0,
62460
- children: level.columns.map((col) => /* @__PURE__ */ jsxs186(
62891
+ children: level.columns.map((col) => /* @__PURE__ */ jsxs188(
62461
62892
  "div",
62462
62893
  {
62463
- className: classNames114(
62894
+ className: classNames120(
62464
62895
  "flex shrink-0 flex-col items-center justify-center overflow-hidden border-r border-neutral-200/70 dark:border-neutral-800/70",
62465
62896
  li === 0 ? "bg-neutral-50/60 dark:bg-neutral-800/40" : "bg-white dark:bg-neutral-900"
62466
62897
  ),
62467
62898
  style: { width: col.width },
62468
62899
  children: [
62469
- /* @__PURE__ */ jsx303(
62900
+ /* @__PURE__ */ jsx310(
62470
62901
  "span",
62471
62902
  {
62472
- className: classNames114(
62903
+ className: classNames120(
62473
62904
  "max-w-full truncate px-1 text-[10px] font-semibold uppercase leading-none tracking-wide",
62474
62905
  li === 0 ? "text-neutral-700 dark:text-neutral-200" : "text-neutral-500 dark:text-neutral-400"
62475
62906
  ),
62476
62907
  children: col.label
62477
62908
  }
62478
62909
  ),
62479
- col.subLabel != null && /* @__PURE__ */ jsx303("span", { className: "max-w-full truncate px-1 text-[9px] font-medium leading-none text-neutral-400 dark:text-neutral-500", children: col.subLabel })
62910
+ 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 })
62480
62911
  ]
62481
62912
  },
62482
62913
  col.id
@@ -62489,7 +62920,7 @@ GanttScale.displayName = "GanttScale";
62489
62920
 
62490
62921
  // src/components/Gantt/GanttLinkLayer.tsx
62491
62922
  import { forwardRef as forwardRef160, useRef as useRef66 } from "react";
62492
- import { jsx as jsx304, jsxs as jsxs187 } from "react/jsx-runtime";
62923
+ import { jsx as jsx311, jsxs as jsxs189 } from "react/jsx-runtime";
62493
62924
  var GanttLinkLayer = forwardRef160(
62494
62925
  function GanttLinkLayer2({
62495
62926
  width,
@@ -62525,24 +62956,24 @@ var GanttLinkLayer = forwardRef160(
62525
62956
  const pick = pickFromEvent(e) ?? clicked;
62526
62957
  if (interactive && onDeleteLink) onDeleteLink(pick.link);
62527
62958
  };
62528
- return /* @__PURE__ */ jsxs187(
62959
+ return /* @__PURE__ */ jsxs189(
62529
62960
  "div",
62530
62961
  {
62531
62962
  ref,
62532
62963
  className: "pointer-events-none absolute top-0 z-10",
62533
62964
  style: { left: offsetLeft, width, height },
62534
62965
  children: [
62535
- /* @__PURE__ */ jsxs187("svg", { ref: svgRef, width, height, className: "block overflow-visible", children: [
62966
+ /* @__PURE__ */ jsxs189("svg", { ref: svgRef, width, height, className: "block overflow-visible", children: [
62536
62967
  paths.map((p, i) => {
62537
62968
  const tokens = getGanttLinkTokens(p.color ?? color);
62538
62969
  const sel = selected != null && p.link === selected;
62539
62970
  const nodeR = sel ? 4.5 : 3.5;
62540
- return /* @__PURE__ */ jsxs187(
62971
+ return /* @__PURE__ */ jsxs189(
62541
62972
  "g",
62542
62973
  {
62543
62974
  style: sel ? { filter: `drop-shadow(0 0 3px var(--color-${p.color ?? color}-500))` } : void 0,
62544
62975
  children: [
62545
- /* @__PURE__ */ jsx304(
62976
+ /* @__PURE__ */ jsx311(
62546
62977
  "path",
62547
62978
  {
62548
62979
  d: p.d,
@@ -62558,10 +62989,10 @@ var GanttLinkLayer = forwardRef160(
62558
62989
  },
62559
62990
  onClick: (e) => handlePick(e, p),
62560
62991
  onDoubleClick: (e) => handleDelete(e, p),
62561
- children: /* @__PURE__ */ jsx304("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
62992
+ children: /* @__PURE__ */ jsx311("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
62562
62993
  }
62563
62994
  ),
62564
- /* @__PURE__ */ jsx304(
62995
+ /* @__PURE__ */ jsx311(
62565
62996
  "path",
62566
62997
  {
62567
62998
  d: p.d,
@@ -62577,14 +63008,14 @@ var GanttLinkLayer = forwardRef160(
62577
63008
  },
62578
63009
  onClick: (e) => handlePick(e, p),
62579
63010
  onDoubleClick: (e) => handleDelete(e, p),
62580
- children: /* @__PURE__ */ jsx304("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
63011
+ children: /* @__PURE__ */ jsx311("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
62581
63012
  }
62582
63013
  ),
62583
- p.arrow && /* @__PURE__ */ jsx304("polygon", { points: p.arrow, className: tokens.fill }),
62584
- /* @__PURE__ */ jsx304("circle", { cx: p.from.x, cy: p.from.y, r: nodeR + 2.5, className: tokens.halo }),
62585
- /* @__PURE__ */ jsx304("circle", { cx: p.from.x, cy: p.from.y, r: nodeR, className: tokens.fill }),
62586
- /* @__PURE__ */ jsx304("circle", { cx: p.to.x, cy: p.to.y, r: nodeR + 2.5, className: tokens.halo }),
62587
- /* @__PURE__ */ jsx304("circle", { cx: p.to.x, cy: p.to.y, r: nodeR, className: tokens.fill })
63014
+ p.arrow && /* @__PURE__ */ jsx311("polygon", { points: p.arrow, className: tokens.fill }),
63015
+ /* @__PURE__ */ jsx311("circle", { cx: p.from.x, cy: p.from.y, r: nodeR + 2.5, className: tokens.halo }),
63016
+ /* @__PURE__ */ jsx311("circle", { cx: p.from.x, cy: p.from.y, r: nodeR, className: tokens.fill }),
63017
+ /* @__PURE__ */ jsx311("circle", { cx: p.to.x, cy: p.to.y, r: nodeR + 2.5, className: tokens.halo }),
63018
+ /* @__PURE__ */ jsx311("circle", { cx: p.to.x, cy: p.to.y, r: nodeR, className: tokens.fill })
62588
63019
  ]
62589
63020
  },
62590
63021
  `${p.link.source}->${p.link.target}-${p.type}-${i}`
@@ -62592,8 +63023,8 @@ var GanttLinkLayer = forwardRef160(
62592
63023
  }),
62593
63024
  rubber && (() => {
62594
63025
  const tokens = getGanttLinkTokens(rubber.color);
62595
- return /* @__PURE__ */ jsxs187("g", { children: [
62596
- /* @__PURE__ */ jsx304(
63026
+ return /* @__PURE__ */ jsxs189("g", { children: [
63027
+ /* @__PURE__ */ jsx311(
62597
63028
  "path",
62598
63029
  {
62599
63030
  d: rubber.d,
@@ -62604,15 +63035,15 @@ var GanttLinkLayer = forwardRef160(
62604
63035
  strokeDasharray: "5 3"
62605
63036
  }
62606
63037
  ),
62607
- rubber.arrow && /* @__PURE__ */ jsx304("polygon", { points: rubber.arrow, className: tokens.fill }),
62608
- /* @__PURE__ */ jsx304("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 6, className: tokens.halo }),
62609
- /* @__PURE__ */ jsx304("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 3.5, className: tokens.fill }),
62610
- /* @__PURE__ */ jsx304("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 6, className: tokens.halo }),
62611
- /* @__PURE__ */ jsx304("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 3.5, className: tokens.fill })
63038
+ rubber.arrow && /* @__PURE__ */ jsx311("polygon", { points: rubber.arrow, className: tokens.fill }),
63039
+ /* @__PURE__ */ jsx311("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 6, className: tokens.halo }),
63040
+ /* @__PURE__ */ jsx311("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 3.5, className: tokens.fill }),
63041
+ /* @__PURE__ */ jsx311("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 6, className: tokens.halo }),
63042
+ /* @__PURE__ */ jsx311("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 3.5, className: tokens.fill })
62612
63043
  ] });
62613
63044
  })()
62614
63045
  ] }),
62615
- canDelete && selMid && /* @__PURE__ */ jsxs187(
63046
+ canDelete && selMid && /* @__PURE__ */ jsxs189(
62616
63047
  "button",
62617
63048
  {
62618
63049
  type: "button",
@@ -62630,7 +63061,7 @@ var GanttLinkLayer = forwardRef160(
62630
63061
  onClick: () => onDeleteLink(selected),
62631
63062
  title: t("kit.gantt.removeDependency"),
62632
63063
  children: [
62633
- /* @__PURE__ */ jsx304("span", { "aria-hidden": true, children: "\u2715" }),
63064
+ /* @__PURE__ */ jsx311("span", { "aria-hidden": true, children: "\u2715" }),
62634
63065
  " ",
62635
63066
  t("kit.gantt.delete")
62636
63067
  ]
@@ -62644,9 +63075,9 @@ var GanttLinkLayer = forwardRef160(
62644
63075
  GanttLinkLayer.displayName = "GanttLinkLayer";
62645
63076
 
62646
63077
  // src/components/Gantt/GanttBodyRow.tsx
62647
- import { useMemo as useMemo52 } from "react";
62648
- import classNames115 from "classnames";
62649
- import { Fragment as Fragment48, jsx as jsx305, jsxs as jsxs188 } from "react/jsx-runtime";
63078
+ import { useMemo as useMemo57 } from "react";
63079
+ import classNames121 from "classnames";
63080
+ import { Fragment as Fragment48, jsx as jsx312, jsxs as jsxs190 } from "react/jsx-runtime";
62650
63081
  var BAR_HEIGHT = 24;
62651
63082
  var MILESTONE_SIZE = 14;
62652
63083
  var GanttBodyRow = ({
@@ -62685,11 +63116,11 @@ var GanttBodyRow = ({
62685
63116
  const t = useKitT();
62686
63117
  const isDraggingThis = row.task != null && drag?.taskId === row.task.id;
62687
63118
  const reorderDragging = isDraggingThis && drag?.kind === "reorder";
62688
- return /* @__PURE__ */ jsx305(
63119
+ return /* @__PURE__ */ jsx312(
62689
63120
  "div",
62690
63121
  {
62691
63122
  "data-row-key": row.key,
62692
- className: classNames115(
63123
+ className: classNames121(
62693
63124
  // No overflow here: an overflow-hidden row root would become the
62694
63125
  // sticky halves' (non-scrolling) scrollport and stop them pinning to
62695
63126
  // the left edge while the timeline scrolls. The halves pin the
@@ -62706,7 +63137,7 @@ var GanttBodyRow = ({
62706
63137
  boxShadow: `inset 2px 0 0 var(--color-${color}-500)`
62707
63138
  } : {}
62708
63139
  },
62709
- children: row.task == null ? /* @__PURE__ */ jsx305(
63140
+ children: row.task == null ? /* @__PURE__ */ jsx312(
62710
63141
  LaneHeader,
62711
63142
  {
62712
63143
  row,
@@ -62717,20 +63148,20 @@ var GanttBodyRow = ({
62717
63148
  dividerClass,
62718
63149
  liveProgress: liveLane
62719
63150
  }
62720
- ) : /* @__PURE__ */ jsxs188(Fragment48, { children: [
62721
- /* @__PURE__ */ jsxs188(
63151
+ ) : /* @__PURE__ */ jsxs190(Fragment48, { children: [
63152
+ /* @__PURE__ */ jsxs190(
62722
63153
  "div",
62723
63154
  {
62724
- className: classNames115(
63155
+ className: classNames121(
62725
63156
  "sticky left-0 z-20 flex items-stretch overflow-hidden border-r border-b bg-white dark:bg-neutral-900",
62726
63157
  dividerClass
62727
63158
  ),
62728
63159
  style: { width: leftWidth },
62729
63160
  children: [
62730
- /* @__PURE__ */ jsx305("div", { className: "flex w-9 shrink-0 items-center justify-center", children: interactive && !row.task.locked && /* @__PURE__ */ jsx305(
63161
+ /* @__PURE__ */ jsx312("div", { className: "flex w-9 shrink-0 items-center justify-center", children: interactive && !row.task.locked && /* @__PURE__ */ jsx312(
62731
63162
  "span",
62732
63163
  {
62733
- className: classNames115(
63164
+ className: classNames121(
62734
63165
  "flex cursor-grab touch-none items-center text-neutral-300 transition-opacity active:cursor-grabbing dark:text-neutral-600",
62735
63166
  reorderDragging ? "opacity-100" : "opacity-0 group-hover/row:opacity-100"
62736
63167
  ),
@@ -62738,10 +63169,10 @@ var GanttBodyRow = ({
62738
63169
  onPointerDown: (e) => onGripPointerDown(row.key, row.task, e),
62739
63170
  title: t("kit.gantt.dragReorder"),
62740
63171
  "aria-hidden": "true",
62741
- children: /* @__PURE__ */ jsx305(Drag, { className: "h-3.5 w-3.5" })
63172
+ children: /* @__PURE__ */ jsx312(Drag, { className: "h-3.5 w-3.5" })
62742
63173
  }
62743
63174
  ) }),
62744
- columns.map((col, i) => /* @__PURE__ */ jsx305(
63175
+ columns.map((col, i) => /* @__PURE__ */ jsx312(
62745
63176
  Cell,
62746
63177
  {
62747
63178
  col,
@@ -62762,12 +63193,12 @@ var GanttBodyRow = ({
62762
63193
  ]
62763
63194
  }
62764
63195
  ),
62765
- /* @__PURE__ */ jsx305(
63196
+ /* @__PURE__ */ jsx312(
62766
63197
  "div",
62767
63198
  {
62768
- className: classNames115("relative shrink-0 border-b", dividerClass),
63199
+ className: classNames121("relative shrink-0 border-b", dividerClass),
62769
63200
  style: { width: timelineWidth },
62770
- children: /* @__PURE__ */ jsx305(
63201
+ children: /* @__PURE__ */ jsx312(
62771
63202
  TaskBar,
62772
63203
  {
62773
63204
  task: row.task,
@@ -62808,57 +63239,57 @@ var LaneHeader = ({ row, columns, leftWidth, color, onCaretClick, dividerClass =
62808
63239
  const laneColor = lane.color ?? color;
62809
63240
  const tokens = getGanttLaneTokens(laneColor);
62810
63241
  const isOpen = lane.open !== false;
62811
- return /* @__PURE__ */ jsxs188(Fragment48, { children: [
62812
- /* @__PURE__ */ jsxs188(
63242
+ return /* @__PURE__ */ jsxs190(Fragment48, { children: [
63243
+ /* @__PURE__ */ jsxs190(
62813
63244
  "div",
62814
63245
  {
62815
- className: classNames115(
63246
+ className: classNames121(
62816
63247
  "sticky left-0 z-20 flex items-stretch overflow-hidden border-r border-b bg-white dark:bg-neutral-900",
62817
63248
  dividerClass
62818
63249
  ),
62819
63250
  style: { width: leftWidth },
62820
63251
  children: [
62821
- /* @__PURE__ */ jsx305("div", { className: classNames115("pointer-events-none absolute inset-0", tokens.band) }),
62822
- /* @__PURE__ */ jsx305("div", { className: "relative flex w-9 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx305(
63252
+ /* @__PURE__ */ jsx312("div", { className: classNames121("pointer-events-none absolute inset-0", tokens.band) }),
63253
+ /* @__PURE__ */ jsx312("div", { className: "relative flex w-9 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx312(
62823
63254
  "button",
62824
63255
  {
62825
63256
  type: "button",
62826
63257
  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",
62827
63258
  onClick: () => onCaretClick(lane.id, isOpen),
62828
63259
  "aria-label": t(isOpen ? "kit.gantt.collapse" : "kit.gantt.expand", { name: lane.label }),
62829
- children: /* @__PURE__ */ jsx305(ChevronRight, { className: classNames115("h-3 w-3 transition-transform", isOpen && "rotate-90") })
63260
+ children: /* @__PURE__ */ jsx312(ChevronRight, { className: classNames121("h-3 w-3 transition-transform", isOpen && "rotate-90") })
62830
63261
  }
62831
63262
  ) }),
62832
- columns.map((col, i) => /* @__PURE__ */ jsx305(
63263
+ columns.map((col, i) => /* @__PURE__ */ jsx312(
62833
63264
  "div",
62834
63265
  {
62835
- className: classNames115(
63266
+ className: classNames121(
62836
63267
  "relative flex shrink-0 items-center gap-2 overflow-hidden border-r px-2 last:border-r-0",
62837
63268
  dividerClass
62838
63269
  ),
62839
63270
  style: { width: col.width ?? "160px" },
62840
- children: i === 0 ? /* @__PURE__ */ jsxs188(Fragment48, { children: [
62841
- /* @__PURE__ */ jsx305("span", { className: classNames115("truncate text-[13px] font-semibold", tokens.label), children: lane.label }),
62842
- lane.description && /* @__PURE__ */ jsx305("span", { className: "hidden truncate text-[11px] text-neutral-500 dark:text-neutral-400 lg:inline", children: lane.description }),
62843
- row.childCount > 0 && /* @__PURE__ */ jsx305("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 })
62844
- ] }) : col.key === "progress" ? /* @__PURE__ */ jsx305(ProgressCell, { value: liveProgress ?? row.progress ?? 0, barClass: tokens.chip }) : null
63271
+ children: i === 0 ? /* @__PURE__ */ jsxs190(Fragment48, { children: [
63272
+ /* @__PURE__ */ jsx312("span", { className: classNames121("truncate text-[13px] font-semibold", tokens.label), children: lane.label }),
63273
+ lane.description && /* @__PURE__ */ jsx312("span", { className: "hidden truncate text-[11px] text-neutral-500 dark:text-neutral-400 lg:inline", children: lane.description }),
63274
+ 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 })
63275
+ ] }) : col.key === "progress" ? /* @__PURE__ */ jsx312(ProgressCell, { value: liveProgress ?? row.progress ?? 0, barClass: tokens.chip }) : null
62845
63276
  },
62846
63277
  col.key
62847
63278
  ))
62848
63279
  ]
62849
63280
  }
62850
63281
  ),
62851
- /* @__PURE__ */ jsx305("div", { className: classNames115("relative min-w-0 flex-1 border-b", dividerClass), children: /* @__PURE__ */ jsx305("div", { className: classNames115("absolute inset-0", tokens.band) }) })
63282
+ /* @__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) }) })
62852
63283
  ] });
62853
63284
  };
62854
63285
  var Cell = ({ col, task, depth, isGroup, childCount, first, onCaretClick, renderCell, liveProgress, liveRollup, rowProgress, dividerClass = "border-neutral-100 dark:border-neutral-800" }) => {
62855
63286
  const t = useKitT();
62856
63287
  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;
62857
63288
  const custom = col.key !== "name" && renderCell ? renderCell(value, task, col) : null;
62858
- return /* @__PURE__ */ jsx305(
63289
+ return /* @__PURE__ */ jsx312(
62859
63290
  "div",
62860
63291
  {
62861
- className: classNames115(
63292
+ className: classNames121(
62862
63293
  "flex shrink-0 items-center gap-1.5 overflow-hidden border-r px-2 text-[12.5px] last:border-r-0",
62863
63294
  dividerClass
62864
63295
  ),
@@ -62866,50 +63297,50 @@ var Cell = ({ col, task, depth, isGroup, childCount, first, onCaretClick, render
62866
63297
  width: col.width ?? "160px",
62867
63298
  justifyContent: col.align === "center" ? "center" : col.align === "right" ? "flex-end" : "flex-start"
62868
63299
  },
62869
- children: first ? /* @__PURE__ */ jsxs188(Fragment48, { children: [
62870
- /* @__PURE__ */ jsx305("span", { className: "shrink-0", style: { width: depth * 14 + 18 }, children: isGroup && /* @__PURE__ */ jsx305(
63300
+ children: first ? /* @__PURE__ */ jsxs190(Fragment48, { children: [
63301
+ /* @__PURE__ */ jsx312("span", { className: "shrink-0", style: { width: depth * 14 + 18 }, children: isGroup && /* @__PURE__ */ jsx312(
62871
63302
  "button",
62872
63303
  {
62873
63304
  type: "button",
62874
63305
  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",
62875
63306
  onClick: () => onCaretClick(task.id, task.open !== false),
62876
63307
  "aria-label": t(task.open === false ? "kit.gantt.expand" : "kit.gantt.collapse", { name: task.name }),
62877
- children: /* @__PURE__ */ jsx305(ChevronRight, { className: classNames115("h-3 w-3 transition-transform", task.open !== false && "rotate-90") })
63308
+ children: /* @__PURE__ */ jsx312(ChevronRight, { className: classNames121("h-3 w-3 transition-transform", task.open !== false && "rotate-90") })
62878
63309
  }
62879
63310
  ) }),
62880
- isGroup && childCount > 0 ? /* @__PURE__ */ jsxs188("span", { className: "flex min-w-0 items-center gap-1 font-semibold text-neutral-800 dark:text-neutral-100", children: [
62881
- /* @__PURE__ */ jsx305("span", { className: "truncate", children: task.name }),
62882
- /* @__PURE__ */ jsx305("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 })
62883
- ] }) : /* @__PURE__ */ jsx305("span", { className: "truncate font-medium text-neutral-700 dark:text-neutral-300", children: task.name })
62884
- ] }) : col.kind === "owner" ? value != null ? /* @__PURE__ */ jsxs188("span", { className: "flex min-w-0 items-center gap-1.5 text-neutral-600 dark:text-neutral-400", children: [
62885
- /* @__PURE__ */ jsx305(
63311
+ 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: [
63312
+ /* @__PURE__ */ jsx312("span", { className: "truncate", children: task.name }),
63313
+ /* @__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 })
63314
+ ] }) : /* @__PURE__ */ jsx312("span", { className: "truncate font-medium text-neutral-700 dark:text-neutral-300", children: task.name })
63315
+ ] }) : 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: [
63316
+ /* @__PURE__ */ jsx312(
62886
63317
  "span",
62887
63318
  {
62888
- className: classNames115(
63319
+ className: classNames121(
62889
63320
  "flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-[8px] font-bold uppercase text-white",
62890
63321
  getGanttBarTokens(task.color ?? "blue").fill
62891
63322
  ),
62892
63323
  children: String(value).slice(0, 1)
62893
63324
  }
62894
63325
  ),
62895
- /* @__PURE__ */ jsx305("span", { className: "truncate", children: String(value) })
62896
- ] }) : /* @__PURE__ */ jsx305("span", { className: "text-neutral-400 dark:text-neutral-600", children: "\u2014" }) : col.kind === "progress" ? /* @__PURE__ */ jsx305(ProgressCell, { value: typeof value === "number" ? value : 0 }) : col.kind === "badge" ? task.badge != null ? /* @__PURE__ */ jsx305(
63326
+ /* @__PURE__ */ jsx312("span", { className: "truncate", children: String(value) })
63327
+ ] }) : /* @__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(
62897
63328
  "span",
62898
63329
  {
62899
- className: classNames115(
63330
+ className: classNames121(
62900
63331
  "rounded-full px-1.5 py-0.5 text-[10px] font-semibold",
62901
63332
  getGanttBarTokens(task.badgeColor ?? "neutral").fill,
62902
63333
  "text-white"
62903
63334
  ),
62904
63335
  children: task.badge
62905
63336
  }
62906
- ) : /* @__PURE__ */ jsx305("span", { className: "text-neutral-400 dark:text-neutral-600", children: "\u2014" }) : custom != null ? custom : /* @__PURE__ */ jsx305("span", { className: "truncate text-neutral-600 dark:text-neutral-400", children: value == null || value === "" ? "\u2014" : String(value) })
63337
+ ) : /* @__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) })
62907
63338
  }
62908
63339
  );
62909
63340
  };
62910
- var ProgressCell = ({ value, barClass = "bg-emerald-500" }) => /* @__PURE__ */ jsxs188("span", { className: "flex w-full items-center gap-1.5", children: [
62911
- /* @__PURE__ */ jsx305("span", { className: "h-1.5 min-w-0 flex-1 overflow-hidden rounded-full bg-neutral-200/80 dark:bg-white/10", children: /* @__PURE__ */ jsx305("span", { className: classNames115("block h-full rounded-full", barClass), style: { width: `${Math.round(value * 100)}%` } }) }),
62912
- /* @__PURE__ */ jsxs188("span", { className: "w-7 shrink-0 text-right text-[10px] font-semibold tabular-nums text-neutral-500 dark:text-neutral-400", children: [
63341
+ var ProgressCell = ({ value, barClass = "bg-emerald-500" }) => /* @__PURE__ */ jsxs190("span", { className: "flex w-full items-center gap-1.5", children: [
63342
+ /* @__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)}%` } }) }),
63343
+ /* @__PURE__ */ jsxs190("span", { className: "w-7 shrink-0 text-right text-[10px] font-semibold tabular-nums text-neutral-500 dark:text-neutral-400", children: [
62913
63344
  Math.round(value * 100),
62914
63345
  "%"
62915
63346
  ] })
@@ -62941,7 +63372,7 @@ var TaskBar = ({
62941
63372
  const t = useKitT();
62942
63373
  const milestone = task.type === "milestone";
62943
63374
  const barColor = task.color ?? color;
62944
- const tokens = useMemo52(() => getGanttBarTokens(barColor), [barColor]);
63375
+ const tokens = useMemo57(() => getGanttBarTokens(barColor), [barColor]);
62945
63376
  const startMs = liveDates ? liveDates.start : toMs(task.start);
62946
63377
  const endMs = liveDates ? liveDates.end : toMs(task.end);
62947
63378
  const left = dateToX(startMs, rangeStart, zoom);
@@ -62966,7 +63397,7 @@ var TaskBar = ({
62966
63397
  pct: progressPct
62967
63398
  });
62968
63399
  if (milestone) {
62969
- return /* @__PURE__ */ jsxs188(
63400
+ return /* @__PURE__ */ jsxs190(
62970
63401
  "div",
62971
63402
  {
62972
63403
  role: "button",
@@ -62974,7 +63405,7 @@ var TaskBar = ({
62974
63405
  "aria-label": ariaLabel,
62975
63406
  title: ariaLabel,
62976
63407
  "data-gantt-bar": task.id,
62977
- className: classNames115(
63408
+ className: classNames121(
62978
63409
  "absolute z-10 flex cursor-pointer items-center gap-1.5 outline-none",
62979
63410
  selected && selectionTokens.ring,
62980
63411
  "rounded"
@@ -62984,13 +63415,13 @@ var TaskBar = ({
62984
63415
  onClick: () => onSelect(task.id),
62985
63416
  onKeyDown: (e) => onBarKeyDown(e, task),
62986
63417
  children: [
62987
- /* @__PURE__ */ jsx305("span", { className: classNames115("h-3.5 w-3.5 shrink-0 rotate-45 rounded-[2px] shadow-sm", tokens.milestone) }),
62988
- /* @__PURE__ */ jsx305("span", { className: "truncate text-[11px] font-semibold text-neutral-700 dark:text-neutral-300", children: task.name })
63418
+ /* @__PURE__ */ jsx312("span", { className: classNames121("h-3.5 w-3.5 shrink-0 rotate-45 rounded-[2px] shadow-sm", tokens.milestone) }),
63419
+ /* @__PURE__ */ jsx312("span", { className: "truncate text-[11px] font-semibold text-neutral-700 dark:text-neutral-300", children: task.name })
62989
63420
  ]
62990
63421
  }
62991
63422
  );
62992
63423
  }
62993
- return /* @__PURE__ */ jsxs188(
63424
+ return /* @__PURE__ */ jsxs190(
62994
63425
  "div",
62995
63426
  {
62996
63427
  role: "button",
@@ -62998,7 +63429,7 @@ var TaskBar = ({
62998
63429
  "aria-label": ariaLabel,
62999
63430
  title: `${task.name} \xB7 ${formatDateTime(startMs, locale)} \u2192 ${formatDateTime(endMs, locale)} \xB7 ${progressPct}%`,
63000
63431
  "data-gantt-bar": task.id,
63001
- className: classNames115(
63432
+ className: classNames121(
63002
63433
  "group/bar absolute z-10 cursor-grab touch-none rounded-md shadow-sm outline-none transition-shadow active:cursor-grabbing",
63003
63434
  tokens.base,
63004
63435
  tokens.rim,
@@ -63015,17 +63446,17 @@ var TaskBar = ({
63015
63446
  onClick: () => onSelect(task.id),
63016
63447
  onKeyDown: (e) => onBarKeyDown(e, task),
63017
63448
  children: [
63018
- progress > 0 && /* @__PURE__ */ jsx305(
63449
+ progress > 0 && /* @__PURE__ */ jsx312(
63019
63450
  "div",
63020
63451
  {
63021
- className: classNames115("absolute inset-y-0 left-0 rounded-l-md", tokens.progress),
63452
+ className: classNames121("absolute inset-y-0 left-0 rounded-l-md", tokens.progress),
63022
63453
  style: { width: `${progress * 100}%` }
63023
63454
  }
63024
63455
  ),
63025
- canEdit && !row.isGroup && progress > 0 && progress < 1 && /* @__PURE__ */ jsx305(
63456
+ canEdit && !row.isGroup && progress > 0 && progress < 1 && /* @__PURE__ */ jsx312(
63026
63457
  "div",
63027
63458
  {
63028
- className: classNames115(
63459
+ className: classNames121(
63029
63460
  "absolute inset-y-0 z-20 w-2 cursor-ew-resize touch-none opacity-0 transition-opacity group-hover/bar:opacity-100",
63030
63461
  liveProgress != null && "opacity-100"
63031
63462
  ),
@@ -63033,10 +63464,10 @@ var TaskBar = ({
63033
63464
  onPointerDown: (e) => onProgressPointerDown(task, e),
63034
63465
  title: labels.progress,
63035
63466
  "aria-hidden": "true",
63036
- children: /* @__PURE__ */ jsx305("div", { className: "mx-auto h-full w-0.5 rounded-full bg-white/90" })
63467
+ children: /* @__PURE__ */ jsx312("div", { className: "mx-auto h-full w-0.5 rounded-full bg-white/90" })
63037
63468
  }
63038
63469
  ),
63039
- liveProgress != null && /* @__PURE__ */ jsxs188(
63470
+ liveProgress != null && /* @__PURE__ */ jsxs190(
63040
63471
  "div",
63041
63472
  {
63042
63473
  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",
@@ -63047,31 +63478,31 @@ var TaskBar = ({
63047
63478
  ]
63048
63479
  }
63049
63480
  ),
63050
- showName && (renderBar != null ? /* @__PURE__ */ jsx305("div", { className: classNames115("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__ */ jsx305("span", { className: classNames115("pointer-events-none absolute inset-0 flex items-center truncate px-1.5 text-[11px] font-medium", labelText), children: task.name })),
63051
- canEdit && /* @__PURE__ */ jsxs188(Fragment48, { children: [
63052
- /* @__PURE__ */ jsx305(
63481
+ 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 })),
63482
+ canEdit && /* @__PURE__ */ jsxs190(Fragment48, { children: [
63483
+ /* @__PURE__ */ jsx312(
63053
63484
  "div",
63054
63485
  {
63055
63486
  className: "absolute inset-y-0 -left-1 z-20 w-2 cursor-ew-resize touch-none",
63056
63487
  onPointerDown: (e) => onResizePointerDown(task, "start", e),
63057
63488
  title: t("kit.gantt.resizeStart"),
63058
63489
  "aria-hidden": "true",
63059
- children: /* @__PURE__ */ jsx305("div", { className: "mx-auto h-full w-1 rounded-full bg-white/0 opacity-0 transition-opacity group-hover/bar:opacity-100" })
63490
+ 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" })
63060
63491
  }
63061
63492
  ),
63062
- /* @__PURE__ */ jsx305(
63493
+ /* @__PURE__ */ jsx312(
63063
63494
  "div",
63064
63495
  {
63065
63496
  className: "absolute inset-y-0 -right-1 z-20 w-2 cursor-ew-resize touch-none",
63066
63497
  onPointerDown: (e) => onResizePointerDown(task, "end", e),
63067
63498
  title: t("kit.gantt.resizeEnd"),
63068
63499
  "aria-hidden": "true",
63069
- children: /* @__PURE__ */ jsx305("div", { className: "mx-auto h-full w-1 rounded-full bg-white/0 opacity-0 transition-opacity group-hover/bar:opacity-100" })
63500
+ 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" })
63070
63501
  }
63071
63502
  )
63072
63503
  ] }),
63073
- canEdit && /* @__PURE__ */ jsxs188(Fragment48, { children: [
63074
- /* @__PURE__ */ jsx305(
63504
+ canEdit && /* @__PURE__ */ jsxs190(Fragment48, { children: [
63505
+ /* @__PURE__ */ jsx312(
63075
63506
  "button",
63076
63507
  {
63077
63508
  type: "button",
@@ -63082,7 +63513,7 @@ var TaskBar = ({
63082
63513
  "aria-label": t("kit.gantt.linkFromStart", { task: task.name })
63083
63514
  }
63084
63515
  ),
63085
- /* @__PURE__ */ jsx305(
63516
+ /* @__PURE__ */ jsx312(
63086
63517
  "button",
63087
63518
  {
63088
63519
  type: "button",
@@ -63100,9 +63531,9 @@ var TaskBar = ({
63100
63531
  };
63101
63532
 
63102
63533
  // src/components/Gantt/GanttToolbar.tsx
63103
- import { useMemo as useMemo53 } from "react";
63104
- import classNames116 from "classnames";
63105
- import { jsx as jsx306, jsxs as jsxs189 } from "react/jsx-runtime";
63534
+ import { useMemo as useMemo58 } from "react";
63535
+ import classNames122 from "classnames";
63536
+ import { jsx as jsx313, jsxs as jsxs191 } from "react/jsx-runtime";
63106
63537
  function nearestPreset(zoom, presets) {
63107
63538
  let best = null;
63108
63539
  let bestDist = Infinity;
@@ -63129,25 +63560,25 @@ var GanttToolbar = ({
63129
63560
  Month: t("kit.gantt.zoomMonth"),
63130
63561
  Quarter: t("kit.gantt.zoomQuarter")
63131
63562
  };
63132
- const active = useMemo53(() => nearestPreset(zoom, presets), [zoom, presets]);
63133
- const chrome = useMemo53(
63563
+ const active = useMemo58(() => nearestPreset(zoom, presets), [zoom, presets]);
63564
+ const chrome = useMemo58(
63134
63565
  () => getSurfaceVariantClasses(variant, "neutral"),
63135
63566
  [variant]
63136
63567
  );
63137
- return /* @__PURE__ */ jsxs189(
63568
+ return /* @__PURE__ */ jsxs191(
63138
63569
  "div",
63139
63570
  {
63140
- className: classNames116(
63571
+ className: classNames122(
63141
63572
  "pointer-events-auto flex items-center gap-1 rounded-lg p-1",
63142
63573
  chrome
63143
63574
  ),
63144
63575
  children: [
63145
- /* @__PURE__ */ jsx306("div", { className: "flex items-center rounded-md bg-neutral-100 p-0.5 dark:bg-neutral-800", children: presets.map((p) => /* @__PURE__ */ jsx306(
63576
+ /* @__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(
63146
63577
  "button",
63147
63578
  {
63148
63579
  type: "button",
63149
63580
  onClick: () => onZoomTo(p.value),
63150
- className: classNames116(
63581
+ className: classNames122(
63151
63582
  "rounded px-1.5 py-0.5 text-[10.5px] font-semibold transition-colors",
63152
63583
  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"
63153
63584
  ),
@@ -63155,9 +63586,9 @@ var GanttToolbar = ({
63155
63586
  },
63156
63587
  p.label
63157
63588
  )) }),
63158
- /* @__PURE__ */ jsx306("div", { className: "mx-0.5 h-4 w-px bg-neutral-200 dark:bg-neutral-700" }),
63159
- /* @__PURE__ */ jsx306(Button_default, { variant: "ghost", size: "xs", onClick: () => onZoomBy(1 / 1.25), "aria-label": t("kit.gantt.zoomOut"), children: /* @__PURE__ */ jsx306("span", { className: "text-xs font-semibold leading-none", children: "\u2212" }) }),
63160
- /* @__PURE__ */ jsx306(Button_default, { variant: "ghost", size: "xs", onClick: () => onZoomBy(1.25), "aria-label": t("kit.gantt.zoomIn"), children: /* @__PURE__ */ jsx306("span", { className: "text-xs font-semibold leading-none", children: "+" }) })
63589
+ /* @__PURE__ */ jsx313("div", { className: "mx-0.5 h-4 w-px bg-neutral-200 dark:bg-neutral-700" }),
63590
+ /* @__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" }) }),
63591
+ /* @__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: "+" }) })
63161
63592
  ]
63162
63593
  }
63163
63594
  );
@@ -63165,7 +63596,7 @@ var GanttToolbar = ({
63165
63596
  GanttToolbar.displayName = "GanttToolbar";
63166
63597
 
63167
63598
  // src/components/Gantt/useGanttDrag.ts
63168
- import { useCallback as useCallback41, useEffect as useEffect70, useMemo as useMemo54, useRef as useRef67, useState as useState78 } from "react";
63599
+ import { useCallback as useCallback41, useEffect as useEffect70, useMemo as useMemo59, useRef as useRef67, useState as useState78 } from "react";
63169
63600
  function useGanttDrag(opts) {
63170
63601
  const [drag, setDrag] = useState78(null);
63171
63602
  const [linkSelected, setLinkSelected] = useState78(null);
@@ -63483,7 +63914,7 @@ function useGanttDrag(opts) {
63483
63914
  },
63484
63915
  [beginDrag, timelineX, rowY]
63485
63916
  );
63486
- const rubber = useMemo54(() => {
63917
+ const rubber = useMemo59(() => {
63487
63918
  if (!drag || drag.kind !== "link") return null;
63488
63919
  const source = barGeom(drag.taskId);
63489
63920
  if (!source) return null;
@@ -63515,7 +63946,7 @@ function useGanttDrag(opts) {
63515
63946
  }
63516
63947
 
63517
63948
  // src/components/Gantt/Gantt.tsx
63518
- import { jsx as jsx307, jsxs as jsxs190 } from "react/jsx-runtime";
63949
+ import { jsx as jsx314, jsxs as jsxs192 } from "react/jsx-runtime";
63519
63950
  var HEADER_HEIGHT = 52;
63520
63951
  var GRIP_WIDTH = 36;
63521
63952
  var DEFAULT_COLUMNS = [
@@ -63574,7 +64005,7 @@ var Gantt = ({
63574
64005
  const t = useKitT();
63575
64006
  const kitEngine = useKitEngine();
63576
64007
  const dateLocale = locale ?? kitEngine.locale;
63577
- const allLabels = useMemo55(
64008
+ const allLabels = useMemo60(
63578
64009
  () => ({
63579
64010
  loading: t("kit.gantt.loading"),
63580
64011
  empty: t("kit.gantt.empty"),
@@ -63597,7 +64028,7 @@ var Gantt = ({
63597
64028
  title: c.key === "name" ? allLabels.task : c.key === "owner" ? t("kit.gantt.colOwner") : t("kit.gantt.colProgress")
63598
64029
  }));
63599
64030
  const interactive = editable ?? Boolean(onTasksChange || onLinksChange || onReorder);
63600
- const surfaceText = useMemo55(() => getSurfaceTextTokens(variant), [variant]);
64031
+ const surfaceText = useMemo60(() => getSurfaceTextTokens(variant), [variant]);
63601
64032
  const [internalZoom, setInternalZoom] = useState79(initialZoom);
63602
64033
  const zoom = zoomProp ?? internalZoom;
63603
64034
  const setZoom = useCallback42(
@@ -63660,30 +64091,30 @@ var Gantt = ({
63660
64091
  return next;
63661
64092
  });
63662
64093
  }, []);
63663
- const effectiveTasks = useMemo55(() => {
64094
+ const effectiveTasks = useMemo60(() => {
63664
64095
  let out = tasks;
63665
64096
  if (collapsed.size > 0) {
63666
64097
  out = out.map((t2) => collapsed.has(t2.id) ? { ...t2, open: false } : t2);
63667
64098
  }
63668
64099
  return out;
63669
64100
  }, [tasks, collapsed]);
63670
- const effectiveLanes = useMemo55(() => {
64101
+ const effectiveLanes = useMemo60(() => {
63671
64102
  if (closedLanes.size === 0) return lanes;
63672
64103
  return (lanes ?? []).map(
63673
64104
  (l) => closedLanes.has(l.id) ? { ...l, open: false } : l
63674
64105
  );
63675
64106
  }, [lanes, closedLanes]);
63676
- const committedModel = useMemo55(
64107
+ const committedModel = useMemo60(
63677
64108
  () => buildRows(effectiveTasks, effectiveLanes, rowOrder, rowHeight2),
63678
64109
  [effectiveTasks, effectiveLanes, rowOrder, rowHeight2]
63679
64110
  );
63680
- const range = useMemo55(() => {
64111
+ const range = useMemo60(() => {
63681
64112
  const starts = tasks.map((t2) => toMs(t2.start));
63682
64113
  const ends = tasks.map((t2) => toMs(t2.end));
63683
64114
  return computeViewRange(starts, ends);
63684
64115
  }, [tasks]);
63685
64116
  const timelineWidth = rangeWidth(range.start, range.end, zoom);
63686
- const scaleLevels = useMemo55(
64117
+ const scaleLevels = useMemo60(
63687
64118
  () => buildTimeScale(range.start, range.end, zoom, dateLocale),
63688
64119
  [range, zoom, dateLocale]
63689
64120
  );
@@ -63700,7 +64131,7 @@ var Gantt = ({
63700
64131
  const m = /^(\d+(?:\.\d+)?)px$/.exec(col.width ?? "");
63701
64132
  return m ? Number(m[1]) : 160;
63702
64133
  };
63703
- const sizedColumns = useMemo55(
64134
+ const sizedColumns = useMemo60(
63704
64135
  () => resolvedColumns.map((c) => ({ ...c, width: `${effectiveColWidth(c)}px` })),
63705
64136
  [resolvedColumns, colWidths]
63706
64137
  );
@@ -63708,7 +64139,7 @@ var Gantt = ({
63708
64139
  effectiveWidthsRef.current = Object.fromEntries(
63709
64140
  sizedColumns.map((c) => [c.key, effectiveColWidth(c)])
63710
64141
  );
63711
- const leftWidth = useMemo55(
64142
+ const leftWidth = useMemo60(
63712
64143
  () => GRIP_WIDTH + resolvedColumns.reduce((sum, c) => sum + effectiveColWidth(c), 0),
63713
64144
  [resolvedColumns, colWidths]
63714
64145
  );
@@ -63817,12 +64248,12 @@ var Gantt = ({
63817
64248
  rowOrder,
63818
64249
  setSelected
63819
64250
  });
63820
- const liveReorder = useMemo55(() => {
64251
+ const liveReorder = useMemo60(() => {
63821
64252
  const d = dragApi.drag;
63822
64253
  if (d?.kind !== "reorder" || d.beforeId === void 0) return null;
63823
64254
  return applyRowReorder(effectiveTasks, d.taskId, d.beforeId, rowOrder);
63824
64255
  }, [dragApi.drag, effectiveTasks, rowOrder]);
63825
- const liveModel = useMemo55(
64256
+ const liveModel = useMemo60(
63826
64257
  () => liveReorder ? buildRows(
63827
64258
  liveReorder.tasks,
63828
64259
  effectiveLanes,
@@ -63832,7 +64263,7 @@ var Gantt = ({
63832
64263
  [liveReorder, effectiveLanes, rowHeight2, committedModel]
63833
64264
  );
63834
64265
  liveRowsRef.current = liveModel.rows;
63835
- const bars = useMemo55(() => {
64266
+ const bars = useMemo60(() => {
63836
64267
  const map = /* @__PURE__ */ new Map();
63837
64268
  for (const row of liveModel.rows) {
63838
64269
  if (!row.task) continue;
@@ -63988,22 +64419,22 @@ var Gantt = ({
63988
64419
  const drag = dragApi.drag;
63989
64420
  const dragTask = drag?.taskId ? committedModel.tasksById.get(drag.taskId) : void 0;
63990
64421
  const reorderLineY = drag?.kind === "reorder" && drag.beforeId !== void 0 ? reorderPreviewTop(liveModel.rows, `task:${drag.taskId}`, drag.beforeId) : null;
63991
- const dragSubtree = useMemo55(() => {
64422
+ const dragSubtree = useMemo60(() => {
63992
64423
  if (dragApi.drag?.kind !== "reorder") return null;
63993
64424
  return reorderDragSubtree(
63994
64425
  liveModel.rows,
63995
64426
  `task:${dragApi.drag.taskId}`
63996
64427
  );
63997
64428
  }, [dragApi.drag, liveModel.rows]);
63998
- const dragSubtreeKeys = useMemo55(
64429
+ const dragSubtreeKeys = useMemo60(
63999
64430
  () => new Set((dragSubtree ?? []).map((r) => r.key)),
64000
64431
  [dragSubtree]
64001
64432
  );
64002
- const dragSubtreeHeight = useMemo55(
64433
+ const dragSubtreeHeight = useMemo60(
64003
64434
  () => (dragSubtree ?? []).reduce((sum, r) => sum + r.height, 0),
64004
64435
  [dragSubtree]
64005
64436
  );
64006
- const liveDragDates = useMemo55(() => {
64437
+ const liveDragDates = useMemo60(() => {
64007
64438
  if (!drag || !dragTask) return null;
64008
64439
  if (drag.kind !== "move" && drag.kind !== "resize-start" && drag.kind !== "resize-end") return null;
64009
64440
  return applyDragDates(
@@ -64014,7 +64445,7 @@ var Gantt = ({
64014
64445
  );
64015
64446
  }, [drag, dragTask, zoom, snap2]);
64016
64447
  const liveDragProgress = drag?.kind === "progress" && drag.liveProgress != null ? drag.liveProgress : null;
64017
- const dragOverride = useMemo55(() => {
64448
+ const dragOverride = useMemo60(() => {
64018
64449
  if (!drag || !dragTask) return null;
64019
64450
  if (drag.kind === "progress" && drag.liveProgress != null) {
64020
64451
  return { ...dragTask, progress: drag.liveProgress };
@@ -64024,11 +64455,11 @@ var Gantt = ({
64024
64455
  }
64025
64456
  return null;
64026
64457
  }, [drag, dragTask, liveDragDates]);
64027
- const liveLaneProgress = useMemo55(
64458
+ const liveLaneProgress = useMemo60(
64028
64459
  () => dragOverride && dragTask ? laneRollupProgress(effectiveTasks, dragTask.id, dragOverride) : null,
64029
64460
  [dragOverride, dragTask, effectiveTasks]
64030
64461
  );
64031
- const liveGroupProgress = useMemo55(() => {
64462
+ const liveGroupProgress = useMemo60(() => {
64032
64463
  if (!dragOverride || !dragTask) return null;
64033
64464
  const byId = new Map(effectiveTasks.map((t2) => [t2.id, t2]));
64034
64465
  const m = /* @__PURE__ */ new Map();
@@ -64040,7 +64471,7 @@ var Gantt = ({
64040
64471
  }
64041
64472
  return m.size > 0 ? m : null;
64042
64473
  }, [dragOverride, dragTask, effectiveTasks]);
64043
- const liveLinkBars = useMemo55(() => {
64474
+ const liveLinkBars = useMemo60(() => {
64044
64475
  if (!liveDragDates || !dragTask) return bars;
64045
64476
  const g = bars.get(dragTask.id);
64046
64477
  if (!g) return bars;
@@ -64049,12 +64480,12 @@ var Gantt = ({
64049
64480
  if (left === g.left && width === g.width) return bars;
64050
64481
  return new Map(bars).set(dragTask.id, { ...g, left, width });
64051
64482
  }, [bars, liveDragDates, dragTask, range, zoom]);
64052
- const linkPaths = useMemo55(
64483
+ const linkPaths = useMemo60(
64053
64484
  () => computeLinkPaths(links, liveLinkBars, color),
64054
64485
  [links, liveLinkBars, color]
64055
64486
  );
64056
- const linkFan = useMemo55(() => computeLinkFanOffsets(links, bars), [links, bars]);
64057
- return /* @__PURE__ */ jsx307(
64487
+ const linkFan = useMemo60(() => computeLinkFanOffsets(links, bars), [links, bars]);
64488
+ return /* @__PURE__ */ jsx314(
64058
64489
  Panel_default,
64059
64490
  {
64060
64491
  ref: rootRef,
@@ -64072,31 +64503,31 @@ var Gantt = ({
64072
64503
  "aria-label": t("kit.gantt.root"),
64073
64504
  onKeyDown: onRootKeyDown,
64074
64505
  onPointerDown: handleRootPointerDown,
64075
- children: /* @__PURE__ */ jsxs190("div", { className: "flex h-full min-h-0 flex-col", children: [
64076
- /* @__PURE__ */ jsxs190(
64506
+ children: /* @__PURE__ */ jsxs192("div", { className: "flex h-full min-h-0 flex-col", children: [
64507
+ /* @__PURE__ */ jsxs192(
64077
64508
  "div",
64078
64509
  {
64079
- className: classNames117(
64510
+ className: classNames123(
64080
64511
  "flex shrink-0 items-center gap-3 border-b px-4 py-3",
64081
64512
  surfaceText.divider
64082
64513
  ),
64083
64514
  children: [
64084
- hasNode(icon) && /* @__PURE__ */ jsx307(
64515
+ hasNode(icon) && /* @__PURE__ */ jsx314(
64085
64516
  "div",
64086
64517
  {
64087
- className: classNames117(
64518
+ className: classNames123(
64088
64519
  "flex h-10 w-10 shrink-0 items-center justify-center rounded-xl",
64089
64520
  getSurfaceVariantClasses(variant, "neutral")
64090
64521
  ),
64091
64522
  children: icon
64092
64523
  }
64093
64524
  ),
64094
- (title != null || subtitle != null) && /* @__PURE__ */ jsxs190("div", { className: "min-w-0 flex-1", children: [
64095
- subtitle != null && /* @__PURE__ */ jsx307("div", { className: "truncate text-[11px] font-semibold uppercase tracking-wider text-neutral-500 dark:text-neutral-400", children: subtitle }),
64096
- title != null && /* @__PURE__ */ jsx307("div", { className: "truncate text-lg font-semibold text-neutral-900 dark:text-white", children: title })
64525
+ (title != null || subtitle != null) && /* @__PURE__ */ jsxs192("div", { className: "min-w-0 flex-1", children: [
64526
+ subtitle != null && /* @__PURE__ */ jsx314("div", { className: "truncate text-[11px] font-semibold uppercase tracking-wider text-neutral-500 dark:text-neutral-400", children: subtitle }),
64527
+ title != null && /* @__PURE__ */ jsx314("div", { className: "truncate text-lg font-semibold text-neutral-900 dark:text-white", children: title })
64097
64528
  ] }),
64098
- hasNode(actions) && /* @__PURE__ */ jsx307("div", { className: "flex shrink-0 items-center gap-2", children: actions }),
64099
- /* @__PURE__ */ jsx307("div", { className: "ml-auto shrink-0", children: /* @__PURE__ */ jsx307(
64529
+ hasNode(actions) && /* @__PURE__ */ jsx314("div", { className: "flex shrink-0 items-center gap-2", children: actions }),
64530
+ /* @__PURE__ */ jsx314("div", { className: "ml-auto shrink-0", children: /* @__PURE__ */ jsx314(
64100
64531
  GanttToolbar,
64101
64532
  {
64102
64533
  variant,
@@ -64109,31 +64540,31 @@ var Gantt = ({
64109
64540
  ]
64110
64541
  }
64111
64542
  ),
64112
- /* @__PURE__ */ jsxs190(
64543
+ /* @__PURE__ */ jsxs192(
64113
64544
  "div",
64114
64545
  {
64115
- className: classNames117(
64546
+ className: classNames123(
64116
64547
  "relative flex shrink-0 items-stretch border-b",
64117
64548
  surfaceText.divider
64118
64549
  ),
64119
64550
  style: { height: HEADER_HEIGHT },
64120
64551
  children: [
64121
- /* @__PURE__ */ jsxs190(
64552
+ /* @__PURE__ */ jsxs192(
64122
64553
  "div",
64123
64554
  {
64124
- className: classNames117(
64555
+ className: classNames123(
64125
64556
  "flex items-stretch border-r bg-white dark:bg-neutral-900",
64126
64557
  surfaceText.divider
64127
64558
  ),
64128
64559
  style: { width: leftWidth },
64129
64560
  children: [
64130
- /* @__PURE__ */ jsx307("div", { className: "w-9 shrink-0" }),
64561
+ /* @__PURE__ */ jsx314("div", { className: "w-9 shrink-0" }),
64131
64562
  sizedColumns.map((col) => {
64132
64563
  const resizable = resizableColumns && col.resizable !== false;
64133
- return /* @__PURE__ */ jsxs190(
64564
+ return /* @__PURE__ */ jsxs192(
64134
64565
  "div",
64135
64566
  {
64136
- className: classNames117(
64567
+ className: classNames123(
64137
64568
  "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",
64138
64569
  surfaceText.divider
64139
64570
  ),
@@ -64142,7 +64573,7 @@ var Gantt = ({
64142
64573
  justifyContent: col.align === "center" ? "center" : col.align === "right" ? "flex-end" : "flex-start"
64143
64574
  },
64144
64575
  children: [
64145
- /* @__PURE__ */ jsx307("span", { className: "truncate", children: col.title }),
64576
+ /* @__PURE__ */ jsx314("span", { className: "truncate", children: col.title }),
64146
64577
  resizable && /* Resize handle — Table's header-edge pattern: an 8px hit
64147
64578
  area whose 1px line sits exactly on the column border.
64148
64579
  Absolute insets stop at the padding edge (1px inside
@@ -64151,7 +64582,7 @@ var Gantt = ({
64151
64582
  the border's own pixel. The cell carries no
64152
64583
  overflow-hidden so the line can paint over the border
64153
64584
  (the title span truncates itself). */
64154
- /* @__PURE__ */ jsx307(
64585
+ /* @__PURE__ */ jsx314(
64155
64586
  "div",
64156
64587
  {
64157
64588
  role: "separator",
@@ -64160,7 +64591,7 @@ var Gantt = ({
64160
64591
  className: "group/rh absolute inset-y-0 -right-px z-10 flex w-2 cursor-col-resize select-none items-stretch justify-end",
64161
64592
  onPointerDown: (e) => startColumnResize(e, col.key),
64162
64593
  title: t("kit.gantt.resizeColumn", { column: col.title }),
64163
- children: /* @__PURE__ */ jsx307(
64594
+ children: /* @__PURE__ */ jsx314(
64164
64595
  "div",
64165
64596
  {
64166
64597
  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",
@@ -64177,30 +64608,30 @@ var Gantt = ({
64177
64608
  ]
64178
64609
  }
64179
64610
  ),
64180
- /* @__PURE__ */ jsx307("div", { className: "relative min-w-0 flex-1 overflow-hidden", children: /* @__PURE__ */ jsxs190(
64611
+ /* @__PURE__ */ jsx314("div", { className: "relative min-w-0 flex-1 overflow-hidden", children: /* @__PURE__ */ jsxs192(
64181
64612
  "div",
64182
64613
  {
64183
64614
  ref: headerScaleRef,
64184
64615
  className: "relative h-full",
64185
64616
  style: { width: timelineWidth },
64186
64617
  children: [
64187
- /* @__PURE__ */ jsx307(GanttScale, { levels: scaleLevels, height: HEADER_HEIGHT }),
64188
- todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ jsx307(
64618
+ /* @__PURE__ */ jsx314(GanttScale, { levels: scaleLevels, height: HEADER_HEIGHT }),
64619
+ todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ jsx314(
64189
64620
  "div",
64190
64621
  {
64191
- className: classNames117(
64622
+ className: classNames123(
64192
64623
  "pointer-events-none absolute inset-y-0 z-[1] border-l-2",
64193
64624
  todayTokens.line
64194
64625
  ),
64195
64626
  style: { left: todayX }
64196
64627
  }
64197
64628
  ),
64198
- todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ jsx307(
64629
+ todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ jsx314(
64199
64630
  "div",
64200
64631
  {
64201
64632
  className: "pointer-events-none absolute top-1 z-10 -translate-x-1/2",
64202
64633
  style: { left: todayX },
64203
- children: /* @__PURE__ */ jsx307("span", { className: classNames117("rounded-full px-2 py-0.5 text-[10px] font-semibold text-white shadow-sm", todayTokens.chip), children: allLabels.today })
64634
+ 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 })
64204
64635
  }
64205
64636
  )
64206
64637
  ]
@@ -64209,20 +64640,20 @@ var Gantt = ({
64209
64640
  ]
64210
64641
  }
64211
64642
  ),
64212
- /* @__PURE__ */ jsx307(
64643
+ /* @__PURE__ */ jsx314(
64213
64644
  "div",
64214
64645
  {
64215
64646
  ref: scrollRef,
64216
64647
  className: `gantt-scroller min-h-0 flex-1 overflow-auto overscroll-contain [&::-webkit-scrollbar]:h-1.5 ${THIN_SCROLLBAR}`,
64217
64648
  onScroll: syncHeaderScale,
64218
- children: /* @__PURE__ */ jsx307("div", { style: { width: leftWidth + timelineWidth + LINK_RIGHT_GUTTER, minWidth: "100%" }, children: loading ? /* @__PURE__ */ jsx307(GanttSkeleton, { rows: 12, rowHeight: rowHeight2, leftWidth }) : isEmpty2 ? /* @__PURE__ */ jsx307("div", { className: "flex items-center justify-center text-sm text-neutral-500", style: { height: bodyHeight || 160, width: leftWidth + timelineWidth }, children: emptyState ?? allLabels.empty }) : /* @__PURE__ */ jsxs190("div", { className: "relative", style: { height: bodyHeight }, children: [
64219
- /* @__PURE__ */ jsxs190(
64649
+ 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: [
64650
+ /* @__PURE__ */ jsxs192(
64220
64651
  "div",
64221
64652
  {
64222
64653
  className: "pointer-events-none absolute inset-y-0 z-0",
64223
64654
  style: { left: leftWidth, width: timelineWidth },
64224
64655
  children: [
64225
- scaleLevels.length > 0 && scaleLevels[scaleLevels.length - 1].columns.map((c) => /* @__PURE__ */ jsx307(
64656
+ scaleLevels.length > 0 && scaleLevels[scaleLevels.length - 1].columns.map((c) => /* @__PURE__ */ jsx314(
64226
64657
  "div",
64227
64658
  {
64228
64659
  className: "absolute inset-y-0 border-r border-neutral-100 dark:border-neutral-800",
@@ -64230,10 +64661,10 @@ var Gantt = ({
64230
64661
  },
64231
64662
  c.id
64232
64663
  )),
64233
- todayVisible && /* @__PURE__ */ jsx307(
64664
+ todayVisible && /* @__PURE__ */ jsx314(
64234
64665
  "div",
64235
64666
  {
64236
- className: classNames117("absolute inset-y-0 border-l-2", todayTokens.line),
64667
+ className: classNames123("absolute inset-y-0 border-l-2", todayTokens.line),
64237
64668
  style: { left: todayX }
64238
64669
  }
64239
64670
  )
@@ -64243,7 +64674,7 @@ var Gantt = ({
64243
64674
  liveModel.rows.map((row) => {
64244
64675
  const isDragSource = drag?.kind === "reorder" && row.task != null && row.task.id === drag.taskId;
64245
64676
  if (isDragSource) {
64246
- return /* @__PURE__ */ jsx307(
64677
+ return /* @__PURE__ */ jsx314(
64247
64678
  "div",
64248
64679
  {
64249
64680
  "data-row-key": row.key,
@@ -64251,7 +64682,7 @@ var Gantt = ({
64251
64682
  "aria-hidden": "true",
64252
64683
  className: "pointer-events-none flex border-b",
64253
64684
  style: { height: dragSubtreeHeight || row.height },
64254
- children: /* @__PURE__ */ jsx307(
64685
+ children: /* @__PURE__ */ jsx314(
64255
64686
  "div",
64256
64687
  {
64257
64688
  className: "m-1 flex-1 rounded-md border-2 border-dashed",
@@ -64268,7 +64699,7 @@ var Gantt = ({
64268
64699
  if (drag?.kind === "reorder" && dragSubtreeKeys.has(row.key)) {
64269
64700
  return null;
64270
64701
  }
64271
- return /* @__PURE__ */ jsx307(
64702
+ return /* @__PURE__ */ jsx314(
64272
64703
  GanttBodyRow,
64273
64704
  {
64274
64705
  row,
@@ -64306,7 +64737,7 @@ var Gantt = ({
64306
64737
  row.key
64307
64738
  );
64308
64739
  }),
64309
- /* @__PURE__ */ jsx307(
64740
+ /* @__PURE__ */ jsx314(
64310
64741
  GanttLinkLayer,
64311
64742
  {
64312
64743
  ref: overlayRef,
@@ -64322,7 +64753,7 @@ var Gantt = ({
64322
64753
  onDeleteLink: interactive && onLinksChange ? deleteSelectedLink : void 0
64323
64754
  }
64324
64755
  ),
64325
- drag?.kind === "reorder" && reorderLineY != null && /* @__PURE__ */ jsx307(
64756
+ drag?.kind === "reorder" && reorderLineY != null && /* @__PURE__ */ jsx314(
64326
64757
  "div",
64327
64758
  {
64328
64759
  className: "pointer-events-none absolute z-30 h-0.5 rounded-full",
@@ -64342,7 +64773,7 @@ var Gantt = ({
64342
64773
  // there is no filtered/overflowing ancestor and the fixed
64343
64774
  // clone always tracks the viewport pointer.
64344
64775
  createPortal15(
64345
- /* @__PURE__ */ jsx307(
64776
+ /* @__PURE__ */ jsx314(
64346
64777
  "div",
64347
64778
  {
64348
64779
  "data-gantt-drag-clone": "true",
@@ -64353,14 +64784,14 @@ var Gantt = ({
64353
64784
  top: drag.clientY - (drag.grabOffset?.y ?? 0),
64354
64785
  width: leftWidth + timelineWidth + LINK_RIGHT_GUTTER
64355
64786
  },
64356
- children: /* @__PURE__ */ jsx307(
64787
+ children: /* @__PURE__ */ jsx314(
64357
64788
  "div",
64358
64789
  {
64359
64790
  className: "overflow-hidden rounded-lg bg-white/95 shadow-2xl backdrop-blur-sm dark:bg-neutral-900/95",
64360
64791
  style: {
64361
64792
  boxShadow: `0 8px 32px rgba(0, 0, 0, 0.28), inset 2px 0 0 var(--color-${color}-500)`
64362
64793
  },
64363
- children: dragSubtree.map((row) => /* @__PURE__ */ jsx307(
64794
+ children: dragSubtree.map((row) => /* @__PURE__ */ jsx314(
64364
64795
  GanttBodyRow,
64365
64796
  {
64366
64797
  row,
@@ -64403,7 +64834,7 @@ var Gantt = ({
64403
64834
  ),
64404
64835
  document.body
64405
64836
  ),
64406
- drag && drag.kind !== "reorder" && dragTask && liveDragDates && /* @__PURE__ */ jsx307(
64837
+ drag && drag.kind !== "reorder" && dragTask && liveDragDates && /* @__PURE__ */ jsx314(
64407
64838
  "div",
64408
64839
  {
64409
64840
  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",
@@ -64434,13 +64865,13 @@ var GanttSkeleton = ({
64434
64865
  rows,
64435
64866
  rowHeight: rowHeight2,
64436
64867
  leftWidth
64437
- }) => /* @__PURE__ */ jsx307("div", { className: "animate-pulse", "aria-busy": "true", children: Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ jsxs190("div", { className: "flex", style: { height: rowHeight2 }, children: [
64438
- /* @__PURE__ */ jsx307(
64868
+ }) => /* @__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: [
64869
+ /* @__PURE__ */ jsx314(
64439
64870
  "div",
64440
64871
  {
64441
64872
  className: "sticky left-0 flex items-center border-b border-neutral-100 bg-white px-3 dark:border-neutral-800 dark:bg-neutral-900",
64442
64873
  style: { width: leftWidth },
64443
- children: /* @__PURE__ */ jsx307(
64874
+ children: /* @__PURE__ */ jsx314(
64444
64875
  "div",
64445
64876
  {
64446
64877
  className: "h-3 rounded-full bg-neutral-200 dark:bg-neutral-700",
@@ -64449,7 +64880,7 @@ var GanttSkeleton = ({
64449
64880
  )
64450
64881
  }
64451
64882
  ),
64452
- /* @__PURE__ */ jsx307("div", { className: "relative flex-1", children: /* @__PURE__ */ jsx307(
64883
+ /* @__PURE__ */ jsx314("div", { className: "relative flex-1", children: /* @__PURE__ */ jsx314(
64453
64884
  "div",
64454
64885
  {
64455
64886
  className: "absolute top-1/2 h-4 -translate-y-1/2 rounded-md bg-neutral-200/80 dark:bg-neutral-700/60",
@@ -64467,13 +64898,13 @@ import {
64467
64898
  useCallback as useCallback43,
64468
64899
  useContext as useContext8,
64469
64900
  useEffect as useEffect72,
64470
- useMemo as useMemo56,
64901
+ useMemo as useMemo61,
64471
64902
  useRef as useRef69,
64472
64903
  useState as useState80
64473
64904
  } from "react";
64474
64905
  import { createPortal as createPortal16 } from "react-dom";
64475
- import classNames118 from "classnames";
64476
- import { jsx as jsx308, jsxs as jsxs191 } from "react/jsx-runtime";
64906
+ import classNames124 from "classnames";
64907
+ import { jsx as jsx315, jsxs as jsxs193 } from "react/jsx-runtime";
64477
64908
  var BottomSheetContext = createContext8(null);
64478
64909
  var TRANSITION_MS2 = 260;
64479
64910
  var renderSlot = (slot, controls) => {
@@ -64527,13 +64958,13 @@ var BottomSheetProvider = ({
64527
64958
  },
64528
64959
  []
64529
64960
  );
64530
- const controls = useMemo56(
64961
+ const controls = useMemo61(
64531
64962
  () => ({
64532
64963
  dismiss: dismissSheet
64533
64964
  }),
64534
64965
  [dismissSheet]
64535
64966
  );
64536
- const contextValue = useMemo56(
64967
+ const contextValue = useMemo61(
64537
64968
  () => ({
64538
64969
  presentSheet,
64539
64970
  dismissSheet,
@@ -64543,11 +64974,11 @@ var BottomSheetProvider = ({
64543
64974
  [presentSheet, dismissSheet, sheet, isVisible]
64544
64975
  );
64545
64976
  const overlayNode = typeof document !== "undefined" && sheet ? createPortal16(
64546
- /* @__PURE__ */ jsxs191("div", { className: "pointer-events-none fixed inset-0 z-[70] flex items-end justify-center", children: [
64547
- /* @__PURE__ */ jsx308(
64977
+ /* @__PURE__ */ jsxs193("div", { className: "pointer-events-none fixed inset-0 z-[70] flex items-end justify-center", children: [
64978
+ /* @__PURE__ */ jsx315(
64548
64979
  "div",
64549
64980
  {
64550
- className: classNames118(
64981
+ className: classNames124(
64551
64982
  "absolute inset-0 bg-neutral-900/40 transition-opacity duration-300",
64552
64983
  isVisible ? "opacity-100 pointer-events-auto" : "opacity-0"
64553
64984
  ),
@@ -64557,24 +64988,24 @@ var BottomSheetProvider = ({
64557
64988
  }
64558
64989
  }
64559
64990
  ),
64560
- /* @__PURE__ */ jsx308("div", { className: "relative w-full max-w-4xl px-4 pb-4 sm:px-8", children: /* @__PURE__ */ jsxs191(
64991
+ /* @__PURE__ */ jsx315("div", { className: "relative w-full max-w-4xl px-4 pb-4 sm:px-8", children: /* @__PURE__ */ jsxs193(
64561
64992
  "section",
64562
64993
  {
64563
64994
  role: "dialog",
64564
64995
  "aria-modal": "true",
64565
- className: classNames118(
64996
+ className: classNames124(
64566
64997
  "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",
64567
64998
  sheet.className,
64568
64999
  isVisible ? "translate-y-0" : "translate-y-full"
64569
65000
  ),
64570
65001
  style: { minHeight: "25vh", maxHeight: "85vh" },
64571
65002
  children: [
64572
- /* @__PURE__ */ jsxs191("header", { className: "flex items-start justify-between gap-3 border-b border-slate-200 px-6 py-4 dark:border-slate-800", children: [
64573
- /* @__PURE__ */ jsxs191("div", { className: "space-y-1", children: [
64574
- sheet.title && /* @__PURE__ */ jsx308("div", { className: "text-base font-semibold text-slate-900 dark:text-slate-100", children: sheet.title }),
64575
- sheet.description && /* @__PURE__ */ jsx308("p", { className: "text-sm text-slate-500 dark:text-slate-300", children: sheet.description })
65003
+ /* @__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: [
65004
+ /* @__PURE__ */ jsxs193("div", { className: "space-y-1", children: [
65005
+ sheet.title && /* @__PURE__ */ jsx315("div", { className: "text-base font-semibold text-slate-900 dark:text-slate-100", children: sheet.title }),
65006
+ sheet.description && /* @__PURE__ */ jsx315("p", { className: "text-sm text-slate-500 dark:text-slate-300", children: sheet.description })
64576
65007
  ] }),
64577
- (sheet.showCloseButton ?? true) && /* @__PURE__ */ jsx308(
65008
+ (sheet.showCloseButton ?? true) && /* @__PURE__ */ jsx315(
64578
65009
  IconButton_default,
64579
65010
  {
64580
65011
  icon: "Close",
@@ -64586,15 +65017,15 @@ var BottomSheetProvider = ({
64586
65017
  }
64587
65018
  )
64588
65019
  ] }),
64589
- /* @__PURE__ */ jsx308("div", { className: "flex-1 overflow-y-auto px-6 py-4", children: renderSlot(sheet.content, controls) ?? /* @__PURE__ */ jsx308("p", { className: "text-sm text-slate-500", children: "No content provided." }) }),
64590
- sheet.actions && /* @__PURE__ */ jsx308("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) })
65020
+ /* @__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." }) }),
65021
+ 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) })
64591
65022
  ]
64592
65023
  }
64593
65024
  ) })
64594
65025
  ] }),
64595
65026
  document.body
64596
65027
  ) : null;
64597
- return /* @__PURE__ */ jsxs191(BottomSheetContext.Provider, { value: contextValue, children: [
65028
+ return /* @__PURE__ */ jsxs193(BottomSheetContext.Provider, { value: contextValue, children: [
64598
65029
  children,
64599
65030
  overlayNode
64600
65031
  ] });
@@ -65234,8 +65665,8 @@ var SYSTEM_VARIABLES = [
65234
65665
  ];
65235
65666
 
65236
65667
  // src/components/MetricBar.tsx
65237
- import classNames119 from "classnames";
65238
- import { jsx as jsx309 } from "react/jsx-runtime";
65668
+ import classNames125 from "classnames";
65669
+ import { jsx as jsx316 } from "react/jsx-runtime";
65239
65670
  var MetricBar = ({
65240
65671
  label,
65241
65672
  value,
@@ -65245,7 +65676,7 @@ var MetricBar = ({
65245
65676
  size = "sm",
65246
65677
  className,
65247
65678
  ...rest
65248
- }) => /* @__PURE__ */ jsx309(
65679
+ }) => /* @__PURE__ */ jsx316(
65249
65680
  Progress_default,
65250
65681
  {
65251
65682
  ...rest,
@@ -65255,7 +65686,7 @@ var MetricBar = ({
65255
65686
  formatValue: value !== void 0 ? () => String(value) : void 0,
65256
65687
  size,
65257
65688
  color: tone ?? color ?? "blue",
65258
- className: classNames119("w-full", className)
65689
+ className: classNames125("w-full", className)
65259
65690
  }
65260
65691
  );
65261
65692
  MetricBar.displayName = "MetricBar";
@@ -65334,6 +65765,7 @@ export {
65334
65765
  DEFAULT_LAYOUT_OPTIONS,
65335
65766
  DEFAULT_SERIES_PALETTE,
65336
65767
  DEFAULT_SURFACE_CORNER,
65768
+ DEFAULT_SURFACE_GUTTER,
65337
65769
  DEFAULT_SURFACE_PADDING,
65338
65770
  DEFAULT_SURFACE_TONE,
65339
65771
  DEFAULT_TOAST_GAP_PX,
@@ -65484,6 +65916,7 @@ export {
65484
65916
  STAT_PAGER_PLACEMENTS,
65485
65917
  SURFACE_CORNERS,
65486
65918
  SURFACE_GLASS_RIM,
65919
+ SURFACE_GUTTER_AXES,
65487
65920
  SURFACE_PADDINGS,
65488
65921
  SURFACE_TO_BUTTON_VARIANT,
65489
65922
  SURFACE_VARIANTS,
@@ -65576,6 +66009,10 @@ export {
65576
66009
  WorkflowRailSkeleton,
65577
66010
  WorkflowStatusNode_default as WorkflowStatusNode,
65578
66011
  WorkflowTracker_default as WorkflowTracker,
66012
+ WorkflowTrackerDetails_default as WorkflowTrackerDetails,
66013
+ WorkflowTrackerRail_default as WorkflowTrackerRail,
66014
+ WorkflowTrackerRollups_default as WorkflowTrackerRollups,
66015
+ WorkflowTrackerStepDetails_default as WorkflowTrackerStepDetails,
65579
66016
  areaPathFromPoints,
65580
66017
  bandAreaPath,
65581
66018
  buildColumns,
@@ -65713,6 +66150,7 @@ export {
65713
66150
  getStepperTonePalette,
65714
66151
  getSurfaceCornerClass,
65715
66152
  getSurfaceCornerRem,
66153
+ getSurfaceGutterClass,
65716
66154
  getSurfacePaddingClass,
65717
66155
  getSurfacePaddingClasses,
65718
66156
  getSurfaceTextTokens,