@trsys-tech/matrix-library 1.1.3 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/timeline/Timeline.d.ts +48 -7
- package/dist/components/timeline/Timeline.d.ts.map +1 -1
- package/dist/ganttchart.es.js +2 -2
- package/dist/ganttchart.es.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tabs.es.js +15 -15
- package/dist/tabs.es.js.map +1 -1
- package/dist/timeline.es.js +307 -161
- package/dist/timeline.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
export type TimelineStatus = "pending" | "active" | "completed" | "error";
|
|
3
|
-
|
|
3
|
+
/** Describes one step in the timeline's primary path. */
|
|
4
|
+
export type TimelineItem = {
|
|
5
|
+
/** Stable identifier for the step; branch origins reference this value. */
|
|
4
6
|
id: string;
|
|
7
|
+
/** Primary content displayed beside the step marker. */
|
|
5
8
|
label: React.ReactNode;
|
|
9
|
+
/** Optional content displayed above the step marker. */
|
|
6
10
|
superTitle?: React.ReactNode;
|
|
11
|
+
/** Optional secondary content displayed below the super title. */
|
|
7
12
|
superSubtitle?: React.ReactNode;
|
|
13
|
+
/** Optional supporting content displayed below the label. */
|
|
8
14
|
subData?: React.ReactNode;
|
|
9
15
|
/** Arbitrary content shown on the bottom row. */
|
|
10
16
|
footer?: React.ReactNode;
|
|
17
|
+
/** Lifecycle state used to determine the marker and connector appearance. */
|
|
11
18
|
status?: TimelineStatus;
|
|
12
19
|
/** Override the marker color (any CSS color). */
|
|
13
20
|
color?: string;
|
|
@@ -15,26 +22,60 @@ export interface TimelineItem {
|
|
|
15
22
|
connectorColor?: string | false;
|
|
16
23
|
/** Localized status announcement, independent of the visible label. */
|
|
17
24
|
statusLabel?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
25
|
+
};
|
|
26
|
+
/** Describes a secondary path that diverges from a primary timeline step. */
|
|
27
|
+
export type TimelineBranch = TimelineItem & {
|
|
20
28
|
/** ID of the main step from which this branch diverges. */
|
|
21
29
|
from: string;
|
|
22
30
|
/** Branch paths are explicitly controlled, independently of main steps. */
|
|
23
31
|
active?: boolean;
|
|
24
32
|
/** Used for the activated branch path and endpoint. */
|
|
25
33
|
activeColor?: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
34
|
+
};
|
|
35
|
+
/** Configuration and content props for the Timeline component. */
|
|
36
|
+
export type TimelineProps = Omit<React.HTMLAttributes<HTMLDivElement>, "children" | "title"> & {
|
|
37
|
+
/** Ordered steps in the timeline's primary path. */
|
|
28
38
|
items: readonly TimelineItem[];
|
|
39
|
+
/** Optional secondary paths that diverge from the primary path. */
|
|
29
40
|
branches?: readonly TimelineBranch[];
|
|
41
|
+
/** Optional heading rendered above the timeline. */
|
|
30
42
|
title?: React.ReactNode;
|
|
43
|
+
/** Shows a structure-preserving skeleton while timeline data is loading. */
|
|
44
|
+
loading?: boolean;
|
|
45
|
+
/** Visual scale of the timeline. */
|
|
46
|
+
size?: "sm" | "md" | "lg";
|
|
47
|
+
/** Color used for active markers and connectors. */
|
|
31
48
|
activeColor?: string;
|
|
49
|
+
/** Color used for completed markers and connectors. */
|
|
32
50
|
completedColor?: string;
|
|
51
|
+
/** Color used for error markers and active branches by default. */
|
|
33
52
|
errorColor?: string;
|
|
53
|
+
/** Color used for pending markers and inactive connectors. */
|
|
34
54
|
inactiveColor?: string;
|
|
35
55
|
/** Minimum column width in pixels; narrower containers scroll horizontally. */
|
|
36
56
|
minItemWidth?: number;
|
|
37
|
-
}
|
|
38
|
-
declare const Timeline: React.ForwardRefExoticComponent<
|
|
57
|
+
};
|
|
58
|
+
declare const Timeline: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "title" | "children"> & {
|
|
59
|
+
/** Ordered steps in the timeline's primary path. */
|
|
60
|
+
items: readonly TimelineItem[];
|
|
61
|
+
/** Optional secondary paths that diverge from the primary path. */
|
|
62
|
+
branches?: readonly TimelineBranch[];
|
|
63
|
+
/** Optional heading rendered above the timeline. */
|
|
64
|
+
title?: React.ReactNode;
|
|
65
|
+
/** Shows a structure-preserving skeleton while timeline data is loading. */
|
|
66
|
+
loading?: boolean;
|
|
67
|
+
/** Visual scale of the timeline. */
|
|
68
|
+
size?: "sm" | "md" | "lg";
|
|
69
|
+
/** Color used for active markers and connectors. */
|
|
70
|
+
activeColor?: string;
|
|
71
|
+
/** Color used for completed markers and connectors. */
|
|
72
|
+
completedColor?: string;
|
|
73
|
+
/** Color used for error markers and active branches by default. */
|
|
74
|
+
errorColor?: string;
|
|
75
|
+
/** Color used for pending markers and inactive connectors. */
|
|
76
|
+
inactiveColor?: string;
|
|
77
|
+
/** Minimum column width in pixels; narrower containers scroll horizontally. */
|
|
78
|
+
minItemWidth?: number;
|
|
79
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
39
80
|
export { Timeline };
|
|
40
81
|
//# sourceMappingURL=Timeline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Timeline.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/Timeline.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"Timeline.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/Timeline.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;AAE1E,yDAAyD;AACzD,MAAM,MAAM,YAAY,GAAG;IACzB,2EAA2E;IAC3E,EAAE,EAAE,MAAM,CAAC;IACX,wDAAwD;IACxD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,wDAAwD;IACxD,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,kEAAkE;IAClE,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,6DAA6D;IAC7D,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,iDAAiD;IACjD,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAChC,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG;IAC1C,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG;IAC7F,oDAAoD;IACpD,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACrC,oDAAoD;IACpD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAqHF,QAAA,MAAM,QAAQ;IAzIZ,oDAAoD;WAC7C,SAAS,YAAY,EAAE;IAC9B,mEAAmE;eACxD,SAAS,cAAc,EAAE;IACpC,oDAAoD;YAC5C,KAAK,CAAC,SAAS;IACvB,4EAA4E;cAClE,OAAO;IACjB,oCAAoC;WAC7B,IAAI,GAAG,IAAI,GAAG,IAAI;IACzB,oDAAoD;kBACtC,MAAM;IACpB,uDAAuD;qBACtC,MAAM;IACvB,mEAAmE;iBACtD,MAAM;IACnB,8DAA8D;oBAC9C,MAAM;IACtB,+EAA+E;mBAChE,MAAM;wCA6UtB,CAAC;AAGF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
package/dist/ganttchart.es.js
CHANGED
|
@@ -233,7 +233,7 @@ const be = {
|
|
|
233
233
|
/* @__PURE__ */ t(
|
|
234
234
|
"div",
|
|
235
235
|
{
|
|
236
|
-
className: "mtx-sticky mtx-left-0 mtx-z-30 mtx-flex mtx-items-center mtx-border-b mtx-border-r mtx-border-gray-200 mtx-bg-gray-0 mtx-px-
|
|
236
|
+
className: "mtx-sticky mtx-left-0 mtx-z-30 mtx-flex mtx-items-center mtx-border-b mtx-border-r mtx-border-gray-200 mtx-bg-gray-0 mtx-px-2",
|
|
237
237
|
style: { height: o },
|
|
238
238
|
role: "cell",
|
|
239
239
|
children: /* @__PURE__ */ l(
|
|
@@ -267,7 +267,7 @@ const be = {
|
|
|
267
267
|
/* @__PURE__ */ t(
|
|
268
268
|
"div",
|
|
269
269
|
{
|
|
270
|
-
className: "mtx-sticky mtx-left-0 mtx-z-30 mtx-flex mtx-items-center mtx-border-b mtx-border-r mtx-border-gray-200 mtx-bg-gray-0 mtx-px-
|
|
270
|
+
className: "mtx-sticky mtx-left-0 mtx-z-30 mtx-flex mtx-items-center mtx-border-b mtx-border-r mtx-border-gray-200 mtx-bg-gray-0 mtx-px-2",
|
|
271
271
|
style: { height: o },
|
|
272
272
|
role: "rowheader",
|
|
273
273
|
children: z ? z({ item: r, formattedDateRange: A }) : /* @__PURE__ */ l("div", { className: "mtx-flex mtx-w-full mtx-min-w-0 mtx-items-center mtx-justify-between mtx-gap-3", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ganttchart.es.js","sources":["../src/components/gantt-chart/GanttChart.tsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { Plus } from \"@trsys-tech/matrix-icons\";\n\nimport { cn } from \"../../lib/utils\";\nimport { GanttToolbar } from \"./GanttToolbar\";\nimport {\n clampProgress,\n createTimeline,\n formatDateRange as defaultFormatDateRange,\n getBarPosition,\n getMarkerPosition,\n getTimelineRange,\n includesDate,\n toDate,\n type TimelineGroup,\n type TimelineInterval,\n} from \"./gantt-chart.utils\";\nimport type {\n GanttDate,\n GanttItem,\n GanttMarker,\n GanttRenderBarContext,\n GanttRenderItemContext,\n GanttView,\n GanttViewLabels,\n} from \"./gantt-chart.types\";\n\nconst DEFAULT_VIEW_LABELS: GanttViewLabels = {\n week: \"Weeks\",\n month: \"Month\",\n quarter: \"Quarter\",\n};\n\nconst DEFAULT_CELL_WIDTHS: Record<GanttView, number> = {\n week: 72,\n month: 120,\n quarter: 220,\n};\n\ntype GanttChartProps = Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> & {\n /** Rows displayed by the chart. */\n items: GanttItem[];\n /** Controlled timeline scale. */\n view?: GanttView;\n /** Initial scale when the chart is uncontrolled. */\n defaultView?: GanttView;\n /** Scales available in the toolbar. */\n views?: GanttView[];\n /** Labels shown for the available scales. */\n viewLabels?: Partial<GanttViewLabels>;\n /** Called after the user selects a scale. */\n onViewChange?: (view: GanttView) => void;\n /** Optional beginning of the visible timeline. */\n startDate?: GanttDate;\n /** Optional end of the visible timeline. */\n endDate?: GanttDate;\n /** Dated vertical markers drawn over the timeline rows. */\n markers?: GanttMarker[];\n /** Date whose period is highlighted. Defaults to today; pass null to disable. */\n highlightedDate?: GanttDate | null;\n /** Locale used by timeline and range labels. */\n locale?: string;\n /** Width of the sticky row-name column in pixels. */\n nameColumnWidth?: number;\n /** Height of each item row in pixels. */\n rowHeight?: number;\n /** Minimum width of an individual timeline cell, by scale. */\n cellWidths?: Partial<Record<GanttView, number>>;\n /** Header shown above item names. */\n nameColumnHeader?: React.ReactNode;\n /** Label used for the add-row action. */\n addItemLabel?: React.ReactNode;\n /** Shows the add-row action when provided. */\n onAddItem?: () => void;\n /** Shows the refresh action when provided. */\n onRefresh?: () => void;\n /** Shows the native fullscreen action when supported. */\n showFullscreen?: boolean;\n /** Content inserted before the default toolbar actions. */\n toolbarActions?: React.ReactNode;\n /** Replaces the default item-name and date-range content. */\n renderItem?: (context: GanttRenderItemContext) => React.ReactNode;\n /** Replaces the default progress label inside a bar. */\n renderBar?: (context: GanttRenderBarContext) => React.ReactNode;\n /** Replaces the compact date range shown alongside each item. */\n formatDateRange?: (item: GanttItem) => string;\n /** Accessible label for the chart. */\n \"aria-label\"?: string;\n};\n\ntype TimelineGridProps = {\n intervals: TimelineInterval[];\n highlightedDate: Date | null;\n};\n\ntype PositionedGanttMarker = {\n marker: GanttMarker;\n left: number;\n};\n\ntype TimelineMarkersProps = {\n markers: PositionedGanttMarker[];\n showLabels?: boolean;\n};\n\nconst MARKER_LABEL_GAP = 8;\nconst MARKER_LABEL_OFFSET = 12;\nconst MARKER_LABEL_TOP = 4;\nconst MARKER_LABEL_LANE_HEIGHT = 30;\n\nconst TimelineMarkers: React.FC<TimelineMarkersProps> = ({ markers, showLabels = false }) => {\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const labelRefs = React.useRef(new Map<string, HTMLDivElement>());\n const diamondRefs = React.useRef(new Map<string, HTMLDivElement>());\n\n React.useEffect(() => {\n const container = containerRef.current;\n\n if (!container || !showLabels) return;\n\n const positionLabels = () => {\n const containerWidth = container.clientWidth;\n const candidates = markers.flatMap(({ marker, left }) => {\n const key = String(marker.id);\n const label = labelRefs.current.get(key);\n\n if (!label) return [];\n\n const markerLeft = (left / 100) * containerWidth;\n const labelWidth = label.offsetWidth;\n let labelLeft = markerLeft + MARKER_LABEL_OFFSET;\n\n if (labelLeft + labelWidth > containerWidth - MARKER_LABEL_GAP) {\n labelLeft = markerLeft - labelWidth - MARKER_LABEL_OFFSET;\n }\n\n labelLeft = Math.max(MARKER_LABEL_GAP, Math.min(labelLeft, containerWidth - labelWidth - MARKER_LABEL_GAP));\n\n return [{ key, label, labelLeft, labelRight: labelLeft + labelWidth }];\n });\n\n const laneRightEdges: number[] = [];\n\n candidates\n .sort((first, second) => first.labelLeft - second.labelLeft)\n .forEach(candidate => {\n let lane = laneRightEdges.findIndex(rightEdge => rightEdge + MARKER_LABEL_GAP <= candidate.labelLeft);\n\n if (lane === -1) {\n lane = laneRightEdges.length;\n }\n\n laneRightEdges[lane] = candidate.labelRight;\n const top = MARKER_LABEL_TOP + lane * MARKER_LABEL_LANE_HEIGHT;\n\n candidate.label.style.left = `${candidate.labelLeft}px`;\n candidate.label.style.top = `${top}px`;\n\n const diamond = diamondRefs.current.get(candidate.key);\n\n if (diamond) {\n diamond.style.top = `${top + 8}px`;\n }\n });\n };\n\n positionLabels();\n\n if (typeof ResizeObserver === \"undefined\") return;\n\n const resizeObserver = new ResizeObserver(positionLabels);\n\n resizeObserver.observe(container);\n labelRefs.current.forEach(label => resizeObserver.observe(label));\n\n return () => resizeObserver.disconnect();\n }, [markers, showLabels]);\n\n return (\n <div ref={containerRef} className=\"mtx-pointer-events-none mtx-absolute mtx-inset-0 mtx-z-20\">\n {markers.map(({ marker, left }) => {\n const key = String(marker.id);\n\n return (\n <React.Fragment key={marker.id}>\n <div\n className={cn(\"mtx-absolute mtx-inset-y-0 mtx-w-0.5 -mtx-translate-x-1/2\", marker.lineClassName)}\n style={{ left: `${left}%`, backgroundColor: marker.color }}\n aria-hidden=\"true\"\n />\n {showLabels ? (\n <>\n <div\n ref={element => {\n if (element) diamondRefs.current.set(key, element);\n else diamondRefs.current.delete(key);\n }}\n className={cn(\n \"mtx-absolute mtx-z-20 mtx-h-2 mtx-w-2 -mtx-translate-x-1/2 mtx-rotate-45 mtx-border mtx-border-gray-0\",\n marker.diamondClassName,\n )}\n style={{ left: `${left}%`, top: MARKER_LABEL_TOP + 8, backgroundColor: marker.color }}\n aria-hidden=\"true\"\n />\n <div\n ref={element => {\n if (element) labelRefs.current.set(key, element);\n else labelRefs.current.delete(key);\n }}\n className={cn(\n \"mtx-absolute mtx-z-20 mtx-max-w-48 mtx-truncate mtx-whitespace-nowrap mtx-rounded-sm mtx-border mtx-bg-gray-0 mtx-px-2 mtx-py-1 mtx-text-xs mtx-font-semibold mtx-shadow-card\",\n marker.labelClassName,\n )}\n style={{ left: `calc(${left}% + ${MARKER_LABEL_OFFSET}px)`, top: MARKER_LABEL_TOP, borderColor: marker.color, color: marker.color }}\n title={typeof marker.label === \"string\" ? marker.label : undefined}\n role=\"note\"\n >\n {marker.label}\n </div>\n </>\n ) : null}\n </React.Fragment>\n );\n })}\n </div>\n );\n};\n\nconst TimelineGrid: React.FC<TimelineGridProps> = ({ intervals, highlightedDate }) => (\n <div\n aria-hidden=\"true\"\n className=\"mtx-pointer-events-none mtx-absolute mtx-inset-0 mtx-grid\"\n style={{ gridTemplateColumns: `repeat(${intervals.length}, minmax(0, 1fr))` }}\n >\n {intervals.map((interval, index) => (\n <div\n key={interval.start.toISOString()}\n className={cn(\n \"mtx-border-l mtx-border-gray-200\",\n index === intervals.length - 1 && \"mtx-border-r\",\n includesDate(interval, highlightedDate) && \"mtx-bg-gray-50\",\n )}\n />\n ))}\n </div>\n);\n\ntype TimelineHeaderProps = {\n intervals: TimelineInterval[];\n groups: TimelineGroup[];\n highlightedDate: Date | null;\n nameColumnHeader: React.ReactNode;\n nameColumnWidth: number;\n};\n\nconst TimelineHeader: React.FC<TimelineHeaderProps> = ({ intervals, groups, highlightedDate, nameColumnHeader, nameColumnWidth }) => (\n <div className=\"mtx-bg-primary-50\" role=\"rowgroup\">\n <div\n className=\"mtx-grid mtx-h-9 mtx-border-b mtx-border-gray-200\"\n style={{ gridTemplateColumns: `${nameColumnWidth}px repeat(${intervals.length}, minmax(0, 1fr))` }}\n role=\"row\"\n >\n <div\n className=\"mtx-sticky mtx-left-0 mtx-z-20 mtx-flex mtx-items-center mtx-border-b mtx-border-r mtx-border-gray-200 mtx-bg-primary-50 mtx-px-4 mtx-text-sm mtx-font-semibold mtx-text-text-500\"\n style={{ gridColumn: 1, height: 80 }}\n role=\"columnheader\"\n aria-colindex={1}\n aria-rowspan={2}\n >\n {nameColumnHeader}\n </div>\n {groups.map(group => (\n <div\n key={group.key}\n className=\"mtx-flex mtx-items-start mtx-justify-center mtx-py-1.5 mtx-border-l mtx-border-gray-200 mtx-text-sm mtx-font-medium mtx-text-text-500\"\n style={{ gridColumn: `${group.startIndex + 2} / span ${group.intervalCount}` }}\n role=\"columnheader\"\n aria-colindex={group.startIndex + 2}\n aria-colspan={group.intervalCount}\n >\n {group.label}\n </div>\n ))}\n </div>\n <div className=\"mtx-grid mtx-h-11\" style={{ gridTemplateColumns: `${nameColumnWidth}px repeat(${intervals.length}, minmax(0, 1fr))` }} role=\"row\">\n <div aria-hidden=\"true\" />\n {intervals.map((interval, index) => (\n <div\n key={interval.start.toISOString()}\n className={cn(\n \"mtx-flex mtx-items-center mtx-justify-center mtx-border-l mtx-border-gray-200 mtx-px-2 mtx-text-center mtx-text-xs mtx-font-medium mtx-text-text-500\",\n includesDate(interval, highlightedDate) && \"mtx-bg-primary-100 mtx-font-semibold\",\n )}\n role=\"columnheader\"\n aria-colindex={index + 2}\n >\n {interval.label}\n </div>\n ))}\n </div>\n </div>\n);\n\nconst GanttChart = React.forwardRef<HTMLDivElement, GanttChartProps>(\n (\n {\n items,\n view,\n defaultView = \"quarter\",\n views = [\"week\", \"month\", \"quarter\"],\n viewLabels,\n onViewChange,\n startDate,\n endDate,\n markers = [],\n highlightedDate,\n locale = \"en-US\",\n nameColumnWidth = 320,\n rowHeight = 64,\n cellWidths,\n nameColumnHeader = \"Name\",\n addItemLabel = \"New item\",\n onAddItem,\n onRefresh,\n showFullscreen = true,\n toolbarActions,\n renderItem,\n renderBar,\n formatDateRange,\n className,\n \"aria-label\": ariaLabel = \"Gantt chart\",\n ...props\n },\n ref,\n ) => {\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const [fullscreenSupported, setFullscreenSupported] = React.useState(false);\n const [uncontrolledView, setUncontrolledView] = React.useState(defaultView);\n const activeView = view ?? uncontrolledView;\n const range = React.useMemo(() => getTimelineRange(items, startDate, endDate), [endDate, items, startDate]);\n const timeline = React.useMemo(() => createTimeline(range.start, range.end, activeView, locale), [activeView, locale, range.end, range.start]);\n const activeHighlightedDate = React.useMemo(() => (highlightedDate === null ? null : toDate(highlightedDate ?? new Date())), [highlightedDate]);\n const activeViewLabels = { ...DEFAULT_VIEW_LABELS, ...viewLabels };\n const positionedMarkers = React.useMemo(\n () =>\n markers.flatMap(marker => {\n const markerDate = toDate(marker.date);\n const left = markerDate ? getMarkerPosition(markerDate, timeline.intervals) : null;\n\n return left === null ? [] : [{ marker, left }];\n }),\n [markers, timeline.intervals],\n );\n const cellWidth = cellWidths?.[activeView] ?? DEFAULT_CELL_WIDTHS[activeView];\n const timelineWidth = timeline.intervals.length * cellWidth;\n const chartWidth = nameColumnWidth + timelineWidth;\n\n const handleRootRef = React.useCallback((element: HTMLDivElement | null) => {\n rootRef.current = element;\n\n if (element && typeof document !== \"undefined\") {\n setFullscreenSupported(\n document.fullscreenEnabled !== false && typeof element.requestFullscreen === \"function\" && typeof document.exitFullscreen === \"function\",\n );\n }\n }, []);\n\n React.useImperativeHandle(ref, () => rootRef.current as HTMLDivElement);\n\n const handleViewChange = (nextView: GanttView) => {\n if (view === undefined) {\n setUncontrolledView(nextView);\n }\n onViewChange?.(nextView);\n };\n\n const handleToggleFullscreen = () => {\n if (!rootRef.current || typeof document === \"undefined\") return;\n\n if (document.fullscreenElement === rootRef.current) {\n void document.exitFullscreen().catch(() => undefined);\n } else {\n void rootRef.current.requestFullscreen().catch(() => undefined);\n }\n };\n\n return (\n <div\n ref={handleRootRef}\n className={cn(\"mtx-overflow-hidden mtx-rounded-lg mtx-border mtx-border-gray-200 mtx-bg-gray-0 mtx-[font-family:DMSans]\", className)}\n aria-label={ariaLabel}\n {...props}\n >\n <GanttToolbar\n activeView={activeView}\n views={views}\n viewLabels={activeViewLabels}\n onViewChange={handleViewChange}\n onRefresh={onRefresh}\n onToggleFullscreen={showFullscreen && fullscreenSupported ? handleToggleFullscreen : undefined}\n toolbarActions={toolbarActions}\n />\n\n <div className=\"mtx-overflow-auto\">\n <div style={{ minWidth: chartWidth }} role=\"table\" aria-label={ariaLabel}>\n <TimelineHeader\n intervals={timeline.intervals}\n groups={timeline.groups}\n highlightedDate={activeHighlightedDate}\n nameColumnHeader={nameColumnHeader}\n nameColumnWidth={nameColumnWidth}\n />\n\n {onAddItem ? (\n <div className=\"mtx-grid\" style={{ gridTemplateColumns: `${nameColumnWidth}px minmax(${timelineWidth}px, 1fr)` }} role=\"row\">\n <div\n className=\"mtx-sticky mtx-left-0 mtx-z-30 mtx-flex mtx-items-center mtx-border-b mtx-border-r mtx-border-gray-200 mtx-bg-gray-0 mtx-px-4\"\n style={{ height: rowHeight }}\n role=\"cell\"\n >\n <button\n type=\"button\"\n className=\"mtx-inline-flex mtx-items-center mtx-gap-2 mtx-text-sm mtx-font-medium mtx-text-primary hover:mtx-text-primary-700 focus-visible:mtx-outline-none focus-visible:mtx-ring focus-visible:mtx-ring-primary-300\"\n onClick={onAddItem}\n >\n <Plus className=\"mtx-h-4 mtx-w-4\" />\n {addItemLabel}\n </button>\n </div>\n <div className=\"mtx-relative mtx-border-b mtx-border-gray-200\" style={{ height: rowHeight }} role=\"cell\">\n <TimelineGrid intervals={timeline.intervals} highlightedDate={activeHighlightedDate} />\n <TimelineMarkers markers={positionedMarkers} showLabels />\n </div>\n </div>\n ) : null}\n\n <div role=\"rowgroup\">\n {items.map((item, itemIndex) => {\n const progress = clampProgress(item.progress);\n const barPosition = getBarPosition(item, timeline.intervals);\n const formattedDateRange = formatDateRange?.(item) ?? defaultFormatDateRange(item, locale);\n\n return (\n <div\n key={item.id}\n className=\"mtx-grid\"\n style={{ gridTemplateColumns: `${nameColumnWidth}px minmax(${timelineWidth}px, 1fr)` }}\n role=\"row\"\n >\n <div\n className=\"mtx-sticky mtx-left-0 mtx-z-30 mtx-flex mtx-items-center mtx-border-b mtx-border-r mtx-border-gray-200 mtx-bg-gray-0 mtx-px-4\"\n style={{ height: rowHeight }}\n role=\"rowheader\"\n >\n {renderItem ? (\n renderItem({ item, formattedDateRange })\n ) : (\n <div className=\"mtx-flex mtx-w-full mtx-min-w-0 mtx-items-center mtx-justify-between mtx-gap-3\">\n <span className=\"mtx-truncate mtx-text-sm mtx-font-semibold mtx-text-text-500\">{item.name}</span>\n <span className=\"mtx-shrink-0 mtx-text-xs mtx-text-text-300\">{formattedDateRange}</span>\n </div>\n )}\n </div>\n\n <div className=\"mtx-relative mtx-border-b mtx-border-gray-200\" style={{ height: rowHeight }} role=\"cell\">\n <TimelineGrid intervals={timeline.intervals} highlightedDate={activeHighlightedDate} />\n <TimelineMarkers markers={positionedMarkers} showLabels={!onAddItem && itemIndex === 0} />\n {barPosition && barPosition.width > 0 ? (\n <div\n className={cn(\n \"mtx-absolute mtx-top-1/2 mtx-z-10 mtx-h-10 -mtx-translate-y-1/2 mtx-overflow-hidden mtx-rounded mtx-border-r-2 mtx-border-secondary-800 mtx-bg-secondary-200\",\n item.barClassName,\n )}\n style={{ left: `${barPosition.left}%`, width: `${barPosition.width}%` }}\n title={`${formattedDateRange}, ${progress}% complete`}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress}\n >\n <div\n className={cn(\"mtx-h-full mtx-bg-secondary-500\", item.progressClassName)}\n style={{ width: `${progress}%` }}\n aria-hidden=\"true\"\n />\n <div\n className=\"mtx-absolute mtx-top-1/2 mtx-min-w-max -mtx-translate-x-1/2 -mtx-translate-y-1/2 mtx-text-center mtx-text-xs mtx-leading-4 mtx-text-text-600\"\n style={{ left: `clamp(3rem, ${progress / 2}%, calc(100% - 3rem))` }}\n >\n {renderBar ? (\n renderBar({ item, progress })\n ) : (\n <>\n <span className=\"mtx-block\">Progress</span>\n <strong className=\"mtx-block mtx-text-sm\">{progress}%</strong>\n </>\n )}\n </div>\n </div>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n },\n);\n\nGanttChart.displayName = \"GanttChart\";\n\nexport {\n GanttChart,\n type GanttChartProps,\n type GanttDate,\n type GanttItem,\n type GanttMarker,\n type GanttRenderBarContext,\n type GanttRenderItemContext,\n type GanttView,\n};\n"],"names":["DEFAULT_VIEW_LABELS","DEFAULT_CELL_WIDTHS","MARKER_LABEL_GAP","MARKER_LABEL_OFFSET","MARKER_LABEL_TOP","MARKER_LABEL_LANE_HEIGHT","TimelineMarkers","markers","showLabels","containerRef","React","labelRefs","diamondRefs","container","positionLabels","containerWidth","candidates","marker","left","key","label","markerLeft","labelWidth","labelLeft","laneRightEdges","first","second","candidate","lane","rightEdge","top","diamond","resizeObserver","jsx","jsxs","cn","Fragment","element","TimelineGrid","intervals","highlightedDate","interval","index","includesDate","TimelineHeader","groups","nameColumnHeader","nameColumnWidth","group","GanttChart","items","view","defaultView","views","viewLabels","onViewChange","startDate","endDate","locale","rowHeight","cellWidths","addItemLabel","onAddItem","onRefresh","showFullscreen","toolbarActions","renderItem","renderBar","formatDateRange","className","ariaLabel","props","ref","rootRef","fullscreenSupported","setFullscreenSupported","uncontrolledView","setUncontrolledView","activeView","range","getTimelineRange","timeline","createTimeline","activeHighlightedDate","toDate","activeViewLabels","positionedMarkers","markerDate","getMarkerPosition","cellWidth","timelineWidth","chartWidth","handleRootRef","handleViewChange","nextView","handleToggleFullscreen","GanttToolbar","Plus","item","itemIndex","progress","clampProgress","barPosition","getBarPosition","formattedDateRange","defaultFormatDateRange"],"mappings":";;;;;;AA6BA,MAAMA,KAAuC;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AACX,GAEMC,KAAiD;AAAA,EACrD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AACX,GAoEMC,IAAmB,GACnBC,IAAsB,IACtBC,IAAmB,GACnBC,KAA2B,IAE3BC,IAAkD,CAAC,EAAE,SAAAC,GAAS,YAAAC,IAAa,SAAY;AAC3F,QAAMC,IAAeC,EAAM,OAA8B,IAAI,GACvDC,IAAYD,EAAM,OAAO,oBAAI,KAA6B,GAC1DE,IAAcF,EAAM,OAAO,oBAAI,KAA6B;AAElEA,SAAAA,EAAM,UAAU,MAAM;AACpB,UAAMG,IAAYJ,EAAa;AAE/B,QAAI,CAACI,KAAa,CAACL,EAAY;AAE/B,UAAMM,IAAiB,MAAM;AAC3B,YAAMC,IAAiBF,EAAU,aAC3BG,IAAaT,EAAQ,QAAQ,CAAC,EAAE,QAAAU,GAAQ,MAAAC,QAAW;AACvD,cAAMC,IAAM,OAAOF,EAAO,EAAE,GACtBG,IAAQT,EAAU,QAAQ,IAAIQ,CAAG;AAEvC,YAAI,CAACC,EAAO,QAAO,CAAA;AAEnB,cAAMC,IAAcH,IAAO,MAAOH,GAC5BO,IAAaF,EAAM;AACzB,YAAIG,IAAYF,IAAalB;AAE7B,eAAIoB,IAAYD,IAAaP,IAAiBb,MAC5CqB,IAAYF,IAAaC,IAAanB,IAGxCoB,IAAY,KAAK,IAAIrB,GAAkB,KAAK,IAAIqB,GAAWR,IAAiBO,IAAapB,CAAgB,CAAC,GAEnG,CAAC,EAAE,KAAAiB,GAAK,OAAAC,GAAO,WAAAG,GAAW,YAAYA,IAAYD,GAAY;AAAA,MACvE,CAAC,GAEKE,IAA2B,CAAA;AAEjC,MAAAR,EACG,KAAK,CAACS,GAAOC,MAAWD,EAAM,YAAYC,EAAO,SAAS,EAC1D,QAAQ,CAAAC,MAAa;AACpB,YAAIC,IAAOJ,EAAe,UAAU,OAAaK,IAAY3B,KAAoByB,EAAU,SAAS;AAEpG,QAAIC,MAAS,OACXA,IAAOJ,EAAe,SAGxBA,EAAeI,CAAI,IAAID,EAAU;AACjC,cAAMG,IAAM1B,IAAmBwB,IAAOvB;AAEtC,QAAAsB,EAAU,MAAM,MAAM,OAAO,GAAGA,EAAU,SAAS,MACnDA,EAAU,MAAM,MAAM,MAAM,GAAGG,CAAG;AAElC,cAAMC,IAAUnB,EAAY,QAAQ,IAAIe,EAAU,GAAG;AAErD,QAAII,MACFA,EAAQ,MAAM,MAAM,GAAGD,IAAM,CAAC;AAAA,MAElC,CAAC;AAAA,IACL;AAIA,QAFAhB,EAAA,GAEI,OAAO,iBAAmB,IAAa;AAE3C,UAAMkB,IAAiB,IAAI,eAAelB,CAAc;AAExD,WAAAkB,EAAe,QAAQnB,CAAS,GAChCF,EAAU,QAAQ,QAAQ,CAAAS,MAASY,EAAe,QAAQZ,CAAK,CAAC,GAEzD,MAAMY,EAAe,WAAA;AAAA,EAC9B,GAAG,CAACzB,GAASC,CAAU,CAAC,GAGtB,gBAAAyB,EAAC,OAAA,EAAI,KAAKxB,GAAc,WAAU,6DAC/B,UAAAF,EAAQ,IAAI,CAAC,EAAE,QAAAU,GAAQ,MAAAC,EAAA,MAAW;AACjC,UAAMC,IAAM,OAAOF,EAAO,EAAE;AAE5B,WACE,gBAAAiB,EAACxB,EAAM,UAAN,EACC,UAAA;AAAA,MAAA,gBAAAuB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWE,EAAG,6DAA6DlB,EAAO,aAAa;AAAA,UAC/F,OAAO,EAAE,MAAM,GAAGC,CAAI,KAAK,iBAAiBD,EAAO,MAAA;AAAA,UACnD,eAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAEbT,IACC,gBAAA0B,EAAAE,GAAA,EACE,UAAA;AAAA,QAAA,gBAAAH;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK,CAAAI,MAAW;AACd,cAAIA,IAASzB,EAAY,QAAQ,IAAIO,GAAKkB,CAAO,IAC5CzB,EAAY,QAAQ,OAAOO,CAAG;AAAA,YACrC;AAAA,YACA,WAAWgB;AAAA,cACT;AAAA,cACAlB,EAAO;AAAA,YAAA;AAAA,YAET,OAAO,EAAE,MAAM,GAAGC,CAAI,KAAK,KAAKd,IAAmB,GAAG,iBAAiBa,EAAO,MAAA;AAAA,YAC9E,eAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAEd,gBAAAgB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK,CAAAI,MAAW;AACd,cAAIA,IAAS1B,EAAU,QAAQ,IAAIQ,GAAKkB,CAAO,IAC1C1B,EAAU,QAAQ,OAAOQ,CAAG;AAAA,YACnC;AAAA,YACA,WAAWgB;AAAA,cACT;AAAA,cACAlB,EAAO;AAAA,YAAA;AAAA,YAET,OAAO,EAAE,MAAM,QAAQC,CAAI,OAAOf,CAAmB,OAAO,KAAKC,GAAkB,aAAaa,EAAO,OAAO,OAAOA,EAAO,MAAA;AAAA,YAC5H,OAAO,OAAOA,EAAO,SAAU,WAAWA,EAAO,QAAQ;AAAA,YACzD,MAAK;AAAA,YAEJ,UAAAA,EAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MACV,EAAA,CACF,IACE;AAAA,IAAA,EAAA,GApCeA,EAAO,EAqC5B;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ,GAEMqB,IAA4C,CAAC,EAAE,WAAAC,GAAW,iBAAAC,QAC9D,gBAAAP;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,eAAY;AAAA,IACZ,WAAU;AAAA,IACV,OAAO,EAAE,qBAAqB,UAAUM,EAAU,MAAM,oBAAA;AAAA,IAEvD,UAAAA,EAAU,IAAI,CAACE,GAAUC,MACxB,gBAAAT;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAWE;AAAA,UACT;AAAA,UACAO,MAAUH,EAAU,SAAS,KAAK;AAAA,UAClCI,EAAaF,GAAUD,CAAe,KAAK;AAAA,QAAA;AAAA,MAC7C;AAAA,MALKC,EAAS,MAAM,YAAA;AAAA,IAAY,CAOnC;AAAA,EAAA;AACH,GAWIG,KAAgD,CAAC,EAAE,WAAAL,GAAW,QAAAM,GAAQ,iBAAAL,GAAiB,kBAAAM,GAAkB,iBAAAC,EAAA,MAC7G,gBAAAb,EAAC,OAAA,EAAI,WAAU,qBAAoB,MAAK,YACtC,UAAA;AAAA,EAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,qBAAqB,GAAGa,CAAe,aAAaR,EAAU,MAAM,oBAAA;AAAA,MAC7E,MAAK;AAAA,MAEL,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,YAAY,GAAG,QAAQ,GAAA;AAAA,YAChC,MAAK;AAAA,YACL,iBAAe;AAAA,YACf,gBAAc;AAAA,YAEb,UAAAa;AAAA,UAAA;AAAA,QAAA;AAAA,QAEFD,EAAO,IAAI,CAAAG,MACV,gBAAAf;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAU;AAAA,YACV,OAAO,EAAE,YAAY,GAAGe,EAAM,aAAa,CAAC,WAAWA,EAAM,aAAa,GAAA;AAAA,YAC1E,MAAK;AAAA,YACL,iBAAeA,EAAM,aAAa;AAAA,YAClC,gBAAcA,EAAM;AAAA,YAEnB,UAAAA,EAAM;AAAA,UAAA;AAAA,UAPFA,EAAM;AAAA,QAAA,CASd;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAAA,EAEH,gBAAAd,EAAC,OAAA,EAAI,WAAU,qBAAoB,OAAO,EAAE,qBAAqB,GAAGa,CAAe,aAAaR,EAAU,MAAM,oBAAA,GAAuB,MAAK,OAC1I,UAAA;AAAA,IAAA,gBAAAN,EAAC,OAAA,EAAI,eAAY,OAAA,CAAO;AAAA,IACvBM,EAAU,IAAI,CAACE,GAAUC,MACxB,gBAAAT;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAWE;AAAA,UACT;AAAA,UACAQ,EAAaF,GAAUD,CAAe,KAAK;AAAA,QAAA;AAAA,QAE7C,MAAK;AAAA,QACL,iBAAeE,IAAQ;AAAA,QAEtB,UAAAD,EAAS;AAAA,MAAA;AAAA,MARLA,EAAS,MAAM,YAAA;AAAA,IAAY,CAUnC;AAAA,EAAA,EAAA,CACH;AAAA,GACF,GAGIQ,KAAavC,EAAM;AAAA,EACvB,CACE;AAAA,IACE,OAAAwC;AAAA,IACA,MAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,OAAAC,IAAQ,CAAC,QAAQ,SAAS,SAAS;AAAA,IACnC,YAAAC;AAAA,IACA,cAAAC;AAAA,IACA,WAAAC;AAAA,IACA,SAAAC;AAAA,IACA,SAAAlD,IAAU,CAAA;AAAA,IACV,iBAAAiC;AAAA,IACA,QAAAkB,IAAS;AAAA,IACT,iBAAAX,IAAkB;AAAA,IAClB,WAAAY,IAAY;AAAA,IACZ,YAAAC;AAAA,IACA,kBAAAd,IAAmB;AAAA,IACnB,cAAAe,IAAe;AAAA,IACf,WAAAC;AAAA,IACA,WAAAC;AAAA,IACA,gBAAAC,IAAiB;AAAA,IACjB,gBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,WAAAC;AAAA,IAAA,iBACAC;AAAAA,IACA,WAAAC;AAAA,IACA,cAAcC,IAAY;AAAA,IAC1B,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAAU/D,EAAM,OAA8B,IAAI,GAClD,CAACgE,GAAqBC,CAAsB,IAAIjE,EAAM,SAAS,EAAK,GACpE,CAACkE,GAAkBC,EAAmB,IAAInE,EAAM,SAAS0C,CAAW,GACpE0B,IAAa3B,KAAQyB,GACrBG,IAAQrE,EAAM,QAAQ,MAAMsE,GAAiB9B,GAAOM,GAAWC,CAAO,GAAG,CAACA,GAASP,GAAOM,CAAS,CAAC,GACpGyB,IAAWvE,EAAM,QAAQ,MAAMwE,GAAeH,EAAM,OAAOA,EAAM,KAAKD,GAAYpB,CAAM,GAAG,CAACoB,GAAYpB,GAAQqB,EAAM,KAAKA,EAAM,KAAK,CAAC,GACvII,IAAwBzE,EAAM,QAAQ,MAAO8B,MAAoB,OAAO,OAAO4C,EAAO5C,yBAAuB,KAAA,CAAM,GAAI,CAACA,CAAe,CAAC,GACxI6C,KAAmB,EAAE,GAAGrF,IAAqB,GAAGsD,EAAA,GAChDgC,IAAoB5E,EAAM;AAAA,MAC9B,MACEH,EAAQ,QAAQ,CAAAU,MAAU;AACxB,cAAMsE,IAAaH,EAAOnE,EAAO,IAAI,GAC/BC,IAAOqE,IAAaC,GAAkBD,GAAYN,EAAS,SAAS,IAAI;AAE9E,eAAO/D,MAAS,OAAO,CAAA,IAAK,CAAC,EAAE,QAAAD,GAAQ,MAAAC,GAAM;AAAA,MAC/C,CAAC;AAAA,MACH,CAACX,GAAS0E,EAAS,SAAS;AAAA,IAAA,GAExBQ,KAAY7B,IAAakB,CAAU,KAAK7E,GAAoB6E,CAAU,GACtEY,IAAgBT,EAAS,UAAU,SAASQ,IAC5CE,KAAa5C,IAAkB2C,GAE/BE,KAAgBlF,EAAM,YAAY,CAAC2B,MAAmC;AAC1E,MAAAoC,EAAQ,UAAUpC,GAEdA,KAAW,OAAO,WAAa,OACjCsC;AAAA,QACE,SAAS,sBAAsB,MAAS,OAAOtC,EAAQ,qBAAsB,cAAc,OAAO,SAAS,kBAAmB;AAAA,MAAA;AAAA,IAGpI,GAAG,CAAA,CAAE;AAEL3B,IAAAA,EAAM,oBAAoB8D,GAAK,MAAMC,EAAQ,OAAyB;AAEtE,UAAMoB,KAAmB,CAACC,MAAwB;AAChD,MAAI3C,MAAS,UACX0B,GAAoBiB,CAAQ,GAE9BvC,IAAeuC,CAAQ;AAAA,IACzB,GAEMC,KAAyB,MAAM;AACnC,MAAI,CAACtB,EAAQ,WAAW,OAAO,WAAa,QAExC,SAAS,sBAAsBA,EAAQ,UACpC,SAAS,eAAA,EAAiB,MAAM,MAAA;AAAA,OAAe,IAE/CA,EAAQ,QAAQ,kBAAA,EAAoB,MAAM,MAAA;AAAA,OAAe;AAAA,IAElE;AAEA,WACE,gBAAAvC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK0D;AAAA,QACL,WAAWzD,EAAG,4GAA4GkC,CAAS;AAAA,QACnI,cAAYC;AAAA,QACX,GAAGC;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAtC;AAAA,YAAC+D;AAAA,YAAA;AAAA,cACC,YAAAlB;AAAA,cACA,OAAAzB;AAAA,cACA,YAAYgC;AAAA,cACZ,cAAcQ;AAAA,cACd,WAAA9B;AAAA,cACA,oBAAoBC,KAAkBU,IAAsBqB,KAAyB;AAAA,cACrF,gBAAA9B;AAAA,YAAA;AAAA,UAAA;AAAA,UAGF,gBAAAhC,EAAC,OAAA,EAAI,WAAU,qBACb,4BAAC,OAAA,EAAI,OAAO,EAAE,UAAU0D,MAAc,MAAK,SAAQ,cAAYrB,GAC7D,UAAA;AAAA,YAAA,gBAAArC;AAAA,cAACW;AAAA,cAAA;AAAA,gBACC,WAAWqC,EAAS;AAAA,gBACpB,QAAQA,EAAS;AAAA,gBACjB,iBAAiBE;AAAA,gBACjB,kBAAArC;AAAA,gBACA,iBAAAC;AAAA,cAAA;AAAA,YAAA;AAAA,YAGDe,IACC,gBAAA5B,EAAC,OAAA,EAAI,WAAU,YAAW,OAAO,EAAE,qBAAqB,GAAGa,CAAe,aAAa2C,CAAa,WAAA,GAAc,MAAK,OACrH,UAAA;AAAA,cAAA,gBAAAzD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,EAAE,QAAQ0B,EAAA;AAAA,kBACjB,MAAK;AAAA,kBAEL,UAAA,gBAAAzB;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS4B;AAAA,sBAET,UAAA;AAAA,wBAAA,gBAAA7B,EAACgE,IAAA,EAAK,WAAU,kBAAA,CAAkB;AAAA,wBACjCpC;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACH;AAAA,cAAA;AAAA,cAEF,gBAAA3B,EAAC,OAAA,EAAI,WAAU,iDAAgD,OAAO,EAAE,QAAQyB,EAAA,GAAa,MAAK,QAChG,UAAA;AAAA,gBAAA,gBAAA1B,EAACK,GAAA,EAAa,WAAW2C,EAAS,WAAW,iBAAiBE,GAAuB;AAAA,gBACrF,gBAAAlD,EAAC3B,GAAA,EAAgB,SAASgF,GAAmB,YAAU,GAAA,CAAC;AAAA,cAAA,EAAA,CAC1D;AAAA,YAAA,EAAA,CACF,IACE;AAAA,YAEJ,gBAAArD,EAAC,SAAI,MAAK,YACP,YAAM,IAAI,CAACiE,GAAMC,MAAc;AAC9B,oBAAMC,IAAWC,GAAcH,EAAK,QAAQ,GACtCI,IAAcC,GAAeL,GAAMjB,EAAS,SAAS,GACrDuB,IAAqBpC,IAAkB8B,CAAI,KAAKO,GAAuBP,GAAMxC,CAAM;AAEzF,qBACE,gBAAAxB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAU;AAAA,kBACV,OAAO,EAAE,qBAAqB,GAAGa,CAAe,aAAa2C,CAAa,WAAA;AAAA,kBAC1E,MAAK;AAAA,kBAEL,UAAA;AAAA,oBAAA,gBAAAzD;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,OAAO,EAAE,QAAQ0B,EAAA;AAAA,wBACjB,MAAK;AAAA,wBAEJ,UAAAO,IACCA,EAAW,EAAE,MAAAgC,GAAM,oBAAAM,EAAA,CAAoB,IAEvC,gBAAAtE,EAAC,OAAA,EAAI,WAAU,kFACb,UAAA;AAAA,0BAAA,gBAAAD,EAAC,QAAA,EAAK,WAAU,gEAAgE,UAAAiE,EAAK,MAAK;AAAA,0BAC1F,gBAAAjE,EAAC,QAAA,EAAK,WAAU,8CAA8C,UAAAuE,EAAA,CAAmB;AAAA,wBAAA,EAAA,CACnF;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAIJ,gBAAAtE,EAAC,OAAA,EAAI,WAAU,iDAAgD,OAAO,EAAE,QAAQyB,EAAA,GAAa,MAAK,QAChG,UAAA;AAAA,sBAAA,gBAAA1B,EAACK,GAAA,EAAa,WAAW2C,EAAS,WAAW,iBAAiBE,GAAuB;AAAA,sBACrF,gBAAAlD,EAAC3B,KAAgB,SAASgF,GAAmB,YAAY,CAACxB,KAAaqC,MAAc,GAAG;AAAA,sBACvFG,KAAeA,EAAY,QAAQ,IAClC,gBAAApE;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAWC;AAAA,4BACT;AAAA,4BACA+D,EAAK;AAAA,0BAAA;AAAA,0BAEP,OAAO,EAAE,MAAM,GAAGI,EAAY,IAAI,KAAK,OAAO,GAAGA,EAAY,KAAK,IAAA;AAAA,0BAClE,OAAO,GAAGE,CAAkB,KAAKJ,CAAQ;AAAA,0BACzC,MAAK;AAAA,0BACL,iBAAe;AAAA,0BACf,iBAAe;AAAA,0BACf,iBAAeA;AAAA,0BAEf,UAAA;AAAA,4BAAA,gBAAAnE;AAAA,8BAAC;AAAA,8BAAA;AAAA,gCACC,WAAWE,EAAG,mCAAmC+D,EAAK,iBAAiB;AAAA,gCACvE,OAAO,EAAE,OAAO,GAAGE,CAAQ,IAAA;AAAA,gCAC3B,eAAY;AAAA,8BAAA;AAAA,4BAAA;AAAA,4BAEd,gBAAAnE;AAAA,8BAAC;AAAA,8BAAA;AAAA,gCACC,WAAU;AAAA,gCACV,OAAO,EAAE,MAAM,eAAemE,IAAW,CAAC,wBAAA;AAAA,gCAEzC,cACCjC,EAAU,EAAE,MAAA+B,GAAM,UAAAE,EAAA,CAAU,IAE5B,gBAAAlE,EAAAE,GAAA,EACE,UAAA;AAAA,kCAAA,gBAAAH,EAAC,QAAA,EAAK,WAAU,aAAY,UAAA,YAAQ;AAAA,kCACpC,gBAAAC,EAAC,UAAA,EAAO,WAAU,yBAAyB,UAAA;AAAA,oCAAAkE;AAAA,oCAAS;AAAA,kCAAA,EAAA,CAAC;AAAA,gCAAA,EAAA,CACvD;AAAA,8BAAA;AAAA,4BAAA;AAAA,0BAEJ;AAAA,wBAAA;AAAA,sBAAA,IAEA;AAAA,oBAAA,EAAA,CACN;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAxDKF,EAAK;AAAA,cAAA;AAAA,YA2DhB,CAAC,EAAA,CACH;AAAA,UAAA,EAAA,CACF,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AAEAjD,GAAW,cAAc;"}
|
|
1
|
+
{"version":3,"file":"ganttchart.es.js","sources":["../src/components/gantt-chart/GanttChart.tsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { Plus } from \"@trsys-tech/matrix-icons\";\n\nimport { cn } from \"../../lib/utils\";\nimport { GanttToolbar } from \"./GanttToolbar\";\nimport {\n clampProgress,\n createTimeline,\n formatDateRange as defaultFormatDateRange,\n getBarPosition,\n getMarkerPosition,\n getTimelineRange,\n includesDate,\n toDate,\n type TimelineGroup,\n type TimelineInterval,\n} from \"./gantt-chart.utils\";\nimport type {\n GanttDate,\n GanttItem,\n GanttMarker,\n GanttRenderBarContext,\n GanttRenderItemContext,\n GanttView,\n GanttViewLabels,\n} from \"./gantt-chart.types\";\n\nconst DEFAULT_VIEW_LABELS: GanttViewLabels = {\n week: \"Weeks\",\n month: \"Month\",\n quarter: \"Quarter\",\n};\n\nconst DEFAULT_CELL_WIDTHS: Record<GanttView, number> = {\n week: 72,\n month: 120,\n quarter: 220,\n};\n\ntype GanttChartProps = Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> & {\n /** Rows displayed by the chart. */\n items: GanttItem[];\n /** Controlled timeline scale. */\n view?: GanttView;\n /** Initial scale when the chart is uncontrolled. */\n defaultView?: GanttView;\n /** Scales available in the toolbar. */\n views?: GanttView[];\n /** Labels shown for the available scales. */\n viewLabels?: Partial<GanttViewLabels>;\n /** Called after the user selects a scale. */\n onViewChange?: (view: GanttView) => void;\n /** Optional beginning of the visible timeline. */\n startDate?: GanttDate;\n /** Optional end of the visible timeline. */\n endDate?: GanttDate;\n /** Dated vertical markers drawn over the timeline rows. */\n markers?: GanttMarker[];\n /** Date whose period is highlighted. Defaults to today; pass null to disable. */\n highlightedDate?: GanttDate | null;\n /** Locale used by timeline and range labels. */\n locale?: string;\n /** Width of the sticky row-name column in pixels. */\n nameColumnWidth?: number;\n /** Height of each item row in pixels. */\n rowHeight?: number;\n /** Minimum width of an individual timeline cell, by scale. */\n cellWidths?: Partial<Record<GanttView, number>>;\n /** Header shown above item names. */\n nameColumnHeader?: React.ReactNode;\n /** Label used for the add-row action. */\n addItemLabel?: React.ReactNode;\n /** Shows the add-row action when provided. */\n onAddItem?: () => void;\n /** Shows the refresh action when provided. */\n onRefresh?: () => void;\n /** Shows the native fullscreen action when supported. */\n showFullscreen?: boolean;\n /** Content inserted before the default toolbar actions. */\n toolbarActions?: React.ReactNode;\n /** Replaces the default item-name and date-range content. */\n renderItem?: (context: GanttRenderItemContext) => React.ReactNode;\n /** Replaces the default progress label inside a bar. */\n renderBar?: (context: GanttRenderBarContext) => React.ReactNode;\n /** Replaces the compact date range shown alongside each item. */\n formatDateRange?: (item: GanttItem) => string;\n /** Accessible label for the chart. */\n \"aria-label\"?: string;\n};\n\ntype TimelineGridProps = {\n intervals: TimelineInterval[];\n highlightedDate: Date | null;\n};\n\ntype PositionedGanttMarker = {\n marker: GanttMarker;\n left: number;\n};\n\ntype TimelineMarkersProps = {\n markers: PositionedGanttMarker[];\n showLabels?: boolean;\n};\n\nconst MARKER_LABEL_GAP = 8;\nconst MARKER_LABEL_OFFSET = 12;\nconst MARKER_LABEL_TOP = 4;\nconst MARKER_LABEL_LANE_HEIGHT = 30;\n\nconst TimelineMarkers: React.FC<TimelineMarkersProps> = ({ markers, showLabels = false }) => {\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const labelRefs = React.useRef(new Map<string, HTMLDivElement>());\n const diamondRefs = React.useRef(new Map<string, HTMLDivElement>());\n\n React.useEffect(() => {\n const container = containerRef.current;\n\n if (!container || !showLabels) return;\n\n const positionLabels = () => {\n const containerWidth = container.clientWidth;\n const candidates = markers.flatMap(({ marker, left }) => {\n const key = String(marker.id);\n const label = labelRefs.current.get(key);\n\n if (!label) return [];\n\n const markerLeft = (left / 100) * containerWidth;\n const labelWidth = label.offsetWidth;\n let labelLeft = markerLeft + MARKER_LABEL_OFFSET;\n\n if (labelLeft + labelWidth > containerWidth - MARKER_LABEL_GAP) {\n labelLeft = markerLeft - labelWidth - MARKER_LABEL_OFFSET;\n }\n\n labelLeft = Math.max(MARKER_LABEL_GAP, Math.min(labelLeft, containerWidth - labelWidth - MARKER_LABEL_GAP));\n\n return [{ key, label, labelLeft, labelRight: labelLeft + labelWidth }];\n });\n\n const laneRightEdges: number[] = [];\n\n candidates\n .sort((first, second) => first.labelLeft - second.labelLeft)\n .forEach(candidate => {\n let lane = laneRightEdges.findIndex(rightEdge => rightEdge + MARKER_LABEL_GAP <= candidate.labelLeft);\n\n if (lane === -1) {\n lane = laneRightEdges.length;\n }\n\n laneRightEdges[lane] = candidate.labelRight;\n const top = MARKER_LABEL_TOP + lane * MARKER_LABEL_LANE_HEIGHT;\n\n candidate.label.style.left = `${candidate.labelLeft}px`;\n candidate.label.style.top = `${top}px`;\n\n const diamond = diamondRefs.current.get(candidate.key);\n\n if (diamond) {\n diamond.style.top = `${top + 8}px`;\n }\n });\n };\n\n positionLabels();\n\n if (typeof ResizeObserver === \"undefined\") return;\n\n const resizeObserver = new ResizeObserver(positionLabels);\n\n resizeObserver.observe(container);\n labelRefs.current.forEach(label => resizeObserver.observe(label));\n\n return () => resizeObserver.disconnect();\n }, [markers, showLabels]);\n\n return (\n <div ref={containerRef} className=\"mtx-pointer-events-none mtx-absolute mtx-inset-0 mtx-z-20\">\n {markers.map(({ marker, left }) => {\n const key = String(marker.id);\n\n return (\n <React.Fragment key={marker.id}>\n <div\n className={cn(\"mtx-absolute mtx-inset-y-0 mtx-w-0.5 -mtx-translate-x-1/2\", marker.lineClassName)}\n style={{ left: `${left}%`, backgroundColor: marker.color }}\n aria-hidden=\"true\"\n />\n {showLabels ? (\n <>\n <div\n ref={element => {\n if (element) diamondRefs.current.set(key, element);\n else diamondRefs.current.delete(key);\n }}\n className={cn(\n \"mtx-absolute mtx-z-20 mtx-h-2 mtx-w-2 -mtx-translate-x-1/2 mtx-rotate-45 mtx-border mtx-border-gray-0\",\n marker.diamondClassName,\n )}\n style={{ left: `${left}%`, top: MARKER_LABEL_TOP + 8, backgroundColor: marker.color }}\n aria-hidden=\"true\"\n />\n <div\n ref={element => {\n if (element) labelRefs.current.set(key, element);\n else labelRefs.current.delete(key);\n }}\n className={cn(\n \"mtx-absolute mtx-z-20 mtx-max-w-48 mtx-truncate mtx-whitespace-nowrap mtx-rounded-sm mtx-border mtx-bg-gray-0 mtx-px-2 mtx-py-1 mtx-text-xs mtx-font-semibold mtx-shadow-card\",\n marker.labelClassName,\n )}\n style={{ left: `calc(${left}% + ${MARKER_LABEL_OFFSET}px)`, top: MARKER_LABEL_TOP, borderColor: marker.color, color: marker.color }}\n title={typeof marker.label === \"string\" ? marker.label : undefined}\n role=\"note\"\n >\n {marker.label}\n </div>\n </>\n ) : null}\n </React.Fragment>\n );\n })}\n </div>\n );\n};\n\nconst TimelineGrid: React.FC<TimelineGridProps> = ({ intervals, highlightedDate }) => (\n <div\n aria-hidden=\"true\"\n className=\"mtx-pointer-events-none mtx-absolute mtx-inset-0 mtx-grid\"\n style={{ gridTemplateColumns: `repeat(${intervals.length}, minmax(0, 1fr))` }}\n >\n {intervals.map((interval, index) => (\n <div\n key={interval.start.toISOString()}\n className={cn(\n \"mtx-border-l mtx-border-gray-200\",\n index === intervals.length - 1 && \"mtx-border-r\",\n includesDate(interval, highlightedDate) && \"mtx-bg-gray-50\",\n )}\n />\n ))}\n </div>\n);\n\ntype TimelineHeaderProps = {\n intervals: TimelineInterval[];\n groups: TimelineGroup[];\n highlightedDate: Date | null;\n nameColumnHeader: React.ReactNode;\n nameColumnWidth: number;\n};\n\nconst TimelineHeader: React.FC<TimelineHeaderProps> = ({ intervals, groups, highlightedDate, nameColumnHeader, nameColumnWidth }) => (\n <div className=\"mtx-bg-primary-50\" role=\"rowgroup\">\n <div\n className=\"mtx-grid mtx-h-9 mtx-border-b mtx-border-gray-200\"\n style={{ gridTemplateColumns: `${nameColumnWidth}px repeat(${intervals.length}, minmax(0, 1fr))` }}\n role=\"row\"\n >\n <div\n className=\"mtx-sticky mtx-left-0 mtx-z-20 mtx-flex mtx-items-center mtx-border-b mtx-border-r mtx-border-gray-200 mtx-bg-primary-50 mtx-px-4 mtx-text-sm mtx-font-semibold mtx-text-text-500\"\n style={{ gridColumn: 1, height: 80 }}\n role=\"columnheader\"\n aria-colindex={1}\n aria-rowspan={2}\n >\n {nameColumnHeader}\n </div>\n {groups.map(group => (\n <div\n key={group.key}\n className=\"mtx-flex mtx-items-start mtx-justify-center mtx-py-1.5 mtx-border-l mtx-border-gray-200 mtx-text-sm mtx-font-medium mtx-text-text-500\"\n style={{ gridColumn: `${group.startIndex + 2} / span ${group.intervalCount}` }}\n role=\"columnheader\"\n aria-colindex={group.startIndex + 2}\n aria-colspan={group.intervalCount}\n >\n {group.label}\n </div>\n ))}\n </div>\n <div className=\"mtx-grid mtx-h-11\" style={{ gridTemplateColumns: `${nameColumnWidth}px repeat(${intervals.length}, minmax(0, 1fr))` }} role=\"row\">\n <div aria-hidden=\"true\" />\n {intervals.map((interval, index) => (\n <div\n key={interval.start.toISOString()}\n className={cn(\n \"mtx-flex mtx-items-center mtx-justify-center mtx-border-l mtx-border-gray-200 mtx-px-2 mtx-text-center mtx-text-xs mtx-font-medium mtx-text-text-500\",\n includesDate(interval, highlightedDate) && \"mtx-bg-primary-100 mtx-font-semibold\",\n )}\n role=\"columnheader\"\n aria-colindex={index + 2}\n >\n {interval.label}\n </div>\n ))}\n </div>\n </div>\n);\n\nconst GanttChart = React.forwardRef<HTMLDivElement, GanttChartProps>(\n (\n {\n items,\n view,\n defaultView = \"quarter\",\n views = [\"week\", \"month\", \"quarter\"],\n viewLabels,\n onViewChange,\n startDate,\n endDate,\n markers = [],\n highlightedDate,\n locale = \"en-US\",\n nameColumnWidth = 320,\n rowHeight = 64,\n cellWidths,\n nameColumnHeader = \"Name\",\n addItemLabel = \"New item\",\n onAddItem,\n onRefresh,\n showFullscreen = true,\n toolbarActions,\n renderItem,\n renderBar,\n formatDateRange,\n className,\n \"aria-label\": ariaLabel = \"Gantt chart\",\n ...props\n },\n ref,\n ) => {\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const [fullscreenSupported, setFullscreenSupported] = React.useState(false);\n const [uncontrolledView, setUncontrolledView] = React.useState(defaultView);\n const activeView = view ?? uncontrolledView;\n const range = React.useMemo(() => getTimelineRange(items, startDate, endDate), [endDate, items, startDate]);\n const timeline = React.useMemo(() => createTimeline(range.start, range.end, activeView, locale), [activeView, locale, range.end, range.start]);\n const activeHighlightedDate = React.useMemo(() => (highlightedDate === null ? null : toDate(highlightedDate ?? new Date())), [highlightedDate]);\n const activeViewLabels = { ...DEFAULT_VIEW_LABELS, ...viewLabels };\n const positionedMarkers = React.useMemo(\n () =>\n markers.flatMap(marker => {\n const markerDate = toDate(marker.date);\n const left = markerDate ? getMarkerPosition(markerDate, timeline.intervals) : null;\n\n return left === null ? [] : [{ marker, left }];\n }),\n [markers, timeline.intervals],\n );\n const cellWidth = cellWidths?.[activeView] ?? DEFAULT_CELL_WIDTHS[activeView];\n const timelineWidth = timeline.intervals.length * cellWidth;\n const chartWidth = nameColumnWidth + timelineWidth;\n\n const handleRootRef = React.useCallback((element: HTMLDivElement | null) => {\n rootRef.current = element;\n\n if (element && typeof document !== \"undefined\") {\n setFullscreenSupported(\n document.fullscreenEnabled !== false && typeof element.requestFullscreen === \"function\" && typeof document.exitFullscreen === \"function\",\n );\n }\n }, []);\n\n React.useImperativeHandle(ref, () => rootRef.current as HTMLDivElement);\n\n const handleViewChange = (nextView: GanttView) => {\n if (view === undefined) {\n setUncontrolledView(nextView);\n }\n onViewChange?.(nextView);\n };\n\n const handleToggleFullscreen = () => {\n if (!rootRef.current || typeof document === \"undefined\") return;\n\n if (document.fullscreenElement === rootRef.current) {\n void document.exitFullscreen().catch(() => undefined);\n } else {\n void rootRef.current.requestFullscreen().catch(() => undefined);\n }\n };\n\n return (\n <div\n ref={handleRootRef}\n className={cn(\"mtx-overflow-hidden mtx-rounded-lg mtx-border mtx-border-gray-200 mtx-bg-gray-0 mtx-[font-family:DMSans]\", className)}\n aria-label={ariaLabel}\n {...props}\n >\n <GanttToolbar\n activeView={activeView}\n views={views}\n viewLabels={activeViewLabels}\n onViewChange={handleViewChange}\n onRefresh={onRefresh}\n onToggleFullscreen={showFullscreen && fullscreenSupported ? handleToggleFullscreen : undefined}\n toolbarActions={toolbarActions}\n />\n\n <div className=\"mtx-overflow-auto\">\n <div style={{ minWidth: chartWidth }} role=\"table\" aria-label={ariaLabel}>\n <TimelineHeader\n intervals={timeline.intervals}\n groups={timeline.groups}\n highlightedDate={activeHighlightedDate}\n nameColumnHeader={nameColumnHeader}\n nameColumnWidth={nameColumnWidth}\n />\n\n {onAddItem ? (\n <div className=\"mtx-grid\" style={{ gridTemplateColumns: `${nameColumnWidth}px minmax(${timelineWidth}px, 1fr)` }} role=\"row\">\n <div\n className=\"mtx-sticky mtx-left-0 mtx-z-30 mtx-flex mtx-items-center mtx-border-b mtx-border-r mtx-border-gray-200 mtx-bg-gray-0 mtx-px-2\"\n style={{ height: rowHeight }}\n role=\"cell\"\n >\n <button\n type=\"button\"\n className=\"mtx-inline-flex mtx-items-center mtx-gap-2 mtx-text-sm mtx-font-medium mtx-text-primary hover:mtx-text-primary-700 focus-visible:mtx-outline-none focus-visible:mtx-ring focus-visible:mtx-ring-primary-300\"\n onClick={onAddItem}\n >\n <Plus className=\"mtx-h-4 mtx-w-4\" />\n {addItemLabel}\n </button>\n </div>\n <div className=\"mtx-relative mtx-border-b mtx-border-gray-200\" style={{ height: rowHeight }} role=\"cell\">\n <TimelineGrid intervals={timeline.intervals} highlightedDate={activeHighlightedDate} />\n <TimelineMarkers markers={positionedMarkers} showLabels />\n </div>\n </div>\n ) : null}\n\n <div role=\"rowgroup\">\n {items.map((item, itemIndex) => {\n const progress = clampProgress(item.progress);\n const barPosition = getBarPosition(item, timeline.intervals);\n const formattedDateRange = formatDateRange?.(item) ?? defaultFormatDateRange(item, locale);\n\n return (\n <div\n key={item.id}\n className=\"mtx-grid\"\n style={{ gridTemplateColumns: `${nameColumnWidth}px minmax(${timelineWidth}px, 1fr)` }}\n role=\"row\"\n >\n <div\n className=\"mtx-sticky mtx-left-0 mtx-z-30 mtx-flex mtx-items-center mtx-border-b mtx-border-r mtx-border-gray-200 mtx-bg-gray-0 mtx-px-2\"\n style={{ height: rowHeight }}\n role=\"rowheader\"\n >\n {renderItem ? (\n renderItem({ item, formattedDateRange })\n ) : (\n <div className=\"mtx-flex mtx-w-full mtx-min-w-0 mtx-items-center mtx-justify-between mtx-gap-3\">\n <span className=\"mtx-truncate mtx-text-sm mtx-font-semibold mtx-text-text-500\">{item.name}</span>\n <span className=\"mtx-shrink-0 mtx-text-xs mtx-text-text-300\">{formattedDateRange}</span>\n </div>\n )}\n </div>\n\n <div className=\"mtx-relative mtx-border-b mtx-border-gray-200\" style={{ height: rowHeight }} role=\"cell\">\n <TimelineGrid intervals={timeline.intervals} highlightedDate={activeHighlightedDate} />\n <TimelineMarkers markers={positionedMarkers} showLabels={!onAddItem && itemIndex === 0} />\n {barPosition && barPosition.width > 0 ? (\n <div\n className={cn(\n \"mtx-absolute mtx-top-1/2 mtx-z-10 mtx-h-10 -mtx-translate-y-1/2 mtx-overflow-hidden mtx-rounded mtx-border-r-2 mtx-border-secondary-800 mtx-bg-secondary-200\",\n item.barClassName,\n )}\n style={{ left: `${barPosition.left}%`, width: `${barPosition.width}%` }}\n title={`${formattedDateRange}, ${progress}% complete`}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress}\n >\n <div\n className={cn(\"mtx-h-full mtx-bg-secondary-500\", item.progressClassName)}\n style={{ width: `${progress}%` }}\n aria-hidden=\"true\"\n />\n <div\n className=\"mtx-absolute mtx-top-1/2 mtx-min-w-max -mtx-translate-x-1/2 -mtx-translate-y-1/2 mtx-text-center mtx-text-xs mtx-leading-4 mtx-text-text-600\"\n style={{ left: `clamp(3rem, ${progress / 2}%, calc(100% - 3rem))` }}\n >\n {renderBar ? (\n renderBar({ item, progress })\n ) : (\n <>\n <span className=\"mtx-block\">Progress</span>\n <strong className=\"mtx-block mtx-text-sm\">{progress}%</strong>\n </>\n )}\n </div>\n </div>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n },\n);\n\nGanttChart.displayName = \"GanttChart\";\n\nexport {\n GanttChart,\n type GanttChartProps,\n type GanttDate,\n type GanttItem,\n type GanttMarker,\n type GanttRenderBarContext,\n type GanttRenderItemContext,\n type GanttView,\n};\n"],"names":["DEFAULT_VIEW_LABELS","DEFAULT_CELL_WIDTHS","MARKER_LABEL_GAP","MARKER_LABEL_OFFSET","MARKER_LABEL_TOP","MARKER_LABEL_LANE_HEIGHT","TimelineMarkers","markers","showLabels","containerRef","React","labelRefs","diamondRefs","container","positionLabels","containerWidth","candidates","marker","left","key","label","markerLeft","labelWidth","labelLeft","laneRightEdges","first","second","candidate","lane","rightEdge","top","diamond","resizeObserver","jsx","jsxs","cn","Fragment","element","TimelineGrid","intervals","highlightedDate","interval","index","includesDate","TimelineHeader","groups","nameColumnHeader","nameColumnWidth","group","GanttChart","items","view","defaultView","views","viewLabels","onViewChange","startDate","endDate","locale","rowHeight","cellWidths","addItemLabel","onAddItem","onRefresh","showFullscreen","toolbarActions","renderItem","renderBar","formatDateRange","className","ariaLabel","props","ref","rootRef","fullscreenSupported","setFullscreenSupported","uncontrolledView","setUncontrolledView","activeView","range","getTimelineRange","timeline","createTimeline","activeHighlightedDate","toDate","activeViewLabels","positionedMarkers","markerDate","getMarkerPosition","cellWidth","timelineWidth","chartWidth","handleRootRef","handleViewChange","nextView","handleToggleFullscreen","GanttToolbar","Plus","item","itemIndex","progress","clampProgress","barPosition","getBarPosition","formattedDateRange","defaultFormatDateRange"],"mappings":"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"}
|