@almadar/ui 6.26.0 → 6.27.0

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.
@@ -34818,6 +34818,247 @@ var init_WizardNavigation = __esm({
34818
34818
  WizardNavigation.displayName = "WizardNavigation";
34819
34819
  }
34820
34820
  });
34821
+ function parseDay(value) {
34822
+ if (value === void 0 || value === null || value === "") return null;
34823
+ const d = value instanceof Date ? new Date(value.getTime()) : new Date(value);
34824
+ if (Number.isNaN(d.getTime())) return null;
34825
+ d.setHours(0, 0, 0, 0);
34826
+ return d;
34827
+ }
34828
+ function Gantt({
34829
+ tasks = [],
34830
+ links = [],
34831
+ titleField = "title",
34832
+ startField = "start",
34833
+ endField = "end",
34834
+ durationField,
34835
+ statusField = "status",
34836
+ groupField = "",
34837
+ rangeStart,
34838
+ rangeEnd,
34839
+ showToday = true,
34840
+ dayWidth = 28,
34841
+ barClickEvent,
34842
+ className,
34843
+ isLoading = false,
34844
+ error = null
34845
+ }) {
34846
+ const { t } = hooks.useTranslate();
34847
+ const placed = React96.useMemo(() => {
34848
+ const rows = Array.isArray(tasks) ? tasks : tasks ? [tasks] : [];
34849
+ const out = [];
34850
+ rows.forEach((row, idx) => {
34851
+ const start = parseDay(core.getNestedValue(row, startField));
34852
+ if (!start) return;
34853
+ let end = parseDay(core.getNestedValue(row, endField));
34854
+ if (!end && durationField) {
34855
+ const days2 = Number(core.getNestedValue(row, durationField));
34856
+ if (Number.isFinite(days2) && days2 > 0) {
34857
+ end = new Date(start.getTime() + days2 * DAY_MS);
34858
+ }
34859
+ }
34860
+ if (!end || end.getTime() < start.getTime()) end = new Date(start.getTime() + DAY_MS);
34861
+ out.push({
34862
+ row,
34863
+ id: String(row.id ?? idx),
34864
+ label: String(core.getNestedValue(row, titleField) ?? ""),
34865
+ status: String(core.getNestedValue(row, statusField) ?? "").toLowerCase(),
34866
+ group: groupField ? String(core.getNestedValue(row, groupField) ?? "") : "",
34867
+ start,
34868
+ end
34869
+ });
34870
+ });
34871
+ return out;
34872
+ }, [tasks, titleField, startField, endField, durationField, statusField, groupField]);
34873
+ const [axisStart, axisEnd] = React96.useMemo(() => {
34874
+ const lo = parseDay(rangeStart) ?? (placed.length ? new Date(Math.min(...placed.map((p) => p.start.getTime())) - 2 * DAY_MS) : new Date((/* @__PURE__ */ new Date()).setHours(0, 0, 0, 0)));
34875
+ const hi = parseDay(rangeEnd) ?? (placed.length ? new Date(Math.max(...placed.map((p) => p.end.getTime())) + 2 * DAY_MS) : new Date(lo.getTime() + 30 * DAY_MS));
34876
+ return hi.getTime() > lo.getTime() ? [lo, hi] : [lo, new Date(lo.getTime() + DAY_MS)];
34877
+ }, [rangeStart, rangeEnd, placed]);
34878
+ const totalDays = Math.round((axisEnd.getTime() - axisStart.getTime()) / DAY_MS);
34879
+ const chartWidth = totalDays * dayWidth;
34880
+ const dayOffset = (d) => (d.getTime() - axisStart.getTime()) / DAY_MS * dayWidth;
34881
+ const displayItems = React96.useMemo(() => {
34882
+ if (!groupField) return placed.map((task) => ({ kind: "task", task }));
34883
+ const items = [];
34884
+ const seen = /* @__PURE__ */ new Set();
34885
+ for (const task of placed) {
34886
+ if (!seen.has(task.group)) {
34887
+ seen.add(task.group);
34888
+ items.push({ kind: "group", label: task.group || "\u2014" });
34889
+ }
34890
+ items.push({ kind: "task", task });
34891
+ }
34892
+ return items;
34893
+ }, [placed, groupField]);
34894
+ const barGeometry = React96.useMemo(() => {
34895
+ const offset = (d) => (d.getTime() - axisStart.getTime()) / DAY_MS * dayWidth;
34896
+ const map = /* @__PURE__ */ new Map();
34897
+ displayItems.forEach((item, idx) => {
34898
+ if (item.kind !== "task") return;
34899
+ const x0 = offset(item.task.start);
34900
+ const x1 = Math.max(offset(item.task.end), x0 + dayWidth / 2);
34901
+ map.set(item.task.id, { x0, x1, y: HEADER_HEIGHT + idx * ROW_HEIGHT + ROW_HEIGHT / 2 });
34902
+ });
34903
+ return map;
34904
+ }, [displayItems, axisStart, dayWidth]);
34905
+ const days = React96.useMemo(() => {
34906
+ const out = [];
34907
+ for (let i = 0; i < totalDays; i++) out.push(new Date(axisStart.getTime() + i * DAY_MS));
34908
+ return out;
34909
+ }, [axisStart, totalDays]);
34910
+ const todayOffset = React96.useMemo(() => {
34911
+ const today = parseDay(/* @__PURE__ */ new Date());
34912
+ if (!today || today < axisStart || today > axisEnd) return null;
34913
+ return (today.getTime() - axisStart.getTime()) / DAY_MS * dayWidth;
34914
+ }, [axisStart, axisEnd, dayWidth]);
34915
+ if (isLoading) {
34916
+ return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: t("common.loading"), className });
34917
+ }
34918
+ if (error) {
34919
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("p-4", className), children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "error", children: error.message }) });
34920
+ }
34921
+ if (placed.length === 0) {
34922
+ return /* @__PURE__ */ jsxRuntime.jsx(
34923
+ EmptyState,
34924
+ {
34925
+ title: t("empty.noData"),
34926
+ className
34927
+ }
34928
+ );
34929
+ }
34930
+ return /* @__PURE__ */ jsxRuntime.jsx(
34931
+ Box,
34932
+ {
34933
+ className: cn("w-full overflow-auto rounded-md border border-border bg-card", className),
34934
+ children: /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "relative", style: { width: LABEL_WIDTH + chartWidth, minWidth: "100%" }, children: [
34935
+ /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "none", className: "sticky top-0 z-20 bg-card border-b border-border", style: { height: HEADER_HEIGHT }, children: [
34936
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "sticky left-0 z-10 shrink-0 bg-card border-r border-border", style: { width: LABEL_WIDTH, height: HEADER_HEIGHT } }),
34937
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "relative", style: { width: chartWidth, height: HEADER_HEIGHT }, children: days.map((day, i) => /* @__PURE__ */ jsxRuntime.jsx(
34938
+ Box,
34939
+ {
34940
+ className: cn(
34941
+ "absolute top-0 bottom-0 border-l border-border/50 flex items-end justify-center pb-1",
34942
+ day.getDay() === 0 || day.getDay() === 6 ? "bg-muted/40" : void 0
34943
+ ),
34944
+ style: { left: i * dayWidth, width: dayWidth },
34945
+ children: dayWidth >= 20 && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: day.getDate() })
34946
+ },
34947
+ i
34948
+ )) })
34949
+ ] }),
34950
+ /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "none", className: "relative", children: [
34951
+ displayItems.map(
34952
+ (item, idx) => item.kind === "group" ? /* @__PURE__ */ jsxRuntime.jsxs(
34953
+ HStack,
34954
+ {
34955
+ gap: "none",
34956
+ className: "border-b border-border bg-muted/30",
34957
+ style: { height: ROW_HEIGHT },
34958
+ children: [
34959
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "sticky left-0 z-10 shrink-0 bg-muted/30 px-3 flex items-center border-r border-border", style: { width: LABEL_WIDTH, height: ROW_HEIGHT }, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", children: item.label }) }),
34960
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { style: { width: chartWidth, height: ROW_HEIGHT } })
34961
+ ]
34962
+ },
34963
+ `g-${idx}`
34964
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(
34965
+ HStack,
34966
+ {
34967
+ gap: "none",
34968
+ className: "border-b border-border/50",
34969
+ style: { height: ROW_HEIGHT },
34970
+ children: [
34971
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "sticky left-0 z-10 shrink-0 bg-card px-3 flex items-center border-r border-border", style: { width: LABEL_WIDTH, height: ROW_HEIGHT }, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "truncate", children: item.task.label }) }),
34972
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "relative", style: { width: chartWidth, height: ROW_HEIGHT }, children: /* @__PURE__ */ jsxRuntime.jsx(
34973
+ Box,
34974
+ {
34975
+ className: cn(
34976
+ "absolute top-1/2 -translate-y-1/2 h-4 rounded-sm transition-colors",
34977
+ STATUS_BAR[item.task.status] ?? "bg-primary/80 hover:bg-primary",
34978
+ barClickEvent ? "cursor-pointer" : void 0
34979
+ ),
34980
+ style: {
34981
+ left: dayOffset(item.task.start),
34982
+ width: Math.max(dayOffset(item.task.end) - dayOffset(item.task.start), dayWidth / 2)
34983
+ },
34984
+ action: barClickEvent,
34985
+ actionPayload: { id: item.task.id }
34986
+ }
34987
+ ) })
34988
+ ]
34989
+ },
34990
+ item.task.id
34991
+ )
34992
+ ),
34993
+ links.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
34994
+ "svg",
34995
+ {
34996
+ className: "absolute pointer-events-none",
34997
+ style: { left: LABEL_WIDTH, top: 0 },
34998
+ width: chartWidth,
34999
+ height: HEADER_HEIGHT + displayItems.length * ROW_HEIGHT,
35000
+ children: [
35001
+ /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "gantt-arrow", markerWidth: "8", markerHeight: "8", refX: "7", refY: "4", orient: "auto", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M0,0 L8,4 L0,8 z", fill: "var(--muted-foreground, currentColor)" }) }) }),
35002
+ links.map((link, i) => {
35003
+ const from = barGeometry.get(link.from);
35004
+ const to = barGeometry.get(link.to);
35005
+ if (!from || !to) return null;
35006
+ const midX = from.x1 + Math.max(8, (to.x0 - from.x1) / 2);
35007
+ return /* @__PURE__ */ jsxRuntime.jsx(
35008
+ "path",
35009
+ {
35010
+ d: `M ${from.x1} ${from.y} L ${midX} ${from.y} L ${midX} ${to.y} L ${to.x0} ${to.y}`,
35011
+ fill: "none",
35012
+ stroke: "var(--muted-foreground, currentColor)",
35013
+ strokeWidth: 1.5,
35014
+ markerEnd: "url(#gantt-arrow)"
35015
+ },
35016
+ i
35017
+ );
35018
+ })
35019
+ ]
35020
+ }
35021
+ ),
35022
+ showToday && todayOffset !== null && /* @__PURE__ */ jsxRuntime.jsx(
35023
+ Box,
35024
+ {
35025
+ className: "absolute top-0 bottom-0 w-0.5 bg-error/70 pointer-events-none",
35026
+ style: { left: LABEL_WIDTH + todayOffset }
35027
+ }
35028
+ )
35029
+ ] })
35030
+ ] })
35031
+ }
35032
+ );
35033
+ }
35034
+ var DAY_MS, ROW_HEIGHT, HEADER_HEIGHT, LABEL_WIDTH, STATUS_BAR;
35035
+ var init_Gantt = __esm({
35036
+ "components/core/molecules/Gantt.tsx"() {
35037
+ "use client";
35038
+ init_cn();
35039
+ init_getNestedValue();
35040
+ init_Box();
35041
+ init_Stack();
35042
+ init_Typography();
35043
+ init_LoadingState();
35044
+ init_EmptyState();
35045
+ DAY_MS = 24 * 60 * 60 * 1e3;
35046
+ ROW_HEIGHT = 36;
35047
+ HEADER_HEIGHT = 44;
35048
+ LABEL_WIDTH = 192;
35049
+ STATUS_BAR = {
35050
+ complete: "bg-success/80 hover:bg-success",
35051
+ done: "bg-success/80 hover:bg-success",
35052
+ active: "bg-primary/80 hover:bg-primary",
35053
+ "in-progress": "bg-primary/80 hover:bg-primary",
35054
+ blocked: "bg-error/80 hover:bg-error",
35055
+ error: "bg-error/80 hover:bg-error",
35056
+ "at-risk": "bg-warning/80 hover:bg-warning",
35057
+ pending: "bg-muted-foreground/50 hover:bg-muted-foreground/70"
35058
+ };
35059
+ Gantt.displayName = "Gantt";
35060
+ }
35061
+ });
34821
35062
  var RepeatableFormSection;
34822
35063
  var init_RepeatableFormSection = __esm({
34823
35064
  "components/core/molecules/RepeatableFormSection.tsx"() {
@@ -53975,6 +54216,7 @@ var init_component_registry_generated = __esm({
53975
54216
  init_GameIcon();
53976
54217
  init_GameMenu();
53977
54218
  init_GameShell();
54219
+ init_Gantt();
53978
54220
  init_GenericAppTemplate();
53979
54221
  init_GeometricPattern();
53980
54222
  init_GradientDivider();
@@ -54254,6 +54496,7 @@ var init_component_registry_generated = __esm({
54254
54496
  "GameIcon": GameIcon,
54255
54497
  "GameMenu": GameMenu,
54256
54498
  "GameShell": GameShell,
54499
+ "Gantt": Gantt,
54257
54500
  "GenericAppTemplate": GenericAppTemplate,
54258
54501
  "GeometricPattern": GeometricPattern,
54259
54502
  "GradientDivider": GradientDivider,
package/dist/avl/index.js CHANGED
@@ -34742,6 +34742,247 @@ var init_WizardNavigation = __esm({
34742
34742
  WizardNavigation.displayName = "WizardNavigation";
34743
34743
  }
34744
34744
  });
34745
+ function parseDay(value) {
34746
+ if (value === void 0 || value === null || value === "") return null;
34747
+ const d = value instanceof Date ? new Date(value.getTime()) : new Date(value);
34748
+ if (Number.isNaN(d.getTime())) return null;
34749
+ d.setHours(0, 0, 0, 0);
34750
+ return d;
34751
+ }
34752
+ function Gantt({
34753
+ tasks = [],
34754
+ links = [],
34755
+ titleField = "title",
34756
+ startField = "start",
34757
+ endField = "end",
34758
+ durationField,
34759
+ statusField = "status",
34760
+ groupField = "",
34761
+ rangeStart,
34762
+ rangeEnd,
34763
+ showToday = true,
34764
+ dayWidth = 28,
34765
+ barClickEvent,
34766
+ className,
34767
+ isLoading = false,
34768
+ error = null
34769
+ }) {
34770
+ const { t } = useTranslate();
34771
+ const placed = useMemo(() => {
34772
+ const rows = Array.isArray(tasks) ? tasks : tasks ? [tasks] : [];
34773
+ const out = [];
34774
+ rows.forEach((row, idx) => {
34775
+ const start = parseDay(getNestedValue(row, startField));
34776
+ if (!start) return;
34777
+ let end = parseDay(getNestedValue(row, endField));
34778
+ if (!end && durationField) {
34779
+ const days2 = Number(getNestedValue(row, durationField));
34780
+ if (Number.isFinite(days2) && days2 > 0) {
34781
+ end = new Date(start.getTime() + days2 * DAY_MS);
34782
+ }
34783
+ }
34784
+ if (!end || end.getTime() < start.getTime()) end = new Date(start.getTime() + DAY_MS);
34785
+ out.push({
34786
+ row,
34787
+ id: String(row.id ?? idx),
34788
+ label: String(getNestedValue(row, titleField) ?? ""),
34789
+ status: String(getNestedValue(row, statusField) ?? "").toLowerCase(),
34790
+ group: groupField ? String(getNestedValue(row, groupField) ?? "") : "",
34791
+ start,
34792
+ end
34793
+ });
34794
+ });
34795
+ return out;
34796
+ }, [tasks, titleField, startField, endField, durationField, statusField, groupField]);
34797
+ const [axisStart, axisEnd] = useMemo(() => {
34798
+ const lo = parseDay(rangeStart) ?? (placed.length ? new Date(Math.min(...placed.map((p) => p.start.getTime())) - 2 * DAY_MS) : new Date((/* @__PURE__ */ new Date()).setHours(0, 0, 0, 0)));
34799
+ const hi = parseDay(rangeEnd) ?? (placed.length ? new Date(Math.max(...placed.map((p) => p.end.getTime())) + 2 * DAY_MS) : new Date(lo.getTime() + 30 * DAY_MS));
34800
+ return hi.getTime() > lo.getTime() ? [lo, hi] : [lo, new Date(lo.getTime() + DAY_MS)];
34801
+ }, [rangeStart, rangeEnd, placed]);
34802
+ const totalDays = Math.round((axisEnd.getTime() - axisStart.getTime()) / DAY_MS);
34803
+ const chartWidth = totalDays * dayWidth;
34804
+ const dayOffset = (d) => (d.getTime() - axisStart.getTime()) / DAY_MS * dayWidth;
34805
+ const displayItems = useMemo(() => {
34806
+ if (!groupField) return placed.map((task) => ({ kind: "task", task }));
34807
+ const items = [];
34808
+ const seen = /* @__PURE__ */ new Set();
34809
+ for (const task of placed) {
34810
+ if (!seen.has(task.group)) {
34811
+ seen.add(task.group);
34812
+ items.push({ kind: "group", label: task.group || "\u2014" });
34813
+ }
34814
+ items.push({ kind: "task", task });
34815
+ }
34816
+ return items;
34817
+ }, [placed, groupField]);
34818
+ const barGeometry = useMemo(() => {
34819
+ const offset = (d) => (d.getTime() - axisStart.getTime()) / DAY_MS * dayWidth;
34820
+ const map = /* @__PURE__ */ new Map();
34821
+ displayItems.forEach((item, idx) => {
34822
+ if (item.kind !== "task") return;
34823
+ const x0 = offset(item.task.start);
34824
+ const x1 = Math.max(offset(item.task.end), x0 + dayWidth / 2);
34825
+ map.set(item.task.id, { x0, x1, y: HEADER_HEIGHT + idx * ROW_HEIGHT + ROW_HEIGHT / 2 });
34826
+ });
34827
+ return map;
34828
+ }, [displayItems, axisStart, dayWidth]);
34829
+ const days = useMemo(() => {
34830
+ const out = [];
34831
+ for (let i = 0; i < totalDays; i++) out.push(new Date(axisStart.getTime() + i * DAY_MS));
34832
+ return out;
34833
+ }, [axisStart, totalDays]);
34834
+ const todayOffset = useMemo(() => {
34835
+ const today = parseDay(/* @__PURE__ */ new Date());
34836
+ if (!today || today < axisStart || today > axisEnd) return null;
34837
+ return (today.getTime() - axisStart.getTime()) / DAY_MS * dayWidth;
34838
+ }, [axisStart, axisEnd, dayWidth]);
34839
+ if (isLoading) {
34840
+ return /* @__PURE__ */ jsx(LoadingState, { message: t("common.loading"), className });
34841
+ }
34842
+ if (error) {
34843
+ return /* @__PURE__ */ jsx(Box, { className: cn("p-4", className), children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "error", children: error.message }) });
34844
+ }
34845
+ if (placed.length === 0) {
34846
+ return /* @__PURE__ */ jsx(
34847
+ EmptyState,
34848
+ {
34849
+ title: t("empty.noData"),
34850
+ className
34851
+ }
34852
+ );
34853
+ }
34854
+ return /* @__PURE__ */ jsx(
34855
+ Box,
34856
+ {
34857
+ className: cn("w-full overflow-auto rounded-md border border-border bg-card", className),
34858
+ children: /* @__PURE__ */ jsxs(Box, { className: "relative", style: { width: LABEL_WIDTH + chartWidth, minWidth: "100%" }, children: [
34859
+ /* @__PURE__ */ jsxs(HStack, { gap: "none", className: "sticky top-0 z-20 bg-card border-b border-border", style: { height: HEADER_HEIGHT }, children: [
34860
+ /* @__PURE__ */ jsx(Box, { className: "sticky left-0 z-10 shrink-0 bg-card border-r border-border", style: { width: LABEL_WIDTH, height: HEADER_HEIGHT } }),
34861
+ /* @__PURE__ */ jsx(Box, { className: "relative", style: { width: chartWidth, height: HEADER_HEIGHT }, children: days.map((day, i) => /* @__PURE__ */ jsx(
34862
+ Box,
34863
+ {
34864
+ className: cn(
34865
+ "absolute top-0 bottom-0 border-l border-border/50 flex items-end justify-center pb-1",
34866
+ day.getDay() === 0 || day.getDay() === 6 ? "bg-muted/40" : void 0
34867
+ ),
34868
+ style: { left: i * dayWidth, width: dayWidth },
34869
+ children: dayWidth >= 20 && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: day.getDate() })
34870
+ },
34871
+ i
34872
+ )) })
34873
+ ] }),
34874
+ /* @__PURE__ */ jsxs(VStack, { gap: "none", className: "relative", children: [
34875
+ displayItems.map(
34876
+ (item, idx) => item.kind === "group" ? /* @__PURE__ */ jsxs(
34877
+ HStack,
34878
+ {
34879
+ gap: "none",
34880
+ className: "border-b border-border bg-muted/30",
34881
+ style: { height: ROW_HEIGHT },
34882
+ children: [
34883
+ /* @__PURE__ */ jsx(Box, { className: "sticky left-0 z-10 shrink-0 bg-muted/30 px-3 flex items-center border-r border-border", style: { width: LABEL_WIDTH, height: ROW_HEIGHT }, children: /* @__PURE__ */ jsx(Typography, { variant: "caption", weight: "semibold", children: item.label }) }),
34884
+ /* @__PURE__ */ jsx(Box, { style: { width: chartWidth, height: ROW_HEIGHT } })
34885
+ ]
34886
+ },
34887
+ `g-${idx}`
34888
+ ) : /* @__PURE__ */ jsxs(
34889
+ HStack,
34890
+ {
34891
+ gap: "none",
34892
+ className: "border-b border-border/50",
34893
+ style: { height: ROW_HEIGHT },
34894
+ children: [
34895
+ /* @__PURE__ */ jsx(Box, { className: "sticky left-0 z-10 shrink-0 bg-card px-3 flex items-center border-r border-border", style: { width: LABEL_WIDTH, height: ROW_HEIGHT }, children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "truncate", children: item.task.label }) }),
34896
+ /* @__PURE__ */ jsx(Box, { className: "relative", style: { width: chartWidth, height: ROW_HEIGHT }, children: /* @__PURE__ */ jsx(
34897
+ Box,
34898
+ {
34899
+ className: cn(
34900
+ "absolute top-1/2 -translate-y-1/2 h-4 rounded-sm transition-colors",
34901
+ STATUS_BAR[item.task.status] ?? "bg-primary/80 hover:bg-primary",
34902
+ barClickEvent ? "cursor-pointer" : void 0
34903
+ ),
34904
+ style: {
34905
+ left: dayOffset(item.task.start),
34906
+ width: Math.max(dayOffset(item.task.end) - dayOffset(item.task.start), dayWidth / 2)
34907
+ },
34908
+ action: barClickEvent,
34909
+ actionPayload: { id: item.task.id }
34910
+ }
34911
+ ) })
34912
+ ]
34913
+ },
34914
+ item.task.id
34915
+ )
34916
+ ),
34917
+ links.length > 0 && /* @__PURE__ */ jsxs(
34918
+ "svg",
34919
+ {
34920
+ className: "absolute pointer-events-none",
34921
+ style: { left: LABEL_WIDTH, top: 0 },
34922
+ width: chartWidth,
34923
+ height: HEADER_HEIGHT + displayItems.length * ROW_HEIGHT,
34924
+ children: [
34925
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("marker", { id: "gantt-arrow", markerWidth: "8", markerHeight: "8", refX: "7", refY: "4", orient: "auto", children: /* @__PURE__ */ jsx("path", { d: "M0,0 L8,4 L0,8 z", fill: "var(--muted-foreground, currentColor)" }) }) }),
34926
+ links.map((link, i) => {
34927
+ const from = barGeometry.get(link.from);
34928
+ const to = barGeometry.get(link.to);
34929
+ if (!from || !to) return null;
34930
+ const midX = from.x1 + Math.max(8, (to.x0 - from.x1) / 2);
34931
+ return /* @__PURE__ */ jsx(
34932
+ "path",
34933
+ {
34934
+ d: `M ${from.x1} ${from.y} L ${midX} ${from.y} L ${midX} ${to.y} L ${to.x0} ${to.y}`,
34935
+ fill: "none",
34936
+ stroke: "var(--muted-foreground, currentColor)",
34937
+ strokeWidth: 1.5,
34938
+ markerEnd: "url(#gantt-arrow)"
34939
+ },
34940
+ i
34941
+ );
34942
+ })
34943
+ ]
34944
+ }
34945
+ ),
34946
+ showToday && todayOffset !== null && /* @__PURE__ */ jsx(
34947
+ Box,
34948
+ {
34949
+ className: "absolute top-0 bottom-0 w-0.5 bg-error/70 pointer-events-none",
34950
+ style: { left: LABEL_WIDTH + todayOffset }
34951
+ }
34952
+ )
34953
+ ] })
34954
+ ] })
34955
+ }
34956
+ );
34957
+ }
34958
+ var DAY_MS, ROW_HEIGHT, HEADER_HEIGHT, LABEL_WIDTH, STATUS_BAR;
34959
+ var init_Gantt = __esm({
34960
+ "components/core/molecules/Gantt.tsx"() {
34961
+ "use client";
34962
+ init_cn();
34963
+ init_getNestedValue();
34964
+ init_Box();
34965
+ init_Stack();
34966
+ init_Typography();
34967
+ init_LoadingState();
34968
+ init_EmptyState();
34969
+ DAY_MS = 24 * 60 * 60 * 1e3;
34970
+ ROW_HEIGHT = 36;
34971
+ HEADER_HEIGHT = 44;
34972
+ LABEL_WIDTH = 192;
34973
+ STATUS_BAR = {
34974
+ complete: "bg-success/80 hover:bg-success",
34975
+ done: "bg-success/80 hover:bg-success",
34976
+ active: "bg-primary/80 hover:bg-primary",
34977
+ "in-progress": "bg-primary/80 hover:bg-primary",
34978
+ blocked: "bg-error/80 hover:bg-error",
34979
+ error: "bg-error/80 hover:bg-error",
34980
+ "at-risk": "bg-warning/80 hover:bg-warning",
34981
+ pending: "bg-muted-foreground/50 hover:bg-muted-foreground/70"
34982
+ };
34983
+ Gantt.displayName = "Gantt";
34984
+ }
34985
+ });
34745
34986
  var RepeatableFormSection;
34746
34987
  var init_RepeatableFormSection = __esm({
34747
34988
  "components/core/molecules/RepeatableFormSection.tsx"() {
@@ -53899,6 +54140,7 @@ var init_component_registry_generated = __esm({
53899
54140
  init_GameIcon();
53900
54141
  init_GameMenu();
53901
54142
  init_GameShell();
54143
+ init_Gantt();
53902
54144
  init_GenericAppTemplate();
53903
54145
  init_GeometricPattern();
53904
54146
  init_GradientDivider();
@@ -54178,6 +54420,7 @@ var init_component_registry_generated = __esm({
54178
54420
  "GameIcon": GameIcon,
54179
54421
  "GameMenu": GameMenu,
54180
54422
  "GameShell": GameShell,
54423
+ "Gantt": Gantt,
54181
54424
  "GenericAppTemplate": GenericAppTemplate,
54182
54425
  "GeometricPattern": GeometricPattern,
54183
54426
  "GradientDivider": GradientDivider,