@cjlapao/ui-kit 0.2.3 → 0.2.4

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 (96) hide show
  1. package/dist/index.cjs +1205 -829
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.css +37 -0
  4. package/dist/index.d.cts +260 -44
  5. package/dist/index.d.ts +260 -44
  6. package/dist/index.js +1140 -767
  7. package/dist/index.js.map +1 -1
  8. package/package.json +1 -1
  9. package/dist/CapsuleBlueprint--CgRT7dr.d.cts +0 -426
  10. package/dist/CapsuleBlueprint--CgRT7dr.d.ts +0 -426
  11. package/dist/CapsuleBlueprint-12uQWAvU.d.cts +0 -732
  12. package/dist/CapsuleBlueprint-12uQWAvU.d.ts +0 -732
  13. package/dist/CapsuleBlueprint-1FP6avn4.d.cts +0 -1017
  14. package/dist/CapsuleBlueprint-1FP6avn4.d.ts +0 -1017
  15. package/dist/CapsuleBlueprint-6DmJgar9.d.cts +0 -358
  16. package/dist/CapsuleBlueprint-6DmJgar9.d.ts +0 -358
  17. package/dist/CapsuleBlueprint-B7MPc5wu.d.cts +0 -835
  18. package/dist/CapsuleBlueprint-B7MPc5wu.d.ts +0 -835
  19. package/dist/CapsuleBlueprint-BFHAMKUF.d.cts +0 -991
  20. package/dist/CapsuleBlueprint-BFHAMKUF.d.ts +0 -991
  21. package/dist/CapsuleBlueprint-BG23ZWsl.d.cts +0 -460
  22. package/dist/CapsuleBlueprint-BG23ZWsl.d.ts +0 -460
  23. package/dist/CapsuleBlueprint-BGx-KPqS.d.cts +0 -925
  24. package/dist/CapsuleBlueprint-BGx-KPqS.d.ts +0 -925
  25. package/dist/CapsuleBlueprint-BJYVRyFD.d.cts +0 -449
  26. package/dist/CapsuleBlueprint-BJYVRyFD.d.ts +0 -449
  27. package/dist/CapsuleBlueprint-BQq4ywG4.d.cts +0 -835
  28. package/dist/CapsuleBlueprint-BQq4ywG4.d.ts +0 -835
  29. package/dist/CapsuleBlueprint-BTgmUcyF.d.cts +0 -278
  30. package/dist/CapsuleBlueprint-BTgmUcyF.d.ts +0 -278
  31. package/dist/CapsuleBlueprint-BX2YI1yC.d.cts +0 -415
  32. package/dist/CapsuleBlueprint-BX2YI1yC.d.ts +0 -415
  33. package/dist/CapsuleBlueprint-BfPODmvJ.d.cts +0 -822
  34. package/dist/CapsuleBlueprint-BfPODmvJ.d.ts +0 -822
  35. package/dist/CapsuleBlueprint-BfSPPu5k.d.cts +0 -616
  36. package/dist/CapsuleBlueprint-BfSPPu5k.d.ts +0 -616
  37. package/dist/CapsuleBlueprint-BoPkPR2J.d.cts +0 -785
  38. package/dist/CapsuleBlueprint-BoPkPR2J.d.ts +0 -785
  39. package/dist/CapsuleBlueprint-CJeLH0j2.d.cts +0 -228
  40. package/dist/CapsuleBlueprint-CJeLH0j2.d.ts +0 -228
  41. package/dist/CapsuleBlueprint-CJwXDMzM.d.cts +0 -622
  42. package/dist/CapsuleBlueprint-CJwXDMzM.d.ts +0 -622
  43. package/dist/CapsuleBlueprint-CM125BJI.d.cts +0 -811
  44. package/dist/CapsuleBlueprint-CM125BJI.d.ts +0 -811
  45. package/dist/CapsuleBlueprint-CQPeacGV.d.cts +0 -426
  46. package/dist/CapsuleBlueprint-CQPeacGV.d.ts +0 -426
  47. package/dist/CapsuleBlueprint-CQy2O0UN.d.cts +0 -889
  48. package/dist/CapsuleBlueprint-CQy2O0UN.d.ts +0 -889
  49. package/dist/CapsuleBlueprint-CRy04iCR.d.cts +0 -695
  50. package/dist/CapsuleBlueprint-CRy04iCR.d.ts +0 -695
  51. package/dist/CapsuleBlueprint-CixXdjMu.d.cts +0 -925
  52. package/dist/CapsuleBlueprint-CixXdjMu.d.ts +0 -925
  53. package/dist/CapsuleBlueprint-CjCxwO1O.d.cts +0 -786
  54. package/dist/CapsuleBlueprint-CjCxwO1O.d.ts +0 -786
  55. package/dist/CapsuleBlueprint-Cm10IA2w.d.cts +0 -342
  56. package/dist/CapsuleBlueprint-Cm10IA2w.d.ts +0 -342
  57. package/dist/CapsuleBlueprint-CoGsooJJ.d.cts +0 -492
  58. package/dist/CapsuleBlueprint-CoGsooJJ.d.ts +0 -492
  59. package/dist/CapsuleBlueprint-CpHqUsJK.d.cts +0 -786
  60. package/dist/CapsuleBlueprint-CpHqUsJK.d.ts +0 -786
  61. package/dist/CapsuleBlueprint-CrRg8EVW.d.cts +0 -358
  62. package/dist/CapsuleBlueprint-CrRg8EVW.d.ts +0 -358
  63. package/dist/CapsuleBlueprint-DGxsd0aY.d.cts +0 -785
  64. package/dist/CapsuleBlueprint-DGxsd0aY.d.ts +0 -785
  65. package/dist/CapsuleBlueprint-DYnwizSo.d.cts +0 -698
  66. package/dist/CapsuleBlueprint-DYnwizSo.d.ts +0 -698
  67. package/dist/CapsuleBlueprint-DbLSB78P.d.cts +0 -235
  68. package/dist/CapsuleBlueprint-DbLSB78P.d.ts +0 -235
  69. package/dist/CapsuleBlueprint-DfV8XBEZ.d.cts +0 -1001
  70. package/dist/CapsuleBlueprint-DfV8XBEZ.d.ts +0 -1001
  71. package/dist/CapsuleBlueprint-DiG1FUoM.d.cts +0 -757
  72. package/dist/CapsuleBlueprint-DiG1FUoM.d.ts +0 -757
  73. package/dist/CapsuleBlueprint-DvdeHC13.d.cts +0 -289
  74. package/dist/CapsuleBlueprint-DvdeHC13.d.ts +0 -289
  75. package/dist/CapsuleBlueprint-DvinXyHp.d.cts +0 -342
  76. package/dist/CapsuleBlueprint-DvinXyHp.d.ts +0 -342
  77. package/dist/CapsuleBlueprint-DwW8YOJg.d.cts +0 -925
  78. package/dist/CapsuleBlueprint-DwW8YOJg.d.ts +0 -925
  79. package/dist/CapsuleBlueprint-E069msDY.d.cts +0 -310
  80. package/dist/CapsuleBlueprint-E069msDY.d.ts +0 -310
  81. package/dist/CapsuleBlueprint-LECoxlXA.d.cts +0 -497
  82. package/dist/CapsuleBlueprint-LECoxlXA.d.ts +0 -497
  83. package/dist/CapsuleBlueprint-V9pDg6lh.d.cts +0 -247
  84. package/dist/CapsuleBlueprint-V9pDg6lh.d.ts +0 -247
  85. package/dist/CapsuleBlueprint-bOLrWbIc.d.cts +0 -858
  86. package/dist/CapsuleBlueprint-bOLrWbIc.d.ts +0 -858
  87. package/dist/CapsuleBlueprint-if_tP8K8.d.cts +0 -1022
  88. package/dist/CapsuleBlueprint-if_tP8K8.d.ts +0 -1022
  89. package/dist/CapsuleBlueprint-pP0Ima0I.d.cts +0 -768
  90. package/dist/CapsuleBlueprint-pP0Ima0I.d.ts +0 -768
  91. package/dist/CapsuleBlueprint-w82xP6zg.d.cts +0 -222
  92. package/dist/CapsuleBlueprint-w82xP6zg.d.ts +0 -222
  93. package/dist/CapsuleBlueprint-wdlxOX4L.d.cts +0 -472
  94. package/dist/CapsuleBlueprint-wdlxOX4L.d.ts +0 -472
  95. package/dist/CapsuleBlueprint-wxqu6jA3.d.cts +0 -529
  96. package/dist/CapsuleBlueprint-wxqu6jA3.d.ts +0 -529
package/dist/index.cjs CHANGED
@@ -348,6 +348,9 @@ __export(src_exports, {
348
348
  WorkflowRailSkeleton: () => WorkflowRailSkeleton,
349
349
  WorkflowStatusNode: () => WorkflowStatusNode_default,
350
350
  WorkflowTracker: () => WorkflowTracker_default,
351
+ WorkflowTrackerDetails: () => WorkflowTrackerDetails_default,
352
+ WorkflowTrackerRail: () => WorkflowTrackerRail_default,
353
+ WorkflowTrackerStepDetails: () => WorkflowTrackerStepDetails_default,
351
354
  areaPathFromPoints: () => areaPathFromPoints,
352
355
  bandAreaPath: () => bandAreaPath,
353
356
  buildColumns: () => buildColumns,
@@ -22032,27 +22035,38 @@ var PageHeader = ({
22032
22035
  center,
22033
22036
  end,
22034
22037
  children,
22038
+ variant = "default",
22039
+ accentColor = "blue",
22035
22040
  className = "",
22036
22041
  ...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
- );
22042
+ }) => {
22043
+ const surface = variant === "default" ? null : getSidebarSurfaceTokens(variant, accentColor);
22044
+ return /* @__PURE__ */ (0, import_jsx_runtime201.jsxs)(
22045
+ "header",
22046
+ {
22047
+ ...rest,
22048
+ className: (0, import_classnames51.default)(
22049
+ "flex w-full items-center justify-between gap-4 px-5",
22050
+ SIDE_MENU_HEADER_HEIGHT,
22051
+ surface ? (0, import_classnames51.default)(
22052
+ surface.offset,
22053
+ surface.radius,
22054
+ "border",
22055
+ surface.border,
22056
+ surface.shadow,
22057
+ surface.fill
22058
+ ) : (0, import_classnames51.default)("border-b", SIDE_MENU_HEADER_FILL, SIDE_MENU_HEADER_SEAM),
22059
+ className
22060
+ ),
22061
+ children: [
22062
+ /* @__PURE__ */ (0, import_jsx_runtime201.jsx)("div", { className: GROUP_CLASS2, children: start }),
22063
+ /* @__PURE__ */ (0, import_jsx_runtime201.jsx)("div", { className: GROUP_CLASS2, children: center }),
22064
+ /* @__PURE__ */ (0, import_jsx_runtime201.jsx)("div", { className: GROUP_CLASS2, children: end }),
22065
+ children != null && /* @__PURE__ */ (0, import_jsx_runtime201.jsx)("div", { className: GROUP_CLASS2, children })
22066
+ ]
22067
+ }
22068
+ );
22069
+ };
22056
22070
  PageHeader.displayName = "PageHeader";
22057
22071
  var PageHeader_default = PageHeader;
22058
22072
 
@@ -42738,7 +42752,8 @@ var SideMenu = ({
42738
42752
  const hasVisibleLink = visibleItems2.some(
42739
42753
  (item) => item.type !== "group" && item.type !== "divider"
42740
42754
  );
42741
- const heightClass = fullHeight ? "h-full" : "sticky top-16 h-[calc(100vh-64px)]";
42755
+ const detached = Boolean(surface.offset);
42756
+ 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
42757
  const isLeft = side === "left";
42743
42758
  const isHoverMode = openOnHover && !isMobile;
42744
42759
  const borderClasses = surface.border ? `${surface.border} ${surface.borderSides === "all" ? "border" : isLeft ? "border-r" : "border-l"}` : "";
@@ -42911,48 +42926,56 @@ var SideMenu = ({
42911
42926
  ]
42912
42927
  }
42913
42928
  ),
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
- ] }) }),
42929
+ /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42930
+ ScrollArea_default,
42931
+ {
42932
+ variant: "hover",
42933
+ className: "flex-1 w-full",
42934
+ contentClassName: "px-3 py-1",
42935
+ children: /* @__PURE__ */ (0, import_jsx_runtime257.jsxs)("nav", { "aria-label": title || "Side menu", className: "space-y-1 w-full", children: [
42936
+ visibleItems2.map((item, index) => {
42937
+ if (item.type === "divider") {
42938
+ return /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42939
+ "div",
42940
+ {
42941
+ className: `my-2 border-t ${surface.divider} ${contentCollapsed2 && !isMobileView ? "mx-1" : "mx-0"}`
42942
+ },
42943
+ `divider-${index}-${item.slug}`
42944
+ );
42945
+ }
42946
+ if (item.type === "group") {
42947
+ if (contentCollapsed2 && !isMobileView) return null;
42948
+ return /* @__PURE__ */ (0, import_jsx_runtime257.jsxs)(import_react245.default.Fragment, { children: [
42949
+ item.hasDivider && /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42950
+ "div",
42951
+ {
42952
+ className: `my-2 border-t ${surface.divider} ${contentCollapsed2 && !isMobileView ? "mx-1" : "mx-0"}`
42953
+ }
42954
+ ),
42955
+ /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42956
+ "div",
42957
+ {
42958
+ className: `px-3 py-1 mb-1 text-xs font-semibold uppercase tracking-wider ${surface.muted} ${index === 0 ? "mt-1" : "mt-4"}`,
42959
+ children: item.label
42960
+ }
42961
+ )
42962
+ ] }, `group-${index}-${item.slug}`);
42963
+ }
42964
+ return renderLinkRow(
42965
+ item,
42966
+ 0,
42967
+ `link-${index}-${item.slug}`,
42968
+ contentCollapsed2
42969
+ );
42970
+ }),
42971
+ searchActive && !hasVisibleLink && /* @__PURE__ */ (0, import_jsx_runtime257.jsxs)("p", { className: `px-3 py-6 text-center text-xs ${surface.muted}`, children: [
42972
+ 'No results for "',
42973
+ searchQuery.trim(),
42974
+ '"'
42975
+ ] })
42976
+ ] })
42977
+ }
42978
+ ),
42956
42979
  footerItem && /* @__PURE__ */ (0, import_jsx_runtime257.jsx)("div", { className: "shrink-0 px-3 pb-1", children: /* @__PURE__ */ (0, import_jsx_runtime257.jsx)(
42957
42980
  SideMenuDropdownRow,
42958
42981
  {
@@ -60164,93 +60187,14 @@ var TreeView = ({
60164
60187
  var TreeView_default = TreeView;
60165
60188
 
60166
60189
  // src/components/WorkflowTracker/WorkflowTracker.tsx
60167
- var import_react278 = require("react");
60168
- var import_classnames113 = __toESM(require("classnames"), 1);
60169
-
60170
- // src/components/WorkflowTracker/WorkflowTimeline.tsx
60171
- var import_react277 = __toESM(require("react"), 1);
60172
- var import_classnames110 = __toESM(require("classnames"), 1);
60190
+ var import_react282 = require("react");
60191
+ var import_classnames118 = __toESM(require("classnames"), 1);
60173
60192
 
60174
- // src/components/WorkflowTracker/WorkflowSkeleton.tsx
60175
- var import_classnames107 = __toESM(require("classnames"), 1);
60176
- var import_jsx_runtime296 = require("react/jsx-runtime");
60177
- var Bar3 = ({
60178
- width,
60179
- className
60180
- }) => /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(
60181
- "span",
60182
- {
60183
- className: (0, import_classnames107.default)(
60184
- "block h-2.5 rounded-full bg-neutral-200 dark:bg-neutral-800",
60185
- className
60186
- ),
60187
- style: { width }
60188
- }
60189
- );
60190
- var Dot = () => /* @__PURE__ */ (0, import_jsx_runtime296.jsx)("span", { className: "h-5 w-5 shrink-0 rounded-full bg-neutral-200 dark:bg-neutral-800" });
60191
- var WorkflowHeaderSkeleton = ({ hasIcon = false, iconCorner = DEFAULT_SURFACE_CORNER }) => /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "mb-5 flex animate-pulse flex-wrap items-start justify-between gap-3 motion-reduce:animate-none", children: [
60192
- /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "flex items-center gap-3", children: [
60193
- hasIcon && /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(
60194
- Bar3,
60195
- {
60196
- width: "3rem",
60197
- className: (0, import_classnames107.default)("h-12", getSurfaceCornerClass(iconCorner))
60198
- }
60199
- ),
60200
- /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "space-y-3", children: [
60201
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "11rem", className: "h-2" }),
60202
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "16rem", className: "h-6" })
60203
- ] })
60204
- ] }),
60205
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "9rem", className: "h-6 rounded-full" })
60206
- ] });
60207
- var WorkflowRailSkeleton = ({
60208
- rows = 6
60209
- }) => /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "animate-pulse motion-reduce:animate-none", children: [
60210
- /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "border-b border-neutral-200 px-5 pb-4 pt-5 dark:border-neutral-800", children: [
60211
- /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "flex items-center justify-between", children: [
60212
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "4.5rem" }),
60213
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "2rem" })
60214
- ] }),
60215
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)("span", { className: "mt-3 block h-1 w-full rounded-full bg-neutral-200 dark:bg-neutral-800" }),
60216
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "80%", className: "mt-3" })
60217
- ] }),
60218
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)("div", { className: "space-y-5 px-5 py-5", children: Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "flex items-start gap-3", children: [
60219
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Dot, {}),
60220
- /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "flex-1 space-y-2", children: [
60221
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: index % 2 === 0 ? "62%" : "48%" }),
60222
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "34%", className: "h-2" })
60223
- ] })
60224
- ] }, index)) })
60225
- ] });
60226
- var WorkflowDetailSkeleton = () => /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "animate-pulse motion-reduce:animate-none", children: [
60227
- /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "space-y-4 px-5 pb-6 pt-5 sm:px-6", children: [
60228
- /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "flex items-center justify-between", children: [
60229
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "6rem" }),
60230
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "4rem" })
60231
- ] }),
60232
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "45%", className: "h-5" }),
60233
- /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "space-y-2", children: [
60234
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "92%", className: "h-2" }),
60235
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "70%", className: "h-2" })
60236
- ] }),
60237
- /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "flex gap-10 pt-2", children: [
60238
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "5rem" }),
60239
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "6rem" }),
60240
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "4rem" })
60241
- ] })
60242
- ] }),
60243
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)("div", { className: "border-y border-neutral-200 bg-neutral-50 px-5 py-3 dark:border-neutral-800 dark:bg-white/5 sm:px-6", children: /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "5rem" }) }),
60244
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)("div", { className: "divide-y divide-neutral-200 dark:divide-neutral-800", children: Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)("div", { className: "flex items-center gap-3 px-5 py-4 sm:px-6", children: [
60245
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Dot, {}),
60246
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: index === 1 ? "38%" : "30%" }),
60247
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)("span", { className: "flex-1" }),
60248
- /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Bar3, { width: "3rem" })
60249
- ] }, index)) })
60250
- ] });
60193
+ // src/components/WorkflowTracker/WorkflowSummaryCard.tsx
60194
+ var import_classnames109 = __toESM(require("classnames"), 1);
60251
60195
 
60252
60196
  // src/components/WorkflowTracker/WorkflowStatusNode.tsx
60253
- var import_classnames108 = __toESM(require("classnames"), 1);
60197
+ var import_classnames107 = __toESM(require("classnames"), 1);
60254
60198
 
60255
60199
  // src/components/WorkflowTracker/surfaces.ts
60256
60200
  var isTranslucentVariant = (variant) => getSurfaceTextTokens(variant).translucent;
@@ -60388,13 +60332,13 @@ var getStatusTokens = (status, palette) => {
60388
60332
  };
60389
60333
 
60390
60334
  // src/components/WorkflowTracker/WorkflowStatusNode.tsx
60391
- var import_jsx_runtime297 = require("react/jsx-runtime");
60335
+ var import_jsx_runtime296 = require("react/jsx-runtime");
60392
60336
  var sizeTokens11 = {
60393
60337
  sm: { node: "h-4 w-4", glyph: "h-2.5 w-2.5" },
60394
60338
  md: { node: "h-5 w-5", glyph: "h-3 w-3" },
60395
60339
  lg: { node: "h-9 w-9", glyph: "h-5 w-5" }
60396
60340
  };
60397
- var DashedRing = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime297.jsx)("svg", { viewBox: "0 0 20 20", "aria-hidden": "true", className, children: /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(
60341
+ var DashedRing = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime296.jsx)("svg", { viewBox: "0 0 20 20", "aria-hidden": "true", className, children: /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(
60398
60342
  "circle",
60399
60343
  {
60400
60344
  cx: "10",
@@ -60407,7 +60351,7 @@ var DashedRing = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime297.js
60407
60351
  strokeLinecap: "round"
60408
60352
  }
60409
60353
  ) });
60410
- var AlertGlyph = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime297.jsx)("svg", { viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", className, children: /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(
60354
+ var AlertGlyph = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime296.jsx)("svg", { viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", className, children: /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(
60411
60355
  "path",
60412
60356
  {
60413
60357
  d: "M12 6.5a1 1 0 0 1 1 1v6a1 1 0 1 1-2 0v-6a1 1 0 0 1 1-1Zm0 9.25a1.15 1.15 0 1 1 0 2.3 1.15 1.15 0 0 1 0-2.3Z",
@@ -60422,33 +60366,33 @@ var WorkflowStatusNode = ({
60422
60366
  }) => {
60423
60367
  const tokens = getStatusTokens(status, palette);
60424
60368
  const { node, glyph } = sizeTokens11[size];
60425
- return /* @__PURE__ */ (0, import_jsx_runtime297.jsxs)(
60369
+ return /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)(
60426
60370
  "span",
60427
60371
  {
60428
60372
  "aria-hidden": "true",
60429
- className: (0, import_classnames108.default)("relative inline-flex shrink-0", node, className),
60373
+ className: (0, import_classnames107.default)("relative inline-flex shrink-0", node, className),
60430
60374
  children: [
60431
- tokens.pulse && /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(
60375
+ tokens.pulse && /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(
60432
60376
  "span",
60433
60377
  {
60434
- className: (0, import_classnames108.default)(
60378
+ className: (0, import_classnames107.default)(
60435
60379
  "absolute inset-0 animate-ping rounded-full opacity-60 motion-reduce:hidden",
60436
60380
  `bg-${tokens.tone}-300 dark:bg-${tokens.tone}-500`
60437
60381
  )
60438
60382
  }
60439
60383
  ),
60440
- /* @__PURE__ */ (0, import_jsx_runtime297.jsxs)(
60384
+ /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)(
60441
60385
  "span",
60442
60386
  {
60443
- className: (0, import_classnames108.default)(
60387
+ className: (0, import_classnames107.default)(
60444
60388
  "relative inline-flex h-full w-full items-center justify-center rounded-full",
60445
60389
  tokens.node
60446
60390
  ),
60447
60391
  children: [
60448
- tokens.glyph === "check" && /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(Check, { className: (0, import_classnames108.default)(glyph, tokens.glyphClass) }),
60449
- tokens.glyph === "pause" && /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(Pause, { className: (0, import_classnames108.default)(glyph, tokens.glyphClass) }),
60450
- tokens.glyph === "alert" && /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(AlertGlyph, { className: (0, import_classnames108.default)(glyph, tokens.glyphClass) }),
60451
- tokens.glyph === "dashed" && /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(DashedRing, { className: (0, import_classnames108.default)("h-full w-full", tokens.glyphClass) })
60392
+ tokens.glyph === "check" && /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Check, { className: (0, import_classnames107.default)(glyph, tokens.glyphClass) }),
60393
+ tokens.glyph === "pause" && /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(Pause, { className: (0, import_classnames107.default)(glyph, tokens.glyphClass) }),
60394
+ tokens.glyph === "alert" && /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(AlertGlyph, { className: (0, import_classnames107.default)(glyph, tokens.glyphClass) }),
60395
+ tokens.glyph === "dashed" && /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(DashedRing, { className: (0, import_classnames107.default)("h-full w-full", tokens.glyphClass) })
60452
60396
  ]
60453
60397
  }
60454
60398
  )
@@ -60459,33 +60403,33 @@ var WorkflowStatusNode = ({
60459
60403
  var WorkflowStatusNode_default = WorkflowStatusNode;
60460
60404
 
60461
60405
  // src/components/WorkflowTracker/parts.tsx
60462
- var import_classnames109 = __toESM(require("classnames"), 1);
60463
- var import_jsx_runtime298 = require("react/jsx-runtime");
60406
+ var import_classnames108 = __toESM(require("classnames"), 1);
60407
+ var import_jsx_runtime297 = require("react/jsx-runtime");
60464
60408
  var resolve = (surfaces) => surfaces ?? getSurfaceTokens(false);
60465
- var WorkflowPlaceholder = ({ title, subtitle, palette, surfaces, className }) => /* @__PURE__ */ (0, import_jsx_runtime298.jsxs)(
60409
+ var WorkflowPlaceholder = ({ title, subtitle, palette, surfaces, className }) => /* @__PURE__ */ (0, import_jsx_runtime297.jsxs)(
60466
60410
  "div",
60467
60411
  {
60468
- className: (0, import_classnames109.default)(
60412
+ className: (0, import_classnames108.default)(
60469
60413
  "flex flex-col items-center justify-center gap-3 px-6 py-10 text-center",
60470
60414
  className
60471
60415
  ),
60472
60416
  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)(
60417
+ /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(WorkflowStatusNode_default, { status: "not_started", palette, size: "lg" }),
60418
+ /* @__PURE__ */ (0, import_jsx_runtime297.jsxs)("div", { className: "space-y-1", children: [
60419
+ /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(
60476
60420
  "p",
60477
60421
  {
60478
- className: (0, import_classnames109.default)(
60422
+ className: (0, import_classnames108.default)(
60479
60423
  "text-sm font-semibold",
60480
60424
  resolve(surfaces).mutedText
60481
60425
  ),
60482
60426
  children: title
60483
60427
  }
60484
60428
  ),
60485
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(
60429
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(
60486
60430
  "p",
60487
60431
  {
60488
- className: (0, import_classnames109.default)(
60432
+ className: (0, import_classnames108.default)(
60489
60433
  "max-w-xs text-xs leading-5",
60490
60434
  resolve(surfaces).faintText
60491
60435
  ),
@@ -60496,10 +60440,10 @@ var WorkflowPlaceholder = ({ title, subtitle, palette, surfaces, className }) =>
60496
60440
  ]
60497
60441
  }
60498
60442
  );
60499
- var SectionTitle = ({ children, surfaces, className }) => /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(
60443
+ var SectionTitle = ({ children, surfaces, className }) => /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(
60500
60444
  "span",
60501
60445
  {
60502
- className: (0, import_classnames109.default)(
60446
+ className: (0, import_classnames108.default)(
60503
60447
  "text-[10px] font-semibold uppercase tracking-widest",
60504
60448
  resolve(surfaces).faintText,
60505
60449
  className
@@ -60507,7 +60451,7 @@ var SectionTitle = ({ children, surfaces, className }) => /* @__PURE__ */ (0, im
60507
60451
  children
60508
60452
  }
60509
60453
  );
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 });
60454
+ var SectionMeta = ({ children, surfaces, className }) => /* @__PURE__ */ (0, import_jsx_runtime297.jsx)("span", { className: (0, import_classnames108.default)("text-xs", resolve(surfaces).mutedText, className), children });
60511
60455
  var WorkflowBadge = ({
60512
60456
  children,
60513
60457
  status,
@@ -60515,14 +60459,14 @@ var WorkflowBadge = ({
60515
60459
  tone
60516
60460
  }) => {
60517
60461
  const tokens = getStatusTokens(status, palette);
60518
- return /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(
60462
+ return /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(
60519
60463
  Pill_default,
60520
60464
  {
60521
60465
  size: "xs",
60522
60466
  uppercase: true,
60523
60467
  tone: tone ?? tokens.pillTone,
60524
60468
  variant: "outline",
60525
- className: (0, import_classnames109.default)(
60469
+ className: (0, import_classnames108.default)(
60526
60470
  "shrink-0 font-medium",
60527
60471
  tone ? `bg-${tone}-100 dark:bg-${tone}-900` : tokens.pillFill
60528
60472
  ),
@@ -60530,17 +60474,177 @@ var WorkflowBadge = ({
60530
60474
  }
60531
60475
  );
60532
60476
  };
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 })
60477
+ var MetaField = ({ label, value, surfaces }) => /* @__PURE__ */ (0, import_jsx_runtime297.jsxs)("div", { className: "min-w-0", children: [
60478
+ /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(SectionTitle, { surfaces, children: label }),
60479
+ /* @__PURE__ */ (0, import_jsx_runtime297.jsx)("p", { className: "mt-1 text-sm font-medium text-neutral-800 dark:text-neutral-100", children: value })
60536
60480
  ] });
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 })
60481
+ var Tally = ({ count, label, surfaces }) => /* @__PURE__ */ (0, import_jsx_runtime297.jsxs)("span", { className: "inline-flex items-center gap-1", children: [
60482
+ /* @__PURE__ */ (0, import_jsx_runtime297.jsx)("span", { className: "font-semibold text-neutral-900 dark:text-white", children: count }),
60483
+ /* @__PURE__ */ (0, import_jsx_runtime297.jsx)("span", { className: resolve(surfaces).mutedText, children: label })
60540
60484
  ] });
60541
60485
 
60486
+ // src/components/WorkflowTracker/WorkflowSummaryCard.tsx
60487
+ var import_jsx_runtime298 = require("react/jsx-runtime");
60488
+ var WorkflowSummaryCard = ({
60489
+ title,
60490
+ steps,
60491
+ palette,
60492
+ surfaces
60493
+ }) => /* @__PURE__ */ (0, import_jsx_runtime298.jsxs)("div", { className: "px-5 py-4", children: [
60494
+ /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(SectionTitle, { surfaces, children: title }),
60495
+ /* @__PURE__ */ (0, import_jsx_runtime298.jsx)("ul", { className: "mt-3 space-y-3", children: steps.map((step) => /* @__PURE__ */ (0, import_jsx_runtime298.jsxs)("li", { className: "flex items-start gap-3", children: [
60496
+ /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(
60497
+ WorkflowStatusNode_default,
60498
+ {
60499
+ status: normalizeStatus(step.status),
60500
+ palette,
60501
+ className: "mt-0.5"
60502
+ }
60503
+ ),
60504
+ /* @__PURE__ */ (0, import_jsx_runtime298.jsxs)("div", { className: "min-w-0 flex-1", children: [
60505
+ /* @__PURE__ */ (0, import_jsx_runtime298.jsx)("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: step.label }),
60506
+ step.meta && /* @__PURE__ */ (0, import_jsx_runtime298.jsx)(
60507
+ "p",
60508
+ {
60509
+ className: (0, import_classnames109.default)(
60510
+ "mt-0.5 text-xs leading-5",
60511
+ surfaces.mutedText
60512
+ ),
60513
+ children: step.meta
60514
+ }
60515
+ )
60516
+ ] })
60517
+ ] }, step.id)) })
60518
+ ] });
60519
+ var WorkflowSummaryCard_default = WorkflowSummaryCard;
60520
+
60521
+ // src/components/WorkflowTracker/WorkflowTrackerRail.tsx
60522
+ var import_react279 = require("react");
60523
+ var import_classnames113 = __toESM(require("classnames"), 1);
60524
+
60542
60525
  // src/components/WorkflowTracker/WorkflowTimeline.tsx
60526
+ var import_react277 = __toESM(require("react"), 1);
60527
+ var import_classnames112 = __toESM(require("classnames"), 1);
60528
+
60529
+ // src/components/WorkflowTracker/WorkflowSkeleton.tsx
60530
+ var import_classnames110 = __toESM(require("classnames"), 1);
60543
60531
  var import_jsx_runtime299 = require("react/jsx-runtime");
60532
+ var Bar3 = ({
60533
+ width,
60534
+ className
60535
+ }) => /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60536
+ "span",
60537
+ {
60538
+ className: (0, import_classnames110.default)(
60539
+ "block h-2.5 rounded-full bg-neutral-200 dark:bg-neutral-800",
60540
+ className
60541
+ ),
60542
+ style: { width }
60543
+ }
60544
+ );
60545
+ var Dot = () => /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("span", { className: "h-5 w-5 shrink-0 rounded-full bg-neutral-200 dark:bg-neutral-800" });
60546
+ var WorkflowHeaderSkeleton = ({ hasIcon = false, iconCorner = DEFAULT_SURFACE_CORNER }) => /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "mb-5 flex animate-pulse flex-wrap items-start justify-between gap-3 motion-reduce:animate-none", children: [
60547
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "flex items-center gap-3", children: [
60548
+ hasIcon && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60549
+ Bar3,
60550
+ {
60551
+ width: "3rem",
60552
+ className: (0, import_classnames110.default)("h-12", getSurfaceCornerClass(iconCorner))
60553
+ }
60554
+ ),
60555
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "space-y-3", children: [
60556
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "11rem", className: "h-2" }),
60557
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "16rem", className: "h-6" })
60558
+ ] })
60559
+ ] }),
60560
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "9rem", className: "h-6 rounded-full" })
60561
+ ] });
60562
+ var WorkflowRailSkeleton = ({
60563
+ rows = 6
60564
+ }) => /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "animate-pulse motion-reduce:animate-none", children: [
60565
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "border-b border-neutral-200 px-5 pb-4 pt-5 dark:border-neutral-800", children: [
60566
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "flex items-center justify-between", children: [
60567
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "4.5rem" }),
60568
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "2rem" })
60569
+ ] }),
60570
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("span", { className: "mt-3 block h-1 w-full rounded-full bg-neutral-200 dark:bg-neutral-800" }),
60571
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "80%", className: "mt-3" })
60572
+ ] }),
60573
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("div", { className: "space-y-5 px-5 py-5", children: Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "flex items-start gap-3", children: [
60574
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Dot, {}),
60575
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "flex-1 space-y-2", children: [
60576
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: index % 2 === 0 ? "62%" : "48%" }),
60577
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "34%", className: "h-2" })
60578
+ ] })
60579
+ ] }, index)) })
60580
+ ] });
60581
+ var WorkflowDetailSkeleton = () => /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "animate-pulse motion-reduce:animate-none", children: [
60582
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "space-y-4 px-5 pb-6 pt-5 sm:px-6", children: [
60583
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "flex items-center justify-between", children: [
60584
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "6rem" }),
60585
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "4rem" })
60586
+ ] }),
60587
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "45%", className: "h-5" }),
60588
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "space-y-2", children: [
60589
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "92%", className: "h-2" }),
60590
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "70%", className: "h-2" })
60591
+ ] }),
60592
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "flex gap-10 pt-2", children: [
60593
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "5rem" }),
60594
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "6rem" }),
60595
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "4rem" })
60596
+ ] })
60597
+ ] }),
60598
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("div", { className: "border-y border-neutral-200 bg-neutral-50 px-5 py-3 dark:border-neutral-800 dark:bg-white/5 sm:px-6", children: /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "5rem" }) }),
60599
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("div", { className: "divide-y divide-neutral-200 dark:divide-neutral-800", children: Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)("div", { className: "flex items-center gap-3 px-5 py-4 sm:px-6", children: [
60600
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Dot, {}),
60601
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: index === 1 ? "38%" : "30%" }),
60602
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("span", { className: "flex-1" }),
60603
+ /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(Bar3, { width: "3rem" })
60604
+ ] }, index)) })
60605
+ ] });
60606
+
60607
+ // src/components/WorkflowTracker/WorkflowQuickActions.tsx
60608
+ var import_classnames111 = __toESM(require("classnames"), 1);
60609
+ var import_jsx_runtime300 = require("react/jsx-runtime");
60610
+ var WorkflowQuickActions = ({
60611
+ stepId,
60612
+ actions,
60613
+ palette,
60614
+ groupLabel,
60615
+ onAction,
60616
+ className,
60617
+ style
60618
+ }) => {
60619
+ if (!onAction || actions.length === 0) return null;
60620
+ return /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60621
+ "div",
60622
+ {
60623
+ role: "group",
60624
+ "aria-label": groupLabel,
60625
+ className: (0, import_classnames111.default)("flex flex-wrap gap-1.5", className),
60626
+ style,
60627
+ children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
60628
+ Button_default,
60629
+ {
60630
+ size: "xs",
60631
+ weight: "medium",
60632
+ variant: action.variant ?? "soft",
60633
+ color: action.tone ?? palette.accent,
60634
+ leadingIcon: action.leadingIcon,
60635
+ disabled: action.disabled,
60636
+ onClick: () => onAction(stepId, action.id),
60637
+ children: action.label
60638
+ },
60639
+ action.id
60640
+ ))
60641
+ }
60642
+ );
60643
+ };
60644
+ var WorkflowQuickActions_default = WorkflowQuickActions;
60645
+
60646
+ // src/components/WorkflowTracker/WorkflowTimeline.tsx
60647
+ var import_jsx_runtime301 = require("react/jsx-runtime");
60544
60648
  var CONNECTOR_LEFT = 9;
60545
60649
  var CONNECTOR_TOP = 24;
60546
60650
  var NESTED_INDENT = 32;
@@ -60558,16 +60662,16 @@ var NestedSubSteps = ({
60558
60662
  palette,
60559
60663
  surfaces,
60560
60664
  onSubStepSelect
60561
- }) => /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60665
+ }) => /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60562
60666
  "div",
60563
60667
  {
60564
- className: (0, import_classnames110.default)("mt-3 rounded-lg p-3", surfaces.nestedBox),
60668
+ className: (0, import_classnames112.default)("mt-3 rounded-lg p-3", surfaces.nestedBox),
60565
60669
  style: { marginLeft: NESTED_INDENT },
60566
- children: /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("ul", { className: "space-y-2.5", children: subSteps.map((subStep) => {
60670
+ children: /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("ul", { className: "space-y-2.5", children: subSteps.map((subStep) => {
60567
60671
  const status = normalizeStatus(subStep.status);
60568
60672
  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)(
60673
+ const content = /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)(import_jsx_runtime301.Fragment, { children: [
60674
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60571
60675
  WorkflowStatusNode_default,
60572
60676
  {
60573
60677
  status,
@@ -60575,10 +60679,10 @@ var NestedSubSteps = ({
60575
60679
  size: "sm"
60576
60680
  }
60577
60681
  ),
60578
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60682
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60579
60683
  "span",
60580
60684
  {
60581
- className: (0, import_classnames110.default)(
60685
+ className: (0, import_classnames112.default)(
60582
60686
  "text-sm",
60583
60687
  isActive ? "font-semibold text-neutral-900 dark:text-white" : "text-neutral-600 dark:text-neutral-300"
60584
60688
  ),
@@ -60586,7 +60690,7 @@ var NestedSubSteps = ({
60586
60690
  }
60587
60691
  )
60588
60692
  ] });
60589
- return /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("li", { children: onSubStepSelect ? /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60693
+ return /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("li", { children: onSubStepSelect ? /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60590
60694
  "button",
60591
60695
  {
60592
60696
  type: "button",
@@ -60594,7 +60698,7 @@ var NestedSubSteps = ({
60594
60698
  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
60699
  children: content
60596
60700
  }
60597
- ) : /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("div", { className: "flex items-center gap-2.5", children: content }) }, subStep.id);
60701
+ ) : /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("div", { className: "flex items-center gap-2.5", children: content }) }, subStep.id);
60598
60702
  }) })
60599
60703
  }
60600
60704
  );
@@ -60611,10 +60715,11 @@ var WorkflowTimeline = ({
60611
60715
  loadingRows,
60612
60716
  emptyState,
60613
60717
  onStepSelect,
60614
- onSubStepSelect
60718
+ onSubStepSelect,
60719
+ onStepAction
60615
60720
  }) => {
60616
60721
  if (loading) {
60617
- return /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(WorkflowRailSkeleton, { rows: loadingRows });
60722
+ return /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(WorkflowRailSkeleton, { rows: loadingRows });
60618
60723
  }
60619
60724
  const isEmpty2 = steps.length === 0;
60620
60725
  const tallyEntries = [
@@ -60623,19 +60728,19 @@ var WorkflowTimeline = ({
60623
60728
  { count: tallies.flagged, label: labels.flagged },
60624
60729
  { count: tallies.remaining, label: labels.remaining }
60625
60730
  ].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: [
60731
+ return /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("div", { className: "flex flex-col", children: [
60732
+ !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("div", { className: (0, import_classnames112.default)("border-b px-5 pb-4 pt-5", surfaces.border), children: [
60733
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("div", { className: "flex items-baseline justify-between gap-3", children: [
60734
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(SectionTitle, { surfaces, children: labels.progress }),
60735
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("span", { className: "text-sm font-semibold text-neutral-900 dark:text-white", children: [
60631
60736
  progress,
60632
60737
  "%"
60633
60738
  ] })
60634
60739
  ] }),
60635
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60740
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60636
60741
  Progress_default,
60637
60742
  {
60638
- className: (0, import_classnames110.default)(
60743
+ className: (0, import_classnames112.default)(
60639
60744
  "mt-2",
60640
60745
  surfaces.translucent ? "bg-white/40 dark:bg-white/15" : "bg-neutral-200 dark:bg-neutral-700"
60641
60746
  ),
@@ -60645,8 +60750,8 @@ var WorkflowTimeline = ({
60645
60750
  motion: "none"
60646
60751
  }
60647
60752
  ),
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)(
60753
+ tallyEntries.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime301.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_runtime301.jsxs)(import_react277.default.Fragment, { children: [
60754
+ index > 0 && /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60650
60755
  "span",
60651
60756
  {
60652
60757
  "aria-hidden": "true",
@@ -60654,7 +60759,7 @@ var WorkflowTimeline = ({
60654
60759
  children: "\xB7"
60655
60760
  }
60656
60761
  ),
60657
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60762
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60658
60763
  Tally,
60659
60764
  {
60660
60765
  count: entry.count,
@@ -60664,7 +60769,7 @@ var WorkflowTimeline = ({
60664
60769
  )
60665
60770
  ] }, entry.label)) })
60666
60771
  ] }),
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)(
60772
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("div", { className: (0, import_classnames112.default)(isEmpty2 ? "" : "px-5 py-5"), children: isEmpty2 ? emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60668
60773
  WorkflowPlaceholder,
60669
60774
  {
60670
60775
  title: labels.empty,
@@ -60672,14 +60777,14 @@ var WorkflowTimeline = ({
60672
60777
  palette,
60673
60778
  surfaces
60674
60779
  }
60675
- ) : /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("ol", { className: "m-0 list-none p-0", children: steps.map((step, index) => {
60780
+ ) : /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("ol", { className: "m-0 list-none p-0", children: steps.map((step, index) => {
60676
60781
  const status = normalizeStatus(step.status);
60677
60782
  const tokens = getStatusTokens(status, palette);
60678
60783
  const isActive = step.id === activeStepId;
60679
60784
  const isLast = index === steps.length - 1;
60680
60785
  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)(
60786
+ const rowContent = /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)(import_jsx_runtime301.Fragment, { children: [
60787
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60683
60788
  WorkflowStatusNode_default,
60684
60789
  {
60685
60790
  status,
@@ -60687,19 +60792,19 @@ var WorkflowTimeline = ({
60687
60792
  className: "mt-0.5"
60688
60793
  }
60689
60794
  ),
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)(
60795
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("div", { className: "min-w-0 flex-1", children: [
60796
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("div", { className: "flex flex-wrap items-center gap-2", children: [
60797
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60693
60798
  "span",
60694
60799
  {
60695
- className: (0, import_classnames110.default)(
60800
+ className: (0, import_classnames112.default)(
60696
60801
  "text-sm",
60697
60802
  isActive ? "font-semibold text-neutral-900 dark:text-white" : "font-medium text-neutral-700 dark:text-neutral-200"
60698
60803
  ),
60699
60804
  children: step.label
60700
60805
  }
60701
60806
  ),
60702
- step.badge && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60807
+ step.badge && /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60703
60808
  WorkflowBadge,
60704
60809
  {
60705
60810
  status,
@@ -60709,10 +60814,10 @@ var WorkflowTimeline = ({
60709
60814
  }
60710
60815
  )
60711
60816
  ] }),
60712
- step.meta && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60817
+ step.meta && /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60713
60818
  "p",
60714
60819
  {
60715
- className: (0, import_classnames110.default)(
60820
+ className: (0, import_classnames112.default)(
60716
60821
  "mt-1 text-xs leading-5",
60717
60822
  surfaces.mutedText
60718
60823
  ),
@@ -60721,24 +60826,24 @@ var WorkflowTimeline = ({
60721
60826
  )
60722
60827
  ] })
60723
60828
  ] });
60724
- return /* @__PURE__ */ (0, import_jsx_runtime299.jsxs)(
60829
+ return /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)(
60725
60830
  "li",
60726
60831
  {
60727
- className: (0, import_classnames110.default)("relative", !isLast && "pb-5"),
60832
+ className: (0, import_classnames112.default)("relative", !isLast && "pb-5"),
60728
60833
  "aria-current": isActive ? "step" : void 0,
60729
60834
  children: [
60730
- !isLast && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60835
+ !isLast && /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60731
60836
  "span",
60732
60837
  {
60733
60838
  "aria-hidden": "true",
60734
- className: (0, import_classnames110.default)(
60839
+ className: (0, import_classnames112.default)(
60735
60840
  "absolute bottom-0",
60736
60841
  tokens.connectorDashed ? `border-l-2 border-dashed ${tokens.connector}` : `w-0.5 rounded-full ${tokens.connector}`
60737
60842
  ),
60738
60843
  style: { left: CONNECTOR_LEFT, top: CONNECTOR_TOP }
60739
60844
  }
60740
60845
  ),
60741
- onStepSelect ? /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60846
+ onStepSelect ? /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60742
60847
  "button",
60743
60848
  {
60744
60849
  type: "button",
@@ -60746,8 +60851,19 @@ var WorkflowTimeline = ({
60746
60851
  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
60852
  children: rowContent
60748
60853
  }
60749
- ) : /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("div", { className: "flex items-start gap-3", children: rowContent }),
60750
- nested && /* @__PURE__ */ (0, import_jsx_runtime299.jsx)(
60854
+ ) : /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("div", { className: "flex items-start gap-3", children: rowContent }),
60855
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60856
+ WorkflowQuickActions_default,
60857
+ {
60858
+ stepId: step.id,
60859
+ actions: step.actions ?? [],
60860
+ palette,
60861
+ groupLabel: labels.quickActions,
60862
+ onAction: onStepAction,
60863
+ className: "ml-8 mt-2"
60864
+ }
60865
+ ),
60866
+ nested && /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60751
60867
  NestedSubSteps,
60752
60868
  {
60753
60869
  stepId: step.id,
@@ -60762,8 +60878,8 @@ var WorkflowTimeline = ({
60762
60878
  step.id
60763
60879
  );
60764
60880
  }) }) }),
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)(
60881
+ showLegend && !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("div", { className: (0, import_classnames112.default)("mt-auto border-t px-5 py-4", surfaces.border), children: /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("ul", { className: "flex flex-wrap gap-x-4 gap-y-2", children: LEGEND_ORDER.map((status) => /* @__PURE__ */ (0, import_jsx_runtime301.jsxs)("li", { className: "flex items-center gap-2", children: [
60882
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)(
60767
60883
  WorkflowStatusNode_default,
60768
60884
  {
60769
60885
  status,
@@ -60771,14 +60887,92 @@ var WorkflowTimeline = ({
60771
60887
  size: "sm"
60772
60888
  }
60773
60889
  ),
60774
- /* @__PURE__ */ (0, import_jsx_runtime299.jsx)("span", { className: (0, import_classnames110.default)("text-xs", surfaces.mutedText), children: labels.statuses[status] })
60890
+ /* @__PURE__ */ (0, import_jsx_runtime301.jsx)("span", { className: (0, import_classnames112.default)("text-xs", surfaces.mutedText), children: labels.statuses[status] })
60775
60891
  ] }, status)) }) })
60776
60892
  ] });
60777
60893
  };
60778
60894
  var WorkflowTimeline_default = WorkflowTimeline;
60779
60895
 
60780
- // src/components/WorkflowTracker/WorkflowDetailPanel.tsx
60781
- var import_classnames111 = __toESM(require("classnames"), 1);
60896
+ // src/components/WorkflowTracker/chrome.ts
60897
+ var import_react278 = require("react");
60898
+ var DEFAULT_LABELS = {
60899
+ progress: "Progress",
60900
+ done: "done",
60901
+ skipped: "skipped",
60902
+ flagged: "flagged",
60903
+ remaining: "remaining",
60904
+ step: "Step",
60905
+ of: "of",
60906
+ elapsed: "Elapsed",
60907
+ owner: "Owner",
60908
+ started: "Started",
60909
+ sla: "SLA",
60910
+ subSteps: "Sub-steps",
60911
+ accepted: "accepted",
60912
+ open: "open",
60913
+ needsAttention: "Needs attention",
60914
+ skippedSteps: "Skipped steps",
60915
+ live: "LIVE \xB7 read-only view",
60916
+ empty: "No steps yet",
60917
+ emptySubtitle: "Steps appear here as soon as the workflow starts.",
60918
+ noActiveStep: "No step selected",
60919
+ details: "Step details",
60920
+ quickActions: "Quick actions",
60921
+ statuses: {
60922
+ done: "Done",
60923
+ in_progress: "In progress",
60924
+ running: "Running",
60925
+ skipped: "Skipped",
60926
+ blocked: "Blocked",
60927
+ attention: "Attention",
60928
+ not_started: "Not started"
60929
+ }
60930
+ };
60931
+ var useWorkflowChrome = ({
60932
+ accentColor = "blue",
60933
+ attentionColor = "rose",
60934
+ blockedColor = "amber",
60935
+ mutedColor = "neutral",
60936
+ variant = "outlined",
60937
+ translucentSurfaces
60938
+ }) => {
60939
+ const translucent = translucentSurfaces ?? isTranslucentVariant(variant);
60940
+ const palette = (0, import_react278.useMemo)(
60941
+ () => ({
60942
+ accent: accentColor,
60943
+ attention: attentionColor,
60944
+ blocked: blockedColor,
60945
+ muted: mutedColor,
60946
+ translucent
60947
+ }),
60948
+ [accentColor, attentionColor, blockedColor, mutedColor, translucent]
60949
+ );
60950
+ const surfaces = (0, import_react278.useMemo)(() => getSurfaceTokens(translucent), [translucent]);
60951
+ return { translucent, palette, surfaces };
60952
+ };
60953
+ var resolveLabels = (labelOverrides) => labelOverrides ? {
60954
+ ...DEFAULT_LABELS,
60955
+ ...labelOverrides,
60956
+ statuses: { ...DEFAULT_LABELS.statuses, ...labelOverrides.statuses }
60957
+ } : DEFAULT_LABELS;
60958
+ var buildCardProps = ({
60959
+ variant = "outlined",
60960
+ cardTone = "neutral",
60961
+ corner = DEFAULT_SURFACE_CORNER,
60962
+ glassOpacity = "light",
60963
+ vibrancy,
60964
+ specularMode,
60965
+ padding = "none"
60966
+ }) => ({
60967
+ variant,
60968
+ tone: cardTone,
60969
+ corner,
60970
+ glassOpacity,
60971
+ vibrancy,
60972
+ specularMode,
60973
+ padding,
60974
+ scrollable: false
60975
+ });
60782
60976
 
60783
60977
  // src/components/WorkflowTracker/derive.ts
60784
60978
  var computeProgress = (steps) => {
@@ -60853,8 +61047,262 @@ var resolveActiveStep = (steps, activeStepId) => {
60853
61047
  return { step: steps[0], index: 1 };
60854
61048
  };
60855
61049
 
61050
+ // src/components/WorkflowTracker/sampleWorkflow.tsx
61051
+ var import_jsx_runtime302 = require("react/jsx-runtime");
61052
+ var sampleWorkflow = {
61053
+ eyebrow: "VENDOR ONBOARDING \xB7 REQ-4128",
61054
+ title: "Northwind Logistics GmbH",
61055
+ live: true,
61056
+ activeStepId: "security_questionnaire",
61057
+ steps: [
61058
+ {
61059
+ id: "request_submitted",
61060
+ label: "Request submitted",
61061
+ status: "done",
61062
+ meta: "2m"
61063
+ },
61064
+ {
61065
+ id: "duplicate_check",
61066
+ label: "Duplicate check",
61067
+ status: "skipped",
61068
+ badge: "Not needed",
61069
+ meta: "No match in registry"
61070
+ },
61071
+ {
61072
+ id: "business_verification",
61073
+ label: "Business verification",
61074
+ status: "done",
61075
+ meta: "12m \xB7 3 of 3 sub-steps"
61076
+ },
61077
+ {
61078
+ id: "sanctions_screening",
61079
+ label: "Sanctions screening",
61080
+ status: "done",
61081
+ meta: "4m"
61082
+ },
61083
+ {
61084
+ id: "tax_documents",
61085
+ label: "Tax documents",
61086
+ status: "skipped",
61087
+ badge: "Skipped",
61088
+ meta: "Skipped by M. Reyes \xB7 resume anytime"
61089
+ },
61090
+ {
61091
+ id: "insurance_certificates",
61092
+ label: "Insurance certificates",
61093
+ status: "attention",
61094
+ badge: "Needs attention",
61095
+ meta: "1h 06m \xB7 Liability certificate expired 12 Aug",
61096
+ details: /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("div", { className: "space-y-3 px-5 py-4 sm:px-6", children: [
61097
+ /* @__PURE__ */ (0, import_jsx_runtime302.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." }),
61098
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsx)("ul", { className: "flex flex-wrap gap-2", children: ["reminder-12-aug.pdf", "underwriter-quote.pdf"].map((file) => /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61099
+ "li",
61100
+ {
61101
+ 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",
61102
+ children: file
61103
+ },
61104
+ file
61105
+ )) })
61106
+ ] }),
61107
+ actions: [
61108
+ { id: "review", label: "Review" },
61109
+ { id: "remind", label: "Remind vendor", tone: "amber" }
61110
+ ]
61111
+ },
61112
+ {
61113
+ id: "contract_drafting",
61114
+ label: "Contract drafting",
61115
+ status: "done",
61116
+ meta: "1h 10m"
61117
+ },
61118
+ {
61119
+ id: "security_questionnaire",
61120
+ label: "Security questionnaire",
61121
+ status: "in_progress",
61122
+ badge: "In progress",
61123
+ meta: "24m \xB7 3 of 6 sub-steps",
61124
+ elapsed: "24m",
61125
+ description: "Vendor is completing the long-form questionnaire. Each sub-step unlocks once its evidence file is accepted by the reviewer.",
61126
+ owner: "D. Okafor",
61127
+ startedAt: "19 Aug \xB7 09:12",
61128
+ sla: "Due in 6h",
61129
+ details: /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("div", { className: "space-y-5 px-5 py-4 sm:px-6", children: [
61130
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("div", { children: [
61131
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsx)("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Review activity" }),
61132
+ /* @__PURE__ */ (0, import_jsx_runtime302.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." })
61133
+ ] }),
61134
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("div", { children: [
61135
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsx)("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Files received" }),
61136
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsx)("ul", { className: "mt-2 flex flex-wrap gap-2", children: [
61137
+ "data-handling-v3.pdf",
61138
+ "pentest-2026.pdf",
61139
+ "soc2-typeii.pdf"
61140
+ ].map((file) => /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61141
+ "li",
61142
+ {
61143
+ 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",
61144
+ children: file
61145
+ },
61146
+ file
61147
+ )) })
61148
+ ] }),
61149
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("div", { children: [
61150
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsx)("p", { className: "text-[11px] font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500", children: "Open findings" }),
61151
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("ul", { className: "mt-2 space-y-2", children: [
61152
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("li", { className: "flex items-start gap-2 text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: [
61153
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61154
+ "span",
61155
+ {
61156
+ "aria-hidden": "true",
61157
+ className: "mt-[9px] size-1.5 shrink-0 rounded-full bg-amber-400"
61158
+ }
61159
+ ),
61160
+ "Subprocessor \u201CCloudDot BV\u201D is not covered by the DPA yet"
61161
+ ] }),
61162
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("li", { className: "flex items-start gap-2 text-sm leading-6 text-neutral-600 dark:text-neutral-300", children: [
61163
+ /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61164
+ "span",
61165
+ {
61166
+ "aria-hidden": "true",
61167
+ className: "mt-[9px] size-1.5 shrink-0 rounded-full bg-neutral-300 dark:bg-neutral-600"
61168
+ }
61169
+ ),
61170
+ "Waiting on the incident-contact annex"
61171
+ ] })
61172
+ ] })
61173
+ ] })
61174
+ ] }),
61175
+ subSteps: [
61176
+ {
61177
+ id: "data_handling",
61178
+ label: "Data handling policy",
61179
+ status: "done",
61180
+ badge: "Accepted",
61181
+ duration: "5m"
61182
+ },
61183
+ {
61184
+ id: "pentest",
61185
+ label: "Penetration test report",
61186
+ status: "done",
61187
+ badge: "Accepted",
61188
+ duration: "8m"
61189
+ },
61190
+ {
61191
+ id: "soc2",
61192
+ label: "SOC 2 Type II evidence",
61193
+ status: "done",
61194
+ badge: "Accepted",
61195
+ duration: "11m"
61196
+ },
61197
+ {
61198
+ id: "subprocessor_list",
61199
+ label: "Subprocessor list",
61200
+ status: "running",
61201
+ badge: "Running",
61202
+ note: "Vendor uploading \u2014 2 of 3 files received"
61203
+ },
61204
+ {
61205
+ id: "incident_response",
61206
+ label: "Incident response plan",
61207
+ status: "skipped",
61208
+ badge: "Skipped",
61209
+ note: "Covered by master agreement \xA77"
61210
+ },
61211
+ {
61212
+ id: "business_continuity",
61213
+ label: "Business continuity plan",
61214
+ status: "not_started"
61215
+ }
61216
+ ]
61217
+ },
61218
+ {
61219
+ id: "legal_review",
61220
+ label: "Legal review",
61221
+ status: "blocked",
61222
+ badge: "Blocked",
61223
+ meta: "Waiting on Legal \xB7 queued 2d",
61224
+ actions: [{ id: "nudge", label: "Nudge Legal", tone: "violet" }]
61225
+ },
61226
+ {
61227
+ id: "banking_details",
61228
+ label: "Banking details",
61229
+ status: "not_started"
61230
+ },
61231
+ {
61232
+ id: "system_provisioning",
61233
+ label: "System provisioning",
61234
+ status: "not_started"
61235
+ },
61236
+ { id: "go_live", label: "Go-live", status: "not_started" }
61237
+ ]
61238
+ };
61239
+
61240
+ // src/components/WorkflowTracker/WorkflowTrackerRail.tsx
61241
+ var import_jsx_runtime303 = require("react/jsx-runtime");
61242
+ var WorkflowTrackerRail = ({
61243
+ data = sampleWorkflow,
61244
+ loading = false,
61245
+ loadingRows = 6,
61246
+ showLegend = true,
61247
+ emptyState,
61248
+ labels: labelOverrides,
61249
+ cardClassName,
61250
+ cardScrollable,
61251
+ onStepSelect,
61252
+ onSubStepSelect,
61253
+ onStepAction,
61254
+ className,
61255
+ style,
61256
+ ...styleProps
61257
+ }) => {
61258
+ const steps = data?.steps ?? [];
61259
+ const { palette, surfaces } = useWorkflowChrome(styleProps);
61260
+ const labels = (0, import_react279.useMemo)(() => resolveLabels(labelOverrides), [labelOverrides]);
61261
+ const cardProps = buildCardProps(styleProps);
61262
+ const active = (0, import_react279.useMemo)(
61263
+ () => resolveActiveStep(steps, data?.activeStepId),
61264
+ [steps, data?.activeStepId]
61265
+ );
61266
+ const progress = (0, import_react279.useMemo)(() => computeProgress(steps), [steps]);
61267
+ const tallies = (0, import_react279.useMemo)(() => computeTallies(steps), [steps]);
61268
+ return /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
61269
+ Panel_default,
61270
+ {
61271
+ ...cardProps,
61272
+ scrollable: cardScrollable ?? false,
61273
+ className: (0, import_classnames113.default)(className, cardClassName),
61274
+ style,
61275
+ children: /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
61276
+ WorkflowTimeline_default,
61277
+ {
61278
+ steps,
61279
+ activeStepId: active?.step.id,
61280
+ palette,
61281
+ surfaces,
61282
+ labels,
61283
+ progress,
61284
+ tallies,
61285
+ showLegend: showLegend && !loading,
61286
+ loading,
61287
+ loadingRows,
61288
+ emptyState,
61289
+ onStepSelect,
61290
+ onSubStepSelect,
61291
+ onStepAction
61292
+ }
61293
+ )
61294
+ }
61295
+ );
61296
+ };
61297
+ var WorkflowTrackerRail_default = WorkflowTrackerRail;
61298
+
61299
+ // src/components/WorkflowTracker/WorkflowTrackerStepDetails.tsx
61300
+ var import_react280 = require("react");
61301
+ var import_classnames115 = __toESM(require("classnames"), 1);
61302
+
60856
61303
  // src/components/WorkflowTracker/WorkflowDetailPanel.tsx
60857
- var import_jsx_runtime300 = require("react/jsx-runtime");
61304
+ var import_classnames114 = __toESM(require("classnames"), 1);
61305
+ var import_jsx_runtime304 = require("react/jsx-runtime");
60858
61306
  var WorkflowDetailPanel = ({
60859
61307
  active,
60860
61308
  totalSteps,
@@ -60862,13 +61310,14 @@ var WorkflowDetailPanel = ({
60862
61310
  surfaces,
60863
61311
  labels,
60864
61312
  loading,
60865
- onSubStepSelect
61313
+ onSubStepSelect,
61314
+ onStepAction
60866
61315
  }) => {
60867
61316
  if (loading) {
60868
- return /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(WorkflowDetailSkeleton, {});
61317
+ return /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(WorkflowDetailSkeleton, {});
60869
61318
  }
60870
61319
  if (!active) {
60871
- return /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61320
+ return /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
60872
61321
  WorkflowPlaceholder,
60873
61322
  {
60874
61323
  title: labels.noActiveStep,
@@ -60886,11 +61335,11 @@ var WorkflowDetailPanel = ({
60886
61335
  step.startedAt ? { label: labels.started, value: step.startedAt } : void 0,
60887
61336
  step.sla ? { label: labels.sla, value: step.sla } : void 0
60888
61337
  ].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: [
61338
+ return /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)("div", { className: "flex flex-col", children: [
61339
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)("div", { className: "px-5 pb-6 pt-5 sm:px-6", children: [
61340
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)("div", { className: "flex flex-wrap items-center justify-between gap-x-4 gap-y-2", children: [
61341
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)("div", { className: "flex flex-wrap items-center gap-3", children: [
61342
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)(SectionTitle, { surfaces, children: [
60894
61343
  labels.step,
60895
61344
  " ",
60896
61345
  index,
@@ -60899,7 +61348,7 @@ var WorkflowDetailPanel = ({
60899
61348
  " ",
60900
61349
  totalSteps
60901
61350
  ] }),
60902
- step.badge && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61351
+ step.badge && /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
60903
61352
  WorkflowBadge,
60904
61353
  {
60905
61354
  status,
@@ -60909,24 +61358,36 @@ var WorkflowDetailPanel = ({
60909
61358
  }
60910
61359
  )
60911
61360
  ] }),
60912
- step.elapsed && /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(SectionMeta, { surfaces, children: [
60913
- labels.elapsed,
60914
- " ",
60915
- step.elapsed
61361
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)("div", { className: "flex flex-wrap items-center justify-end gap-x-4 gap-y-2", children: [
61362
+ step.elapsed && /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)(SectionMeta, { surfaces, children: [
61363
+ labels.elapsed,
61364
+ " ",
61365
+ step.elapsed
61366
+ ] }),
61367
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
61368
+ WorkflowQuickActions_default,
61369
+ {
61370
+ stepId: step.id,
61371
+ actions: step.actions ?? [],
61372
+ palette,
61373
+ groupLabel: labels.quickActions,
61374
+ onAction: onStepAction
61375
+ }
61376
+ )
60916
61377
  ] })
60917
61378
  ] }),
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)(
61379
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("h3", { className: "mt-3 text-xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-2xl", children: step.label }),
61380
+ step.description && /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
60920
61381
  "p",
60921
61382
  {
60922
- className: (0, import_classnames111.default)(
61383
+ className: (0, import_classnames114.default)(
60923
61384
  "mt-2 max-w-3xl text-sm leading-6",
60924
61385
  surfaces.mutedText
60925
61386
  ),
60926
61387
  children: step.description
60927
61388
  }
60928
61389
  ),
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)(
61390
+ metaFields.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("div", { className: "mt-5 flex flex-wrap gap-x-10 gap-y-4", children: metaFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
60930
61391
  MetaField,
60931
61392
  {
60932
61393
  label: field.label,
@@ -60936,18 +61397,18 @@ var WorkflowDetailPanel = ({
60936
61397
  field.label
60937
61398
  )) })
60938
61399
  ] }),
60939
- subSteps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(import_jsx_runtime300.Fragment, { children: [
60940
- /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(
61400
+ subSteps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)(import_jsx_runtime304.Fragment, { children: [
61401
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)(
60941
61402
  "div",
60942
61403
  {
60943
- className: (0, import_classnames111.default)(
61404
+ className: (0, import_classnames114.default)(
60944
61405
  "flex flex-wrap items-center justify-between gap-2 border-y px-5 py-2.5 sm:px-6",
60945
61406
  surfaces.border,
60946
61407
  surfaces.strip
60947
61408
  ),
60948
61409
  children: [
60949
- /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(SectionTitle, { surfaces, children: labels.subSteps }),
60950
- /* @__PURE__ */ (0, import_jsx_runtime300.jsxs)(SectionMeta, { surfaces, children: [
61410
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(SectionTitle, { surfaces, children: labels.subSteps }),
61411
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)(SectionMeta, { surfaces, children: [
60951
61412
  summary.accepted,
60952
61413
  " ",
60953
61414
  labels.accepted,
@@ -60963,24 +61424,24 @@ var WorkflowDetailPanel = ({
60963
61424
  ]
60964
61425
  }
60965
61426
  ),
60966
- /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61427
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
60967
61428
  "ul",
60968
61429
  {
60969
- className: (0, import_classnames111.default)(
61430
+ className: (0, import_classnames114.default)(
60970
61431
  "m-0 list-none divide-y p-0",
60971
61432
  surfaces.divider
60972
61433
  ),
60973
61434
  children: subSteps.map((subStep) => {
60974
61435
  const subStatus = normalizeStatus(subStep.status);
60975
61436
  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)(
61437
+ const rowContent = /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)(import_jsx_runtime304.Fragment, { children: [
61438
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(WorkflowStatusNode_default, { status: subStatus, palette }),
61439
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)("div", { className: "min-w-0 flex-1", children: [
61440
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("p", { className: "text-sm font-medium text-neutral-800 dark:text-neutral-100", children: subStep.label }),
61441
+ subStep.note && /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
60981
61442
  "p",
60982
61443
  {
60983
- className: (0, import_classnames111.default)(
61444
+ className: (0, import_classnames114.default)(
60984
61445
  "mt-0.5 text-xs leading-5",
60985
61446
  surfaces.mutedText
60986
61447
  ),
@@ -60988,7 +61449,7 @@ var WorkflowDetailPanel = ({
60988
61449
  }
60989
61450
  )
60990
61451
  ] }),
60991
- subStep.badge && /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61452
+ subStep.badge && /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
60992
61453
  WorkflowBadge,
60993
61454
  {
60994
61455
  status: subStatus,
@@ -60997,10 +61458,10 @@ var WorkflowDetailPanel = ({
60997
61458
  children: subStep.badge
60998
61459
  }
60999
61460
  ),
61000
- /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61461
+ /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
61001
61462
  "span",
61002
61463
  {
61003
- className: (0, import_classnames111.default)(
61464
+ className: (0, import_classnames114.default)(
61004
61465
  "w-10 shrink-0 text-right text-xs tabular-nums",
61005
61466
  surfaces.faintText
61006
61467
  ),
@@ -61008,22 +61469,22 @@ var WorkflowDetailPanel = ({
61008
61469
  }
61009
61470
  )
61010
61471
  ] });
61011
- const rowClasses = (0, import_classnames111.default)(
61472
+ const rowClasses = (0, import_classnames114.default)(
61012
61473
  "flex w-full items-center gap-3 px-5 py-3 text-left sm:px-6",
61013
61474
  isRunning && getRowHighlight(palette.accent, surfaces.translucent)
61014
61475
  );
61015
- return /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("li", { children: onSubStepSelect ? /* @__PURE__ */ (0, import_jsx_runtime300.jsx)(
61476
+ return /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("li", { children: onSubStepSelect ? /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
61016
61477
  "button",
61017
61478
  {
61018
61479
  type: "button",
61019
61480
  onClick: () => onSubStepSelect(step.id, subStep.id),
61020
- className: (0, import_classnames111.default)(
61481
+ className: (0, import_classnames114.default)(
61021
61482
  rowClasses,
61022
61483
  "focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-neutral-400 dark:focus-visible:ring-neutral-500"
61023
61484
  ),
61024
61485
  children: rowContent
61025
61486
  }
61026
- ) : /* @__PURE__ */ (0, import_jsx_runtime300.jsx)("div", { className: rowClasses, children: rowContent }) }, subStep.id);
61487
+ ) : /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("div", { className: rowClasses, children: rowContent }) }, subStep.id);
61027
61488
  })
61028
61489
  }
61029
61490
  )
@@ -61032,202 +61493,114 @@ var WorkflowDetailPanel = ({
61032
61493
  };
61033
61494
  var WorkflowDetailPanel_default = WorkflowDetailPanel;
61034
61495
 
61035
- // src/components/WorkflowTracker/WorkflowSummaryCard.tsx
61036
- var import_classnames112 = __toESM(require("classnames"), 1);
61037
- var import_jsx_runtime301 = require("react/jsx-runtime");
61038
- var WorkflowSummaryCard = ({
61039
- title,
61040
- steps,
61041
- palette,
61042
- 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)(
61047
- WorkflowStatusNode_default,
61048
- {
61049
- status: normalizeStatus(step.status),
61050
- palette,
61051
- className: "mt-0.5"
61052
- }
61053
- ),
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)(
61057
- "p",
61496
+ // src/components/WorkflowTracker/WorkflowTrackerStepDetails.tsx
61497
+ var import_jsx_runtime305 = require("react/jsx-runtime");
61498
+ var WorkflowTrackerStepDetails = ({
61499
+ data = sampleWorkflow,
61500
+ loading = false,
61501
+ labels: labelOverrides,
61502
+ cardClassName,
61503
+ onSubStepSelect,
61504
+ onStepAction,
61505
+ className,
61506
+ style,
61507
+ ...styleProps
61508
+ }) => {
61509
+ const steps = data?.steps ?? [];
61510
+ const { palette, surfaces } = useWorkflowChrome(styleProps);
61511
+ const labels = (0, import_react280.useMemo)(
61512
+ () => resolveLabels(labelOverrides),
61513
+ [labelOverrides]
61514
+ );
61515
+ const cardProps = buildCardProps(styleProps);
61516
+ const active = (0, import_react280.useMemo)(
61517
+ () => resolveActiveStep(steps, data?.activeStepId),
61518
+ [steps, data?.activeStepId]
61519
+ );
61520
+ return /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
61521
+ Panel_default,
61522
+ {
61523
+ ...cardProps,
61524
+ className: (0, import_classnames115.default)(className, cardClassName),
61525
+ style,
61526
+ children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
61527
+ WorkflowDetailPanel_default,
61058
61528
  {
61059
- className: (0, import_classnames112.default)(
61060
- "mt-0.5 text-xs leading-5",
61061
- surfaces.mutedText
61062
- ),
61063
- children: step.meta
61529
+ active,
61530
+ totalSteps: steps.length,
61531
+ palette,
61532
+ surfaces,
61533
+ labels,
61534
+ loading,
61535
+ onSubStepSelect,
61536
+ onStepAction
61064
61537
  }
61065
61538
  )
61066
- ] })
61067
- ] }, step.id)) })
61068
- ] });
61069
- var WorkflowSummaryCard_default = WorkflowSummaryCard;
61539
+ }
61540
+ );
61541
+ };
61542
+ var WorkflowTrackerStepDetails_default = WorkflowTrackerStepDetails;
61070
61543
 
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
- },
61123
- {
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
- }
61175
- ]
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
- },
61544
+ // src/components/WorkflowTracker/WorkflowTrackerDetails.tsx
61545
+ var import_react281 = require("react");
61546
+ var import_classnames117 = __toESM(require("classnames"), 1);
61547
+
61548
+ // src/components/WorkflowTracker/WorkflowDetailsCard.tsx
61549
+ var import_classnames116 = __toESM(require("classnames"), 1);
61550
+ var import_jsx_runtime306 = require("react/jsx-runtime");
61551
+ var WorkflowDetailsCard = ({
61552
+ details,
61553
+ ariaLabel,
61554
+ cardProps,
61555
+ className,
61556
+ style
61557
+ }) => /* @__PURE__ */ (0, import_jsx_runtime306.jsx)(
61558
+ Panel_default,
61559
+ {
61560
+ ...cardProps,
61561
+ flexBody: true,
61562
+ className: (0, import_classnames116.default)("flex-1", className),
61563
+ style,
61564
+ children: /* @__PURE__ */ (0, import_jsx_runtime306.jsx)(ScrollArea_default, { className: "h-full", mask: true, role: "region", "aria-label": ariaLabel, children: details })
61565
+ }
61566
+ );
61567
+ var WorkflowDetailsCard_default = WorkflowDetailsCard;
61568
+
61569
+ // src/components/WorkflowTracker/WorkflowTrackerDetails.tsx
61570
+ var import_jsx_runtime307 = require("react/jsx-runtime");
61571
+ var WorkflowTrackerDetails = ({
61572
+ data = sampleWorkflow,
61573
+ loading = false,
61574
+ labels: labelOverrides,
61575
+ cardClassName,
61576
+ className,
61577
+ style,
61578
+ ...styleProps
61579
+ }) => {
61580
+ const steps = data?.steps ?? [];
61581
+ const labels = (0, import_react281.useMemo)(() => resolveLabels(labelOverrides), [labelOverrides]);
61582
+ const cardProps = buildCardProps(styleProps);
61583
+ const active = (0, import_react281.useMemo)(
61584
+ () => resolveActiveStep(steps, data?.activeStepId),
61585
+ [steps, data?.activeStepId]
61586
+ );
61587
+ const details = active?.step.details;
61588
+ if (loading || details == null || details === "") return null;
61589
+ return /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
61590
+ WorkflowDetailsCard_default,
61189
61591
  {
61190
- id: "system_provisioning",
61191
- label: "System provisioning",
61192
- status: "not_started"
61193
- },
61194
- { id: "go_live", label: "Go-live", status: "not_started" }
61195
- ]
61592
+ details,
61593
+ ariaLabel: labels.details,
61594
+ cardProps,
61595
+ className: (0, import_classnames117.default)(className, cardClassName),
61596
+ style
61597
+ }
61598
+ );
61196
61599
  };
61600
+ var WorkflowTrackerDetails_default = WorkflowTrackerDetails;
61197
61601
 
61198
61602
  // 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
- };
61603
+ var import_jsx_runtime308 = require("react/jsx-runtime");
61231
61604
  var WorkflowTracker = ({
61232
61605
  data = sampleWorkflow,
61233
61606
  accentColor = "blue",
@@ -61246,6 +61619,8 @@ var WorkflowTracker = ({
61246
61619
  maxWidth = 1180,
61247
61620
  railWidth = 360,
61248
61621
  stickyRail = false,
61622
+ fillHeight = false,
61623
+ fillHeightOffset = 0,
61249
61624
  loading = false,
61250
61625
  loadingRows = 6,
61251
61626
  emptyState,
@@ -61254,81 +61629,58 @@ var WorkflowTracker = ({
61254
61629
  labels: labelOverrides,
61255
61630
  onStepSelect,
61256
61631
  onSubStepSelect,
61632
+ onStepAction,
61257
61633
  className,
61258
61634
  style,
61259
61635
  ...rest
61260
61636
  }) => {
61261
61637
  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 = {
61638
+ const styleProps = {
61639
+ accentColor,
61640
+ attentionColor,
61641
+ blockedColor,
61642
+ mutedColor,
61297
61643
  variant,
61298
- tone: cardTone,
61644
+ cardTone,
61299
61645
  corner,
61300
61646
  glassOpacity,
61301
61647
  vibrancy,
61302
61648
  specularMode,
61303
61649
  padding,
61304
- scrollable: false
61650
+ translucentSurfaces
61305
61651
  };
61652
+ const { palette, surfaces } = useWorkflowChrome(styleProps);
61653
+ const labels = (0, import_react282.useMemo)(() => resolveLabels(labelOverrides), [labelOverrides]);
61654
+ const cardProps = buildCardProps(styleProps);
61655
+ const attentionSteps = (0, import_react282.useMemo)(() => getAttentionSteps(steps), [steps]);
61656
+ const skippedSteps = (0, import_react282.useMemo)(() => getSkippedSteps(steps), [steps]);
61306
61657
  const railStyle = {
61307
- "--wt-rail-width": typeof railWidth === "number" ? `${railWidth}px` : railWidth
61658
+ "--wt-rail-width": typeof railWidth === "number" ? `${railWidth}px` : railWidth,
61659
+ "--wt-fill-offset": typeof fillHeightOffset === "number" ? `${fillHeightOffset}px` : fillHeightOffset
61308
61660
  };
61309
- return /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)(
61661
+ return /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)(
61310
61662
  "div",
61311
61663
  {
61312
- className: (0, import_classnames113.default)("@container w-full", className),
61664
+ className: (0, import_classnames118.default)("@container w-full", className),
61313
61665
  style: { maxWidth, ...railStyle, ...style },
61314
61666
  "aria-busy": loading || void 0,
61315
61667
  ...rest,
61316
61668
  children: [
61317
- showHeader && loading && /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61669
+ showHeader && loading && /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
61318
61670
  WorkflowHeaderSkeleton,
61319
61671
  {
61320
61672
  hasIcon: Boolean(data?.icon),
61321
61673
  iconCorner
61322
61674
  }
61323
61675
  ),
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: [
61676
+ showHeader && !loading && /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)("header", { className: "mb-5 flex flex-wrap items-start justify-between gap-3", children: [
61677
+ /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)("div", { className: "flex min-w-0 items-center gap-3", children: [
61326
61678
  data?.icon && // `overflow-hidden` plus the shared corner class clips whatever
61327
61679
  // the caller passes, so an <img> needs no rounding of its own.
61328
- /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61680
+ /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
61329
61681
  "span",
61330
61682
  {
61331
- className: (0, import_classnames113.default)(
61683
+ className: (0, import_classnames118.default)(
61332
61684
  "flex h-12 w-12 shrink-0 items-center justify-center overflow-hidden [&>img]:h-full [&>img]:w-full [&>img]:object-cover",
61333
61685
  getSurfaceCornerClass(iconCorner),
61334
61686
  surfaces.chip
@@ -61336,33 +61688,33 @@ var WorkflowTracker = ({
61336
61688
  children: data.icon
61337
61689
  }
61338
61690
  ),
61339
- /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)("div", { className: "min-w-0", children: [
61340
- data?.eyebrow && /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61691
+ /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)("div", { className: "min-w-0", children: [
61692
+ data?.eyebrow && /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
61341
61693
  "p",
61342
61694
  {
61343
- className: (0, import_classnames113.default)(
61695
+ className: (0, import_classnames118.default)(
61344
61696
  "text-[11px] font-semibold uppercase tracking-widest",
61345
61697
  surfaces.faintText
61346
61698
  ),
61347
61699
  children: data.eyebrow
61348
61700
  }
61349
61701
  ),
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 })
61702
+ /* @__PURE__ */ (0, import_jsx_runtime308.jsx)("h2", { className: "mt-1 text-2xl font-semibold tracking-tight text-neutral-900 dark:text-white sm:text-3xl", children: data?.title })
61351
61703
  ] })
61352
61704
  ] }),
61353
- data?.live && /* @__PURE__ */ (0, import_jsx_runtime302.jsxs)(
61705
+ data?.live && /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)(
61354
61706
  Pill_default,
61355
61707
  {
61356
61708
  size: "md",
61357
61709
  tone: mutedColor,
61358
61710
  variant: "outline",
61359
- className: (0, import_classnames113.default)("tracking-wide", surfaces.chip),
61711
+ className: (0, import_classnames118.default)("tracking-wide", surfaces.chip),
61360
61712
  children: [
61361
- /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61713
+ /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
61362
61714
  "span",
61363
61715
  {
61364
61716
  "aria-hidden": "true",
61365
- className: (0, import_classnames113.default)(
61717
+ className: (0, import_classnames118.default)(
61366
61718
  "mr-2 inline-block h-1.5 w-1.5 rounded-full",
61367
61719
  `bg-${accentColor}-500 dark:bg-${accentColor}-400`
61368
61720
  )
@@ -61373,67 +61725,88 @@ var WorkflowTracker = ({
61373
61725
  }
61374
61726
  )
61375
61727
  ] }),
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,
61728
+ /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)(
61729
+ "div",
61730
+ {
61731
+ className: (0, import_classnames118.default)(
61732
+ "grid grid-cols-1 items-start gap-5 @4xl:grid-cols-[var(--wt-rail-width)_minmax(0,1fr)]",
61733
+ fillHeight && "@4xl:h-[calc(100dvh-var(--wt-fill-offset))]"
61734
+ ),
61735
+ children: [
61736
+ /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
61737
+ WorkflowTrackerRail_default,
61384
61738
  {
61385
- steps,
61386
- activeStepId: active?.step.id,
61387
- palette,
61388
- surfaces,
61389
- labels,
61390
- progress,
61391
- tallies,
61392
- showLegend: showLegend && !loading,
61739
+ ...styleProps,
61740
+ data,
61393
61741
  loading,
61394
61742
  loadingRows,
61743
+ showLegend,
61395
61744
  emptyState,
61745
+ labels: labelOverrides,
61746
+ cardScrollable: fillHeight,
61747
+ cardClassName: (0, import_classnames118.default)(
61748
+ stickyRail && !fillHeight && "@4xl:sticky @4xl:top-6",
61749
+ fillHeight && "@4xl:min-h-0 @4xl:self-stretch"
61750
+ ),
61396
61751
  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
61752
+ onSubStepSelect,
61753
+ onStepAction
61423
61754
  }
61424
- ) }),
61425
- skippedSteps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(Panel_default, { ...cardProps, children: /* @__PURE__ */ (0, import_jsx_runtime302.jsx)(
61426
- WorkflowSummaryCard_default,
61755
+ ),
61756
+ /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)(
61757
+ "div",
61427
61758
  {
61428
- title: labels.skippedSteps,
61429
- steps: skippedSteps,
61430
- palette,
61431
- surfaces
61759
+ className: (0, import_classnames118.default)(
61760
+ "@container flex min-w-0 flex-col gap-5",
61761
+ fillHeight && "@4xl:min-h-0 @4xl:self-stretch"
61762
+ ),
61763
+ children: [
61764
+ /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
61765
+ WorkflowTrackerStepDetails_default,
61766
+ {
61767
+ ...styleProps,
61768
+ data,
61769
+ loading,
61770
+ labels: labelOverrides,
61771
+ onSubStepSelect,
61772
+ onStepAction
61773
+ }
61774
+ ),
61775
+ /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
61776
+ WorkflowTrackerDetails_default,
61777
+ {
61778
+ ...styleProps,
61779
+ data,
61780
+ loading,
61781
+ labels: labelOverrides
61782
+ }
61783
+ ),
61784
+ !loading && (attentionSteps.length > 0 || skippedSteps.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)("div", { className: "grid grid-cols-1 gap-5 @xl:grid-cols-2", children: [
61785
+ attentionSteps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(Panel_default, { ...cardProps, children: /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
61786
+ WorkflowSummaryCard_default,
61787
+ {
61788
+ title: labels.needsAttention,
61789
+ steps: attentionSteps,
61790
+ palette,
61791
+ surfaces
61792
+ }
61793
+ ) }),
61794
+ skippedSteps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(Panel_default, { ...cardProps, children: /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
61795
+ WorkflowSummaryCard_default,
61796
+ {
61797
+ title: labels.skippedSteps,
61798
+ steps: skippedSteps,
61799
+ palette,
61800
+ surfaces
61801
+ }
61802
+ ) })
61803
+ ] })
61804
+ ]
61432
61805
  }
61433
- ) })
61434
- ] })
61435
- ] })
61436
- ] })
61806
+ )
61807
+ ]
61808
+ }
61809
+ )
61437
61810
  ]
61438
61811
  }
61439
61812
  );
@@ -61441,9 +61814,9 @@ var WorkflowTracker = ({
61441
61814
  var WorkflowTracker_default = WorkflowTracker;
61442
61815
 
61443
61816
  // src/components/Gantt/Gantt.tsx
61444
- var import_react283 = require("react");
61817
+ var import_react287 = require("react");
61445
61818
  var import_react_dom15 = require("react-dom");
61446
- var import_classnames117 = __toESM(require("classnames"), 1);
61819
+ var import_classnames122 = __toESM(require("classnames"), 1);
61447
61820
 
61448
61821
  // ../common/gantt/types.ts
61449
61822
  var GANTT_ZOOM_PRESETS = [
@@ -62789,38 +63162,38 @@ var sampleGantt = {
62789
63162
  };
62790
63163
 
62791
63164
  // src/components/Gantt/GanttScale.tsx
62792
- var import_classnames114 = __toESM(require("classnames"), 1);
62793
- var import_jsx_runtime303 = require("react/jsx-runtime");
63165
+ var import_classnames119 = __toESM(require("classnames"), 1);
63166
+ var import_jsx_runtime309 = require("react/jsx-runtime");
62794
63167
  var GanttScale = ({ levels, height }) => {
62795
63168
  if (levels.length === 0) {
62796
- return /* @__PURE__ */ (0, import_jsx_runtime303.jsx)("div", { style: { height } });
63169
+ return /* @__PURE__ */ (0, import_jsx_runtime309.jsx)("div", { style: { height } });
62797
63170
  }
62798
63171
  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)(
63172
+ return /* @__PURE__ */ (0, import_jsx_runtime309.jsx)("div", { className: "flex h-full w-full flex-col", children: levels.map((level, li) => /* @__PURE__ */ (0, import_jsx_runtime309.jsx)(
62800
63173
  "div",
62801
63174
  {
62802
- className: (0, import_classnames114.default)("flex w-full", li === 0 ? "shrink-0" : "min-h-0 flex-1"),
63175
+ className: (0, import_classnames119.default)("flex w-full", li === 0 ? "shrink-0" : "min-h-0 flex-1"),
62803
63176
  style: li === 0 ? { height: coarseHeight } : void 0,
62804
- children: level.columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime303.jsxs)(
63177
+ children: level.columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime309.jsxs)(
62805
63178
  "div",
62806
63179
  {
62807
- className: (0, import_classnames114.default)(
63180
+ className: (0, import_classnames119.default)(
62808
63181
  "flex shrink-0 flex-col items-center justify-center overflow-hidden border-r border-neutral-200/70 dark:border-neutral-800/70",
62809
63182
  li === 0 ? "bg-neutral-50/60 dark:bg-neutral-800/40" : "bg-white dark:bg-neutral-900"
62810
63183
  ),
62811
63184
  style: { width: col.width },
62812
63185
  children: [
62813
- /* @__PURE__ */ (0, import_jsx_runtime303.jsx)(
63186
+ /* @__PURE__ */ (0, import_jsx_runtime309.jsx)(
62814
63187
  "span",
62815
63188
  {
62816
- className: (0, import_classnames114.default)(
63189
+ className: (0, import_classnames119.default)(
62817
63190
  "max-w-full truncate px-1 text-[10px] font-semibold uppercase leading-none tracking-wide",
62818
63191
  li === 0 ? "text-neutral-700 dark:text-neutral-200" : "text-neutral-500 dark:text-neutral-400"
62819
63192
  ),
62820
63193
  children: col.label
62821
63194
  }
62822
63195
  ),
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 })
63196
+ col.subLabel != null && /* @__PURE__ */ (0, import_jsx_runtime309.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
63197
  ]
62825
63198
  },
62826
63199
  col.id
@@ -62832,9 +63205,9 @@ var GanttScale = ({ levels, height }) => {
62832
63205
  GanttScale.displayName = "GanttScale";
62833
63206
 
62834
63207
  // 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)(
63208
+ var import_react283 = require("react");
63209
+ var import_jsx_runtime310 = require("react/jsx-runtime");
63210
+ var GanttLinkLayer = (0, import_react283.forwardRef)(
62838
63211
  function GanttLinkLayer2({
62839
63212
  width,
62840
63213
  height,
@@ -62848,7 +63221,7 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62848
63221
  onDeleteLink
62849
63222
  }, ref) {
62850
63223
  const t = useKitT();
62851
- const svgRef = (0, import_react279.useRef)(null);
63224
+ const svgRef = (0, import_react283.useRef)(null);
62852
63225
  const selPath = selected ? paths.find((p) => p.link === selected) : void 0;
62853
63226
  const selColor = selPath ? selPath.color ?? color : color;
62854
63227
  const selMid = selPath ? { x: (selPath.from.x + selPath.to.x) / 2, y: (selPath.from.y + selPath.to.y) / 2 } : null;
@@ -62869,24 +63242,24 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62869
63242
  const pick = pickFromEvent(e) ?? clicked;
62870
63243
  if (interactive && onDeleteLink) onDeleteLink(pick.link);
62871
63244
  };
62872
- return /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)(
63245
+ return /* @__PURE__ */ (0, import_jsx_runtime310.jsxs)(
62873
63246
  "div",
62874
63247
  {
62875
63248
  ref,
62876
63249
  className: "pointer-events-none absolute top-0 z-10",
62877
63250
  style: { left: offsetLeft, width, height },
62878
63251
  children: [
62879
- /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)("svg", { ref: svgRef, width, height, className: "block overflow-visible", children: [
63252
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsxs)("svg", { ref: svgRef, width, height, className: "block overflow-visible", children: [
62880
63253
  paths.map((p, i) => {
62881
63254
  const tokens = getGanttLinkTokens(p.color ?? color);
62882
63255
  const sel = selected != null && p.link === selected;
62883
63256
  const nodeR = sel ? 4.5 : 3.5;
62884
- return /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)(
63257
+ return /* @__PURE__ */ (0, import_jsx_runtime310.jsxs)(
62885
63258
  "g",
62886
63259
  {
62887
63260
  style: sel ? { filter: `drop-shadow(0 0 3px var(--color-${p.color ?? color}-500))` } : void 0,
62888
63261
  children: [
62889
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
63262
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)(
62890
63263
  "path",
62891
63264
  {
62892
63265
  d: p.d,
@@ -62902,10 +63275,10 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62902
63275
  },
62903
63276
  onClick: (e) => handlePick(e, p),
62904
63277
  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()})` })
63278
+ children: /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
62906
63279
  }
62907
63280
  ),
62908
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
63281
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)(
62909
63282
  "path",
62910
63283
  {
62911
63284
  d: p.d,
@@ -62921,14 +63294,14 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62921
63294
  },
62922
63295
  onClick: (e) => handlePick(e, p),
62923
63296
  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()})` })
63297
+ children: /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("title", { children: `${p.link.source} \u2192 ${p.link.target} (${p.type.toUpperCase()})` })
62925
63298
  }
62926
63299
  ),
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 })
63300
+ p.arrow && /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("polygon", { points: p.arrow, className: tokens.fill }),
63301
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("circle", { cx: p.from.x, cy: p.from.y, r: nodeR + 2.5, className: tokens.halo }),
63302
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("circle", { cx: p.from.x, cy: p.from.y, r: nodeR, className: tokens.fill }),
63303
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("circle", { cx: p.to.x, cy: p.to.y, r: nodeR + 2.5, className: tokens.halo }),
63304
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("circle", { cx: p.to.x, cy: p.to.y, r: nodeR, className: tokens.fill })
62932
63305
  ]
62933
63306
  },
62934
63307
  `${p.link.source}->${p.link.target}-${p.type}-${i}`
@@ -62936,8 +63309,8 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62936
63309
  }),
62937
63310
  rubber && (() => {
62938
63311
  const tokens = getGanttLinkTokens(rubber.color);
62939
- return /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)("g", { children: [
62940
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)(
63312
+ return /* @__PURE__ */ (0, import_jsx_runtime310.jsxs)("g", { children: [
63313
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)(
62941
63314
  "path",
62942
63315
  {
62943
63316
  d: rubber.d,
@@ -62948,15 +63321,15 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62948
63321
  strokeDasharray: "5 3"
62949
63322
  }
62950
63323
  ),
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 })
63324
+ rubber.arrow && /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("polygon", { points: rubber.arrow, className: tokens.fill }),
63325
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 6, className: tokens.halo }),
63326
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("circle", { cx: rubber.from.x, cy: rubber.from.y, r: 3.5, className: tokens.fill }),
63327
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 6, className: tokens.halo }),
63328
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("circle", { cx: rubber.to.x, cy: rubber.to.y, r: 3.5, className: tokens.fill })
62956
63329
  ] });
62957
63330
  })()
62958
63331
  ] }),
62959
- canDelete && selMid && /* @__PURE__ */ (0, import_jsx_runtime304.jsxs)(
63332
+ canDelete && selMid && /* @__PURE__ */ (0, import_jsx_runtime310.jsxs)(
62960
63333
  "button",
62961
63334
  {
62962
63335
  type: "button",
@@ -62974,7 +63347,7 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62974
63347
  onClick: () => onDeleteLink(selected),
62975
63348
  title: t("kit.gantt.removeDependency"),
62976
63349
  children: [
62977
- /* @__PURE__ */ (0, import_jsx_runtime304.jsx)("span", { "aria-hidden": true, children: "\u2715" }),
63350
+ /* @__PURE__ */ (0, import_jsx_runtime310.jsx)("span", { "aria-hidden": true, children: "\u2715" }),
62978
63351
  " ",
62979
63352
  t("kit.gantt.delete")
62980
63353
  ]
@@ -62988,9 +63361,9 @@ var GanttLinkLayer = (0, import_react279.forwardRef)(
62988
63361
  GanttLinkLayer.displayName = "GanttLinkLayer";
62989
63362
 
62990
63363
  // 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");
63364
+ var import_react284 = require("react");
63365
+ var import_classnames120 = __toESM(require("classnames"), 1);
63366
+ var import_jsx_runtime311 = require("react/jsx-runtime");
62994
63367
  var BAR_HEIGHT = 24;
62995
63368
  var MILESTONE_SIZE = 14;
62996
63369
  var GanttBodyRow = ({
@@ -63029,11 +63402,11 @@ var GanttBodyRow = ({
63029
63402
  const t = useKitT();
63030
63403
  const isDraggingThis = row.task != null && drag?.taskId === row.task.id;
63031
63404
  const reorderDragging = isDraggingThis && drag?.kind === "reorder";
63032
- return /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63405
+ return /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63033
63406
  "div",
63034
63407
  {
63035
63408
  "data-row-key": row.key,
63036
- className: (0, import_classnames115.default)(
63409
+ className: (0, import_classnames120.default)(
63037
63410
  // No overflow here: an overflow-hidden row root would become the
63038
63411
  // sticky halves' (non-scrolling) scrollport and stop them pinning to
63039
63412
  // the left edge while the timeline scrolls. The halves pin the
@@ -63050,7 +63423,7 @@ var GanttBodyRow = ({
63050
63423
  boxShadow: `inset 2px 0 0 var(--color-${color}-500)`
63051
63424
  } : {}
63052
63425
  },
63053
- children: row.task == null ? /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63426
+ children: row.task == null ? /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63054
63427
  LaneHeader,
63055
63428
  {
63056
63429
  row,
@@ -63061,20 +63434,20 @@ var GanttBodyRow = ({
63061
63434
  dividerClass,
63062
63435
  liveProgress: liveLane
63063
63436
  }
63064
- ) : /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(import_jsx_runtime305.Fragment, { children: [
63065
- /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(
63437
+ ) : /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(import_jsx_runtime311.Fragment, { children: [
63438
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(
63066
63439
  "div",
63067
63440
  {
63068
- className: (0, import_classnames115.default)(
63441
+ className: (0, import_classnames120.default)(
63069
63442
  "sticky left-0 z-20 flex items-stretch overflow-hidden border-r border-b bg-white dark:bg-neutral-900",
63070
63443
  dividerClass
63071
63444
  ),
63072
63445
  style: { width: leftWidth },
63073
63446
  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)(
63447
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("div", { className: "flex w-9 shrink-0 items-center justify-center", children: interactive && !row.task.locked && /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63075
63448
  "span",
63076
63449
  {
63077
- className: (0, import_classnames115.default)(
63450
+ className: (0, import_classnames120.default)(
63078
63451
  "flex cursor-grab touch-none items-center text-neutral-300 transition-opacity active:cursor-grabbing dark:text-neutral-600",
63079
63452
  reorderDragging ? "opacity-100" : "opacity-0 group-hover/row:opacity-100"
63080
63453
  ),
@@ -63082,10 +63455,10 @@ var GanttBodyRow = ({
63082
63455
  onPointerDown: (e) => onGripPointerDown(row.key, row.task, e),
63083
63456
  title: t("kit.gantt.dragReorder"),
63084
63457
  "aria-hidden": "true",
63085
- children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(Drag, { className: "h-3.5 w-3.5" })
63458
+ children: /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(Drag, { className: "h-3.5 w-3.5" })
63086
63459
  }
63087
63460
  ) }),
63088
- columns.map((col, i) => /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63461
+ columns.map((col, i) => /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63089
63462
  Cell,
63090
63463
  {
63091
63464
  col,
@@ -63106,12 +63479,12 @@ var GanttBodyRow = ({
63106
63479
  ]
63107
63480
  }
63108
63481
  ),
63109
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63482
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63110
63483
  "div",
63111
63484
  {
63112
- className: (0, import_classnames115.default)("relative shrink-0 border-b", dividerClass),
63485
+ className: (0, import_classnames120.default)("relative shrink-0 border-b", dividerClass),
63113
63486
  style: { width: timelineWidth },
63114
- children: /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63487
+ children: /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63115
63488
  TaskBar,
63116
63489
  {
63117
63490
  task: row.task,
@@ -63152,57 +63525,57 @@ var LaneHeader = ({ row, columns, leftWidth, color, onCaretClick, dividerClass =
63152
63525
  const laneColor = lane.color ?? color;
63153
63526
  const tokens = getGanttLaneTokens(laneColor);
63154
63527
  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)(
63528
+ return /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(import_jsx_runtime311.Fragment, { children: [
63529
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(
63157
63530
  "div",
63158
63531
  {
63159
- className: (0, import_classnames115.default)(
63532
+ className: (0, import_classnames120.default)(
63160
63533
  "sticky left-0 z-20 flex items-stretch overflow-hidden border-r border-b bg-white dark:bg-neutral-900",
63161
63534
  dividerClass
63162
63535
  ),
63163
63536
  style: { width: leftWidth },
63164
63537
  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)(
63538
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("div", { className: (0, import_classnames120.default)("pointer-events-none absolute inset-0", tokens.band) }),
63539
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("div", { className: "relative flex w-9 shrink-0 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63167
63540
  "button",
63168
63541
  {
63169
63542
  type: "button",
63170
63543
  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
63544
  onClick: () => onCaretClick(lane.id, isOpen),
63172
63545
  "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") })
63546
+ children: /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(ChevronRight, { className: (0, import_classnames120.default)("h-3 w-3 transition-transform", isOpen && "rotate-90") })
63174
63547
  }
63175
63548
  ) }),
63176
- columns.map((col, i) => /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63549
+ columns.map((col, i) => /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63177
63550
  "div",
63178
63551
  {
63179
- className: (0, import_classnames115.default)(
63552
+ className: (0, import_classnames120.default)(
63180
63553
  "relative flex shrink-0 items-center gap-2 overflow-hidden border-r px-2 last:border-r-0",
63181
63554
  dividerClass
63182
63555
  ),
63183
63556
  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
63557
+ children: i === 0 ? /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(import_jsx_runtime311.Fragment, { children: [
63558
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("span", { className: (0, import_classnames120.default)("truncate text-[13px] font-semibold", tokens.label), children: lane.label }),
63559
+ lane.description && /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("span", { className: "hidden truncate text-[11px] text-neutral-500 dark:text-neutral-400 lg:inline", children: lane.description }),
63560
+ row.childCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime311.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 })
63561
+ ] }) : col.key === "progress" ? /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(ProgressCell, { value: liveProgress ?? row.progress ?? 0, barClass: tokens.chip }) : null
63189
63562
  },
63190
63563
  col.key
63191
63564
  ))
63192
63565
  ]
63193
63566
  }
63194
63567
  ),
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) }) })
63568
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("div", { className: (0, import_classnames120.default)("relative min-w-0 flex-1 border-b", dividerClass), children: /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("div", { className: (0, import_classnames120.default)("absolute inset-0", tokens.band) }) })
63196
63569
  ] });
63197
63570
  };
63198
63571
  var Cell = ({ col, task, depth, isGroup, childCount, first, onCaretClick, renderCell, liveProgress, liveRollup, rowProgress, dividerClass = "border-neutral-100 dark:border-neutral-800" }) => {
63199
63572
  const t = useKitT();
63200
63573
  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
63574
  const custom = col.key !== "name" && renderCell ? renderCell(value, task, col) : null;
63202
- return /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63575
+ return /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63203
63576
  "div",
63204
63577
  {
63205
- className: (0, import_classnames115.default)(
63578
+ className: (0, import_classnames120.default)(
63206
63579
  "flex shrink-0 items-center gap-1.5 overflow-hidden border-r px-2 text-[12.5px] last:border-r-0",
63207
63580
  dividerClass
63208
63581
  ),
@@ -63210,50 +63583,50 @@ var Cell = ({ col, task, depth, isGroup, childCount, first, onCaretClick, render
63210
63583
  width: col.width ?? "160px",
63211
63584
  justifyContent: col.align === "center" ? "center" : col.align === "right" ? "flex-end" : "flex-start"
63212
63585
  },
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)(
63586
+ children: first ? /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(import_jsx_runtime311.Fragment, { children: [
63587
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("span", { className: "shrink-0", style: { width: depth * 14 + 18 }, children: isGroup && /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63215
63588
  "button",
63216
63589
  {
63217
63590
  type: "button",
63218
63591
  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
63592
  onClick: () => onCaretClick(task.id, task.open !== false),
63220
63593
  "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") })
63594
+ children: /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(ChevronRight, { className: (0, import_classnames120.default)("h-3 w-3 transition-transform", task.open !== false && "rotate-90") })
63222
63595
  }
63223
63596
  ) }),
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)(
63597
+ isGroup && childCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)("span", { className: "flex min-w-0 items-center gap-1 font-semibold text-neutral-800 dark:text-neutral-100", children: [
63598
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("span", { className: "truncate", children: task.name }),
63599
+ /* @__PURE__ */ (0, import_jsx_runtime311.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 })
63600
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("span", { className: "truncate font-medium text-neutral-700 dark:text-neutral-300", children: task.name })
63601
+ ] }) : col.kind === "owner" ? value != null ? /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)("span", { className: "flex min-w-0 items-center gap-1.5 text-neutral-600 dark:text-neutral-400", children: [
63602
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63230
63603
  "span",
63231
63604
  {
63232
- className: (0, import_classnames115.default)(
63605
+ className: (0, import_classnames120.default)(
63233
63606
  "flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-[8px] font-bold uppercase text-white",
63234
63607
  getGanttBarTokens(task.color ?? "blue").fill
63235
63608
  ),
63236
63609
  children: String(value).slice(0, 1)
63237
63610
  }
63238
63611
  ),
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)(
63612
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("span", { className: "truncate", children: String(value) })
63613
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("span", { className: "text-neutral-400 dark:text-neutral-600", children: "\u2014" }) : col.kind === "progress" ? /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(ProgressCell, { value: typeof value === "number" ? value : 0 }) : col.kind === "badge" ? task.badge != null ? /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63241
63614
  "span",
63242
63615
  {
63243
- className: (0, import_classnames115.default)(
63616
+ className: (0, import_classnames120.default)(
63244
63617
  "rounded-full px-1.5 py-0.5 text-[10px] font-semibold",
63245
63618
  getGanttBarTokens(task.badgeColor ?? "neutral").fill,
63246
63619
  "text-white"
63247
63620
  ),
63248
63621
  children: task.badge
63249
63622
  }
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) })
63623
+ ) : /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("span", { className: "text-neutral-400 dark:text-neutral-600", children: "\u2014" }) : custom != null ? custom : /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("span", { className: "truncate text-neutral-600 dark:text-neutral-400", children: value == null || value === "" ? "\u2014" : String(value) })
63251
63624
  }
63252
63625
  );
63253
63626
  };
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: [
63627
+ var ProgressCell = ({ value, barClass = "bg-emerald-500" }) => /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)("span", { className: "flex w-full items-center gap-1.5", children: [
63628
+ /* @__PURE__ */ (0, import_jsx_runtime311.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_runtime311.jsx)("span", { className: (0, import_classnames120.default)("block h-full rounded-full", barClass), style: { width: `${Math.round(value * 100)}%` } }) }),
63629
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)("span", { className: "w-7 shrink-0 text-right text-[10px] font-semibold tabular-nums text-neutral-500 dark:text-neutral-400", children: [
63257
63630
  Math.round(value * 100),
63258
63631
  "%"
63259
63632
  ] })
@@ -63285,7 +63658,7 @@ var TaskBar = ({
63285
63658
  const t = useKitT();
63286
63659
  const milestone = task.type === "milestone";
63287
63660
  const barColor = task.color ?? color;
63288
- const tokens = (0, import_react280.useMemo)(() => getGanttBarTokens(barColor), [barColor]);
63661
+ const tokens = (0, import_react284.useMemo)(() => getGanttBarTokens(barColor), [barColor]);
63289
63662
  const startMs = liveDates ? liveDates.start : toMs(task.start);
63290
63663
  const endMs = liveDates ? liveDates.end : toMs(task.end);
63291
63664
  const left = dateToX(startMs, rangeStart, zoom);
@@ -63310,7 +63683,7 @@ var TaskBar = ({
63310
63683
  pct: progressPct
63311
63684
  });
63312
63685
  if (milestone) {
63313
- return /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(
63686
+ return /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(
63314
63687
  "div",
63315
63688
  {
63316
63689
  role: "button",
@@ -63318,7 +63691,7 @@ var TaskBar = ({
63318
63691
  "aria-label": ariaLabel,
63319
63692
  title: ariaLabel,
63320
63693
  "data-gantt-bar": task.id,
63321
- className: (0, import_classnames115.default)(
63694
+ className: (0, import_classnames120.default)(
63322
63695
  "absolute z-10 flex cursor-pointer items-center gap-1.5 outline-none",
63323
63696
  selected && selectionTokens.ring,
63324
63697
  "rounded"
@@ -63328,13 +63701,13 @@ var TaskBar = ({
63328
63701
  onClick: () => onSelect(task.id),
63329
63702
  onKeyDown: (e) => onBarKeyDown(e, task),
63330
63703
  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 })
63704
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("span", { className: (0, import_classnames120.default)("h-3.5 w-3.5 shrink-0 rotate-45 rounded-[2px] shadow-sm", tokens.milestone) }),
63705
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("span", { className: "truncate text-[11px] font-semibold text-neutral-700 dark:text-neutral-300", children: task.name })
63333
63706
  ]
63334
63707
  }
63335
63708
  );
63336
63709
  }
63337
- return /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(
63710
+ return /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(
63338
63711
  "div",
63339
63712
  {
63340
63713
  role: "button",
@@ -63342,7 +63715,7 @@ var TaskBar = ({
63342
63715
  "aria-label": ariaLabel,
63343
63716
  title: `${task.name} \xB7 ${formatDateTime(startMs, locale)} \u2192 ${formatDateTime(endMs, locale)} \xB7 ${progressPct}%`,
63344
63717
  "data-gantt-bar": task.id,
63345
- className: (0, import_classnames115.default)(
63718
+ className: (0, import_classnames120.default)(
63346
63719
  "group/bar absolute z-10 cursor-grab touch-none rounded-md shadow-sm outline-none transition-shadow active:cursor-grabbing",
63347
63720
  tokens.base,
63348
63721
  tokens.rim,
@@ -63359,17 +63732,17 @@ var TaskBar = ({
63359
63732
  onClick: () => onSelect(task.id),
63360
63733
  onKeyDown: (e) => onBarKeyDown(e, task),
63361
63734
  children: [
63362
- progress > 0 && /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63735
+ progress > 0 && /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63363
63736
  "div",
63364
63737
  {
63365
- className: (0, import_classnames115.default)("absolute inset-y-0 left-0 rounded-l-md", tokens.progress),
63738
+ className: (0, import_classnames120.default)("absolute inset-y-0 left-0 rounded-l-md", tokens.progress),
63366
63739
  style: { width: `${progress * 100}%` }
63367
63740
  }
63368
63741
  ),
63369
- canEdit && !row.isGroup && progress > 0 && progress < 1 && /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63742
+ canEdit && !row.isGroup && progress > 0 && progress < 1 && /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63370
63743
  "div",
63371
63744
  {
63372
- className: (0, import_classnames115.default)(
63745
+ className: (0, import_classnames120.default)(
63373
63746
  "absolute inset-y-0 z-20 w-2 cursor-ew-resize touch-none opacity-0 transition-opacity group-hover/bar:opacity-100",
63374
63747
  liveProgress != null && "opacity-100"
63375
63748
  ),
@@ -63377,10 +63750,10 @@ var TaskBar = ({
63377
63750
  onPointerDown: (e) => onProgressPointerDown(task, e),
63378
63751
  title: labels.progress,
63379
63752
  "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" })
63753
+ children: /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("div", { className: "mx-auto h-full w-0.5 rounded-full bg-white/90" })
63381
63754
  }
63382
63755
  ),
63383
- liveProgress != null && /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(
63756
+ liveProgress != null && /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(
63384
63757
  "div",
63385
63758
  {
63386
63759
  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 +63764,31 @@ var TaskBar = ({
63391
63764
  ]
63392
63765
  }
63393
63766
  ),
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)(
63767
+ showName && (renderBar != null ? /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("div", { className: (0, import_classnames120.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_runtime311.jsx)("span", { className: (0, import_classnames120.default)("pointer-events-none absolute inset-0 flex items-center truncate px-1.5 text-[11px] font-medium", labelText), children: task.name })),
63768
+ canEdit && /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(import_jsx_runtime311.Fragment, { children: [
63769
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63397
63770
  "div",
63398
63771
  {
63399
63772
  className: "absolute inset-y-0 -left-1 z-20 w-2 cursor-ew-resize touch-none",
63400
63773
  onPointerDown: (e) => onResizePointerDown(task, "start", e),
63401
63774
  title: t("kit.gantt.resizeStart"),
63402
63775
  "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" })
63776
+ children: /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("div", { className: "mx-auto h-full w-1 rounded-full bg-white/0 opacity-0 transition-opacity group-hover/bar:opacity-100" })
63404
63777
  }
63405
63778
  ),
63406
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63779
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63407
63780
  "div",
63408
63781
  {
63409
63782
  className: "absolute inset-y-0 -right-1 z-20 w-2 cursor-ew-resize touch-none",
63410
63783
  onPointerDown: (e) => onResizePointerDown(task, "end", e),
63411
63784
  title: t("kit.gantt.resizeEnd"),
63412
63785
  "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" })
63786
+ children: /* @__PURE__ */ (0, import_jsx_runtime311.jsx)("div", { className: "mx-auto h-full w-1 rounded-full bg-white/0 opacity-0 transition-opacity group-hover/bar:opacity-100" })
63414
63787
  }
63415
63788
  )
63416
63789
  ] }),
63417
- canEdit && /* @__PURE__ */ (0, import_jsx_runtime305.jsxs)(import_jsx_runtime305.Fragment, { children: [
63418
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63790
+ canEdit && /* @__PURE__ */ (0, import_jsx_runtime311.jsxs)(import_jsx_runtime311.Fragment, { children: [
63791
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63419
63792
  "button",
63420
63793
  {
63421
63794
  type: "button",
@@ -63426,7 +63799,7 @@ var TaskBar = ({
63426
63799
  "aria-label": t("kit.gantt.linkFromStart", { task: task.name })
63427
63800
  }
63428
63801
  ),
63429
- /* @__PURE__ */ (0, import_jsx_runtime305.jsx)(
63802
+ /* @__PURE__ */ (0, import_jsx_runtime311.jsx)(
63430
63803
  "button",
63431
63804
  {
63432
63805
  type: "button",
@@ -63444,9 +63817,9 @@ var TaskBar = ({
63444
63817
  };
63445
63818
 
63446
63819
  // 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");
63820
+ var import_react285 = require("react");
63821
+ var import_classnames121 = __toESM(require("classnames"), 1);
63822
+ var import_jsx_runtime312 = require("react/jsx-runtime");
63450
63823
  function nearestPreset(zoom, presets) {
63451
63824
  let best = null;
63452
63825
  let bestDist = Infinity;
@@ -63473,25 +63846,25 @@ var GanttToolbar = ({
63473
63846
  Month: t("kit.gantt.zoomMonth"),
63474
63847
  Quarter: t("kit.gantt.zoomQuarter")
63475
63848
  };
63476
- const active = (0, import_react281.useMemo)(() => nearestPreset(zoom, presets), [zoom, presets]);
63477
- const chrome = (0, import_react281.useMemo)(
63849
+ const active = (0, import_react285.useMemo)(() => nearestPreset(zoom, presets), [zoom, presets]);
63850
+ const chrome = (0, import_react285.useMemo)(
63478
63851
  () => getSurfaceVariantClasses(variant, "neutral"),
63479
63852
  [variant]
63480
63853
  );
63481
- return /* @__PURE__ */ (0, import_jsx_runtime306.jsxs)(
63854
+ return /* @__PURE__ */ (0, import_jsx_runtime312.jsxs)(
63482
63855
  "div",
63483
63856
  {
63484
- className: (0, import_classnames116.default)(
63857
+ className: (0, import_classnames121.default)(
63485
63858
  "pointer-events-auto flex items-center gap-1 rounded-lg p-1",
63486
63859
  chrome
63487
63860
  ),
63488
63861
  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)(
63862
+ /* @__PURE__ */ (0, import_jsx_runtime312.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_runtime312.jsx)(
63490
63863
  "button",
63491
63864
  {
63492
63865
  type: "button",
63493
63866
  onClick: () => onZoomTo(p.value),
63494
- className: (0, import_classnames116.default)(
63867
+ className: (0, import_classnames121.default)(
63495
63868
  "rounded px-1.5 py-0.5 text-[10.5px] font-semibold transition-colors",
63496
63869
  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
63870
  ),
@@ -63499,9 +63872,9 @@ var GanttToolbar = ({
63499
63872
  },
63500
63873
  p.label
63501
63874
  )) }),
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: "+" }) })
63875
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("div", { className: "mx-0.5 h-4 w-px bg-neutral-200 dark:bg-neutral-700" }),
63876
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(Button_default, { variant: "ghost", size: "xs", onClick: () => onZoomBy(1 / 1.25), "aria-label": t("kit.gantt.zoomOut"), children: /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: "text-xs font-semibold leading-none", children: "\u2212" }) }),
63877
+ /* @__PURE__ */ (0, import_jsx_runtime312.jsx)(Button_default, { variant: "ghost", size: "xs", onClick: () => onZoomBy(1.25), "aria-label": t("kit.gantt.zoomIn"), children: /* @__PURE__ */ (0, import_jsx_runtime312.jsx)("span", { className: "text-xs font-semibold leading-none", children: "+" }) })
63505
63878
  ]
63506
63879
  }
63507
63880
  );
@@ -63509,16 +63882,16 @@ var GanttToolbar = ({
63509
63882
  GanttToolbar.displayName = "GanttToolbar";
63510
63883
 
63511
63884
  // src/components/Gantt/useGanttDrag.ts
63512
- var import_react282 = require("react");
63885
+ var import_react286 = require("react");
63513
63886
  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);
63887
+ const [drag, setDrag] = (0, import_react286.useState)(null);
63888
+ const [linkSelected, setLinkSelected] = (0, import_react286.useState)(null);
63889
+ const optsRef = (0, import_react286.useRef)(opts);
63517
63890
  optsRef.current = opts;
63518
- const dragRef = (0, import_react282.useRef)(null);
63891
+ const dragRef = (0, import_react286.useRef)(null);
63519
63892
  dragRef.current = drag;
63520
63893
  const { rows, zoom, rangeStart, accentColor } = opts;
63521
- const barGeom = (0, import_react282.useCallback)(
63894
+ const barGeom = (0, import_react286.useCallback)(
63522
63895
  (taskId) => {
63523
63896
  const row = rows.find((r) => r.key === `task:${taskId}`);
63524
63897
  if (!row?.task) return null;
@@ -63538,7 +63911,7 @@ function useGanttDrag(opts) {
63538
63911
  },
63539
63912
  [rows, zoom, rangeStart]
63540
63913
  );
63541
- const findTargetBar = (0, import_react282.useCallback)(
63914
+ const findTargetBar = (0, import_react286.useCallback)(
63542
63915
  (x, y, excludeId) => {
63543
63916
  const row = rows.find((r) => r.task && y >= r.top && y < r.top + r.height);
63544
63917
  if (!row?.task || row.task.id === excludeId) return null;
@@ -63549,7 +63922,7 @@ function useGanttDrag(opts) {
63549
63922
  },
63550
63923
  [rows, barGeom]
63551
63924
  );
63552
- const allBarGeoms = (0, import_react282.useCallback)(() => {
63925
+ const allBarGeoms = (0, import_react286.useCallback)(() => {
63553
63926
  const out = [];
63554
63927
  for (const row of rows) {
63555
63928
  if (!row.task) continue;
@@ -63558,17 +63931,17 @@ function useGanttDrag(opts) {
63558
63931
  }
63559
63932
  return out;
63560
63933
  }, [rows, barGeom]);
63561
- const timelineX = (0, import_react282.useCallback)((clientX) => {
63934
+ const timelineX = (0, import_react286.useCallback)((clientX) => {
63562
63935
  const overlay = optsRef.current.overlayRef.current;
63563
63936
  if (!overlay) return 0;
63564
63937
  return clientX - overlay.getBoundingClientRect().left;
63565
63938
  }, []);
63566
- const rowY = (0, import_react282.useCallback)((clientY) => {
63939
+ const rowY = (0, import_react286.useCallback)((clientY) => {
63567
63940
  const overlay = optsRef.current.overlayRef.current;
63568
63941
  if (!overlay) return 0;
63569
63942
  return clientY - overlay.getBoundingClientRect().top;
63570
63943
  }, []);
63571
- (0, import_react282.useEffect)(() => {
63944
+ (0, import_react286.useEffect)(() => {
63572
63945
  if (!drag) return;
63573
63946
  const onMove = (e) => {
63574
63947
  e.preventDefault();
@@ -63693,7 +64066,7 @@ function useGanttDrag(opts) {
63693
64066
  window.removeEventListener("pointerup", onUp);
63694
64067
  };
63695
64068
  }, [drag != null, timelineX, rowY]);
63696
- const beginDrag = (0, import_react282.useCallback)(
64069
+ const beginDrag = (0, import_react286.useCallback)(
63697
64070
  (partial, e, focusEl) => {
63698
64071
  const o = optsRef.current;
63699
64072
  if (!o.interactive) return;
@@ -63727,7 +64100,7 @@ function useGanttDrag(opts) {
63727
64100
  },
63728
64101
  [timelineX, rowY]
63729
64102
  );
63730
- const onBarPointerDown = (0, import_react282.useCallback)(
64103
+ const onBarPointerDown = (0, import_react286.useCallback)(
63731
64104
  (task, e) => {
63732
64105
  if (e.button !== 0) return;
63733
64106
  beginDrag(
@@ -63745,7 +64118,7 @@ function useGanttDrag(opts) {
63745
64118
  },
63746
64119
  [beginDrag, timelineX, rowY]
63747
64120
  );
63748
- const onResizePointerDown = (0, import_react282.useCallback)(
64121
+ const onResizePointerDown = (0, import_react286.useCallback)(
63749
64122
  (task, edge, e) => {
63750
64123
  if (e.button !== 0) return;
63751
64124
  e.stopPropagation();
@@ -63764,7 +64137,7 @@ function useGanttDrag(opts) {
63764
64137
  },
63765
64138
  [beginDrag, timelineX, rowY]
63766
64139
  );
63767
- const onGripPointerDown = (0, import_react282.useCallback)(
64140
+ const onGripPointerDown = (0, import_react286.useCallback)(
63768
64141
  (_rowKey, task, e) => {
63769
64142
  if (e.button !== 0) return;
63770
64143
  const rowEl = e.currentTarget.closest(
@@ -63789,7 +64162,7 @@ function useGanttDrag(opts) {
63789
64162
  },
63790
64163
  [beginDrag, timelineX, rowY]
63791
64164
  );
63792
- const onLinkHandlePointerDown = (0, import_react282.useCallback)(
64165
+ const onLinkHandlePointerDown = (0, import_react286.useCallback)(
63793
64166
  (task, side, e, fromOffset = 0) => {
63794
64167
  if (e.button !== 0) return;
63795
64168
  e.stopPropagation();
@@ -63809,7 +64182,7 @@ function useGanttDrag(opts) {
63809
64182
  },
63810
64183
  [beginDrag, timelineX, rowY]
63811
64184
  );
63812
- const onProgressPointerDown = (0, import_react282.useCallback)(
64185
+ const onProgressPointerDown = (0, import_react286.useCallback)(
63813
64186
  (task, e) => {
63814
64187
  if (e.button !== 0) return;
63815
64188
  e.stopPropagation();
@@ -63827,7 +64200,7 @@ function useGanttDrag(opts) {
63827
64200
  },
63828
64201
  [beginDrag, timelineX, rowY]
63829
64202
  );
63830
- const rubber = (0, import_react282.useMemo)(() => {
64203
+ const rubber = (0, import_react286.useMemo)(() => {
63831
64204
  if (!drag || drag.kind !== "link") return null;
63832
64205
  const source = barGeom(drag.taskId);
63833
64206
  if (!source) return null;
@@ -63859,7 +64232,7 @@ function useGanttDrag(opts) {
63859
64232
  }
63860
64233
 
63861
64234
  // src/components/Gantt/Gantt.tsx
63862
- var import_jsx_runtime307 = require("react/jsx-runtime");
64235
+ var import_jsx_runtime313 = require("react/jsx-runtime");
63863
64236
  var HEADER_HEIGHT = 52;
63864
64237
  var GRIP_WIDTH = 36;
63865
64238
  var DEFAULT_COLUMNS = [
@@ -63918,7 +64291,7 @@ var Gantt = ({
63918
64291
  const t = useKitT();
63919
64292
  const kitEngine = useKitEngine();
63920
64293
  const dateLocale = locale ?? kitEngine.locale;
63921
- const allLabels = (0, import_react283.useMemo)(
64294
+ const allLabels = (0, import_react287.useMemo)(
63922
64295
  () => ({
63923
64296
  loading: t("kit.gantt.loading"),
63924
64297
  empty: t("kit.gantt.empty"),
@@ -63941,10 +64314,10 @@ var Gantt = ({
63941
64314
  title: c.key === "name" ? allLabels.task : c.key === "owner" ? t("kit.gantt.colOwner") : t("kit.gantt.colProgress")
63942
64315
  }));
63943
64316
  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);
64317
+ const surfaceText = (0, import_react287.useMemo)(() => getSurfaceTextTokens(variant), [variant]);
64318
+ const [internalZoom, setInternalZoom] = (0, import_react287.useState)(initialZoom);
63946
64319
  const zoom = zoomProp ?? internalZoom;
63947
- const setZoom = (0, import_react283.useCallback)(
64320
+ const setZoom = (0, import_react287.useCallback)(
63948
64321
  (z) => {
63949
64322
  const clamped = Math.min(maxZoom, Math.max(minZoom, z));
63950
64323
  if (onZoomChange) onZoomChange(clamped);
@@ -63952,33 +64325,33 @@ var Gantt = ({
63952
64325
  },
63953
64326
  [minZoom, maxZoom, onZoomChange]
63954
64327
  );
63955
- const [internalSelection, setInternalSelection] = (0, import_react283.useState)(null);
64328
+ const [internalSelection, setInternalSelection] = (0, import_react287.useState)(null);
63956
64329
  const selectedId = selectedIdProp !== void 0 ? selectedIdProp : internalSelection;
63957
- const setSelected = (0, import_react283.useCallback)(
64330
+ const setSelected = (0, import_react287.useCallback)(
63958
64331
  (id) => {
63959
64332
  onSelect?.(id);
63960
64333
  if (selectedIdProp === void 0) setInternalSelection(id);
63961
64334
  },
63962
64335
  [onSelect, selectedIdProp]
63963
64336
  );
63964
- const [internalOrder, setInternalOrder] = (0, import_react283.useState)(void 0);
64337
+ const [internalOrder, setInternalOrder] = (0, import_react287.useState)(void 0);
63965
64338
  const rowOrder = rowOrderProp ?? internalOrder;
63966
- const handleReorder = (0, import_react283.useCallback)(
64339
+ const handleReorder = (0, import_react287.useCallback)(
63967
64340
  (order) => {
63968
64341
  onReorder?.(order);
63969
64342
  if (rowOrderProp === void 0) setInternalOrder(order);
63970
64343
  },
63971
64344
  [onReorder, rowOrderProp]
63972
64345
  );
63973
- const [collapsed, setCollapsed] = (0, import_react283.useState)(
64346
+ const [collapsed, setCollapsed] = (0, import_react287.useState)(
63974
64347
  () => new Set(tasks.filter((t2) => t2.open === false).map((t2) => t2.id))
63975
64348
  );
63976
- const [closedLanes, setClosedLanes] = (0, import_react283.useState)(
64349
+ const [closedLanes, setClosedLanes] = (0, import_react287.useState)(
63977
64350
  () => new Set((lanes ?? []).filter((l) => l.open === false).map((l) => l.id))
63978
64351
  );
63979
- const tasksRef = (0, import_react283.useRef)(tasks);
63980
- const lanesRef = (0, import_react283.useRef)(lanes);
63981
- (0, import_react283.useEffect)(() => {
64352
+ const tasksRef = (0, import_react287.useRef)(tasks);
64353
+ const lanesRef = (0, import_react287.useRef)(lanes);
64354
+ (0, import_react287.useEffect)(() => {
63982
64355
  if (tasksRef.current !== tasks) {
63983
64356
  tasksRef.current = tasks;
63984
64357
  setCollapsed(new Set(tasks.filter((t2) => t2.open === false).map((t2) => t2.id)));
@@ -63988,7 +64361,7 @@ var Gantt = ({
63988
64361
  setClosedLanes(new Set((lanes ?? []).filter((l) => l.open === false).map((l) => l.id)));
63989
64362
  }
63990
64363
  }, [tasks, lanes]);
63991
- const toggleCollapse = (0, import_react283.useCallback)((taskId, isOpen) => {
64364
+ const toggleCollapse = (0, import_react287.useCallback)((taskId, isOpen) => {
63992
64365
  setCollapsed((prev) => {
63993
64366
  const next = new Set(prev);
63994
64367
  if (isOpen) next.add(taskId);
@@ -63996,7 +64369,7 @@ var Gantt = ({
63996
64369
  return next;
63997
64370
  });
63998
64371
  }, []);
63999
- const toggleLane = (0, import_react283.useCallback)((laneId, isOpen) => {
64372
+ const toggleLane = (0, import_react287.useCallback)((laneId, isOpen) => {
64000
64373
  setClosedLanes((prev) => {
64001
64374
  const next = new Set(prev);
64002
64375
  if (isOpen) next.add(laneId);
@@ -64004,37 +64377,37 @@ var Gantt = ({
64004
64377
  return next;
64005
64378
  });
64006
64379
  }, []);
64007
- const effectiveTasks = (0, import_react283.useMemo)(() => {
64380
+ const effectiveTasks = (0, import_react287.useMemo)(() => {
64008
64381
  let out = tasks;
64009
64382
  if (collapsed.size > 0) {
64010
64383
  out = out.map((t2) => collapsed.has(t2.id) ? { ...t2, open: false } : t2);
64011
64384
  }
64012
64385
  return out;
64013
64386
  }, [tasks, collapsed]);
64014
- const effectiveLanes = (0, import_react283.useMemo)(() => {
64387
+ const effectiveLanes = (0, import_react287.useMemo)(() => {
64015
64388
  if (closedLanes.size === 0) return lanes;
64016
64389
  return (lanes ?? []).map(
64017
64390
  (l) => closedLanes.has(l.id) ? { ...l, open: false } : l
64018
64391
  );
64019
64392
  }, [lanes, closedLanes]);
64020
- const committedModel = (0, import_react283.useMemo)(
64393
+ const committedModel = (0, import_react287.useMemo)(
64021
64394
  () => buildRows(effectiveTasks, effectiveLanes, rowOrder, rowHeight2),
64022
64395
  [effectiveTasks, effectiveLanes, rowOrder, rowHeight2]
64023
64396
  );
64024
- const range = (0, import_react283.useMemo)(() => {
64397
+ const range = (0, import_react287.useMemo)(() => {
64025
64398
  const starts = tasks.map((t2) => toMs(t2.start));
64026
64399
  const ends = tasks.map((t2) => toMs(t2.end));
64027
64400
  return computeViewRange(starts, ends);
64028
64401
  }, [tasks]);
64029
64402
  const timelineWidth = rangeWidth(range.start, range.end, zoom);
64030
- const scaleLevels = (0, import_react283.useMemo)(
64403
+ const scaleLevels = (0, import_react287.useMemo)(
64031
64404
  () => buildTimeScale(range.start, range.end, zoom, dateLocale),
64032
64405
  [range, zoom, dateLocale]
64033
64406
  );
64034
- const [colWidths, setColWidths] = (0, import_react283.useState)(
64407
+ const [colWidths, setColWidths] = (0, import_react287.useState)(
64035
64408
  () => columnWidths ? { ...columnWidths } : {}
64036
64409
  );
64037
- (0, import_react283.useEffect)(() => {
64410
+ (0, import_react287.useEffect)(() => {
64038
64411
  if (!columnWidths) return;
64039
64412
  setColWidths((prev) => ({ ...prev, ...columnWidths }));
64040
64413
  }, [columnWidths]);
@@ -64044,21 +64417,21 @@ var Gantt = ({
64044
64417
  const m = /^(\d+(?:\.\d+)?)px$/.exec(col.width ?? "");
64045
64418
  return m ? Number(m[1]) : 160;
64046
64419
  };
64047
- const sizedColumns = (0, import_react283.useMemo)(
64420
+ const sizedColumns = (0, import_react287.useMemo)(
64048
64421
  () => resolvedColumns.map((c) => ({ ...c, width: `${effectiveColWidth(c)}px` })),
64049
64422
  [resolvedColumns, colWidths]
64050
64423
  );
64051
- const effectiveWidthsRef = (0, import_react283.useRef)({});
64424
+ const effectiveWidthsRef = (0, import_react287.useRef)({});
64052
64425
  effectiveWidthsRef.current = Object.fromEntries(
64053
64426
  sizedColumns.map((c) => [c.key, effectiveColWidth(c)])
64054
64427
  );
64055
- const leftWidth = (0, import_react283.useMemo)(
64428
+ const leftWidth = (0, import_react287.useMemo)(
64056
64429
  () => GRIP_WIDTH + resolvedColumns.reduce((sum, c) => sum + effectiveColWidth(c), 0),
64057
64430
  [resolvedColumns, colWidths]
64058
64431
  );
64059
- const resizingRef = (0, import_react283.useRef)(null);
64060
- const [resizingKey, setResizingKey] = (0, import_react283.useState)(null);
64061
- const startColumnResize = (0, import_react283.useCallback)(
64432
+ const resizingRef = (0, import_react287.useRef)(null);
64433
+ const [resizingKey, setResizingKey] = (0, import_react287.useState)(null);
64434
+ const startColumnResize = (0, import_react287.useCallback)(
64062
64435
  (e, key) => {
64063
64436
  if (e.button !== 0) return;
64064
64437
  e.preventDefault();
@@ -64089,23 +64462,23 @@ var Gantt = ({
64089
64462
  },
64090
64463
  [onColumnWidthChange]
64091
64464
  );
64092
- (0, import_react283.useEffect)(
64465
+ (0, import_react287.useEffect)(
64093
64466
  () => () => {
64094
64467
  document.body.style.cursor = "";
64095
64468
  document.body.style.userSelect = "";
64096
64469
  },
64097
64470
  []
64098
64471
  );
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)(() => {
64472
+ const scrollRef = (0, import_react287.useRef)(null);
64473
+ const overlayRef = (0, import_react287.useRef)(null);
64474
+ const rootRef = (0, import_react287.useRef)(null);
64475
+ const headerScaleRef = (0, import_react287.useRef)(null);
64476
+ const syncHeaderScale = (0, import_react287.useCallback)(() => {
64104
64477
  const s = scrollRef.current;
64105
64478
  const h = headerScaleRef.current;
64106
64479
  if (s && h) h.style.transform = `translateX(${-s.scrollLeft}px)`;
64107
64480
  }, []);
64108
- const zoomBy = (0, import_react283.useCallback)(
64481
+ const zoomBy = (0, import_react287.useCallback)(
64109
64482
  (factor, pointerClientX) => {
64110
64483
  const el = scrollRef.current;
64111
64484
  const next = Math.min(maxZoom, Math.max(minZoom, zoom * factor));
@@ -64124,7 +64497,7 @@ var Gantt = ({
64124
64497
  },
64125
64498
  [zoom, minZoom, maxZoom, leftWidth, setZoom]
64126
64499
  );
64127
- (0, import_react283.useEffect)(() => {
64500
+ (0, import_react287.useEffect)(() => {
64128
64501
  const el = scrollRef.current;
64129
64502
  if (!el) return;
64130
64503
  const onWheel = (e) => {
@@ -64136,10 +64509,10 @@ var Gantt = ({
64136
64509
  el.addEventListener("wheel", onWheel, { passive: false });
64137
64510
  return () => el.removeEventListener("wheel", onWheel);
64138
64511
  }, [zoomBy]);
64139
- (0, import_react283.useEffect)(() => {
64512
+ (0, import_react287.useEffect)(() => {
64140
64513
  syncHeaderScale();
64141
64514
  }, [syncHeaderScale, timelineWidth, zoom, range.start, leftWidth]);
64142
- const liveRowsRef = (0, import_react283.useRef)(null);
64515
+ const liveRowsRef = (0, import_react287.useRef)(null);
64143
64516
  const dragApi = useGanttDrag({
64144
64517
  scrollRef,
64145
64518
  overlayRef,
@@ -64161,12 +64534,12 @@ var Gantt = ({
64161
64534
  rowOrder,
64162
64535
  setSelected
64163
64536
  });
64164
- const liveReorder = (0, import_react283.useMemo)(() => {
64537
+ const liveReorder = (0, import_react287.useMemo)(() => {
64165
64538
  const d = dragApi.drag;
64166
64539
  if (d?.kind !== "reorder" || d.beforeId === void 0) return null;
64167
64540
  return applyRowReorder(effectiveTasks, d.taskId, d.beforeId, rowOrder);
64168
64541
  }, [dragApi.drag, effectiveTasks, rowOrder]);
64169
- const liveModel = (0, import_react283.useMemo)(
64542
+ const liveModel = (0, import_react287.useMemo)(
64170
64543
  () => liveReorder ? buildRows(
64171
64544
  liveReorder.tasks,
64172
64545
  effectiveLanes,
@@ -64176,7 +64549,7 @@ var Gantt = ({
64176
64549
  [liveReorder, effectiveLanes, rowHeight2, committedModel]
64177
64550
  );
64178
64551
  liveRowsRef.current = liveModel.rows;
64179
- const bars = (0, import_react283.useMemo)(() => {
64552
+ const bars = (0, import_react287.useMemo)(() => {
64180
64553
  const map = /* @__PURE__ */ new Map();
64181
64554
  for (const row of liveModel.rows) {
64182
64555
  if (!row.task) continue;
@@ -64198,7 +64571,7 @@ var Gantt = ({
64198
64571
  return map;
64199
64572
  }, [liveModel.rows, range, zoom]);
64200
64573
  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)(
64574
+ const onBarKeyDown = (0, import_react287.useCallback)(
64202
64575
  (e, task) => {
64203
64576
  if (!interactive || task.locked || !onTasksChange) return;
64204
64577
  const stepMs = snap2 === "hour" ? 36e5 : snap2 === "week" ? 7 * MS_PER_DAY : MS_PER_DAY;
@@ -64243,7 +64616,7 @@ var Gantt = ({
64243
64616
  },
64244
64617
  [interactive, snap2, tasks, onTasksChange, setSelected]
64245
64618
  );
64246
- const deleteSelectedLink = (0, import_react283.useCallback)(() => {
64619
+ const deleteSelectedLink = (0, import_react287.useCallback)(() => {
64247
64620
  const sel = dragApi.linkSelected;
64248
64621
  if (!sel || !interactive || !onLinksChange) return;
64249
64622
  const key = (l) => l.id ?? `${l.source}~${l.target}~${l.type ?? "fs"}`;
@@ -64251,7 +64624,7 @@ var Gantt = ({
64251
64624
  onLinksChange(links.filter((l) => key(l) !== selKey));
64252
64625
  dragApi.setLinkSelected(null);
64253
64626
  }, [dragApi, links, interactive, onLinksChange]);
64254
- const moveSelection = (0, import_react283.useCallback)(
64627
+ const moveSelection = (0, import_react287.useCallback)(
64255
64628
  (where) => {
64256
64629
  const rows = liveModel.rows;
64257
64630
  if (!rows.length) return;
@@ -64264,7 +64637,7 @@ var Gantt = ({
64264
64637
  },
64265
64638
  [liveModel.rows, selectedId, setSelected]
64266
64639
  );
64267
- const onRootKeyDown = (0, import_react283.useCallback)(
64640
+ const onRootKeyDown = (0, import_react287.useCallback)(
64268
64641
  (e) => {
64269
64642
  if (dragApi.linkSelected) {
64270
64643
  if (e.key === "Escape") {
@@ -64310,14 +64683,14 @@ var Gantt = ({
64310
64683
  },
64311
64684
  [dragApi, deleteSelectedLink, moveSelection, setZoom, zoom]
64312
64685
  );
64313
- const handleSelectLink = (0, import_react283.useCallback)(
64686
+ const handleSelectLink = (0, import_react287.useCallback)(
64314
64687
  (link) => {
64315
64688
  dragApi.setLinkSelected(link);
64316
64689
  if (link) rootRef.current?.focus();
64317
64690
  },
64318
64691
  [dragApi]
64319
64692
  );
64320
- const handleRootPointerDown = (0, import_react283.useCallback)(
64693
+ const handleRootPointerDown = (0, import_react287.useCallback)(
64321
64694
  (e) => {
64322
64695
  if (e.target.closest?.("[data-gantt-keep-link-selection]")) return;
64323
64696
  if (dragApi.linkSelected) dragApi.setLinkSelected(null);
@@ -64332,22 +64705,22 @@ var Gantt = ({
64332
64705
  const drag = dragApi.drag;
64333
64706
  const dragTask = drag?.taskId ? committedModel.tasksById.get(drag.taskId) : void 0;
64334
64707
  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)(() => {
64708
+ const dragSubtree = (0, import_react287.useMemo)(() => {
64336
64709
  if (dragApi.drag?.kind !== "reorder") return null;
64337
64710
  return reorderDragSubtree(
64338
64711
  liveModel.rows,
64339
64712
  `task:${dragApi.drag.taskId}`
64340
64713
  );
64341
64714
  }, [dragApi.drag, liveModel.rows]);
64342
- const dragSubtreeKeys = (0, import_react283.useMemo)(
64715
+ const dragSubtreeKeys = (0, import_react287.useMemo)(
64343
64716
  () => new Set((dragSubtree ?? []).map((r) => r.key)),
64344
64717
  [dragSubtree]
64345
64718
  );
64346
- const dragSubtreeHeight = (0, import_react283.useMemo)(
64719
+ const dragSubtreeHeight = (0, import_react287.useMemo)(
64347
64720
  () => (dragSubtree ?? []).reduce((sum, r) => sum + r.height, 0),
64348
64721
  [dragSubtree]
64349
64722
  );
64350
- const liveDragDates = (0, import_react283.useMemo)(() => {
64723
+ const liveDragDates = (0, import_react287.useMemo)(() => {
64351
64724
  if (!drag || !dragTask) return null;
64352
64725
  if (drag.kind !== "move" && drag.kind !== "resize-start" && drag.kind !== "resize-end") return null;
64353
64726
  return applyDragDates(
@@ -64358,7 +64731,7 @@ var Gantt = ({
64358
64731
  );
64359
64732
  }, [drag, dragTask, zoom, snap2]);
64360
64733
  const liveDragProgress = drag?.kind === "progress" && drag.liveProgress != null ? drag.liveProgress : null;
64361
- const dragOverride = (0, import_react283.useMemo)(() => {
64734
+ const dragOverride = (0, import_react287.useMemo)(() => {
64362
64735
  if (!drag || !dragTask) return null;
64363
64736
  if (drag.kind === "progress" && drag.liveProgress != null) {
64364
64737
  return { ...dragTask, progress: drag.liveProgress };
@@ -64368,11 +64741,11 @@ var Gantt = ({
64368
64741
  }
64369
64742
  return null;
64370
64743
  }, [drag, dragTask, liveDragDates]);
64371
- const liveLaneProgress = (0, import_react283.useMemo)(
64744
+ const liveLaneProgress = (0, import_react287.useMemo)(
64372
64745
  () => dragOverride && dragTask ? laneRollupProgress(effectiveTasks, dragTask.id, dragOverride) : null,
64373
64746
  [dragOverride, dragTask, effectiveTasks]
64374
64747
  );
64375
- const liveGroupProgress = (0, import_react283.useMemo)(() => {
64748
+ const liveGroupProgress = (0, import_react287.useMemo)(() => {
64376
64749
  if (!dragOverride || !dragTask) return null;
64377
64750
  const byId = new Map(effectiveTasks.map((t2) => [t2.id, t2]));
64378
64751
  const m = /* @__PURE__ */ new Map();
@@ -64384,7 +64757,7 @@ var Gantt = ({
64384
64757
  }
64385
64758
  return m.size > 0 ? m : null;
64386
64759
  }, [dragOverride, dragTask, effectiveTasks]);
64387
- const liveLinkBars = (0, import_react283.useMemo)(() => {
64760
+ const liveLinkBars = (0, import_react287.useMemo)(() => {
64388
64761
  if (!liveDragDates || !dragTask) return bars;
64389
64762
  const g = bars.get(dragTask.id);
64390
64763
  if (!g) return bars;
@@ -64393,12 +64766,12 @@ var Gantt = ({
64393
64766
  if (left === g.left && width === g.width) return bars;
64394
64767
  return new Map(bars).set(dragTask.id, { ...g, left, width });
64395
64768
  }, [bars, liveDragDates, dragTask, range, zoom]);
64396
- const linkPaths = (0, import_react283.useMemo)(
64769
+ const linkPaths = (0, import_react287.useMemo)(
64397
64770
  () => computeLinkPaths(links, liveLinkBars, color),
64398
64771
  [links, liveLinkBars, color]
64399
64772
  );
64400
- const linkFan = (0, import_react283.useMemo)(() => computeLinkFanOffsets(links, bars), [links, bars]);
64401
- return /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64773
+ const linkFan = (0, import_react287.useMemo)(() => computeLinkFanOffsets(links, bars), [links, bars]);
64774
+ return /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64402
64775
  Panel_default,
64403
64776
  {
64404
64777
  ref: rootRef,
@@ -64416,31 +64789,31 @@ var Gantt = ({
64416
64789
  "aria-label": t("kit.gantt.root"),
64417
64790
  onKeyDown: onRootKeyDown,
64418
64791
  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)(
64792
+ children: /* @__PURE__ */ (0, import_jsx_runtime313.jsxs)("div", { className: "flex h-full min-h-0 flex-col", children: [
64793
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsxs)(
64421
64794
  "div",
64422
64795
  {
64423
- className: (0, import_classnames117.default)(
64796
+ className: (0, import_classnames122.default)(
64424
64797
  "flex shrink-0 items-center gap-3 border-b px-4 py-3",
64425
64798
  surfaceText.divider
64426
64799
  ),
64427
64800
  children: [
64428
- hasNode(icon) && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64801
+ hasNode(icon) && /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64429
64802
  "div",
64430
64803
  {
64431
- className: (0, import_classnames117.default)(
64804
+ className: (0, import_classnames122.default)(
64432
64805
  "flex h-10 w-10 shrink-0 items-center justify-center rounded-xl",
64433
64806
  getSurfaceVariantClasses(variant, "neutral")
64434
64807
  ),
64435
64808
  children: icon
64436
64809
  }
64437
64810
  ),
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 })
64811
+ (title != null || subtitle != null) && /* @__PURE__ */ (0, import_jsx_runtime313.jsxs)("div", { className: "min-w-0 flex-1", children: [
64812
+ subtitle != null && /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("div", { className: "truncate text-[11px] font-semibold uppercase tracking-wider text-neutral-500 dark:text-neutral-400", children: subtitle }),
64813
+ title != null && /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("div", { className: "truncate text-lg font-semibold text-neutral-900 dark:text-white", children: title })
64441
64814
  ] }),
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)(
64815
+ hasNode(actions) && /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("div", { className: "flex shrink-0 items-center gap-2", children: actions }),
64816
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("div", { className: "ml-auto shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64444
64817
  GanttToolbar,
64445
64818
  {
64446
64819
  variant,
@@ -64453,31 +64826,31 @@ var Gantt = ({
64453
64826
  ]
64454
64827
  }
64455
64828
  ),
64456
- /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)(
64829
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsxs)(
64457
64830
  "div",
64458
64831
  {
64459
- className: (0, import_classnames117.default)(
64832
+ className: (0, import_classnames122.default)(
64460
64833
  "relative flex shrink-0 items-stretch border-b",
64461
64834
  surfaceText.divider
64462
64835
  ),
64463
64836
  style: { height: HEADER_HEIGHT },
64464
64837
  children: [
64465
- /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)(
64838
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsxs)(
64466
64839
  "div",
64467
64840
  {
64468
- className: (0, import_classnames117.default)(
64841
+ className: (0, import_classnames122.default)(
64469
64842
  "flex items-stretch border-r bg-white dark:bg-neutral-900",
64470
64843
  surfaceText.divider
64471
64844
  ),
64472
64845
  style: { width: leftWidth },
64473
64846
  children: [
64474
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { className: "w-9 shrink-0" }),
64847
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("div", { className: "w-9 shrink-0" }),
64475
64848
  sizedColumns.map((col) => {
64476
64849
  const resizable = resizableColumns && col.resizable !== false;
64477
- return /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)(
64850
+ return /* @__PURE__ */ (0, import_jsx_runtime313.jsxs)(
64478
64851
  "div",
64479
64852
  {
64480
- className: (0, import_classnames117.default)(
64853
+ className: (0, import_classnames122.default)(
64481
64854
  "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
64855
  surfaceText.divider
64483
64856
  ),
@@ -64486,7 +64859,7 @@ var Gantt = ({
64486
64859
  justifyContent: col.align === "center" ? "center" : col.align === "right" ? "flex-end" : "flex-start"
64487
64860
  },
64488
64861
  children: [
64489
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("span", { className: "truncate", children: col.title }),
64862
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("span", { className: "truncate", children: col.title }),
64490
64863
  resizable && /* Resize handle — Table's header-edge pattern: an 8px hit
64491
64864
  area whose 1px line sits exactly on the column border.
64492
64865
  Absolute insets stop at the padding edge (1px inside
@@ -64495,7 +64868,7 @@ var Gantt = ({
64495
64868
  the border's own pixel. The cell carries no
64496
64869
  overflow-hidden so the line can paint over the border
64497
64870
  (the title span truncates itself). */
64498
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64871
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64499
64872
  "div",
64500
64873
  {
64501
64874
  role: "separator",
@@ -64504,7 +64877,7 @@ var Gantt = ({
64504
64877
  className: "group/rh absolute inset-y-0 -right-px z-10 flex w-2 cursor-col-resize select-none items-stretch justify-end",
64505
64878
  onPointerDown: (e) => startColumnResize(e, col.key),
64506
64879
  title: t("kit.gantt.resizeColumn", { column: col.title }),
64507
- children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64880
+ children: /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64508
64881
  "div",
64509
64882
  {
64510
64883
  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 +64894,30 @@ var Gantt = ({
64521
64894
  ]
64522
64895
  }
64523
64896
  ),
64524
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { className: "relative min-w-0 flex-1 overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)(
64897
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("div", { className: "relative min-w-0 flex-1 overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime313.jsxs)(
64525
64898
  "div",
64526
64899
  {
64527
64900
  ref: headerScaleRef,
64528
64901
  className: "relative h-full",
64529
64902
  style: { width: timelineWidth },
64530
64903
  children: [
64531
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(GanttScale, { levels: scaleLevels, height: HEADER_HEIGHT }),
64532
- todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64904
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(GanttScale, { levels: scaleLevels, height: HEADER_HEIGHT }),
64905
+ todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64533
64906
  "div",
64534
64907
  {
64535
- className: (0, import_classnames117.default)(
64908
+ className: (0, import_classnames122.default)(
64536
64909
  "pointer-events-none absolute inset-y-0 z-[1] border-l-2",
64537
64910
  todayTokens.line
64538
64911
  ),
64539
64912
  style: { left: todayX }
64540
64913
  }
64541
64914
  ),
64542
- todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64915
+ todayVisible && !loading && !isEmpty2 && /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64543
64916
  "div",
64544
64917
  {
64545
64918
  className: "pointer-events-none absolute top-1 z-10 -translate-x-1/2",
64546
64919
  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 })
64920
+ children: /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("span", { className: (0, import_classnames122.default)("rounded-full px-2 py-0.5 text-[10px] font-semibold text-white shadow-sm", todayTokens.chip), children: allLabels.today })
64548
64921
  }
64549
64922
  )
64550
64923
  ]
@@ -64553,20 +64926,20 @@ var Gantt = ({
64553
64926
  ]
64554
64927
  }
64555
64928
  ),
64556
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64929
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64557
64930
  "div",
64558
64931
  {
64559
64932
  ref: scrollRef,
64560
64933
  className: `gantt-scroller min-h-0 flex-1 overflow-auto overscroll-contain [&::-webkit-scrollbar]:h-1.5 ${THIN_SCROLLBAR}`,
64561
64934
  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)(
64935
+ children: /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("div", { style: { width: leftWidth + timelineWidth + LINK_RIGHT_GUTTER, minWidth: "100%" }, children: loading ? /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(GanttSkeleton, { rows: 12, rowHeight: rowHeight2, leftWidth }) : isEmpty2 ? /* @__PURE__ */ (0, import_jsx_runtime313.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_runtime313.jsxs)("div", { className: "relative", style: { height: bodyHeight }, children: [
64936
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsxs)(
64564
64937
  "div",
64565
64938
  {
64566
64939
  className: "pointer-events-none absolute inset-y-0 z-0",
64567
64940
  style: { left: leftWidth, width: timelineWidth },
64568
64941
  children: [
64569
- scaleLevels.length > 0 && scaleLevels[scaleLevels.length - 1].columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64942
+ scaleLevels.length > 0 && scaleLevels[scaleLevels.length - 1].columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64570
64943
  "div",
64571
64944
  {
64572
64945
  className: "absolute inset-y-0 border-r border-neutral-100 dark:border-neutral-800",
@@ -64574,10 +64947,10 @@ var Gantt = ({
64574
64947
  },
64575
64948
  c.id
64576
64949
  )),
64577
- todayVisible && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64950
+ todayVisible && /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64578
64951
  "div",
64579
64952
  {
64580
- className: (0, import_classnames117.default)("absolute inset-y-0 border-l-2", todayTokens.line),
64953
+ className: (0, import_classnames122.default)("absolute inset-y-0 border-l-2", todayTokens.line),
64581
64954
  style: { left: todayX }
64582
64955
  }
64583
64956
  )
@@ -64587,7 +64960,7 @@ var Gantt = ({
64587
64960
  liveModel.rows.map((row) => {
64588
64961
  const isDragSource = drag?.kind === "reorder" && row.task != null && row.task.id === drag.taskId;
64589
64962
  if (isDragSource) {
64590
- return /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64963
+ return /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64591
64964
  "div",
64592
64965
  {
64593
64966
  "data-row-key": row.key,
@@ -64595,7 +64968,7 @@ var Gantt = ({
64595
64968
  "aria-hidden": "true",
64596
64969
  className: "pointer-events-none flex border-b",
64597
64970
  style: { height: dragSubtreeHeight || row.height },
64598
- children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64971
+ children: /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64599
64972
  "div",
64600
64973
  {
64601
64974
  className: "m-1 flex-1 rounded-md border-2 border-dashed",
@@ -64612,7 +64985,7 @@ var Gantt = ({
64612
64985
  if (drag?.kind === "reorder" && dragSubtreeKeys.has(row.key)) {
64613
64986
  return null;
64614
64987
  }
64615
- return /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
64988
+ return /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64616
64989
  GanttBodyRow,
64617
64990
  {
64618
64991
  row,
@@ -64650,7 +65023,7 @@ var Gantt = ({
64650
65023
  row.key
64651
65024
  );
64652
65025
  }),
64653
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65026
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64654
65027
  GanttLinkLayer,
64655
65028
  {
64656
65029
  ref: overlayRef,
@@ -64666,7 +65039,7 @@ var Gantt = ({
64666
65039
  onDeleteLink: interactive && onLinksChange ? deleteSelectedLink : void 0
64667
65040
  }
64668
65041
  ),
64669
- drag?.kind === "reorder" && reorderLineY != null && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65042
+ drag?.kind === "reorder" && reorderLineY != null && /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64670
65043
  "div",
64671
65044
  {
64672
65045
  className: "pointer-events-none absolute z-30 h-0.5 rounded-full",
@@ -64686,7 +65059,7 @@ var Gantt = ({
64686
65059
  // there is no filtered/overflowing ancestor and the fixed
64687
65060
  // clone always tracks the viewport pointer.
64688
65061
  (0, import_react_dom15.createPortal)(
64689
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65062
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64690
65063
  "div",
64691
65064
  {
64692
65065
  "data-gantt-drag-clone": "true",
@@ -64697,14 +65070,14 @@ var Gantt = ({
64697
65070
  top: drag.clientY - (drag.grabOffset?.y ?? 0),
64698
65071
  width: leftWidth + timelineWidth + LINK_RIGHT_GUTTER
64699
65072
  },
64700
- children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65073
+ children: /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64701
65074
  "div",
64702
65075
  {
64703
65076
  className: "overflow-hidden rounded-lg bg-white/95 shadow-2xl backdrop-blur-sm dark:bg-neutral-900/95",
64704
65077
  style: {
64705
65078
  boxShadow: `0 8px 32px rgba(0, 0, 0, 0.28), inset 2px 0 0 var(--color-${color}-500)`
64706
65079
  },
64707
- children: dragSubtree.map((row) => /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65080
+ children: dragSubtree.map((row) => /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64708
65081
  GanttBodyRow,
64709
65082
  {
64710
65083
  row,
@@ -64747,7 +65120,7 @@ var Gantt = ({
64747
65120
  ),
64748
65121
  document.body
64749
65122
  ),
64750
- drag && drag.kind !== "reorder" && dragTask && liveDragDates && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65123
+ drag && drag.kind !== "reorder" && dragTask && liveDragDates && /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64751
65124
  "div",
64752
65125
  {
64753
65126
  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 +65151,13 @@ var GanttSkeleton = ({
64778
65151
  rows,
64779
65152
  rowHeight: rowHeight2,
64780
65153
  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)(
65154
+ }) => /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("div", { className: "animate-pulse", "aria-busy": "true", children: Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime313.jsxs)("div", { className: "flex", style: { height: rowHeight2 }, children: [
65155
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64783
65156
  "div",
64784
65157
  {
64785
65158
  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
65159
  style: { width: leftWidth },
64787
- children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65160
+ children: /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64788
65161
  "div",
64789
65162
  {
64790
65163
  className: "h-3 rounded-full bg-neutral-200 dark:bg-neutral-700",
@@ -64793,7 +65166,7 @@ var GanttSkeleton = ({
64793
65166
  )
64794
65167
  }
64795
65168
  ),
64796
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("div", { className: "relative flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
65169
+ /* @__PURE__ */ (0, import_jsx_runtime313.jsx)("div", { className: "relative flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime313.jsx)(
64797
65170
  "div",
64798
65171
  {
64799
65172
  className: "absolute top-1/2 h-4 -translate-y-1/2 rounded-md bg-neutral-200/80 dark:bg-neutral-700/60",
@@ -64806,11 +65179,11 @@ var GanttSkeleton = ({
64806
65179
  ] }, i)) });
64807
65180
 
64808
65181
  // src/contexts/BottomSheetContext.tsx
64809
- var import_react284 = require("react");
65182
+ var import_react288 = require("react");
64810
65183
  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);
65184
+ var import_classnames123 = __toESM(require("classnames"), 1);
65185
+ var import_jsx_runtime314 = require("react/jsx-runtime");
65186
+ var BottomSheetContext = (0, import_react288.createContext)(null);
64814
65187
  var TRANSITION_MS2 = 260;
64815
65188
  var renderSlot = (slot, controls) => {
64816
65189
  if (!slot) {
@@ -64821,13 +65194,13 @@ var renderSlot = (slot, controls) => {
64821
65194
  var BottomSheetProvider = ({
64822
65195
  children
64823
65196
  }) => {
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)(() => {
65197
+ const [sheet, setSheet] = (0, import_react288.useState)(null);
65198
+ const [isVisible, setIsVisible] = (0, import_react288.useState)(false);
65199
+ const pendingCloseRef = (0, import_react288.useRef)(null);
65200
+ const dismissSheet = (0, import_react288.useCallback)(() => {
64828
65201
  setIsVisible(false);
64829
65202
  }, []);
64830
- const presentSheet = (0, import_react284.useCallback)((options) => {
65203
+ const presentSheet = (0, import_react288.useCallback)((options) => {
64831
65204
  if (pendingCloseRef.current) {
64832
65205
  clearTimeout(pendingCloseRef.current);
64833
65206
  pendingCloseRef.current = null;
@@ -64840,7 +65213,7 @@ var BottomSheetProvider = ({
64840
65213
  setTimeout(animateIn, 0);
64841
65214
  }
64842
65215
  }, []);
64843
- (0, import_react284.useEffect)(() => {
65216
+ (0, import_react288.useEffect)(() => {
64844
65217
  if (!isVisible && sheet) {
64845
65218
  pendingCloseRef.current = setTimeout(() => {
64846
65219
  sheet.onClose?.();
@@ -64855,7 +65228,7 @@ var BottomSheetProvider = ({
64855
65228
  }
64856
65229
  return void 0;
64857
65230
  }, [isVisible, sheet]);
64858
- (0, import_react284.useEffect)(
65231
+ (0, import_react288.useEffect)(
64859
65232
  () => () => {
64860
65233
  if (pendingCloseRef.current) {
64861
65234
  clearTimeout(pendingCloseRef.current);
@@ -64863,13 +65236,13 @@ var BottomSheetProvider = ({
64863
65236
  },
64864
65237
  []
64865
65238
  );
64866
- const controls = (0, import_react284.useMemo)(
65239
+ const controls = (0, import_react288.useMemo)(
64867
65240
  () => ({
64868
65241
  dismiss: dismissSheet
64869
65242
  }),
64870
65243
  [dismissSheet]
64871
65244
  );
64872
- const contextValue = (0, import_react284.useMemo)(
65245
+ const contextValue = (0, import_react288.useMemo)(
64873
65246
  () => ({
64874
65247
  presentSheet,
64875
65248
  dismissSheet,
@@ -64879,11 +65252,11 @@ var BottomSheetProvider = ({
64879
65252
  [presentSheet, dismissSheet, sheet, isVisible]
64880
65253
  );
64881
65254
  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)(
65255
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)("div", { className: "pointer-events-none fixed inset-0 z-[70] flex items-end justify-center", children: [
65256
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64884
65257
  "div",
64885
65258
  {
64886
- className: (0, import_classnames118.default)(
65259
+ className: (0, import_classnames123.default)(
64887
65260
  "absolute inset-0 bg-neutral-900/40 transition-opacity duration-300",
64888
65261
  isVisible ? "opacity-100 pointer-events-auto" : "opacity-0"
64889
65262
  ),
@@ -64893,24 +65266,24 @@ var BottomSheetProvider = ({
64893
65266
  }
64894
65267
  }
64895
65268
  ),
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)(
65269
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "relative w-full max-w-4xl px-4 pb-4 sm:px-8", children: /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(
64897
65270
  "section",
64898
65271
  {
64899
65272
  role: "dialog",
64900
65273
  "aria-modal": "true",
64901
- className: (0, import_classnames118.default)(
65274
+ className: (0, import_classnames123.default)(
64902
65275
  "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
65276
  sheet.className,
64904
65277
  isVisible ? "translate-y-0" : "translate-y-full"
64905
65278
  ),
64906
65279
  style: { minHeight: "25vh", maxHeight: "85vh" },
64907
65280
  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 })
65281
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)("header", { className: "flex items-start justify-between gap-3 border-b border-slate-200 px-6 py-4 dark:border-slate-800", children: [
65282
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)("div", { className: "space-y-1", children: [
65283
+ sheet.title && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "text-base font-semibold text-slate-900 dark:text-slate-100", children: sheet.title }),
65284
+ sheet.description && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("p", { className: "text-sm text-slate-500 dark:text-slate-300", children: sheet.description })
64912
65285
  ] }),
64913
- (sheet.showCloseButton ?? true) && /* @__PURE__ */ (0, import_jsx_runtime308.jsx)(
65286
+ (sheet.showCloseButton ?? true) && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
64914
65287
  IconButton_default,
64915
65288
  {
64916
65289
  icon: "Close",
@@ -64922,21 +65295,21 @@ var BottomSheetProvider = ({
64922
65295
  }
64923
65296
  )
64924
65297
  ] }),
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) })
65298
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "flex-1 overflow-y-auto px-6 py-4", children: renderSlot(sheet.content, controls) ?? /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("p", { className: "text-sm text-slate-500", children: "No content provided." }) }),
65299
+ sheet.actions && /* @__PURE__ */ (0, import_jsx_runtime314.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
65300
  ]
64928
65301
  }
64929
65302
  ) })
64930
65303
  ] }),
64931
65304
  document.body
64932
65305
  ) : null;
64933
- return /* @__PURE__ */ (0, import_jsx_runtime308.jsxs)(BottomSheetContext.Provider, { value: contextValue, children: [
65306
+ return /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(BottomSheetContext.Provider, { value: contextValue, children: [
64934
65307
  children,
64935
65308
  overlayNode
64936
65309
  ] });
64937
65310
  };
64938
65311
  var useBottomSheet = () => {
64939
- const context = (0, import_react284.useContext)(BottomSheetContext);
65312
+ const context = (0, import_react288.useContext)(BottomSheetContext);
64940
65313
  if (!context) {
64941
65314
  throw new Error("useBottomSheet must be used within a BottomSheetProvider");
64942
65315
  }
@@ -65570,8 +65943,8 @@ var SYSTEM_VARIABLES = [
65570
65943
  ];
65571
65944
 
65572
65945
  // src/components/MetricBar.tsx
65573
- var import_classnames119 = __toESM(require("classnames"), 1);
65574
- var import_jsx_runtime309 = require("react/jsx-runtime");
65946
+ var import_classnames124 = __toESM(require("classnames"), 1);
65947
+ var import_jsx_runtime315 = require("react/jsx-runtime");
65575
65948
  var MetricBar = ({
65576
65949
  label,
65577
65950
  value,
@@ -65581,7 +65954,7 @@ var MetricBar = ({
65581
65954
  size = "sm",
65582
65955
  className,
65583
65956
  ...rest
65584
- }) => /* @__PURE__ */ (0, import_jsx_runtime309.jsx)(
65957
+ }) => /* @__PURE__ */ (0, import_jsx_runtime315.jsx)(
65585
65958
  Progress_default,
65586
65959
  {
65587
65960
  ...rest,
@@ -65591,7 +65964,7 @@ var MetricBar = ({
65591
65964
  formatValue: value !== void 0 ? () => String(value) : void 0,
65592
65965
  size,
65593
65966
  color: tone ?? color ?? "blue",
65594
- className: (0, import_classnames119.default)("w-full", className)
65967
+ className: (0, import_classnames124.default)("w-full", className)
65595
65968
  }
65596
65969
  );
65597
65970
  MetricBar.displayName = "MetricBar";
@@ -65913,6 +66286,9 @@ MetricBar.displayName = "MetricBar";
65913
66286
  WorkflowRailSkeleton,
65914
66287
  WorkflowStatusNode,
65915
66288
  WorkflowTracker,
66289
+ WorkflowTrackerDetails,
66290
+ WorkflowTrackerRail,
66291
+ WorkflowTrackerStepDetails,
65916
66292
  areaPathFromPoints,
65917
66293
  bandAreaPath,
65918
66294
  buildColumns,