@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.cjs CHANGED
@@ -106,6 +106,7 @@ __export(src_exports, {
106
106
  DEFAULT_LAYOUT_OPTIONS: () => DEFAULT_LAYOUT_OPTIONS,
107
107
  DEFAULT_SERIES_PALETTE: () => DEFAULT_SERIES_PALETTE,
108
108
  DEFAULT_SURFACE_CORNER: () => DEFAULT_SURFACE_CORNER,
109
+ DEFAULT_SURFACE_GUTTER: () => DEFAULT_SURFACE_GUTTER,
109
110
  DEFAULT_SURFACE_PADDING: () => DEFAULT_SURFACE_PADDING,
110
111
  DEFAULT_SURFACE_TONE: () => DEFAULT_SURFACE_TONE,
111
112
  DEFAULT_TOAST_GAP_PX: () => DEFAULT_TOAST_GAP_PX,
@@ -256,6 +257,7 @@ __export(src_exports, {
256
257
  STAT_PAGER_PLACEMENTS: () => STAT_PAGER_PLACEMENTS,
257
258
  SURFACE_CORNERS: () => SURFACE_CORNERS,
258
259
  SURFACE_GLASS_RIM: () => SURFACE_GLASS_RIM,
260
+ SURFACE_GUTTER_AXES: () => SURFACE_GUTTER_AXES,
259
261
  SURFACE_PADDINGS: () => SURFACE_PADDINGS,
260
262
  SURFACE_TO_BUTTON_VARIANT: () => SURFACE_TO_BUTTON_VARIANT,
261
263
  SURFACE_VARIANTS: () => SURFACE_VARIANTS,
@@ -348,6 +350,10 @@ __export(src_exports, {
348
350
  WorkflowRailSkeleton: () => WorkflowRailSkeleton,
349
351
  WorkflowStatusNode: () => WorkflowStatusNode_default,
350
352
  WorkflowTracker: () => WorkflowTracker_default,
353
+ WorkflowTrackerDetails: () => WorkflowTrackerDetails_default,
354
+ WorkflowTrackerRail: () => WorkflowTrackerRail_default,
355
+ WorkflowTrackerRollups: () => WorkflowTrackerRollups_default,
356
+ WorkflowTrackerStepDetails: () => WorkflowTrackerStepDetails_default,
351
357
  areaPathFromPoints: () => areaPathFromPoints,
352
358
  bandAreaPath: () => bandAreaPath,
353
359
  buildColumns: () => buildColumns,
@@ -485,6 +491,7 @@ __export(src_exports, {
485
491
  getStepperTonePalette: () => getStepperTonePalette,
486
492
  getSurfaceCornerClass: () => getSurfaceCornerClass,
487
493
  getSurfaceCornerRem: () => getSurfaceCornerRem,
494
+ getSurfaceGutterClass: () => getSurfaceGutterClass,
488
495
  getSurfacePaddingClass: () => getSurfacePaddingClass,
489
496
  getSurfacePaddingClasses: () => getSurfacePaddingClasses,
490
497
  getSurfaceTextTokens: () => getSurfaceTextTokens,
@@ -5966,6 +5973,15 @@ var getSurfacePaddingClass = (padding) => surfacePaddingClasses[padding] ?? surf
5966
5973
  var getSurfacePaddingClasses = () => ({
5967
5974
  ...surfacePaddingClasses
5968
5975
  });
5976
+ var SURFACE_GUTTER_AXES = ["top", "right", "bottom", "left"];
5977
+ var surfaceGutterClasses = {
5978
+ top: { none: "mt-0", xs: "mt-2", sm: "mt-4", md: "mt-6", lg: "mt-8", xl: "mt-10" },
5979
+ right: { none: "mr-0", xs: "mr-2", sm: "mr-4", md: "mr-6", lg: "mr-8", xl: "mr-10" },
5980
+ bottom: { none: "mb-0", xs: "mb-2", sm: "mb-4", md: "mb-6", lg: "mb-8", xl: "mb-10" },
5981
+ left: { none: "ml-0", xs: "ml-2", sm: "ml-4", md: "ml-6", lg: "ml-8", xl: "ml-10" }
5982
+ };
5983
+ var DEFAULT_SURFACE_GUTTER = "none";
5984
+ var getSurfaceGutterClass = (axis, gutter) => surfaceGutterClasses[axis][gutter] ?? surfaceGutterClasses[axis][DEFAULT_SURFACE_GUTTER];
5969
5985
  var NEUTRAL_TONES = [
5970
5986
  "neutral",
5971
5987
  "slate",
@@ -22032,27 +22048,54 @@ var PageHeader = ({
22032
22048
  center,
22033
22049
  end,
22034
22050
  children,
22051
+ variant = "default",
22052
+ accentColor = "blue",
22053
+ padding,
22054
+ paddingTop,
22055
+ paddingRight,
22056
+ paddingBottom,
22057
+ paddingLeft,
22058
+ corner = DEFAULT_SURFACE_CORNER,
22035
22059
  className = "",
22036
22060
  ...rest
22037
- }) => /* @__PURE__ */ (0, import_jsx_runtime201.jsxs)(
22038
- "header",
22039
- {
22040
- ...rest,
22041
- className: (0, import_classnames51.default)(
22042
- "flex w-full items-center justify-between gap-4 border-b px-5",
22043
- SIDE_MENU_HEADER_HEIGHT,
22044
- SIDE_MENU_HEADER_FILL,
22045
- SIDE_MENU_HEADER_SEAM,
22046
- className
22047
- ),
22048
- children: [
22049
- /* @__PURE__ */ (0, import_jsx_runtime201.jsx)("div", { className: GROUP_CLASS2, children: start }),
22050
- /* @__PURE__ */ (0, import_jsx_runtime201.jsx)("div", { className: GROUP_CLASS2, children: center }),
22051
- /* @__PURE__ */ (0, import_jsx_runtime201.jsx)("div", { className: GROUP_CLASS2, children: end }),
22052
- children != null && /* @__PURE__ */ (0, import_jsx_runtime201.jsx)("div", { className: GROUP_CLASS2, children })
22053
- ]
22054
- }
22055
- );
22061
+ }) => {
22062
+ const surface = variant === "default" ? null : getSidebarSurfaceTokens(variant, accentColor);
22063
+ const pair = surface ? "xs" : "none";
22064
+ const gutter = {
22065
+ top: paddingTop ?? padding ?? pair,
22066
+ right: paddingRight ?? padding ?? pair,
22067
+ bottom: paddingBottom ?? padding ?? "none",
22068
+ left: paddingLeft ?? padding ?? "none"
22069
+ };
22070
+ return /* @__PURE__ */ (0, import_jsx_runtime201.jsxs)(
22071
+ "header",
22072
+ {
22073
+ ...rest,
22074
+ className: (0, import_classnames51.default)(
22075
+ "flex w-full items-center justify-between gap-4 px-5",
22076
+ SIDE_MENU_HEADER_HEIGHT,
22077
+ getSurfaceGutterClass("top", gutter.top),
22078
+ getSurfaceGutterClass("right", gutter.right),
22079
+ getSurfaceGutterClass("bottom", gutter.bottom),
22080
+ getSurfaceGutterClass("left", gutter.left),
22081
+ getSurfaceCornerClass(corner),
22082
+ surface ? (0, import_classnames51.default)(
22083
+ "border",
22084
+ surface.border,
22085
+ surface.shadow,
22086
+ surface.fill
22087
+ ) : (0, import_classnames51.default)("border-b", SIDE_MENU_HEADER_FILL, SIDE_MENU_HEADER_SEAM),
22088
+ className
22089
+ ),
22090
+ children: [
22091
+ /* @__PURE__ */ (0, import_jsx_runtime201.jsx)("div", { className: GROUP_CLASS2, children: start }),
22092
+ /* @__PURE__ */ (0, import_jsx_runtime201.jsx)("div", { className: GROUP_CLASS2, children: center }),
22093
+ /* @__PURE__ */ (0, import_jsx_runtime201.jsx)("div", { className: GROUP_CLASS2, children: end }),
22094
+ children != null && /* @__PURE__ */ (0, import_jsx_runtime201.jsx)("div", { className: GROUP_CLASS2, children })
22095
+ ]
22096
+ }
22097
+ );
22098
+ };
22056
22099
  PageHeader.displayName = "PageHeader";
22057
22100
  var PageHeader_default = PageHeader;
22058
22101
 
@@ -42738,7 +42781,8 @@ var SideMenu = ({
42738
42781
  const hasVisibleLink = visibleItems2.some(
42739
42782
  (item) => item.type !== "group" && item.type !== "divider"
42740
42783
  );
42741
- const heightClass = fullHeight ? "h-full" : "sticky top-16 h-[calc(100vh-64px)]";
42784
+ const detached = Boolean(surface.offset);
42785
+ 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)]";
42742
42786
  const isLeft = side === "left";
42743
42787
  const isHoverMode = openOnHover && !isMobile;
42744
42788
  const borderClasses = surface.border ? `${surface.border} ${surface.borderSides === "all" ? "border" : isLeft ? "border-r" : "border-l"}` : "";
@@ -42911,48 +42955,56 @@ var SideMenu = ({
42911
42955
  ]
42912
42956
  }
42913
42957
  ),
42914
- /* @__PURE__ */ (0, import_jsx_runtime257.jsx)("div", { className: `flex-1 px-3 py-1 overflow-y-auto w-full ${THIN_SCROLLBAR}`, children: /* @__PURE__ */ (0, import_jsx_runtime257.jsxs)("nav", { "aria-label": title || "Side menu", className: "space-y-1 w-full", children: [
42915
- visibleItems2.map((item, index) => {
42916
- if (item.type === "divider") {
42917
- return /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42918
- "div",
42919
- {
42920
- className: `my-2 border-t ${surface.divider} ${contentCollapsed2 && !isMobileView ? "mx-1" : "mx-0"}`
42921
- },
42922
- `divider-${index}-${item.slug}`
42923
- );
42924
- }
42925
- if (item.type === "group") {
42926
- if (contentCollapsed2 && !isMobileView) return null;
42927
- return /* @__PURE__ */ (0, import_jsx_runtime257.jsxs)(import_react245.default.Fragment, { children: [
42928
- item.hasDivider && /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42929
- "div",
42930
- {
42931
- className: `my-2 border-t ${surface.divider} ${contentCollapsed2 && !isMobileView ? "mx-1" : "mx-0"}`
42932
- }
42933
- ),
42934
- /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42935
- "div",
42936
- {
42937
- className: `px-3 py-1 mb-1 text-xs font-semibold uppercase tracking-wider ${surface.muted} ${index === 0 ? "mt-1" : "mt-4"}`,
42938
- children: item.label
42939
- }
42940
- )
42941
- ] }, `group-${index}-${item.slug}`);
42942
- }
42943
- return renderLinkRow(
42944
- item,
42945
- 0,
42946
- `link-${index}-${item.slug}`,
42947
- contentCollapsed2
42948
- );
42949
- }),
42950
- searchActive && !hasVisibleLink && /* @__PURE__ */ (0, import_jsx_runtime257.jsxs)("p", { className: `px-3 py-6 text-center text-xs ${surface.muted}`, children: [
42951
- 'No results for "',
42952
- searchQuery.trim(),
42953
- '"'
42954
- ] })
42955
- ] }) }),
42958
+ /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42959
+ ScrollArea_default,
42960
+ {
42961
+ variant: "hover",
42962
+ className: "flex-1 w-full",
42963
+ contentClassName: "px-3 py-1",
42964
+ children: /* @__PURE__ */ (0, import_jsx_runtime257.jsxs)("nav", { "aria-label": title || "Side menu", className: "space-y-1 w-full", children: [
42965
+ visibleItems2.map((item, index) => {
42966
+ if (item.type === "divider") {
42967
+ return /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42968
+ "div",
42969
+ {
42970
+ className: `my-2 border-t ${surface.divider} ${contentCollapsed2 && !isMobileView ? "mx-1" : "mx-0"}`
42971
+ },
42972
+ `divider-${index}-${item.slug}`
42973
+ );
42974
+ }
42975
+ if (item.type === "group") {
42976
+ if (contentCollapsed2 && !isMobileView) return null;
42977
+ return /* @__PURE__ */ (0, import_jsx_runtime257.jsxs)(import_react245.default.Fragment, { children: [
42978
+ item.hasDivider && /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42979
+ "div",
42980
+ {
42981
+ className: `my-2 border-t ${surface.divider} ${contentCollapsed2 && !isMobileView ? "mx-1" : "mx-0"}`
42982
+ }
42983
+ ),
42984
+ /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42985
+ "div",
42986
+ {
42987
+ className: `px-3 py-1 mb-1 text-xs font-semibold uppercase tracking-wider ${surface.muted} ${index === 0 ? "mt-1" : "mt-4"}`,
42988
+ children: item.label
42989
+ }
42990
+ )
42991
+ ] }, `group-${index}-${item.slug}`);
42992
+ }
42993
+ return renderLinkRow(
42994
+ item,
42995
+ 0,
42996
+ `link-${index}-${item.slug}`,
42997
+ contentCollapsed2
42998
+ );
42999
+ }),
43000
+ searchActive && !hasVisibleLink && /* @__PURE__ */ (0, import_jsx_runtime257.jsxs)("p", { className: `px-3 py-6 text-center text-xs ${surface.muted}`, children: [
43001
+ 'No results for "',
43002
+ searchQuery.trim(),
43003
+ '"'
43004
+ ] })
43005
+ ] })
43006
+ }
43007
+ ),
42956
43008
  footerItem && /* @__PURE__ */ (0, import_jsx_runtime257.jsx)("div", { className: "shrink-0 px-3 pb-1", children: /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42957
43009
  SideMenuDropdownRow,
42958
43010
  {
@@ -60164,12 +60216,16 @@ var TreeView = ({
60164
60216
  var TreeView_default = TreeView;
60165
60217
 
60166
60218
  // src/components/WorkflowTracker/WorkflowTracker.tsx
60167
- var import_react278 = require("react");
60168
- var import_classnames113 = __toESM(require("classnames"), 1);
60219
+ var import_react283 = require("react");
60220
+ var import_classnames119 = __toESM(require("classnames"), 1);
60221
+
60222
+ // src/components/WorkflowTracker/WorkflowTrackerRail.tsx
60223
+ var import_react279 = require("react");
60224
+ var import_classnames112 = __toESM(require("classnames"), 1);
60169
60225
 
60170
60226
  // src/components/WorkflowTracker/WorkflowTimeline.tsx
60171
60227
  var import_react277 = __toESM(require("react"), 1);
60172
- var import_classnames110 = __toESM(require("classnames"), 1);
60228
+ var import_classnames111 = __toESM(require("classnames"), 1);
60173
60229
 
60174
60230
  // src/components/WorkflowTracker/WorkflowSkeleton.tsx
60175
60231
  var import_classnames107 = __toESM(require("classnames"), 1);
@@ -60458,34 +60514,73 @@ var WorkflowStatusNode = ({
60458
60514
  };
60459
60515
  var WorkflowStatusNode_default = WorkflowStatusNode;
60460
60516
 
60461
- // src/components/WorkflowTracker/parts.tsx
60517
+ // src/components/WorkflowTracker/WorkflowQuickActions.tsx
60462
60518
  var import_classnames109 = __toESM(require("classnames"), 1);
60463
60519
  var import_jsx_runtime298 = require("react/jsx-runtime");
60520
+ var WorkflowQuickActions = ({
60521
+ stepId,
60522
+ actions,
60523
+ palette,
60524
+ groupLabel,
60525
+ onAction,
60526
+ className,
60527
+ style
60528
+ }) => {
60529
+ if (!onAction || actions.length === 0) return null;
60530
+ return /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(
60531
+ "div",
60532
+ {
60533
+ role: "group",
60534
+ "aria-label": groupLabel,
60535
+ className: (0, import_classnames109.default)("flex flex-wrap gap-1.5", className),
60536
+ style,
60537
+ children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(
60538
+ Button_default,
60539
+ {
60540
+ size: "xs",
60541
+ weight: "medium",
60542
+ variant: action.variant ?? "soft",
60543
+ color: action.tone ?? palette.accent,
60544
+ leadingIcon: action.leadingIcon,
60545
+ disabled: action.disabled,
60546
+ onClick: () => onAction(stepId, action.id),
60547
+ children: action.label
60548
+ },
60549
+ action.id
60550
+ ))
60551
+ }
60552
+ );
60553
+ };
60554
+ var WorkflowQuickActions_default = WorkflowQuickActions;
60555
+
60556
+ // src/components/WorkflowTracker/parts.tsx
60557
+ var import_classnames110 = __toESM(require("classnames"), 1);
60558
+ var import_jsx_runtime299 = require("react/jsx-runtime");
60464
60559
  var resolve = (surfaces) => surfaces ?? getSurfaceTokens(false);
60465
- var WorkflowPlaceholder = ({ title, subtitle, palette, surfaces, className }) => /* @__PURE__ */ (0, import_jsx_runtime298.jsxs)(
60560
+ var WorkflowPlaceholder = ({ title, subtitle, palette, surfaces, className }) => /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)(
60466
60561
  "div",
60467
60562
  {
60468
- className: (0, import_classnames109.default)(
60563
+ className: (0, import_classnames110.default)(
60469
60564
  "flex flex-col items-center justify-center gap-3 px-6 py-10 text-center",
60470
60565
  className
60471
60566
  ),
60472
60567
  children: [
60473
- /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(WorkflowStatusNode_default, { status: "not_started", palette, size: "lg" }),
60474
- /* @__PURE__ */ (0, import_jsx_runtime298.jsxs)("div", { className: "space-y-1", children: [
60475
- /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(
60568
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(WorkflowStatusNode_default, { status: "not_started", palette, size: "lg" }),
60569
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "space-y-1", children: [
60570
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60476
60571
  "p",
60477
60572
  {
60478
- className: (0, import_classnames109.default)(
60573
+ className: (0, import_classnames110.default)(
60479
60574
  "text-sm font-semibold",
60480
60575
  resolve(surfaces).mutedText
60481
60576
  ),
60482
60577
  children: title
60483
60578
  }
60484
60579
  ),
60485
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(
60580
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60486
60581
  "p",
60487
60582
  {
60488
- className: (0, import_classnames109.default)(
60583
+ className: (0, import_classnames110.default)(
60489
60584
  "max-w-xs text-xs leading-5",
60490
60585
  resolve(surfaces).faintText
60491
60586
  ),
@@ -60496,10 +60591,10 @@ var WorkflowPlaceholder = ({ title, subtitle, palette, surfaces, className }) =>
60496
60591
  ]
60497
60592
  }
60498
60593
  );
60499
- var SectionTitle = ({ children, surfaces, className }) => /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(
60594
+ var SectionTitle = ({ children, surfaces, className }) => /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60500
60595
  "span",
60501
60596
  {
60502
- className: (0, import_classnames109.default)(
60597
+ className: (0, import_classnames110.default)(
60503
60598
  "text-[10px] font-semibold uppercase tracking-widest",
60504
60599
  resolve(surfaces).faintText,
60505
60600
  className
@@ -60507,7 +60602,7 @@ var SectionTitle = ({ children, surfaces, className }) => /* @__PURE__ */ (0, im
60507
60602
  children
60508
60603
  }
60509
60604
  );
60510
- var SectionMeta = ({ children, surfaces, className }) => /* @__PURE__ */ (0, import_jsx_runtime298.jsx)("span", { className: (0, import_classnames109.default)("text-xs", resolve(surfaces).mutedText, className), children });
60605
+ var SectionMeta = ({ children, surfaces, className }) => /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("span", { className: (0, import_classnames110.default)("text-xs", resolve(surfaces).mutedText, className), children });
60511
60606
  var WorkflowBadge = ({
60512
60607
  children,
60513
60608
  status,
@@ -60515,14 +60610,14 @@ var WorkflowBadge = ({
60515
60610
  tone
60516
60611
  }) => {
60517
60612
  const tokens = getStatusTokens(status, palette);
60518
- return /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(
60613
+ return /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60519
60614
  Pill_default,
60520
60615
  {
60521
60616
  size: "xs",
60522
60617
  uppercase: true,
60523
60618
  tone: tone ?? tokens.pillTone,
60524
60619
  variant: "outline",
60525
- className: (0, import_classnames109.default)(
60620
+ className: (0, import_classnames110.default)(
60526
60621
  "shrink-0 font-medium",
60527
60622
  tone ? `bg-${tone}-100 dark:bg-${tone}-900` : tokens.pillFill
60528
60623
  ),
@@ -60530,17 +60625,17 @@ var WorkflowBadge = ({
60530
60625
  }
60531
60626
  );
60532
60627
  };
60533
- var MetaField = ({ label, value, surfaces }) => /* @__PURE__ */ (0, import_jsx_runtime298.jsxs)("div", { className: "min-w-0", children: [
60534
- /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(SectionTitle, { surfaces, children: label }),
60535
- /* @__PURE__ */ (0, import_jsx_runtime298.jsx)("p", { className: "mt-1 text-sm font-medium text-neutral-800 dark:text-neutral-100", children: value })
60628
+ var MetaField = ({ label, value, surfaces }) => /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "min-w-0", children: [
60629
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(SectionTitle, { surfaces, children: label }),
60630
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("p", { className: "mt-1 text-sm font-medium text-neutral-800 dark:text-neutral-100", children: value })
60536
60631
  ] });
60537
- var Tally = ({ count, label, surfaces }) => /* @__PURE__ */ (0, import_jsx_runtime298.jsxs)("span", { className: "inline-flex items-center gap-1", children: [
60538
- /* @__PURE__ */ (0, import_jsx_runtime298.jsx)("span", { className: "font-semibold text-neutral-900 dark:text-white", children: count }),
60539
- /* @__PURE__ */ (0, import_jsx_runtime298.jsx)("span", { className: resolve(surfaces).mutedText, children: label })
60632
+ var Tally = ({ count, label, surfaces }) => /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("span", { className: "inline-flex items-center gap-1", children: [
60633
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("span", { className: "font-semibold text-neutral-900 dark:text-white", children: count }),
60634
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("span", { className: resolve(surfaces).mutedText, children: label })
60540
60635
  ] });
60541
60636
 
60542
60637
  // src/components/WorkflowTracker/WorkflowTimeline.tsx
60543
- var import_jsx_runtime299 = require("react/jsx-runtime");
60638
+ var import_jsx_runtime300 = require("react/jsx-runtime");
60544
60639
  var CONNECTOR_LEFT = 9;
60545
60640
  var CONNECTOR_TOP = 24;
60546
60641
  var NESTED_INDENT = 32;
@@ -60558,16 +60653,16 @@ var NestedSubSteps = ({
60558
60653
  palette,
60559
60654
  surfaces,
60560
60655
  onSubStepSelect
60561
- }) => /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60656
+ }) => /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60562
60657
  "div",
60563
60658
  {
60564
- className: (0, import_classnames110.default)("mt-3 rounded-lg p-3", surfaces.nestedBox),
60659
+ className: (0, import_classnames111.default)("mt-3 rounded-lg p-3", surfaces.nestedBox),
60565
60660
  style: { marginLeft: NESTED_INDENT },
60566
- children: /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("ul", { className: "space-y-2.5", children: subSteps.map((subStep) => {
60661
+ children: /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("ul", { className: "space-y-2.5", children: subSteps.map((subStep) => {
60567
60662
  const status = normalizeStatus(subStep.status);
60568
60663
  const isActive = status === "running" || status === "in_progress";
60569
- const content = /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)(import_jsx_runtime299.Fragment, { children: [
60570
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60664
+ const content = /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(import_jsx_runtime300.Fragment, { children: [
60665
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60571
60666
  WorkflowStatusNode_default,
60572
60667
  {
60573
60668
  status,
@@ -60575,10 +60670,10 @@ var NestedSubSteps = ({
60575
60670
  size: "sm"
60576
60671
  }
60577
60672
  ),
60578
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60673
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60579
60674
  "span",
60580
60675
  {
60581
- className: (0, import_classnames110.default)(
60676
+ className: (0, import_classnames111.default)(
60582
60677
  "text-sm",
60583
60678
  isActive ? "font-semibold text-neutral-900 dark:text-white" : "text-neutral-600 dark:text-neutral-300"
60584
60679
  ),
@@ -60586,7 +60681,7 @@ var NestedSubSteps = ({
60586
60681
  }
60587
60682
  )
60588
60683
  ] });
60589
- return /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("li", { children: onSubStepSelect ? /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60684
+ return /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("li", { children: onSubStepSelect ? /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60590
60685
  "button",
60591
60686
  {
60592
60687
  type: "button",
@@ -60594,7 +60689,7 @@ var NestedSubSteps = ({
60594
60689
  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",
60595
60690
  children: content
60596
60691
  }
60597
- ) : /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("div", { className: "flex items-center gap-2.5", children: content }) }, subStep.id);
60692
+ ) : /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("div", { className: "flex items-center gap-2.5", children: content }) }, subStep.id);
60598
60693
  }) })
60599
60694
  }
60600
60695
  );
@@ -60611,10 +60706,11 @@ var WorkflowTimeline = ({
60611
60706
  loadingRows,
60612
60707
  emptyState,
60613
60708
  onStepSelect,
60614
- onSubStepSelect
60709
+ onSubStepSelect,
60710
+ onStepAction
60615
60711
  }) => {
60616
60712
  if (loading) {
60617
- return /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(WorkflowRailSkeleton, { rows: loadingRows });
60713
+ return /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(WorkflowRailSkeleton, { rows: loadingRows });
60618
60714
  }
60619
60715
  const isEmpty2 = steps.length === 0;
60620
60716
  const tallyEntries = [
@@ -60623,19 +60719,19 @@ var WorkflowTimeline = ({
60623
60719
  { count: tallies.flagged, label: labels.flagged },
60624
60720
  { count: tallies.remaining, label: labels.remaining }
60625
60721
  ].filter((entry) => entry.count > 0);
60626
- return /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "flex flex-col", children: [
60627
- !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: (0, import_classnames110.default)("border-b px-5 pb-4 pt-5", surfaces.border), children: [
60628
- /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "flex items-baseline justify-between gap-3", children: [
60629
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(SectionTitle, { surfaces, children: labels.progress }),
60630
- /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("span", { className: "text-sm font-semibold text-neutral-900 dark:text-white", children: [
60722
+ return /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)("div", { className: "flex flex-col", children: [
60723
+ !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)("div", { className: (0, import_classnames111.default)("border-b px-5 pb-4 pt-5", surfaces.border), children: [
60724
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)("div", { className: "flex items-baseline justify-between gap-3", children: [
60725
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(SectionTitle, { surfaces, children: labels.progress }),
60726
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)("span", { className: "text-sm font-semibold text-neutral-900 dark:text-white", children: [
60631
60727
  progress,
60632
60728
  "%"
60633
60729
  ] })
60634
60730
  ] }),
60635
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60731
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60636
60732
  Progress_default,
60637
60733
  {
60638
- className: (0, import_classnames110.default)(
60734
+ className: (0, import_classnames111.default)(
60639
60735
  "mt-2",
60640
60736
  surfaces.translucent ? "bg-white/40 dark:bg-white/15" : "bg-neutral-200 dark:bg-neutral-700"
60641
60737
  ),
@@ -60645,8 +60741,8 @@ var WorkflowTimeline = ({
60645
60741
  motion: "none"
60646
60742
  }
60647
60743
  ),
60648
- tallyEntries.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("div", { className: "mt-3 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs", children: tallyEntries.map((entry, index) => /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)(import_react277.default.Fragment, { children: [
60649
- index > 0 && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60744
+ tallyEntries.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("div", { className: "mt-3 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs", children: tallyEntries.map((entry, index) => /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(import_react277.default.Fragment, { children: [
60745
+ index > 0 && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60650
60746
  "span",
60651
60747
  {
60652
60748
  "aria-hidden": "true",
@@ -60654,7 +60750,7 @@ var WorkflowTimeline = ({
60654
60750
  children: "\xB7"
60655
60751
  }
60656
60752
  ),
60657
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60753
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60658
60754
  Tally,
60659
60755
  {
60660
60756
  count: entry.count,
@@ -60664,7 +60760,7 @@ var WorkflowTimeline = ({
60664
60760
  )
60665
60761
  ] }, entry.label)) })
60666
60762
  ] }),
60667
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("div", { className: (0, import_classnames110.default)(isEmpty2 ? "" : "px-5 py-5"), children: isEmpty2 ? emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60763
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("div", { className: (0, import_classnames111.default)(isEmpty2 ? "" : "px-5 py-5"), children: isEmpty2 ? emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60668
60764
  WorkflowPlaceholder,
60669
60765
  {
60670
60766
  title: labels.empty,
@@ -60672,14 +60768,14 @@ var WorkflowTimeline = ({
60672
60768
  palette,
60673
60769
  surfaces
60674
60770
  }
60675
- ) : /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("ol", { className: "m-0 list-none p-0", children: steps.map((step, index) => {
60771
+ ) : /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("ol", { className: "m-0 list-none p-0", children: steps.map((step, index) => {
60676
60772
  const status = normalizeStatus(step.status);
60677
60773
  const tokens = getStatusTokens(status, palette);
60678
60774
  const isActive = step.id === activeStepId;
60679
60775
  const isLast = index === steps.length - 1;
60680
60776
  const nested = isActive && step.subSteps && step.subSteps.length > 0 ? step.subSteps : void 0;
60681
- const rowContent = /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)(import_jsx_runtime299.Fragment, { children: [
60682
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60777
+ const rowContent = /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(import_jsx_runtime300.Fragment, { children: [
60778
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60683
60779
  WorkflowStatusNode_default,
60684
60780
  {
60685
60781
  status,
@@ -60687,19 +60783,19 @@ var WorkflowTimeline = ({
60687
60783
  className: "mt-0.5"
60688
60784
  }
60689
60785
  ),
60690
- /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "min-w-0 flex-1", children: [
60691
- /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "flex flex-wrap items-center gap-2", children: [
60692
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60786
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)("div", { className: "min-w-0 flex-1", children: [
60787
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)("div", { className: "flex flex-wrap items-center gap-2", children: [
60788
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60693
60789
  "span",
60694
60790
  {
60695
- className: (0, import_classnames110.default)(
60791
+ className: (0, import_classnames111.default)(
60696
60792
  "text-sm",
60697
60793
  isActive ? "font-semibold text-neutral-900 dark:text-white" : "font-medium text-neutral-700 dark:text-neutral-200"
60698
60794
  ),
60699
60795
  children: step.label
60700
60796
  }
60701
60797
  ),
60702
- step.badge && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60798
+ step.badge && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60703
60799
  WorkflowBadge,
60704
60800
  {
60705
60801
  status,
@@ -60709,10 +60805,10 @@ var WorkflowTimeline = ({
60709
60805
  }
60710
60806
  )
60711
60807
  ] }),
60712
- step.meta && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60808
+ step.meta && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60713
60809
  "p",
60714
60810
  {
60715
- className: (0, import_classnames110.default)(
60811
+ className: (0, import_classnames111.default)(
60716
60812
  "mt-1 text-xs leading-5",
60717
60813
  surfaces.mutedText
60718
60814
  ),
@@ -60721,24 +60817,24 @@ var WorkflowTimeline = ({
60721
60817
  )
60722
60818
  ] })
60723
60819
  ] });
60724
- return /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)(
60820
+ return /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(
60725
60821
  "li",
60726
60822
  {
60727
- className: (0, import_classnames110.default)("relative", !isLast && "pb-5"),
60823
+ className: (0, import_classnames111.default)("relative", !isLast && "pb-5"),
60728
60824
  "aria-current": isActive ? "step" : void 0,
60729
60825
  children: [
60730
- !isLast && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60826
+ !isLast && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60731
60827
  "span",
60732
60828
  {
60733
60829
  "aria-hidden": "true",
60734
- className: (0, import_classnames110.default)(
60830
+ className: (0, import_classnames111.default)(
60735
60831
  "absolute bottom-0",
60736
60832
  tokens.connectorDashed ? `border-l-2 border-dashed ${tokens.connector}` : `w-0.5 rounded-full ${tokens.connector}`
60737
60833
  ),
60738
60834
  style: { left: CONNECTOR_LEFT, top: CONNECTOR_TOP }
60739
60835
  }
60740
60836
  ),
60741
- onStepSelect ? /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60837
+ onStepSelect ? /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60742
60838
  "button",
60743
60839
  {
60744
60840
  type: "button",
@@ -60746,8 +60842,19 @@ var WorkflowTimeline = ({
60746
60842
  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",
60747
60843
  children: rowContent
60748
60844
  }
60749
- ) : /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("div", { className: "flex items-start gap-3", children: rowContent }),
60750
- nested && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60845
+ ) : /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("div", { className: "flex items-start gap-3", children: rowContent }),
60846
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60847
+ WorkflowQuickActions_default,
60848
+ {
60849
+ stepId: step.id,
60850
+ actions: step.actions ?? [],
60851
+ palette,
60852
+ groupLabel: labels.quickActions,
60853
+ onAction: onStepAction,
60854
+ className: "ml-8 mt-2"
60855
+ }
60856
+ ),
60857
+ nested && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60751
60858
  NestedSubSteps,
60752
60859
  {
60753
60860
  stepId: step.id,
@@ -60762,8 +60869,8 @@ var WorkflowTimeline = ({
60762
60869
  step.id
60763
60870
  );
60764
60871
  }) }) }),
60765
- showLegend && !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("div", { className: (0, import_classnames110.default)("mt-auto border-t px-5 py-4", surfaces.border), children: /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("ul", { className: "flex flex-wrap gap-x-4 gap-y-2", children: LEGEND_ORDER.map((status) => /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("li", { className: "flex items-center gap-2", children: [
60766
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60872
+ showLegend && !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("div", { className: (0, import_classnames111.default)("mt-auto border-t px-5 py-4", surfaces.border), children: /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("ul", { className: "flex flex-wrap gap-x-4 gap-y-2", children: LEGEND_ORDER.map((status) => /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)("li", { className: "flex items-center gap-2", children: [
60873
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60767
60874
  WorkflowStatusNode_default,
60768
60875
  {
60769
60876
  status,
@@ -60771,14 +60878,92 @@ var WorkflowTimeline = ({
60771
60878
  size: "sm"
60772
60879
  }
60773
60880
  ),
60774
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("span", { className: (0, import_classnames110.default)("text-xs", surfaces.mutedText), children: labels.statuses[status] })
60881
+ /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("span", { className: (0, import_classnames111.default)("text-xs", surfaces.mutedText), children: labels.statuses[status] })
60775
60882
  ] }, status)) }) })
60776
60883
  ] });
60777
60884
  };
60778
60885
  var WorkflowTimeline_default = WorkflowTimeline;
60779
60886
 
60780
- // src/components/WorkflowTracker/WorkflowDetailPanel.tsx
60781
- var import_classnames111 = __toESM(require("classnames"), 1);
60887
+ // src/components/WorkflowTracker/chrome.ts
60888
+ var import_react278 = require("react");
60889
+ var DEFAULT_LABELS = {
60890
+ progress: "Progress",
60891
+ done: "done",
60892
+ skipped: "skipped",
60893
+ flagged: "flagged",
60894
+ remaining: "remaining",
60895
+ step: "Step",
60896
+ of: "of",
60897
+ elapsed: "Elapsed",
60898
+ owner: "Owner",
60899
+ started: "Started",
60900
+ sla: "SLA",
60901
+ subSteps: "Sub-steps",
60902
+ accepted: "accepted",
60903
+ open: "open",
60904
+ needsAttention: "Needs attention",
60905
+ skippedSteps: "Skipped steps",
60906
+ live: "LIVE \xB7 read-only view",
60907
+ empty: "No steps yet",
60908
+ emptySubtitle: "Steps appear here as soon as the workflow starts.",
60909
+ noActiveStep: "No step selected",
60910
+ details: "Step details",
60911
+ quickActions: "Quick actions",
60912
+ statuses: {
60913
+ done: "Done",
60914
+ in_progress: "In progress",
60915
+ running: "Running",
60916
+ skipped: "Skipped",
60917
+ blocked: "Blocked",
60918
+ attention: "Attention",
60919
+ not_started: "Not started"
60920
+ }
60921
+ };
60922
+ var useWorkflowChrome = ({
60923
+ accentColor = "blue",
60924
+ attentionColor = "rose",
60925
+ blockedColor = "amber",
60926
+ mutedColor = "neutral",
60927
+ variant = "outlined",
60928
+ translucentSurfaces
60929
+ }) => {
60930
+ const translucent = translucentSurfaces ?? isTranslucentVariant(variant);
60931
+ const palette = (0, import_react278.useMemo)(
60932
+ () => ({
60933
+ accent: accentColor,
60934
+ attention: attentionColor,
60935
+ blocked: blockedColor,
60936
+ muted: mutedColor,
60937
+ translucent
60938
+ }),
60939
+ [accentColor, attentionColor, blockedColor, mutedColor, translucent]
60940
+ );
60941
+ const surfaces = (0, import_react278.useMemo)(() => getSurfaceTokens(translucent), [translucent]);
60942
+ return { translucent, palette, surfaces };
60943
+ };
60944
+ var resolveLabels = (labelOverrides) => labelOverrides ? {
60945
+ ...DEFAULT_LABELS,
60946
+ ...labelOverrides,
60947
+ statuses: { ...DEFAULT_LABELS.statuses, ...labelOverrides.statuses }
60948
+ } : DEFAULT_LABELS;
60949
+ var buildCardProps = ({
60950
+ variant = "outlined",
60951
+ cardTone = "neutral",
60952
+ corner = DEFAULT_SURFACE_CORNER,
60953
+ glassOpacity = "light",
60954
+ vibrancy,
60955
+ specularMode,
60956
+ padding = "none"
60957
+ }) => ({
60958
+ variant,
60959
+ tone: cardTone,
60960
+ corner,
60961
+ glassOpacity,
60962
+ vibrancy,
60963
+ specularMode,
60964
+ padding,
60965
+ scrollable: false
60966
+ });
60782
60967
 
60783
60968
  // src/components/WorkflowTracker/derive.ts
60784
60969
  var computeProgress = (steps) => {
@@ -60853,8 +61038,262 @@ var resolveActiveStep = (steps, activeStepId) => {
60853
61038
  return { step: steps[0], index: 1 };
60854
61039
  };
60855
61040
 
61041
+ // src/components/WorkflowTracker/sampleWorkflow.tsx
61042
+ var import_jsx_runtime301 = require("react/jsx-runtime");
61043
+ var sampleWorkflow = {
61044
+ eyebrow: "VENDOR ONBOARDING \xB7 REQ-4128",
61045
+ title: "Northwind Logistics GmbH",
61046
+ live: true,
61047
+ activeStepId: "security_questionnaire",
61048
+ steps: [
61049
+ {
61050
+ id: "request_submitted",
61051
+ label: "Request submitted",
61052
+ status: "done",
61053
+ meta: "2m"
61054
+ },
61055
+ {
61056
+ id: "duplicate_check",
61057
+ label: "Duplicate check",
61058
+ status: "skipped",
61059
+ badge: "Not needed",
61060
+ meta: "No match in registry"
61061
+ },
61062
+ {
61063
+ id: "business_verification",
61064
+ label: "Business verification",
61065
+ status: "done",
61066
+ meta: "12m \xB7 3 of 3 sub-steps"
61067
+ },
61068
+ {
61069
+ id: "sanctions_screening",
61070
+ label: "Sanctions screening",
61071
+ status: "done",
61072
+ meta: "4m"
61073
+ },
61074
+ {
61075
+ id: "tax_documents",
61076
+ label: "Tax documents",
61077
+ status: "skipped",
61078
+ badge: "Skipped",
61079
+ meta: "Skipped by M. Reyes \xB7 resume anytime"
61080
+ },
61081
+ {
61082
+ id: "insurance_certificates",
61083
+ label: "Insurance certificates",
61084
+ status: "attention",
61085
+ badge: "Needs attention",
61086
+ meta: "1h 06m \xB7 Liability certificate expired 12 Aug",
61087
+ details: /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("div", { className: "space-y-3 px-5 py-4 sm:px-6", children: [
61088
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("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." }),
61089
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("ul", { className: "flex flex-wrap gap-2", children: ["reminder-12-aug.pdf", "underwriter-quote.pdf"].map((file) => /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
61090
+ "li",
61091
+ {
61092
+ 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",
61093
+ children: file
61094
+ },
61095
+ file
61096
+ )) })
61097
+ ] }),
61098
+ actions: [
61099
+ { id: "review", label: "Review" },
61100
+ { id: "remind", label: "Remind vendor", tone: "amber" }
61101
+ ]
61102
+ },
61103
+ {
61104
+ id: "contract_drafting",
61105
+ label: "Contract drafting",
61106
+ status: "done",
61107
+ meta: "1h 10m"
61108
+ },
61109
+ {
61110
+ id: "security_questionnaire",
61111
+ label: "Security questionnaire",
61112
+ status: "in_progress",
61113
+ badge: "In progress",
61114
+ meta: "24m \xB7 3 of 6 sub-steps",
61115
+ elapsed: "24m",
61116
+ description: "Vendor is completing the long-form questionnaire. Each sub-step unlocks once its evidence file is accepted by the reviewer.",
61117
+ owner: "D. Okafor",
61118
+ startedAt: "19 Aug \xB7 09:12",
61119
+ sla: "Due in 6h",
61120
+ details: /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("div", { className: "space-y-5 px-5 py-4 sm:px-6", children: [
61121
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("div", { children: [
61122
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Review activity" }),
61123
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("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." })
61124
+ ] }),
61125
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("div", { children: [
61126
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Files received" }),
61127
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("ul", { className: "mt-2 flex flex-wrap gap-2", children: [
61128
+ "data-handling-v3.pdf",
61129
+ "pentest-2026.pdf",
61130
+ "soc2-typeii.pdf"
61131
+ ].map((file) => /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
61132
+ "li",
61133
+ {
61134
+ 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",
61135
+ children: file
61136
+ },
61137
+ file
61138
+ )) })
61139
+ ] }),
61140
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("div", { children: [
61141
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Open findings" }),
61142
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("ul", { className: "mt-2 space-y-2", children: [
61143
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("li", { className: "flex items-start gap-2 text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: [
61144
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
61145
+ "span",
61146
+ {
61147
+ "aria-hidden": "true",
61148
+ className: "mt-[9px] size-1.5 shrink-0 rounded-full bg-amber-400"
61149
+ }
61150
+ ),
61151
+ "Subprocessor \u201CCloudDot BV\u201D is not covered by the DPA yet"
61152
+ ] }),
61153
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("li", { className: "flex items-start gap-2 text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: [
61154
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
61155
+ "span",
61156
+ {
61157
+ "aria-hidden": "true",
61158
+ className: "mt-[9px] size-1.5 shrink-0 rounded-full bg-neutral-300 dark:bg-neutral-600"
61159
+ }
61160
+ ),
61161
+ "Waiting on the incident-contact annex"
61162
+ ] })
61163
+ ] })
61164
+ ] })
61165
+ ] }),
61166
+ subSteps: [
61167
+ {
61168
+ id: "data_handling",
61169
+ label: "Data handling policy",
61170
+ status: "done",
61171
+ badge: "Accepted",
61172
+ duration: "5m"
61173
+ },
61174
+ {
61175
+ id: "pentest",
61176
+ label: "Penetration test report",
61177
+ status: "done",
61178
+ badge: "Accepted",
61179
+ duration: "8m"
61180
+ },
61181
+ {
61182
+ id: "soc2",
61183
+ label: "SOC 2 Type II evidence",
61184
+ status: "done",
61185
+ badge: "Accepted",
61186
+ duration: "11m"
61187
+ },
61188
+ {
61189
+ id: "subprocessor_list",
61190
+ label: "Subprocessor list",
61191
+ status: "running",
61192
+ badge: "Running",
61193
+ note: "Vendor uploading \u2014 2 of 3 files received"
61194
+ },
61195
+ {
61196
+ id: "incident_response",
61197
+ label: "Incident response plan",
61198
+ status: "skipped",
61199
+ badge: "Skipped",
61200
+ note: "Covered by master agreement \xA77"
61201
+ },
61202
+ {
61203
+ id: "business_continuity",
61204
+ label: "Business continuity plan",
61205
+ status: "not_started"
61206
+ }
61207
+ ]
61208
+ },
61209
+ {
61210
+ id: "legal_review",
61211
+ label: "Legal review",
61212
+ status: "blocked",
61213
+ badge: "Blocked",
61214
+ meta: "Waiting on Legal \xB7 queued 2d",
61215
+ actions: [{ id: "nudge", label: "Nudge Legal", tone: "violet" }]
61216
+ },
61217
+ {
61218
+ id: "banking_details",
61219
+ label: "Banking details",
61220
+ status: "not_started"
61221
+ },
61222
+ {
61223
+ id: "system_provisioning",
61224
+ label: "System provisioning",
61225
+ status: "not_started"
61226
+ },
61227
+ { id: "go_live", label: "Go-live", status: "not_started" }
61228
+ ]
61229
+ };
61230
+
61231
+ // src/components/WorkflowTracker/WorkflowTrackerRail.tsx
61232
+ var import_jsx_runtime302 = require("react/jsx-runtime");
61233
+ var WorkflowTrackerRail = ({
61234
+ data = sampleWorkflow,
61235
+ loading = false,
61236
+ loadingRows = 6,
61237
+ showLegend = true,
61238
+ emptyState,
61239
+ labels: labelOverrides,
61240
+ cardClassName,
61241
+ cardScrollable,
61242
+ onStepSelect,
61243
+ onSubStepSelect,
61244
+ onStepAction,
61245
+ className,
61246
+ style,
61247
+ ...styleProps
61248
+ }) => {
61249
+ const steps = data?.steps ?? [];
61250
+ const { palette, surfaces } = useWorkflowChrome(styleProps);
61251
+ const labels = (0, import_react279.useMemo)(() => resolveLabels(labelOverrides), [labelOverrides]);
61252
+ const cardProps = buildCardProps(styleProps);
61253
+ const active = (0, import_react279.useMemo)(
61254
+ () => resolveActiveStep(steps, data?.activeStepId),
61255
+ [steps, data?.activeStepId]
61256
+ );
61257
+ const progress = (0, import_react279.useMemo)(() => computeProgress(steps), [steps]);
61258
+ const tallies = (0, import_react279.useMemo)(() => computeTallies(steps), [steps]);
61259
+ return /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61260
+ Panel_default,
61261
+ {
61262
+ ...cardProps,
61263
+ scrollable: cardScrollable ?? false,
61264
+ className: (0, import_classnames112.default)(className, cardClassName),
61265
+ style,
61266
+ children: /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61267
+ WorkflowTimeline_default,
61268
+ {
61269
+ steps,
61270
+ activeStepId: active?.step.id,
61271
+ palette,
61272
+ surfaces,
61273
+ labels,
61274
+ progress,
61275
+ tallies,
61276
+ showLegend: showLegend && !loading,
61277
+ loading,
61278
+ loadingRows,
61279
+ emptyState,
61280
+ onStepSelect,
61281
+ onSubStepSelect,
61282
+ onStepAction
61283
+ }
61284
+ )
61285
+ }
61286
+ );
61287
+ };
61288
+ var WorkflowTrackerRail_default = WorkflowTrackerRail;
61289
+
61290
+ // src/components/WorkflowTracker/WorkflowTrackerStepDetails.tsx
61291
+ var import_react280 = require("react");
61292
+ var import_classnames114 = __toESM(require("classnames"), 1);
61293
+
60856
61294
  // src/components/WorkflowTracker/WorkflowDetailPanel.tsx
60857
- var import_jsx_runtime300 = require("react/jsx-runtime");
61295
+ var import_classnames113 = __toESM(require("classnames"), 1);
61296
+ var import_jsx_runtime303 = require("react/jsx-runtime");
60858
61297
  var WorkflowDetailPanel = ({
60859
61298
  active,
60860
61299
  totalSteps,
@@ -60862,13 +61301,14 @@ var WorkflowDetailPanel = ({
60862
61301
  surfaces,
60863
61302
  labels,
60864
61303
  loading,
60865
- onSubStepSelect
61304
+ onSubStepSelect,
61305
+ onStepAction
60866
61306
  }) => {
60867
61307
  if (loading) {
60868
- return /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(WorkflowDetailSkeleton, {});
61308
+ return /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(WorkflowDetailSkeleton, {});
60869
61309
  }
60870
61310
  if (!active) {
60871
- return /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61311
+ return /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
60872
61312
  WorkflowPlaceholder,
60873
61313
  {
60874
61314
  title: labels.noActiveStep,
@@ -60886,11 +61326,11 @@ var WorkflowDetailPanel = ({
60886
61326
  step.startedAt ? { label: labels.started, value: step.startedAt } : void 0,
60887
61327
  step.sla ? { label: labels.sla, value: step.sla } : void 0
60888
61328
  ].filter(Boolean);
60889
- return /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)("div", { className: "flex flex-col", children: [
60890
- /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)("div", { className: "px-5 pb-6 pt-5 sm:px-6", children: [
60891
- /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)("div", { className: "flex flex-wrap items-center justify-between gap-x-4 gap-y-2", children: [
60892
- /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)("div", { className: "flex flex-wrap items-center gap-3", children: [
60893
- /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(SectionTitle, { surfaces, children: [
61329
+ return /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)("div", { className: "flex flex-col", children: [
61330
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)("div", { className: "px-5 pb-6 pt-5 sm:px-6", children: [
61331
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)("div", { className: "flex flex-wrap items-center justify-between gap-x-4 gap-y-2", children: [
61332
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)("div", { className: "flex flex-wrap items-center gap-3", children: [
61333
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)(SectionTitle, { surfaces, children: [
60894
61334
  labels.step,
60895
61335
  " ",
60896
61336
  index,
@@ -60899,7 +61339,7 @@ var WorkflowDetailPanel = ({
60899
61339
  " ",
60900
61340
  totalSteps
60901
61341
  ] }),
60902
- step.badge && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61342
+ step.badge && /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
60903
61343
  WorkflowBadge,
60904
61344
  {
60905
61345
  status,
@@ -60909,24 +61349,36 @@ var WorkflowDetailPanel = ({
60909
61349
  }
60910
61350
  )
60911
61351
  ] }),
60912
- step.elapsed && /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(SectionMeta, { surfaces, children: [
60913
- labels.elapsed,
60914
- " ",
60915
- step.elapsed
61352
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)("div", { className: "flex flex-wrap items-center justify-end gap-x-4 gap-y-2", children: [
61353
+ step.elapsed && /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)(SectionMeta, { surfaces, children: [
61354
+ labels.elapsed,
61355
+ " ",
61356
+ step.elapsed
61357
+ ] }),
61358
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
61359
+ WorkflowQuickActions_default,
61360
+ {
61361
+ stepId: step.id,
61362
+ actions: step.actions ?? [],
61363
+ palette,
61364
+ groupLabel: labels.quickActions,
61365
+ onAction: onStepAction
61366
+ }
61367
+ )
60916
61368
  ] })
60917
61369
  ] }),
60918
- /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("h3", { className: "mt-3 text-xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-2xl", children: step.label }),
60919
- step.description && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61370
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsx)("h3", { className: "mt-3 text-xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-2xl", children: step.label }),
61371
+ step.description && /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
60920
61372
  "p",
60921
61373
  {
60922
- className: (0, import_classnames111.default)(
61374
+ className: (0, import_classnames113.default)(
60923
61375
  "mt-2 max-w-3xl text-sm leading-6",
60924
61376
  surfaces.mutedText
60925
61377
  ),
60926
61378
  children: step.description
60927
61379
  }
60928
61380
  ),
60929
- metaFields.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("div", { className: "mt-5 flex flex-wrap gap-x-10 gap-y-4", children: metaFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61381
+ metaFields.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime303.jsx)("div", { className: "mt-5 flex flex-wrap gap-x-10 gap-y-4", children: metaFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
60930
61382
  MetaField,
60931
61383
  {
60932
61384
  label: field.label,
@@ -60936,18 +61388,18 @@ var WorkflowDetailPanel = ({
60936
61388
  field.label
60937
61389
  )) })
60938
61390
  ] }),
60939
- subSteps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(import_jsx_runtime300.Fragment, { children: [
60940
- /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(
61391
+ subSteps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)(import_jsx_runtime303.Fragment, { children: [
61392
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)(
60941
61393
  "div",
60942
61394
  {
60943
- className: (0, import_classnames111.default)(
61395
+ className: (0, import_classnames113.default)(
60944
61396
  "flex flex-wrap items-center justify-between gap-2 border-y px-5 py-2.5 sm:px-6",
60945
61397
  surfaces.border,
60946
61398
  surfaces.strip
60947
61399
  ),
60948
61400
  children: [
60949
- /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(SectionTitle, { surfaces, children: labels.subSteps }),
60950
- /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(SectionMeta, { surfaces, children: [
61401
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(SectionTitle, { surfaces, children: labels.subSteps }),
61402
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)(SectionMeta, { surfaces, children: [
60951
61403
  summary.accepted,
60952
61404
  " ",
60953
61405
  labels.accepted,
@@ -60963,24 +61415,24 @@ var WorkflowDetailPanel = ({
60963
61415
  ]
60964
61416
  }
60965
61417
  ),
60966
- /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61418
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
60967
61419
  "ul",
60968
61420
  {
60969
- className: (0, import_classnames111.default)(
61421
+ className: (0, import_classnames113.default)(
60970
61422
  "m-0 list-none divide-y p-0",
60971
61423
  surfaces.divider
60972
61424
  ),
60973
61425
  children: subSteps.map((subStep) => {
60974
61426
  const subStatus = normalizeStatus(subStep.status);
60975
61427
  const isRunning = subStatus === "running";
60976
- const rowContent = /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(import_jsx_runtime300.Fragment, { children: [
60977
- /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(WorkflowStatusNode_default, { status: subStatus, palette }),
60978
- /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)("div", { className: "min-w-0 flex-1", children: [
60979
- /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: subStep.label }),
60980
- subStep.note && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61428
+ const rowContent = /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)(import_jsx_runtime303.Fragment, { children: [
61429
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(WorkflowStatusNode_default, { status: subStatus, palette }),
61430
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)("div", { className: "min-w-0 flex-1", children: [
61431
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsx)("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: subStep.label }),
61432
+ subStep.note && /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
60981
61433
  "p",
60982
61434
  {
60983
- className: (0, import_classnames111.default)(
61435
+ className: (0, import_classnames113.default)(
60984
61436
  "mt-0.5 text-xs leading-5",
60985
61437
  surfaces.mutedText
60986
61438
  ),
@@ -60988,7 +61440,7 @@ var WorkflowDetailPanel = ({
60988
61440
  }
60989
61441
  )
60990
61442
  ] }),
60991
- subStep.badge && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61443
+ subStep.badge && /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
60992
61444
  WorkflowBadge,
60993
61445
  {
60994
61446
  status: subStatus,
@@ -60997,10 +61449,10 @@ var WorkflowDetailPanel = ({
60997
61449
  children: subStep.badge
60998
61450
  }
60999
61451
  ),
61000
- /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61452
+ /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
61001
61453
  "span",
61002
61454
  {
61003
- className: (0, import_classnames111.default)(
61455
+ className: (0, import_classnames113.default)(
61004
61456
  "w-10 shrink-0 text-right text-xs tabular-nums",
61005
61457
  surfaces.faintText
61006
61458
  ),
@@ -61008,22 +61460,22 @@ var WorkflowDetailPanel = ({
61008
61460
  }
61009
61461
  )
61010
61462
  ] });
61011
- const rowClasses = (0, import_classnames111.default)(
61463
+ const rowClasses = (0, import_classnames113.default)(
61012
61464
  "flex w-full items-center gap-3 px-5 py-3 text-left sm:px-6",
61013
61465
  isRunning && getRowHighlight(palette.accent, surfaces.translucent)
61014
61466
  );
61015
- return /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("li", { children: onSubStepSelect ? /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61467
+ return /* @__PURE__ */ (0, import_jsx_runtime303.jsx)("li", { children: onSubStepSelect ? /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
61016
61468
  "button",
61017
61469
  {
61018
61470
  type: "button",
61019
61471
  onClick: () => onSubStepSelect(step.id, subStep.id),
61020
- className: (0, import_classnames111.default)(
61472
+ className: (0, import_classnames113.default)(
61021
61473
  rowClasses,
61022
61474
  "focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-neutral-400 dark:focus-visible:ring-neutral-500"
61023
61475
  ),
61024
61476
  children: rowContent
61025
61477
  }
61026
- ) : /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("div", { className: rowClasses, children: rowContent }) }, subStep.id);
61478
+ ) : /* @__PURE__ */ (0, import_jsx_runtime303.jsx)("div", { className: rowClasses, children: rowContent }) }, subStep.id);
61027
61479
  })
61028
61480
  }
61029
61481
  )
@@ -61032,18 +61484,128 @@ var WorkflowDetailPanel = ({
61032
61484
  };
61033
61485
  var WorkflowDetailPanel_default = WorkflowDetailPanel;
61034
61486
 
61487
+ // src/components/WorkflowTracker/WorkflowTrackerStepDetails.tsx
61488
+ var import_jsx_runtime304 = require("react/jsx-runtime");
61489
+ var WorkflowTrackerStepDetails = ({
61490
+ data = sampleWorkflow,
61491
+ loading = false,
61492
+ labels: labelOverrides,
61493
+ cardClassName,
61494
+ onSubStepSelect,
61495
+ onStepAction,
61496
+ className,
61497
+ style,
61498
+ ...styleProps
61499
+ }) => {
61500
+ const steps = data?.steps ?? [];
61501
+ const { palette, surfaces } = useWorkflowChrome(styleProps);
61502
+ const labels = (0, import_react280.useMemo)(
61503
+ () => resolveLabels(labelOverrides),
61504
+ [labelOverrides]
61505
+ );
61506
+ const cardProps = buildCardProps(styleProps);
61507
+ const active = (0, import_react280.useMemo)(
61508
+ () => resolveActiveStep(steps, data?.activeStepId),
61509
+ [steps, data?.activeStepId]
61510
+ );
61511
+ return /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
61512
+ Panel_default,
61513
+ {
61514
+ ...cardProps,
61515
+ className: (0, import_classnames114.default)(className, cardClassName),
61516
+ style,
61517
+ children: /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
61518
+ WorkflowDetailPanel_default,
61519
+ {
61520
+ active,
61521
+ totalSteps: steps.length,
61522
+ palette,
61523
+ surfaces,
61524
+ labels,
61525
+ loading,
61526
+ onSubStepSelect,
61527
+ onStepAction
61528
+ }
61529
+ )
61530
+ }
61531
+ );
61532
+ };
61533
+ var WorkflowTrackerStepDetails_default = WorkflowTrackerStepDetails;
61534
+
61535
+ // src/components/WorkflowTracker/WorkflowTrackerDetails.tsx
61536
+ var import_react281 = require("react");
61537
+ var import_classnames116 = __toESM(require("classnames"), 1);
61538
+
61539
+ // src/components/WorkflowTracker/WorkflowDetailsCard.tsx
61540
+ var import_classnames115 = __toESM(require("classnames"), 1);
61541
+ var import_jsx_runtime305 = require("react/jsx-runtime");
61542
+ var WorkflowDetailsCard = ({
61543
+ details,
61544
+ ariaLabel,
61545
+ cardProps,
61546
+ className,
61547
+ style
61548
+ }) => /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
61549
+ Panel_default,
61550
+ {
61551
+ ...cardProps,
61552
+ flexBody: true,
61553
+ className: (0, import_classnames115.default)("flex-1", className),
61554
+ style,
61555
+ children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(ScrollArea_default, { className: "h-full", mask: true, role: "region", "aria-label": ariaLabel, children: details })
61556
+ }
61557
+ );
61558
+ var WorkflowDetailsCard_default = WorkflowDetailsCard;
61559
+
61560
+ // src/components/WorkflowTracker/WorkflowTrackerDetails.tsx
61561
+ var import_jsx_runtime306 = require("react/jsx-runtime");
61562
+ var WorkflowTrackerDetails = ({
61563
+ data = sampleWorkflow,
61564
+ loading = false,
61565
+ labels: labelOverrides,
61566
+ cardClassName,
61567
+ className,
61568
+ style,
61569
+ ...styleProps
61570
+ }) => {
61571
+ const steps = data?.steps ?? [];
61572
+ const labels = (0, import_react281.useMemo)(() => resolveLabels(labelOverrides), [labelOverrides]);
61573
+ const cardProps = buildCardProps(styleProps);
61574
+ const active = (0, import_react281.useMemo)(
61575
+ () => resolveActiveStep(steps, data?.activeStepId),
61576
+ [steps, data?.activeStepId]
61577
+ );
61578
+ const details = active?.step.details;
61579
+ if (loading || details == null || details === "") return null;
61580
+ return /* @__PURE__ */ (0, import_jsx_runtime306.jsx)(
61581
+ WorkflowDetailsCard_default,
61582
+ {
61583
+ details,
61584
+ ariaLabel: labels.details,
61585
+ cardProps,
61586
+ className: (0, import_classnames116.default)(className, cardClassName),
61587
+ style
61588
+ }
61589
+ );
61590
+ };
61591
+ var WorkflowTrackerDetails_default = WorkflowTrackerDetails;
61592
+
61593
+ // src/components/WorkflowTracker/WorkflowTrackerRollups.tsx
61594
+ var import_react282 = require("react");
61595
+ var import_classnames118 = __toESM(require("classnames"), 1);
61596
+
61035
61597
  // src/components/WorkflowTracker/WorkflowSummaryCard.tsx
61036
- var import_classnames112 = __toESM(require("classnames"), 1);
61037
- var import_jsx_runtime301 = require("react/jsx-runtime");
61598
+ var import_classnames117 = __toESM(require("classnames"), 1);
61599
+ var import_jsx_runtime307 = require("react/jsx-runtime");
61038
61600
  var WorkflowSummaryCard = ({
61039
61601
  title,
61040
61602
  steps,
61041
61603
  palette,
61042
61604
  surfaces
61043
- }) => /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("div", { className: "px-5 py-4", children: [
61044
- /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(SectionTitle, { surfaces, children: title }),
61045
- /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("ul", { className: "mt-3 space-y-3", children: steps.map((step) => /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("li", { className: "flex items-start gap-3", children: [
61046
- /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
61605
+ }) => /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("div", { className: "px-5 py-4", children: [
61606
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(SectionTitle, { surfaces, children: title }),
61607
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("ul", { className: "mt-3 space-y-3", children: steps.map((step) => /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("li", { className: "flex items-start gap-3", children: [
61608
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
61047
61609
  WorkflowStatusNode_default,
61048
61610
  {
61049
61611
  status: normalizeStatus(step.status),
@@ -61051,12 +61613,12 @@ var WorkflowSummaryCard = ({
61051
61613
  className: "mt-0.5"
61052
61614
  }
61053
61615
  ),
61054
- /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("div", { className: "min-w-0 flex-1", children: [
61055
- /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: step.label }),
61056
- step.meta && /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
61616
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("div", { className: "min-w-0 flex-1", children: [
61617
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: step.label }),
61618
+ step.meta && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
61057
61619
  "p",
61058
61620
  {
61059
- className: (0, import_classnames112.default)(
61621
+ className: (0, import_classnames117.default)(
61060
61622
  "mt-0.5 text-xs leading-5",
61061
61623
  surfaces.mutedText
61062
61624
  ),
@@ -61068,166 +61630,57 @@ var WorkflowSummaryCard = ({
61068
61630
  ] });
61069
61631
  var WorkflowSummaryCard_default = WorkflowSummaryCard;
61070
61632
 
61071
- // src/components/WorkflowTracker/sampleWorkflow.ts
61072
- var sampleWorkflow = {
61073
- eyebrow: "VENDOR ONBOARDING \xB7 REQ-4128",
61074
- title: "Northwind Logistics GmbH",
61075
- live: true,
61076
- activeStepId: "security_questionnaire",
61077
- steps: [
61078
- {
61079
- id: "request_submitted",
61080
- label: "Request submitted",
61081
- status: "done",
61082
- meta: "2m"
61083
- },
61084
- {
61085
- id: "duplicate_check",
61086
- label: "Duplicate check",
61087
- status: "skipped",
61088
- badge: "Not needed",
61089
- meta: "No match in registry"
61090
- },
61091
- {
61092
- id: "business_verification",
61093
- label: "Business verification",
61094
- status: "done",
61095
- meta: "12m \xB7 3 of 3 sub-steps"
61096
- },
61097
- {
61098
- id: "sanctions_screening",
61099
- label: "Sanctions screening",
61100
- status: "done",
61101
- meta: "4m"
61102
- },
61103
- {
61104
- id: "tax_documents",
61105
- label: "Tax documents",
61106
- status: "skipped",
61107
- badge: "Skipped",
61108
- meta: "Skipped by M. Reyes \xB7 resume anytime"
61109
- },
61110
- {
61111
- id: "insurance_certificates",
61112
- label: "Insurance certificates",
61113
- status: "attention",
61114
- badge: "Needs attention",
61115
- meta: "1h 06m \xB7 Liability certificate expired 12 Aug"
61116
- },
61117
- {
61118
- id: "contract_drafting",
61119
- label: "Contract drafting",
61120
- status: "done",
61121
- meta: "1h 10m"
61122
- },
61633
+ // src/components/WorkflowTracker/WorkflowTrackerRollups.tsx
61634
+ var import_jsx_runtime308 = require("react/jsx-runtime");
61635
+ var WorkflowTrackerRollups = ({
61636
+ data = sampleWorkflow,
61637
+ loading = false,
61638
+ labels: labelOverrides,
61639
+ className,
61640
+ style,
61641
+ ...styleProps
61642
+ }) => {
61643
+ const steps = data?.steps ?? [];
61644
+ const { palette, surfaces } = useWorkflowChrome(styleProps);
61645
+ const labels = (0, import_react282.useMemo)(() => resolveLabels(labelOverrides), [labelOverrides]);
61646
+ const cardProps = buildCardProps(styleProps);
61647
+ const attentionSteps = (0, import_react282.useMemo)(() => getAttentionSteps(steps), [steps]);
61648
+ const skippedSteps = (0, import_react282.useMemo)(() => getSkippedSteps(steps), [steps]);
61649
+ if (loading || attentionSteps.length === 0 && skippedSteps.length === 0) {
61650
+ return null;
61651
+ }
61652
+ return /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)(
61653
+ "div",
61123
61654
  {
61124
- id: "security_questionnaire",
61125
- label: "Security questionnaire",
61126
- status: "in_progress",
61127
- badge: "In progress",
61128
- meta: "24m \xB7 3 of 6 sub-steps",
61129
- elapsed: "24m",
61130
- description: "Vendor is completing the long-form questionnaire. Each sub-step unlocks once its evidence file is accepted by the reviewer.",
61131
- owner: "D. Okafor",
61132
- startedAt: "19 Aug \xB7 09:12",
61133
- sla: "Due in 6h",
61134
- subSteps: [
61135
- {
61136
- id: "data_handling",
61137
- label: "Data handling policy",
61138
- status: "done",
61139
- badge: "Accepted",
61140
- duration: "5m"
61141
- },
61142
- {
61143
- id: "pentest",
61144
- label: "Penetration test report",
61145
- status: "done",
61146
- badge: "Accepted",
61147
- duration: "8m"
61148
- },
61149
- {
61150
- id: "soc2",
61151
- label: "SOC 2 Type II evidence",
61152
- status: "done",
61153
- badge: "Accepted",
61154
- duration: "11m"
61155
- },
61156
- {
61157
- id: "subprocessor_list",
61158
- label: "Subprocessor list",
61159
- status: "running",
61160
- badge: "Running",
61161
- note: "Vendor uploading \u2014 2 of 3 files received"
61162
- },
61163
- {
61164
- id: "incident_response",
61165
- label: "Incident response plan",
61166
- status: "skipped",
61167
- badge: "Skipped",
61168
- note: "Covered by master agreement \xA77"
61169
- },
61170
- {
61171
- id: "business_continuity",
61172
- label: "Business continuity plan",
61173
- status: "not_started"
61174
- }
61655
+ className: (0, import_classnames118.default)("grid grid-cols-1 gap-5 @xl:grid-cols-2", className),
61656
+ style,
61657
+ children: [
61658
+ attentionSteps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(Panel_default, { ...cardProps, children: /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
61659
+ WorkflowSummaryCard_default,
61660
+ {
61661
+ title: labels.needsAttention,
61662
+ steps: attentionSteps,
61663
+ palette,
61664
+ surfaces
61665
+ }
61666
+ ) }),
61667
+ skippedSteps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(Panel_default, { ...cardProps, children: /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
61668
+ WorkflowSummaryCard_default,
61669
+ {
61670
+ title: labels.skippedSteps,
61671
+ steps: skippedSteps,
61672
+ palette,
61673
+ surfaces
61674
+ }
61675
+ ) })
61175
61676
  ]
61176
- },
61177
- {
61178
- id: "legal_review",
61179
- label: "Legal review",
61180
- status: "blocked",
61181
- badge: "Blocked",
61182
- meta: "Waiting on Legal \xB7 queued 2d"
61183
- },
61184
- {
61185
- id: "banking_details",
61186
- label: "Banking details",
61187
- status: "not_started"
61188
- },
61189
- {
61190
- id: "system_provisioning",
61191
- label: "System provisioning",
61192
- status: "not_started"
61193
- },
61194
- { id: "go_live", label: "Go-live", status: "not_started" }
61195
- ]
61677
+ }
61678
+ );
61196
61679
  };
61680
+ var WorkflowTrackerRollups_default = WorkflowTrackerRollups;
61197
61681
 
61198
61682
  // src/components/WorkflowTracker/WorkflowTracker.tsx
61199
- var import_jsx_runtime302 = require("react/jsx-runtime");
61200
- var DEFAULT_LABELS = {
61201
- progress: "Progress",
61202
- done: "done",
61203
- skipped: "skipped",
61204
- flagged: "flagged",
61205
- remaining: "remaining",
61206
- step: "Step",
61207
- of: "of",
61208
- elapsed: "Elapsed",
61209
- owner: "Owner",
61210
- started: "Started",
61211
- sla: "SLA",
61212
- subSteps: "Sub-steps",
61213
- accepted: "accepted",
61214
- open: "open",
61215
- needsAttention: "Needs attention",
61216
- skippedSteps: "Skipped steps",
61217
- live: "LIVE \xB7 read-only view",
61218
- empty: "No steps yet",
61219
- emptySubtitle: "Steps appear here as soon as the workflow starts.",
61220
- noActiveStep: "No step selected",
61221
- statuses: {
61222
- done: "Done",
61223
- in_progress: "In progress",
61224
- running: "Running",
61225
- skipped: "Skipped",
61226
- blocked: "Blocked",
61227
- attention: "Attention",
61228
- not_started: "Not started"
61229
- }
61230
- };
61683
+ var import_jsx_runtime309 = require("react/jsx-runtime");
61231
61684
  var WorkflowTracker = ({
61232
61685
  data = sampleWorkflow,
61233
61686
  accentColor = "blue",
@@ -61246,6 +61699,8 @@ var WorkflowTracker = ({
61246
61699
  maxWidth = 1180,
61247
61700
  railWidth = 360,
61248
61701
  stickyRail = false,
61702
+ fillHeight = false,
61703
+ fillHeightOffset = 0,
61249
61704
  loading = false,
61250
61705
  loadingRows = 6,
61251
61706
  emptyState,
@@ -61254,81 +61709,54 @@ var WorkflowTracker = ({
61254
61709
  labels: labelOverrides,
61255
61710
  onStepSelect,
61256
61711
  onSubStepSelect,
61712
+ onStepAction,
61257
61713
  className,
61258
61714
  style,
61259
61715
  ...rest
61260
61716
  }) => {
61261
- const steps = data?.steps ?? [];
61262
- const translucent = translucentSurfaces ?? isTranslucentVariant(variant);
61263
- const surfaces = (0, import_react278.useMemo)(
61264
- () => getSurfaceTokens(translucent),
61265
- [translucent]
61266
- );
61267
- const palette = (0, import_react278.useMemo)(
61268
- () => ({
61269
- accent: accentColor,
61270
- attention: attentionColor,
61271
- blocked: blockedColor,
61272
- muted: mutedColor,
61273
- translucent
61274
- }),
61275
- [accentColor, attentionColor, blockedColor, mutedColor, translucent]
61276
- );
61277
- const labels = (0, import_react278.useMemo)(
61278
- () => ({
61279
- ...DEFAULT_LABELS,
61280
- ...labelOverrides,
61281
- statuses: {
61282
- ...DEFAULT_LABELS.statuses,
61283
- ...labelOverrides?.statuses
61284
- }
61285
- }),
61286
- [labelOverrides]
61287
- );
61288
- const progress = (0, import_react278.useMemo)(() => computeProgress(steps), [steps]);
61289
- const tallies = (0, import_react278.useMemo)(() => computeTallies(steps), [steps]);
61290
- const active = (0, import_react278.useMemo)(
61291
- () => resolveActiveStep(steps, data?.activeStepId),
61292
- [steps, data?.activeStepId]
61293
- );
61294
- const attentionSteps = (0, import_react278.useMemo)(() => getAttentionSteps(steps), [steps]);
61295
- const skippedSteps = (0, import_react278.useMemo)(() => getSkippedSteps(steps), [steps]);
61296
- const cardProps = {
61717
+ const styleProps = {
61718
+ accentColor,
61719
+ attentionColor,
61720
+ blockedColor,
61721
+ mutedColor,
61297
61722
  variant,
61298
- tone: cardTone,
61723
+ cardTone,
61299
61724
  corner,
61300
61725
  glassOpacity,
61301
61726
  vibrancy,
61302
61727
  specularMode,
61303
61728
  padding,
61304
- scrollable: false
61729
+ translucentSurfaces
61305
61730
  };
61731
+ const { surfaces } = useWorkflowChrome(styleProps);
61732
+ const labels = (0, import_react283.useMemo)(() => resolveLabels(labelOverrides), [labelOverrides]);
61306
61733
  const railStyle = {
61307
- "--wt-rail-width": typeof railWidth === "number" ? `${railWidth}px` : railWidth
61734
+ "--wt-rail-width": typeof railWidth === "number" ? `${railWidth}px` : railWidth,
61735
+ "--wt-fill-offset": typeof fillHeightOffset === "number" ? `${fillHeightOffset}px` : fillHeightOffset
61308
61736
  };
61309
- return /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)(
61737
+ return /* @__PURE__ */ (0, import_jsx_runtime309.jsxs)(
61310
61738
  "div",
61311
61739
  {
61312
- className: (0, import_classnames113.default)("@container w-full", className),
61740
+ className: (0, import_classnames119.default)("@container w-full", className),
61313
61741
  style: { maxWidth, ...railStyle, ...style },
61314
61742
  "aria-busy": loading || void 0,
61315
61743
  ...rest,
61316
61744
  children: [
61317
- showHeader && loading && /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61745
+ showHeader && loading && /* @__PURE__ */ (0, import_jsx_runtime309.jsx)(
61318
61746
  WorkflowHeaderSkeleton,
61319
61747
  {
61320
61748
  hasIcon: Boolean(data?.icon),
61321
61749
  iconCorner
61322
61750
  }
61323
61751
  ),
61324
- showHeader && !loading && /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("header", { className: "mb-5 flex flex-wrap items-start justify-between gap-3", children: [
61325
- /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("div", { className: "flex min-w-0 items-center gap-3", children: [
61752
+ showHeader && !loading && /* @__PURE__ */ (0, import_jsx_runtime309.jsxs)("header", { className: "mb-5 flex flex-wrap items-start justify-between gap-3", children: [
61753
+ /* @__PURE__ */ (0, import_jsx_runtime309.jsxs)("div", { className: "flex min-w-0 items-center gap-3", children: [
61326
61754
  data?.icon && // `overflow-hidden` plus the shared corner class clips whatever
61327
61755
  // the caller passes, so an <img> needs no rounding of its own.
61328
- /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61756
+ /* @__PURE__ */ (0, import_jsx_runtime309.jsx)(
61329
61757
  "span",
61330
61758
  {
61331
- className: (0, import_classnames113.default)(
61759
+ className: (0, import_classnames119.default)(
61332
61760
  "flex h-12 w-12 shrink-0 items-center justify-center overflow-hidden [&>img]:h-full [&>img]:w-full [&>img]:object-cover",
61333
61761
  getSurfaceCornerClass(iconCorner),
61334
61762
  surfaces.chip
@@ -61336,33 +61764,33 @@ var WorkflowTracker = ({
61336
61764
  children: data.icon
61337
61765
  }
61338
61766
  ),
61339
- /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("div", { className: "min-w-0", children: [
61340
- data?.eyebrow && /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61767
+ /* @__PURE__ */ (0, import_jsx_runtime309.jsxs)("div", { className: "min-w-0", children: [
61768
+ data?.eyebrow && /* @__PURE__ */ (0, import_jsx_runtime309.jsx)(
61341
61769
  "p",
61342
61770
  {
61343
- className: (0, import_classnames113.default)(
61771
+ className: (0, import_classnames119.default)(
61344
61772
  "text-[11px] font-semibold uppercase tracking-widest",
61345
61773
  surfaces.faintText
61346
61774
  ),
61347
61775
  children: data.eyebrow
61348
61776
  }
61349
61777
  ),
61350
- /* @__PURE__ */ (0, import_jsx_runtime302.jsx)("h2", { className: "mt-1 text-2xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-3xl", children: data?.title })
61778
+ /* @__PURE__ */ (0, import_jsx_runtime309.jsx)("h2", { className: "mt-1 text-2xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-3xl", children: data?.title })
61351
61779
  ] })
61352
61780
  ] }),
61353
- data?.live && /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)(
61781
+ data?.live && /* @__PURE__ */ (0, import_jsx_runtime309.jsxs)(
61354
61782
  Pill_default,
61355
61783
  {
61356
61784
  size: "md",
61357
61785
  tone: mutedColor,
61358
61786
  variant: "outline",
61359
- className: (0, import_classnames113.default)("tracking-wide", surfaces.chip),
61787
+ className: (0, import_classnames119.default)("tracking-wide", surfaces.chip),
61360
61788
  children: [
61361
- /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61789
+ /* @__PURE__ */ (0, import_jsx_runtime309.jsx)(
61362
61790
  "span",
61363
61791
  {
61364
61792
  "aria-hidden": "true",
61365
- className: (0, import_classnames113.default)(
61793
+ className: (0, import_classnames119.default)(
61366
61794
  "mr-2 inline-block h-1.5 w-1.5 rounded-full",
61367
61795
  `bg-${accentColor}-500 dark:bg-${accentColor}-400`
61368
61796
  )
@@ -61373,67 +61801,77 @@ var WorkflowTracker = ({
61373
61801
  }
61374
61802
  )
61375
61803
  ] }),
61376
- /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("div", { className: "grid grid-cols-1 items-start gap-5 @4xl:grid-cols-[var(--wt-rail-width)_minmax(0,1fr)]", children: [
61377
- /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61378
- Panel_default,
61379
- {
61380
- ...cardProps,
61381
- className: (0, import_classnames113.default)(stickyRail && "@4xl:sticky @4xl:top-6"),
61382
- children: /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61383
- WorkflowTimeline_default,
61804
+ /* @__PURE__ */ (0, import_jsx_runtime309.jsxs)(
61805
+ "div",
61806
+ {
61807
+ className: (0, import_classnames119.default)(
61808
+ "grid grid-cols-1 items-start gap-5 @4xl:grid-cols-[var(--wt-rail-width)_minmax(0,1fr)]",
61809
+ fillHeight && "@4xl:h-[calc(100dvh-var(--wt-fill-offset))]"
61810
+ ),
61811
+ children: [
61812
+ /* @__PURE__ */ (0, import_jsx_runtime309.jsx)(
61813
+ WorkflowTrackerRail_default,
61384
61814
  {
61385
- steps,
61386
- activeStepId: active?.step.id,
61387
- palette,
61388
- surfaces,
61389
- labels,
61390
- progress,
61391
- tallies,
61392
- showLegend: showLegend && !loading,
61815
+ ...styleProps,
61816
+ data,
61393
61817
  loading,
61394
61818
  loadingRows,
61819
+ showLegend,
61395
61820
  emptyState,
61821
+ labels: labelOverrides,
61822
+ cardScrollable: fillHeight,
61823
+ cardClassName: (0, import_classnames119.default)(
61824
+ stickyRail && !fillHeight && "@4xl:sticky @4xl:top-6",
61825
+ fillHeight && "@4xl:min-h-0 @4xl:self-stretch"
61826
+ ),
61396
61827
  onStepSelect,
61397
- onSubStepSelect
61398
- }
61399
- )
61400
- }
61401
- ),
61402
- /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("div", { className: "@container flex min-w-0 flex-col gap-5", children: [
61403
- /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(Panel_default, { ...cardProps, children: /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61404
- WorkflowDetailPanel_default,
61405
- {
61406
- active,
61407
- totalSteps: steps.length,
61408
- palette,
61409
- surfaces,
61410
- labels,
61411
- loading,
61412
- onSubStepSelect
61413
- }
61414
- ) }),
61415
- !loading && (attentionSteps.length > 0 || skippedSteps.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("div", { className: "grid grid-cols-1 gap-5 @xl:grid-cols-2", children: [
61416
- attentionSteps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(Panel_default, { ...cardProps, children: /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61417
- WorkflowSummaryCard_default,
61418
- {
61419
- title: labels.needsAttention,
61420
- steps: attentionSteps,
61421
- palette,
61422
- surfaces
61828
+ onSubStepSelect,
61829
+ onStepAction
61423
61830
  }
61424
- ) }),
61425
- skippedSteps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(Panel_default, { ...cardProps, children: /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61426
- WorkflowSummaryCard_default,
61831
+ ),
61832
+ /* @__PURE__ */ (0, import_jsx_runtime309.jsxs)(
61833
+ "div",
61427
61834
  {
61428
- title: labels.skippedSteps,
61429
- steps: skippedSteps,
61430
- palette,
61431
- surfaces
61835
+ className: (0, import_classnames119.default)(
61836
+ "@container flex min-w-0 flex-col gap-5",
61837
+ fillHeight && "@4xl:min-h-0 @4xl:self-stretch"
61838
+ ),
61839
+ children: [
61840
+ /* @__PURE__ */ (0, import_jsx_runtime309.jsx)(
61841
+ WorkflowTrackerStepDetails_default,
61842
+ {
61843
+ ...styleProps,
61844
+ data,
61845
+ loading,
61846
+ labels: labelOverrides,
61847
+ onSubStepSelect,
61848
+ onStepAction
61849
+ }
61850
+ ),
61851
+ /* @__PURE__ */ (0, import_jsx_runtime309.jsx)(
61852
+ WorkflowTrackerDetails_default,
61853
+ {
61854
+ ...styleProps,
61855
+ data,
61856
+ loading,
61857
+ labels: labelOverrides
61858
+ }
61859
+ ),
61860
+ /* @__PURE__ */ (0, import_jsx_runtime309.jsx)(
61861
+ WorkflowTrackerRollups_default,
61862
+ {
61863
+ ...styleProps,
61864
+ data,
61865
+ loading,
61866
+ labels: labelOverrides
61867
+ }
61868
+ )
61869
+ ]
61432
61870
  }
61433
- ) })
61434
- ] })
61435
- ] })
61436
- ] })
61871
+ )
61872
+ ]
61873
+ }
61874
+ )
61437
61875
  ]
61438
61876
  }
61439
61877
  );
@@ -61441,9 +61879,9 @@ var WorkflowTracker = ({
61441
61879
  var WorkflowTracker_default = WorkflowTracker;
61442
61880
 
61443
61881
  // src/components/Gantt/Gantt.tsx
61444
- var import_react283 = require("react");
61882
+ var import_react288 = require("react");
61445
61883
  var import_react_dom15 = require("react-dom");
61446
- var import_classnames117 = __toESM(require("classnames"), 1);
61884
+ var import_classnames123 = __toESM(require("classnames"), 1);
61447
61885
 
61448
61886
  // ../common/gantt/types.ts
61449
61887
  var GANTT_ZOOM_PRESETS = [
@@ -62789,38 +63227,38 @@ var sampleGantt = {
62789
63227
  };
62790
63228
 
62791
63229
  // src/components/Gantt/GanttScale.tsx
62792
- var import_classnames114 = __toESM(require("classnames"), 1);
62793
- var import_jsx_runtime303 = require("react/jsx-runtime");
63230
+ var import_classnames120 = __toESM(require("classnames"), 1);
63231
+ var import_jsx_runtime310 = require("react/jsx-runtime");
62794
63232
  var GanttScale = ({ levels, height }) => {
62795
63233
  if (levels.length === 0) {
62796
- return /* @__PURE__ */ (0, import_jsx_runtime303.jsx)("div", { style: { height } });
63234
+ return /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("div", { style: { height } });
62797
63235
  }
62798
63236
  const coarseHeight = levels.length > 1 ? 24 : height;
62799
- return /* @__PURE__ */ (0, import_jsx_runtime303.jsx)("div", { className: "flex h-full w-full flex-col", children: levels.map((level, li) => /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
63237
+ return /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("div", { className: "flex h-full w-full flex-col", children: levels.map((level, li) => /* @__PURE__ */ (0, import_jsx_runtime310.jsx)(
62800
63238
  "div",
62801
63239
  {
62802
- className: (0, import_classnames114.default)("flex w-full", li === 0 ? "shrink-0" : "min-h-0 flex-1"),
63240
+ className: (0, import_classnames120.default)("flex w-full", li === 0 ? "shrink-0" : "min-h-0 flex-1"),
62803
63241
  style: li === 0 ? { height: coarseHeight } : void 0,
62804
- children: level.columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)(
63242
+ children: level.columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime310.jsxs)(
62805
63243
  "div",
62806
63244
  {
62807
- className: (0, import_classnames114.default)(
63245
+ className: (0, import_classnames120.default)(
62808
63246
  "flex shrink-0 flex-col items-center justify-center overflow-hidden border-r border-neutral-200/70 dark:border-neutral-800/70",
62809
63247
  li === 0 ? "bg-neutral-50/60 dark:bg-neutral-800/40" : "bg-white dark:bg-neutral-900"
62810
63248
  ),
62811
63249
  style: { width: col.width },
62812
63250
  children: [
62813
- /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
63251
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)(
62814
63252
  "span",
62815
63253
  {
62816
- className: (0, import_classnames114.default)(
63254
+ className: (0, import_classnames120.default)(
62817
63255
  "max-w-full truncate px-1 text-[10px] font-semibold uppercase leading-none tracking-wide",
62818
63256
  li === 0 ? "text-neutral-700 dark:text-neutral-200" : "text-neutral-500 dark:text-neutral-400"
62819
63257
  ),
62820
63258
  children: col.label
62821
63259
  }
62822
63260
  ),
62823
- col.subLabel != null && /* @__PURE__ */ (0, import_jsx_runtime303.jsx)("span", { className: "max-w-full truncate px-1 text-[9px] font-medium leading-none text-neutral-400 dark:text-neutral-500", children: col.subLabel })
63261
+ col.subLabel != null && /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("span", { className: "max-w-full truncate px-1 text-[9px] font-medium leading-none text-neutral-400 dark:text-neutral-500", children: col.subLabel })
62824
63262
  ]
62825
63263
  },
62826
63264
  col.id
@@ -62832,9 +63270,9 @@ var GanttScale = ({ levels, height }) => {
62832
63270
  GanttScale.displayName = "GanttScale";
62833
63271
 
62834
63272
  // src/components/Gantt/GanttLinkLayer.tsx
62835
- var import_react279 = require("react");
62836
- var import_jsx_runtime304 = require("react/jsx-runtime");
62837
- var GanttLinkLayer = (0, import_react279.forwardRef)(
63273
+ var import_react284 = require("react");
63274
+ var import_jsx_runtime311 = require("react/jsx-runtime");
63275
+ var GanttLinkLayer = (0, import_react284.forwardRef)(
62838
63276
  function GanttLinkLayer2({
62839
63277
  width,
62840
63278
  height,
@@ -62848,7 +63286,7 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62848
63286
  onDeleteLink
62849
63287
  }, ref) {
62850
63288
  const t = useKitT();
62851
- const svgRef = (0, import_react279.useRef)(null);
63289
+ const svgRef = (0, import_react284.useRef)(null);
62852
63290
  const selPath = selected ? paths.find((p) => p.link === selected) : void 0;
62853
63291
  const selColor = selPath ? selPath.color ?? color : color;
62854
63292
  const selMid = selPath ? { x: (selPath.from.x + selPath.to.x) / 2, y: (selPath.from.y + selPath.to.y) / 2 } : null;
@@ -62869,24 +63307,24 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62869
63307
  const pick = pickFromEvent(e) ?? clicked;
62870
63308
  if (interactive && onDeleteLink) onDeleteLink(pick.link);
62871
63309
  };
62872
- return /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)(
63310
+ return /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(
62873
63311
  "div",
62874
63312
  {
62875
63313
  ref,
62876
63314
  className: "pointer-events-none absolute top-0 z-10",
62877
63315
  style: { left: offsetLeft, width, height },
62878
63316
  children: [
62879
- /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)("svg", { ref: svgRef, width, height, className: "block overflow-visible", children: [
63317
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)("svg", { ref: svgRef, width, height, className: "block overflow-visible", children: [
62880
63318
  paths.map((p, i) => {
62881
63319
  const tokens = getGanttLinkTokens(p.color ?? color);
62882
63320
  const sel = selected != null && p.link === selected;
62883
63321
  const nodeR = sel ? 4.5 : 3.5;
62884
- return /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)(
63322
+ return /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(
62885
63323
  "g",
62886
63324
  {
62887
63325
  style: sel ? { filter: `drop-shadow(0 0 3px var(--color-${p.color ?? color}-500))` } : void 0,
62888
63326
  children: [
62889
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
63327
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
62890
63328
  "path",
62891
63329
  {
62892
63330
  d: p.d,
@@ -62902,10 +63340,10 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62902
63340
  },
62903
63341
  onClick: (e) => handlePick(e, p),
62904
63342
  onDoubleClick: (e) => handleDelete(e, p),
62905
- children: /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
63343
+ children: /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
62906
63344
  }
62907
63345
  ),
62908
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
63346
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
62909
63347
  "path",
62910
63348
  {
62911
63349
  d: p.d,
@@ -62921,14 +63359,14 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62921
63359
  },
62922
63360
  onClick: (e) => handlePick(e, p),
62923
63361
  onDoubleClick: (e) => handleDelete(e, p),
62924
- children: /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
63362
+ children: /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
62925
63363
  }
62926
63364
  ),
62927
- p.arrow && /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("polygon", { points: p.arrow, className: tokens.fill }),
62928
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("circle", { cx: p.from.x, cy: p.from.y, r: nodeR + 2.5, className: tokens.halo }),
62929
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("circle", { cx: p.from.x, cy: p.from.y, r: nodeR, className: tokens.fill }),
62930
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("circle", { cx: p.to.x, cy: p.to.y, r: nodeR + 2.5, className: tokens.halo }),
62931
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("circle", { cx: p.to.x, cy: p.to.y, r: nodeR, className: tokens.fill })
63365
+ p.arrow && /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("polygon", { points: p.arrow, className: tokens.fill }),
63366
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("circle", { cx: p.from.x, cy: p.from.y, r: nodeR + 2.5, className: tokens.halo }),
63367
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("circle", { cx: p.from.x, cy: p.from.y, r: nodeR, className: tokens.fill }),
63368
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("circle", { cx: p.to.x, cy: p.to.y, r: nodeR + 2.5, className: tokens.halo }),
63369
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("circle", { cx: p.to.x, cy: p.to.y, r: nodeR, className: tokens.fill })
62932
63370
  ]
62933
63371
  },
62934
63372
  `${p.link.source}->${p.link.target}-${p.type}-${i}`
@@ -62936,8 +63374,8 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62936
63374
  }),
62937
63375
  rubber && (() => {
62938
63376
  const tokens = getGanttLinkTokens(rubber.color);
62939
- return /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)("g", { children: [
62940
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
63377
+ return /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)("g", { children: [
63378
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
62941
63379
  "path",
62942
63380
  {
62943
63381
  d: rubber.d,
@@ -62948,15 +63386,15 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62948
63386
  strokeDasharray: "5 3"
62949
63387
  }
62950
63388
  ),
62951
- rubber.arrow && /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("polygon", { points: rubber.arrow, className: tokens.fill }),
62952
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 6, className: tokens.halo }),
62953
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 3.5, className: tokens.fill }),
62954
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 6, className: tokens.halo }),
62955
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 3.5, className: tokens.fill })
63389
+ rubber.arrow && /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("polygon", { points: rubber.arrow, className: tokens.fill }),
63390
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 6, className: tokens.halo }),
63391
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 3.5, className: tokens.fill }),
63392
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 6, className: tokens.halo }),
63393
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 3.5, className: tokens.fill })
62956
63394
  ] });
62957
63395
  })()
62958
63396
  ] }),
62959
- canDelete && selMid && /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)(
63397
+ canDelete && selMid && /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(
62960
63398
  "button",
62961
63399
  {
62962
63400
  type: "button",
@@ -62974,7 +63412,7 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62974
63412
  onClick: () => onDeleteLink(selected),
62975
63413
  title: t("kit.gantt.removeDependency"),
62976
63414
  children: [
62977
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("span", { "aria-hidden": true, children: "\u2715" }),
63415
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("span", { "aria-hidden": true, children: "\u2715" }),
62978
63416
  " ",
62979
63417
  t("kit.gantt.delete")
62980
63418
  ]
@@ -62988,9 +63426,9 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62988
63426
  GanttLinkLayer.displayName = "GanttLinkLayer";
62989
63427
 
62990
63428
  // src/components/Gantt/GanttBodyRow.tsx
62991
- var import_react280 = require("react");
62992
- var import_classnames115 = __toESM(require("classnames"), 1);
62993
- var import_jsx_runtime305 = require("react/jsx-runtime");
63429
+ var import_react285 = require("react");
63430
+ var import_classnames121 = __toESM(require("classnames"), 1);
63431
+ var import_jsx_runtime312 = require("react/jsx-runtime");
62994
63432
  var BAR_HEIGHT = 24;
62995
63433
  var MILESTONE_SIZE = 14;
62996
63434
  var GanttBodyRow = ({
@@ -63029,11 +63467,11 @@ var GanttBodyRow = ({
63029
63467
  const t = useKitT();
63030
63468
  const isDraggingThis = row.task != null && drag?.taskId === row.task.id;
63031
63469
  const reorderDragging = isDraggingThis && drag?.kind === "reorder";
63032
- return /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63470
+ return /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63033
63471
  "div",
63034
63472
  {
63035
63473
  "data-row-key": row.key,
63036
- className: (0, import_classnames115.default)(
63474
+ className: (0, import_classnames121.default)(
63037
63475
  // No overflow here: an overflow-hidden row root would become the
63038
63476
  // sticky halves' (non-scrolling) scrollport and stop them pinning to
63039
63477
  // the left edge while the timeline scrolls. The halves pin the
@@ -63050,7 +63488,7 @@ var GanttBodyRow = ({
63050
63488
  boxShadow: `inset 2px 0 0 var(--color-${color}-500)`
63051
63489
  } : {}
63052
63490
  },
63053
- children: row.task == null ? /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63491
+ children: row.task == null ? /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63054
63492
  LaneHeader,
63055
63493
  {
63056
63494
  row,
@@ -63061,20 +63499,20 @@ var GanttBodyRow = ({
63061
63499
  dividerClass,
63062
63500
  liveProgress: liveLane
63063
63501
  }
63064
- ) : /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(import_jsx_runtime305.Fragment, { children: [
63065
- /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(
63502
+ ) : /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)(import_jsx_runtime312.Fragment, { children: [
63503
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)(
63066
63504
  "div",
63067
63505
  {
63068
- className: (0, import_classnames115.default)(
63506
+ className: (0, import_classnames121.default)(
63069
63507
  "sticky left-0 z-20 flex items-stretch overflow-hidden border-r border-b bg-white dark:bg-neutral-900",
63070
63508
  dividerClass
63071
63509
  ),
63072
63510
  style: { width: leftWidth },
63073
63511
  children: [
63074
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("div", { className: "flex w-9 shrink-0 items-center justify-center", children: interactive && !row.task.locked && /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63512
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("div", { className: "flex w-9 shrink-0 items-center justify-center", children: interactive && !row.task.locked && /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63075
63513
  "span",
63076
63514
  {
63077
- className: (0, import_classnames115.default)(
63515
+ className: (0, import_classnames121.default)(
63078
63516
  "flex cursor-grab touch-none items-center text-neutral-300 transition-opacity active:cursor-grabbing dark:text-neutral-600",
63079
63517
  reorderDragging ? "opacity-100" : "opacity-0 group-hover/row:opacity-100"
63080
63518
  ),
@@ -63082,10 +63520,10 @@ var GanttBodyRow = ({
63082
63520
  onPointerDown: (e) => onGripPointerDown(row.key, row.task, e),
63083
63521
  title: t("kit.gantt.dragReorder"),
63084
63522
  "aria-hidden": "true",
63085
- children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(Drag, { className: "h-3.5 w-3.5" })
63523
+ children: /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(Drag, { className: "h-3.5 w-3.5" })
63086
63524
  }
63087
63525
  ) }),
63088
- columns.map((col, i) => /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63526
+ columns.map((col, i) => /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63089
63527
  Cell,
63090
63528
  {
63091
63529
  col,
@@ -63106,12 +63544,12 @@ var GanttBodyRow = ({
63106
63544
  ]
63107
63545
  }
63108
63546
  ),
63109
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63547
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63110
63548
  "div",
63111
63549
  {
63112
- className: (0, import_classnames115.default)("relative shrink-0 border-b", dividerClass),
63550
+ className: (0, import_classnames121.default)("relative shrink-0 border-b", dividerClass),
63113
63551
  style: { width: timelineWidth },
63114
- children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63552
+ children: /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63115
63553
  TaskBar,
63116
63554
  {
63117
63555
  task: row.task,
@@ -63152,57 +63590,57 @@ var LaneHeader = ({ row, columns, leftWidth, color, onCaretClick, dividerClass =
63152
63590
  const laneColor = lane.color ?? color;
63153
63591
  const tokens = getGanttLaneTokens(laneColor);
63154
63592
  const isOpen = lane.open !== false;
63155
- return /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(import_jsx_runtime305.Fragment, { children: [
63156
- /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(
63593
+ return /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)(import_jsx_runtime312.Fragment, { children: [
63594
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)(
63157
63595
  "div",
63158
63596
  {
63159
- className: (0, import_classnames115.default)(
63597
+ className: (0, import_classnames121.default)(
63160
63598
  "sticky left-0 z-20 flex items-stretch overflow-hidden border-r border-b bg-white dark:bg-neutral-900",
63161
63599
  dividerClass
63162
63600
  ),
63163
63601
  style: { width: leftWidth },
63164
63602
  children: [
63165
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("div", { className: (0, import_classnames115.default)("pointer-events-none absolute inset-0", tokens.band) }),
63166
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("div", { className: "relative flex w-9 shrink-0 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63603
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("div", { className: (0, import_classnames121.default)("pointer-events-none absolute inset-0", tokens.band) }),
63604
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("div", { className: "relative flex w-9 shrink-0 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63167
63605
  "button",
63168
63606
  {
63169
63607
  type: "button",
63170
63608
  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",
63171
63609
  onClick: () => onCaretClick(lane.id, isOpen),
63172
63610
  "aria-label": t(isOpen ? "kit.gantt.collapse" : "kit.gantt.expand", { name: lane.label }),
63173
- children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(ChevronRight, { className: (0, import_classnames115.default)("h-3 w-3 transition-transform", isOpen && "rotate-90") })
63611
+ children: /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(ChevronRight, { className: (0, import_classnames121.default)("h-3 w-3 transition-transform", isOpen && "rotate-90") })
63174
63612
  }
63175
63613
  ) }),
63176
- columns.map((col, i) => /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63614
+ columns.map((col, i) => /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63177
63615
  "div",
63178
63616
  {
63179
- className: (0, import_classnames115.default)(
63617
+ className: (0, import_classnames121.default)(
63180
63618
  "relative flex shrink-0 items-center gap-2 overflow-hidden border-r px-2 last:border-r-0",
63181
63619
  dividerClass
63182
63620
  ),
63183
63621
  style: { width: col.width ?? "160px" },
63184
- children: i === 0 ? /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(import_jsx_runtime305.Fragment, { children: [
63185
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: (0, import_classnames115.default)("truncate text-[13px] font-semibold", tokens.label), children: lane.label }),
63186
- lane.description && /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: "hidden truncate text-[11px] text-neutral-500 dark:text-neutral-400 lg:inline", children: lane.description }),
63187
- row.childCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("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 })
63188
- ] }) : col.key === "progress" ? /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(ProgressCell, { value: liveProgress ?? row.progress ?? 0, barClass: tokens.chip }) : null
63622
+ children: i === 0 ? /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)(import_jsx_runtime312.Fragment, { children: [
63623
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: (0, import_classnames121.default)("truncate text-[13px] font-semibold", tokens.label), children: lane.label }),
63624
+ lane.description && /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: "hidden truncate text-[11px] text-neutral-500 dark:text-neutral-400 lg:inline", children: lane.description }),
63625
+ row.childCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("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 })
63626
+ ] }) : col.key === "progress" ? /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(ProgressCell, { value: liveProgress ?? row.progress ?? 0, barClass: tokens.chip }) : null
63189
63627
  },
63190
63628
  col.key
63191
63629
  ))
63192
63630
  ]
63193
63631
  }
63194
63632
  ),
63195
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("div", { className: (0, import_classnames115.default)("relative min-w-0 flex-1 border-b", dividerClass), children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("div", { className: (0, import_classnames115.default)("absolute inset-0", tokens.band) }) })
63633
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("div", { className: (0, import_classnames121.default)("relative min-w-0 flex-1 border-b", dividerClass), children: /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("div", { className: (0, import_classnames121.default)("absolute inset-0", tokens.band) }) })
63196
63634
  ] });
63197
63635
  };
63198
63636
  var Cell = ({ col, task, depth, isGroup, childCount, first, onCaretClick, renderCell, liveProgress, liveRollup, rowProgress, dividerClass = "border-neutral-100 dark:border-neutral-800" }) => {
63199
63637
  const t = useKitT();
63200
63638
  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;
63201
63639
  const custom = col.key !== "name" && renderCell ? renderCell(value, task, col) : null;
63202
- return /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63640
+ return /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63203
63641
  "div",
63204
63642
  {
63205
- className: (0, import_classnames115.default)(
63643
+ className: (0, import_classnames121.default)(
63206
63644
  "flex shrink-0 items-center gap-1.5 overflow-hidden border-r px-2 text-[12.5px] last:border-r-0",
63207
63645
  dividerClass
63208
63646
  ),
@@ -63210,50 +63648,50 @@ var Cell = ({ col, task, depth, isGroup, childCount, first, onCaretClick, render
63210
63648
  width: col.width ?? "160px",
63211
63649
  justifyContent: col.align === "center" ? "center" : col.align === "right" ? "flex-end" : "flex-start"
63212
63650
  },
63213
- children: first ? /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(import_jsx_runtime305.Fragment, { children: [
63214
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: "shrink-0", style: { width: depth * 14 + 18 }, children: isGroup && /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63651
+ children: first ? /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)(import_jsx_runtime312.Fragment, { children: [
63652
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: "shrink-0", style: { width: depth * 14 + 18 }, children: isGroup && /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63215
63653
  "button",
63216
63654
  {
63217
63655
  type: "button",
63218
63656
  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",
63219
63657
  onClick: () => onCaretClick(task.id, task.open !== false),
63220
63658
  "aria-label": t(task.open === false ? "kit.gantt.expand" : "kit.gantt.collapse", { name: task.name }),
63221
- children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(ChevronRight, { className: (0, import_classnames115.default)("h-3 w-3 transition-transform", task.open !== false && "rotate-90") })
63659
+ children: /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(ChevronRight, { className: (0, import_classnames121.default)("h-3 w-3 transition-transform", task.open !== false && "rotate-90") })
63222
63660
  }
63223
63661
  ) }),
63224
- isGroup && childCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)("span", { className: "flex min-w-0 items-center gap-1 font-semibold text-neutral-800 dark:text-neutral-100", children: [
63225
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: "truncate", children: task.name }),
63226
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("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 })
63227
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: "truncate font-medium text-neutral-700 dark:text-neutral-300", children: task.name })
63228
- ] }) : col.kind === "owner" ? value != null ? /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)("span", { className: "flex min-w-0 items-center gap-1.5 text-neutral-600 dark:text-neutral-400", children: [
63229
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63662
+ isGroup && childCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)("span", { className: "flex min-w-0 items-center gap-1 font-semibold text-neutral-800 dark:text-neutral-100", children: [
63663
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: "truncate", children: task.name }),
63664
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("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 })
63665
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: "truncate font-medium text-neutral-700 dark:text-neutral-300", children: task.name })
63666
+ ] }) : col.kind === "owner" ? value != null ? /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)("span", { className: "flex min-w-0 items-center gap-1.5 text-neutral-600 dark:text-neutral-400", children: [
63667
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63230
63668
  "span",
63231
63669
  {
63232
- className: (0, import_classnames115.default)(
63670
+ className: (0, import_classnames121.default)(
63233
63671
  "flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-[8px] font-bold uppercase text-white",
63234
63672
  getGanttBarTokens(task.color ?? "blue").fill
63235
63673
  ),
63236
63674
  children: String(value).slice(0, 1)
63237
63675
  }
63238
63676
  ),
63239
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: "truncate", children: String(value) })
63240
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: "text-neutral-400 dark:text-neutral-600", children: "\u2014" }) : col.kind === "progress" ? /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(ProgressCell, { value: typeof value === "number" ? value : 0 }) : col.kind === "badge" ? task.badge != null ? /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63677
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: "truncate", children: String(value) })
63678
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: "text-neutral-400 dark:text-neutral-600", children: "\u2014" }) : col.kind === "progress" ? /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(ProgressCell, { value: typeof value === "number" ? value : 0 }) : col.kind === "badge" ? task.badge != null ? /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63241
63679
  "span",
63242
63680
  {
63243
- className: (0, import_classnames115.default)(
63681
+ className: (0, import_classnames121.default)(
63244
63682
  "rounded-full px-1.5 py-0.5 text-[10px] font-semibold",
63245
63683
  getGanttBarTokens(task.badgeColor ?? "neutral").fill,
63246
63684
  "text-white"
63247
63685
  ),
63248
63686
  children: task.badge
63249
63687
  }
63250
- ) : /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: "text-neutral-400 dark:text-neutral-600", children: "\u2014" }) : custom != null ? custom : /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: "truncate text-neutral-600 dark:text-neutral-400", children: value == null || value === "" ? "\u2014" : String(value) })
63688
+ ) : /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: "text-neutral-400 dark:text-neutral-600", children: "\u2014" }) : custom != null ? custom : /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: "truncate text-neutral-600 dark:text-neutral-400", children: value == null || value === "" ? "\u2014" : String(value) })
63251
63689
  }
63252
63690
  );
63253
63691
  };
63254
- var ProgressCell = ({ value, barClass = "bg-emerald-500" }) => /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)("span", { className: "flex w-full items-center gap-1.5", children: [
63255
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: "h-1.5 min-w-0 flex-1 overflow-hidden rounded-full bg-neutral-200/80 dark:bg-white/10", children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: (0, import_classnames115.default)("block h-full rounded-full", barClass), style: { width: `${Math.round(value * 100)}%` } }) }),
63256
- /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)("span", { className: "w-7 shrink-0 text-right text-[10px] font-semibold tabular-nums text-neutral-500 dark:text-neutral-400", children: [
63692
+ var ProgressCell = ({ value, barClass = "bg-emerald-500" }) => /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)("span", { className: "flex w-full items-center gap-1.5", children: [
63693
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: "h-1.5 min-w-0 flex-1 overflow-hidden rounded-full bg-neutral-200/80 dark:bg-white/10", children: /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: (0, import_classnames121.default)("block h-full rounded-full", barClass), style: { width: `${Math.round(value * 100)}%` } }) }),
63694
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)("span", { className: "w-7 shrink-0 text-right text-[10px] font-semibold tabular-nums text-neutral-500 dark:text-neutral-400", children: [
63257
63695
  Math.round(value * 100),
63258
63696
  "%"
63259
63697
  ] })
@@ -63285,7 +63723,7 @@ var TaskBar = ({
63285
63723
  const t = useKitT();
63286
63724
  const milestone = task.type === "milestone";
63287
63725
  const barColor = task.color ?? color;
63288
- const tokens = (0, import_react280.useMemo)(() => getGanttBarTokens(barColor), [barColor]);
63726
+ const tokens = (0, import_react285.useMemo)(() => getGanttBarTokens(barColor), [barColor]);
63289
63727
  const startMs = liveDates ? liveDates.start : toMs(task.start);
63290
63728
  const endMs = liveDates ? liveDates.end : toMs(task.end);
63291
63729
  const left = dateToX(startMs, rangeStart, zoom);
@@ -63310,7 +63748,7 @@ var TaskBar = ({
63310
63748
  pct: progressPct
63311
63749
  });
63312
63750
  if (milestone) {
63313
- return /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(
63751
+ return /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)(
63314
63752
  "div",
63315
63753
  {
63316
63754
  role: "button",
@@ -63318,7 +63756,7 @@ var TaskBar = ({
63318
63756
  "aria-label": ariaLabel,
63319
63757
  title: ariaLabel,
63320
63758
  "data-gantt-bar": task.id,
63321
- className: (0, import_classnames115.default)(
63759
+ className: (0, import_classnames121.default)(
63322
63760
  "absolute z-10 flex cursor-pointer items-center gap-1.5 outline-none",
63323
63761
  selected && selectionTokens.ring,
63324
63762
  "rounded"
@@ -63328,13 +63766,13 @@ var TaskBar = ({
63328
63766
  onClick: () => onSelect(task.id),
63329
63767
  onKeyDown: (e) => onBarKeyDown(e, task),
63330
63768
  children: [
63331
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: (0, import_classnames115.default)("h-3.5 w-3.5 shrink-0 rotate-45 rounded-[2px] shadow-sm", tokens.milestone) }),
63332
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("span", { className: "truncate text-[11px] font-semibold text-neutral-700 dark:text-neutral-300", children: task.name })
63769
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: (0, import_classnames121.default)("h-3.5 w-3.5 shrink-0 rotate-45 rounded-[2px] shadow-sm", tokens.milestone) }),
63770
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: "truncate text-[11px] font-semibold text-neutral-700 dark:text-neutral-300", children: task.name })
63333
63771
  ]
63334
63772
  }
63335
63773
  );
63336
63774
  }
63337
- return /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(
63775
+ return /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)(
63338
63776
  "div",
63339
63777
  {
63340
63778
  role: "button",
@@ -63342,7 +63780,7 @@ var TaskBar = ({
63342
63780
  "aria-label": ariaLabel,
63343
63781
  title: `${task.name} \xB7 ${formatDateTime(startMs, locale)} \u2192 ${formatDateTime(endMs, locale)} \xB7 ${progressPct}%`,
63344
63782
  "data-gantt-bar": task.id,
63345
- className: (0, import_classnames115.default)(
63783
+ className: (0, import_classnames121.default)(
63346
63784
  "group/bar absolute z-10 cursor-grab touch-none rounded-md shadow-sm outline-none transition-shadow active:cursor-grabbing",
63347
63785
  tokens.base,
63348
63786
  tokens.rim,
@@ -63359,17 +63797,17 @@ var TaskBar = ({
63359
63797
  onClick: () => onSelect(task.id),
63360
63798
  onKeyDown: (e) => onBarKeyDown(e, task),
63361
63799
  children: [
63362
- progress > 0 && /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63800
+ progress > 0 && /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63363
63801
  "div",
63364
63802
  {
63365
- className: (0, import_classnames115.default)("absolute inset-y-0 left-0 rounded-l-md", tokens.progress),
63803
+ className: (0, import_classnames121.default)("absolute inset-y-0 left-0 rounded-l-md", tokens.progress),
63366
63804
  style: { width: `${progress * 100}%` }
63367
63805
  }
63368
63806
  ),
63369
- canEdit && !row.isGroup && progress > 0 && progress < 1 && /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63807
+ canEdit && !row.isGroup && progress > 0 && progress < 1 && /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63370
63808
  "div",
63371
63809
  {
63372
- className: (0, import_classnames115.default)(
63810
+ className: (0, import_classnames121.default)(
63373
63811
  "absolute inset-y-0 z-20 w-2 cursor-ew-resize touch-none opacity-0 transition-opacity group-hover/bar:opacity-100",
63374
63812
  liveProgress != null && "opacity-100"
63375
63813
  ),
@@ -63377,10 +63815,10 @@ var TaskBar = ({
63377
63815
  onPointerDown: (e) => onProgressPointerDown(task, e),
63378
63816
  title: labels.progress,
63379
63817
  "aria-hidden": "true",
63380
- children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("div", { className: "mx-auto h-full w-0.5 rounded-full bg-white/90" })
63818
+ children: /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("div", { className: "mx-auto h-full w-0.5 rounded-full bg-white/90" })
63381
63819
  }
63382
63820
  ),
63383
- liveProgress != null && /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(
63821
+ liveProgress != null && /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)(
63384
63822
  "div",
63385
63823
  {
63386
63824
  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",
@@ -63391,31 +63829,31 @@ var TaskBar = ({
63391
63829
  ]
63392
63830
  }
63393
63831
  ),
63394
- showName && (renderBar != null ? /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("div", { className: (0, import_classnames115.default)("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__ */ (0, import_jsx_runtime305.jsx)("span", { className: (0, import_classnames115.default)("pointer-events-none absolute inset-0 flex items-center truncate px-1.5 text-[11px] font-medium", labelText), children: task.name })),
63395
- canEdit && /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(import_jsx_runtime305.Fragment, { children: [
63396
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63832
+ showName && (renderBar != null ? /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("div", { className: (0, import_classnames121.default)("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__ */ (0, import_jsx_runtime312.jsx)("span", { className: (0, import_classnames121.default)("pointer-events-none absolute inset-0 flex items-center truncate px-1.5 text-[11px] font-medium", labelText), children: task.name })),
63833
+ canEdit && /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)(import_jsx_runtime312.Fragment, { children: [
63834
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63397
63835
  "div",
63398
63836
  {
63399
63837
  className: "absolute inset-y-0 -left-1 z-20 w-2 cursor-ew-resize touch-none",
63400
63838
  onPointerDown: (e) => onResizePointerDown(task, "start", e),
63401
63839
  title: t("kit.gantt.resizeStart"),
63402
63840
  "aria-hidden": "true",
63403
- children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("div", { className: "mx-auto h-full w-1 rounded-full bg-white/0 opacity-0 transition-opacity group-hover/bar:opacity-100" })
63841
+ children: /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("div", { className: "mx-auto h-full w-1 rounded-full bg-white/0 opacity-0 transition-opacity group-hover/bar:opacity-100" })
63404
63842
  }
63405
63843
  ),
63406
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63844
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63407
63845
  "div",
63408
63846
  {
63409
63847
  className: "absolute inset-y-0 -right-1 z-20 w-2 cursor-ew-resize touch-none",
63410
63848
  onPointerDown: (e) => onResizePointerDown(task, "end", e),
63411
63849
  title: t("kit.gantt.resizeEnd"),
63412
63850
  "aria-hidden": "true",
63413
- children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)("div", { className: "mx-auto h-full w-1 rounded-full bg-white/0 opacity-0 transition-opacity group-hover/bar:opacity-100" })
63851
+ children: /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("div", { className: "mx-auto h-full w-1 rounded-full bg-white/0 opacity-0 transition-opacity group-hover/bar:opacity-100" })
63414
63852
  }
63415
63853
  )
63416
63854
  ] }),
63417
- canEdit && /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(import_jsx_runtime305.Fragment, { children: [
63418
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63855
+ canEdit && /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)(import_jsx_runtime312.Fragment, { children: [
63856
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63419
63857
  "button",
63420
63858
  {
63421
63859
  type: "button",
@@ -63426,7 +63864,7 @@ var TaskBar = ({
63426
63864
  "aria-label": t("kit.gantt.linkFromStart", { task: task.name })
63427
63865
  }
63428
63866
  ),
63429
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63867
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(
63430
63868
  "button",
63431
63869
  {
63432
63870
  type: "button",
@@ -63444,9 +63882,9 @@ var TaskBar = ({
63444
63882
  };
63445
63883
 
63446
63884
  // src/components/Gantt/GanttToolbar.tsx
63447
- var import_react281 = require("react");
63448
- var import_classnames116 = __toESM(require("classnames"), 1);
63449
- var import_jsx_runtime306 = require("react/jsx-runtime");
63885
+ var import_react286 = require("react");
63886
+ var import_classnames122 = __toESM(require("classnames"), 1);
63887
+ var import_jsx_runtime313 = require("react/jsx-runtime");
63450
63888
  function nearestPreset(zoom, presets) {
63451
63889
  let best = null;
63452
63890
  let bestDist = Infinity;
@@ -63473,25 +63911,25 @@ var GanttToolbar = ({
63473
63911
  Month: t("kit.gantt.zoomMonth"),
63474
63912
  Quarter: t("kit.gantt.zoomQuarter")
63475
63913
  };
63476
- const active = (0, import_react281.useMemo)(() => nearestPreset(zoom, presets), [zoom, presets]);
63477
- const chrome = (0, import_react281.useMemo)(
63914
+ const active = (0, import_react286.useMemo)(() => nearestPreset(zoom, presets), [zoom, presets]);
63915
+ const chrome = (0, import_react286.useMemo)(
63478
63916
  () => getSurfaceVariantClasses(variant, "neutral"),
63479
63917
  [variant]
63480
63918
  );
63481
- return /* @__PURE__ */ (0, import_jsx_runtime306.jsxs)(
63919
+ return /* @__PURE__ */ (0, import_jsx_runtime313.jsxs)(
63482
63920
  "div",
63483
63921
  {
63484
- className: (0, import_classnames116.default)(
63922
+ className: (0, import_classnames122.default)(
63485
63923
  "pointer-events-auto flex items-center gap-1 rounded-lg p-1",
63486
63924
  chrome
63487
63925
  ),
63488
63926
  children: [
63489
- /* @__PURE__ */ (0, import_jsx_runtime306.jsx)("div", { className: "flex items-center rounded-md bg-neutral-100 p-0.5 dark:bg-neutral-800", children: presets.map((p) => /* @__PURE__ */ (0, import_jsx_runtime306.jsx)(
63927
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("div", { className: "flex items-center rounded-md bg-neutral-100 p-0.5 dark:bg-neutral-800", children: presets.map((p) => /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
63490
63928
  "button",
63491
63929
  {
63492
63930
  type: "button",
63493
63931
  onClick: () => onZoomTo(p.value),
63494
- className: (0, import_classnames116.default)(
63932
+ className: (0, import_classnames122.default)(
63495
63933
  "rounded px-1.5 py-0.5 text-[10.5px] font-semibold transition-colors",
63496
63934
  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"
63497
63935
  ),
@@ -63499,9 +63937,9 @@ var GanttToolbar = ({
63499
63937
  },
63500
63938
  p.label
63501
63939
  )) }),
63502
- /* @__PURE__ */ (0, import_jsx_runtime306.jsx)("div", { className: "mx-0.5 h-4 w-px bg-neutral-200 dark:bg-neutral-700" }),
63503
- /* @__PURE__ */ (0, import_jsx_runtime306.jsx)(Button_default, { variant: "ghost", size: "xs", onClick: () => onZoomBy(1 / 1.25), "aria-label": t("kit.gantt.zoomOut"), children: /* @__PURE__ */ (0, import_jsx_runtime306.jsx)("span", { className: "text-xs font-semibold leading-none", children: "\u2212" }) }),
63504
- /* @__PURE__ */ (0, import_jsx_runtime306.jsx)(Button_default, { variant: "ghost", size: "xs", onClick: () => onZoomBy(1.25), "aria-label": t("kit.gantt.zoomIn"), children: /* @__PURE__ */ (0, import_jsx_runtime306.jsx)("span", { className: "text-xs font-semibold leading-none", children: "+" }) })
63940
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("div", { className: "mx-0.5 h-4 w-px bg-neutral-200 dark:bg-neutral-700" }),
63941
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(Button_default, { variant: "ghost", size: "xs", onClick: () => onZoomBy(1 / 1.25), "aria-label": t("kit.gantt.zoomOut"), children: /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("span", { className: "text-xs font-semibold leading-none", children: "\u2212" }) }),
63942
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(Button_default, { variant: "ghost", size: "xs", onClick: () => onZoomBy(1.25), "aria-label": t("kit.gantt.zoomIn"), children: /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("span", { className: "text-xs font-semibold leading-none", children: "+" }) })
63505
63943
  ]
63506
63944
  }
63507
63945
  );
@@ -63509,16 +63947,16 @@ var GanttToolbar = ({
63509
63947
  GanttToolbar.displayName = "GanttToolbar";
63510
63948
 
63511
63949
  // src/components/Gantt/useGanttDrag.ts
63512
- var import_react282 = require("react");
63950
+ var import_react287 = require("react");
63513
63951
  function useGanttDrag(opts) {
63514
- const [drag, setDrag] = (0, import_react282.useState)(null);
63515
- const [linkSelected, setLinkSelected] = (0, import_react282.useState)(null);
63516
- const optsRef = (0, import_react282.useRef)(opts);
63952
+ const [drag, setDrag] = (0, import_react287.useState)(null);
63953
+ const [linkSelected, setLinkSelected] = (0, import_react287.useState)(null);
63954
+ const optsRef = (0, import_react287.useRef)(opts);
63517
63955
  optsRef.current = opts;
63518
- const dragRef = (0, import_react282.useRef)(null);
63956
+ const dragRef = (0, import_react287.useRef)(null);
63519
63957
  dragRef.current = drag;
63520
63958
  const { rows, zoom, rangeStart, accentColor } = opts;
63521
- const barGeom = (0, import_react282.useCallback)(
63959
+ const barGeom = (0, import_react287.useCallback)(
63522
63960
  (taskId) => {
63523
63961
  const row = rows.find((r) => r.key === `task:${taskId}`);
63524
63962
  if (!row?.task) return null;
@@ -63538,7 +63976,7 @@ function useGanttDrag(opts) {
63538
63976
  },
63539
63977
  [rows, zoom, rangeStart]
63540
63978
  );
63541
- const findTargetBar = (0, import_react282.useCallback)(
63979
+ const findTargetBar = (0, import_react287.useCallback)(
63542
63980
  (x, y, excludeId) => {
63543
63981
  const row = rows.find((r) => r.task && y >= r.top && y < r.top + r.height);
63544
63982
  if (!row?.task || row.task.id === excludeId) return null;
@@ -63549,7 +63987,7 @@ function useGanttDrag(opts) {
63549
63987
  },
63550
63988
  [rows, barGeom]
63551
63989
  );
63552
- const allBarGeoms = (0, import_react282.useCallback)(() => {
63990
+ const allBarGeoms = (0, import_react287.useCallback)(() => {
63553
63991
  const out = [];
63554
63992
  for (const row of rows) {
63555
63993
  if (!row.task) continue;
@@ -63558,17 +63996,17 @@ function useGanttDrag(opts) {
63558
63996
  }
63559
63997
  return out;
63560
63998
  }, [rows, barGeom]);
63561
- const timelineX = (0, import_react282.useCallback)((clientX) => {
63999
+ const timelineX = (0, import_react287.useCallback)((clientX) => {
63562
64000
  const overlay = optsRef.current.overlayRef.current;
63563
64001
  if (!overlay) return 0;
63564
64002
  return clientX - overlay.getBoundingClientRect().left;
63565
64003
  }, []);
63566
- const rowY = (0, import_react282.useCallback)((clientY) => {
64004
+ const rowY = (0, import_react287.useCallback)((clientY) => {
63567
64005
  const overlay = optsRef.current.overlayRef.current;
63568
64006
  if (!overlay) return 0;
63569
64007
  return clientY - overlay.getBoundingClientRect().top;
63570
64008
  }, []);
63571
- (0, import_react282.useEffect)(() => {
64009
+ (0, import_react287.useEffect)(() => {
63572
64010
  if (!drag) return;
63573
64011
  const onMove = (e) => {
63574
64012
  e.preventDefault();
@@ -63693,7 +64131,7 @@ function useGanttDrag(opts) {
63693
64131
  window.removeEventListener("pointerup", onUp);
63694
64132
  };
63695
64133
  }, [drag != null, timelineX, rowY]);
63696
- const beginDrag = (0, import_react282.useCallback)(
64134
+ const beginDrag = (0, import_react287.useCallback)(
63697
64135
  (partial, e, focusEl) => {
63698
64136
  const o = optsRef.current;
63699
64137
  if (!o.interactive) return;
@@ -63727,7 +64165,7 @@ function useGanttDrag(opts) {
63727
64165
  },
63728
64166
  [timelineX, rowY]
63729
64167
  );
63730
- const onBarPointerDown = (0, import_react282.useCallback)(
64168
+ const onBarPointerDown = (0, import_react287.useCallback)(
63731
64169
  (task, e) => {
63732
64170
  if (e.button !== 0) return;
63733
64171
  beginDrag(
@@ -63745,7 +64183,7 @@ function useGanttDrag(opts) {
63745
64183
  },
63746
64184
  [beginDrag, timelineX, rowY]
63747
64185
  );
63748
- const onResizePointerDown = (0, import_react282.useCallback)(
64186
+ const onResizePointerDown = (0, import_react287.useCallback)(
63749
64187
  (task, edge, e) => {
63750
64188
  if (e.button !== 0) return;
63751
64189
  e.stopPropagation();
@@ -63764,7 +64202,7 @@ function useGanttDrag(opts) {
63764
64202
  },
63765
64203
  [beginDrag, timelineX, rowY]
63766
64204
  );
63767
- const onGripPointerDown = (0, import_react282.useCallback)(
64205
+ const onGripPointerDown = (0, import_react287.useCallback)(
63768
64206
  (_rowKey, task, e) => {
63769
64207
  if (e.button !== 0) return;
63770
64208
  const rowEl = e.currentTarget.closest(
@@ -63789,7 +64227,7 @@ function useGanttDrag(opts) {
63789
64227
  },
63790
64228
  [beginDrag, timelineX, rowY]
63791
64229
  );
63792
- const onLinkHandlePointerDown = (0, import_react282.useCallback)(
64230
+ const onLinkHandlePointerDown = (0, import_react287.useCallback)(
63793
64231
  (task, side, e, fromOffset = 0) => {
63794
64232
  if (e.button !== 0) return;
63795
64233
  e.stopPropagation();
@@ -63809,7 +64247,7 @@ function useGanttDrag(opts) {
63809
64247
  },
63810
64248
  [beginDrag, timelineX, rowY]
63811
64249
  );
63812
- const onProgressPointerDown = (0, import_react282.useCallback)(
64250
+ const onProgressPointerDown = (0, import_react287.useCallback)(
63813
64251
  (task, e) => {
63814
64252
  if (e.button !== 0) return;
63815
64253
  e.stopPropagation();
@@ -63827,7 +64265,7 @@ function useGanttDrag(opts) {
63827
64265
  },
63828
64266
  [beginDrag, timelineX, rowY]
63829
64267
  );
63830
- const rubber = (0, import_react282.useMemo)(() => {
64268
+ const rubber = (0, import_react287.useMemo)(() => {
63831
64269
  if (!drag || drag.kind !== "link") return null;
63832
64270
  const source = barGeom(drag.taskId);
63833
64271
  if (!source) return null;
@@ -63859,7 +64297,7 @@ function useGanttDrag(opts) {
63859
64297
  }
63860
64298
 
63861
64299
  // src/components/Gantt/Gantt.tsx
63862
- var import_jsx_runtime307 = require("react/jsx-runtime");
64300
+ var import_jsx_runtime314 = require("react/jsx-runtime");
63863
64301
  var HEADER_HEIGHT = 52;
63864
64302
  var GRIP_WIDTH = 36;
63865
64303
  var DEFAULT_COLUMNS = [
@@ -63918,7 +64356,7 @@ var Gantt = ({
63918
64356
  const t = useKitT();
63919
64357
  const kitEngine = useKitEngine();
63920
64358
  const dateLocale = locale ?? kitEngine.locale;
63921
- const allLabels = (0, import_react283.useMemo)(
64359
+ const allLabels = (0, import_react288.useMemo)(
63922
64360
  () => ({
63923
64361
  loading: t("kit.gantt.loading"),
63924
64362
  empty: t("kit.gantt.empty"),
@@ -63941,10 +64379,10 @@ var Gantt = ({
63941
64379
  title: c.key === "name" ? allLabels.task : c.key === "owner" ? t("kit.gantt.colOwner") : t("kit.gantt.colProgress")
63942
64380
  }));
63943
64381
  const interactive = editable ?? Boolean(onTasksChange || onLinksChange || onReorder);
63944
- const surfaceText = (0, import_react283.useMemo)(() => getSurfaceTextTokens(variant), [variant]);
63945
- const [internalZoom, setInternalZoom] = (0, import_react283.useState)(initialZoom);
64382
+ const surfaceText = (0, import_react288.useMemo)(() => getSurfaceTextTokens(variant), [variant]);
64383
+ const [internalZoom, setInternalZoom] = (0, import_react288.useState)(initialZoom);
63946
64384
  const zoom = zoomProp ?? internalZoom;
63947
- const setZoom = (0, import_react283.useCallback)(
64385
+ const setZoom = (0, import_react288.useCallback)(
63948
64386
  (z) => {
63949
64387
  const clamped = Math.min(maxZoom, Math.max(minZoom, z));
63950
64388
  if (onZoomChange) onZoomChange(clamped);
@@ -63952,33 +64390,33 @@ var Gantt = ({
63952
64390
  },
63953
64391
  [minZoom, maxZoom, onZoomChange]
63954
64392
  );
63955
- const [internalSelection, setInternalSelection] = (0, import_react283.useState)(null);
64393
+ const [internalSelection, setInternalSelection] = (0, import_react288.useState)(null);
63956
64394
  const selectedId = selectedIdProp !== void 0 ? selectedIdProp : internalSelection;
63957
- const setSelected = (0, import_react283.useCallback)(
64395
+ const setSelected = (0, import_react288.useCallback)(
63958
64396
  (id) => {
63959
64397
  onSelect?.(id);
63960
64398
  if (selectedIdProp === void 0) setInternalSelection(id);
63961
64399
  },
63962
64400
  [onSelect, selectedIdProp]
63963
64401
  );
63964
- const [internalOrder, setInternalOrder] = (0, import_react283.useState)(void 0);
64402
+ const [internalOrder, setInternalOrder] = (0, import_react288.useState)(void 0);
63965
64403
  const rowOrder = rowOrderProp ?? internalOrder;
63966
- const handleReorder = (0, import_react283.useCallback)(
64404
+ const handleReorder = (0, import_react288.useCallback)(
63967
64405
  (order) => {
63968
64406
  onReorder?.(order);
63969
64407
  if (rowOrderProp === void 0) setInternalOrder(order);
63970
64408
  },
63971
64409
  [onReorder, rowOrderProp]
63972
64410
  );
63973
- const [collapsed, setCollapsed] = (0, import_react283.useState)(
64411
+ const [collapsed, setCollapsed] = (0, import_react288.useState)(
63974
64412
  () => new Set(tasks.filter((t2) => t2.open === false).map((t2) => t2.id))
63975
64413
  );
63976
- const [closedLanes, setClosedLanes] = (0, import_react283.useState)(
64414
+ const [closedLanes, setClosedLanes] = (0, import_react288.useState)(
63977
64415
  () => new Set((lanes ?? []).filter((l) => l.open === false).map((l) => l.id))
63978
64416
  );
63979
- const tasksRef = (0, import_react283.useRef)(tasks);
63980
- const lanesRef = (0, import_react283.useRef)(lanes);
63981
- (0, import_react283.useEffect)(() => {
64417
+ const tasksRef = (0, import_react288.useRef)(tasks);
64418
+ const lanesRef = (0, import_react288.useRef)(lanes);
64419
+ (0, import_react288.useEffect)(() => {
63982
64420
  if (tasksRef.current !== tasks) {
63983
64421
  tasksRef.current = tasks;
63984
64422
  setCollapsed(new Set(tasks.filter((t2) => t2.open === false).map((t2) => t2.id)));
@@ -63988,7 +64426,7 @@ var Gantt = ({
63988
64426
  setClosedLanes(new Set((lanes ?? []).filter((l) => l.open === false).map((l) => l.id)));
63989
64427
  }
63990
64428
  }, [tasks, lanes]);
63991
- const toggleCollapse = (0, import_react283.useCallback)((taskId, isOpen) => {
64429
+ const toggleCollapse = (0, import_react288.useCallback)((taskId, isOpen) => {
63992
64430
  setCollapsed((prev) => {
63993
64431
  const next = new Set(prev);
63994
64432
  if (isOpen) next.add(taskId);
@@ -63996,7 +64434,7 @@ var Gantt = ({
63996
64434
  return next;
63997
64435
  });
63998
64436
  }, []);
63999
- const toggleLane = (0, import_react283.useCallback)((laneId, isOpen) => {
64437
+ const toggleLane = (0, import_react288.useCallback)((laneId, isOpen) => {
64000
64438
  setClosedLanes((prev) => {
64001
64439
  const next = new Set(prev);
64002
64440
  if (isOpen) next.add(laneId);
@@ -64004,37 +64442,37 @@ var Gantt = ({
64004
64442
  return next;
64005
64443
  });
64006
64444
  }, []);
64007
- const effectiveTasks = (0, import_react283.useMemo)(() => {
64445
+ const effectiveTasks = (0, import_react288.useMemo)(() => {
64008
64446
  let out = tasks;
64009
64447
  if (collapsed.size > 0) {
64010
64448
  out = out.map((t2) => collapsed.has(t2.id) ? { ...t2, open: false } : t2);
64011
64449
  }
64012
64450
  return out;
64013
64451
  }, [tasks, collapsed]);
64014
- const effectiveLanes = (0, import_react283.useMemo)(() => {
64452
+ const effectiveLanes = (0, import_react288.useMemo)(() => {
64015
64453
  if (closedLanes.size === 0) return lanes;
64016
64454
  return (lanes ?? []).map(
64017
64455
  (l) => closedLanes.has(l.id) ? { ...l, open: false } : l
64018
64456
  );
64019
64457
  }, [lanes, closedLanes]);
64020
- const committedModel = (0, import_react283.useMemo)(
64458
+ const committedModel = (0, import_react288.useMemo)(
64021
64459
  () => buildRows(effectiveTasks, effectiveLanes, rowOrder, rowHeight2),
64022
64460
  [effectiveTasks, effectiveLanes, rowOrder, rowHeight2]
64023
64461
  );
64024
- const range = (0, import_react283.useMemo)(() => {
64462
+ const range = (0, import_react288.useMemo)(() => {
64025
64463
  const starts = tasks.map((t2) => toMs(t2.start));
64026
64464
  const ends = tasks.map((t2) => toMs(t2.end));
64027
64465
  return computeViewRange(starts, ends);
64028
64466
  }, [tasks]);
64029
64467
  const timelineWidth = rangeWidth(range.start, range.end, zoom);
64030
- const scaleLevels = (0, import_react283.useMemo)(
64468
+ const scaleLevels = (0, import_react288.useMemo)(
64031
64469
  () => buildTimeScale(range.start, range.end, zoom, dateLocale),
64032
64470
  [range, zoom, dateLocale]
64033
64471
  );
64034
- const [colWidths, setColWidths] = (0, import_react283.useState)(
64472
+ const [colWidths, setColWidths] = (0, import_react288.useState)(
64035
64473
  () => columnWidths ? { ...columnWidths } : {}
64036
64474
  );
64037
- (0, import_react283.useEffect)(() => {
64475
+ (0, import_react288.useEffect)(() => {
64038
64476
  if (!columnWidths) return;
64039
64477
  setColWidths((prev) => ({ ...prev, ...columnWidths }));
64040
64478
  }, [columnWidths]);
@@ -64044,21 +64482,21 @@ var Gantt = ({
64044
64482
  const m = /^(\d+(?:\.\d+)?)px$/.exec(col.width ?? "");
64045
64483
  return m ? Number(m[1]) : 160;
64046
64484
  };
64047
- const sizedColumns = (0, import_react283.useMemo)(
64485
+ const sizedColumns = (0, import_react288.useMemo)(
64048
64486
  () => resolvedColumns.map((c) => ({ ...c, width: `${effectiveColWidth(c)}px` })),
64049
64487
  [resolvedColumns, colWidths]
64050
64488
  );
64051
- const effectiveWidthsRef = (0, import_react283.useRef)({});
64489
+ const effectiveWidthsRef = (0, import_react288.useRef)({});
64052
64490
  effectiveWidthsRef.current = Object.fromEntries(
64053
64491
  sizedColumns.map((c) => [c.key, effectiveColWidth(c)])
64054
64492
  );
64055
- const leftWidth = (0, import_react283.useMemo)(
64493
+ const leftWidth = (0, import_react288.useMemo)(
64056
64494
  () => GRIP_WIDTH + resolvedColumns.reduce((sum, c) => sum + effectiveColWidth(c), 0),
64057
64495
  [resolvedColumns, colWidths]
64058
64496
  );
64059
- const resizingRef = (0, import_react283.useRef)(null);
64060
- const [resizingKey, setResizingKey] = (0, import_react283.useState)(null);
64061
- const startColumnResize = (0, import_react283.useCallback)(
64497
+ const resizingRef = (0, import_react288.useRef)(null);
64498
+ const [resizingKey, setResizingKey] = (0, import_react288.useState)(null);
64499
+ const startColumnResize = (0, import_react288.useCallback)(
64062
64500
  (e, key) => {
64063
64501
  if (e.button !== 0) return;
64064
64502
  e.preventDefault();
@@ -64089,23 +64527,23 @@ var Gantt = ({
64089
64527
  },
64090
64528
  [onColumnWidthChange]
64091
64529
  );
64092
- (0, import_react283.useEffect)(
64530
+ (0, import_react288.useEffect)(
64093
64531
  () => () => {
64094
64532
  document.body.style.cursor = "";
64095
64533
  document.body.style.userSelect = "";
64096
64534
  },
64097
64535
  []
64098
64536
  );
64099
- const scrollRef = (0, import_react283.useRef)(null);
64100
- const overlayRef = (0, import_react283.useRef)(null);
64101
- const rootRef = (0, import_react283.useRef)(null);
64102
- const headerScaleRef = (0, import_react283.useRef)(null);
64103
- const syncHeaderScale = (0, import_react283.useCallback)(() => {
64537
+ const scrollRef = (0, import_react288.useRef)(null);
64538
+ const overlayRef = (0, import_react288.useRef)(null);
64539
+ const rootRef = (0, import_react288.useRef)(null);
64540
+ const headerScaleRef = (0, import_react288.useRef)(null);
64541
+ const syncHeaderScale = (0, import_react288.useCallback)(() => {
64104
64542
  const s = scrollRef.current;
64105
64543
  const h = headerScaleRef.current;
64106
64544
  if (s && h) h.style.transform = `translateX(${-s.scrollLeft}px)`;
64107
64545
  }, []);
64108
- const zoomBy = (0, import_react283.useCallback)(
64546
+ const zoomBy = (0, import_react288.useCallback)(
64109
64547
  (factor, pointerClientX) => {
64110
64548
  const el = scrollRef.current;
64111
64549
  const next = Math.min(maxZoom, Math.max(minZoom, zoom * factor));
@@ -64124,7 +64562,7 @@ var Gantt = ({
64124
64562
  },
64125
64563
  [zoom, minZoom, maxZoom, leftWidth, setZoom]
64126
64564
  );
64127
- (0, import_react283.useEffect)(() => {
64565
+ (0, import_react288.useEffect)(() => {
64128
64566
  const el = scrollRef.current;
64129
64567
  if (!el) return;
64130
64568
  const onWheel = (e) => {
@@ -64136,10 +64574,10 @@ var Gantt = ({
64136
64574
  el.addEventListener("wheel", onWheel, { passive: false });
64137
64575
  return () => el.removeEventListener("wheel", onWheel);
64138
64576
  }, [zoomBy]);
64139
- (0, import_react283.useEffect)(() => {
64577
+ (0, import_react288.useEffect)(() => {
64140
64578
  syncHeaderScale();
64141
64579
  }, [syncHeaderScale, timelineWidth, zoom, range.start, leftWidth]);
64142
- const liveRowsRef = (0, import_react283.useRef)(null);
64580
+ const liveRowsRef = (0, import_react288.useRef)(null);
64143
64581
  const dragApi = useGanttDrag({
64144
64582
  scrollRef,
64145
64583
  overlayRef,
@@ -64161,12 +64599,12 @@ var Gantt = ({
64161
64599
  rowOrder,
64162
64600
  setSelected
64163
64601
  });
64164
- const liveReorder = (0, import_react283.useMemo)(() => {
64602
+ const liveReorder = (0, import_react288.useMemo)(() => {
64165
64603
  const d = dragApi.drag;
64166
64604
  if (d?.kind !== "reorder" || d.beforeId === void 0) return null;
64167
64605
  return applyRowReorder(effectiveTasks, d.taskId, d.beforeId, rowOrder);
64168
64606
  }, [dragApi.drag, effectiveTasks, rowOrder]);
64169
- const liveModel = (0, import_react283.useMemo)(
64607
+ const liveModel = (0, import_react288.useMemo)(
64170
64608
  () => liveReorder ? buildRows(
64171
64609
  liveReorder.tasks,
64172
64610
  effectiveLanes,
@@ -64176,7 +64614,7 @@ var Gantt = ({
64176
64614
  [liveReorder, effectiveLanes, rowHeight2, committedModel]
64177
64615
  );
64178
64616
  liveRowsRef.current = liveModel.rows;
64179
- const bars = (0, import_react283.useMemo)(() => {
64617
+ const bars = (0, import_react288.useMemo)(() => {
64180
64618
  const map = /* @__PURE__ */ new Map();
64181
64619
  for (const row of liveModel.rows) {
64182
64620
  if (!row.task) continue;
@@ -64198,7 +64636,7 @@ var Gantt = ({
64198
64636
  return map;
64199
64637
  }, [liveModel.rows, range, zoom]);
64200
64638
  const bodyHeight = liveModel.rows.length > 0 ? liveModel.rows[liveModel.rows.length - 1].top + liveModel.rows[liveModel.rows.length - 1].height : 0;
64201
- const onBarKeyDown = (0, import_react283.useCallback)(
64639
+ const onBarKeyDown = (0, import_react288.useCallback)(
64202
64640
  (e, task) => {
64203
64641
  if (!interactive || task.locked || !onTasksChange) return;
64204
64642
  const stepMs = snap2 === "hour" ? 36e5 : snap2 === "week" ? 7 * MS_PER_DAY : MS_PER_DAY;
@@ -64243,7 +64681,7 @@ var Gantt = ({
64243
64681
  },
64244
64682
  [interactive, snap2, tasks, onTasksChange, setSelected]
64245
64683
  );
64246
- const deleteSelectedLink = (0, import_react283.useCallback)(() => {
64684
+ const deleteSelectedLink = (0, import_react288.useCallback)(() => {
64247
64685
  const sel = dragApi.linkSelected;
64248
64686
  if (!sel || !interactive || !onLinksChange) return;
64249
64687
  const key = (l) => l.id ?? `${l.source}~${l.target}~${l.type ?? "fs"}`;
@@ -64251,7 +64689,7 @@ var Gantt = ({
64251
64689
  onLinksChange(links.filter((l) => key(l) !== selKey));
64252
64690
  dragApi.setLinkSelected(null);
64253
64691
  }, [dragApi, links, interactive, onLinksChange]);
64254
- const moveSelection = (0, import_react283.useCallback)(
64692
+ const moveSelection = (0, import_react288.useCallback)(
64255
64693
  (where) => {
64256
64694
  const rows = liveModel.rows;
64257
64695
  if (!rows.length) return;
@@ -64264,7 +64702,7 @@ var Gantt = ({
64264
64702
  },
64265
64703
  [liveModel.rows, selectedId, setSelected]
64266
64704
  );
64267
- const onRootKeyDown = (0, import_react283.useCallback)(
64705
+ const onRootKeyDown = (0, import_react288.useCallback)(
64268
64706
  (e) => {
64269
64707
  if (dragApi.linkSelected) {
64270
64708
  if (e.key === "Escape") {
@@ -64310,14 +64748,14 @@ var Gantt = ({
64310
64748
  },
64311
64749
  [dragApi, deleteSelectedLink, moveSelection, setZoom, zoom]
64312
64750
  );
64313
- const handleSelectLink = (0, import_react283.useCallback)(
64751
+ const handleSelectLink = (0, import_react288.useCallback)(
64314
64752
  (link) => {
64315
64753
  dragApi.setLinkSelected(link);
64316
64754
  if (link) rootRef.current?.focus();
64317
64755
  },
64318
64756
  [dragApi]
64319
64757
  );
64320
- const handleRootPointerDown = (0, import_react283.useCallback)(
64758
+ const handleRootPointerDown = (0, import_react288.useCallback)(
64321
64759
  (e) => {
64322
64760
  if (e.target.closest?.("[data-gantt-keep-link-selection]")) return;
64323
64761
  if (dragApi.linkSelected) dragApi.setLinkSelected(null);
@@ -64332,22 +64770,22 @@ var Gantt = ({
64332
64770
  const drag = dragApi.drag;
64333
64771
  const dragTask = drag?.taskId ? committedModel.tasksById.get(drag.taskId) : void 0;
64334
64772
  const reorderLineY = drag?.kind === "reorder" && drag.beforeId !== void 0 ? reorderPreviewTop(liveModel.rows, `task:${drag.taskId}`, drag.beforeId) : null;
64335
- const dragSubtree = (0, import_react283.useMemo)(() => {
64773
+ const dragSubtree = (0, import_react288.useMemo)(() => {
64336
64774
  if (dragApi.drag?.kind !== "reorder") return null;
64337
64775
  return reorderDragSubtree(
64338
64776
  liveModel.rows,
64339
64777
  `task:${dragApi.drag.taskId}`
64340
64778
  );
64341
64779
  }, [dragApi.drag, liveModel.rows]);
64342
- const dragSubtreeKeys = (0, import_react283.useMemo)(
64780
+ const dragSubtreeKeys = (0, import_react288.useMemo)(
64343
64781
  () => new Set((dragSubtree ?? []).map((r) => r.key)),
64344
64782
  [dragSubtree]
64345
64783
  );
64346
- const dragSubtreeHeight = (0, import_react283.useMemo)(
64784
+ const dragSubtreeHeight = (0, import_react288.useMemo)(
64347
64785
  () => (dragSubtree ?? []).reduce((sum, r) => sum + r.height, 0),
64348
64786
  [dragSubtree]
64349
64787
  );
64350
- const liveDragDates = (0, import_react283.useMemo)(() => {
64788
+ const liveDragDates = (0, import_react288.useMemo)(() => {
64351
64789
  if (!drag || !dragTask) return null;
64352
64790
  if (drag.kind !== "move" && drag.kind !== "resize-start" && drag.kind !== "resize-end") return null;
64353
64791
  return applyDragDates(
@@ -64358,7 +64796,7 @@ var Gantt = ({
64358
64796
  );
64359
64797
  }, [drag, dragTask, zoom, snap2]);
64360
64798
  const liveDragProgress = drag?.kind === "progress" && drag.liveProgress != null ? drag.liveProgress : null;
64361
- const dragOverride = (0, import_react283.useMemo)(() => {
64799
+ const dragOverride = (0, import_react288.useMemo)(() => {
64362
64800
  if (!drag || !dragTask) return null;
64363
64801
  if (drag.kind === "progress" && drag.liveProgress != null) {
64364
64802
  return { ...dragTask, progress: drag.liveProgress };
@@ -64368,11 +64806,11 @@ var Gantt = ({
64368
64806
  }
64369
64807
  return null;
64370
64808
  }, [drag, dragTask, liveDragDates]);
64371
- const liveLaneProgress = (0, import_react283.useMemo)(
64809
+ const liveLaneProgress = (0, import_react288.useMemo)(
64372
64810
  () => dragOverride && dragTask ? laneRollupProgress(effectiveTasks, dragTask.id, dragOverride) : null,
64373
64811
  [dragOverride, dragTask, effectiveTasks]
64374
64812
  );
64375
- const liveGroupProgress = (0, import_react283.useMemo)(() => {
64813
+ const liveGroupProgress = (0, import_react288.useMemo)(() => {
64376
64814
  if (!dragOverride || !dragTask) return null;
64377
64815
  const byId = new Map(effectiveTasks.map((t2) => [t2.id, t2]));
64378
64816
  const m = /* @__PURE__ */ new Map();
@@ -64384,7 +64822,7 @@ var Gantt = ({
64384
64822
  }
64385
64823
  return m.size > 0 ? m : null;
64386
64824
  }, [dragOverride, dragTask, effectiveTasks]);
64387
- const liveLinkBars = (0, import_react283.useMemo)(() => {
64825
+ const liveLinkBars = (0, import_react288.useMemo)(() => {
64388
64826
  if (!liveDragDates || !dragTask) return bars;
64389
64827
  const g = bars.get(dragTask.id);
64390
64828
  if (!g) return bars;
@@ -64393,12 +64831,12 @@ var Gantt = ({
64393
64831
  if (left === g.left && width === g.width) return bars;
64394
64832
  return new Map(bars).set(dragTask.id, { ...g, left, width });
64395
64833
  }, [bars, liveDragDates, dragTask, range, zoom]);
64396
- const linkPaths = (0, import_react283.useMemo)(
64834
+ const linkPaths = (0, import_react288.useMemo)(
64397
64835
  () => computeLinkPaths(links, liveLinkBars, color),
64398
64836
  [links, liveLinkBars, color]
64399
64837
  );
64400
- const linkFan = (0, import_react283.useMemo)(() => computeLinkFanOffsets(links, bars), [links, bars]);
64401
- return /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64838
+ const linkFan = (0, import_react288.useMemo)(() => computeLinkFanOffsets(links, bars), [links, bars]);
64839
+ return /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64402
64840
  Panel_default,
64403
64841
  {
64404
64842
  ref: rootRef,
@@ -64416,31 +64854,31 @@ var Gantt = ({
64416
64854
  "aria-label": t("kit.gantt.root"),
64417
64855
  onKeyDown: onRootKeyDown,
64418
64856
  onPointerDown: handleRootPointerDown,
64419
- children: /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("div", { className: "flex h-full min-h-0 flex-col", children: [
64420
- /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)(
64857
+ children: /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)("div", { className: "flex h-full min-h-0 flex-col", children: [
64858
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(
64421
64859
  "div",
64422
64860
  {
64423
- className: (0, import_classnames117.default)(
64861
+ className: (0, import_classnames123.default)(
64424
64862
  "flex shrink-0 items-center gap-3 border-b px-4 py-3",
64425
64863
  surfaceText.divider
64426
64864
  ),
64427
64865
  children: [
64428
- hasNode(icon) && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64866
+ hasNode(icon) && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64429
64867
  "div",
64430
64868
  {
64431
- className: (0, import_classnames117.default)(
64869
+ className: (0, import_classnames123.default)(
64432
64870
  "flex h-10 w-10 shrink-0 items-center justify-center rounded-xl",
64433
64871
  getSurfaceVariantClasses(variant, "neutral")
64434
64872
  ),
64435
64873
  children: icon
64436
64874
  }
64437
64875
  ),
64438
- (title != null || subtitle != null) && /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("div", { className: "min-w-0 flex-1", children: [
64439
- subtitle != null && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { className: "truncate text-[11px] font-semibold uppercase tracking-wider text-neutral-500 dark:text-neutral-400", children: subtitle }),
64440
- title != null && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { className: "truncate text-lg font-semibold text-neutral-900 dark:text-white", children: title })
64876
+ (title != null || subtitle != null) && /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)("div", { className: "min-w-0 flex-1", children: [
64877
+ subtitle != null && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "truncate text-[11px] font-semibold uppercase tracking-wider text-neutral-500 dark:text-neutral-400", children: subtitle }),
64878
+ title != null && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "truncate text-lg font-semibold text-neutral-900 dark:text-white", children: title })
64441
64879
  ] }),
64442
- hasNode(actions) && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { className: "flex shrink-0 items-center gap-2", children: actions }),
64443
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { className: "ml-auto shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64880
+ hasNode(actions) && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "flex shrink-0 items-center gap-2", children: actions }),
64881
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "ml-auto shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64444
64882
  GanttToolbar,
64445
64883
  {
64446
64884
  variant,
@@ -64453,31 +64891,31 @@ var Gantt = ({
64453
64891
  ]
64454
64892
  }
64455
64893
  ),
64456
- /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)(
64894
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(
64457
64895
  "div",
64458
64896
  {
64459
- className: (0, import_classnames117.default)(
64897
+ className: (0, import_classnames123.default)(
64460
64898
  "relative flex shrink-0 items-stretch border-b",
64461
64899
  surfaceText.divider
64462
64900
  ),
64463
64901
  style: { height: HEADER_HEIGHT },
64464
64902
  children: [
64465
- /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)(
64903
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(
64466
64904
  "div",
64467
64905
  {
64468
- className: (0, import_classnames117.default)(
64906
+ className: (0, import_classnames123.default)(
64469
64907
  "flex items-stretch border-r bg-white dark:bg-neutral-900",
64470
64908
  surfaceText.divider
64471
64909
  ),
64472
64910
  style: { width: leftWidth },
64473
64911
  children: [
64474
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { className: "w-9 shrink-0" }),
64912
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "w-9 shrink-0" }),
64475
64913
  sizedColumns.map((col) => {
64476
64914
  const resizable = resizableColumns && col.resizable !== false;
64477
- return /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)(
64915
+ return /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(
64478
64916
  "div",
64479
64917
  {
64480
- className: (0, import_classnames117.default)(
64918
+ className: (0, import_classnames123.default)(
64481
64919
  "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",
64482
64920
  surfaceText.divider
64483
64921
  ),
@@ -64486,7 +64924,7 @@ var Gantt = ({
64486
64924
  justifyContent: col.align === "center" ? "center" : col.align === "right" ? "flex-end" : "flex-start"
64487
64925
  },
64488
64926
  children: [
64489
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("span", { className: "truncate", children: col.title }),
64927
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("span", { className: "truncate", children: col.title }),
64490
64928
  resizable && /* Resize handle — Table's header-edge pattern: an 8px hit
64491
64929
  area whose 1px line sits exactly on the column border.
64492
64930
  Absolute insets stop at the padding edge (1px inside
@@ -64495,7 +64933,7 @@ var Gantt = ({
64495
64933
  the border's own pixel. The cell carries no
64496
64934
  overflow-hidden so the line can paint over the border
64497
64935
  (the title span truncates itself). */
64498
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64936
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64499
64937
  "div",
64500
64938
  {
64501
64939
  role: "separator",
@@ -64504,7 +64942,7 @@ var Gantt = ({
64504
64942
  className: "group/rh absolute inset-y-0 -right-px z-10 flex w-2 cursor-col-resize select-none items-stretch justify-end",
64505
64943
  onPointerDown: (e) => startColumnResize(e, col.key),
64506
64944
  title: t("kit.gantt.resizeColumn", { column: col.title }),
64507
- children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64945
+ children: /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64508
64946
  "div",
64509
64947
  {
64510
64948
  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",
@@ -64521,30 +64959,30 @@ var Gantt = ({
64521
64959
  ]
64522
64960
  }
64523
64961
  ),
64524
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { className: "relative min-w-0 flex-1 overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)(
64962
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "relative min-w-0 flex-1 overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(
64525
64963
  "div",
64526
64964
  {
64527
64965
  ref: headerScaleRef,
64528
64966
  className: "relative h-full",
64529
64967
  style: { width: timelineWidth },
64530
64968
  children: [
64531
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(GanttScale, { levels: scaleLevels, height: HEADER_HEIGHT }),
64532
- todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64969
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(GanttScale, { levels: scaleLevels, height: HEADER_HEIGHT }),
64970
+ todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64533
64971
  "div",
64534
64972
  {
64535
- className: (0, import_classnames117.default)(
64973
+ className: (0, import_classnames123.default)(
64536
64974
  "pointer-events-none absolute inset-y-0 z-[1] border-l-2",
64537
64975
  todayTokens.line
64538
64976
  ),
64539
64977
  style: { left: todayX }
64540
64978
  }
64541
64979
  ),
64542
- todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64980
+ todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64543
64981
  "div",
64544
64982
  {
64545
64983
  className: "pointer-events-none absolute top-1 z-10 -translate-x-1/2",
64546
64984
  style: { left: todayX },
64547
- children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("span", { className: (0, import_classnames117.default)("rounded-full px-2 py-0.5 text-[10px] font-semibold text-white shadow-sm", todayTokens.chip), children: allLabels.today })
64985
+ children: /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("span", { className: (0, import_classnames123.default)("rounded-full px-2 py-0.5 text-[10px] font-semibold text-white shadow-sm", todayTokens.chip), children: allLabels.today })
64548
64986
  }
64549
64987
  )
64550
64988
  ]
@@ -64553,20 +64991,20 @@ var Gantt = ({
64553
64991
  ]
64554
64992
  }
64555
64993
  ),
64556
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64994
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64557
64995
  "div",
64558
64996
  {
64559
64997
  ref: scrollRef,
64560
64998
  className: `gantt-scroller min-h-0 flex-1 overflow-auto overscroll-contain [&::-webkit-scrollbar]:h-1.5 ${THIN_SCROLLBAR}`,
64561
64999
  onScroll: syncHeaderScale,
64562
- children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { style: { width: leftWidth + timelineWidth + LINK_RIGHT_GUTTER, minWidth: "100%" }, children: loading ? /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(GanttSkeleton, { rows: 12, rowHeight: rowHeight2, leftWidth }) : isEmpty2 ? /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { className: "flex items-center justify-center text-sm text-neutral-500", style: { height: bodyHeight || 160, width: leftWidth + timelineWidth }, children: emptyState ?? allLabels.empty }) : /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("div", { className: "relative", style: { height: bodyHeight }, children: [
64563
- /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)(
65000
+ children: /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { style: { width: leftWidth + timelineWidth + LINK_RIGHT_GUTTER, minWidth: "100%" }, children: loading ? /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(GanttSkeleton, { rows: 12, rowHeight: rowHeight2, leftWidth }) : isEmpty2 ? /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "flex items-center justify-center text-sm text-neutral-500", style: { height: bodyHeight || 160, width: leftWidth + timelineWidth }, children: emptyState ?? allLabels.empty }) : /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)("div", { className: "relative", style: { height: bodyHeight }, children: [
65001
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(
64564
65002
  "div",
64565
65003
  {
64566
65004
  className: "pointer-events-none absolute inset-y-0 z-0",
64567
65005
  style: { left: leftWidth, width: timelineWidth },
64568
65006
  children: [
64569
- scaleLevels.length > 0 && scaleLevels[scaleLevels.length - 1].columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65007
+ scaleLevels.length > 0 && scaleLevels[scaleLevels.length - 1].columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64570
65008
  "div",
64571
65009
  {
64572
65010
  className: "absolute inset-y-0 border-r border-neutral-100 dark:border-neutral-800",
@@ -64574,10 +65012,10 @@ var Gantt = ({
64574
65012
  },
64575
65013
  c.id
64576
65014
  )),
64577
- todayVisible && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65015
+ todayVisible && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64578
65016
  "div",
64579
65017
  {
64580
- className: (0, import_classnames117.default)("absolute inset-y-0 border-l-2", todayTokens.line),
65018
+ className: (0, import_classnames123.default)("absolute inset-y-0 border-l-2", todayTokens.line),
64581
65019
  style: { left: todayX }
64582
65020
  }
64583
65021
  )
@@ -64587,7 +65025,7 @@ var Gantt = ({
64587
65025
  liveModel.rows.map((row) => {
64588
65026
  const isDragSource = drag?.kind === "reorder" && row.task != null && row.task.id === drag.taskId;
64589
65027
  if (isDragSource) {
64590
- return /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65028
+ return /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64591
65029
  "div",
64592
65030
  {
64593
65031
  "data-row-key": row.key,
@@ -64595,7 +65033,7 @@ var Gantt = ({
64595
65033
  "aria-hidden": "true",
64596
65034
  className: "pointer-events-none flex border-b",
64597
65035
  style: { height: dragSubtreeHeight || row.height },
64598
- children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65036
+ children: /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64599
65037
  "div",
64600
65038
  {
64601
65039
  className: "m-1 flex-1 rounded-md border-2 border-dashed",
@@ -64612,7 +65050,7 @@ var Gantt = ({
64612
65050
  if (drag?.kind === "reorder" && dragSubtreeKeys.has(row.key)) {
64613
65051
  return null;
64614
65052
  }
64615
- return /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65053
+ return /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64616
65054
  GanttBodyRow,
64617
65055
  {
64618
65056
  row,
@@ -64650,7 +65088,7 @@ var Gantt = ({
64650
65088
  row.key
64651
65089
  );
64652
65090
  }),
64653
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65091
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64654
65092
  GanttLinkLayer,
64655
65093
  {
64656
65094
  ref: overlayRef,
@@ -64666,7 +65104,7 @@ var Gantt = ({
64666
65104
  onDeleteLink: interactive && onLinksChange ? deleteSelectedLink : void 0
64667
65105
  }
64668
65106
  ),
64669
- drag?.kind === "reorder" && reorderLineY != null && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65107
+ drag?.kind === "reorder" && reorderLineY != null && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64670
65108
  "div",
64671
65109
  {
64672
65110
  className: "pointer-events-none absolute z-30 h-0.5 rounded-full",
@@ -64686,7 +65124,7 @@ var Gantt = ({
64686
65124
  // there is no filtered/overflowing ancestor and the fixed
64687
65125
  // clone always tracks the viewport pointer.
64688
65126
  (0, import_react_dom15.createPortal)(
64689
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65127
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64690
65128
  "div",
64691
65129
  {
64692
65130
  "data-gantt-drag-clone": "true",
@@ -64697,14 +65135,14 @@ var Gantt = ({
64697
65135
  top: drag.clientY - (drag.grabOffset?.y ?? 0),
64698
65136
  width: leftWidth + timelineWidth + LINK_RIGHT_GUTTER
64699
65137
  },
64700
- children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65138
+ children: /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64701
65139
  "div",
64702
65140
  {
64703
65141
  className: "overflow-hidden rounded-lg bg-white/95 shadow-2xl backdrop-blur-sm dark:bg-neutral-900/95",
64704
65142
  style: {
64705
65143
  boxShadow: `0 8px 32px rgba(0, 0, 0, 0.28), inset 2px 0 0 var(--color-${color}-500)`
64706
65144
  },
64707
- children: dragSubtree.map((row) => /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65145
+ children: dragSubtree.map((row) => /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64708
65146
  GanttBodyRow,
64709
65147
  {
64710
65148
  row,
@@ -64747,7 +65185,7 @@ var Gantt = ({
64747
65185
  ),
64748
65186
  document.body
64749
65187
  ),
64750
- drag && drag.kind !== "reorder" && dragTask && liveDragDates && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65188
+ drag && drag.kind !== "reorder" && dragTask && liveDragDates && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64751
65189
  "div",
64752
65190
  {
64753
65191
  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",
@@ -64778,13 +65216,13 @@ var GanttSkeleton = ({
64778
65216
  rows,
64779
65217
  rowHeight: rowHeight2,
64780
65218
  leftWidth
64781
- }) => /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { className: "animate-pulse", "aria-busy": "true", children: Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("div", { className: "flex", style: { height: rowHeight2 }, children: [
64782
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65219
+ }) => /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "animate-pulse", "aria-busy": "true", children: Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)("div", { className: "flex", style: { height: rowHeight2 }, children: [
65220
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64783
65221
  "div",
64784
65222
  {
64785
65223
  className: "sticky left-0 flex items-center border-b border-neutral-100 bg-white px-3 dark:border-neutral-800 dark:bg-neutral-900",
64786
65224
  style: { width: leftWidth },
64787
- children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65225
+ children: /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64788
65226
  "div",
64789
65227
  {
64790
65228
  className: "h-3 rounded-full bg-neutral-200 dark:bg-neutral-700",
@@ -64793,7 +65231,7 @@ var GanttSkeleton = ({
64793
65231
  )
64794
65232
  }
64795
65233
  ),
64796
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { className: "relative flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65234
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "relative flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64797
65235
  "div",
64798
65236
  {
64799
65237
  className: "absolute top-1/2 h-4 -translate-y-1/2 rounded-md bg-neutral-200/80 dark:bg-neutral-700/60",
@@ -64806,11 +65244,11 @@ var GanttSkeleton = ({
64806
65244
  ] }, i)) });
64807
65245
 
64808
65246
  // src/contexts/BottomSheetContext.tsx
64809
- var import_react284 = require("react");
65247
+ var import_react289 = require("react");
64810
65248
  var import_react_dom16 = require("react-dom");
64811
- var import_classnames118 = __toESM(require("classnames"), 1);
64812
- var import_jsx_runtime308 = require("react/jsx-runtime");
64813
- var BottomSheetContext = (0, import_react284.createContext)(null);
65249
+ var import_classnames124 = __toESM(require("classnames"), 1);
65250
+ var import_jsx_runtime315 = require("react/jsx-runtime");
65251
+ var BottomSheetContext = (0, import_react289.createContext)(null);
64814
65252
  var TRANSITION_MS2 = 260;
64815
65253
  var renderSlot = (slot, controls) => {
64816
65254
  if (!slot) {
@@ -64821,13 +65259,13 @@ var renderSlot = (slot, controls) => {
64821
65259
  var BottomSheetProvider = ({
64822
65260
  children
64823
65261
  }) => {
64824
- const [sheet, setSheet] = (0, import_react284.useState)(null);
64825
- const [isVisible, setIsVisible] = (0, import_react284.useState)(false);
64826
- const pendingCloseRef = (0, import_react284.useRef)(null);
64827
- const dismissSheet = (0, import_react284.useCallback)(() => {
65262
+ const [sheet, setSheet] = (0, import_react289.useState)(null);
65263
+ const [isVisible, setIsVisible] = (0, import_react289.useState)(false);
65264
+ const pendingCloseRef = (0, import_react289.useRef)(null);
65265
+ const dismissSheet = (0, import_react289.useCallback)(() => {
64828
65266
  setIsVisible(false);
64829
65267
  }, []);
64830
- const presentSheet = (0, import_react284.useCallback)((options) => {
65268
+ const presentSheet = (0, import_react289.useCallback)((options) => {
64831
65269
  if (pendingCloseRef.current) {
64832
65270
  clearTimeout(pendingCloseRef.current);
64833
65271
  pendingCloseRef.current = null;
@@ -64840,7 +65278,7 @@ var BottomSheetProvider = ({
64840
65278
  setTimeout(animateIn, 0);
64841
65279
  }
64842
65280
  }, []);
64843
- (0, import_react284.useEffect)(() => {
65281
+ (0, import_react289.useEffect)(() => {
64844
65282
  if (!isVisible && sheet) {
64845
65283
  pendingCloseRef.current = setTimeout(() => {
64846
65284
  sheet.onClose?.();
@@ -64855,7 +65293,7 @@ var BottomSheetProvider = ({
64855
65293
  }
64856
65294
  return void 0;
64857
65295
  }, [isVisible, sheet]);
64858
- (0, import_react284.useEffect)(
65296
+ (0, import_react289.useEffect)(
64859
65297
  () => () => {
64860
65298
  if (pendingCloseRef.current) {
64861
65299
  clearTimeout(pendingCloseRef.current);
@@ -64863,13 +65301,13 @@ var BottomSheetProvider = ({
64863
65301
  },
64864
65302
  []
64865
65303
  );
64866
- const controls = (0, import_react284.useMemo)(
65304
+ const controls = (0, import_react289.useMemo)(
64867
65305
  () => ({
64868
65306
  dismiss: dismissSheet
64869
65307
  }),
64870
65308
  [dismissSheet]
64871
65309
  );
64872
- const contextValue = (0, import_react284.useMemo)(
65310
+ const contextValue = (0, import_react289.useMemo)(
64873
65311
  () => ({
64874
65312
  presentSheet,
64875
65313
  dismissSheet,
@@ -64879,11 +65317,11 @@ var BottomSheetProvider = ({
64879
65317
  [presentSheet, dismissSheet, sheet, isVisible]
64880
65318
  );
64881
65319
  const overlayNode = typeof document !== "undefined" && sheet ? (0, import_react_dom16.createPortal)(
64882
- /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)("div", { className: "pointer-events-none fixed inset-0 z-[70] flex items-end justify-center", children: [
64883
- /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
65320
+ /* @__PURE__ */ (0, import_jsx_runtime315.jsxs)("div", { className: "pointer-events-none fixed inset-0 z-[70] flex items-end justify-center", children: [
65321
+ /* @__PURE__ */ (0, import_jsx_runtime315.jsx)(
64884
65322
  "div",
64885
65323
  {
64886
- className: (0, import_classnames118.default)(
65324
+ className: (0, import_classnames124.default)(
64887
65325
  "absolute inset-0 bg-neutral-900/40 transition-opacity duration-300",
64888
65326
  isVisible ? "opacity-100 pointer-events-auto" : "opacity-0"
64889
65327
  ),
@@ -64893,24 +65331,24 @@ var BottomSheetProvider = ({
64893
65331
  }
64894
65332
  }
64895
65333
  ),
64896
- /* @__PURE__ */ (0, import_jsx_runtime308.jsx)("div", { className: "relative w-full max-w-4xl px-4 pb-4 sm:px-8", children: /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)(
65334
+ /* @__PURE__ */ (0, import_jsx_runtime315.jsx)("div", { className: "relative w-full max-w-4xl px-4 pb-4 sm:px-8", children: /* @__PURE__ */ (0, import_jsx_runtime315.jsxs)(
64897
65335
  "section",
64898
65336
  {
64899
65337
  role: "dialog",
64900
65338
  "aria-modal": "true",
64901
- className: (0, import_classnames118.default)(
65339
+ className: (0, import_classnames124.default)(
64902
65340
  "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",
64903
65341
  sheet.className,
64904
65342
  isVisible ? "translate-y-0" : "translate-y-full"
64905
65343
  ),
64906
65344
  style: { minHeight: "25vh", maxHeight: "85vh" },
64907
65345
  children: [
64908
- /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)("header", { className: "flex items-start justify-between gap-3 border-b border-slate-200 px-6 py-4 dark:border-slate-800", children: [
64909
- /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)("div", { className: "space-y-1", children: [
64910
- sheet.title && /* @__PURE__ */ (0, import_jsx_runtime308.jsx)("div", { className: "text-base font-semibold text-slate-900 dark:text-slate-100", children: sheet.title }),
64911
- sheet.description && /* @__PURE__ */ (0, import_jsx_runtime308.jsx)("p", { className: "text-sm text-slate-500 dark:text-slate-300", children: sheet.description })
65346
+ /* @__PURE__ */ (0, import_jsx_runtime315.jsxs)("header", { className: "flex items-start justify-between gap-3 border-b border-slate-200 px-6 py-4 dark:border-slate-800", children: [
65347
+ /* @__PURE__ */ (0, import_jsx_runtime315.jsxs)("div", { className: "space-y-1", children: [
65348
+ sheet.title && /* @__PURE__ */ (0, import_jsx_runtime315.jsx)("div", { className: "text-base font-semibold text-slate-900 dark:text-slate-100", children: sheet.title }),
65349
+ sheet.description && /* @__PURE__ */ (0, import_jsx_runtime315.jsx)("p", { className: "text-sm text-slate-500 dark:text-slate-300", children: sheet.description })
64912
65350
  ] }),
64913
- (sheet.showCloseButton ?? true) && /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
65351
+ (sheet.showCloseButton ?? true) && /* @__PURE__ */ (0, import_jsx_runtime315.jsx)(
64914
65352
  IconButton_default,
64915
65353
  {
64916
65354
  icon: "Close",
@@ -64922,21 +65360,21 @@ var BottomSheetProvider = ({
64922
65360
  }
64923
65361
  )
64924
65362
  ] }),
64925
- /* @__PURE__ */ (0, import_jsx_runtime308.jsx)("div", { className: "flex-1 overflow-y-auto px-6 py-4", children: renderSlot(sheet.content, controls) ?? /* @__PURE__ */ (0, import_jsx_runtime308.jsx)("p", { className: "text-sm text-slate-500", children: "No content provided." }) }),
64926
- sheet.actions && /* @__PURE__ */ (0, import_jsx_runtime308.jsx)("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) })
65363
+ /* @__PURE__ */ (0, import_jsx_runtime315.jsx)("div", { className: "flex-1 overflow-y-auto px-6 py-4", children: renderSlot(sheet.content, controls) ?? /* @__PURE__ */ (0, import_jsx_runtime315.jsx)("p", { className: "text-sm text-slate-500", children: "No content provided." }) }),
65364
+ sheet.actions && /* @__PURE__ */ (0, import_jsx_runtime315.jsx)("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) })
64927
65365
  ]
64928
65366
  }
64929
65367
  ) })
64930
65368
  ] }),
64931
65369
  document.body
64932
65370
  ) : null;
64933
- return /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)(BottomSheetContext.Provider, { value: contextValue, children: [
65371
+ return /* @__PURE__ */ (0, import_jsx_runtime315.jsxs)(BottomSheetContext.Provider, { value: contextValue, children: [
64934
65372
  children,
64935
65373
  overlayNode
64936
65374
  ] });
64937
65375
  };
64938
65376
  var useBottomSheet = () => {
64939
- const context = (0, import_react284.useContext)(BottomSheetContext);
65377
+ const context = (0, import_react289.useContext)(BottomSheetContext);
64940
65378
  if (!context) {
64941
65379
  throw new Error("useBottomSheet must be used within a BottomSheetProvider");
64942
65380
  }
@@ -65570,8 +66008,8 @@ var SYSTEM_VARIABLES = [
65570
66008
  ];
65571
66009
 
65572
66010
  // src/components/MetricBar.tsx
65573
- var import_classnames119 = __toESM(require("classnames"), 1);
65574
- var import_jsx_runtime309 = require("react/jsx-runtime");
66011
+ var import_classnames125 = __toESM(require("classnames"), 1);
66012
+ var import_jsx_runtime316 = require("react/jsx-runtime");
65575
66013
  var MetricBar = ({
65576
66014
  label,
65577
66015
  value,
@@ -65581,7 +66019,7 @@ var MetricBar = ({
65581
66019
  size = "sm",
65582
66020
  className,
65583
66021
  ...rest
65584
- }) => /* @__PURE__ */ (0, import_jsx_runtime309.jsx)(
66022
+ }) => /* @__PURE__ */ (0, import_jsx_runtime316.jsx)(
65585
66023
  Progress_default,
65586
66024
  {
65587
66025
  ...rest,
@@ -65591,7 +66029,7 @@ var MetricBar = ({
65591
66029
  formatValue: value !== void 0 ? () => String(value) : void 0,
65592
66030
  size,
65593
66031
  color: tone ?? color ?? "blue",
65594
- className: (0, import_classnames119.default)("w-full", className)
66032
+ className: (0, import_classnames125.default)("w-full", className)
65595
66033
  }
65596
66034
  );
65597
66035
  MetricBar.displayName = "MetricBar";
@@ -65671,6 +66109,7 @@ MetricBar.displayName = "MetricBar";
65671
66109
  DEFAULT_LAYOUT_OPTIONS,
65672
66110
  DEFAULT_SERIES_PALETTE,
65673
66111
  DEFAULT_SURFACE_CORNER,
66112
+ DEFAULT_SURFACE_GUTTER,
65674
66113
  DEFAULT_SURFACE_PADDING,
65675
66114
  DEFAULT_SURFACE_TONE,
65676
66115
  DEFAULT_TOAST_GAP_PX,
@@ -65821,6 +66260,7 @@ MetricBar.displayName = "MetricBar";
65821
66260
  STAT_PAGER_PLACEMENTS,
65822
66261
  SURFACE_CORNERS,
65823
66262
  SURFACE_GLASS_RIM,
66263
+ SURFACE_GUTTER_AXES,
65824
66264
  SURFACE_PADDINGS,
65825
66265
  SURFACE_TO_BUTTON_VARIANT,
65826
66266
  SURFACE_VARIANTS,
@@ -65913,6 +66353,10 @@ MetricBar.displayName = "MetricBar";
65913
66353
  WorkflowRailSkeleton,
65914
66354
  WorkflowStatusNode,
65915
66355
  WorkflowTracker,
66356
+ WorkflowTrackerDetails,
66357
+ WorkflowTrackerRail,
66358
+ WorkflowTrackerRollups,
66359
+ WorkflowTrackerStepDetails,
65916
66360
  areaPathFromPoints,
65917
66361
  bandAreaPath,
65918
66362
  buildColumns,
@@ -66050,6 +66494,7 @@ MetricBar.displayName = "MetricBar";
66050
66494
  getStepperTonePalette,
66051
66495
  getSurfaceCornerClass,
66052
66496
  getSurfaceCornerRem,
66497
+ getSurfaceGutterClass,
66053
66498
  getSurfacePaddingClass,
66054
66499
  getSurfacePaddingClasses,
66055
66500
  getSurfaceTextTokens,