@trsys-tech/matrix-library 1.1.5 → 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.
@@ -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-4",
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-4",
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":"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"}
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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"}