@mastra/playground-ui 42.0.0-alpha.15 → 42.0.0-alpha.16

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 42.0.0-alpha.16
4
+
5
+ ### Patch Changes
6
+
7
+ - Removed interaction hints from the date range timeline. ([#19987](https://github.com/mastra-ai/mastra/pull/19987))
8
+
3
9
  ## 42.0.0-alpha.15
4
10
 
5
11
  ### Minor Changes
@@ -959,7 +959,6 @@ function useDateRangeTimelineState({ value, min, max, onCommit }) {
959
959
  }
960
960
 
961
961
  function DateRangeTimeline({ value, min, max, onCommit }) {
962
- const hintId = React.useId();
963
962
  const rootRef = React.useRef(null);
964
963
  const timeline = useDateRangeTimelineState({
965
964
  value,
@@ -969,49 +968,31 @@ function DateRangeTimeline({ value, min, max, onCommit }) {
969
968
  });
970
969
  const boundaryModel = createDateRangeBoundaryModel(timeline.state);
971
970
  const axisModel = createDateRangeAxisModel(timeline.state);
972
- return /* @__PURE__ */ jsxRuntime.jsxs(
973
- "div",
974
- {
975
- ref: rootRef,
976
- role: "group",
977
- "aria-label": "Date range timeline",
978
- "aria-describedby": hintId,
979
- className: "w-full overflow-x-clip select-none",
980
- children: [
981
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-6 items-start justify-between gap-4 pb-1", children: [
982
- /* @__PURE__ */ jsxRuntime.jsx(Txt.Txt, { id: hintId, as: "span", variant: "ui-sm", className: "text-neutral3", children: "Drag to select" }),
983
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-neutral3", children: [
984
- /* @__PURE__ */ jsxRuntime.jsx(Txt.Txt, { as: "span", variant: "ui-sm", className: "hidden text-neutral3 sm:inline", children: "Drag range to move" }),
985
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden h-3 w-px bg-border2 sm:block", "aria-hidden": "true" }),
986
- /* @__PURE__ */ jsxRuntime.jsx(Txt.Txt, { as: "span", variant: "ui-sm", className: "text-neutral3", children: "Pinch to zoom" })
987
- ] })
988
- ] }),
989
- /* @__PURE__ */ jsxRuntime.jsx(
990
- DateRangeBoundaryPickers,
991
- {
992
- positions: boundaryModel.positions,
993
- value: boundaryModel.range,
994
- min,
995
- max,
996
- onSelect: timeline.selectDate
997
- }
998
- ),
999
- /* @__PURE__ */ jsxRuntime.jsx(
1000
- DateRangeTrack,
1001
- {
1002
- wheelTargetRef: rootRef,
1003
- timeline: timeline.state,
1004
- maximumIndex: timeline.maximumIndex,
1005
- onSelectionPreview: timeline.previewSelection,
1006
- onSelectionCommit: timeline.commitSelection,
1007
- onSelectionCancel: timeline.cancelSelection,
1008
- onZoom: timeline.zoom
1009
- }
1010
- ),
1011
- /* @__PURE__ */ jsxRuntime.jsx(DateRangeTicks, { ticks: axisModel.ticks, min, max })
1012
- ]
1013
- }
1014
- );
971
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: rootRef, role: "group", "aria-label": "Date range timeline", className: "w-full overflow-x-clip select-none", children: [
972
+ /* @__PURE__ */ jsxRuntime.jsx(
973
+ DateRangeBoundaryPickers,
974
+ {
975
+ positions: boundaryModel.positions,
976
+ value: boundaryModel.range,
977
+ min,
978
+ max,
979
+ onSelect: timeline.selectDate
980
+ }
981
+ ),
982
+ /* @__PURE__ */ jsxRuntime.jsx(
983
+ DateRangeTrack,
984
+ {
985
+ wheelTargetRef: rootRef,
986
+ timeline: timeline.state,
987
+ maximumIndex: timeline.maximumIndex,
988
+ onSelectionPreview: timeline.previewSelection,
989
+ onSelectionCommit: timeline.commitSelection,
990
+ onSelectionCancel: timeline.cancelSelection,
991
+ onZoom: timeline.zoom
992
+ }
993
+ ),
994
+ /* @__PURE__ */ jsxRuntime.jsx(DateRangeTicks, { ticks: axisModel.ticks, min, max })
995
+ ] });
1015
996
  }
1016
997
 
1017
998
  exports.DateRangeTimeline = DateRangeTimeline;
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangeTimeline.cjs.js","sources":["../../src/ds/components/DateRangeTimeline/lib/date-range-timeline.ts","../../src/ds/components/DateRangeTimeline/DateRangeBoundaryPicker.tsx","../../src/ds/components/DateRangeTimeline/lib/date-range-boundary-layout.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeBoundaryLayout.ts","../../src/ds/components/DateRangeTimeline/DateRangeBoundaryPickers.tsx","../../src/ds/components/DateRangeTimeline/DateRangeTicks.tsx","../../src/ds/components/DateRangeTimeline/DateRangeHandle.tsx","../../src/ds/components/DateRangeTimeline/DateRangeSelection.tsx","../../src/ds/components/DateRangeTimeline/DateRangeTrackGrid.tsx","../../src/ds/components/DateRangeTimeline/lib/date-range-timeline-interactions.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeKeyboardControls.ts","../../src/ds/components/DateRangeTimeline/hooks/use-pointer-drag.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangePointerGestures.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeWheelZoom.ts","../../src/ds/components/DateRangeTimeline/lib/date-range-timeline-grid.ts","../../src/ds/components/DateRangeTimeline/lib/date-range-timeline-view-model.ts","../../src/ds/components/DateRangeTimeline/DateRangeTrack.tsx","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeTimelineState.ts","../../src/ds/components/DateRangeTimeline/DateRangeTimeline.tsx"],"sourcesContent":["import { addDays, differenceInCalendarDays, format, isValid, parseISO } from 'date-fns';\nimport type { DateRangeValue, DateRangeBounds } from '../types';\n\nconst API_DATE_FORMAT = 'yyyy-MM-dd';\n\nexport type DateBoundary = 'from' | 'to';\n\nexport interface TimelineIndexRange {\n from: number;\n to: number;\n}\n\nexport interface TimelineState {\n origin: Date;\n viewport: TimelineIndexRange;\n selection: TimelineIndexRange;\n}\n\nexport interface TimelineTick {\n date: string;\n label: string;\n position: number;\n}\n\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function parseDate(value: string) {\n const date = parseISO(value);\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || !isValid(date)) return undefined;\n return format(date, API_DATE_FORMAT) === value ? date : undefined;\n}\n\nexport function toDateRange(state: TimelineState): DateRangeValue {\n return {\n from: format(addDays(state.origin, state.selection.from), API_DATE_FORMAT),\n to: format(addDays(state.origin, state.selection.to), API_DATE_FORMAT),\n };\n}\n\nexport function createTimelineState(value: DateRangeValue, min: Date, max: Date): TimelineState {\n const selectedFrom = parseDate(value.from) ?? min;\n const selectedTo = parseDate(value.to) ?? max;\n const absoluteSpan = Math.max(0, differenceInCalendarDays(max, min));\n if (absoluteSpan === 0) {\n return {\n origin: min,\n viewport: { from: 0, to: 0 },\n selection: { from: 0, to: 0 },\n };\n }\n\n const selectedFromIndex = clamp(differenceInCalendarDays(selectedFrom, min), 0, absoluteSpan);\n const selectedToIndex = clamp(differenceInCalendarDays(selectedTo, min), 0, absoluteSpan);\n\n return {\n origin: min,\n viewport: { from: 0, to: absoluteSpan },\n selection: {\n from: Math.min(selectedFromIndex, selectedToIndex),\n to: Math.max(selectedFromIndex, selectedToIndex),\n },\n };\n}\n\nexport function zoomTimelineViewport(\n state: TimelineState,\n maximumIndex: number,\n factor: number,\n anchor: number,\n): TimelineState {\n if (!Number.isFinite(factor) || factor <= 0 || factor === 1) return state;\n\n const boundedMaximum = Math.max(0, maximumIndex);\n const viewportSpan = state.viewport.to - state.viewport.from;\n const selectionSpan = state.selection.to - state.selection.from;\n const minimumViewportSpan = Math.max(selectionSpan, Math.min(1, boundedMaximum));\n const scaledSpan = clamp(Math.round(viewportSpan * factor), minimumViewportSpan, boundedMaximum);\n const nextSpan =\n scaledSpan === viewportSpan\n ? clamp(viewportSpan + (factor > 1 ? 1 : -1), minimumViewportSpan, boundedMaximum)\n : scaledSpan;\n if (nextSpan === viewportSpan) return state;\n\n const normalizedAnchor = Number.isFinite(anchor) ? clamp(anchor, 0, 1) : 0.5;\n const anchorIndex = state.viewport.from + viewportSpan * normalizedAnchor;\n const desiredFrom = Math.round(anchorIndex - nextSpan * normalizedAnchor);\n const earliestFrom = Math.max(0, state.selection.to - nextSpan);\n const latestFrom = Math.min(state.selection.from, boundedMaximum - nextSpan);\n const from = clamp(desiredFrom, earliestFrom, latestFrom);\n\n return {\n ...state,\n viewport: { from, to: from + nextSpan },\n };\n}\n\nexport function revealTimelineSelection(\n viewport: TimelineIndexRange,\n selection: TimelineIndexRange,\n maximumIndex: number,\n): TimelineIndexRange {\n const boundedMaximum = Math.max(0, maximumIndex);\n const selectionFrom = clamp(Math.min(selection.from, selection.to), 0, boundedMaximum);\n const selectionTo = clamp(Math.max(selection.from, selection.to), selectionFrom, boundedMaximum);\n const viewportSpan = clamp(viewport.to - viewport.from, 0, boundedMaximum);\n const viewportFrom = clamp(viewport.from, 0, boundedMaximum - viewportSpan);\n const normalizedViewport = { from: viewportFrom, to: viewportFrom + viewportSpan };\n const selectionSpan = selectionTo - selectionFrom;\n const nextSpan = Math.max(viewportSpan, selectionSpan);\n\n if (selectionFrom >= normalizedViewport.from && selectionTo <= normalizedViewport.to) {\n if (normalizedViewport.from === viewport.from && normalizedViewport.to === viewport.to) {\n return viewport;\n }\n return normalizedViewport;\n }\n\n const desiredFrom = selectionFrom < normalizedViewport.from ? selectionFrom : selectionTo - nextSpan;\n const from = clamp(desiredFrom, 0, boundedMaximum - nextSpan);\n return { from, to: from + nextSpan };\n}\n\nexport function getTimelinePosition(index: number, viewport: TimelineIndexRange) {\n const viewportSpan = viewport.to - viewport.from;\n if (viewportSpan === 0) return 50;\n return ((index - viewport.from) / viewportSpan) * 100;\n}\n\nexport function buildTimelineTickOffsets(span: number) {\n const boundedSpan = Math.max(0, Math.floor(span));\n const tickCount = boundedSpan === 0 ? 1 : Math.min(5, boundedSpan + 1);\n\n return Array.from({ length: tickCount }, (_, index) =>\n Math.round((boundedSpan * index) / Math.max(1, tickCount - 1)),\n );\n}\n\nexport function buildTimelineTicks(domainFrom: Date, domainTo: Date): TimelineTick[] {\n const span = Math.max(0, differenceInCalendarDays(domainTo, domainFrom));\n const crossesYears = domainFrom.getFullYear() !== domainTo.getFullYear();\n\n return buildTimelineTickOffsets(span).map(dayOffset => {\n const date = addDays(domainFrom, dayOffset);\n const labelFormat = span > 365 || crossesYears ? 'MMM yyyy' : 'MMM d';\n\n return {\n label: format(date, labelFormat),\n date: format(date, API_DATE_FORMAT),\n position: span === 0 ? 50 : (dayOffset / span) * 100,\n };\n });\n}\n\nexport function clampDateRangeToBounds(value: DateRangeValue, bounds: DateRangeBounds): DateRangeValue {\n const min = parseDate(bounds.min);\n const max = parseDate(bounds.max);\n if (!min || !max) return value;\n\n const from = parseDate(value.from) ?? min;\n const to = parseDate(value.to) ?? max;\n const clampedFrom = new Date(clamp(from.getTime(), min.getTime(), max.getTime()));\n const clampedTo = new Date(clamp(to.getTime(), clampedFrom.getTime(), max.getTime()));\n\n return {\n from: format(clampedFrom, API_DATE_FORMAT),\n to: format(clampedTo, API_DATE_FORMAT),\n };\n}\n\nexport function getDateRangeBounds(createdAt: string, today: string): DateRangeBounds {\n const max = parseDate(today) ?? new Date();\n const created = parseDate(createdAt) ?? max;\n const min = created > max ? max : created;\n return {\n min: format(min, API_DATE_FORMAT),\n max: format(max, API_DATE_FORMAT),\n };\n}\n\nexport function formatDateRangeDuration(value: DateRangeValue) {\n const from = parseDate(value.from);\n const to = parseDate(value.to);\n if (!from || !to) return '';\n const days = Math.max(1, differenceInCalendarDays(to, from) + 1);\n return days === 1 ? '1 day' : `${days} days`;\n}\n\nexport function formatDateRangeValueText(value: DateRangeValue) {\n const from = parseDate(value.from);\n const to = parseDate(value.to);\n if (!from || !to) return `${value.from} through ${value.to}`;\n return `${format(from, 'MMMM d, yyyy')} through ${format(to, 'MMMM d, yyyy')}`;\n}\n","import { format } from 'date-fns';\nimport { CalendarDaysIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { parseDate } from './lib/date-range-timeline';\nimport type { DateBoundary } from './lib/date-range-timeline';\nimport { Button } from '@/ds/components/Button/Button';\nimport { DatePicker } from '@/ds/components/DateTimePicker';\nimport { Popover, PopoverTrigger, PopoverContent } from '@/ds/components/Popover/popover';\nimport { Txt } from '@/ds/components/Txt/Txt';\n\ninterface DateRangeBoundaryPickerProps {\n boundary: DateBoundary;\n value: string;\n min: string;\n max: string;\n onSelect: (boundary: DateBoundary, value: string) => void;\n}\n\nexport function DateRangeBoundaryPicker({ boundary, value, min, max, onSelect }: DateRangeBoundaryPickerProps) {\n const [open, setOpen] = useState(false);\n const isFrom = boundary === 'from';\n const boundaryLabel = isFrom ? 'start date' : 'end date';\n const selectedDate = parseDate(value);\n const firstDate = parseDate(min) ?? selectedDate;\n const lastDate = parseDate(max) ?? selectedDate;\n const formattedDate = selectedDate ? format(selectedDate, 'MMM d, yyyy') : value;\n\n function handleSelect(date?: Date) {\n if (!date) return;\n onSelect(boundary, format(date, 'yyyy-MM-dd'));\n setOpen(false);\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <Button\n aria-label={`Choose ${boundaryLabel}, ${formattedDate}`}\n aria-expanded={open}\n size=\"xs\"\n className=\"h-11 w-full min-w-0 justify-between gap-2 overflow-hidden px-3 sm:h-8\"\n >\n <Txt as=\"span\" variant=\"ui-sm\" className=\"truncate text-neutral5 tabular-nums\">\n {formattedDate}\n </Txt>\n <CalendarDaysIcon className=\"size-3.5 shrink-0 text-neutral3\" aria-hidden=\"true\" />\n </Button>\n }\n />\n <PopoverContent align={isFrom ? 'start' : 'end'} className=\"w-auto p-0\" sideOffset={6}>\n <DatePicker\n mode=\"single\"\n selected={selectedDate}\n defaultMonth={selectedDate}\n fromMonth={firstDate}\n toMonth={lastDate}\n disabled={firstDate && lastDate ? { before: firstDate, after: lastDate } : undefined}\n onSelect={handleSelect}\n />\n </PopoverContent>\n </Popover>\n );\n}\n","import { clamp } from './date-range-timeline';\n\nconst PREFERRED_PICKER_WIDTH = 160;\nconst PREFERRED_PICKER_GAP = 8;\n\ninterface BoundaryPositions {\n from: number;\n to: number;\n}\n\ninterface BoundaryPickerRect {\n left: number;\n width: number;\n}\n\nexport interface DateRangeBoundaryLayout {\n from: BoundaryPickerRect;\n to: BoundaryPickerRect;\n gap: number;\n}\n\nexport function resolveDateRangeBoundaryLayout(\n requestedWidth: number,\n positions: BoundaryPositions,\n): DateRangeBoundaryLayout {\n const width = Math.max(0, requestedWidth);\n const gap = Math.min(PREFERRED_PICKER_GAP, width);\n const pickerWidth = Math.min(PREFERRED_PICKER_WIDTH, Math.max(0, (width - gap) / 2));\n const maximumLeft = Math.max(0, width - pickerWidth);\n const fromAnchor = (clamp(positions.from, 0, 100) / 100) * width;\n const toAnchor = (clamp(positions.to, 0, 100) / 100) * width;\n const preferredFromLeft = clamp(fromAnchor - pickerWidth - gap / 2, 0, maximumLeft);\n const preferredToLeft = clamp(toAnchor + gap / 2, 0, maximumLeft);\n const overlap = preferredFromLeft + pickerWidth + gap - preferredToLeft;\n\n if (overlap <= 0) {\n return {\n from: { left: preferredFromLeft, width: pickerWidth },\n to: { left: preferredToLeft, width: pickerWidth },\n gap,\n };\n }\n\n const pairWidth = pickerWidth * 2 + gap;\n const pairLeft = clamp(preferredFromLeft - overlap / 2, 0, Math.max(0, width - pairWidth));\n\n return {\n from: { left: pairLeft, width: pickerWidth },\n to: { left: pairLeft + pickerWidth + gap, width: pickerWidth },\n gap,\n };\n}\n","import { useLayoutEffect, useState } from 'react';\nimport type { RefObject } from 'react';\nimport { resolveDateRangeBoundaryLayout } from '../lib/date-range-boundary-layout';\nimport type { DateRangeBoundaryLayout } from '../lib/date-range-boundary-layout';\n\ninterface BoundaryPositions {\n from: number;\n to: number;\n}\n\nexport function useDateRangeBoundaryLayout(\n containerRef: RefObject<HTMLDivElement | null>,\n positions: BoundaryPositions,\n): DateRangeBoundaryLayout | undefined {\n const [containerWidth, setContainerWidth] = useState<number>();\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n function updateWidth(width: number) {\n // Accept 0 (collapsed container) so stale positions don't linger; reject\n // only invalid measurements. resolveDateRangeBoundaryLayout handles 0.\n if (!Number.isFinite(width) || width < 0) return;\n setContainerWidth(current => (current === width ? current : width));\n }\n\n updateWidth(container.getBoundingClientRect().width);\n if (typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(entries => {\n const entry = entries.find(({ target }) => target === container) ?? entries[0];\n const width = entry?.contentRect.width ?? container.getBoundingClientRect().width;\n updateWidth(width);\n });\n observer.observe(container);\n return () => observer.disconnect();\n }, [containerRef]);\n\n return containerWidth === undefined ? undefined : resolveDateRangeBoundaryLayout(containerWidth, positions);\n}\n","import { useRef } from 'react';\nimport { DateRangeBoundaryPicker } from './DateRangeBoundaryPicker';\nimport { useDateRangeBoundaryLayout } from './hooks/useDateRangeBoundaryLayout';\nimport type { DateBoundary } from './lib/date-range-timeline';\nimport type { DateRangeValue } from './types';\n\ninterface DateRangeBoundaryPickersProps {\n positions: { from: number; to: number };\n value: DateRangeValue;\n min: string;\n max: string;\n onSelect: (boundary: DateBoundary, value: string) => void;\n}\n\nconst FALLBACK_PICKER_WIDTH = 'clamp(0px, calc(50% - 0.25rem), 10rem)';\n\nexport function DateRangeBoundaryPickers({ positions, value, min, max, onSelect }: DateRangeBoundaryPickersProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const layout = useDateRangeBoundaryLayout(containerRef, positions);\n\n return (\n <div ref={containerRef} className=\"relative h-16 sm:h-12\">\n <div\n className=\"absolute top-0 min-w-0\"\n style={{\n left: layout?.from.left ?? 0,\n width: layout?.from.width ?? FALLBACK_PICKER_WIDTH,\n }}\n >\n <DateRangeBoundaryPicker boundary=\"from\" value={value.from} min={min} max={value.to} onSelect={onSelect} />\n </div>\n\n <div\n className=\"absolute top-0 min-w-0\"\n style={{\n left: layout?.to.left ?? 'max(calc(50% + 0.25rem), calc(100% - 10rem))',\n width: layout?.to.width ?? FALLBACK_PICKER_WIDTH,\n }}\n >\n <DateRangeBoundaryPicker boundary=\"to\" value={value.to} min={value.from} max={max} onSelect={onSelect} />\n </div>\n\n <div\n className=\"absolute top-11 h-4 w-px -translate-x-1/2 bg-border2 transition-[left] duration-150 ease-out motion-reduce:transition-none sm:top-8\"\n style={{ left: `${positions.from}%` }}\n aria-hidden=\"true\"\n />\n <div\n className=\"absolute top-11 h-4 w-px -translate-x-1/2 bg-border2 transition-[left] duration-150 ease-out motion-reduce:transition-none sm:top-8\"\n style={{ left: `${positions.to}%` }}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n","import { format } from 'date-fns';\nimport { parseDate } from './lib/date-range-timeline';\nimport type { TimelineTick } from './lib/date-range-timeline';\nimport { Txt } from '@/ds/components/Txt/Txt';\n\ninterface DateRangeTicksProps {\n ticks: TimelineTick[];\n min: string;\n max: string;\n}\n\nfunction formatBoundaryDate(value: string) {\n const date = parseDate(value);\n return date ? format(date, 'MMM d, yyyy') : value;\n}\n\nexport function DateRangeTicks({ ticks, min, max }: DateRangeTicksProps) {\n const firstTick = ticks[0];\n const lastTick = ticks.at(-1);\n if (!firstTick || !lastTick) return null;\n const timelineLabel = `Visible from ${formatBoundaryDate(firstTick.date)} through ${formatBoundaryDate(lastTick.date)}. Available from ${formatBoundaryDate(min)} through ${formatBoundaryDate(max)}`;\n\n if (firstTick.date === lastTick.date) {\n const date = formatBoundaryDate(firstTick.date);\n // Only claim \"Created today\" when the whole available domain is a single\n // day; a zoomed viewport can hold one tick for any date, so stay neutral.\n const singleLabel =\n firstTick.date === min && firstTick.date === max\n ? `Created today · ${date}`\n : firstTick.date === min\n ? `Created · ${date}`\n : firstTick.date === max\n ? `Today · ${date}`\n : date;\n return (\n <div role=\"group\" aria-label={timelineLabel} className=\"flex h-10 items-start justify-center pt-2\">\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral3\">\n {singleLabel}\n </Txt>\n </div>\n );\n }\n\n const startLabel = firstTick.date === min ? `Created · ${formatBoundaryDate(min)}` : firstTick.label;\n const endLabel = lastTick.date === max ? `Today · ${formatBoundaryDate(max)}` : lastTick.label;\n const middleTicks = ticks.slice(1, -1);\n\n return (\n <div role=\"group\" className=\"relative h-10\" aria-label={timelineLabel}>\n <div className=\"absolute top-0 left-0 flex flex-col items-start\">\n <span className=\"mb-1 h-1.5 w-px bg-border2\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"whitespace-nowrap text-neutral3\">\n {startLabel}\n </Txt>\n </div>\n\n {middleTicks.map(tick => (\n <div\n key={tick.date}\n className=\"absolute top-0 hidden -translate-x-1/2 flex-col items-center sm:flex\"\n style={{ left: `${tick.position}%` }}\n aria-hidden=\"true\"\n >\n <span className=\"mb-1 h-1.5 w-px bg-border2\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-xs\" className=\"whitespace-nowrap text-neutral3\">\n {tick.label}\n </Txt>\n </div>\n ))}\n\n <div className=\"absolute top-0 right-0 flex flex-col items-end\">\n <span className=\"mb-1 h-1.5 w-px bg-border2\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"whitespace-nowrap text-neutral3\">\n {endLabel}\n </Txt>\n </div>\n </div>\n );\n}\n","import { format } from 'date-fns';\nimport type { KeyboardEventHandler, PointerEventHandler } from 'react';\nimport { parseDate } from './lib/date-range-timeline';\nimport type { DateBoundary } from './lib/date-range-timeline';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeHandleProps {\n boundary: DateBoundary;\n position: number;\n value: number;\n valueText: string;\n min: number;\n max: number;\n active: boolean;\n onPointerDown: PointerEventHandler<HTMLDivElement>;\n onKeyDown: KeyboardEventHandler<HTMLDivElement>;\n}\n\nexport function DateRangeHandle({\n boundary,\n position,\n value,\n valueText,\n min,\n max,\n active,\n onPointerDown,\n onKeyDown,\n}: DateRangeHandleProps) {\n const label = boundary === 'from' ? 'Start date handle' : 'End date handle';\n const date = parseDate(valueText);\n const accessibleValue = date ? format(date, 'MMMM d, yyyy') : valueText;\n\n return (\n <div\n role=\"slider\"\n tabIndex={0}\n aria-label={label}\n aria-orientation=\"horizontal\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={accessibleValue}\n className=\"group absolute inset-y-0 z-30 w-11 -translate-x-1/2 cursor-ew-resize touch-none outline-hidden\"\n style={{ left: `${position}%` }}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n >\n <span\n className={cn(\n 'absolute top-1/2 left-1/2 h-7 w-1.5 -translate-1/2 rounded-xs bg-surface3 ring-1 transition-[width,box-shadow] duration-150 group-hover:w-2 group-focus-visible:w-2 group-focus-visible:ring-2 group-focus-visible:ring-accent3 motion-reduce:transition-none',\n active ? 'w-2 ring-2 ring-neutral3/40' : 'ring-border2',\n )}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n","import type { KeyboardEventHandler, PointerEventHandler } from 'react';\nimport { Txt } from '@/ds/components/Txt/Txt';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeSelectionProps {\n left: number;\n width: number;\n duration: string;\n active: boolean;\n value: number;\n valueText: string;\n max: number;\n onPointerDown: PointerEventHandler<HTMLDivElement>;\n onKeyDown: KeyboardEventHandler<HTMLDivElement>;\n}\n\nexport function DateRangeSelection({\n left,\n width,\n duration,\n active,\n value,\n valueText,\n max,\n onPointerDown,\n onKeyDown,\n}: DateRangeSelectionProps) {\n const visibleWidth = Math.max(width, 0.6);\n const visibleLeft = Math.min(left, 100 - visibleWidth);\n const showDuration = width >= 12;\n return (\n <div\n role=\"slider\"\n tabIndex={0}\n aria-label=\"Move selected date range\"\n aria-orientation=\"horizontal\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={valueText}\n className={cn(\n 'absolute inset-y-1 z-10 flex cursor-grab touch-none items-center justify-center overflow-hidden rounded-md bg-neutral6/10 text-neutral6 select-none outline-hidden focus-visible:ring-2 focus-visible:ring-accent3 active:cursor-grabbing',\n active\n ? 'transition-none'\n : 'transition-[left,width,background-color] duration-150 ease-out motion-reduce:transition-none',\n )}\n style={{ left: `${visibleLeft}%`, width: `${visibleWidth}%` }}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n >\n {showDuration ? (\n // TODO(ds): Txt needs a compact data-label variant.\n <Txt as=\"span\" variant=\"ui-sm\" font=\"mono\" className=\"text-neutral6 tabular-nums\">\n {duration}\n </Txt>\n ) : null}\n </div>\n );\n}\n","import type { DateRangeGridMarker } from './lib/date-range-timeline-grid';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeTrackGridProps {\n markers: DateRangeGridMarker[];\n}\n\nfunction getMarkerHeight(emphasis: DateRangeGridMarker['emphasis']) {\n if (emphasis === 'major') return 'h-5';\n if (emphasis === 'medium') return 'h-3';\n return 'h-1.5';\n}\n\nexport function DateRangeTrackGrid({ markers }: DateRangeTrackGridProps) {\n return (\n <div className=\"pointer-events-none absolute inset-0 overflow-hidden rounded-lg\" aria-hidden=\"true\">\n {markers.map(marker => (\n <span\n key={marker.index}\n className={cn('absolute top-1/2 w-px -translate-1/2 bg-neutral3/15', getMarkerHeight(marker.emphasis))}\n style={{ left: `${marker.position}%` }}\n />\n ))}\n </div>\n );\n}\n","import { clamp } from './date-range-timeline';\nimport type { DateBoundary, TimelineIndexRange } from './date-range-timeline';\n\ninterface TimelineTrackGeometry {\n left: number;\n width: number;\n}\n\nexport type TimelinePointerGesture =\n | { type: 'brush'; startIndex: number }\n | { type: 'pan'; startIndex: number; originalSelection: TimelineIndexRange }\n | { type: 'handle'; boundary: DateBoundary; originalSelection: TimelineIndexRange };\n\nexport type TimelineInteraction =\n { type: 'selecting' } | { type: 'moving' } | { type: 'resizing'; boundary: DateBoundary };\n\nconst KEYBOARD_LARGE_STEP_DAYS = 7;\n\nfunction getKeyboardDelta(key: string) {\n if (key === 'ArrowLeft' || key === 'ArrowDown') return -1;\n if (key === 'ArrowRight' || key === 'ArrowUp') return 1;\n if (key === 'PageDown') return -KEYBOARD_LARGE_STEP_DAYS;\n if (key === 'PageUp') return KEYBOARD_LARGE_STEP_DAYS;\n return undefined;\n}\n\nexport function getTimelineInteraction(gesture: TimelinePointerGesture): TimelineInteraction {\n if (gesture.type === 'brush') return { type: 'selecting' };\n if (gesture.type === 'pan') return { type: 'moving' };\n return { type: 'resizing', boundary: gesture.boundary };\n}\n\nexport function getTimelineIndexAtClientX(\n clientX: number,\n track: TimelineTrackGeometry | undefined,\n viewport: TimelineIndexRange,\n) {\n const viewportSpan = viewport.to - viewport.from;\n if (!track || track.width <= 0 || viewportSpan <= 0) return viewport.from;\n\n const position = clamp((clientX - track.left) / track.width, 0, 1);\n return viewport.from + Math.round(position * viewportSpan);\n}\n\nexport function resolveTimelineGestureSelection(\n gesture: TimelinePointerGesture,\n pointerIndex: number,\n viewport: TimelineIndexRange,\n): TimelineIndexRange {\n const boundedPointerIndex = clamp(pointerIndex, viewport.from, viewport.to);\n\n if (gesture.type === 'brush') {\n return {\n from: Math.min(gesture.startIndex, boundedPointerIndex),\n to: Math.max(gesture.startIndex, boundedPointerIndex),\n };\n }\n\n if (gesture.type === 'pan') {\n const selectionSpan = gesture.originalSelection.to - gesture.originalSelection.from;\n const delta = boundedPointerIndex - gesture.startIndex;\n const from = clamp(gesture.originalSelection.from + delta, viewport.from, viewport.to - selectionSpan);\n return { from, to: from + selectionSpan };\n }\n\n if (gesture.boundary === 'from') {\n return {\n from: clamp(boundedPointerIndex, viewport.from, gesture.originalSelection.to),\n to: gesture.originalSelection.to,\n };\n }\n\n return {\n from: gesture.originalSelection.from,\n to: clamp(boundedPointerIndex, gesture.originalSelection.from, viewport.to),\n };\n}\n\nexport function moveTimelineSelectionFromKey(selection: TimelineIndexRange, key: string, maximumIndex: number) {\n const span = selection.to - selection.from;\n if (key === 'Home') return { from: 0, to: span };\n if (key === 'End') return { from: maximumIndex - span, to: maximumIndex };\n\n const delta = getKeyboardDelta(key);\n if (delta === undefined) return undefined;\n const from = clamp(selection.from + delta, 0, maximumIndex - span);\n return { from, to: from + span };\n}\n\nexport function resizeTimelineSelectionFromKey(\n selection: TimelineIndexRange,\n boundary: DateBoundary,\n key: string,\n maximumIndex: number,\n) {\n const { from, to } = selection;\n if (key === 'Home') return boundary === 'from' ? { from: 0, to } : { from, to: from };\n if (key === 'End') {\n return boundary === 'from' ? { from: to, to } : { from, to: maximumIndex };\n }\n\n const delta = getKeyboardDelta(key);\n if (delta === undefined) return undefined;\n return boundary === 'from'\n ? { from: clamp(from + delta, 0, to), to }\n : { from, to: clamp(to + delta, from, maximumIndex) };\n}\n","import type { KeyboardEvent } from 'react';\nimport type { DateBoundary, TimelineIndexRange } from '../lib/date-range-timeline';\nimport { moveTimelineSelectionFromKey, resizeTimelineSelectionFromKey } from '../lib/date-range-timeline-interactions';\n\ninterface UseDateRangeKeyboardControlsInput {\n selection: TimelineIndexRange;\n maximumIndex: number;\n onCommit: (selection: TimelineIndexRange) => void;\n}\n\nexport function useDateRangeKeyboardControls({ selection, maximumIndex, onCommit }: UseDateRangeKeyboardControlsInput) {\n function handleSelectionKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const nextSelection = moveTimelineSelectionFromKey(selection, event.key, maximumIndex);\n if (!nextSelection) return;\n\n event.preventDefault();\n onCommit(nextSelection);\n }\n\n function handleBoundaryKeyDown(boundary: DateBoundary, event: KeyboardEvent<HTMLDivElement>) {\n const nextSelection = resizeTimelineSelectionFromKey(selection, boundary, event.key, maximumIndex);\n if (!nextSelection) return;\n\n event.preventDefault();\n onCommit(nextSelection);\n }\n\n function handleFromKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n handleBoundaryKeyDown('from', event);\n }\n\n function handleToKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n handleBoundaryKeyDown('to', event);\n }\n\n return {\n handleSelectionKeyDown,\n handleFromKeyDown,\n handleToKeyDown,\n };\n}\n","import { useRef } from 'react';\nimport type { PointerEvent } from 'react';\n\ninterface PointerDragSession<TPayload> {\n pointerId: number;\n captureTarget: HTMLElement;\n payload: TPayload;\n}\n\ninterface UsePointerDragInput<TPayload> {\n onMove: (payload: TPayload, event: PointerEvent<HTMLElement>) => void;\n onEnd: (payload: TPayload, event: PointerEvent<HTMLElement>) => void;\n onCancel: (payload: TPayload, event: PointerEvent<HTMLElement>) => void;\n}\n\nexport function usePointerDrag<TPayload>({ onMove, onEnd, onCancel }: UsePointerDragInput<TPayload>) {\n const sessionRef = useRef<PointerDragSession<TPayload> | undefined>(undefined);\n\n function startPointerDrag(event: PointerEvent<HTMLElement>, payload: TPayload) {\n if (sessionRef.current) return false;\n\n const captureTarget = event.currentTarget;\n captureTarget.setPointerCapture(event.pointerId);\n sessionRef.current = {\n pointerId: event.pointerId,\n captureTarget,\n payload,\n };\n return true;\n }\n\n function getSession(event: PointerEvent<HTMLElement>) {\n const session = sessionRef.current;\n if (!session || session.pointerId !== event.pointerId) return undefined;\n return session;\n }\n\n function releaseSession(session: PointerDragSession<TPayload>) {\n sessionRef.current = undefined;\n if (!session.captureTarget.hasPointerCapture(session.pointerId)) return;\n session.captureTarget.releasePointerCapture(session.pointerId);\n }\n\n function handlePointerMove(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n onMove(session.payload, event);\n }\n\n function handlePointerUp(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n releaseSession(session);\n onEnd(session.payload, event);\n }\n\n function handlePointerCancel(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n releaseSession(session);\n onCancel(session.payload, event);\n }\n\n function handleLostPointerCapture(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n sessionRef.current = undefined;\n onCancel(session.payload, event);\n }\n\n return {\n startPointerDrag,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n handleLostPointerCapture,\n };\n}\n","import { useState } from 'react';\nimport type { PointerEvent, RefObject } from 'react';\nimport type { DateBoundary, TimelineIndexRange, TimelineState } from '../lib/date-range-timeline';\nimport {\n getTimelineIndexAtClientX,\n getTimelineInteraction,\n resolveTimelineGestureSelection,\n} from '../lib/date-range-timeline-interactions';\nimport type { TimelineInteraction, TimelinePointerGesture } from '../lib/date-range-timeline-interactions';\nimport { usePointerDrag } from './use-pointer-drag';\n\nexport type { TimelineInteraction } from '../lib/date-range-timeline-interactions';\n\ninterface TimelinePointerDrag {\n gesture: TimelinePointerGesture;\n currentSelection: TimelineIndexRange;\n}\n\ninterface UseDateRangePointerGesturesInput {\n trackRef: RefObject<HTMLDivElement | null>;\n timeline: TimelineState;\n onSelectionPreview: (selection: TimelineIndexRange) => void;\n onSelectionCommit: (selection: TimelineIndexRange) => void;\n onSelectionCancel: () => void;\n}\n\nexport function useDateRangePointerGestures({\n trackRef,\n timeline,\n onSelectionPreview,\n onSelectionCommit,\n onSelectionCancel,\n}: UseDateRangePointerGesturesInput) {\n const [interaction, setInteraction] = useState<TimelineInteraction>();\n\n function getPointerIndex(clientX: number) {\n const track = trackRef.current?.getBoundingClientRect();\n return getTimelineIndexAtClientX(clientX, track, timeline.viewport);\n }\n\n function previewPointerDrag(drag: TimelinePointerDrag, event: PointerEvent<HTMLElement>) {\n const pointerIndex = getPointerIndex(event.clientX);\n const selection = resolveTimelineGestureSelection(drag.gesture, pointerIndex, timeline.viewport);\n drag.currentSelection = selection;\n onSelectionPreview(selection);\n }\n\n function commitPointerDrag(drag: TimelinePointerDrag, event: PointerEvent<HTMLElement>) {\n previewPointerDrag(drag, event);\n setInteraction(undefined);\n onSelectionCommit(drag.currentSelection);\n }\n\n function cancelPointerDrag() {\n setInteraction(undefined);\n onSelectionCancel();\n }\n\n const pointerDrag = usePointerDrag<TimelinePointerDrag>({\n onMove: previewPointerDrag,\n onEnd: commitPointerDrag,\n onCancel: cancelPointerDrag,\n });\n\n function beginPointerDrag(\n event: PointerEvent<HTMLDivElement>,\n gesture: TimelinePointerGesture,\n currentSelection: TimelineIndexRange,\n ) {\n const started = pointerDrag.startPointerDrag(event, { gesture, currentSelection });\n if (!started) return false;\n setInteraction(getTimelineInteraction(gesture));\n return true;\n }\n\n function startBrush(event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n const startIndex = getPointerIndex(event.clientX);\n const selection = { from: startIndex, to: startIndex };\n const started = beginPointerDrag(\n event,\n {\n type: 'brush',\n startIndex,\n },\n selection,\n );\n if (!started) return;\n onSelectionPreview(selection);\n }\n\n function startPan(event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n beginPointerDrag(\n event,\n {\n type: 'pan',\n startIndex: getPointerIndex(event.clientX),\n originalSelection: timeline.selection,\n },\n timeline.selection,\n );\n }\n\n function startHandle(boundary: DateBoundary, event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n beginPointerDrag(\n event,\n {\n type: 'handle',\n boundary,\n originalSelection: timeline.selection,\n },\n timeline.selection,\n );\n }\n\n function handlePointerMove(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handlePointerMove(event);\n }\n\n function handlePointerUp(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handlePointerUp(event);\n }\n\n function handlePointerCancel(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handlePointerCancel(event);\n }\n\n function handleLostPointerCapture(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handleLostPointerCapture(event);\n }\n\n return {\n interaction,\n startBrush,\n startPan,\n startHandle,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n handleLostPointerCapture,\n };\n}\n","import { useEffect, useEffectEvent } from 'react';\nimport type { RefObject } from 'react';\nimport { clamp } from '../lib/date-range-timeline';\n\nconst MAX_WHEEL_DELTA = 80;\nconst WHEEL_ZOOM_SENSITIVITY = 0.003;\n\ninterface UseDateRangeWheelZoomInput {\n rootRef: RefObject<HTMLDivElement | null>;\n trackRef: RefObject<HTMLDivElement | null>;\n disabled: boolean;\n onZoom: (factor: number, anchor: number) => void;\n}\n\nexport function useDateRangeWheelZoom({ rootRef, trackRef, disabled, onZoom }: UseDateRangeWheelZoomInput) {\n const handleWheel = useEffectEvent((event: WheelEvent) => {\n if (!event.ctrlKey) return;\n // Bail before preventDefault when disabled so native browser zoom still works.\n if (disabled) return;\n event.preventDefault();\n\n const trackRect = trackRef.current?.getBoundingClientRect();\n const anchor =\n trackRect && trackRect.width > 0 ? clamp((event.clientX - trackRect.left) / trackRect.width, 0, 1) : 0.5;\n const wheelDelta = clamp(event.deltaY, -MAX_WHEEL_DELTA, MAX_WHEEL_DELTA);\n const factor = Math.exp(wheelDelta * WHEEL_ZOOM_SENSITIVITY);\n onZoom(factor, anchor);\n });\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n root.addEventListener('wheel', handleWheel, { passive: false });\n return () => root.removeEventListener('wheel', handleWheel);\n }, [rootRef]);\n}\n","import { buildTimelineTickOffsets, getTimelinePosition } from './date-range-timeline';\nimport type { TimelineIndexRange } from './date-range-timeline';\n\nconst MAX_GRID_INTERVALS = 24;\n\nexport interface DateRangeGridMarker {\n index: number;\n position: number;\n emphasis: 'major' | 'medium' | 'minor';\n}\n\nfunction addVisibleMarker(markerIndices: Set<number>, index: number, viewport: TimelineIndexRange) {\n if (index >= viewport.from && index <= viewport.to) {\n markerIndices.add(index);\n }\n}\n\nfunction getMarkerEmphasis(\n index: number,\n majorIndices: Set<number>,\n mediumIndices: Set<number>,\n): DateRangeGridMarker['emphasis'] {\n if (majorIndices.has(index)) return 'major';\n if (mediumIndices.has(index)) return 'medium';\n return 'minor';\n}\n\nexport function createDateRangeGridMarkers(\n viewport: TimelineIndexRange,\n selection: TimelineIndexRange,\n): DateRangeGridMarker[] {\n const viewportSpan = Math.max(0, viewport.to - viewport.from);\n if (viewportSpan === 0) {\n return [{ index: viewport.from, position: 50, emphasis: 'major' }];\n }\n\n const sampleStep = Math.max(1, Math.ceil(viewportSpan / MAX_GRID_INTERVALS));\n const markerIndices = new Set<number>();\n const majorIndices = new Set<number>();\n const mediumIndices = new Set<number>();\n const tickOffsets = buildTimelineTickOffsets(viewportSpan);\n\n for (let index = viewport.from; index <= viewport.to; index += sampleStep) {\n markerIndices.add(index);\n }\n\n for (let index = 0; index < tickOffsets.length; index += 1) {\n const tickOffset = tickOffsets[index];\n if (tickOffset === undefined) continue;\n\n const majorIndex = viewport.from + tickOffset;\n markerIndices.add(majorIndex);\n majorIndices.add(majorIndex);\n\n const nextTickOffset = tickOffsets[index + 1];\n if (nextTickOffset === undefined) continue;\n\n const mediumIndex = viewport.from + Math.round((tickOffset + nextTickOffset) / 2);\n markerIndices.add(mediumIndex);\n mediumIndices.add(mediumIndex);\n }\n\n addVisibleMarker(markerIndices, selection.from, viewport);\n addVisibleMarker(markerIndices, selection.to, viewport);\n\n return [...markerIndices]\n .sort((left, right) => left - right)\n .map(index => ({\n index,\n position: getTimelinePosition(index, viewport),\n emphasis: getMarkerEmphasis(index, majorIndices, mediumIndices),\n }));\n}\n","import { addDays } from 'date-fns';\nimport {\n buildTimelineTicks,\n formatDateRangeDuration,\n formatDateRangeValueText,\n getTimelinePosition,\n toDateRange,\n} from './date-range-timeline';\nimport type { TimelineState } from './date-range-timeline';\n\nexport function createDateRangeBoundaryModel(state: TimelineState) {\n const range = toDateRange(state);\n const fromPosition = getTimelinePosition(state.selection.from, state.viewport);\n const toPosition = getTimelinePosition(state.selection.to, state.viewport);\n\n return {\n positions: { from: fromPosition, to: toPosition },\n range,\n };\n}\n\nexport function createDateRangeTrackModel(state: TimelineState, maximumIndex: number) {\n const range = toDateRange(state);\n const fromPosition = getTimelinePosition(state.selection.from, state.viewport);\n const toPosition = getTimelinePosition(state.selection.to, state.viewport);\n const span = state.selection.to - state.selection.from;\n\n return {\n handles: {\n from: {\n position: fromPosition,\n value: state.selection.from,\n valueText: range.from,\n min: 0,\n max: state.selection.to,\n },\n to: {\n position: toPosition,\n value: state.selection.to,\n valueText: range.to,\n min: state.selection.from,\n max: maximumIndex,\n },\n },\n selection: {\n left: fromPosition,\n width: Math.max(0, toPosition - fromPosition),\n duration: formatDateRangeDuration(range),\n value: state.selection.from,\n valueText: formatDateRangeValueText(range),\n max: maximumIndex - span,\n },\n };\n}\n\nexport function createDateRangeAxisModel(state: TimelineState) {\n const visibleFrom = addDays(state.origin, state.viewport.from);\n const visibleTo = addDays(state.origin, state.viewport.to);\n return { ticks: buildTimelineTicks(visibleFrom, visibleTo) };\n}\n","import { useRef } from 'react';\nimport type { PointerEvent, RefObject } from 'react';\nimport { DateRangeHandle } from './DateRangeHandle';\nimport { DateRangeSelection } from './DateRangeSelection';\nimport { DateRangeTrackGrid } from './DateRangeTrackGrid';\nimport { useDateRangeKeyboardControls } from './hooks/useDateRangeKeyboardControls';\nimport { useDateRangePointerGestures } from './hooks/useDateRangePointerGestures';\nimport { useDateRangeWheelZoom } from './hooks/useDateRangeWheelZoom';\nimport type { TimelineIndexRange, TimelineState } from './lib/date-range-timeline';\nimport { createDateRangeGridMarkers } from './lib/date-range-timeline-grid';\nimport { createDateRangeTrackModel } from './lib/date-range-timeline-view-model';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeTrackProps {\n wheelTargetRef: RefObject<HTMLDivElement | null>;\n timeline: TimelineState;\n maximumIndex: number;\n onSelectionPreview: (selection: TimelineIndexRange) => void;\n onSelectionCommit: (selection: TimelineIndexRange) => void;\n onSelectionCancel: () => void;\n onZoom: (factor: number, anchor: number) => void;\n}\n\nexport function DateRangeTrack({\n wheelTargetRef,\n timeline,\n maximumIndex,\n onSelectionPreview,\n onSelectionCommit,\n onSelectionCancel,\n onZoom,\n}: DateRangeTrackProps) {\n const trackRef = useRef<HTMLDivElement>(null);\n const pointer = useDateRangePointerGestures({\n trackRef,\n timeline,\n onSelectionPreview,\n onSelectionCommit,\n onSelectionCancel,\n });\n const { handleSelectionKeyDown, handleFromKeyDown, handleToKeyDown } = useDateRangeKeyboardControls({\n selection: timeline.selection,\n maximumIndex,\n onCommit: onSelectionCommit,\n });\n\n useDateRangeWheelZoom({\n rootRef: wheelTargetRef,\n trackRef,\n disabled: pointer.interaction !== undefined,\n onZoom,\n });\n\n const model = createDateRangeTrackModel(timeline, maximumIndex);\n const gridMarkers = createDateRangeGridMarkers(timeline.viewport, timeline.selection);\n\n function startFromHandle(event: PointerEvent<HTMLDivElement>) {\n pointer.startHandle('from', event);\n }\n\n function startToHandle(event: PointerEvent<HTMLDivElement>) {\n pointer.startHandle('to', event);\n }\n\n return (\n <div\n ref={trackRef}\n role=\"group\"\n aria-label=\"Date range selection area\"\n className={cn(\n 'relative h-12 touch-none rounded-lg bg-surface4',\n pointer.interaction?.type === 'selecting' ? 'cursor-col-resize' : 'cursor-crosshair',\n )}\n onPointerDown={pointer.startBrush}\n onPointerMove={pointer.handlePointerMove}\n onPointerUp={pointer.handlePointerUp}\n onPointerCancel={pointer.handlePointerCancel}\n onLostPointerCapture={pointer.handleLostPointerCapture}\n >\n <DateRangeTrackGrid markers={gridMarkers} />\n <DateRangeSelection\n left={model.selection.left}\n width={model.selection.width}\n duration={model.selection.duration}\n active={pointer.interaction !== undefined}\n value={model.selection.value}\n valueText={model.selection.valueText}\n max={model.selection.max}\n onPointerDown={pointer.startPan}\n onKeyDown={handleSelectionKeyDown}\n />\n <DateRangeHandle\n boundary=\"from\"\n position={model.handles.from.position}\n value={model.handles.from.value}\n valueText={model.handles.from.valueText}\n min={model.handles.from.min}\n max={model.handles.from.max}\n active={pointer.interaction?.type === 'resizing' && pointer.interaction.boundary === 'from'}\n onPointerDown={startFromHandle}\n onKeyDown={handleFromKeyDown}\n />\n <DateRangeHandle\n boundary=\"to\"\n position={model.handles.to.position}\n value={model.handles.to.value}\n valueText={model.handles.to.valueText}\n min={model.handles.to.min}\n max={model.handles.to.max}\n active={pointer.interaction?.type === 'resizing' && pointer.interaction.boundary === 'to'}\n onPointerDown={startToHandle}\n onKeyDown={handleToKeyDown}\n />\n </div>\n );\n}\n","import { addDays, differenceInCalendarDays } from 'date-fns';\nimport { useState } from 'react';\nimport {\n clamp,\n createTimelineState,\n parseDate,\n revealTimelineSelection,\n toDateRange,\n zoomTimelineViewport,\n} from '../lib/date-range-timeline';\nimport type { DateBoundary, TimelineIndexRange } from '../lib/date-range-timeline';\nimport type { DateRangeValue } from '../types';\n\ninterface UseDateRangeTimelineStateInput {\n value: DateRangeValue;\n min: string;\n max: string;\n onCommit: (value: DateRangeValue) => void;\n}\n\nfunction resolveTimelineBounds(min: string, max: string) {\n const fallbackMax = new Date();\n const maxDate = parseDate(max) ?? fallbackMax;\n const requestedMin = parseDate(min) ?? addDays(maxDate, -365);\n const minDate = requestedMin > maxDate ? maxDate : requestedMin;\n return { minDate, maxDate };\n}\n\nexport function useDateRangeTimelineState({ value, min, max, onCommit }: UseDateRangeTimelineStateInput) {\n const { minDate, maxDate } = resolveTimelineBounds(min, max);\n const committedTimeline = createTimelineState(value, minDate, maxDate);\n const maximumIndex = Math.max(0, differenceInCalendarDays(maxDate, minDate));\n const [viewport, setViewport] = useState(() => committedTimeline.viewport);\n const [draftSelection, setDraftSelection] = useState<TimelineIndexRange>();\n const selection = draftSelection ?? committedTimeline.selection;\n const state = {\n ...committedTimeline,\n viewport: revealTimelineSelection(viewport, selection, maximumIndex),\n selection,\n };\n\n function previewSelection(nextSelection: TimelineIndexRange) {\n setDraftSelection(nextSelection);\n }\n\n function cancelSelection() {\n setDraftSelection(undefined);\n }\n\n function commitSelection(nextSelection: TimelineIndexRange) {\n setDraftSelection(undefined);\n setViewport(current => revealTimelineSelection(current, nextSelection, maximumIndex));\n onCommit(toDateRange({ ...state, selection: nextSelection }));\n }\n\n function zoom(factor: number, anchor: number) {\n setViewport(current => {\n const visibleViewport = revealTimelineSelection(current, state.selection, maximumIndex);\n return zoomTimelineViewport({ ...state, viewport: visibleViewport }, maximumIndex, factor, anchor).viewport;\n });\n }\n\n function selectDate(boundary: DateBoundary, nextValue: string) {\n const date = parseDate(nextValue);\n if (!date) return;\n\n const dateIndex = clamp(differenceInCalendarDays(date, state.origin), 0, maximumIndex);\n const nextSelection =\n boundary === 'from'\n ? {\n from: clamp(dateIndex, 0, state.selection.to),\n to: state.selection.to,\n }\n : {\n from: state.selection.from,\n to: clamp(dateIndex, state.selection.from, maximumIndex),\n };\n commitSelection(nextSelection);\n }\n\n return {\n state,\n maximumIndex,\n previewSelection,\n cancelSelection,\n commitSelection,\n zoom,\n selectDate,\n };\n}\n","import { useId, useRef } from 'react';\nimport { DateRangeBoundaryPickers } from './DateRangeBoundaryPickers';\nimport { DateRangeTicks } from './DateRangeTicks';\nimport { DateRangeTrack } from './DateRangeTrack';\nimport { useDateRangeTimelineState } from './hooks/useDateRangeTimelineState';\nimport { createDateRangeAxisModel, createDateRangeBoundaryModel } from './lib/date-range-timeline-view-model';\nimport type { DateRangeValue } from './types';\nimport { Txt } from '@/ds/components/Txt/Txt';\n\ninterface DateRangeTimelineProps {\n value: DateRangeValue;\n min: string;\n max: string;\n onCommit: (value: DateRangeValue) => void;\n}\n\nexport function DateRangeTimeline({ value, min, max, onCommit }: DateRangeTimelineProps) {\n const hintId = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const timeline = useDateRangeTimelineState({\n value,\n min,\n max,\n onCommit,\n });\n const boundaryModel = createDateRangeBoundaryModel(timeline.state);\n const axisModel = createDateRangeAxisModel(timeline.state);\n\n return (\n <div\n ref={rootRef}\n role=\"group\"\n aria-label=\"Date range timeline\"\n aria-describedby={hintId}\n className=\"w-full overflow-x-clip select-none\"\n >\n <div className=\"flex min-h-6 items-start justify-between gap-4 pb-1\">\n {/* TODO(ds): Txt needs a muted interaction-hint variant. */}\n <Txt id={hintId} as=\"span\" variant=\"ui-sm\" className=\"text-neutral3\">\n Drag to select\n </Txt>\n <div className=\"flex items-center gap-2 text-neutral3\">\n {/* TODO(ds): Txt needs a muted interaction-hint variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"hidden text-neutral3 sm:inline\">\n Drag range to move\n </Txt>\n <span className=\"hidden h-3 w-px bg-border2 sm:block\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted interaction-hint variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral3\">\n Pinch to zoom\n </Txt>\n </div>\n </div>\n\n <DateRangeBoundaryPickers\n positions={boundaryModel.positions}\n value={boundaryModel.range}\n min={min}\n max={max}\n onSelect={timeline.selectDate}\n />\n\n <DateRangeTrack\n wheelTargetRef={rootRef}\n timeline={timeline.state}\n maximumIndex={timeline.maximumIndex}\n onSelectionPreview={timeline.previewSelection}\n onSelectionCommit={timeline.commitSelection}\n onSelectionCancel={timeline.cancelSelection}\n onZoom={timeline.zoom}\n />\n\n <DateRangeTicks ticks={axisModel.ticks} min={min} max={max} />\n </div>\n );\n}\n"],"names":["parseISO","isValid","format","addDays","differenceInCalendarDays","useState","jsxs","Popover","jsx","PopoverTrigger","Button","Txt","CalendarDaysIcon","PopoverContent","DatePicker","useLayoutEffect","useRef","cn","useEffectEvent","useEffect","useId"],"mappings":"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"}
1
+ {"version":3,"file":"DateRangeTimeline.cjs.js","sources":["../../src/ds/components/DateRangeTimeline/lib/date-range-timeline.ts","../../src/ds/components/DateRangeTimeline/DateRangeBoundaryPicker.tsx","../../src/ds/components/DateRangeTimeline/lib/date-range-boundary-layout.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeBoundaryLayout.ts","../../src/ds/components/DateRangeTimeline/DateRangeBoundaryPickers.tsx","../../src/ds/components/DateRangeTimeline/DateRangeTicks.tsx","../../src/ds/components/DateRangeTimeline/DateRangeHandle.tsx","../../src/ds/components/DateRangeTimeline/DateRangeSelection.tsx","../../src/ds/components/DateRangeTimeline/DateRangeTrackGrid.tsx","../../src/ds/components/DateRangeTimeline/lib/date-range-timeline-interactions.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeKeyboardControls.ts","../../src/ds/components/DateRangeTimeline/hooks/use-pointer-drag.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangePointerGestures.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeWheelZoom.ts","../../src/ds/components/DateRangeTimeline/lib/date-range-timeline-grid.ts","../../src/ds/components/DateRangeTimeline/lib/date-range-timeline-view-model.ts","../../src/ds/components/DateRangeTimeline/DateRangeTrack.tsx","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeTimelineState.ts","../../src/ds/components/DateRangeTimeline/DateRangeTimeline.tsx"],"sourcesContent":["import { addDays, differenceInCalendarDays, format, isValid, parseISO } from 'date-fns';\nimport type { DateRangeValue, DateRangeBounds } from '../types';\n\nconst API_DATE_FORMAT = 'yyyy-MM-dd';\n\nexport type DateBoundary = 'from' | 'to';\n\nexport interface TimelineIndexRange {\n from: number;\n to: number;\n}\n\nexport interface TimelineState {\n origin: Date;\n viewport: TimelineIndexRange;\n selection: TimelineIndexRange;\n}\n\nexport interface TimelineTick {\n date: string;\n label: string;\n position: number;\n}\n\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function parseDate(value: string) {\n const date = parseISO(value);\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || !isValid(date)) return undefined;\n return format(date, API_DATE_FORMAT) === value ? date : undefined;\n}\n\nexport function toDateRange(state: TimelineState): DateRangeValue {\n return {\n from: format(addDays(state.origin, state.selection.from), API_DATE_FORMAT),\n to: format(addDays(state.origin, state.selection.to), API_DATE_FORMAT),\n };\n}\n\nexport function createTimelineState(value: DateRangeValue, min: Date, max: Date): TimelineState {\n const selectedFrom = parseDate(value.from) ?? min;\n const selectedTo = parseDate(value.to) ?? max;\n const absoluteSpan = Math.max(0, differenceInCalendarDays(max, min));\n if (absoluteSpan === 0) {\n return {\n origin: min,\n viewport: { from: 0, to: 0 },\n selection: { from: 0, to: 0 },\n };\n }\n\n const selectedFromIndex = clamp(differenceInCalendarDays(selectedFrom, min), 0, absoluteSpan);\n const selectedToIndex = clamp(differenceInCalendarDays(selectedTo, min), 0, absoluteSpan);\n\n return {\n origin: min,\n viewport: { from: 0, to: absoluteSpan },\n selection: {\n from: Math.min(selectedFromIndex, selectedToIndex),\n to: Math.max(selectedFromIndex, selectedToIndex),\n },\n };\n}\n\nexport function zoomTimelineViewport(\n state: TimelineState,\n maximumIndex: number,\n factor: number,\n anchor: number,\n): TimelineState {\n if (!Number.isFinite(factor) || factor <= 0 || factor === 1) return state;\n\n const boundedMaximum = Math.max(0, maximumIndex);\n const viewportSpan = state.viewport.to - state.viewport.from;\n const selectionSpan = state.selection.to - state.selection.from;\n const minimumViewportSpan = Math.max(selectionSpan, Math.min(1, boundedMaximum));\n const scaledSpan = clamp(Math.round(viewportSpan * factor), minimumViewportSpan, boundedMaximum);\n const nextSpan =\n scaledSpan === viewportSpan\n ? clamp(viewportSpan + (factor > 1 ? 1 : -1), minimumViewportSpan, boundedMaximum)\n : scaledSpan;\n if (nextSpan === viewportSpan) return state;\n\n const normalizedAnchor = Number.isFinite(anchor) ? clamp(anchor, 0, 1) : 0.5;\n const anchorIndex = state.viewport.from + viewportSpan * normalizedAnchor;\n const desiredFrom = Math.round(anchorIndex - nextSpan * normalizedAnchor);\n const earliestFrom = Math.max(0, state.selection.to - nextSpan);\n const latestFrom = Math.min(state.selection.from, boundedMaximum - nextSpan);\n const from = clamp(desiredFrom, earliestFrom, latestFrom);\n\n return {\n ...state,\n viewport: { from, to: from + nextSpan },\n };\n}\n\nexport function revealTimelineSelection(\n viewport: TimelineIndexRange,\n selection: TimelineIndexRange,\n maximumIndex: number,\n): TimelineIndexRange {\n const boundedMaximum = Math.max(0, maximumIndex);\n const selectionFrom = clamp(Math.min(selection.from, selection.to), 0, boundedMaximum);\n const selectionTo = clamp(Math.max(selection.from, selection.to), selectionFrom, boundedMaximum);\n const viewportSpan = clamp(viewport.to - viewport.from, 0, boundedMaximum);\n const viewportFrom = clamp(viewport.from, 0, boundedMaximum - viewportSpan);\n const normalizedViewport = { from: viewportFrom, to: viewportFrom + viewportSpan };\n const selectionSpan = selectionTo - selectionFrom;\n const nextSpan = Math.max(viewportSpan, selectionSpan);\n\n if (selectionFrom >= normalizedViewport.from && selectionTo <= normalizedViewport.to) {\n if (normalizedViewport.from === viewport.from && normalizedViewport.to === viewport.to) {\n return viewport;\n }\n return normalizedViewport;\n }\n\n const desiredFrom = selectionFrom < normalizedViewport.from ? selectionFrom : selectionTo - nextSpan;\n const from = clamp(desiredFrom, 0, boundedMaximum - nextSpan);\n return { from, to: from + nextSpan };\n}\n\nexport function getTimelinePosition(index: number, viewport: TimelineIndexRange) {\n const viewportSpan = viewport.to - viewport.from;\n if (viewportSpan === 0) return 50;\n return ((index - viewport.from) / viewportSpan) * 100;\n}\n\nexport function buildTimelineTickOffsets(span: number) {\n const boundedSpan = Math.max(0, Math.floor(span));\n const tickCount = boundedSpan === 0 ? 1 : Math.min(5, boundedSpan + 1);\n\n return Array.from({ length: tickCount }, (_, index) =>\n Math.round((boundedSpan * index) / Math.max(1, tickCount - 1)),\n );\n}\n\nexport function buildTimelineTicks(domainFrom: Date, domainTo: Date): TimelineTick[] {\n const span = Math.max(0, differenceInCalendarDays(domainTo, domainFrom));\n const crossesYears = domainFrom.getFullYear() !== domainTo.getFullYear();\n\n return buildTimelineTickOffsets(span).map(dayOffset => {\n const date = addDays(domainFrom, dayOffset);\n const labelFormat = span > 365 || crossesYears ? 'MMM yyyy' : 'MMM d';\n\n return {\n label: format(date, labelFormat),\n date: format(date, API_DATE_FORMAT),\n position: span === 0 ? 50 : (dayOffset / span) * 100,\n };\n });\n}\n\nexport function clampDateRangeToBounds(value: DateRangeValue, bounds: DateRangeBounds): DateRangeValue {\n const min = parseDate(bounds.min);\n const max = parseDate(bounds.max);\n if (!min || !max) return value;\n\n const from = parseDate(value.from) ?? min;\n const to = parseDate(value.to) ?? max;\n const clampedFrom = new Date(clamp(from.getTime(), min.getTime(), max.getTime()));\n const clampedTo = new Date(clamp(to.getTime(), clampedFrom.getTime(), max.getTime()));\n\n return {\n from: format(clampedFrom, API_DATE_FORMAT),\n to: format(clampedTo, API_DATE_FORMAT),\n };\n}\n\nexport function getDateRangeBounds(createdAt: string, today: string): DateRangeBounds {\n const max = parseDate(today) ?? new Date();\n const created = parseDate(createdAt) ?? max;\n const min = created > max ? max : created;\n return {\n min: format(min, API_DATE_FORMAT),\n max: format(max, API_DATE_FORMAT),\n };\n}\n\nexport function formatDateRangeDuration(value: DateRangeValue) {\n const from = parseDate(value.from);\n const to = parseDate(value.to);\n if (!from || !to) return '';\n const days = Math.max(1, differenceInCalendarDays(to, from) + 1);\n return days === 1 ? '1 day' : `${days} days`;\n}\n\nexport function formatDateRangeValueText(value: DateRangeValue) {\n const from = parseDate(value.from);\n const to = parseDate(value.to);\n if (!from || !to) return `${value.from} through ${value.to}`;\n return `${format(from, 'MMMM d, yyyy')} through ${format(to, 'MMMM d, yyyy')}`;\n}\n","import { format } from 'date-fns';\nimport { CalendarDaysIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { parseDate } from './lib/date-range-timeline';\nimport type { DateBoundary } from './lib/date-range-timeline';\nimport { Button } from '@/ds/components/Button/Button';\nimport { DatePicker } from '@/ds/components/DateTimePicker';\nimport { Popover, PopoverTrigger, PopoverContent } from '@/ds/components/Popover/popover';\nimport { Txt } from '@/ds/components/Txt/Txt';\n\ninterface DateRangeBoundaryPickerProps {\n boundary: DateBoundary;\n value: string;\n min: string;\n max: string;\n onSelect: (boundary: DateBoundary, value: string) => void;\n}\n\nexport function DateRangeBoundaryPicker({ boundary, value, min, max, onSelect }: DateRangeBoundaryPickerProps) {\n const [open, setOpen] = useState(false);\n const isFrom = boundary === 'from';\n const boundaryLabel = isFrom ? 'start date' : 'end date';\n const selectedDate = parseDate(value);\n const firstDate = parseDate(min) ?? selectedDate;\n const lastDate = parseDate(max) ?? selectedDate;\n const formattedDate = selectedDate ? format(selectedDate, 'MMM d, yyyy') : value;\n\n function handleSelect(date?: Date) {\n if (!date) return;\n onSelect(boundary, format(date, 'yyyy-MM-dd'));\n setOpen(false);\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <Button\n aria-label={`Choose ${boundaryLabel}, ${formattedDate}`}\n aria-expanded={open}\n size=\"xs\"\n className=\"h-11 w-full min-w-0 justify-between gap-2 overflow-hidden px-3 sm:h-8\"\n >\n <Txt as=\"span\" variant=\"ui-sm\" className=\"truncate text-neutral5 tabular-nums\">\n {formattedDate}\n </Txt>\n <CalendarDaysIcon className=\"size-3.5 shrink-0 text-neutral3\" aria-hidden=\"true\" />\n </Button>\n }\n />\n <PopoverContent align={isFrom ? 'start' : 'end'} className=\"w-auto p-0\" sideOffset={6}>\n <DatePicker\n mode=\"single\"\n selected={selectedDate}\n defaultMonth={selectedDate}\n fromMonth={firstDate}\n toMonth={lastDate}\n disabled={firstDate && lastDate ? { before: firstDate, after: lastDate } : undefined}\n onSelect={handleSelect}\n />\n </PopoverContent>\n </Popover>\n );\n}\n","import { clamp } from './date-range-timeline';\n\nconst PREFERRED_PICKER_WIDTH = 160;\nconst PREFERRED_PICKER_GAP = 8;\n\ninterface BoundaryPositions {\n from: number;\n to: number;\n}\n\ninterface BoundaryPickerRect {\n left: number;\n width: number;\n}\n\nexport interface DateRangeBoundaryLayout {\n from: BoundaryPickerRect;\n to: BoundaryPickerRect;\n gap: number;\n}\n\nexport function resolveDateRangeBoundaryLayout(\n requestedWidth: number,\n positions: BoundaryPositions,\n): DateRangeBoundaryLayout {\n const width = Math.max(0, requestedWidth);\n const gap = Math.min(PREFERRED_PICKER_GAP, width);\n const pickerWidth = Math.min(PREFERRED_PICKER_WIDTH, Math.max(0, (width - gap) / 2));\n const maximumLeft = Math.max(0, width - pickerWidth);\n const fromAnchor = (clamp(positions.from, 0, 100) / 100) * width;\n const toAnchor = (clamp(positions.to, 0, 100) / 100) * width;\n const preferredFromLeft = clamp(fromAnchor - pickerWidth - gap / 2, 0, maximumLeft);\n const preferredToLeft = clamp(toAnchor + gap / 2, 0, maximumLeft);\n const overlap = preferredFromLeft + pickerWidth + gap - preferredToLeft;\n\n if (overlap <= 0) {\n return {\n from: { left: preferredFromLeft, width: pickerWidth },\n to: { left: preferredToLeft, width: pickerWidth },\n gap,\n };\n }\n\n const pairWidth = pickerWidth * 2 + gap;\n const pairLeft = clamp(preferredFromLeft - overlap / 2, 0, Math.max(0, width - pairWidth));\n\n return {\n from: { left: pairLeft, width: pickerWidth },\n to: { left: pairLeft + pickerWidth + gap, width: pickerWidth },\n gap,\n };\n}\n","import { useLayoutEffect, useState } from 'react';\nimport type { RefObject } from 'react';\nimport { resolveDateRangeBoundaryLayout } from '../lib/date-range-boundary-layout';\nimport type { DateRangeBoundaryLayout } from '../lib/date-range-boundary-layout';\n\ninterface BoundaryPositions {\n from: number;\n to: number;\n}\n\nexport function useDateRangeBoundaryLayout(\n containerRef: RefObject<HTMLDivElement | null>,\n positions: BoundaryPositions,\n): DateRangeBoundaryLayout | undefined {\n const [containerWidth, setContainerWidth] = useState<number>();\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n function updateWidth(width: number) {\n // Accept 0 (collapsed container) so stale positions don't linger; reject\n // only invalid measurements. resolveDateRangeBoundaryLayout handles 0.\n if (!Number.isFinite(width) || width < 0) return;\n setContainerWidth(current => (current === width ? current : width));\n }\n\n updateWidth(container.getBoundingClientRect().width);\n if (typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(entries => {\n const entry = entries.find(({ target }) => target === container) ?? entries[0];\n const width = entry?.contentRect.width ?? container.getBoundingClientRect().width;\n updateWidth(width);\n });\n observer.observe(container);\n return () => observer.disconnect();\n }, [containerRef]);\n\n return containerWidth === undefined ? undefined : resolveDateRangeBoundaryLayout(containerWidth, positions);\n}\n","import { useRef } from 'react';\nimport { DateRangeBoundaryPicker } from './DateRangeBoundaryPicker';\nimport { useDateRangeBoundaryLayout } from './hooks/useDateRangeBoundaryLayout';\nimport type { DateBoundary } from './lib/date-range-timeline';\nimport type { DateRangeValue } from './types';\n\ninterface DateRangeBoundaryPickersProps {\n positions: { from: number; to: number };\n value: DateRangeValue;\n min: string;\n max: string;\n onSelect: (boundary: DateBoundary, value: string) => void;\n}\n\nconst FALLBACK_PICKER_WIDTH = 'clamp(0px, calc(50% - 0.25rem), 10rem)';\n\nexport function DateRangeBoundaryPickers({ positions, value, min, max, onSelect }: DateRangeBoundaryPickersProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const layout = useDateRangeBoundaryLayout(containerRef, positions);\n\n return (\n <div ref={containerRef} className=\"relative h-16 sm:h-12\">\n <div\n className=\"absolute top-0 min-w-0\"\n style={{\n left: layout?.from.left ?? 0,\n width: layout?.from.width ?? FALLBACK_PICKER_WIDTH,\n }}\n >\n <DateRangeBoundaryPicker boundary=\"from\" value={value.from} min={min} max={value.to} onSelect={onSelect} />\n </div>\n\n <div\n className=\"absolute top-0 min-w-0\"\n style={{\n left: layout?.to.left ?? 'max(calc(50% + 0.25rem), calc(100% - 10rem))',\n width: layout?.to.width ?? FALLBACK_PICKER_WIDTH,\n }}\n >\n <DateRangeBoundaryPicker boundary=\"to\" value={value.to} min={value.from} max={max} onSelect={onSelect} />\n </div>\n\n <div\n className=\"absolute top-11 h-4 w-px -translate-x-1/2 bg-border2 transition-[left] duration-150 ease-out motion-reduce:transition-none sm:top-8\"\n style={{ left: `${positions.from}%` }}\n aria-hidden=\"true\"\n />\n <div\n className=\"absolute top-11 h-4 w-px -translate-x-1/2 bg-border2 transition-[left] duration-150 ease-out motion-reduce:transition-none sm:top-8\"\n style={{ left: `${positions.to}%` }}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n","import { format } from 'date-fns';\nimport { parseDate } from './lib/date-range-timeline';\nimport type { TimelineTick } from './lib/date-range-timeline';\nimport { Txt } from '@/ds/components/Txt/Txt';\n\ninterface DateRangeTicksProps {\n ticks: TimelineTick[];\n min: string;\n max: string;\n}\n\nfunction formatBoundaryDate(value: string) {\n const date = parseDate(value);\n return date ? format(date, 'MMM d, yyyy') : value;\n}\n\nexport function DateRangeTicks({ ticks, min, max }: DateRangeTicksProps) {\n const firstTick = ticks[0];\n const lastTick = ticks.at(-1);\n if (!firstTick || !lastTick) return null;\n const timelineLabel = `Visible from ${formatBoundaryDate(firstTick.date)} through ${formatBoundaryDate(lastTick.date)}. Available from ${formatBoundaryDate(min)} through ${formatBoundaryDate(max)}`;\n\n if (firstTick.date === lastTick.date) {\n const date = formatBoundaryDate(firstTick.date);\n // Only claim \"Created today\" when the whole available domain is a single\n // day; a zoomed viewport can hold one tick for any date, so stay neutral.\n const singleLabel =\n firstTick.date === min && firstTick.date === max\n ? `Created today · ${date}`\n : firstTick.date === min\n ? `Created · ${date}`\n : firstTick.date === max\n ? `Today · ${date}`\n : date;\n return (\n <div role=\"group\" aria-label={timelineLabel} className=\"flex h-10 items-start justify-center pt-2\">\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral3\">\n {singleLabel}\n </Txt>\n </div>\n );\n }\n\n const startLabel = firstTick.date === min ? `Created · ${formatBoundaryDate(min)}` : firstTick.label;\n const endLabel = lastTick.date === max ? `Today · ${formatBoundaryDate(max)}` : lastTick.label;\n const middleTicks = ticks.slice(1, -1);\n\n return (\n <div role=\"group\" className=\"relative h-10\" aria-label={timelineLabel}>\n <div className=\"absolute top-0 left-0 flex flex-col items-start\">\n <span className=\"mb-1 h-1.5 w-px bg-border2\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"whitespace-nowrap text-neutral3\">\n {startLabel}\n </Txt>\n </div>\n\n {middleTicks.map(tick => (\n <div\n key={tick.date}\n className=\"absolute top-0 hidden -translate-x-1/2 flex-col items-center sm:flex\"\n style={{ left: `${tick.position}%` }}\n aria-hidden=\"true\"\n >\n <span className=\"mb-1 h-1.5 w-px bg-border2\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-xs\" className=\"whitespace-nowrap text-neutral3\">\n {tick.label}\n </Txt>\n </div>\n ))}\n\n <div className=\"absolute top-0 right-0 flex flex-col items-end\">\n <span className=\"mb-1 h-1.5 w-px bg-border2\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"whitespace-nowrap text-neutral3\">\n {endLabel}\n </Txt>\n </div>\n </div>\n );\n}\n","import { format } from 'date-fns';\nimport type { KeyboardEventHandler, PointerEventHandler } from 'react';\nimport { parseDate } from './lib/date-range-timeline';\nimport type { DateBoundary } from './lib/date-range-timeline';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeHandleProps {\n boundary: DateBoundary;\n position: number;\n value: number;\n valueText: string;\n min: number;\n max: number;\n active: boolean;\n onPointerDown: PointerEventHandler<HTMLDivElement>;\n onKeyDown: KeyboardEventHandler<HTMLDivElement>;\n}\n\nexport function DateRangeHandle({\n boundary,\n position,\n value,\n valueText,\n min,\n max,\n active,\n onPointerDown,\n onKeyDown,\n}: DateRangeHandleProps) {\n const label = boundary === 'from' ? 'Start date handle' : 'End date handle';\n const date = parseDate(valueText);\n const accessibleValue = date ? format(date, 'MMMM d, yyyy') : valueText;\n\n return (\n <div\n role=\"slider\"\n tabIndex={0}\n aria-label={label}\n aria-orientation=\"horizontal\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={accessibleValue}\n className=\"group absolute inset-y-0 z-30 w-11 -translate-x-1/2 cursor-ew-resize touch-none outline-hidden\"\n style={{ left: `${position}%` }}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n >\n <span\n className={cn(\n 'absolute top-1/2 left-1/2 h-7 w-1.5 -translate-1/2 rounded-xs bg-surface3 ring-1 transition-[width,box-shadow] duration-150 group-hover:w-2 group-focus-visible:w-2 group-focus-visible:ring-2 group-focus-visible:ring-accent3 motion-reduce:transition-none',\n active ? 'w-2 ring-2 ring-neutral3/40' : 'ring-border2',\n )}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n","import type { KeyboardEventHandler, PointerEventHandler } from 'react';\nimport { Txt } from '@/ds/components/Txt/Txt';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeSelectionProps {\n left: number;\n width: number;\n duration: string;\n active: boolean;\n value: number;\n valueText: string;\n max: number;\n onPointerDown: PointerEventHandler<HTMLDivElement>;\n onKeyDown: KeyboardEventHandler<HTMLDivElement>;\n}\n\nexport function DateRangeSelection({\n left,\n width,\n duration,\n active,\n value,\n valueText,\n max,\n onPointerDown,\n onKeyDown,\n}: DateRangeSelectionProps) {\n const visibleWidth = Math.max(width, 0.6);\n const visibleLeft = Math.min(left, 100 - visibleWidth);\n const showDuration = width >= 12;\n return (\n <div\n role=\"slider\"\n tabIndex={0}\n aria-label=\"Move selected date range\"\n aria-orientation=\"horizontal\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={valueText}\n className={cn(\n 'absolute inset-y-1 z-10 flex cursor-grab touch-none items-center justify-center overflow-hidden rounded-md bg-neutral6/10 text-neutral6 select-none outline-hidden focus-visible:ring-2 focus-visible:ring-accent3 active:cursor-grabbing',\n active\n ? 'transition-none'\n : 'transition-[left,width,background-color] duration-150 ease-out motion-reduce:transition-none',\n )}\n style={{ left: `${visibleLeft}%`, width: `${visibleWidth}%` }}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n >\n {showDuration ? (\n // TODO(ds): Txt needs a compact data-label variant.\n <Txt as=\"span\" variant=\"ui-sm\" font=\"mono\" className=\"text-neutral6 tabular-nums\">\n {duration}\n </Txt>\n ) : null}\n </div>\n );\n}\n","import type { DateRangeGridMarker } from './lib/date-range-timeline-grid';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeTrackGridProps {\n markers: DateRangeGridMarker[];\n}\n\nfunction getMarkerHeight(emphasis: DateRangeGridMarker['emphasis']) {\n if (emphasis === 'major') return 'h-5';\n if (emphasis === 'medium') return 'h-3';\n return 'h-1.5';\n}\n\nexport function DateRangeTrackGrid({ markers }: DateRangeTrackGridProps) {\n return (\n <div className=\"pointer-events-none absolute inset-0 overflow-hidden rounded-lg\" aria-hidden=\"true\">\n {markers.map(marker => (\n <span\n key={marker.index}\n className={cn('absolute top-1/2 w-px -translate-1/2 bg-neutral3/15', getMarkerHeight(marker.emphasis))}\n style={{ left: `${marker.position}%` }}\n />\n ))}\n </div>\n );\n}\n","import { clamp } from './date-range-timeline';\nimport type { DateBoundary, TimelineIndexRange } from './date-range-timeline';\n\ninterface TimelineTrackGeometry {\n left: number;\n width: number;\n}\n\nexport type TimelinePointerGesture =\n | { type: 'brush'; startIndex: number }\n | { type: 'pan'; startIndex: number; originalSelection: TimelineIndexRange }\n | { type: 'handle'; boundary: DateBoundary; originalSelection: TimelineIndexRange };\n\nexport type TimelineInteraction =\n { type: 'selecting' } | { type: 'moving' } | { type: 'resizing'; boundary: DateBoundary };\n\nconst KEYBOARD_LARGE_STEP_DAYS = 7;\n\nfunction getKeyboardDelta(key: string) {\n if (key === 'ArrowLeft' || key === 'ArrowDown') return -1;\n if (key === 'ArrowRight' || key === 'ArrowUp') return 1;\n if (key === 'PageDown') return -KEYBOARD_LARGE_STEP_DAYS;\n if (key === 'PageUp') return KEYBOARD_LARGE_STEP_DAYS;\n return undefined;\n}\n\nexport function getTimelineInteraction(gesture: TimelinePointerGesture): TimelineInteraction {\n if (gesture.type === 'brush') return { type: 'selecting' };\n if (gesture.type === 'pan') return { type: 'moving' };\n return { type: 'resizing', boundary: gesture.boundary };\n}\n\nexport function getTimelineIndexAtClientX(\n clientX: number,\n track: TimelineTrackGeometry | undefined,\n viewport: TimelineIndexRange,\n) {\n const viewportSpan = viewport.to - viewport.from;\n if (!track || track.width <= 0 || viewportSpan <= 0) return viewport.from;\n\n const position = clamp((clientX - track.left) / track.width, 0, 1);\n return viewport.from + Math.round(position * viewportSpan);\n}\n\nexport function resolveTimelineGestureSelection(\n gesture: TimelinePointerGesture,\n pointerIndex: number,\n viewport: TimelineIndexRange,\n): TimelineIndexRange {\n const boundedPointerIndex = clamp(pointerIndex, viewport.from, viewport.to);\n\n if (gesture.type === 'brush') {\n return {\n from: Math.min(gesture.startIndex, boundedPointerIndex),\n to: Math.max(gesture.startIndex, boundedPointerIndex),\n };\n }\n\n if (gesture.type === 'pan') {\n const selectionSpan = gesture.originalSelection.to - gesture.originalSelection.from;\n const delta = boundedPointerIndex - gesture.startIndex;\n const from = clamp(gesture.originalSelection.from + delta, viewport.from, viewport.to - selectionSpan);\n return { from, to: from + selectionSpan };\n }\n\n if (gesture.boundary === 'from') {\n return {\n from: clamp(boundedPointerIndex, viewport.from, gesture.originalSelection.to),\n to: gesture.originalSelection.to,\n };\n }\n\n return {\n from: gesture.originalSelection.from,\n to: clamp(boundedPointerIndex, gesture.originalSelection.from, viewport.to),\n };\n}\n\nexport function moveTimelineSelectionFromKey(selection: TimelineIndexRange, key: string, maximumIndex: number) {\n const span = selection.to - selection.from;\n if (key === 'Home') return { from: 0, to: span };\n if (key === 'End') return { from: maximumIndex - span, to: maximumIndex };\n\n const delta = getKeyboardDelta(key);\n if (delta === undefined) return undefined;\n const from = clamp(selection.from + delta, 0, maximumIndex - span);\n return { from, to: from + span };\n}\n\nexport function resizeTimelineSelectionFromKey(\n selection: TimelineIndexRange,\n boundary: DateBoundary,\n key: string,\n maximumIndex: number,\n) {\n const { from, to } = selection;\n if (key === 'Home') return boundary === 'from' ? { from: 0, to } : { from, to: from };\n if (key === 'End') {\n return boundary === 'from' ? { from: to, to } : { from, to: maximumIndex };\n }\n\n const delta = getKeyboardDelta(key);\n if (delta === undefined) return undefined;\n return boundary === 'from'\n ? { from: clamp(from + delta, 0, to), to }\n : { from, to: clamp(to + delta, from, maximumIndex) };\n}\n","import type { KeyboardEvent } from 'react';\nimport type { DateBoundary, TimelineIndexRange } from '../lib/date-range-timeline';\nimport { moveTimelineSelectionFromKey, resizeTimelineSelectionFromKey } from '../lib/date-range-timeline-interactions';\n\ninterface UseDateRangeKeyboardControlsInput {\n selection: TimelineIndexRange;\n maximumIndex: number;\n onCommit: (selection: TimelineIndexRange) => void;\n}\n\nexport function useDateRangeKeyboardControls({ selection, maximumIndex, onCommit }: UseDateRangeKeyboardControlsInput) {\n function handleSelectionKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const nextSelection = moveTimelineSelectionFromKey(selection, event.key, maximumIndex);\n if (!nextSelection) return;\n\n event.preventDefault();\n onCommit(nextSelection);\n }\n\n function handleBoundaryKeyDown(boundary: DateBoundary, event: KeyboardEvent<HTMLDivElement>) {\n const nextSelection = resizeTimelineSelectionFromKey(selection, boundary, event.key, maximumIndex);\n if (!nextSelection) return;\n\n event.preventDefault();\n onCommit(nextSelection);\n }\n\n function handleFromKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n handleBoundaryKeyDown('from', event);\n }\n\n function handleToKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n handleBoundaryKeyDown('to', event);\n }\n\n return {\n handleSelectionKeyDown,\n handleFromKeyDown,\n handleToKeyDown,\n };\n}\n","import { useRef } from 'react';\nimport type { PointerEvent } from 'react';\n\ninterface PointerDragSession<TPayload> {\n pointerId: number;\n captureTarget: HTMLElement;\n payload: TPayload;\n}\n\ninterface UsePointerDragInput<TPayload> {\n onMove: (payload: TPayload, event: PointerEvent<HTMLElement>) => void;\n onEnd: (payload: TPayload, event: PointerEvent<HTMLElement>) => void;\n onCancel: (payload: TPayload, event: PointerEvent<HTMLElement>) => void;\n}\n\nexport function usePointerDrag<TPayload>({ onMove, onEnd, onCancel }: UsePointerDragInput<TPayload>) {\n const sessionRef = useRef<PointerDragSession<TPayload> | undefined>(undefined);\n\n function startPointerDrag(event: PointerEvent<HTMLElement>, payload: TPayload) {\n if (sessionRef.current) return false;\n\n const captureTarget = event.currentTarget;\n captureTarget.setPointerCapture(event.pointerId);\n sessionRef.current = {\n pointerId: event.pointerId,\n captureTarget,\n payload,\n };\n return true;\n }\n\n function getSession(event: PointerEvent<HTMLElement>) {\n const session = sessionRef.current;\n if (!session || session.pointerId !== event.pointerId) return undefined;\n return session;\n }\n\n function releaseSession(session: PointerDragSession<TPayload>) {\n sessionRef.current = undefined;\n if (!session.captureTarget.hasPointerCapture(session.pointerId)) return;\n session.captureTarget.releasePointerCapture(session.pointerId);\n }\n\n function handlePointerMove(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n onMove(session.payload, event);\n }\n\n function handlePointerUp(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n releaseSession(session);\n onEnd(session.payload, event);\n }\n\n function handlePointerCancel(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n releaseSession(session);\n onCancel(session.payload, event);\n }\n\n function handleLostPointerCapture(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n sessionRef.current = undefined;\n onCancel(session.payload, event);\n }\n\n return {\n startPointerDrag,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n handleLostPointerCapture,\n };\n}\n","import { useState } from 'react';\nimport type { PointerEvent, RefObject } from 'react';\nimport type { DateBoundary, TimelineIndexRange, TimelineState } from '../lib/date-range-timeline';\nimport {\n getTimelineIndexAtClientX,\n getTimelineInteraction,\n resolveTimelineGestureSelection,\n} from '../lib/date-range-timeline-interactions';\nimport type { TimelineInteraction, TimelinePointerGesture } from '../lib/date-range-timeline-interactions';\nimport { usePointerDrag } from './use-pointer-drag';\n\nexport type { TimelineInteraction } from '../lib/date-range-timeline-interactions';\n\ninterface TimelinePointerDrag {\n gesture: TimelinePointerGesture;\n currentSelection: TimelineIndexRange;\n}\n\ninterface UseDateRangePointerGesturesInput {\n trackRef: RefObject<HTMLDivElement | null>;\n timeline: TimelineState;\n onSelectionPreview: (selection: TimelineIndexRange) => void;\n onSelectionCommit: (selection: TimelineIndexRange) => void;\n onSelectionCancel: () => void;\n}\n\nexport function useDateRangePointerGestures({\n trackRef,\n timeline,\n onSelectionPreview,\n onSelectionCommit,\n onSelectionCancel,\n}: UseDateRangePointerGesturesInput) {\n const [interaction, setInteraction] = useState<TimelineInteraction>();\n\n function getPointerIndex(clientX: number) {\n const track = trackRef.current?.getBoundingClientRect();\n return getTimelineIndexAtClientX(clientX, track, timeline.viewport);\n }\n\n function previewPointerDrag(drag: TimelinePointerDrag, event: PointerEvent<HTMLElement>) {\n const pointerIndex = getPointerIndex(event.clientX);\n const selection = resolveTimelineGestureSelection(drag.gesture, pointerIndex, timeline.viewport);\n drag.currentSelection = selection;\n onSelectionPreview(selection);\n }\n\n function commitPointerDrag(drag: TimelinePointerDrag, event: PointerEvent<HTMLElement>) {\n previewPointerDrag(drag, event);\n setInteraction(undefined);\n onSelectionCommit(drag.currentSelection);\n }\n\n function cancelPointerDrag() {\n setInteraction(undefined);\n onSelectionCancel();\n }\n\n const pointerDrag = usePointerDrag<TimelinePointerDrag>({\n onMove: previewPointerDrag,\n onEnd: commitPointerDrag,\n onCancel: cancelPointerDrag,\n });\n\n function beginPointerDrag(\n event: PointerEvent<HTMLDivElement>,\n gesture: TimelinePointerGesture,\n currentSelection: TimelineIndexRange,\n ) {\n const started = pointerDrag.startPointerDrag(event, { gesture, currentSelection });\n if (!started) return false;\n setInteraction(getTimelineInteraction(gesture));\n return true;\n }\n\n function startBrush(event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n const startIndex = getPointerIndex(event.clientX);\n const selection = { from: startIndex, to: startIndex };\n const started = beginPointerDrag(\n event,\n {\n type: 'brush',\n startIndex,\n },\n selection,\n );\n if (!started) return;\n onSelectionPreview(selection);\n }\n\n function startPan(event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n beginPointerDrag(\n event,\n {\n type: 'pan',\n startIndex: getPointerIndex(event.clientX),\n originalSelection: timeline.selection,\n },\n timeline.selection,\n );\n }\n\n function startHandle(boundary: DateBoundary, event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n beginPointerDrag(\n event,\n {\n type: 'handle',\n boundary,\n originalSelection: timeline.selection,\n },\n timeline.selection,\n );\n }\n\n function handlePointerMove(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handlePointerMove(event);\n }\n\n function handlePointerUp(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handlePointerUp(event);\n }\n\n function handlePointerCancel(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handlePointerCancel(event);\n }\n\n function handleLostPointerCapture(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handleLostPointerCapture(event);\n }\n\n return {\n interaction,\n startBrush,\n startPan,\n startHandle,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n handleLostPointerCapture,\n };\n}\n","import { useEffect, useEffectEvent } from 'react';\nimport type { RefObject } from 'react';\nimport { clamp } from '../lib/date-range-timeline';\n\nconst MAX_WHEEL_DELTA = 80;\nconst WHEEL_ZOOM_SENSITIVITY = 0.003;\n\ninterface UseDateRangeWheelZoomInput {\n rootRef: RefObject<HTMLDivElement | null>;\n trackRef: RefObject<HTMLDivElement | null>;\n disabled: boolean;\n onZoom: (factor: number, anchor: number) => void;\n}\n\nexport function useDateRangeWheelZoom({ rootRef, trackRef, disabled, onZoom }: UseDateRangeWheelZoomInput) {\n const handleWheel = useEffectEvent((event: WheelEvent) => {\n if (!event.ctrlKey) return;\n // Bail before preventDefault when disabled so native browser zoom still works.\n if (disabled) return;\n event.preventDefault();\n\n const trackRect = trackRef.current?.getBoundingClientRect();\n const anchor =\n trackRect && trackRect.width > 0 ? clamp((event.clientX - trackRect.left) / trackRect.width, 0, 1) : 0.5;\n const wheelDelta = clamp(event.deltaY, -MAX_WHEEL_DELTA, MAX_WHEEL_DELTA);\n const factor = Math.exp(wheelDelta * WHEEL_ZOOM_SENSITIVITY);\n onZoom(factor, anchor);\n });\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n root.addEventListener('wheel', handleWheel, { passive: false });\n return () => root.removeEventListener('wheel', handleWheel);\n }, [rootRef]);\n}\n","import { buildTimelineTickOffsets, getTimelinePosition } from './date-range-timeline';\nimport type { TimelineIndexRange } from './date-range-timeline';\n\nconst MAX_GRID_INTERVALS = 24;\n\nexport interface DateRangeGridMarker {\n index: number;\n position: number;\n emphasis: 'major' | 'medium' | 'minor';\n}\n\nfunction addVisibleMarker(markerIndices: Set<number>, index: number, viewport: TimelineIndexRange) {\n if (index >= viewport.from && index <= viewport.to) {\n markerIndices.add(index);\n }\n}\n\nfunction getMarkerEmphasis(\n index: number,\n majorIndices: Set<number>,\n mediumIndices: Set<number>,\n): DateRangeGridMarker['emphasis'] {\n if (majorIndices.has(index)) return 'major';\n if (mediumIndices.has(index)) return 'medium';\n return 'minor';\n}\n\nexport function createDateRangeGridMarkers(\n viewport: TimelineIndexRange,\n selection: TimelineIndexRange,\n): DateRangeGridMarker[] {\n const viewportSpan = Math.max(0, viewport.to - viewport.from);\n if (viewportSpan === 0) {\n return [{ index: viewport.from, position: 50, emphasis: 'major' }];\n }\n\n const sampleStep = Math.max(1, Math.ceil(viewportSpan / MAX_GRID_INTERVALS));\n const markerIndices = new Set<number>();\n const majorIndices = new Set<number>();\n const mediumIndices = new Set<number>();\n const tickOffsets = buildTimelineTickOffsets(viewportSpan);\n\n for (let index = viewport.from; index <= viewport.to; index += sampleStep) {\n markerIndices.add(index);\n }\n\n for (let index = 0; index < tickOffsets.length; index += 1) {\n const tickOffset = tickOffsets[index];\n if (tickOffset === undefined) continue;\n\n const majorIndex = viewport.from + tickOffset;\n markerIndices.add(majorIndex);\n majorIndices.add(majorIndex);\n\n const nextTickOffset = tickOffsets[index + 1];\n if (nextTickOffset === undefined) continue;\n\n const mediumIndex = viewport.from + Math.round((tickOffset + nextTickOffset) / 2);\n markerIndices.add(mediumIndex);\n mediumIndices.add(mediumIndex);\n }\n\n addVisibleMarker(markerIndices, selection.from, viewport);\n addVisibleMarker(markerIndices, selection.to, viewport);\n\n return [...markerIndices]\n .sort((left, right) => left - right)\n .map(index => ({\n index,\n position: getTimelinePosition(index, viewport),\n emphasis: getMarkerEmphasis(index, majorIndices, mediumIndices),\n }));\n}\n","import { addDays } from 'date-fns';\nimport {\n buildTimelineTicks,\n formatDateRangeDuration,\n formatDateRangeValueText,\n getTimelinePosition,\n toDateRange,\n} from './date-range-timeline';\nimport type { TimelineState } from './date-range-timeline';\n\nexport function createDateRangeBoundaryModel(state: TimelineState) {\n const range = toDateRange(state);\n const fromPosition = getTimelinePosition(state.selection.from, state.viewport);\n const toPosition = getTimelinePosition(state.selection.to, state.viewport);\n\n return {\n positions: { from: fromPosition, to: toPosition },\n range,\n };\n}\n\nexport function createDateRangeTrackModel(state: TimelineState, maximumIndex: number) {\n const range = toDateRange(state);\n const fromPosition = getTimelinePosition(state.selection.from, state.viewport);\n const toPosition = getTimelinePosition(state.selection.to, state.viewport);\n const span = state.selection.to - state.selection.from;\n\n return {\n handles: {\n from: {\n position: fromPosition,\n value: state.selection.from,\n valueText: range.from,\n min: 0,\n max: state.selection.to,\n },\n to: {\n position: toPosition,\n value: state.selection.to,\n valueText: range.to,\n min: state.selection.from,\n max: maximumIndex,\n },\n },\n selection: {\n left: fromPosition,\n width: Math.max(0, toPosition - fromPosition),\n duration: formatDateRangeDuration(range),\n value: state.selection.from,\n valueText: formatDateRangeValueText(range),\n max: maximumIndex - span,\n },\n };\n}\n\nexport function createDateRangeAxisModel(state: TimelineState) {\n const visibleFrom = addDays(state.origin, state.viewport.from);\n const visibleTo = addDays(state.origin, state.viewport.to);\n return { ticks: buildTimelineTicks(visibleFrom, visibleTo) };\n}\n","import { useRef } from 'react';\nimport type { PointerEvent, RefObject } from 'react';\nimport { DateRangeHandle } from './DateRangeHandle';\nimport { DateRangeSelection } from './DateRangeSelection';\nimport { DateRangeTrackGrid } from './DateRangeTrackGrid';\nimport { useDateRangeKeyboardControls } from './hooks/useDateRangeKeyboardControls';\nimport { useDateRangePointerGestures } from './hooks/useDateRangePointerGestures';\nimport { useDateRangeWheelZoom } from './hooks/useDateRangeWheelZoom';\nimport type { TimelineIndexRange, TimelineState } from './lib/date-range-timeline';\nimport { createDateRangeGridMarkers } from './lib/date-range-timeline-grid';\nimport { createDateRangeTrackModel } from './lib/date-range-timeline-view-model';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeTrackProps {\n wheelTargetRef: RefObject<HTMLDivElement | null>;\n timeline: TimelineState;\n maximumIndex: number;\n onSelectionPreview: (selection: TimelineIndexRange) => void;\n onSelectionCommit: (selection: TimelineIndexRange) => void;\n onSelectionCancel: () => void;\n onZoom: (factor: number, anchor: number) => void;\n}\n\nexport function DateRangeTrack({\n wheelTargetRef,\n timeline,\n maximumIndex,\n onSelectionPreview,\n onSelectionCommit,\n onSelectionCancel,\n onZoom,\n}: DateRangeTrackProps) {\n const trackRef = useRef<HTMLDivElement>(null);\n const pointer = useDateRangePointerGestures({\n trackRef,\n timeline,\n onSelectionPreview,\n onSelectionCommit,\n onSelectionCancel,\n });\n const { handleSelectionKeyDown, handleFromKeyDown, handleToKeyDown } = useDateRangeKeyboardControls({\n selection: timeline.selection,\n maximumIndex,\n onCommit: onSelectionCommit,\n });\n\n useDateRangeWheelZoom({\n rootRef: wheelTargetRef,\n trackRef,\n disabled: pointer.interaction !== undefined,\n onZoom,\n });\n\n const model = createDateRangeTrackModel(timeline, maximumIndex);\n const gridMarkers = createDateRangeGridMarkers(timeline.viewport, timeline.selection);\n\n function startFromHandle(event: PointerEvent<HTMLDivElement>) {\n pointer.startHandle('from', event);\n }\n\n function startToHandle(event: PointerEvent<HTMLDivElement>) {\n pointer.startHandle('to', event);\n }\n\n return (\n <div\n ref={trackRef}\n role=\"group\"\n aria-label=\"Date range selection area\"\n className={cn(\n 'relative h-12 touch-none rounded-lg bg-surface4',\n pointer.interaction?.type === 'selecting' ? 'cursor-col-resize' : 'cursor-crosshair',\n )}\n onPointerDown={pointer.startBrush}\n onPointerMove={pointer.handlePointerMove}\n onPointerUp={pointer.handlePointerUp}\n onPointerCancel={pointer.handlePointerCancel}\n onLostPointerCapture={pointer.handleLostPointerCapture}\n >\n <DateRangeTrackGrid markers={gridMarkers} />\n <DateRangeSelection\n left={model.selection.left}\n width={model.selection.width}\n duration={model.selection.duration}\n active={pointer.interaction !== undefined}\n value={model.selection.value}\n valueText={model.selection.valueText}\n max={model.selection.max}\n onPointerDown={pointer.startPan}\n onKeyDown={handleSelectionKeyDown}\n />\n <DateRangeHandle\n boundary=\"from\"\n position={model.handles.from.position}\n value={model.handles.from.value}\n valueText={model.handles.from.valueText}\n min={model.handles.from.min}\n max={model.handles.from.max}\n active={pointer.interaction?.type === 'resizing' && pointer.interaction.boundary === 'from'}\n onPointerDown={startFromHandle}\n onKeyDown={handleFromKeyDown}\n />\n <DateRangeHandle\n boundary=\"to\"\n position={model.handles.to.position}\n value={model.handles.to.value}\n valueText={model.handles.to.valueText}\n min={model.handles.to.min}\n max={model.handles.to.max}\n active={pointer.interaction?.type === 'resizing' && pointer.interaction.boundary === 'to'}\n onPointerDown={startToHandle}\n onKeyDown={handleToKeyDown}\n />\n </div>\n );\n}\n","import { addDays, differenceInCalendarDays } from 'date-fns';\nimport { useState } from 'react';\nimport {\n clamp,\n createTimelineState,\n parseDate,\n revealTimelineSelection,\n toDateRange,\n zoomTimelineViewport,\n} from '../lib/date-range-timeline';\nimport type { DateBoundary, TimelineIndexRange } from '../lib/date-range-timeline';\nimport type { DateRangeValue } from '../types';\n\ninterface UseDateRangeTimelineStateInput {\n value: DateRangeValue;\n min: string;\n max: string;\n onCommit: (value: DateRangeValue) => void;\n}\n\nfunction resolveTimelineBounds(min: string, max: string) {\n const fallbackMax = new Date();\n const maxDate = parseDate(max) ?? fallbackMax;\n const requestedMin = parseDate(min) ?? addDays(maxDate, -365);\n const minDate = requestedMin > maxDate ? maxDate : requestedMin;\n return { minDate, maxDate };\n}\n\nexport function useDateRangeTimelineState({ value, min, max, onCommit }: UseDateRangeTimelineStateInput) {\n const { minDate, maxDate } = resolveTimelineBounds(min, max);\n const committedTimeline = createTimelineState(value, minDate, maxDate);\n const maximumIndex = Math.max(0, differenceInCalendarDays(maxDate, minDate));\n const [viewport, setViewport] = useState(() => committedTimeline.viewport);\n const [draftSelection, setDraftSelection] = useState<TimelineIndexRange>();\n const selection = draftSelection ?? committedTimeline.selection;\n const state = {\n ...committedTimeline,\n viewport: revealTimelineSelection(viewport, selection, maximumIndex),\n selection,\n };\n\n function previewSelection(nextSelection: TimelineIndexRange) {\n setDraftSelection(nextSelection);\n }\n\n function cancelSelection() {\n setDraftSelection(undefined);\n }\n\n function commitSelection(nextSelection: TimelineIndexRange) {\n setDraftSelection(undefined);\n setViewport(current => revealTimelineSelection(current, nextSelection, maximumIndex));\n onCommit(toDateRange({ ...state, selection: nextSelection }));\n }\n\n function zoom(factor: number, anchor: number) {\n setViewport(current => {\n const visibleViewport = revealTimelineSelection(current, state.selection, maximumIndex);\n return zoomTimelineViewport({ ...state, viewport: visibleViewport }, maximumIndex, factor, anchor).viewport;\n });\n }\n\n function selectDate(boundary: DateBoundary, nextValue: string) {\n const date = parseDate(nextValue);\n if (!date) return;\n\n const dateIndex = clamp(differenceInCalendarDays(date, state.origin), 0, maximumIndex);\n const nextSelection =\n boundary === 'from'\n ? {\n from: clamp(dateIndex, 0, state.selection.to),\n to: state.selection.to,\n }\n : {\n from: state.selection.from,\n to: clamp(dateIndex, state.selection.from, maximumIndex),\n };\n commitSelection(nextSelection);\n }\n\n return {\n state,\n maximumIndex,\n previewSelection,\n cancelSelection,\n commitSelection,\n zoom,\n selectDate,\n };\n}\n","import { useRef } from 'react';\nimport { DateRangeBoundaryPickers } from './DateRangeBoundaryPickers';\nimport { DateRangeTicks } from './DateRangeTicks';\nimport { DateRangeTrack } from './DateRangeTrack';\nimport { useDateRangeTimelineState } from './hooks/useDateRangeTimelineState';\nimport { createDateRangeAxisModel, createDateRangeBoundaryModel } from './lib/date-range-timeline-view-model';\nimport type { DateRangeValue } from './types';\n\ninterface DateRangeTimelineProps {\n value: DateRangeValue;\n min: string;\n max: string;\n onCommit: (value: DateRangeValue) => void;\n}\n\nexport function DateRangeTimeline({ value, min, max, onCommit }: DateRangeTimelineProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const timeline = useDateRangeTimelineState({\n value,\n min,\n max,\n onCommit,\n });\n const boundaryModel = createDateRangeBoundaryModel(timeline.state);\n const axisModel = createDateRangeAxisModel(timeline.state);\n\n return (\n <div ref={rootRef} role=\"group\" aria-label=\"Date range timeline\" className=\"w-full overflow-x-clip select-none\">\n <DateRangeBoundaryPickers\n positions={boundaryModel.positions}\n value={boundaryModel.range}\n min={min}\n max={max}\n onSelect={timeline.selectDate}\n />\n\n <DateRangeTrack\n wheelTargetRef={rootRef}\n timeline={timeline.state}\n maximumIndex={timeline.maximumIndex}\n onSelectionPreview={timeline.previewSelection}\n onSelectionCommit={timeline.commitSelection}\n onSelectionCancel={timeline.cancelSelection}\n onZoom={timeline.zoom}\n />\n\n <DateRangeTicks ticks={axisModel.ticks} min={min} max={max} />\n </div>\n );\n}\n"],"names":["parseISO","isValid","format","addDays","differenceInCalendarDays","useState","jsxs","Popover","jsx","PopoverTrigger","Button","Txt","CalendarDaysIcon","PopoverContent","DatePicker","useLayoutEffect","useRef","cn","useEffectEvent","useEffect"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useState, useLayoutEffect, useRef, useEffectEvent, useEffect, useId } from 'react';
2
+ import { useState, useLayoutEffect, useRef, useEffectEvent, useEffect } from 'react';
3
3
  import { format, parseISO, isValid, differenceInCalendarDays, addDays } from 'date-fns';
4
4
  import { CalendarDaysIcon } from 'lucide-react';
5
5
  import { B as Button } from '../Button-Dh5CZ6Ir.js';
@@ -955,7 +955,6 @@ function useDateRangeTimelineState({ value, min, max, onCommit }) {
955
955
  }
956
956
 
957
957
  function DateRangeTimeline({ value, min, max, onCommit }) {
958
- const hintId = useId();
959
958
  const rootRef = useRef(null);
960
959
  const timeline = useDateRangeTimelineState({
961
960
  value,
@@ -965,49 +964,31 @@ function DateRangeTimeline({ value, min, max, onCommit }) {
965
964
  });
966
965
  const boundaryModel = createDateRangeBoundaryModel(timeline.state);
967
966
  const axisModel = createDateRangeAxisModel(timeline.state);
968
- return /* @__PURE__ */ jsxs(
969
- "div",
970
- {
971
- ref: rootRef,
972
- role: "group",
973
- "aria-label": "Date range timeline",
974
- "aria-describedby": hintId,
975
- className: "w-full overflow-x-clip select-none",
976
- children: [
977
- /* @__PURE__ */ jsxs("div", { className: "flex min-h-6 items-start justify-between gap-4 pb-1", children: [
978
- /* @__PURE__ */ jsx(Txt, { id: hintId, as: "span", variant: "ui-sm", className: "text-neutral3", children: "Drag to select" }),
979
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-neutral3", children: [
980
- /* @__PURE__ */ jsx(Txt, { as: "span", variant: "ui-sm", className: "hidden text-neutral3 sm:inline", children: "Drag range to move" }),
981
- /* @__PURE__ */ jsx("span", { className: "hidden h-3 w-px bg-border2 sm:block", "aria-hidden": "true" }),
982
- /* @__PURE__ */ jsx(Txt, { as: "span", variant: "ui-sm", className: "text-neutral3", children: "Pinch to zoom" })
983
- ] })
984
- ] }),
985
- /* @__PURE__ */ jsx(
986
- DateRangeBoundaryPickers,
987
- {
988
- positions: boundaryModel.positions,
989
- value: boundaryModel.range,
990
- min,
991
- max,
992
- onSelect: timeline.selectDate
993
- }
994
- ),
995
- /* @__PURE__ */ jsx(
996
- DateRangeTrack,
997
- {
998
- wheelTargetRef: rootRef,
999
- timeline: timeline.state,
1000
- maximumIndex: timeline.maximumIndex,
1001
- onSelectionPreview: timeline.previewSelection,
1002
- onSelectionCommit: timeline.commitSelection,
1003
- onSelectionCancel: timeline.cancelSelection,
1004
- onZoom: timeline.zoom
1005
- }
1006
- ),
1007
- /* @__PURE__ */ jsx(DateRangeTicks, { ticks: axisModel.ticks, min, max })
1008
- ]
1009
- }
1010
- );
967
+ return /* @__PURE__ */ jsxs("div", { ref: rootRef, role: "group", "aria-label": "Date range timeline", className: "w-full overflow-x-clip select-none", children: [
968
+ /* @__PURE__ */ jsx(
969
+ DateRangeBoundaryPickers,
970
+ {
971
+ positions: boundaryModel.positions,
972
+ value: boundaryModel.range,
973
+ min,
974
+ max,
975
+ onSelect: timeline.selectDate
976
+ }
977
+ ),
978
+ /* @__PURE__ */ jsx(
979
+ DateRangeTrack,
980
+ {
981
+ wheelTargetRef: rootRef,
982
+ timeline: timeline.state,
983
+ maximumIndex: timeline.maximumIndex,
984
+ onSelectionPreview: timeline.previewSelection,
985
+ onSelectionCommit: timeline.commitSelection,
986
+ onSelectionCancel: timeline.cancelSelection,
987
+ onZoom: timeline.zoom
988
+ }
989
+ ),
990
+ /* @__PURE__ */ jsx(DateRangeTicks, { ticks: axisModel.ticks, min, max })
991
+ ] });
1011
992
  }
1012
993
 
1013
994
  export { DateRangeTimeline, clampDateRangeToBounds, getDateRangeBounds };
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangeTimeline.es.js","sources":["../../src/ds/components/DateRangeTimeline/lib/date-range-timeline.ts","../../src/ds/components/DateRangeTimeline/DateRangeBoundaryPicker.tsx","../../src/ds/components/DateRangeTimeline/lib/date-range-boundary-layout.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeBoundaryLayout.ts","../../src/ds/components/DateRangeTimeline/DateRangeBoundaryPickers.tsx","../../src/ds/components/DateRangeTimeline/DateRangeTicks.tsx","../../src/ds/components/DateRangeTimeline/DateRangeHandle.tsx","../../src/ds/components/DateRangeTimeline/DateRangeSelection.tsx","../../src/ds/components/DateRangeTimeline/DateRangeTrackGrid.tsx","../../src/ds/components/DateRangeTimeline/lib/date-range-timeline-interactions.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeKeyboardControls.ts","../../src/ds/components/DateRangeTimeline/hooks/use-pointer-drag.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangePointerGestures.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeWheelZoom.ts","../../src/ds/components/DateRangeTimeline/lib/date-range-timeline-grid.ts","../../src/ds/components/DateRangeTimeline/lib/date-range-timeline-view-model.ts","../../src/ds/components/DateRangeTimeline/DateRangeTrack.tsx","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeTimelineState.ts","../../src/ds/components/DateRangeTimeline/DateRangeTimeline.tsx"],"sourcesContent":["import { addDays, differenceInCalendarDays, format, isValid, parseISO } from 'date-fns';\nimport type { DateRangeValue, DateRangeBounds } from '../types';\n\nconst API_DATE_FORMAT = 'yyyy-MM-dd';\n\nexport type DateBoundary = 'from' | 'to';\n\nexport interface TimelineIndexRange {\n from: number;\n to: number;\n}\n\nexport interface TimelineState {\n origin: Date;\n viewport: TimelineIndexRange;\n selection: TimelineIndexRange;\n}\n\nexport interface TimelineTick {\n date: string;\n label: string;\n position: number;\n}\n\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function parseDate(value: string) {\n const date = parseISO(value);\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || !isValid(date)) return undefined;\n return format(date, API_DATE_FORMAT) === value ? date : undefined;\n}\n\nexport function toDateRange(state: TimelineState): DateRangeValue {\n return {\n from: format(addDays(state.origin, state.selection.from), API_DATE_FORMAT),\n to: format(addDays(state.origin, state.selection.to), API_DATE_FORMAT),\n };\n}\n\nexport function createTimelineState(value: DateRangeValue, min: Date, max: Date): TimelineState {\n const selectedFrom = parseDate(value.from) ?? min;\n const selectedTo = parseDate(value.to) ?? max;\n const absoluteSpan = Math.max(0, differenceInCalendarDays(max, min));\n if (absoluteSpan === 0) {\n return {\n origin: min,\n viewport: { from: 0, to: 0 },\n selection: { from: 0, to: 0 },\n };\n }\n\n const selectedFromIndex = clamp(differenceInCalendarDays(selectedFrom, min), 0, absoluteSpan);\n const selectedToIndex = clamp(differenceInCalendarDays(selectedTo, min), 0, absoluteSpan);\n\n return {\n origin: min,\n viewport: { from: 0, to: absoluteSpan },\n selection: {\n from: Math.min(selectedFromIndex, selectedToIndex),\n to: Math.max(selectedFromIndex, selectedToIndex),\n },\n };\n}\n\nexport function zoomTimelineViewport(\n state: TimelineState,\n maximumIndex: number,\n factor: number,\n anchor: number,\n): TimelineState {\n if (!Number.isFinite(factor) || factor <= 0 || factor === 1) return state;\n\n const boundedMaximum = Math.max(0, maximumIndex);\n const viewportSpan = state.viewport.to - state.viewport.from;\n const selectionSpan = state.selection.to - state.selection.from;\n const minimumViewportSpan = Math.max(selectionSpan, Math.min(1, boundedMaximum));\n const scaledSpan = clamp(Math.round(viewportSpan * factor), minimumViewportSpan, boundedMaximum);\n const nextSpan =\n scaledSpan === viewportSpan\n ? clamp(viewportSpan + (factor > 1 ? 1 : -1), minimumViewportSpan, boundedMaximum)\n : scaledSpan;\n if (nextSpan === viewportSpan) return state;\n\n const normalizedAnchor = Number.isFinite(anchor) ? clamp(anchor, 0, 1) : 0.5;\n const anchorIndex = state.viewport.from + viewportSpan * normalizedAnchor;\n const desiredFrom = Math.round(anchorIndex - nextSpan * normalizedAnchor);\n const earliestFrom = Math.max(0, state.selection.to - nextSpan);\n const latestFrom = Math.min(state.selection.from, boundedMaximum - nextSpan);\n const from = clamp(desiredFrom, earliestFrom, latestFrom);\n\n return {\n ...state,\n viewport: { from, to: from + nextSpan },\n };\n}\n\nexport function revealTimelineSelection(\n viewport: TimelineIndexRange,\n selection: TimelineIndexRange,\n maximumIndex: number,\n): TimelineIndexRange {\n const boundedMaximum = Math.max(0, maximumIndex);\n const selectionFrom = clamp(Math.min(selection.from, selection.to), 0, boundedMaximum);\n const selectionTo = clamp(Math.max(selection.from, selection.to), selectionFrom, boundedMaximum);\n const viewportSpan = clamp(viewport.to - viewport.from, 0, boundedMaximum);\n const viewportFrom = clamp(viewport.from, 0, boundedMaximum - viewportSpan);\n const normalizedViewport = { from: viewportFrom, to: viewportFrom + viewportSpan };\n const selectionSpan = selectionTo - selectionFrom;\n const nextSpan = Math.max(viewportSpan, selectionSpan);\n\n if (selectionFrom >= normalizedViewport.from && selectionTo <= normalizedViewport.to) {\n if (normalizedViewport.from === viewport.from && normalizedViewport.to === viewport.to) {\n return viewport;\n }\n return normalizedViewport;\n }\n\n const desiredFrom = selectionFrom < normalizedViewport.from ? selectionFrom : selectionTo - nextSpan;\n const from = clamp(desiredFrom, 0, boundedMaximum - nextSpan);\n return { from, to: from + nextSpan };\n}\n\nexport function getTimelinePosition(index: number, viewport: TimelineIndexRange) {\n const viewportSpan = viewport.to - viewport.from;\n if (viewportSpan === 0) return 50;\n return ((index - viewport.from) / viewportSpan) * 100;\n}\n\nexport function buildTimelineTickOffsets(span: number) {\n const boundedSpan = Math.max(0, Math.floor(span));\n const tickCount = boundedSpan === 0 ? 1 : Math.min(5, boundedSpan + 1);\n\n return Array.from({ length: tickCount }, (_, index) =>\n Math.round((boundedSpan * index) / Math.max(1, tickCount - 1)),\n );\n}\n\nexport function buildTimelineTicks(domainFrom: Date, domainTo: Date): TimelineTick[] {\n const span = Math.max(0, differenceInCalendarDays(domainTo, domainFrom));\n const crossesYears = domainFrom.getFullYear() !== domainTo.getFullYear();\n\n return buildTimelineTickOffsets(span).map(dayOffset => {\n const date = addDays(domainFrom, dayOffset);\n const labelFormat = span > 365 || crossesYears ? 'MMM yyyy' : 'MMM d';\n\n return {\n label: format(date, labelFormat),\n date: format(date, API_DATE_FORMAT),\n position: span === 0 ? 50 : (dayOffset / span) * 100,\n };\n });\n}\n\nexport function clampDateRangeToBounds(value: DateRangeValue, bounds: DateRangeBounds): DateRangeValue {\n const min = parseDate(bounds.min);\n const max = parseDate(bounds.max);\n if (!min || !max) return value;\n\n const from = parseDate(value.from) ?? min;\n const to = parseDate(value.to) ?? max;\n const clampedFrom = new Date(clamp(from.getTime(), min.getTime(), max.getTime()));\n const clampedTo = new Date(clamp(to.getTime(), clampedFrom.getTime(), max.getTime()));\n\n return {\n from: format(clampedFrom, API_DATE_FORMAT),\n to: format(clampedTo, API_DATE_FORMAT),\n };\n}\n\nexport function getDateRangeBounds(createdAt: string, today: string): DateRangeBounds {\n const max = parseDate(today) ?? new Date();\n const created = parseDate(createdAt) ?? max;\n const min = created > max ? max : created;\n return {\n min: format(min, API_DATE_FORMAT),\n max: format(max, API_DATE_FORMAT),\n };\n}\n\nexport function formatDateRangeDuration(value: DateRangeValue) {\n const from = parseDate(value.from);\n const to = parseDate(value.to);\n if (!from || !to) return '';\n const days = Math.max(1, differenceInCalendarDays(to, from) + 1);\n return days === 1 ? '1 day' : `${days} days`;\n}\n\nexport function formatDateRangeValueText(value: DateRangeValue) {\n const from = parseDate(value.from);\n const to = parseDate(value.to);\n if (!from || !to) return `${value.from} through ${value.to}`;\n return `${format(from, 'MMMM d, yyyy')} through ${format(to, 'MMMM d, yyyy')}`;\n}\n","import { format } from 'date-fns';\nimport { CalendarDaysIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { parseDate } from './lib/date-range-timeline';\nimport type { DateBoundary } from './lib/date-range-timeline';\nimport { Button } from '@/ds/components/Button/Button';\nimport { DatePicker } from '@/ds/components/DateTimePicker';\nimport { Popover, PopoverTrigger, PopoverContent } from '@/ds/components/Popover/popover';\nimport { Txt } from '@/ds/components/Txt/Txt';\n\ninterface DateRangeBoundaryPickerProps {\n boundary: DateBoundary;\n value: string;\n min: string;\n max: string;\n onSelect: (boundary: DateBoundary, value: string) => void;\n}\n\nexport function DateRangeBoundaryPicker({ boundary, value, min, max, onSelect }: DateRangeBoundaryPickerProps) {\n const [open, setOpen] = useState(false);\n const isFrom = boundary === 'from';\n const boundaryLabel = isFrom ? 'start date' : 'end date';\n const selectedDate = parseDate(value);\n const firstDate = parseDate(min) ?? selectedDate;\n const lastDate = parseDate(max) ?? selectedDate;\n const formattedDate = selectedDate ? format(selectedDate, 'MMM d, yyyy') : value;\n\n function handleSelect(date?: Date) {\n if (!date) return;\n onSelect(boundary, format(date, 'yyyy-MM-dd'));\n setOpen(false);\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <Button\n aria-label={`Choose ${boundaryLabel}, ${formattedDate}`}\n aria-expanded={open}\n size=\"xs\"\n className=\"h-11 w-full min-w-0 justify-between gap-2 overflow-hidden px-3 sm:h-8\"\n >\n <Txt as=\"span\" variant=\"ui-sm\" className=\"truncate text-neutral5 tabular-nums\">\n {formattedDate}\n </Txt>\n <CalendarDaysIcon className=\"size-3.5 shrink-0 text-neutral3\" aria-hidden=\"true\" />\n </Button>\n }\n />\n <PopoverContent align={isFrom ? 'start' : 'end'} className=\"w-auto p-0\" sideOffset={6}>\n <DatePicker\n mode=\"single\"\n selected={selectedDate}\n defaultMonth={selectedDate}\n fromMonth={firstDate}\n toMonth={lastDate}\n disabled={firstDate && lastDate ? { before: firstDate, after: lastDate } : undefined}\n onSelect={handleSelect}\n />\n </PopoverContent>\n </Popover>\n );\n}\n","import { clamp } from './date-range-timeline';\n\nconst PREFERRED_PICKER_WIDTH = 160;\nconst PREFERRED_PICKER_GAP = 8;\n\ninterface BoundaryPositions {\n from: number;\n to: number;\n}\n\ninterface BoundaryPickerRect {\n left: number;\n width: number;\n}\n\nexport interface DateRangeBoundaryLayout {\n from: BoundaryPickerRect;\n to: BoundaryPickerRect;\n gap: number;\n}\n\nexport function resolveDateRangeBoundaryLayout(\n requestedWidth: number,\n positions: BoundaryPositions,\n): DateRangeBoundaryLayout {\n const width = Math.max(0, requestedWidth);\n const gap = Math.min(PREFERRED_PICKER_GAP, width);\n const pickerWidth = Math.min(PREFERRED_PICKER_WIDTH, Math.max(0, (width - gap) / 2));\n const maximumLeft = Math.max(0, width - pickerWidth);\n const fromAnchor = (clamp(positions.from, 0, 100) / 100) * width;\n const toAnchor = (clamp(positions.to, 0, 100) / 100) * width;\n const preferredFromLeft = clamp(fromAnchor - pickerWidth - gap / 2, 0, maximumLeft);\n const preferredToLeft = clamp(toAnchor + gap / 2, 0, maximumLeft);\n const overlap = preferredFromLeft + pickerWidth + gap - preferredToLeft;\n\n if (overlap <= 0) {\n return {\n from: { left: preferredFromLeft, width: pickerWidth },\n to: { left: preferredToLeft, width: pickerWidth },\n gap,\n };\n }\n\n const pairWidth = pickerWidth * 2 + gap;\n const pairLeft = clamp(preferredFromLeft - overlap / 2, 0, Math.max(0, width - pairWidth));\n\n return {\n from: { left: pairLeft, width: pickerWidth },\n to: { left: pairLeft + pickerWidth + gap, width: pickerWidth },\n gap,\n };\n}\n","import { useLayoutEffect, useState } from 'react';\nimport type { RefObject } from 'react';\nimport { resolveDateRangeBoundaryLayout } from '../lib/date-range-boundary-layout';\nimport type { DateRangeBoundaryLayout } from '../lib/date-range-boundary-layout';\n\ninterface BoundaryPositions {\n from: number;\n to: number;\n}\n\nexport function useDateRangeBoundaryLayout(\n containerRef: RefObject<HTMLDivElement | null>,\n positions: BoundaryPositions,\n): DateRangeBoundaryLayout | undefined {\n const [containerWidth, setContainerWidth] = useState<number>();\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n function updateWidth(width: number) {\n // Accept 0 (collapsed container) so stale positions don't linger; reject\n // only invalid measurements. resolveDateRangeBoundaryLayout handles 0.\n if (!Number.isFinite(width) || width < 0) return;\n setContainerWidth(current => (current === width ? current : width));\n }\n\n updateWidth(container.getBoundingClientRect().width);\n if (typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(entries => {\n const entry = entries.find(({ target }) => target === container) ?? entries[0];\n const width = entry?.contentRect.width ?? container.getBoundingClientRect().width;\n updateWidth(width);\n });\n observer.observe(container);\n return () => observer.disconnect();\n }, [containerRef]);\n\n return containerWidth === undefined ? undefined : resolveDateRangeBoundaryLayout(containerWidth, positions);\n}\n","import { useRef } from 'react';\nimport { DateRangeBoundaryPicker } from './DateRangeBoundaryPicker';\nimport { useDateRangeBoundaryLayout } from './hooks/useDateRangeBoundaryLayout';\nimport type { DateBoundary } from './lib/date-range-timeline';\nimport type { DateRangeValue } from './types';\n\ninterface DateRangeBoundaryPickersProps {\n positions: { from: number; to: number };\n value: DateRangeValue;\n min: string;\n max: string;\n onSelect: (boundary: DateBoundary, value: string) => void;\n}\n\nconst FALLBACK_PICKER_WIDTH = 'clamp(0px, calc(50% - 0.25rem), 10rem)';\n\nexport function DateRangeBoundaryPickers({ positions, value, min, max, onSelect }: DateRangeBoundaryPickersProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const layout = useDateRangeBoundaryLayout(containerRef, positions);\n\n return (\n <div ref={containerRef} className=\"relative h-16 sm:h-12\">\n <div\n className=\"absolute top-0 min-w-0\"\n style={{\n left: layout?.from.left ?? 0,\n width: layout?.from.width ?? FALLBACK_PICKER_WIDTH,\n }}\n >\n <DateRangeBoundaryPicker boundary=\"from\" value={value.from} min={min} max={value.to} onSelect={onSelect} />\n </div>\n\n <div\n className=\"absolute top-0 min-w-0\"\n style={{\n left: layout?.to.left ?? 'max(calc(50% + 0.25rem), calc(100% - 10rem))',\n width: layout?.to.width ?? FALLBACK_PICKER_WIDTH,\n }}\n >\n <DateRangeBoundaryPicker boundary=\"to\" value={value.to} min={value.from} max={max} onSelect={onSelect} />\n </div>\n\n <div\n className=\"absolute top-11 h-4 w-px -translate-x-1/2 bg-border2 transition-[left] duration-150 ease-out motion-reduce:transition-none sm:top-8\"\n style={{ left: `${positions.from}%` }}\n aria-hidden=\"true\"\n />\n <div\n className=\"absolute top-11 h-4 w-px -translate-x-1/2 bg-border2 transition-[left] duration-150 ease-out motion-reduce:transition-none sm:top-8\"\n style={{ left: `${positions.to}%` }}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n","import { format } from 'date-fns';\nimport { parseDate } from './lib/date-range-timeline';\nimport type { TimelineTick } from './lib/date-range-timeline';\nimport { Txt } from '@/ds/components/Txt/Txt';\n\ninterface DateRangeTicksProps {\n ticks: TimelineTick[];\n min: string;\n max: string;\n}\n\nfunction formatBoundaryDate(value: string) {\n const date = parseDate(value);\n return date ? format(date, 'MMM d, yyyy') : value;\n}\n\nexport function DateRangeTicks({ ticks, min, max }: DateRangeTicksProps) {\n const firstTick = ticks[0];\n const lastTick = ticks.at(-1);\n if (!firstTick || !lastTick) return null;\n const timelineLabel = `Visible from ${formatBoundaryDate(firstTick.date)} through ${formatBoundaryDate(lastTick.date)}. Available from ${formatBoundaryDate(min)} through ${formatBoundaryDate(max)}`;\n\n if (firstTick.date === lastTick.date) {\n const date = formatBoundaryDate(firstTick.date);\n // Only claim \"Created today\" when the whole available domain is a single\n // day; a zoomed viewport can hold one tick for any date, so stay neutral.\n const singleLabel =\n firstTick.date === min && firstTick.date === max\n ? `Created today · ${date}`\n : firstTick.date === min\n ? `Created · ${date}`\n : firstTick.date === max\n ? `Today · ${date}`\n : date;\n return (\n <div role=\"group\" aria-label={timelineLabel} className=\"flex h-10 items-start justify-center pt-2\">\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral3\">\n {singleLabel}\n </Txt>\n </div>\n );\n }\n\n const startLabel = firstTick.date === min ? `Created · ${formatBoundaryDate(min)}` : firstTick.label;\n const endLabel = lastTick.date === max ? `Today · ${formatBoundaryDate(max)}` : lastTick.label;\n const middleTicks = ticks.slice(1, -1);\n\n return (\n <div role=\"group\" className=\"relative h-10\" aria-label={timelineLabel}>\n <div className=\"absolute top-0 left-0 flex flex-col items-start\">\n <span className=\"mb-1 h-1.5 w-px bg-border2\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"whitespace-nowrap text-neutral3\">\n {startLabel}\n </Txt>\n </div>\n\n {middleTicks.map(tick => (\n <div\n key={tick.date}\n className=\"absolute top-0 hidden -translate-x-1/2 flex-col items-center sm:flex\"\n style={{ left: `${tick.position}%` }}\n aria-hidden=\"true\"\n >\n <span className=\"mb-1 h-1.5 w-px bg-border2\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-xs\" className=\"whitespace-nowrap text-neutral3\">\n {tick.label}\n </Txt>\n </div>\n ))}\n\n <div className=\"absolute top-0 right-0 flex flex-col items-end\">\n <span className=\"mb-1 h-1.5 w-px bg-border2\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"whitespace-nowrap text-neutral3\">\n {endLabel}\n </Txt>\n </div>\n </div>\n );\n}\n","import { format } from 'date-fns';\nimport type { KeyboardEventHandler, PointerEventHandler } from 'react';\nimport { parseDate } from './lib/date-range-timeline';\nimport type { DateBoundary } from './lib/date-range-timeline';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeHandleProps {\n boundary: DateBoundary;\n position: number;\n value: number;\n valueText: string;\n min: number;\n max: number;\n active: boolean;\n onPointerDown: PointerEventHandler<HTMLDivElement>;\n onKeyDown: KeyboardEventHandler<HTMLDivElement>;\n}\n\nexport function DateRangeHandle({\n boundary,\n position,\n value,\n valueText,\n min,\n max,\n active,\n onPointerDown,\n onKeyDown,\n}: DateRangeHandleProps) {\n const label = boundary === 'from' ? 'Start date handle' : 'End date handle';\n const date = parseDate(valueText);\n const accessibleValue = date ? format(date, 'MMMM d, yyyy') : valueText;\n\n return (\n <div\n role=\"slider\"\n tabIndex={0}\n aria-label={label}\n aria-orientation=\"horizontal\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={accessibleValue}\n className=\"group absolute inset-y-0 z-30 w-11 -translate-x-1/2 cursor-ew-resize touch-none outline-hidden\"\n style={{ left: `${position}%` }}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n >\n <span\n className={cn(\n 'absolute top-1/2 left-1/2 h-7 w-1.5 -translate-1/2 rounded-xs bg-surface3 ring-1 transition-[width,box-shadow] duration-150 group-hover:w-2 group-focus-visible:w-2 group-focus-visible:ring-2 group-focus-visible:ring-accent3 motion-reduce:transition-none',\n active ? 'w-2 ring-2 ring-neutral3/40' : 'ring-border2',\n )}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n","import type { KeyboardEventHandler, PointerEventHandler } from 'react';\nimport { Txt } from '@/ds/components/Txt/Txt';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeSelectionProps {\n left: number;\n width: number;\n duration: string;\n active: boolean;\n value: number;\n valueText: string;\n max: number;\n onPointerDown: PointerEventHandler<HTMLDivElement>;\n onKeyDown: KeyboardEventHandler<HTMLDivElement>;\n}\n\nexport function DateRangeSelection({\n left,\n width,\n duration,\n active,\n value,\n valueText,\n max,\n onPointerDown,\n onKeyDown,\n}: DateRangeSelectionProps) {\n const visibleWidth = Math.max(width, 0.6);\n const visibleLeft = Math.min(left, 100 - visibleWidth);\n const showDuration = width >= 12;\n return (\n <div\n role=\"slider\"\n tabIndex={0}\n aria-label=\"Move selected date range\"\n aria-orientation=\"horizontal\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={valueText}\n className={cn(\n 'absolute inset-y-1 z-10 flex cursor-grab touch-none items-center justify-center overflow-hidden rounded-md bg-neutral6/10 text-neutral6 select-none outline-hidden focus-visible:ring-2 focus-visible:ring-accent3 active:cursor-grabbing',\n active\n ? 'transition-none'\n : 'transition-[left,width,background-color] duration-150 ease-out motion-reduce:transition-none',\n )}\n style={{ left: `${visibleLeft}%`, width: `${visibleWidth}%` }}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n >\n {showDuration ? (\n // TODO(ds): Txt needs a compact data-label variant.\n <Txt as=\"span\" variant=\"ui-sm\" font=\"mono\" className=\"text-neutral6 tabular-nums\">\n {duration}\n </Txt>\n ) : null}\n </div>\n );\n}\n","import type { DateRangeGridMarker } from './lib/date-range-timeline-grid';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeTrackGridProps {\n markers: DateRangeGridMarker[];\n}\n\nfunction getMarkerHeight(emphasis: DateRangeGridMarker['emphasis']) {\n if (emphasis === 'major') return 'h-5';\n if (emphasis === 'medium') return 'h-3';\n return 'h-1.5';\n}\n\nexport function DateRangeTrackGrid({ markers }: DateRangeTrackGridProps) {\n return (\n <div className=\"pointer-events-none absolute inset-0 overflow-hidden rounded-lg\" aria-hidden=\"true\">\n {markers.map(marker => (\n <span\n key={marker.index}\n className={cn('absolute top-1/2 w-px -translate-1/2 bg-neutral3/15', getMarkerHeight(marker.emphasis))}\n style={{ left: `${marker.position}%` }}\n />\n ))}\n </div>\n );\n}\n","import { clamp } from './date-range-timeline';\nimport type { DateBoundary, TimelineIndexRange } from './date-range-timeline';\n\ninterface TimelineTrackGeometry {\n left: number;\n width: number;\n}\n\nexport type TimelinePointerGesture =\n | { type: 'brush'; startIndex: number }\n | { type: 'pan'; startIndex: number; originalSelection: TimelineIndexRange }\n | { type: 'handle'; boundary: DateBoundary; originalSelection: TimelineIndexRange };\n\nexport type TimelineInteraction =\n { type: 'selecting' } | { type: 'moving' } | { type: 'resizing'; boundary: DateBoundary };\n\nconst KEYBOARD_LARGE_STEP_DAYS = 7;\n\nfunction getKeyboardDelta(key: string) {\n if (key === 'ArrowLeft' || key === 'ArrowDown') return -1;\n if (key === 'ArrowRight' || key === 'ArrowUp') return 1;\n if (key === 'PageDown') return -KEYBOARD_LARGE_STEP_DAYS;\n if (key === 'PageUp') return KEYBOARD_LARGE_STEP_DAYS;\n return undefined;\n}\n\nexport function getTimelineInteraction(gesture: TimelinePointerGesture): TimelineInteraction {\n if (gesture.type === 'brush') return { type: 'selecting' };\n if (gesture.type === 'pan') return { type: 'moving' };\n return { type: 'resizing', boundary: gesture.boundary };\n}\n\nexport function getTimelineIndexAtClientX(\n clientX: number,\n track: TimelineTrackGeometry | undefined,\n viewport: TimelineIndexRange,\n) {\n const viewportSpan = viewport.to - viewport.from;\n if (!track || track.width <= 0 || viewportSpan <= 0) return viewport.from;\n\n const position = clamp((clientX - track.left) / track.width, 0, 1);\n return viewport.from + Math.round(position * viewportSpan);\n}\n\nexport function resolveTimelineGestureSelection(\n gesture: TimelinePointerGesture,\n pointerIndex: number,\n viewport: TimelineIndexRange,\n): TimelineIndexRange {\n const boundedPointerIndex = clamp(pointerIndex, viewport.from, viewport.to);\n\n if (gesture.type === 'brush') {\n return {\n from: Math.min(gesture.startIndex, boundedPointerIndex),\n to: Math.max(gesture.startIndex, boundedPointerIndex),\n };\n }\n\n if (gesture.type === 'pan') {\n const selectionSpan = gesture.originalSelection.to - gesture.originalSelection.from;\n const delta = boundedPointerIndex - gesture.startIndex;\n const from = clamp(gesture.originalSelection.from + delta, viewport.from, viewport.to - selectionSpan);\n return { from, to: from + selectionSpan };\n }\n\n if (gesture.boundary === 'from') {\n return {\n from: clamp(boundedPointerIndex, viewport.from, gesture.originalSelection.to),\n to: gesture.originalSelection.to,\n };\n }\n\n return {\n from: gesture.originalSelection.from,\n to: clamp(boundedPointerIndex, gesture.originalSelection.from, viewport.to),\n };\n}\n\nexport function moveTimelineSelectionFromKey(selection: TimelineIndexRange, key: string, maximumIndex: number) {\n const span = selection.to - selection.from;\n if (key === 'Home') return { from: 0, to: span };\n if (key === 'End') return { from: maximumIndex - span, to: maximumIndex };\n\n const delta = getKeyboardDelta(key);\n if (delta === undefined) return undefined;\n const from = clamp(selection.from + delta, 0, maximumIndex - span);\n return { from, to: from + span };\n}\n\nexport function resizeTimelineSelectionFromKey(\n selection: TimelineIndexRange,\n boundary: DateBoundary,\n key: string,\n maximumIndex: number,\n) {\n const { from, to } = selection;\n if (key === 'Home') return boundary === 'from' ? { from: 0, to } : { from, to: from };\n if (key === 'End') {\n return boundary === 'from' ? { from: to, to } : { from, to: maximumIndex };\n }\n\n const delta = getKeyboardDelta(key);\n if (delta === undefined) return undefined;\n return boundary === 'from'\n ? { from: clamp(from + delta, 0, to), to }\n : { from, to: clamp(to + delta, from, maximumIndex) };\n}\n","import type { KeyboardEvent } from 'react';\nimport type { DateBoundary, TimelineIndexRange } from '../lib/date-range-timeline';\nimport { moveTimelineSelectionFromKey, resizeTimelineSelectionFromKey } from '../lib/date-range-timeline-interactions';\n\ninterface UseDateRangeKeyboardControlsInput {\n selection: TimelineIndexRange;\n maximumIndex: number;\n onCommit: (selection: TimelineIndexRange) => void;\n}\n\nexport function useDateRangeKeyboardControls({ selection, maximumIndex, onCommit }: UseDateRangeKeyboardControlsInput) {\n function handleSelectionKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const nextSelection = moveTimelineSelectionFromKey(selection, event.key, maximumIndex);\n if (!nextSelection) return;\n\n event.preventDefault();\n onCommit(nextSelection);\n }\n\n function handleBoundaryKeyDown(boundary: DateBoundary, event: KeyboardEvent<HTMLDivElement>) {\n const nextSelection = resizeTimelineSelectionFromKey(selection, boundary, event.key, maximumIndex);\n if (!nextSelection) return;\n\n event.preventDefault();\n onCommit(nextSelection);\n }\n\n function handleFromKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n handleBoundaryKeyDown('from', event);\n }\n\n function handleToKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n handleBoundaryKeyDown('to', event);\n }\n\n return {\n handleSelectionKeyDown,\n handleFromKeyDown,\n handleToKeyDown,\n };\n}\n","import { useRef } from 'react';\nimport type { PointerEvent } from 'react';\n\ninterface PointerDragSession<TPayload> {\n pointerId: number;\n captureTarget: HTMLElement;\n payload: TPayload;\n}\n\ninterface UsePointerDragInput<TPayload> {\n onMove: (payload: TPayload, event: PointerEvent<HTMLElement>) => void;\n onEnd: (payload: TPayload, event: PointerEvent<HTMLElement>) => void;\n onCancel: (payload: TPayload, event: PointerEvent<HTMLElement>) => void;\n}\n\nexport function usePointerDrag<TPayload>({ onMove, onEnd, onCancel }: UsePointerDragInput<TPayload>) {\n const sessionRef = useRef<PointerDragSession<TPayload> | undefined>(undefined);\n\n function startPointerDrag(event: PointerEvent<HTMLElement>, payload: TPayload) {\n if (sessionRef.current) return false;\n\n const captureTarget = event.currentTarget;\n captureTarget.setPointerCapture(event.pointerId);\n sessionRef.current = {\n pointerId: event.pointerId,\n captureTarget,\n payload,\n };\n return true;\n }\n\n function getSession(event: PointerEvent<HTMLElement>) {\n const session = sessionRef.current;\n if (!session || session.pointerId !== event.pointerId) return undefined;\n return session;\n }\n\n function releaseSession(session: PointerDragSession<TPayload>) {\n sessionRef.current = undefined;\n if (!session.captureTarget.hasPointerCapture(session.pointerId)) return;\n session.captureTarget.releasePointerCapture(session.pointerId);\n }\n\n function handlePointerMove(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n onMove(session.payload, event);\n }\n\n function handlePointerUp(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n releaseSession(session);\n onEnd(session.payload, event);\n }\n\n function handlePointerCancel(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n releaseSession(session);\n onCancel(session.payload, event);\n }\n\n function handleLostPointerCapture(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n sessionRef.current = undefined;\n onCancel(session.payload, event);\n }\n\n return {\n startPointerDrag,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n handleLostPointerCapture,\n };\n}\n","import { useState } from 'react';\nimport type { PointerEvent, RefObject } from 'react';\nimport type { DateBoundary, TimelineIndexRange, TimelineState } from '../lib/date-range-timeline';\nimport {\n getTimelineIndexAtClientX,\n getTimelineInteraction,\n resolveTimelineGestureSelection,\n} from '../lib/date-range-timeline-interactions';\nimport type { TimelineInteraction, TimelinePointerGesture } from '../lib/date-range-timeline-interactions';\nimport { usePointerDrag } from './use-pointer-drag';\n\nexport type { TimelineInteraction } from '../lib/date-range-timeline-interactions';\n\ninterface TimelinePointerDrag {\n gesture: TimelinePointerGesture;\n currentSelection: TimelineIndexRange;\n}\n\ninterface UseDateRangePointerGesturesInput {\n trackRef: RefObject<HTMLDivElement | null>;\n timeline: TimelineState;\n onSelectionPreview: (selection: TimelineIndexRange) => void;\n onSelectionCommit: (selection: TimelineIndexRange) => void;\n onSelectionCancel: () => void;\n}\n\nexport function useDateRangePointerGestures({\n trackRef,\n timeline,\n onSelectionPreview,\n onSelectionCommit,\n onSelectionCancel,\n}: UseDateRangePointerGesturesInput) {\n const [interaction, setInteraction] = useState<TimelineInteraction>();\n\n function getPointerIndex(clientX: number) {\n const track = trackRef.current?.getBoundingClientRect();\n return getTimelineIndexAtClientX(clientX, track, timeline.viewport);\n }\n\n function previewPointerDrag(drag: TimelinePointerDrag, event: PointerEvent<HTMLElement>) {\n const pointerIndex = getPointerIndex(event.clientX);\n const selection = resolveTimelineGestureSelection(drag.gesture, pointerIndex, timeline.viewport);\n drag.currentSelection = selection;\n onSelectionPreview(selection);\n }\n\n function commitPointerDrag(drag: TimelinePointerDrag, event: PointerEvent<HTMLElement>) {\n previewPointerDrag(drag, event);\n setInteraction(undefined);\n onSelectionCommit(drag.currentSelection);\n }\n\n function cancelPointerDrag() {\n setInteraction(undefined);\n onSelectionCancel();\n }\n\n const pointerDrag = usePointerDrag<TimelinePointerDrag>({\n onMove: previewPointerDrag,\n onEnd: commitPointerDrag,\n onCancel: cancelPointerDrag,\n });\n\n function beginPointerDrag(\n event: PointerEvent<HTMLDivElement>,\n gesture: TimelinePointerGesture,\n currentSelection: TimelineIndexRange,\n ) {\n const started = pointerDrag.startPointerDrag(event, { gesture, currentSelection });\n if (!started) return false;\n setInteraction(getTimelineInteraction(gesture));\n return true;\n }\n\n function startBrush(event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n const startIndex = getPointerIndex(event.clientX);\n const selection = { from: startIndex, to: startIndex };\n const started = beginPointerDrag(\n event,\n {\n type: 'brush',\n startIndex,\n },\n selection,\n );\n if (!started) return;\n onSelectionPreview(selection);\n }\n\n function startPan(event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n beginPointerDrag(\n event,\n {\n type: 'pan',\n startIndex: getPointerIndex(event.clientX),\n originalSelection: timeline.selection,\n },\n timeline.selection,\n );\n }\n\n function startHandle(boundary: DateBoundary, event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n beginPointerDrag(\n event,\n {\n type: 'handle',\n boundary,\n originalSelection: timeline.selection,\n },\n timeline.selection,\n );\n }\n\n function handlePointerMove(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handlePointerMove(event);\n }\n\n function handlePointerUp(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handlePointerUp(event);\n }\n\n function handlePointerCancel(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handlePointerCancel(event);\n }\n\n function handleLostPointerCapture(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handleLostPointerCapture(event);\n }\n\n return {\n interaction,\n startBrush,\n startPan,\n startHandle,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n handleLostPointerCapture,\n };\n}\n","import { useEffect, useEffectEvent } from 'react';\nimport type { RefObject } from 'react';\nimport { clamp } from '../lib/date-range-timeline';\n\nconst MAX_WHEEL_DELTA = 80;\nconst WHEEL_ZOOM_SENSITIVITY = 0.003;\n\ninterface UseDateRangeWheelZoomInput {\n rootRef: RefObject<HTMLDivElement | null>;\n trackRef: RefObject<HTMLDivElement | null>;\n disabled: boolean;\n onZoom: (factor: number, anchor: number) => void;\n}\n\nexport function useDateRangeWheelZoom({ rootRef, trackRef, disabled, onZoom }: UseDateRangeWheelZoomInput) {\n const handleWheel = useEffectEvent((event: WheelEvent) => {\n if (!event.ctrlKey) return;\n // Bail before preventDefault when disabled so native browser zoom still works.\n if (disabled) return;\n event.preventDefault();\n\n const trackRect = trackRef.current?.getBoundingClientRect();\n const anchor =\n trackRect && trackRect.width > 0 ? clamp((event.clientX - trackRect.left) / trackRect.width, 0, 1) : 0.5;\n const wheelDelta = clamp(event.deltaY, -MAX_WHEEL_DELTA, MAX_WHEEL_DELTA);\n const factor = Math.exp(wheelDelta * WHEEL_ZOOM_SENSITIVITY);\n onZoom(factor, anchor);\n });\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n root.addEventListener('wheel', handleWheel, { passive: false });\n return () => root.removeEventListener('wheel', handleWheel);\n }, [rootRef]);\n}\n","import { buildTimelineTickOffsets, getTimelinePosition } from './date-range-timeline';\nimport type { TimelineIndexRange } from './date-range-timeline';\n\nconst MAX_GRID_INTERVALS = 24;\n\nexport interface DateRangeGridMarker {\n index: number;\n position: number;\n emphasis: 'major' | 'medium' | 'minor';\n}\n\nfunction addVisibleMarker(markerIndices: Set<number>, index: number, viewport: TimelineIndexRange) {\n if (index >= viewport.from && index <= viewport.to) {\n markerIndices.add(index);\n }\n}\n\nfunction getMarkerEmphasis(\n index: number,\n majorIndices: Set<number>,\n mediumIndices: Set<number>,\n): DateRangeGridMarker['emphasis'] {\n if (majorIndices.has(index)) return 'major';\n if (mediumIndices.has(index)) return 'medium';\n return 'minor';\n}\n\nexport function createDateRangeGridMarkers(\n viewport: TimelineIndexRange,\n selection: TimelineIndexRange,\n): DateRangeGridMarker[] {\n const viewportSpan = Math.max(0, viewport.to - viewport.from);\n if (viewportSpan === 0) {\n return [{ index: viewport.from, position: 50, emphasis: 'major' }];\n }\n\n const sampleStep = Math.max(1, Math.ceil(viewportSpan / MAX_GRID_INTERVALS));\n const markerIndices = new Set<number>();\n const majorIndices = new Set<number>();\n const mediumIndices = new Set<number>();\n const tickOffsets = buildTimelineTickOffsets(viewportSpan);\n\n for (let index = viewport.from; index <= viewport.to; index += sampleStep) {\n markerIndices.add(index);\n }\n\n for (let index = 0; index < tickOffsets.length; index += 1) {\n const tickOffset = tickOffsets[index];\n if (tickOffset === undefined) continue;\n\n const majorIndex = viewport.from + tickOffset;\n markerIndices.add(majorIndex);\n majorIndices.add(majorIndex);\n\n const nextTickOffset = tickOffsets[index + 1];\n if (nextTickOffset === undefined) continue;\n\n const mediumIndex = viewport.from + Math.round((tickOffset + nextTickOffset) / 2);\n markerIndices.add(mediumIndex);\n mediumIndices.add(mediumIndex);\n }\n\n addVisibleMarker(markerIndices, selection.from, viewport);\n addVisibleMarker(markerIndices, selection.to, viewport);\n\n return [...markerIndices]\n .sort((left, right) => left - right)\n .map(index => ({\n index,\n position: getTimelinePosition(index, viewport),\n emphasis: getMarkerEmphasis(index, majorIndices, mediumIndices),\n }));\n}\n","import { addDays } from 'date-fns';\nimport {\n buildTimelineTicks,\n formatDateRangeDuration,\n formatDateRangeValueText,\n getTimelinePosition,\n toDateRange,\n} from './date-range-timeline';\nimport type { TimelineState } from './date-range-timeline';\n\nexport function createDateRangeBoundaryModel(state: TimelineState) {\n const range = toDateRange(state);\n const fromPosition = getTimelinePosition(state.selection.from, state.viewport);\n const toPosition = getTimelinePosition(state.selection.to, state.viewport);\n\n return {\n positions: { from: fromPosition, to: toPosition },\n range,\n };\n}\n\nexport function createDateRangeTrackModel(state: TimelineState, maximumIndex: number) {\n const range = toDateRange(state);\n const fromPosition = getTimelinePosition(state.selection.from, state.viewport);\n const toPosition = getTimelinePosition(state.selection.to, state.viewport);\n const span = state.selection.to - state.selection.from;\n\n return {\n handles: {\n from: {\n position: fromPosition,\n value: state.selection.from,\n valueText: range.from,\n min: 0,\n max: state.selection.to,\n },\n to: {\n position: toPosition,\n value: state.selection.to,\n valueText: range.to,\n min: state.selection.from,\n max: maximumIndex,\n },\n },\n selection: {\n left: fromPosition,\n width: Math.max(0, toPosition - fromPosition),\n duration: formatDateRangeDuration(range),\n value: state.selection.from,\n valueText: formatDateRangeValueText(range),\n max: maximumIndex - span,\n },\n };\n}\n\nexport function createDateRangeAxisModel(state: TimelineState) {\n const visibleFrom = addDays(state.origin, state.viewport.from);\n const visibleTo = addDays(state.origin, state.viewport.to);\n return { ticks: buildTimelineTicks(visibleFrom, visibleTo) };\n}\n","import { useRef } from 'react';\nimport type { PointerEvent, RefObject } from 'react';\nimport { DateRangeHandle } from './DateRangeHandle';\nimport { DateRangeSelection } from './DateRangeSelection';\nimport { DateRangeTrackGrid } from './DateRangeTrackGrid';\nimport { useDateRangeKeyboardControls } from './hooks/useDateRangeKeyboardControls';\nimport { useDateRangePointerGestures } from './hooks/useDateRangePointerGestures';\nimport { useDateRangeWheelZoom } from './hooks/useDateRangeWheelZoom';\nimport type { TimelineIndexRange, TimelineState } from './lib/date-range-timeline';\nimport { createDateRangeGridMarkers } from './lib/date-range-timeline-grid';\nimport { createDateRangeTrackModel } from './lib/date-range-timeline-view-model';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeTrackProps {\n wheelTargetRef: RefObject<HTMLDivElement | null>;\n timeline: TimelineState;\n maximumIndex: number;\n onSelectionPreview: (selection: TimelineIndexRange) => void;\n onSelectionCommit: (selection: TimelineIndexRange) => void;\n onSelectionCancel: () => void;\n onZoom: (factor: number, anchor: number) => void;\n}\n\nexport function DateRangeTrack({\n wheelTargetRef,\n timeline,\n maximumIndex,\n onSelectionPreview,\n onSelectionCommit,\n onSelectionCancel,\n onZoom,\n}: DateRangeTrackProps) {\n const trackRef = useRef<HTMLDivElement>(null);\n const pointer = useDateRangePointerGestures({\n trackRef,\n timeline,\n onSelectionPreview,\n onSelectionCommit,\n onSelectionCancel,\n });\n const { handleSelectionKeyDown, handleFromKeyDown, handleToKeyDown } = useDateRangeKeyboardControls({\n selection: timeline.selection,\n maximumIndex,\n onCommit: onSelectionCommit,\n });\n\n useDateRangeWheelZoom({\n rootRef: wheelTargetRef,\n trackRef,\n disabled: pointer.interaction !== undefined,\n onZoom,\n });\n\n const model = createDateRangeTrackModel(timeline, maximumIndex);\n const gridMarkers = createDateRangeGridMarkers(timeline.viewport, timeline.selection);\n\n function startFromHandle(event: PointerEvent<HTMLDivElement>) {\n pointer.startHandle('from', event);\n }\n\n function startToHandle(event: PointerEvent<HTMLDivElement>) {\n pointer.startHandle('to', event);\n }\n\n return (\n <div\n ref={trackRef}\n role=\"group\"\n aria-label=\"Date range selection area\"\n className={cn(\n 'relative h-12 touch-none rounded-lg bg-surface4',\n pointer.interaction?.type === 'selecting' ? 'cursor-col-resize' : 'cursor-crosshair',\n )}\n onPointerDown={pointer.startBrush}\n onPointerMove={pointer.handlePointerMove}\n onPointerUp={pointer.handlePointerUp}\n onPointerCancel={pointer.handlePointerCancel}\n onLostPointerCapture={pointer.handleLostPointerCapture}\n >\n <DateRangeTrackGrid markers={gridMarkers} />\n <DateRangeSelection\n left={model.selection.left}\n width={model.selection.width}\n duration={model.selection.duration}\n active={pointer.interaction !== undefined}\n value={model.selection.value}\n valueText={model.selection.valueText}\n max={model.selection.max}\n onPointerDown={pointer.startPan}\n onKeyDown={handleSelectionKeyDown}\n />\n <DateRangeHandle\n boundary=\"from\"\n position={model.handles.from.position}\n value={model.handles.from.value}\n valueText={model.handles.from.valueText}\n min={model.handles.from.min}\n max={model.handles.from.max}\n active={pointer.interaction?.type === 'resizing' && pointer.interaction.boundary === 'from'}\n onPointerDown={startFromHandle}\n onKeyDown={handleFromKeyDown}\n />\n <DateRangeHandle\n boundary=\"to\"\n position={model.handles.to.position}\n value={model.handles.to.value}\n valueText={model.handles.to.valueText}\n min={model.handles.to.min}\n max={model.handles.to.max}\n active={pointer.interaction?.type === 'resizing' && pointer.interaction.boundary === 'to'}\n onPointerDown={startToHandle}\n onKeyDown={handleToKeyDown}\n />\n </div>\n );\n}\n","import { addDays, differenceInCalendarDays } from 'date-fns';\nimport { useState } from 'react';\nimport {\n clamp,\n createTimelineState,\n parseDate,\n revealTimelineSelection,\n toDateRange,\n zoomTimelineViewport,\n} from '../lib/date-range-timeline';\nimport type { DateBoundary, TimelineIndexRange } from '../lib/date-range-timeline';\nimport type { DateRangeValue } from '../types';\n\ninterface UseDateRangeTimelineStateInput {\n value: DateRangeValue;\n min: string;\n max: string;\n onCommit: (value: DateRangeValue) => void;\n}\n\nfunction resolveTimelineBounds(min: string, max: string) {\n const fallbackMax = new Date();\n const maxDate = parseDate(max) ?? fallbackMax;\n const requestedMin = parseDate(min) ?? addDays(maxDate, -365);\n const minDate = requestedMin > maxDate ? maxDate : requestedMin;\n return { minDate, maxDate };\n}\n\nexport function useDateRangeTimelineState({ value, min, max, onCommit }: UseDateRangeTimelineStateInput) {\n const { minDate, maxDate } = resolveTimelineBounds(min, max);\n const committedTimeline = createTimelineState(value, minDate, maxDate);\n const maximumIndex = Math.max(0, differenceInCalendarDays(maxDate, minDate));\n const [viewport, setViewport] = useState(() => committedTimeline.viewport);\n const [draftSelection, setDraftSelection] = useState<TimelineIndexRange>();\n const selection = draftSelection ?? committedTimeline.selection;\n const state = {\n ...committedTimeline,\n viewport: revealTimelineSelection(viewport, selection, maximumIndex),\n selection,\n };\n\n function previewSelection(nextSelection: TimelineIndexRange) {\n setDraftSelection(nextSelection);\n }\n\n function cancelSelection() {\n setDraftSelection(undefined);\n }\n\n function commitSelection(nextSelection: TimelineIndexRange) {\n setDraftSelection(undefined);\n setViewport(current => revealTimelineSelection(current, nextSelection, maximumIndex));\n onCommit(toDateRange({ ...state, selection: nextSelection }));\n }\n\n function zoom(factor: number, anchor: number) {\n setViewport(current => {\n const visibleViewport = revealTimelineSelection(current, state.selection, maximumIndex);\n return zoomTimelineViewport({ ...state, viewport: visibleViewport }, maximumIndex, factor, anchor).viewport;\n });\n }\n\n function selectDate(boundary: DateBoundary, nextValue: string) {\n const date = parseDate(nextValue);\n if (!date) return;\n\n const dateIndex = clamp(differenceInCalendarDays(date, state.origin), 0, maximumIndex);\n const nextSelection =\n boundary === 'from'\n ? {\n from: clamp(dateIndex, 0, state.selection.to),\n to: state.selection.to,\n }\n : {\n from: state.selection.from,\n to: clamp(dateIndex, state.selection.from, maximumIndex),\n };\n commitSelection(nextSelection);\n }\n\n return {\n state,\n maximumIndex,\n previewSelection,\n cancelSelection,\n commitSelection,\n zoom,\n selectDate,\n };\n}\n","import { useId, useRef } from 'react';\nimport { DateRangeBoundaryPickers } from './DateRangeBoundaryPickers';\nimport { DateRangeTicks } from './DateRangeTicks';\nimport { DateRangeTrack } from './DateRangeTrack';\nimport { useDateRangeTimelineState } from './hooks/useDateRangeTimelineState';\nimport { createDateRangeAxisModel, createDateRangeBoundaryModel } from './lib/date-range-timeline-view-model';\nimport type { DateRangeValue } from './types';\nimport { Txt } from '@/ds/components/Txt/Txt';\n\ninterface DateRangeTimelineProps {\n value: DateRangeValue;\n min: string;\n max: string;\n onCommit: (value: DateRangeValue) => void;\n}\n\nexport function DateRangeTimeline({ value, min, max, onCommit }: DateRangeTimelineProps) {\n const hintId = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const timeline = useDateRangeTimelineState({\n value,\n min,\n max,\n onCommit,\n });\n const boundaryModel = createDateRangeBoundaryModel(timeline.state);\n const axisModel = createDateRangeAxisModel(timeline.state);\n\n return (\n <div\n ref={rootRef}\n role=\"group\"\n aria-label=\"Date range timeline\"\n aria-describedby={hintId}\n className=\"w-full overflow-x-clip select-none\"\n >\n <div className=\"flex min-h-6 items-start justify-between gap-4 pb-1\">\n {/* TODO(ds): Txt needs a muted interaction-hint variant. */}\n <Txt id={hintId} as=\"span\" variant=\"ui-sm\" className=\"text-neutral3\">\n Drag to select\n </Txt>\n <div className=\"flex items-center gap-2 text-neutral3\">\n {/* TODO(ds): Txt needs a muted interaction-hint variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"hidden text-neutral3 sm:inline\">\n Drag range to move\n </Txt>\n <span className=\"hidden h-3 w-px bg-border2 sm:block\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted interaction-hint variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral3\">\n Pinch to zoom\n </Txt>\n </div>\n </div>\n\n <DateRangeBoundaryPickers\n positions={boundaryModel.positions}\n value={boundaryModel.range}\n min={min}\n max={max}\n onSelect={timeline.selectDate}\n />\n\n <DateRangeTrack\n wheelTargetRef={rootRef}\n timeline={timeline.state}\n maximumIndex={timeline.maximumIndex}\n onSelectionPreview={timeline.previewSelection}\n onSelectionCommit={timeline.commitSelection}\n onSelectionCancel={timeline.cancelSelection}\n onZoom={timeline.zoom}\n />\n\n <DateRangeTicks ticks={axisModel.ticks} min={min} max={max} />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DateRangeTimeline.es.js","sources":["../../src/ds/components/DateRangeTimeline/lib/date-range-timeline.ts","../../src/ds/components/DateRangeTimeline/DateRangeBoundaryPicker.tsx","../../src/ds/components/DateRangeTimeline/lib/date-range-boundary-layout.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeBoundaryLayout.ts","../../src/ds/components/DateRangeTimeline/DateRangeBoundaryPickers.tsx","../../src/ds/components/DateRangeTimeline/DateRangeTicks.tsx","../../src/ds/components/DateRangeTimeline/DateRangeHandle.tsx","../../src/ds/components/DateRangeTimeline/DateRangeSelection.tsx","../../src/ds/components/DateRangeTimeline/DateRangeTrackGrid.tsx","../../src/ds/components/DateRangeTimeline/lib/date-range-timeline-interactions.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeKeyboardControls.ts","../../src/ds/components/DateRangeTimeline/hooks/use-pointer-drag.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangePointerGestures.ts","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeWheelZoom.ts","../../src/ds/components/DateRangeTimeline/lib/date-range-timeline-grid.ts","../../src/ds/components/DateRangeTimeline/lib/date-range-timeline-view-model.ts","../../src/ds/components/DateRangeTimeline/DateRangeTrack.tsx","../../src/ds/components/DateRangeTimeline/hooks/useDateRangeTimelineState.ts","../../src/ds/components/DateRangeTimeline/DateRangeTimeline.tsx"],"sourcesContent":["import { addDays, differenceInCalendarDays, format, isValid, parseISO } from 'date-fns';\nimport type { DateRangeValue, DateRangeBounds } from '../types';\n\nconst API_DATE_FORMAT = 'yyyy-MM-dd';\n\nexport type DateBoundary = 'from' | 'to';\n\nexport interface TimelineIndexRange {\n from: number;\n to: number;\n}\n\nexport interface TimelineState {\n origin: Date;\n viewport: TimelineIndexRange;\n selection: TimelineIndexRange;\n}\n\nexport interface TimelineTick {\n date: string;\n label: string;\n position: number;\n}\n\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function parseDate(value: string) {\n const date = parseISO(value);\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || !isValid(date)) return undefined;\n return format(date, API_DATE_FORMAT) === value ? date : undefined;\n}\n\nexport function toDateRange(state: TimelineState): DateRangeValue {\n return {\n from: format(addDays(state.origin, state.selection.from), API_DATE_FORMAT),\n to: format(addDays(state.origin, state.selection.to), API_DATE_FORMAT),\n };\n}\n\nexport function createTimelineState(value: DateRangeValue, min: Date, max: Date): TimelineState {\n const selectedFrom = parseDate(value.from) ?? min;\n const selectedTo = parseDate(value.to) ?? max;\n const absoluteSpan = Math.max(0, differenceInCalendarDays(max, min));\n if (absoluteSpan === 0) {\n return {\n origin: min,\n viewport: { from: 0, to: 0 },\n selection: { from: 0, to: 0 },\n };\n }\n\n const selectedFromIndex = clamp(differenceInCalendarDays(selectedFrom, min), 0, absoluteSpan);\n const selectedToIndex = clamp(differenceInCalendarDays(selectedTo, min), 0, absoluteSpan);\n\n return {\n origin: min,\n viewport: { from: 0, to: absoluteSpan },\n selection: {\n from: Math.min(selectedFromIndex, selectedToIndex),\n to: Math.max(selectedFromIndex, selectedToIndex),\n },\n };\n}\n\nexport function zoomTimelineViewport(\n state: TimelineState,\n maximumIndex: number,\n factor: number,\n anchor: number,\n): TimelineState {\n if (!Number.isFinite(factor) || factor <= 0 || factor === 1) return state;\n\n const boundedMaximum = Math.max(0, maximumIndex);\n const viewportSpan = state.viewport.to - state.viewport.from;\n const selectionSpan = state.selection.to - state.selection.from;\n const minimumViewportSpan = Math.max(selectionSpan, Math.min(1, boundedMaximum));\n const scaledSpan = clamp(Math.round(viewportSpan * factor), minimumViewportSpan, boundedMaximum);\n const nextSpan =\n scaledSpan === viewportSpan\n ? clamp(viewportSpan + (factor > 1 ? 1 : -1), minimumViewportSpan, boundedMaximum)\n : scaledSpan;\n if (nextSpan === viewportSpan) return state;\n\n const normalizedAnchor = Number.isFinite(anchor) ? clamp(anchor, 0, 1) : 0.5;\n const anchorIndex = state.viewport.from + viewportSpan * normalizedAnchor;\n const desiredFrom = Math.round(anchorIndex - nextSpan * normalizedAnchor);\n const earliestFrom = Math.max(0, state.selection.to - nextSpan);\n const latestFrom = Math.min(state.selection.from, boundedMaximum - nextSpan);\n const from = clamp(desiredFrom, earliestFrom, latestFrom);\n\n return {\n ...state,\n viewport: { from, to: from + nextSpan },\n };\n}\n\nexport function revealTimelineSelection(\n viewport: TimelineIndexRange,\n selection: TimelineIndexRange,\n maximumIndex: number,\n): TimelineIndexRange {\n const boundedMaximum = Math.max(0, maximumIndex);\n const selectionFrom = clamp(Math.min(selection.from, selection.to), 0, boundedMaximum);\n const selectionTo = clamp(Math.max(selection.from, selection.to), selectionFrom, boundedMaximum);\n const viewportSpan = clamp(viewport.to - viewport.from, 0, boundedMaximum);\n const viewportFrom = clamp(viewport.from, 0, boundedMaximum - viewportSpan);\n const normalizedViewport = { from: viewportFrom, to: viewportFrom + viewportSpan };\n const selectionSpan = selectionTo - selectionFrom;\n const nextSpan = Math.max(viewportSpan, selectionSpan);\n\n if (selectionFrom >= normalizedViewport.from && selectionTo <= normalizedViewport.to) {\n if (normalizedViewport.from === viewport.from && normalizedViewport.to === viewport.to) {\n return viewport;\n }\n return normalizedViewport;\n }\n\n const desiredFrom = selectionFrom < normalizedViewport.from ? selectionFrom : selectionTo - nextSpan;\n const from = clamp(desiredFrom, 0, boundedMaximum - nextSpan);\n return { from, to: from + nextSpan };\n}\n\nexport function getTimelinePosition(index: number, viewport: TimelineIndexRange) {\n const viewportSpan = viewport.to - viewport.from;\n if (viewportSpan === 0) return 50;\n return ((index - viewport.from) / viewportSpan) * 100;\n}\n\nexport function buildTimelineTickOffsets(span: number) {\n const boundedSpan = Math.max(0, Math.floor(span));\n const tickCount = boundedSpan === 0 ? 1 : Math.min(5, boundedSpan + 1);\n\n return Array.from({ length: tickCount }, (_, index) =>\n Math.round((boundedSpan * index) / Math.max(1, tickCount - 1)),\n );\n}\n\nexport function buildTimelineTicks(domainFrom: Date, domainTo: Date): TimelineTick[] {\n const span = Math.max(0, differenceInCalendarDays(domainTo, domainFrom));\n const crossesYears = domainFrom.getFullYear() !== domainTo.getFullYear();\n\n return buildTimelineTickOffsets(span).map(dayOffset => {\n const date = addDays(domainFrom, dayOffset);\n const labelFormat = span > 365 || crossesYears ? 'MMM yyyy' : 'MMM d';\n\n return {\n label: format(date, labelFormat),\n date: format(date, API_DATE_FORMAT),\n position: span === 0 ? 50 : (dayOffset / span) * 100,\n };\n });\n}\n\nexport function clampDateRangeToBounds(value: DateRangeValue, bounds: DateRangeBounds): DateRangeValue {\n const min = parseDate(bounds.min);\n const max = parseDate(bounds.max);\n if (!min || !max) return value;\n\n const from = parseDate(value.from) ?? min;\n const to = parseDate(value.to) ?? max;\n const clampedFrom = new Date(clamp(from.getTime(), min.getTime(), max.getTime()));\n const clampedTo = new Date(clamp(to.getTime(), clampedFrom.getTime(), max.getTime()));\n\n return {\n from: format(clampedFrom, API_DATE_FORMAT),\n to: format(clampedTo, API_DATE_FORMAT),\n };\n}\n\nexport function getDateRangeBounds(createdAt: string, today: string): DateRangeBounds {\n const max = parseDate(today) ?? new Date();\n const created = parseDate(createdAt) ?? max;\n const min = created > max ? max : created;\n return {\n min: format(min, API_DATE_FORMAT),\n max: format(max, API_DATE_FORMAT),\n };\n}\n\nexport function formatDateRangeDuration(value: DateRangeValue) {\n const from = parseDate(value.from);\n const to = parseDate(value.to);\n if (!from || !to) return '';\n const days = Math.max(1, differenceInCalendarDays(to, from) + 1);\n return days === 1 ? '1 day' : `${days} days`;\n}\n\nexport function formatDateRangeValueText(value: DateRangeValue) {\n const from = parseDate(value.from);\n const to = parseDate(value.to);\n if (!from || !to) return `${value.from} through ${value.to}`;\n return `${format(from, 'MMMM d, yyyy')} through ${format(to, 'MMMM d, yyyy')}`;\n}\n","import { format } from 'date-fns';\nimport { CalendarDaysIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { parseDate } from './lib/date-range-timeline';\nimport type { DateBoundary } from './lib/date-range-timeline';\nimport { Button } from '@/ds/components/Button/Button';\nimport { DatePicker } from '@/ds/components/DateTimePicker';\nimport { Popover, PopoverTrigger, PopoverContent } from '@/ds/components/Popover/popover';\nimport { Txt } from '@/ds/components/Txt/Txt';\n\ninterface DateRangeBoundaryPickerProps {\n boundary: DateBoundary;\n value: string;\n min: string;\n max: string;\n onSelect: (boundary: DateBoundary, value: string) => void;\n}\n\nexport function DateRangeBoundaryPicker({ boundary, value, min, max, onSelect }: DateRangeBoundaryPickerProps) {\n const [open, setOpen] = useState(false);\n const isFrom = boundary === 'from';\n const boundaryLabel = isFrom ? 'start date' : 'end date';\n const selectedDate = parseDate(value);\n const firstDate = parseDate(min) ?? selectedDate;\n const lastDate = parseDate(max) ?? selectedDate;\n const formattedDate = selectedDate ? format(selectedDate, 'MMM d, yyyy') : value;\n\n function handleSelect(date?: Date) {\n if (!date) return;\n onSelect(boundary, format(date, 'yyyy-MM-dd'));\n setOpen(false);\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <Button\n aria-label={`Choose ${boundaryLabel}, ${formattedDate}`}\n aria-expanded={open}\n size=\"xs\"\n className=\"h-11 w-full min-w-0 justify-between gap-2 overflow-hidden px-3 sm:h-8\"\n >\n <Txt as=\"span\" variant=\"ui-sm\" className=\"truncate text-neutral5 tabular-nums\">\n {formattedDate}\n </Txt>\n <CalendarDaysIcon className=\"size-3.5 shrink-0 text-neutral3\" aria-hidden=\"true\" />\n </Button>\n }\n />\n <PopoverContent align={isFrom ? 'start' : 'end'} className=\"w-auto p-0\" sideOffset={6}>\n <DatePicker\n mode=\"single\"\n selected={selectedDate}\n defaultMonth={selectedDate}\n fromMonth={firstDate}\n toMonth={lastDate}\n disabled={firstDate && lastDate ? { before: firstDate, after: lastDate } : undefined}\n onSelect={handleSelect}\n />\n </PopoverContent>\n </Popover>\n );\n}\n","import { clamp } from './date-range-timeline';\n\nconst PREFERRED_PICKER_WIDTH = 160;\nconst PREFERRED_PICKER_GAP = 8;\n\ninterface BoundaryPositions {\n from: number;\n to: number;\n}\n\ninterface BoundaryPickerRect {\n left: number;\n width: number;\n}\n\nexport interface DateRangeBoundaryLayout {\n from: BoundaryPickerRect;\n to: BoundaryPickerRect;\n gap: number;\n}\n\nexport function resolveDateRangeBoundaryLayout(\n requestedWidth: number,\n positions: BoundaryPositions,\n): DateRangeBoundaryLayout {\n const width = Math.max(0, requestedWidth);\n const gap = Math.min(PREFERRED_PICKER_GAP, width);\n const pickerWidth = Math.min(PREFERRED_PICKER_WIDTH, Math.max(0, (width - gap) / 2));\n const maximumLeft = Math.max(0, width - pickerWidth);\n const fromAnchor = (clamp(positions.from, 0, 100) / 100) * width;\n const toAnchor = (clamp(positions.to, 0, 100) / 100) * width;\n const preferredFromLeft = clamp(fromAnchor - pickerWidth - gap / 2, 0, maximumLeft);\n const preferredToLeft = clamp(toAnchor + gap / 2, 0, maximumLeft);\n const overlap = preferredFromLeft + pickerWidth + gap - preferredToLeft;\n\n if (overlap <= 0) {\n return {\n from: { left: preferredFromLeft, width: pickerWidth },\n to: { left: preferredToLeft, width: pickerWidth },\n gap,\n };\n }\n\n const pairWidth = pickerWidth * 2 + gap;\n const pairLeft = clamp(preferredFromLeft - overlap / 2, 0, Math.max(0, width - pairWidth));\n\n return {\n from: { left: pairLeft, width: pickerWidth },\n to: { left: pairLeft + pickerWidth + gap, width: pickerWidth },\n gap,\n };\n}\n","import { useLayoutEffect, useState } from 'react';\nimport type { RefObject } from 'react';\nimport { resolveDateRangeBoundaryLayout } from '../lib/date-range-boundary-layout';\nimport type { DateRangeBoundaryLayout } from '../lib/date-range-boundary-layout';\n\ninterface BoundaryPositions {\n from: number;\n to: number;\n}\n\nexport function useDateRangeBoundaryLayout(\n containerRef: RefObject<HTMLDivElement | null>,\n positions: BoundaryPositions,\n): DateRangeBoundaryLayout | undefined {\n const [containerWidth, setContainerWidth] = useState<number>();\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n function updateWidth(width: number) {\n // Accept 0 (collapsed container) so stale positions don't linger; reject\n // only invalid measurements. resolveDateRangeBoundaryLayout handles 0.\n if (!Number.isFinite(width) || width < 0) return;\n setContainerWidth(current => (current === width ? current : width));\n }\n\n updateWidth(container.getBoundingClientRect().width);\n if (typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(entries => {\n const entry = entries.find(({ target }) => target === container) ?? entries[0];\n const width = entry?.contentRect.width ?? container.getBoundingClientRect().width;\n updateWidth(width);\n });\n observer.observe(container);\n return () => observer.disconnect();\n }, [containerRef]);\n\n return containerWidth === undefined ? undefined : resolveDateRangeBoundaryLayout(containerWidth, positions);\n}\n","import { useRef } from 'react';\nimport { DateRangeBoundaryPicker } from './DateRangeBoundaryPicker';\nimport { useDateRangeBoundaryLayout } from './hooks/useDateRangeBoundaryLayout';\nimport type { DateBoundary } from './lib/date-range-timeline';\nimport type { DateRangeValue } from './types';\n\ninterface DateRangeBoundaryPickersProps {\n positions: { from: number; to: number };\n value: DateRangeValue;\n min: string;\n max: string;\n onSelect: (boundary: DateBoundary, value: string) => void;\n}\n\nconst FALLBACK_PICKER_WIDTH = 'clamp(0px, calc(50% - 0.25rem), 10rem)';\n\nexport function DateRangeBoundaryPickers({ positions, value, min, max, onSelect }: DateRangeBoundaryPickersProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const layout = useDateRangeBoundaryLayout(containerRef, positions);\n\n return (\n <div ref={containerRef} className=\"relative h-16 sm:h-12\">\n <div\n className=\"absolute top-0 min-w-0\"\n style={{\n left: layout?.from.left ?? 0,\n width: layout?.from.width ?? FALLBACK_PICKER_WIDTH,\n }}\n >\n <DateRangeBoundaryPicker boundary=\"from\" value={value.from} min={min} max={value.to} onSelect={onSelect} />\n </div>\n\n <div\n className=\"absolute top-0 min-w-0\"\n style={{\n left: layout?.to.left ?? 'max(calc(50% + 0.25rem), calc(100% - 10rem))',\n width: layout?.to.width ?? FALLBACK_PICKER_WIDTH,\n }}\n >\n <DateRangeBoundaryPicker boundary=\"to\" value={value.to} min={value.from} max={max} onSelect={onSelect} />\n </div>\n\n <div\n className=\"absolute top-11 h-4 w-px -translate-x-1/2 bg-border2 transition-[left] duration-150 ease-out motion-reduce:transition-none sm:top-8\"\n style={{ left: `${positions.from}%` }}\n aria-hidden=\"true\"\n />\n <div\n className=\"absolute top-11 h-4 w-px -translate-x-1/2 bg-border2 transition-[left] duration-150 ease-out motion-reduce:transition-none sm:top-8\"\n style={{ left: `${positions.to}%` }}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n","import { format } from 'date-fns';\nimport { parseDate } from './lib/date-range-timeline';\nimport type { TimelineTick } from './lib/date-range-timeline';\nimport { Txt } from '@/ds/components/Txt/Txt';\n\ninterface DateRangeTicksProps {\n ticks: TimelineTick[];\n min: string;\n max: string;\n}\n\nfunction formatBoundaryDate(value: string) {\n const date = parseDate(value);\n return date ? format(date, 'MMM d, yyyy') : value;\n}\n\nexport function DateRangeTicks({ ticks, min, max }: DateRangeTicksProps) {\n const firstTick = ticks[0];\n const lastTick = ticks.at(-1);\n if (!firstTick || !lastTick) return null;\n const timelineLabel = `Visible from ${formatBoundaryDate(firstTick.date)} through ${formatBoundaryDate(lastTick.date)}. Available from ${formatBoundaryDate(min)} through ${formatBoundaryDate(max)}`;\n\n if (firstTick.date === lastTick.date) {\n const date = formatBoundaryDate(firstTick.date);\n // Only claim \"Created today\" when the whole available domain is a single\n // day; a zoomed viewport can hold one tick for any date, so stay neutral.\n const singleLabel =\n firstTick.date === min && firstTick.date === max\n ? `Created today · ${date}`\n : firstTick.date === min\n ? `Created · ${date}`\n : firstTick.date === max\n ? `Today · ${date}`\n : date;\n return (\n <div role=\"group\" aria-label={timelineLabel} className=\"flex h-10 items-start justify-center pt-2\">\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral3\">\n {singleLabel}\n </Txt>\n </div>\n );\n }\n\n const startLabel = firstTick.date === min ? `Created · ${formatBoundaryDate(min)}` : firstTick.label;\n const endLabel = lastTick.date === max ? `Today · ${formatBoundaryDate(max)}` : lastTick.label;\n const middleTicks = ticks.slice(1, -1);\n\n return (\n <div role=\"group\" className=\"relative h-10\" aria-label={timelineLabel}>\n <div className=\"absolute top-0 left-0 flex flex-col items-start\">\n <span className=\"mb-1 h-1.5 w-px bg-border2\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"whitespace-nowrap text-neutral3\">\n {startLabel}\n </Txt>\n </div>\n\n {middleTicks.map(tick => (\n <div\n key={tick.date}\n className=\"absolute top-0 hidden -translate-x-1/2 flex-col items-center sm:flex\"\n style={{ left: `${tick.position}%` }}\n aria-hidden=\"true\"\n >\n <span className=\"mb-1 h-1.5 w-px bg-border2\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-xs\" className=\"whitespace-nowrap text-neutral3\">\n {tick.label}\n </Txt>\n </div>\n ))}\n\n <div className=\"absolute top-0 right-0 flex flex-col items-end\">\n <span className=\"mb-1 h-1.5 w-px bg-border2\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"whitespace-nowrap text-neutral3\">\n {endLabel}\n </Txt>\n </div>\n </div>\n );\n}\n","import { format } from 'date-fns';\nimport type { KeyboardEventHandler, PointerEventHandler } from 'react';\nimport { parseDate } from './lib/date-range-timeline';\nimport type { DateBoundary } from './lib/date-range-timeline';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeHandleProps {\n boundary: DateBoundary;\n position: number;\n value: number;\n valueText: string;\n min: number;\n max: number;\n active: boolean;\n onPointerDown: PointerEventHandler<HTMLDivElement>;\n onKeyDown: KeyboardEventHandler<HTMLDivElement>;\n}\n\nexport function DateRangeHandle({\n boundary,\n position,\n value,\n valueText,\n min,\n max,\n active,\n onPointerDown,\n onKeyDown,\n}: DateRangeHandleProps) {\n const label = boundary === 'from' ? 'Start date handle' : 'End date handle';\n const date = parseDate(valueText);\n const accessibleValue = date ? format(date, 'MMMM d, yyyy') : valueText;\n\n return (\n <div\n role=\"slider\"\n tabIndex={0}\n aria-label={label}\n aria-orientation=\"horizontal\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={accessibleValue}\n className=\"group absolute inset-y-0 z-30 w-11 -translate-x-1/2 cursor-ew-resize touch-none outline-hidden\"\n style={{ left: `${position}%` }}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n >\n <span\n className={cn(\n 'absolute top-1/2 left-1/2 h-7 w-1.5 -translate-1/2 rounded-xs bg-surface3 ring-1 transition-[width,box-shadow] duration-150 group-hover:w-2 group-focus-visible:w-2 group-focus-visible:ring-2 group-focus-visible:ring-accent3 motion-reduce:transition-none',\n active ? 'w-2 ring-2 ring-neutral3/40' : 'ring-border2',\n )}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n","import type { KeyboardEventHandler, PointerEventHandler } from 'react';\nimport { Txt } from '@/ds/components/Txt/Txt';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeSelectionProps {\n left: number;\n width: number;\n duration: string;\n active: boolean;\n value: number;\n valueText: string;\n max: number;\n onPointerDown: PointerEventHandler<HTMLDivElement>;\n onKeyDown: KeyboardEventHandler<HTMLDivElement>;\n}\n\nexport function DateRangeSelection({\n left,\n width,\n duration,\n active,\n value,\n valueText,\n max,\n onPointerDown,\n onKeyDown,\n}: DateRangeSelectionProps) {\n const visibleWidth = Math.max(width, 0.6);\n const visibleLeft = Math.min(left, 100 - visibleWidth);\n const showDuration = width >= 12;\n return (\n <div\n role=\"slider\"\n tabIndex={0}\n aria-label=\"Move selected date range\"\n aria-orientation=\"horizontal\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={valueText}\n className={cn(\n 'absolute inset-y-1 z-10 flex cursor-grab touch-none items-center justify-center overflow-hidden rounded-md bg-neutral6/10 text-neutral6 select-none outline-hidden focus-visible:ring-2 focus-visible:ring-accent3 active:cursor-grabbing',\n active\n ? 'transition-none'\n : 'transition-[left,width,background-color] duration-150 ease-out motion-reduce:transition-none',\n )}\n style={{ left: `${visibleLeft}%`, width: `${visibleWidth}%` }}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n >\n {showDuration ? (\n // TODO(ds): Txt needs a compact data-label variant.\n <Txt as=\"span\" variant=\"ui-sm\" font=\"mono\" className=\"text-neutral6 tabular-nums\">\n {duration}\n </Txt>\n ) : null}\n </div>\n );\n}\n","import type { DateRangeGridMarker } from './lib/date-range-timeline-grid';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeTrackGridProps {\n markers: DateRangeGridMarker[];\n}\n\nfunction getMarkerHeight(emphasis: DateRangeGridMarker['emphasis']) {\n if (emphasis === 'major') return 'h-5';\n if (emphasis === 'medium') return 'h-3';\n return 'h-1.5';\n}\n\nexport function DateRangeTrackGrid({ markers }: DateRangeTrackGridProps) {\n return (\n <div className=\"pointer-events-none absolute inset-0 overflow-hidden rounded-lg\" aria-hidden=\"true\">\n {markers.map(marker => (\n <span\n key={marker.index}\n className={cn('absolute top-1/2 w-px -translate-1/2 bg-neutral3/15', getMarkerHeight(marker.emphasis))}\n style={{ left: `${marker.position}%` }}\n />\n ))}\n </div>\n );\n}\n","import { clamp } from './date-range-timeline';\nimport type { DateBoundary, TimelineIndexRange } from './date-range-timeline';\n\ninterface TimelineTrackGeometry {\n left: number;\n width: number;\n}\n\nexport type TimelinePointerGesture =\n | { type: 'brush'; startIndex: number }\n | { type: 'pan'; startIndex: number; originalSelection: TimelineIndexRange }\n | { type: 'handle'; boundary: DateBoundary; originalSelection: TimelineIndexRange };\n\nexport type TimelineInteraction =\n { type: 'selecting' } | { type: 'moving' } | { type: 'resizing'; boundary: DateBoundary };\n\nconst KEYBOARD_LARGE_STEP_DAYS = 7;\n\nfunction getKeyboardDelta(key: string) {\n if (key === 'ArrowLeft' || key === 'ArrowDown') return -1;\n if (key === 'ArrowRight' || key === 'ArrowUp') return 1;\n if (key === 'PageDown') return -KEYBOARD_LARGE_STEP_DAYS;\n if (key === 'PageUp') return KEYBOARD_LARGE_STEP_DAYS;\n return undefined;\n}\n\nexport function getTimelineInteraction(gesture: TimelinePointerGesture): TimelineInteraction {\n if (gesture.type === 'brush') return { type: 'selecting' };\n if (gesture.type === 'pan') return { type: 'moving' };\n return { type: 'resizing', boundary: gesture.boundary };\n}\n\nexport function getTimelineIndexAtClientX(\n clientX: number,\n track: TimelineTrackGeometry | undefined,\n viewport: TimelineIndexRange,\n) {\n const viewportSpan = viewport.to - viewport.from;\n if (!track || track.width <= 0 || viewportSpan <= 0) return viewport.from;\n\n const position = clamp((clientX - track.left) / track.width, 0, 1);\n return viewport.from + Math.round(position * viewportSpan);\n}\n\nexport function resolveTimelineGestureSelection(\n gesture: TimelinePointerGesture,\n pointerIndex: number,\n viewport: TimelineIndexRange,\n): TimelineIndexRange {\n const boundedPointerIndex = clamp(pointerIndex, viewport.from, viewport.to);\n\n if (gesture.type === 'brush') {\n return {\n from: Math.min(gesture.startIndex, boundedPointerIndex),\n to: Math.max(gesture.startIndex, boundedPointerIndex),\n };\n }\n\n if (gesture.type === 'pan') {\n const selectionSpan = gesture.originalSelection.to - gesture.originalSelection.from;\n const delta = boundedPointerIndex - gesture.startIndex;\n const from = clamp(gesture.originalSelection.from + delta, viewport.from, viewport.to - selectionSpan);\n return { from, to: from + selectionSpan };\n }\n\n if (gesture.boundary === 'from') {\n return {\n from: clamp(boundedPointerIndex, viewport.from, gesture.originalSelection.to),\n to: gesture.originalSelection.to,\n };\n }\n\n return {\n from: gesture.originalSelection.from,\n to: clamp(boundedPointerIndex, gesture.originalSelection.from, viewport.to),\n };\n}\n\nexport function moveTimelineSelectionFromKey(selection: TimelineIndexRange, key: string, maximumIndex: number) {\n const span = selection.to - selection.from;\n if (key === 'Home') return { from: 0, to: span };\n if (key === 'End') return { from: maximumIndex - span, to: maximumIndex };\n\n const delta = getKeyboardDelta(key);\n if (delta === undefined) return undefined;\n const from = clamp(selection.from + delta, 0, maximumIndex - span);\n return { from, to: from + span };\n}\n\nexport function resizeTimelineSelectionFromKey(\n selection: TimelineIndexRange,\n boundary: DateBoundary,\n key: string,\n maximumIndex: number,\n) {\n const { from, to } = selection;\n if (key === 'Home') return boundary === 'from' ? { from: 0, to } : { from, to: from };\n if (key === 'End') {\n return boundary === 'from' ? { from: to, to } : { from, to: maximumIndex };\n }\n\n const delta = getKeyboardDelta(key);\n if (delta === undefined) return undefined;\n return boundary === 'from'\n ? { from: clamp(from + delta, 0, to), to }\n : { from, to: clamp(to + delta, from, maximumIndex) };\n}\n","import type { KeyboardEvent } from 'react';\nimport type { DateBoundary, TimelineIndexRange } from '../lib/date-range-timeline';\nimport { moveTimelineSelectionFromKey, resizeTimelineSelectionFromKey } from '../lib/date-range-timeline-interactions';\n\ninterface UseDateRangeKeyboardControlsInput {\n selection: TimelineIndexRange;\n maximumIndex: number;\n onCommit: (selection: TimelineIndexRange) => void;\n}\n\nexport function useDateRangeKeyboardControls({ selection, maximumIndex, onCommit }: UseDateRangeKeyboardControlsInput) {\n function handleSelectionKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const nextSelection = moveTimelineSelectionFromKey(selection, event.key, maximumIndex);\n if (!nextSelection) return;\n\n event.preventDefault();\n onCommit(nextSelection);\n }\n\n function handleBoundaryKeyDown(boundary: DateBoundary, event: KeyboardEvent<HTMLDivElement>) {\n const nextSelection = resizeTimelineSelectionFromKey(selection, boundary, event.key, maximumIndex);\n if (!nextSelection) return;\n\n event.preventDefault();\n onCommit(nextSelection);\n }\n\n function handleFromKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n handleBoundaryKeyDown('from', event);\n }\n\n function handleToKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n handleBoundaryKeyDown('to', event);\n }\n\n return {\n handleSelectionKeyDown,\n handleFromKeyDown,\n handleToKeyDown,\n };\n}\n","import { useRef } from 'react';\nimport type { PointerEvent } from 'react';\n\ninterface PointerDragSession<TPayload> {\n pointerId: number;\n captureTarget: HTMLElement;\n payload: TPayload;\n}\n\ninterface UsePointerDragInput<TPayload> {\n onMove: (payload: TPayload, event: PointerEvent<HTMLElement>) => void;\n onEnd: (payload: TPayload, event: PointerEvent<HTMLElement>) => void;\n onCancel: (payload: TPayload, event: PointerEvent<HTMLElement>) => void;\n}\n\nexport function usePointerDrag<TPayload>({ onMove, onEnd, onCancel }: UsePointerDragInput<TPayload>) {\n const sessionRef = useRef<PointerDragSession<TPayload> | undefined>(undefined);\n\n function startPointerDrag(event: PointerEvent<HTMLElement>, payload: TPayload) {\n if (sessionRef.current) return false;\n\n const captureTarget = event.currentTarget;\n captureTarget.setPointerCapture(event.pointerId);\n sessionRef.current = {\n pointerId: event.pointerId,\n captureTarget,\n payload,\n };\n return true;\n }\n\n function getSession(event: PointerEvent<HTMLElement>) {\n const session = sessionRef.current;\n if (!session || session.pointerId !== event.pointerId) return undefined;\n return session;\n }\n\n function releaseSession(session: PointerDragSession<TPayload>) {\n sessionRef.current = undefined;\n if (!session.captureTarget.hasPointerCapture(session.pointerId)) return;\n session.captureTarget.releasePointerCapture(session.pointerId);\n }\n\n function handlePointerMove(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n onMove(session.payload, event);\n }\n\n function handlePointerUp(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n releaseSession(session);\n onEnd(session.payload, event);\n }\n\n function handlePointerCancel(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n releaseSession(session);\n onCancel(session.payload, event);\n }\n\n function handleLostPointerCapture(event: PointerEvent<HTMLElement>) {\n const session = getSession(event);\n if (!session) return;\n sessionRef.current = undefined;\n onCancel(session.payload, event);\n }\n\n return {\n startPointerDrag,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n handleLostPointerCapture,\n };\n}\n","import { useState } from 'react';\nimport type { PointerEvent, RefObject } from 'react';\nimport type { DateBoundary, TimelineIndexRange, TimelineState } from '../lib/date-range-timeline';\nimport {\n getTimelineIndexAtClientX,\n getTimelineInteraction,\n resolveTimelineGestureSelection,\n} from '../lib/date-range-timeline-interactions';\nimport type { TimelineInteraction, TimelinePointerGesture } from '../lib/date-range-timeline-interactions';\nimport { usePointerDrag } from './use-pointer-drag';\n\nexport type { TimelineInteraction } from '../lib/date-range-timeline-interactions';\n\ninterface TimelinePointerDrag {\n gesture: TimelinePointerGesture;\n currentSelection: TimelineIndexRange;\n}\n\ninterface UseDateRangePointerGesturesInput {\n trackRef: RefObject<HTMLDivElement | null>;\n timeline: TimelineState;\n onSelectionPreview: (selection: TimelineIndexRange) => void;\n onSelectionCommit: (selection: TimelineIndexRange) => void;\n onSelectionCancel: () => void;\n}\n\nexport function useDateRangePointerGestures({\n trackRef,\n timeline,\n onSelectionPreview,\n onSelectionCommit,\n onSelectionCancel,\n}: UseDateRangePointerGesturesInput) {\n const [interaction, setInteraction] = useState<TimelineInteraction>();\n\n function getPointerIndex(clientX: number) {\n const track = trackRef.current?.getBoundingClientRect();\n return getTimelineIndexAtClientX(clientX, track, timeline.viewport);\n }\n\n function previewPointerDrag(drag: TimelinePointerDrag, event: PointerEvent<HTMLElement>) {\n const pointerIndex = getPointerIndex(event.clientX);\n const selection = resolveTimelineGestureSelection(drag.gesture, pointerIndex, timeline.viewport);\n drag.currentSelection = selection;\n onSelectionPreview(selection);\n }\n\n function commitPointerDrag(drag: TimelinePointerDrag, event: PointerEvent<HTMLElement>) {\n previewPointerDrag(drag, event);\n setInteraction(undefined);\n onSelectionCommit(drag.currentSelection);\n }\n\n function cancelPointerDrag() {\n setInteraction(undefined);\n onSelectionCancel();\n }\n\n const pointerDrag = usePointerDrag<TimelinePointerDrag>({\n onMove: previewPointerDrag,\n onEnd: commitPointerDrag,\n onCancel: cancelPointerDrag,\n });\n\n function beginPointerDrag(\n event: PointerEvent<HTMLDivElement>,\n gesture: TimelinePointerGesture,\n currentSelection: TimelineIndexRange,\n ) {\n const started = pointerDrag.startPointerDrag(event, { gesture, currentSelection });\n if (!started) return false;\n setInteraction(getTimelineInteraction(gesture));\n return true;\n }\n\n function startBrush(event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n const startIndex = getPointerIndex(event.clientX);\n const selection = { from: startIndex, to: startIndex };\n const started = beginPointerDrag(\n event,\n {\n type: 'brush',\n startIndex,\n },\n selection,\n );\n if (!started) return;\n onSelectionPreview(selection);\n }\n\n function startPan(event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n beginPointerDrag(\n event,\n {\n type: 'pan',\n startIndex: getPointerIndex(event.clientX),\n originalSelection: timeline.selection,\n },\n timeline.selection,\n );\n }\n\n function startHandle(boundary: DateBoundary, event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n beginPointerDrag(\n event,\n {\n type: 'handle',\n boundary,\n originalSelection: timeline.selection,\n },\n timeline.selection,\n );\n }\n\n function handlePointerMove(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handlePointerMove(event);\n }\n\n function handlePointerUp(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handlePointerUp(event);\n }\n\n function handlePointerCancel(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handlePointerCancel(event);\n }\n\n function handleLostPointerCapture(event: PointerEvent<HTMLDivElement>) {\n pointerDrag.handleLostPointerCapture(event);\n }\n\n return {\n interaction,\n startBrush,\n startPan,\n startHandle,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n handleLostPointerCapture,\n };\n}\n","import { useEffect, useEffectEvent } from 'react';\nimport type { RefObject } from 'react';\nimport { clamp } from '../lib/date-range-timeline';\n\nconst MAX_WHEEL_DELTA = 80;\nconst WHEEL_ZOOM_SENSITIVITY = 0.003;\n\ninterface UseDateRangeWheelZoomInput {\n rootRef: RefObject<HTMLDivElement | null>;\n trackRef: RefObject<HTMLDivElement | null>;\n disabled: boolean;\n onZoom: (factor: number, anchor: number) => void;\n}\n\nexport function useDateRangeWheelZoom({ rootRef, trackRef, disabled, onZoom }: UseDateRangeWheelZoomInput) {\n const handleWheel = useEffectEvent((event: WheelEvent) => {\n if (!event.ctrlKey) return;\n // Bail before preventDefault when disabled so native browser zoom still works.\n if (disabled) return;\n event.preventDefault();\n\n const trackRect = trackRef.current?.getBoundingClientRect();\n const anchor =\n trackRect && trackRect.width > 0 ? clamp((event.clientX - trackRect.left) / trackRect.width, 0, 1) : 0.5;\n const wheelDelta = clamp(event.deltaY, -MAX_WHEEL_DELTA, MAX_WHEEL_DELTA);\n const factor = Math.exp(wheelDelta * WHEEL_ZOOM_SENSITIVITY);\n onZoom(factor, anchor);\n });\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n root.addEventListener('wheel', handleWheel, { passive: false });\n return () => root.removeEventListener('wheel', handleWheel);\n }, [rootRef]);\n}\n","import { buildTimelineTickOffsets, getTimelinePosition } from './date-range-timeline';\nimport type { TimelineIndexRange } from './date-range-timeline';\n\nconst MAX_GRID_INTERVALS = 24;\n\nexport interface DateRangeGridMarker {\n index: number;\n position: number;\n emphasis: 'major' | 'medium' | 'minor';\n}\n\nfunction addVisibleMarker(markerIndices: Set<number>, index: number, viewport: TimelineIndexRange) {\n if (index >= viewport.from && index <= viewport.to) {\n markerIndices.add(index);\n }\n}\n\nfunction getMarkerEmphasis(\n index: number,\n majorIndices: Set<number>,\n mediumIndices: Set<number>,\n): DateRangeGridMarker['emphasis'] {\n if (majorIndices.has(index)) return 'major';\n if (mediumIndices.has(index)) return 'medium';\n return 'minor';\n}\n\nexport function createDateRangeGridMarkers(\n viewport: TimelineIndexRange,\n selection: TimelineIndexRange,\n): DateRangeGridMarker[] {\n const viewportSpan = Math.max(0, viewport.to - viewport.from);\n if (viewportSpan === 0) {\n return [{ index: viewport.from, position: 50, emphasis: 'major' }];\n }\n\n const sampleStep = Math.max(1, Math.ceil(viewportSpan / MAX_GRID_INTERVALS));\n const markerIndices = new Set<number>();\n const majorIndices = new Set<number>();\n const mediumIndices = new Set<number>();\n const tickOffsets = buildTimelineTickOffsets(viewportSpan);\n\n for (let index = viewport.from; index <= viewport.to; index += sampleStep) {\n markerIndices.add(index);\n }\n\n for (let index = 0; index < tickOffsets.length; index += 1) {\n const tickOffset = tickOffsets[index];\n if (tickOffset === undefined) continue;\n\n const majorIndex = viewport.from + tickOffset;\n markerIndices.add(majorIndex);\n majorIndices.add(majorIndex);\n\n const nextTickOffset = tickOffsets[index + 1];\n if (nextTickOffset === undefined) continue;\n\n const mediumIndex = viewport.from + Math.round((tickOffset + nextTickOffset) / 2);\n markerIndices.add(mediumIndex);\n mediumIndices.add(mediumIndex);\n }\n\n addVisibleMarker(markerIndices, selection.from, viewport);\n addVisibleMarker(markerIndices, selection.to, viewport);\n\n return [...markerIndices]\n .sort((left, right) => left - right)\n .map(index => ({\n index,\n position: getTimelinePosition(index, viewport),\n emphasis: getMarkerEmphasis(index, majorIndices, mediumIndices),\n }));\n}\n","import { addDays } from 'date-fns';\nimport {\n buildTimelineTicks,\n formatDateRangeDuration,\n formatDateRangeValueText,\n getTimelinePosition,\n toDateRange,\n} from './date-range-timeline';\nimport type { TimelineState } from './date-range-timeline';\n\nexport function createDateRangeBoundaryModel(state: TimelineState) {\n const range = toDateRange(state);\n const fromPosition = getTimelinePosition(state.selection.from, state.viewport);\n const toPosition = getTimelinePosition(state.selection.to, state.viewport);\n\n return {\n positions: { from: fromPosition, to: toPosition },\n range,\n };\n}\n\nexport function createDateRangeTrackModel(state: TimelineState, maximumIndex: number) {\n const range = toDateRange(state);\n const fromPosition = getTimelinePosition(state.selection.from, state.viewport);\n const toPosition = getTimelinePosition(state.selection.to, state.viewport);\n const span = state.selection.to - state.selection.from;\n\n return {\n handles: {\n from: {\n position: fromPosition,\n value: state.selection.from,\n valueText: range.from,\n min: 0,\n max: state.selection.to,\n },\n to: {\n position: toPosition,\n value: state.selection.to,\n valueText: range.to,\n min: state.selection.from,\n max: maximumIndex,\n },\n },\n selection: {\n left: fromPosition,\n width: Math.max(0, toPosition - fromPosition),\n duration: formatDateRangeDuration(range),\n value: state.selection.from,\n valueText: formatDateRangeValueText(range),\n max: maximumIndex - span,\n },\n };\n}\n\nexport function createDateRangeAxisModel(state: TimelineState) {\n const visibleFrom = addDays(state.origin, state.viewport.from);\n const visibleTo = addDays(state.origin, state.viewport.to);\n return { ticks: buildTimelineTicks(visibleFrom, visibleTo) };\n}\n","import { useRef } from 'react';\nimport type { PointerEvent, RefObject } from 'react';\nimport { DateRangeHandle } from './DateRangeHandle';\nimport { DateRangeSelection } from './DateRangeSelection';\nimport { DateRangeTrackGrid } from './DateRangeTrackGrid';\nimport { useDateRangeKeyboardControls } from './hooks/useDateRangeKeyboardControls';\nimport { useDateRangePointerGestures } from './hooks/useDateRangePointerGestures';\nimport { useDateRangeWheelZoom } from './hooks/useDateRangeWheelZoom';\nimport type { TimelineIndexRange, TimelineState } from './lib/date-range-timeline';\nimport { createDateRangeGridMarkers } from './lib/date-range-timeline-grid';\nimport { createDateRangeTrackModel } from './lib/date-range-timeline-view-model';\nimport { cn } from '@/lib/utils';\n\ninterface DateRangeTrackProps {\n wheelTargetRef: RefObject<HTMLDivElement | null>;\n timeline: TimelineState;\n maximumIndex: number;\n onSelectionPreview: (selection: TimelineIndexRange) => void;\n onSelectionCommit: (selection: TimelineIndexRange) => void;\n onSelectionCancel: () => void;\n onZoom: (factor: number, anchor: number) => void;\n}\n\nexport function DateRangeTrack({\n wheelTargetRef,\n timeline,\n maximumIndex,\n onSelectionPreview,\n onSelectionCommit,\n onSelectionCancel,\n onZoom,\n}: DateRangeTrackProps) {\n const trackRef = useRef<HTMLDivElement>(null);\n const pointer = useDateRangePointerGestures({\n trackRef,\n timeline,\n onSelectionPreview,\n onSelectionCommit,\n onSelectionCancel,\n });\n const { handleSelectionKeyDown, handleFromKeyDown, handleToKeyDown } = useDateRangeKeyboardControls({\n selection: timeline.selection,\n maximumIndex,\n onCommit: onSelectionCommit,\n });\n\n useDateRangeWheelZoom({\n rootRef: wheelTargetRef,\n trackRef,\n disabled: pointer.interaction !== undefined,\n onZoom,\n });\n\n const model = createDateRangeTrackModel(timeline, maximumIndex);\n const gridMarkers = createDateRangeGridMarkers(timeline.viewport, timeline.selection);\n\n function startFromHandle(event: PointerEvent<HTMLDivElement>) {\n pointer.startHandle('from', event);\n }\n\n function startToHandle(event: PointerEvent<HTMLDivElement>) {\n pointer.startHandle('to', event);\n }\n\n return (\n <div\n ref={trackRef}\n role=\"group\"\n aria-label=\"Date range selection area\"\n className={cn(\n 'relative h-12 touch-none rounded-lg bg-surface4',\n pointer.interaction?.type === 'selecting' ? 'cursor-col-resize' : 'cursor-crosshair',\n )}\n onPointerDown={pointer.startBrush}\n onPointerMove={pointer.handlePointerMove}\n onPointerUp={pointer.handlePointerUp}\n onPointerCancel={pointer.handlePointerCancel}\n onLostPointerCapture={pointer.handleLostPointerCapture}\n >\n <DateRangeTrackGrid markers={gridMarkers} />\n <DateRangeSelection\n left={model.selection.left}\n width={model.selection.width}\n duration={model.selection.duration}\n active={pointer.interaction !== undefined}\n value={model.selection.value}\n valueText={model.selection.valueText}\n max={model.selection.max}\n onPointerDown={pointer.startPan}\n onKeyDown={handleSelectionKeyDown}\n />\n <DateRangeHandle\n boundary=\"from\"\n position={model.handles.from.position}\n value={model.handles.from.value}\n valueText={model.handles.from.valueText}\n min={model.handles.from.min}\n max={model.handles.from.max}\n active={pointer.interaction?.type === 'resizing' && pointer.interaction.boundary === 'from'}\n onPointerDown={startFromHandle}\n onKeyDown={handleFromKeyDown}\n />\n <DateRangeHandle\n boundary=\"to\"\n position={model.handles.to.position}\n value={model.handles.to.value}\n valueText={model.handles.to.valueText}\n min={model.handles.to.min}\n max={model.handles.to.max}\n active={pointer.interaction?.type === 'resizing' && pointer.interaction.boundary === 'to'}\n onPointerDown={startToHandle}\n onKeyDown={handleToKeyDown}\n />\n </div>\n );\n}\n","import { addDays, differenceInCalendarDays } from 'date-fns';\nimport { useState } from 'react';\nimport {\n clamp,\n createTimelineState,\n parseDate,\n revealTimelineSelection,\n toDateRange,\n zoomTimelineViewport,\n} from '../lib/date-range-timeline';\nimport type { DateBoundary, TimelineIndexRange } from '../lib/date-range-timeline';\nimport type { DateRangeValue } from '../types';\n\ninterface UseDateRangeTimelineStateInput {\n value: DateRangeValue;\n min: string;\n max: string;\n onCommit: (value: DateRangeValue) => void;\n}\n\nfunction resolveTimelineBounds(min: string, max: string) {\n const fallbackMax = new Date();\n const maxDate = parseDate(max) ?? fallbackMax;\n const requestedMin = parseDate(min) ?? addDays(maxDate, -365);\n const minDate = requestedMin > maxDate ? maxDate : requestedMin;\n return { minDate, maxDate };\n}\n\nexport function useDateRangeTimelineState({ value, min, max, onCommit }: UseDateRangeTimelineStateInput) {\n const { minDate, maxDate } = resolveTimelineBounds(min, max);\n const committedTimeline = createTimelineState(value, minDate, maxDate);\n const maximumIndex = Math.max(0, differenceInCalendarDays(maxDate, minDate));\n const [viewport, setViewport] = useState(() => committedTimeline.viewport);\n const [draftSelection, setDraftSelection] = useState<TimelineIndexRange>();\n const selection = draftSelection ?? committedTimeline.selection;\n const state = {\n ...committedTimeline,\n viewport: revealTimelineSelection(viewport, selection, maximumIndex),\n selection,\n };\n\n function previewSelection(nextSelection: TimelineIndexRange) {\n setDraftSelection(nextSelection);\n }\n\n function cancelSelection() {\n setDraftSelection(undefined);\n }\n\n function commitSelection(nextSelection: TimelineIndexRange) {\n setDraftSelection(undefined);\n setViewport(current => revealTimelineSelection(current, nextSelection, maximumIndex));\n onCommit(toDateRange({ ...state, selection: nextSelection }));\n }\n\n function zoom(factor: number, anchor: number) {\n setViewport(current => {\n const visibleViewport = revealTimelineSelection(current, state.selection, maximumIndex);\n return zoomTimelineViewport({ ...state, viewport: visibleViewport }, maximumIndex, factor, anchor).viewport;\n });\n }\n\n function selectDate(boundary: DateBoundary, nextValue: string) {\n const date = parseDate(nextValue);\n if (!date) return;\n\n const dateIndex = clamp(differenceInCalendarDays(date, state.origin), 0, maximumIndex);\n const nextSelection =\n boundary === 'from'\n ? {\n from: clamp(dateIndex, 0, state.selection.to),\n to: state.selection.to,\n }\n : {\n from: state.selection.from,\n to: clamp(dateIndex, state.selection.from, maximumIndex),\n };\n commitSelection(nextSelection);\n }\n\n return {\n state,\n maximumIndex,\n previewSelection,\n cancelSelection,\n commitSelection,\n zoom,\n selectDate,\n };\n}\n","import { useRef } from 'react';\nimport { DateRangeBoundaryPickers } from './DateRangeBoundaryPickers';\nimport { DateRangeTicks } from './DateRangeTicks';\nimport { DateRangeTrack } from './DateRangeTrack';\nimport { useDateRangeTimelineState } from './hooks/useDateRangeTimelineState';\nimport { createDateRangeAxisModel, createDateRangeBoundaryModel } from './lib/date-range-timeline-view-model';\nimport type { DateRangeValue } from './types';\n\ninterface DateRangeTimelineProps {\n value: DateRangeValue;\n min: string;\n max: string;\n onCommit: (value: DateRangeValue) => void;\n}\n\nexport function DateRangeTimeline({ value, min, max, onCommit }: DateRangeTimelineProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const timeline = useDateRangeTimelineState({\n value,\n min,\n max,\n onCommit,\n });\n const boundaryModel = createDateRangeBoundaryModel(timeline.state);\n const axisModel = createDateRangeAxisModel(timeline.state);\n\n return (\n <div ref={rootRef} role=\"group\" aria-label=\"Date range timeline\" className=\"w-full overflow-x-clip select-none\">\n <DateRangeBoundaryPickers\n positions={boundaryModel.positions}\n value={boundaryModel.range}\n min={min}\n max={max}\n onSelect={timeline.selectDate}\n />\n\n <DateRangeTrack\n wheelTargetRef={rootRef}\n timeline={timeline.state}\n maximumIndex={timeline.maximumIndex}\n onSelectionPreview={timeline.previewSelection}\n onSelectionCommit={timeline.commitSelection}\n onSelectionCancel={timeline.cancelSelection}\n onZoom={timeline.zoom}\n />\n\n <DateRangeTicks ticks={axisModel.ticks} min={min} max={max} />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
package/dist/style.css CHANGED
@@ -1723,10 +1723,6 @@
1723
1723
  min-height: var(--spacing-5);
1724
1724
  }
1725
1725
 
1726
- .min-h-6 {
1727
- min-height: var(--spacing-6);
1728
- }
1729
-
1730
1726
  .min-h-8 {
1731
1727
  min-height: var(--spacing-8);
1732
1728
  }
@@ -7995,10 +7991,6 @@
7995
7991
  margin-top: var(--spacing-0);
7996
7992
  }
7997
7993
 
7998
- .sm\:block {
7999
- display: block;
8000
- }
8001
-
8002
7994
  .sm\:flex {
8003
7995
  display: flex;
8004
7996
  }
@@ -8007,10 +7999,6 @@
8007
7999
  display: none;
8008
8000
  }
8009
8001
 
8010
- .sm\:inline {
8011
- display: inline;
8012
- }
8013
-
8014
8002
  .sm\:inline-flex {
8015
8003
  display: inline-flex;
8016
8004
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mastra/playground-ui",
3
3
  "type": "module",
4
- "version": "42.0.0-alpha.15",
4
+ "version": "42.0.0-alpha.16",
5
5
  "description": "Mastra Playground components",
6
6
  "sideEffects": [
7
7
  "**/*.css"
@@ -189,10 +189,10 @@
189
189
  "vite-plugin-dts": "^4.5.4",
190
190
  "vite-plugin-lib-inject-css": "^2.2.2",
191
191
  "vitest": "4.1.10",
192
- "@mastra/memory": "1.23.1-alpha.1",
193
192
  "@internal/lint": "0.0.114",
194
- "@mastra/react": "1.3.0-alpha.13",
195
193
  "@mastra/core": "1.52.0-alpha.12",
194
+ "@mastra/memory": "1.23.1-alpha.1",
195
+ "@mastra/react": "1.3.0-alpha.13",
196
196
  "@mastra/client-js": "^1.33.0-alpha.13"
197
197
  },
198
198
  "homepage": "https://mastra.ai",