@mastra/playground-ui 44.0.0-alpha.0 → 44.0.0-alpha.1

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,14 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 44.0.0-alpha.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`ce93a3c`](https://github.com/mastra-ai/mastra/commit/ce93a3c114ea1cbfbd576f3db41d7c26c9844f5b), [`5718a22`](https://github.com/mastra-ai/mastra/commit/5718a229281dcfd36bcd1f42a242e3717e510a33), [`5807d3a`](https://github.com/mastra-ai/mastra/commit/5807d3ae1d259b8b7d6df7e5bf2b485c694af9c8), [`57661af`](https://github.com/mastra-ai/mastra/commit/57661afeca52ff9af4e72675ede2134fa503d5a5), [`57661af`](https://github.com/mastra-ai/mastra/commit/57661afeca52ff9af4e72675ede2134fa503d5a5), [`57661af`](https://github.com/mastra-ai/mastra/commit/57661afeca52ff9af4e72675ede2134fa503d5a5), [`5718a22`](https://github.com/mastra-ai/mastra/commit/5718a229281dcfd36bcd1f42a242e3717e510a33), [`57661af`](https://github.com/mastra-ai/mastra/commit/57661afeca52ff9af4e72675ede2134fa503d5a5), [`d1b7e3a`](https://github.com/mastra-ai/mastra/commit/d1b7e3a978a309a5653eeaa490d2d6c7c53bd093), [`c093146`](https://github.com/mastra-ai/mastra/commit/c0931466404d3c521308ea119cb165bb7e695155)]:
8
+ - @mastra/core@1.54.0-alpha.1
9
+ - @mastra/client-js@1.35.0-alpha.1
10
+ - @mastra/react@1.3.3-alpha.1
11
+
3
12
  ## 44.0.0-alpha.0
4
13
 
5
14
  ### Patch Changes
@@ -404,7 +404,7 @@ function DateRangeSelection({
404
404
  "aria-valuenow": value,
405
405
  "aria-valuetext": valueText,
406
406
  className: utils_cn.cn(
407
- "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",
407
+ "absolute inset-y-1 z-10 flex cursor-grab touch-none items-center justify-center overflow-hidden rounded-md bg-neutral6/10 text-neutral6 outline-hidden select-none focus-visible:ring-2 focus-visible:ring-accent3 active:cursor-grabbing",
408
408
  active ? "transition-none" : "transition-[left,width,background-color] duration-150 ease-out motion-reduce:transition-none"
409
409
  ),
410
410
  style: { left: `${visibleLeft}%`, width: `${visibleWidth}%` },
@@ -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=\"text-neutral5 truncate tabular-nums\">\n {formattedDate}\n </Txt>\n <CalendarDaysIcon className=\"text-neutral3 size-3.5 shrink-0\" 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=\"bg-border2 absolute top-11 h-4 w-px -translate-x-1/2 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=\"bg-border2 absolute top-11 h-4 w-px -translate-x-1/2 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=\"bg-border2 mb-1 h-1.5 w-px\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral3 whitespace-nowrap\">\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=\"bg-border2 mb-1 h-1.5 w-px\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-xs\" className=\"text-neutral3 whitespace-nowrap\">\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=\"bg-border2 mb-1 h-1.5 w-px\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral3 whitespace-nowrap\">\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 // Skip markers sitting exactly on the edges — the track boundary already reads as a line there.\n const interiorMarkers = markers.filter(marker => marker.position > 0 && marker.position < 100);\n\n return (\n <div className=\"pointer-events-none absolute inset-0\" aria-hidden=\"true\">\n {interiorMarkers.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' }\n | { type: 'moving' }\n | { 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\n ref={rootRef}\n role=\"group\"\n aria-label=\"Date range timeline\"\n // Clip keeps stray axis labels from causing horizontal scroll; the margin lets the edge\n // handles (and their focus ring) render fully instead of being sliced in half at min/max.\n className=\"w-full overflow-x-clip select-none [overflow-clip-margin:0.75rem]\"\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"],"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=\"text-neutral5 truncate tabular-nums\">\n {formattedDate}\n </Txt>\n <CalendarDaysIcon className=\"text-neutral3 size-3.5 shrink-0\" 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=\"bg-border2 absolute top-11 h-4 w-px -translate-x-1/2 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=\"bg-border2 absolute top-11 h-4 w-px -translate-x-1/2 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=\"bg-border2 mb-1 h-1.5 w-px\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral3 whitespace-nowrap\">\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=\"bg-border2 mb-1 h-1.5 w-px\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-xs\" className=\"text-neutral3 whitespace-nowrap\">\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=\"bg-border2 mb-1 h-1.5 w-px\" aria-hidden=\"true\" />\n {/* TODO(ds): Txt needs a muted timeline-axis variant. */}\n <Txt as=\"span\" variant=\"ui-sm\" className=\"text-neutral3 whitespace-nowrap\">\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 outline-hidden select-none 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 // Skip markers sitting exactly on the edges — the track boundary already reads as a line there.\n const interiorMarkers = markers.filter(marker => marker.position > 0 && marker.position < 100);\n\n return (\n <div className=\"pointer-events-none absolute inset-0\" aria-hidden=\"true\">\n {interiorMarkers.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' }\n | { type: 'moving' }\n | { 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\n ref={rootRef}\n role=\"group\"\n aria-label=\"Date range timeline\"\n // Clip keeps stray axis labels from causing horizontal scroll; the margin lets the edge\n // handles (and their focus ring) render fully instead of being sliced in half at min/max.\n className=\"w-full overflow-x-clip select-none [overflow-clip-margin:0.75rem]\"\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"],"mappings":"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"}
@@ -400,7 +400,7 @@ function DateRangeSelection({
400
400
  "aria-valuenow": value,
401
401
  "aria-valuetext": valueText,
402
402
  className: cn(
403
- "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",
403
+ "absolute inset-y-1 z-10 flex cursor-grab touch-none items-center justify-center overflow-hidden rounded-md bg-neutral6/10 text-neutral6 outline-hidden select-none focus-visible:ring-2 focus-visible:ring-accent3 active:cursor-grabbing",
404
404
  active ? "transition-none" : "transition-[left,width,background-color] duration-150 ease-out motion-reduce:transition-none"
405
405
  ),
406
406
  style: { left: `${visibleLeft}%`, width: `${visibleWidth}%` },