@seekalfred/primitives 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/README.md +664 -9
  2. package/dist/accordion/accordion.js +10 -4
  3. package/dist/accordion/accordion.js.map +1 -1
  4. package/dist/action-button/action-button.d.ts +50 -0
  5. package/dist/action-button/action-button.js +159 -0
  6. package/dist/action-button/action-button.js.map +1 -0
  7. package/dist/action-button/index.d.ts +2 -0
  8. package/dist/action-button/index.js +2 -0
  9. package/dist/alert/alert.d.ts +15 -1
  10. package/dist/alert/alert.js +116 -20
  11. package/dist/alert/alert.js.map +1 -1
  12. package/dist/avatar/avatar.d.ts +6 -0
  13. package/dist/avatar/avatar.js +47 -16
  14. package/dist/avatar/avatar.js.map +1 -1
  15. package/dist/badge/badge.d.ts +11 -4
  16. package/dist/badge/badge.js +35 -5
  17. package/dist/badge/badge.js.map +1 -1
  18. package/dist/breadcrumb/breadcrumb.d.ts +0 -27
  19. package/dist/breadcrumb/breadcrumb.js +20 -6
  20. package/dist/breadcrumb/breadcrumb.js.map +1 -1
  21. package/dist/button/button.d.ts +35 -22
  22. package/dist/button/button.js +177 -34
  23. package/dist/button/button.js.map +1 -1
  24. package/dist/button-group/button-group.d.ts +76 -0
  25. package/dist/button-group/button-group.js +403 -0
  26. package/dist/button-group/button-group.js.map +1 -0
  27. package/dist/button-group/index.d.ts +2 -0
  28. package/dist/button-group/index.js +2 -0
  29. package/dist/calendar/calendar.d.ts +1 -1
  30. package/dist/calendar/calendar.js +257 -30
  31. package/dist/calendar/calendar.js.map +1 -1
  32. package/dist/card/card.d.ts +9 -2
  33. package/dist/card/card.js +15 -4
  34. package/dist/card/card.js.map +1 -1
  35. package/dist/checkbox/checkbox.d.ts +0 -7
  36. package/dist/checkbox/checkbox.js +24 -27
  37. package/dist/checkbox/checkbox.js.map +1 -1
  38. package/dist/confirm-morph/confirm-morph.d.ts +85 -0
  39. package/dist/confirm-morph/confirm-morph.js +652 -0
  40. package/dist/confirm-morph/confirm-morph.js.map +1 -0
  41. package/dist/confirm-morph/index.d.ts +2 -0
  42. package/dist/confirm-morph/index.js +2 -0
  43. package/dist/copy-button/copy-button.d.ts +32 -0
  44. package/dist/copy-button/copy-button.js +134 -0
  45. package/dist/copy-button/copy-button.js.map +1 -0
  46. package/dist/copy-button/index.d.ts +2 -0
  47. package/dist/copy-button/index.js +2 -0
  48. package/dist/date-picker/date-picker.d.ts +51 -0
  49. package/dist/date-picker/date-picker.js +241 -0
  50. package/dist/date-picker/date-picker.js.map +1 -0
  51. package/dist/date-picker/date-range-picker.d.ts +78 -0
  52. package/dist/date-picker/date-range-picker.js +1015 -0
  53. package/dist/date-picker/date-range-picker.js.map +1 -0
  54. package/dist/date-picker/index.d.ts +4 -0
  55. package/dist/date-picker/index.js +4 -0
  56. package/dist/date-picker/picker-parts.d.ts +46 -0
  57. package/dist/date-picker/picker-parts.js +135 -0
  58. package/dist/date-picker/picker-parts.js.map +1 -0
  59. package/dist/dialog/dialog.d.ts +10 -14
  60. package/dist/dialog/dialog.js +39 -11
  61. package/dist/dialog/dialog.js.map +1 -1
  62. package/dist/empty-state/empty-state.d.ts +44 -0
  63. package/dist/empty-state/empty-state.js +83 -0
  64. package/dist/empty-state/empty-state.js.map +1 -0
  65. package/dist/empty-state/index.d.ts +2 -0
  66. package/dist/empty-state/index.js +2 -0
  67. package/dist/expanding-button-group/expanding-button-group.d.ts +54 -0
  68. package/dist/expanding-button-group/expanding-button-group.js +350 -0
  69. package/dist/expanding-button-group/expanding-button-group.js.map +1 -0
  70. package/dist/expanding-button-group/index.d.ts +2 -0
  71. package/dist/expanding-button-group/index.js +2 -0
  72. package/dist/file-drop-zone/file-drop-zone.d.ts +71 -0
  73. package/dist/file-drop-zone/file-drop-zone.js +116 -0
  74. package/dist/file-drop-zone/file-drop-zone.js.map +1 -0
  75. package/dist/file-drop-zone/index.d.ts +2 -0
  76. package/dist/file-drop-zone/index.js +2 -0
  77. package/dist/filter-bar/filter-bar.d.ts +121 -0
  78. package/dist/filter-bar/filter-bar.js +300 -0
  79. package/dist/filter-bar/filter-bar.js.map +1 -0
  80. package/dist/filter-bar/index.d.ts +2 -0
  81. package/dist/filter-bar/index.js +2 -0
  82. package/dist/floating-button-group/floating-button-group.d.ts +61 -0
  83. package/dist/floating-button-group/floating-button-group.js +340 -0
  84. package/dist/floating-button-group/floating-button-group.js.map +1 -0
  85. package/dist/floating-button-group/index.d.ts +2 -0
  86. package/dist/floating-button-group/index.js +2 -0
  87. package/dist/icon-morph/icon-morph.d.ts +55 -0
  88. package/dist/icon-morph/icon-morph.js +331 -0
  89. package/dist/icon-morph/icon-morph.js.map +1 -0
  90. package/dist/icon-morph/index.d.ts +2 -0
  91. package/dist/icon-morph/index.js +2 -0
  92. package/dist/index.d.ts +24 -2
  93. package/dist/index.js +29 -7
  94. package/dist/input/input.d.ts +22 -0
  95. package/dist/input/input.js +36 -12
  96. package/dist/input/input.js.map +1 -1
  97. package/dist/lib/count-to.js +113 -0
  98. package/dist/lib/count-to.js.map +1 -0
  99. package/dist/lib/eye-morph.js +62 -0
  100. package/dist/lib/eye-morph.js.map +1 -0
  101. package/dist/lib/field-message.js +336 -0
  102. package/dist/lib/field-message.js.map +1 -0
  103. package/dist/lib/field-shell.js +81 -0
  104. package/dist/lib/field-shell.js.map +1 -0
  105. package/dist/lib/field-surface.js +4 -2
  106. package/dist/lib/field-surface.js.map +1 -1
  107. package/dist/lib/flip.js +80 -0
  108. package/dist/lib/flip.js.map +1 -0
  109. package/dist/lib/height-follow.js +59 -0
  110. package/dist/lib/height-follow.js.map +1 -0
  111. package/dist/lib/icon-swap.js +47 -0
  112. package/dist/lib/icon-swap.js.map +1 -0
  113. package/dist/lib/leaving-list.js +57 -0
  114. package/dist/lib/leaving-list.js.map +1 -0
  115. package/dist/lib/merge-refs.js +3 -3
  116. package/dist/lib/merge-refs.js.map +1 -1
  117. package/dist/lib/morph-text.js +128 -0
  118. package/dist/lib/morph-text.js.map +1 -0
  119. package/dist/lib/motion.js +162 -0
  120. package/dist/lib/motion.js.map +1 -0
  121. package/dist/lib/pausable-timeout.js +67 -0
  122. package/dist/lib/pausable-timeout.js.map +1 -0
  123. package/dist/lib/rolling-value.js +31 -0
  124. package/dist/lib/rolling-value.js.map +1 -0
  125. package/dist/lib/spring-progress.js +114 -0
  126. package/dist/lib/spring-progress.js.map +1 -0
  127. package/dist/lib/svg-id.js +10 -0
  128. package/dist/lib/svg-id.js.map +1 -0
  129. package/dist/lib/swap-text.js +77 -0
  130. package/dist/lib/swap-text.js.map +1 -0
  131. package/dist/lib/use-copy-feedback.js +36 -0
  132. package/dist/lib/use-copy-feedback.js.map +1 -0
  133. package/dist/page-header/index.d.ts +2 -0
  134. package/dist/page-header/index.js +2 -0
  135. package/dist/page-header/page-header.d.ts +75 -0
  136. package/dist/page-header/page-header.js +83 -0
  137. package/dist/page-header/page-header.js.map +1 -0
  138. package/dist/password-field/index.d.ts +2 -0
  139. package/dist/password-field/index.js +2 -0
  140. package/dist/password-field/password-field.d.ts +37 -0
  141. package/dist/password-field/password-field.js +101 -0
  142. package/dist/password-field/password-field.js.map +1 -0
  143. package/dist/password-strength/index.d.ts +2 -0
  144. package/dist/password-strength/index.js +2 -0
  145. package/dist/password-strength/password-strength.d.ts +127 -0
  146. package/dist/password-strength/password-strength.js +455 -0
  147. package/dist/password-strength/password-strength.js.map +1 -0
  148. package/dist/popover/popover.d.ts +8 -0
  149. package/dist/popover/popover.js +3 -3
  150. package/dist/popover/popover.js.map +1 -1
  151. package/dist/progress/progress.js +46 -5
  152. package/dist/progress/progress.js.map +1 -1
  153. package/dist/radio-group/radio-group.js +7 -6
  154. package/dist/radio-group/radio-group.js.map +1 -1
  155. package/dist/scroll-area/scroll-area.d.ts +10 -0
  156. package/dist/scroll-area/scroll-area.js +25 -3
  157. package/dist/scroll-area/scroll-area.js.map +1 -1
  158. package/dist/search-field/index.d.ts +2 -0
  159. package/dist/search-field/index.js +2 -0
  160. package/dist/search-field/search-field.d.ts +26 -0
  161. package/dist/search-field/search-field.js +155 -0
  162. package/dist/search-field/search-field.js.map +1 -0
  163. package/dist/select/select.js +79 -21
  164. package/dist/select/select.js.map +1 -1
  165. package/dist/sheet/sheet.js +2 -1
  166. package/dist/sheet/sheet.js.map +1 -1
  167. package/dist/side-nav/index.d.ts +2 -0
  168. package/dist/side-nav/index.js +2 -0
  169. package/dist/side-nav/side-nav.d.ts +72 -0
  170. package/dist/side-nav/side-nav.js +142 -0
  171. package/dist/side-nav/side-nav.js.map +1 -0
  172. package/dist/skeleton/skeleton.d.ts +8 -2
  173. package/dist/skeleton/skeleton.js +6 -2
  174. package/dist/skeleton/skeleton.js.map +1 -1
  175. package/dist/slider/slider.js +61 -7
  176. package/dist/slider/slider.js.map +1 -1
  177. package/dist/split-button/index.d.ts +2 -0
  178. package/dist/split-button/index.js +2 -0
  179. package/dist/split-button/split-button.d.ts +46 -0
  180. package/dist/split-button/split-button.js +122 -0
  181. package/dist/split-button/split-button.js.map +1 -0
  182. package/dist/stat-card/index.d.ts +2 -0
  183. package/dist/stat-card/index.js +2 -0
  184. package/dist/stat-card/stat-card.d.ts +81 -0
  185. package/dist/stat-card/stat-card.js +152 -0
  186. package/dist/stat-card/stat-card.js.map +1 -0
  187. package/dist/styles.css +1 -1
  188. package/dist/switch/switch.js +9 -8
  189. package/dist/switch/switch.js.map +1 -1
  190. package/dist/table/index.d.ts +2 -2
  191. package/dist/table/index.js +2 -2
  192. package/dist/table/table.d.ts +36 -5
  193. package/dist/table/table.js +112 -11
  194. package/dist/table/table.js.map +1 -1
  195. package/dist/tabs/tabs.js +142 -6
  196. package/dist/tabs/tabs.js.map +1 -1
  197. package/dist/textarea/textarea.d.ts +23 -0
  198. package/dist/textarea/textarea.js +24 -2
  199. package/dist/textarea/textarea.js.map +1 -1
  200. package/dist/theme-switch/index.d.ts +2 -0
  201. package/dist/theme-switch/index.js +2 -0
  202. package/dist/theme-switch/theme-switch.d.ts +37 -0
  203. package/dist/theme-switch/theme-switch.js +123 -0
  204. package/dist/theme-switch/theme-switch.js.map +1 -0
  205. package/dist/time-picker/index.d.ts +2 -0
  206. package/dist/time-picker/index.js +2 -0
  207. package/dist/time-picker/time-picker.d.ts +54 -0
  208. package/dist/time-picker/time-picker.js +201 -0
  209. package/dist/time-picker/time-picker.js.map +1 -0
  210. package/dist/toast/toast.js +58 -38
  211. package/dist/toast/toast.js.map +1 -1
  212. package/dist/tooltip/tooltip.d.ts +1 -1
  213. package/dist/tooltip/tooltip.js +63 -14
  214. package/dist/tooltip/tooltip.js.map +1 -1
  215. package/package.json +83 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range-picker.js","names":["AriaCalendarHeading","AriaCalendarGrid","cn","AriaCalendarGridHeader","AriaCalendarHeaderCell","AriaCalendarGridBody","AriaCalendarCell","todayIn","AriaRangeCalendar","AriaButton","Button"],"sources":["../../src/date-picker/date-range-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport { getLocalTimeZone, today as todayIn, type DateValue } from \"@internationalized/date\";\nimport {\n Fragment,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport {\n Button as AriaButton,\n CalendarCell as AriaCalendarCell,\n CalendarGrid as AriaCalendarGrid,\n CalendarGridBody as AriaCalendarGridBody,\n CalendarGridHeader as AriaCalendarGridHeader,\n CalendarHeaderCell as AriaCalendarHeaderCell,\n CalendarHeading as AriaCalendarHeading,\n RangeCalendar as AriaRangeCalendar,\n RangeCalendarStateContext,\n useLocale,\n} from \"react-aria-components\";\n\nimport { Button } from \"../button/button.js\";\nimport {\n calendarCellVariants,\n calendarGridVariants,\n calendarHeaderCellVariants,\n calendarNavVariants,\n} from \"../calendar/calendar.js\";\nimport { cnAll as cn } from \"../lib/cn.js\";\nimport { prefersReducedMotion, useExitBackstop, useIsomorphicLayoutEffect } from \"../lib/motion.js\";\nimport { SwapText } from \"../lib/swap-text.js\";\nimport {\n CalendarGlyph,\n Chevron,\n TypedDate,\n datePickerLabelVariants,\n datePickerVariants,\n descriptionClass,\n errorClass,\n useDayFormat,\n useValue,\n type PickerSharedProps,\n} from \"./picker-parts.js\";\n\n/**\n * DateRangePicker: a trigger that grows into the panel it opens.\n *\n * The trigger's box springs to the panel's box and back: one surface, whose width,\n * height, corners and offset ride springs while the panel's content arrives just\n * behind it and leaves just ahead of it. The panel holds a rail of presets, the\n * typed start and end, and two months side by side (one month under a scrolling row\n * of presets when there is no room). The highlight stretches across each week as\n * the range is chosen, its ends glide between days, the months slide in the\n * direction you travel, and on Apply the formatted range flies back into the\n * trigger as the surface shrinks around it.\n *\n * Nothing is applied until Apply: the panel edits a draft. Values are `DateValue`\n * objects (ADR 0006); either end may be `null`, as before.\n *\n * The calendar is React Aria's `RangeCalendar`, so keyboard, locale and\n * calendar-system behaviour are its own; the motion is measured from the cells it\n * renders. Every class string is a static literal: Tailwind scans source text.\n */\n\nexport interface DateRangePickerValue {\n start: DateValue | null;\n end: DateValue | null;\n}\n\n/** A shortcut in the preset rail. `range` receives the viewer's local today. */\nexport interface DateRangePreset {\n label: string;\n range: (today: DateValue) => { start: DateValue; end: DateValue };\n}\n\n/** Every string the panel shows, so a product can translate them. */\nexport interface DateRangePickerMessages {\n /** The preset rail's name. */\n presets: string;\n apply: string;\n cancel: string;\n clear: string;\n previousMonth: string;\n nextMonth: string;\n /** The summary while nothing is chosen. */\n noDates: string;\n /** Under the summary while only the start is chosen. */\n pickEnd: string;\n /** The count under the summary, `1 day` or `7 days`. */\n days: (count: number) => string;\n /** What a screen reader is told while only the start is chosen. */\n startChosen: (start: string) => string;\n}\n\nconst defaultMessages: DateRangePickerMessages = {\n presets: \"Presets\",\n apply: \"Apply\",\n cancel: \"Cancel\",\n clear: \"Clear\",\n previousMonth: \"Previous month\",\n nextMonth: \"Next month\",\n noDates: \"No dates\",\n pickEnd: \"Pick an end date\",\n days: (count) => `${count} ${count === 1 ? \"day\" : \"days\"}`,\n startChosen: (start) => `Start ${start}. Choose an end date.`,\n};\n\n/** Shortcuts for the rail: today back to the start of the year. */\nexport const defaultDateRangePresets: DateRangePreset[] = [\n { label: \"Today\", range: (today) => ({ start: today, end: today }) },\n {\n label: \"Yesterday\",\n range: (today) => ({ start: today.subtract({ days: 1 }), end: today.subtract({ days: 1 }) }),\n },\n { label: \"Last 7 days\", range: (today) => ({ start: today.subtract({ days: 6 }), end: today }) },\n { label: \"Last 30 days\", range: (today) => ({ start: today.subtract({ days: 29 }), end: today }) },\n { label: \"This month\", range: (today) => ({ start: today.set({ day: 1 }), end: today }) },\n {\n label: \"Last month\",\n range: (today) => {\n const first = today.subtract({ months: 1 }).set({ day: 1 });\n return { start: first, end: first.set({ day: first.calendar.getDaysInMonth(first) }) };\n },\n },\n {\n label: \"This quarter\",\n range: (today) => ({\n start: today.set({ month: Math.floor((today.month - 1) / 3) * 3 + 1, day: 1 }),\n end: today,\n }),\n },\n { label: \"Year to date\", range: (today) => ({ start: today.set({ month: 1, day: 1 }), end: today }) },\n];\n\n/** Props for {@link DateRangePicker}. */\nexport interface DateRangePickerProps extends PickerSharedProps {\n /** The applied range (controlled). Either end may be `null`. */\n value?: DateRangePickerValue;\n /** The range applied at first (uncontrolled). */\n defaultValue?: DateRangePickerValue;\n /** Told the range when Apply is pressed; both ends `null` when cleared. */\n onChange?: (value: DateRangePickerValue) => void;\n /** Label of the typed start, and the trigger's word for a range with no end. @default \"From\" */\n startLabel?: string;\n /** Label of the typed end, and the trigger's word for a range with no start. @default \"To\" */\n endLabel?: string;\n /** The shortcuts in the rail. @default {@link defaultDateRangePresets} */\n presets?: DateRangePreset[];\n /** Two months side by side, one, or whichever fits. @default \"auto\" */\n months?: \"auto\" | 1 | 2;\n /** The element the panel must stay inside (a function, so it is read when it opens). Defaults to the viewport. */\n boundary?: () => HTMLElement | null;\n /** Renames any of the panel's strings. */\n messages?: Partial<DateRangePickerMessages>;\n}\n\ntype Bounds = { left: number; right: number };\nconst NO_RANGE: DateRangePickerValue = { start: null, end: null };\nconst WIDE_MIN = 712;\nconst WIDE_CELL = 36;\nconst EDGE = 8;\nconst RADIUS_CLOSED = \"var(--radius-md)\";\nconst RADIUS_OPEN = \"var(--radius-xl)\";\n\nconst triggerSize = {\n sm: \"h-(--density-control-h-sm) px-(--density-control-pad-sm)\",\n md: \"h-(--density-control-h-md) px-(--density-control-pad-md)\",\n lg: \"h-(--density-control-h-lg) px-(--density-control-pad-lg)\",\n} as const;\nconst rootSize = {\n sm: \"h-(--density-control-h-sm)\",\n md: \"h-(--density-control-h-md)\",\n lg: \"h-(--density-control-h-lg)\",\n} as const;\n\n/** A stamp that grows with time, so a range can be compared and given a direction. */\nconst stamp = (value: DateValue | null) => (value ? value.toDate(\"UTC\").getTime() : 0);\nconst rangeStamp = (range: DateRangePickerValue | null) =>\n range && range.start && range.end ? stamp(range.start) * 2 + stamp(range.end) : null;\nconst sameRange = (a: DateRangePickerValue | null, b: DateRangePickerValue | null) =>\n Boolean(\n a?.start && a.end && b?.start && b.end && a.start.compare(b.start) === 0 && a.end.compare(b.end) === 0,\n );\n\n/** Which way a range moved in time, so its words roll in that direction. */\nfunction useDirection(range: DateRangePickerValue | null) {\n const stampNow = rangeStamp(range);\n const [previous, setPrevious] = useState(stampNow);\n const [direction, setDirection] = useState(1);\n if (stampNow !== previous) {\n setPrevious(stampNow);\n setDirection(stampNow === null || previous === null || stampNow >= previous ? 1 : -1);\n }\n return direction;\n}\n\n/**\n * Words roll one by one: a later date rises from below, an earlier one drops from\n * above, and a word that stays the same holds still. The copy is `aria-hidden`; the\n * caller keeps the plain text for screen readers.\n */\nfunction RollingWords({ text, direction }: { text: string; direction: number }) {\n const words = text.split(/\\s+/).filter(Boolean);\n return (\n <span aria-hidden=\"true\" className=\"inline-flex gap-1 whitespace-nowrap\">\n {words.map((word, index) => (\n <Fragment key={index}>\n {/* Dropped from the layout (the gap spaces the words) but kept in the text. */}\n {index > 0 ? \" \" : null}\n <SwapText swapKey={word} dir={direction} motion=\"word\" className=\"inline-block\">\n {word}\n </SwapText>\n </Fragment>\n ))}\n </span>\n );\n}\n\n/** Moves an element from where it was to where it is now, on a spring: a value that flies between the trigger and the footer. */\nfunction flyFrom(el: HTMLElement, from: DOMRect, spring: \"grow\" | \"shrink\") {\n const to = el.getBoundingClientRect();\n const dx = from.left - to.left;\n const dy = from.top - to.top;\n if (Math.abs(dx) < 1 && Math.abs(dy) < 1) return;\n el.style.transition = \"none\";\n el.style.translate = `${dx}px ${dy}px`;\n void el.offsetWidth;\n el.style.transition = `translate var(--duration-${spring}) var(--ease-${spring})`;\n el.style.translate = \"\";\n el.addEventListener(\n \"transitionend\",\n () => {\n el.style.transition = \"\";\n },\n { once: true },\n );\n}\n\n/** What the calendar knows that the footer needs: the start while only it is chosen, and the range being previewed. */\ninterface CalendarSnapshot {\n anchor: DateValue | null;\n highlighted: DateRangePickerValue | null;\n}\n\n/** Hands the calendar's anchor and highlighted range to the picker, which owns the footer. */\nfunction CalendarBridge({ onSnapshot }: { onSnapshot: (snapshot: CalendarSnapshot) => void }) {\n const state = useContext(RangeCalendarStateContext);\n const anchor = state?.anchorDate ?? null;\n const highlighted = state?.highlightedRange ?? null;\n const key = `${anchor?.toString() ?? \"\"}|${highlighted?.start.toString() ?? \"\"}|${highlighted?.end.toString() ?? \"\"}`;\n const latest = useRef(key);\n useIsomorphicLayoutEffect(() => {\n if (latest.current === key && latest.current !== \"||\") return;\n latest.current = key;\n onSnapshot({\n anchor,\n highlighted: highlighted ? { start: highlighted.start, end: highlighted.end } : null,\n });\n // `key` stands for the three values it is made from.\n }, [key]);\n return null;\n}\n\n/**\n * Places the range's highlight under the days: one bar per week, which stretches\n * and slides on its spring from the edge the range arrives from, and a solid end at\n * each side, which glides from day to day and only fades when its end leaves the\n * month. Everything is measured from the cells React Aria rendered, so it follows\n * the real layout. Nothing animates until a bar or an end has been shown once.\n */\nfunction RangeDriver() {\n const marker = useRef<HTMLSpanElement>(null);\n // Subscribing re-renders the driver when the range, the preview or the month changes.\n useContext(RangeCalendarStateContext);\n useIsomorphicLayoutEffect(() => {\n const root = marker.current?.parentElement;\n if (!root) return;\n for (const block of root.querySelectorAll<HTMLElement>('[data-slot=\"range-month\"]')) {\n const layer = block.querySelector<HTMLElement>('[data-slot=\"range-layer\"]');\n const rows = block.querySelector(\"tbody\")?.rows;\n if (!layer || !rows) continue;\n const layerBox = layer.getBoundingClientRect();\n const bars = [...layer.querySelectorAll<HTMLElement>('[data-slot=\"range-bar\"]')];\n const thumbs = [...layer.querySelectorAll<HTMLElement>('[data-slot=\"range-thumb\"]')];\n const inMonth = (row: HTMLTableRowElement) =>\n [...row.querySelectorAll<HTMLElement>('[data-slot=\"calendar-cell\"]')].filter(\n (cell) => !cell.hasAttribute(\"data-outside-month\"),\n );\n const selected = [...rows].map((row) => inMonth(row).filter((cell) => cell.hasAttribute(\"data-selected\")));\n const firstRow = selected.findIndex((cells) => cells.length > 0);\n // A month that has just mounted shows its highlight in place, as it is: only a change after that animates.\n const fresh = block.dataset.driven === undefined;\n block.dataset.driven = \"\";\n const place = (el: HTMLElement, x: number, y: number, width?: number, height?: number) => {\n const hidden = el.dataset.visible === undefined;\n if (width !== undefined) el.style.width = `${width}px`;\n if (height !== undefined) el.style.height = `${height}px`;\n if (hidden) {\n el.style.transition = \"none\";\n el.style.translate = `${x}px ${y}px`;\n if (fresh) el.dataset.visible = \"\";\n void el.offsetWidth;\n el.style.transition = \"\";\n el.dataset.visible = \"\";\n } else {\n el.style.translate = `${x}px ${y}px`;\n }\n };\n const hide = (el: HTMLElement) => {\n delete el.dataset.visible;\n };\n bars.forEach((bar, index) => {\n const row = rows[index];\n const cells = row ? inMonth(row) : [];\n if (firstRow < 0 || !row || cells.length === 0) return hide(bar);\n const rowBox = cells[0]!.getBoundingClientRect();\n const top = rowBox.top - layerBox.top + 3;\n const height = rowBox.height - 6;\n const span = selected[index]!;\n if (span.length > 0) {\n const a = span[0]!.getBoundingClientRect();\n const b = span[span.length - 1]!.getBoundingClientRect();\n bar.style.top = `${top}px`;\n bar.style.height = `${height}px`;\n place(bar, a.left - layerBox.left, 0, b.right - a.left);\n } else {\n // A week wholly before the range folds into its last day, one wholly after into its first: the edge the range grows from.\n const edge =\n index < firstRow\n ? cells[cells.length - 1]!.getBoundingClientRect().right\n : cells[0]!.getBoundingClientRect().left;\n bar.style.top = `${top}px`;\n bar.style.height = `${height}px`;\n place(bar, edge - layerBox.left, 0, 0);\n }\n });\n const start = block.querySelector<HTMLElement>(\n '[data-slot=\"calendar-cell\"][data-selection-start]:not([data-outside-month])',\n );\n const end = block.querySelector<HTMLElement>(\n '[data-slot=\"calendar-cell\"][data-selection-end]:not([data-outside-month])',\n );\n const ends = [start, end && end !== start ? end : null];\n thumbs.forEach((thumb, index) => {\n const cell = ends[index];\n if (!cell) return hide(thumb);\n const box = cell.getBoundingClientRect();\n // A pressed cell is scaled about its centre; offsetWidth is the unscaled box.\n const x = box.left - layerBox.left - (box.width - cell.offsetWidth) / 2;\n const y = box.top - layerBox.top - (box.height - cell.offsetHeight) / 2;\n // The end is its day inset by 3px, so it sits inside the band's height.\n place(thumb, x + 3, y + 3, cell.offsetWidth - 6, cell.offsetHeight - 6);\n });\n }\n });\n return <span ref={marker} hidden data-slot=\"range-driver\" />;\n}\n\n/** One month: its title, a grid, and the layer of bars and ends under the days. */\nfunction RangeMonth({ offset }: { offset: number }) {\n return (\n <div data-slot=\"range-month\" className=\"w-[calc(var(--cell)*7)]\">\n <AriaCalendarHeading\n offset={{ months: offset }}\n className=\"m-0 h-8 text-center text-sm font-medium leading-8 whitespace-nowrap text-foreground\"\n />\n <div className=\"relative\">\n <span\n aria-hidden=\"true\"\n data-slot=\"range-layer\"\n className=\"pointer-events-none absolute inset-0\"\n >\n {[0, 1, 2, 3, 4, 5].map((row) => (\n <span key={row} data-slot=\"range-bar\" className=\"range-bar\" />\n ))}\n <span data-slot=\"range-thumb\" className=\"range-thumb\" />\n <span data-slot=\"range-thumb\" className=\"range-thumb\" />\n </span>\n <AriaCalendarGrid offset={{ months: offset }} className={cn(calendarGridVariants(), \"relative\")}>\n <AriaCalendarGridHeader>\n {(weekday) => (\n <AriaCalendarHeaderCell className={calendarHeaderCellVariants()}>\n {weekday}\n </AriaCalendarHeaderCell>\n )}\n </AriaCalendarGridHeader>\n <AriaCalendarGridBody>\n {(date) => (\n <AriaCalendarCell\n date={date}\n data-slot=\"calendar-cell\"\n className={calendarCellVariants({ selection: \"band\" })}\n />\n )}\n </AriaCalendarGridBody>\n </AriaCalendarGrid>\n </div>\n </div>\n );\n}\n\n/** A set of months that has been replaced, kept where it stood while it slides away. */\ninterface LeavingSet {\n id: number;\n /** Months from the set now in view to this one. */\n offset: number;\n dir: number;\n}\n\n/**\n * The visible months travel together. The set in view arrives from the side the\n * calendar travels to while the old set, kept where it stood, slides away the other\n * way; the leaving set is inert so focus and queries only find the current one.\n */\nfunction MonthSets({ count, onNavigate }: { count: number; onNavigate?: () => void }) {\n const state = useContext(RangeCalendarStateContext);\n const start = state?.visibleRange.start;\n const key = start ? `${start.era}-${start.year}-${start.month}-${count}` : \"\";\n const [shown, setShown] = useState(start);\n const [shownKey, setShownKey] = useState(key);\n const [dir, setDir] = useState(0);\n const [leaving, setLeaving] = useState<LeavingSet[]>([]);\n const nextId = useRef(0);\n if (start && shown && key !== shownKey) {\n const months = (shown.year - start.year) * 12 + (shown.month - start.month);\n setLeaving((list) => [...list, { id: nextId.current++, offset: months, dir: months < 0 ? 1 : -1 }]);\n setDir(months < 0 ? 1 : -1);\n setShown(start);\n setShownKey(key);\n }\n const remove = useCallback((id: number) => setLeaving((list) => list.filter((set) => set.id !== id)), []);\n useEffect(() => {\n onNavigate?.();\n }, [key, onNavigate]);\n return (\n <div className=\"relative overflow-clip [overflow-clip-margin:2px]\">\n {leaving.map((set) => (\n <LeavingMonths key={set.id} set={set} count={count} onDone={remove} />\n ))}\n <div\n key={key}\n data-slot=\"range-months\"\n data-current=\"\"\n style={{ \"--dir\": dir } as CSSProperties}\n className={cn(\n \"flex gap-6\",\n dir !== 0 &&\n \"motion-safe:animate-range-slide-in motion-reduce:animate-range-face-fade-in\",\n )}\n >\n {Array.from({ length: count }, (_, index) => (\n <RangeMonth key={index} offset={index} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction LeavingMonths({\n set,\n count,\n onDone,\n}: {\n set: LeavingSet;\n count: number;\n onDone: (id: number) => void;\n}) {\n const remove = useCallback(() => onDone(set.id), [onDone, set.id]);\n useExitBackstop(true, remove, 900);\n useIsomorphicLayoutEffect(() => {\n if (prefersReducedMotion()) {\n // Reduced motion fades it over 80ms; an animation that is off never ends, so end it by hand.\n const timer = window.setTimeout(remove, 80);\n return () => window.clearTimeout(timer);\n }\n }, [remove]);\n return (\n <div\n ref={(node) => node?.setAttribute(\"inert\", \"\")}\n aria-hidden=\"true\"\n data-slot=\"range-months-leaving\"\n style={{ \"--dir\": set.dir } as CSSProperties}\n onAnimationEnd={(event) => {\n if (event.target === event.currentTarget && event.animationName === \"range-slide-x-out\")\n remove();\n }}\n className=\"pointer-events-none absolute inset-0 flex gap-6 motion-safe:animate-range-slide-out motion-reduce:animate-range-word-fade-out\"\n >\n {Array.from({ length: count }, (_, index) => (\n <RangeMonth key={index} offset={index + set.offset} />\n ))}\n </div>\n );\n}\n\n/** The rail of shortcuts, with one highlight that glides to the active one. */\nfunction PresetRail({\n presets,\n active,\n compact,\n label,\n onChoose,\n}: {\n presets: DateRangePreset[];\n active: number;\n compact: boolean;\n label: string;\n onChoose: (preset: DateRangePreset) => void;\n}) {\n const rail = useRef<HTMLDivElement>(null);\n const highlight = useRef<HTMLSpanElement>(null);\n useIsomorphicLayoutEffect(() => {\n const el = rail.current;\n const mark = highlight.current;\n const node = active < 0 ? null : el?.querySelector<HTMLElement>(`[data-preset=\"${active}\"]`);\n if (!el || !mark) return;\n if (!node) {\n delete mark.dataset.visible;\n return;\n }\n mark.style.width = `${node.offsetWidth}px`;\n mark.style.height = `${node.offsetHeight}px`;\n if (mark.dataset.visible === undefined) {\n mark.style.transition = \"none\";\n mark.style.translate = `${node.offsetLeft}px ${node.offsetTop}px`;\n void mark.offsetWidth;\n mark.style.transition = \"\";\n mark.dataset.visible = \"\";\n } else {\n mark.style.translate = `${node.offsetLeft}px ${node.offsetTop}px`;\n }\n if (\n compact &&\n (node.offsetLeft < el.scrollLeft || node.offsetLeft + node.offsetWidth > el.scrollLeft + el.clientWidth)\n ) {\n el.scrollTo({ left: node.offsetLeft - 12, behavior: prefersReducedMotion() ? \"auto\" : \"smooth\" });\n }\n }, [active, compact, presets]);\n const onKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const keys = compact ? [\"ArrowLeft\", \"ArrowRight\"] : [\"ArrowUp\", \"ArrowDown\"];\n if (!keys.includes(event.key)) return;\n const buttons = [...event.currentTarget.querySelectorAll<HTMLButtonElement>(\"[data-preset]\")];\n const at = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if (at < 0) return;\n event.preventDefault();\n buttons[(at + (event.key === keys[1] ? 1 : -1) + buttons.length) % buttons.length]?.focus();\n };\n return (\n <div\n ref={rail}\n role=\"group\"\n aria-label={label}\n data-slot=\"range-rail\"\n onKeyDown={onKeyDown}\n className={cn(\n \"relative flex flex-none gap-0.5 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n compact\n ? \"-mx-2 flex-row overflow-x-auto overscroll-x-contain border-b-(length:--border-width) border-border px-2 pb-2\"\n : \"w-37 flex-col border-e-(length:--border-width) border-border pe-2.5\",\n )}\n >\n <span ref={highlight} aria-hidden=\"true\" data-slot=\"range-highlight\" className=\"range-highlight\" />\n {presets.map((preset, index) => (\n <button\n key={preset.label}\n type=\"button\"\n data-preset={index}\n aria-pressed={index === active}\n onClick={() => onChoose(preset)}\n className={cn(\n \"relative flex h-8 flex-none cursor-pointer items-center rounded-md border-0 bg-transparent px-3 text-start text-sm whitespace-nowrap outline-none\",\n \"motion-safe:transition-colors motion-safe:duration-(--duration-quick) motion-safe:ease-settle\",\n \"text-muted-foreground hover:text-foreground aria-pressed:font-medium aria-pressed:text-foreground\",\n \"focus-visible:outline-solid focus-visible:outline-(length:--focus-ring-width) focus-visible:outline-offset-(--focus-ring-offset) focus-visible:outline-(--color-ring)\",\n )}\n >\n {preset.label}\n </button>\n ))}\n </div>\n );\n}\n\nexport const DateRangePicker = forwardRef<HTMLButtonElement, DateRangePickerProps>(\n function DateRangePicker(\n {\n value,\n defaultValue = NO_RANGE,\n onChange,\n startLabel = \"From\",\n endLabel = \"To\",\n presets = defaultDateRangePresets,\n months = \"auto\",\n boundary,\n messages: messageOverrides,\n ...props\n },\n ref,\n ) {\n const messages = useMemo(() => ({ ...defaultMessages, ...messageOverrides }), [messageOverrides]);\n const { locale } = useLocale();\n const uid = useId();\n const labelId = `${uid}-label`;\n const valueId = `${uid}-value`;\n const panelId = `${uid}-panel`;\n const descriptionId = `${uid}-description`;\n const errorId = `${uid}-error`;\n const [committed, setCommitted] = useValue(value, defaultValue, onChange);\n\n const [open, setOpen] = useState(false);\n const [mounted, setMounted] = useState(false);\n const [compact, setCompact] = useState(false);\n const [panelWidth, setPanelWidth] = useState(0);\n const [draft, setDraft] = useState<DateRangePickerValue>(committed);\n const [focus, setFocus] = useState<DateValue | null>(null);\n const [snapshot, setSnapshot] = useState<CalendarSnapshot>({ anchor: null, highlighted: null });\n if (open && !mounted) setMounted(true);\n const closing = mounted && !open;\n const unmount = useCallback(() => setMounted(false), []);\n // The panel stays for 140ms after it starts to close, while the surface shrinks around it.\n useExitBackstop(closing, unmount, 140);\n useIsomorphicLayoutEffect(() => {\n if (closing && prefersReducedMotion()) unmount();\n }, [closing, unmount]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const restingRef = useRef<HTMLSpanElement>(null);\n const summaryRef = useRef<HTMLSpanElement>(null);\n const summaryRect = useRef<DOMRect | null>(null);\n const pendingFocus = useRef<\"trigger\" | null>(null);\n const mergedRef = useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n const [todayValue, setTodayValue] = useState(() => todayIn(getLocalTimeZone()));\n const dayFormat = useDayFormat();\n const format = props.formatValue ?? dayFormat;\n const rangeFormat = useMemo(\n () => new Intl.DateTimeFormat(locale, { month: \"short\", day: \"numeric\", year: \"numeric\", timeZone: \"UTC\" }),\n [locale],\n );\n const describe = useCallback(\n (range: DateRangePickerValue | null): string => {\n const start = range?.start ?? null;\n const end = range?.end ?? null;\n if (start && end) {\n if (start.compare(end) === 0) return props.formatValue ? format(start) : rangeFormat.format(start.toDate(\"UTC\"));\n return props.formatValue\n ? `${format(start)} – ${format(end)}`\n : rangeFormat.formatRange(start.toDate(\"UTC\"), end.toDate(\"UTC\"));\n }\n if (start) return `${startLabel} ${format(start)}`;\n if (end) return `${endLabel} ${format(end)}`;\n return \"\";\n },\n [endLabel, format, props.formatValue, rangeFormat, startLabel],\n );\n\n const placeholder = props.placeholder ?? \"Select dates\";\n const committedText = describe(committed) || placeholder;\n const complete = draft.start && draft.end ? { start: draft.start, end: draft.end } : null;\n const shown: DateRangePickerValue | null = snapshot.highlighted ?? (draft.start || draft.end ? draft : null);\n const shownComplete = shown?.start && shown.end ? shown : null;\n const days = shownComplete\n ? Math.round((stamp(shownComplete.end) - stamp(shownComplete.start)) / 864e5) + 1\n : 0;\n const shownText = shown ? describe(shown) : messages.noDates;\n const countText = shownComplete\n ? snapshot.anchor &&\n snapshot.highlighted?.start &&\n snapshot.highlighted.end &&\n snapshot.highlighted.start.compare(snapshot.highlighted.end) === 0\n ? messages.pickEnd\n : messages.days(days)\n : \"\";\n const status = !open\n ? \"\"\n : snapshot.anchor\n ? messages.startChosen(rangeFormat.format(snapshot.anchor.toDate(\"UTC\")))\n : shownComplete\n ? `${shownText}, ${countText}`\n : \"\";\n const committedDirection = useDirection(committed);\n const shownDirection = useDirection(shownComplete);\n const activePreset =\n open && !snapshot.anchor ? presets.findIndex((preset) => sameRange(preset.range(todayValue), draft)) : -1;\n\n /* ---------- One surface: the trigger's box springs to the panel's box and back ---------- */\n const sizes = useRef<{ trigger: { w: number; h: number }; panel: { w: number; h: number } | null }>({\n trigger: { w: 0, h: 0 },\n panel: null,\n });\n const live = useRef({ open: false });\n const boundaryRef = useRef(boundary);\n useLayoutEffect(() => {\n boundaryRef.current = boundary;\n }, [boundary]);\n const bounds = useCallback((): Bounds => {\n const viewport = { left: 0, right: document.documentElement.clientWidth };\n const element = boundaryRef.current?.();\n if (!element) return viewport;\n const rect = element.getBoundingClientRect();\n return { left: Math.max(viewport.left, rect.left), right: Math.min(viewport.right, rect.right) };\n }, []);\n const update = useCallback(() => {\n const surface = surfaceRef.current;\n const { trigger, panel } = sizes.current;\n if (!surface || !trigger.w) return;\n const target = live.current.open && panel ? panel : trigger;\n let offset = 0;\n if (live.current.open && panel && rootRef.current) {\n const rect = rootRef.current.getBoundingClientRect();\n const box = bounds();\n offset = Math.min(0, box.right - EDGE - (rect.left + panel.w));\n offset = Math.max(offset, box.left + EDGE - rect.left);\n }\n const first = surface.dataset.ready === undefined;\n surface.style.width = `${target.w}px`;\n surface.style.height = `${target.h}px`;\n surface.style.borderRadius = live.current.open && panel ? RADIUS_OPEN : RADIUS_CLOSED;\n surface.style.translate = `${offset}px 0`;\n if (first) {\n // The first measurement is the trigger itself: land there, then let later changes spring.\n void surface.offsetWidth;\n surface.dataset.ready = \"\";\n }\n }, [bounds]);\n const queued = useRef(false);\n const schedule = useCallback(() => {\n if (queued.current) return;\n queued.current = true;\n queueMicrotask(() => {\n queued.current = false;\n update();\n });\n }, [update]);\n useLayoutEffect(() => {\n live.current.open = open;\n if (!open) sizes.current.panel = null;\n schedule();\n }, [open, schedule]);\n useLayoutEffect(() => {\n const node = triggerRef.current;\n if (!node) return;\n const read = () => {\n sizes.current.trigger = { w: node.offsetWidth, h: node.offsetHeight };\n schedule();\n };\n read();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(read);\n observer.observe(node);\n return () => observer.disconnect();\n }, [schedule]);\n useLayoutEffect(() => {\n const node = panelRef.current;\n if (!open || !node) return;\n const read = () => {\n sizes.current.panel = { w: node.offsetWidth, h: node.offsetHeight };\n schedule();\n };\n read();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(read);\n observer.observe(node);\n return () => observer.disconnect();\n }, [open, mounted, schedule]);\n\n // On a short screen the panel can open below the fold with Apply out of reach: scroll just enough to bring its bottom\n // into view, never past its top; after closing, bring the trigger back into view if that scroll left it off screen.\n useEffect(() => {\n if (!open) return;\n const frame = requestAnimationFrame(() => {\n const node = panelRef.current;\n if (!node) return;\n const rect = node.getBoundingClientRect();\n const overflow = rect.bottom - (window.innerHeight - EDGE);\n if (overflow <= 0) return;\n window.scrollBy({\n top: Math.min(overflow, Math.max(0, rect.top - EDGE)),\n behavior: prefersReducedMotion() ? \"instant\" : \"smooth\",\n });\n });\n return () => cancelAnimationFrame(frame);\n }, [open]);\n useEffect(() => {\n if (open) return;\n const trigger = triggerRef.current;\n if (!trigger) return;\n const rect = trigger.getBoundingClientRect();\n if (rect.bottom < 0 || rect.top > window.innerHeight)\n trigger.scrollIntoView({ block: \"center\", behavior: prefersReducedMotion() ? \"instant\" : \"smooth\" });\n }, [open]);\n\n /* ---------- Layout: two months when there is room, one compact month otherwise ---------- */\n const measureLayout = useCallback(() => {\n const box = bounds();\n const available = Math.max(0, box.right - box.left - EDGE * 2);\n const single = months === 1 || (months === \"auto\" && available < WIDE_MIN);\n return { single, width: Math.min(352, available) };\n }, [bounds, months]);\n useEffect(() => {\n if (!open) return;\n const onResize = () => {\n const next = measureLayout();\n setCompact(next.single);\n setPanelWidth(next.width);\n schedule();\n };\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, [measureLayout, open, schedule]);\n const count = compact ? 1 : 2;\n const cellSize =\n compact && panelWidth ? Math.max(32, Math.min(42, Math.floor((panelWidth - 24) / 7))) : WIDE_CELL;\n\n /** The month the calendar opens on: the range's end, with the month before it beside it when two show. */\n const viewFor = (range: DateRangePickerValue, single: boolean): DateValue => {\n const end = (range.end ?? range.start ?? todayIn(getLocalTimeZone())).set({ day: 1 });\n return single ? end : end.subtract({ months: 1 });\n };\n\n const openPanel = () => {\n setTodayValue(todayIn(getLocalTimeZone()));\n const layout = measureLayout();\n setCompact(layout.single);\n setPanelWidth(layout.width);\n setDraft(committed);\n setSnapshot({ anchor: null, highlighted: null });\n setFocus(viewFor(committed, layout.single));\n setOpen(true);\n };\n const close = useCallback((focusTrigger: boolean) => {\n if (focusTrigger) pendingFocus.current = \"trigger\";\n // Where the value is now, so it can fly back into the trigger.\n summaryRect.current = summaryRef.current?.getBoundingClientRect() ?? null;\n setOpen(false);\n setSnapshot({ anchor: null, highlighted: null });\n }, []);\n const apply = () => {\n const next = snapshot.anchor ? { start: snapshot.anchor, end: snapshot.anchor } : draft;\n if (!next.start && !next.end && !props.clearable) return;\n setCommitted(next);\n close(true);\n };\n\n // The value flies between the trigger and the footer: out as the surface grows, back as it shrinks.\n useLayoutEffect(() => {\n if (prefersReducedMotion()) return;\n if (open && summaryRef.current && restingRef.current) {\n flyFrom(summaryRef.current, restingRef.current.getBoundingClientRect(), \"grow\");\n }\n }, [open, mounted]);\n useLayoutEffect(() => {\n if (!open && summaryRect.current && restingRef.current && !prefersReducedMotion()) {\n flyFrom(restingRef.current, summaryRect.current, \"shrink\");\n summaryRect.current = null;\n }\n }, [open]);\n // Closing hands focus back to the trigger when it was inside the panel.\n useLayoutEffect(() => {\n if (pendingFocus.current === \"trigger\" && !open) {\n pendingFocus.current = null;\n triggerRef.current?.focus({ preventScroll: true });\n }\n }, [open]);\n useEffect(() => {\n if (!open) return;\n const down = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) close(false);\n };\n document.addEventListener(\"pointerdown\", down);\n return () => document.removeEventListener(\"pointerdown\", down);\n }, [close, open]);\n\n // Opening puts focus on the day that owns the tab stop: the range's start when it is in view, else its end.\n useEffect(() => {\n if (!open || !mounted) return;\n const frame = requestAnimationFrame(() => {\n const panel = panelRef.current;\n if (!panel || panel.contains(document.activeElement)) return;\n const day =\n panel.querySelector<HTMLElement>('[data-slot=\"calendar-cell\"][data-selection-start]:not([data-outside-month])') ??\n panel.querySelector<HTMLElement>('[data-slot=\"calendar-cell\"][data-selection-end]:not([data-outside-month])') ??\n panel.querySelector<HTMLElement>('[data-slot=\"calendar-cell\"]:not([data-outside-month]):not([data-disabled])');\n day?.focus({ preventScroll: true });\n });\n return () => cancelAnimationFrame(frame);\n }, [open, mounted]);\n\n const choosePreset = (preset: DateRangePreset) => {\n const range = preset.range(todayValue);\n setDraft(range);\n setSnapshot({ anchor: null, highlighted: null });\n setFocus(viewFor(range, compact));\n };\n\n const invalid = props.errorMessage != null;\n const describedBy = [props.description != null && descriptionId, invalid && errorId]\n .filter(Boolean)\n .join(\" \");\n const size = props.size ?? \"md\";\n const disabled = Boolean(props.isDisabled);\n\n return (\n <div\n data-slot=\"date-range-picker\"\n data-invalid={invalid || undefined}\n className={cn(datePickerVariants(), props.className)}\n >\n <span\n id={labelId}\n className={cn(datePickerLabelVariants(), props.labelHidden && \"sr-only\")}\n >\n {props.label}\n </span>\n <div\n ref={rootRef}\n data-open={open || undefined}\n data-disabled={disabled || undefined}\n data-invalid={invalid || undefined}\n className={cn(\"range-root\", rootSize[size])}\n onKeyDown={(event) => {\n if (event.key === \"Escape\" && open) {\n event.preventDefault();\n event.stopPropagation();\n close(true);\n }\n }}\n onBlur={(event) => {\n const next = event.relatedTarget as Node | null;\n if (open && next && !event.currentTarget.contains(next)) close(false);\n }}\n >\n {/* The trigger stays in place under the panel. Its icons fade while the value flies to the footer and back. */}\n <button\n ref={(node) => {\n mergedRef(node);\n if (!node) return;\n if (open) node.setAttribute(\"inert\", \"\");\n else node.removeAttribute(\"inert\");\n }}\n type=\"button\"\n data-slot=\"range-trigger\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? panelId : undefined}\n aria-labelledby={`${labelId} ${valueId}`}\n aria-describedby={describedBy || undefined}\n onClick={openPanel}\n className={cn(\n \"relative z-10 flex w-full cursor-pointer items-center gap-2 border-0 bg-transparent text-start text-base leading-(--leading-normal) text-foreground outline-none\",\n \"disabled:cursor-not-allowed\",\n triggerSize[size],\n )}\n >\n <span className=\"range-quiet flex flex-none text-muted-foreground [&_svg]:size-(--icon-sm)\">\n <CalendarGlyph />\n </span>\n <span id={valueId} className=\"sr-only\">\n {committedText}\n </span>\n <span\n ref={restingRef}\n data-slot=\"range-value\"\n className={cn(\n \"range-quiet flex min-w-0 flex-1 overflow-hidden tabular-nums\",\n !(committed.start || committed.end) && \"text-muted-foreground\",\n )}\n >\n <RollingWords text={committedText} direction={committedDirection} />\n </span>\n <span className=\"range-quiet flex flex-none text-muted-foreground [&_svg]:size-(--icon-sm)\">\n <Chevron />\n </span>\n </button>\n\n <div\n ref={surfaceRef}\n data-slot=\"range-surface\"\n className={cn(\n \"range-surface\",\n disabled && \"bg-muted opacity-(--opacity-disabled)\",\n invalid && \"border-destructive-strong\",\n )}\n style={{ borderRadius: RADIUS_CLOSED }}\n >\n {mounted ? (\n <div\n ref={panelRef}\n id={panelId}\n role=\"dialog\"\n aria-label={props.label}\n data-slot=\"range-panel\"\n data-compact={compact || undefined}\n style={\n {\n \"--cell\": `${cellSize}px`,\n width: compact && panelWidth ? panelWidth : undefined,\n } as CSSProperties\n }\n className={cn(\n \"absolute top-0 start-0 box-border w-[max-content] text-sm leading-(--leading-normal) text-foreground\",\n compact ? \"p-2\" : \"p-2.5\",\n )}\n >\n <div\n data-slot=\"range-body\"\n className={cn(\n \"flex\",\n compact ? \"flex-col gap-2\" : \"gap-2.5\",\n closing\n ? \"motion-safe:animate-range-face-out motion-reduce:animate-range-face-fade-out\"\n : \"motion-safe:animate-range-face-in motion-reduce:animate-range-face-fade-in\",\n )}\n >\n <PresetRail\n presets={presets}\n active={activePreset}\n compact={compact}\n label={messages.presets}\n onChoose={choosePreset}\n />\n <div className=\"flex min-w-0 flex-col gap-3\">\n <div className=\"flex gap-2\">\n <TypedDate\n label={startLabel}\n value={draft.start}\n minValue={props.minValue}\n maxValue={props.maxValue}\n onChange={(next) => {\n if (next || props.clearable) setDraft({ start: next, end: draft.end });\n }}\n />\n <TypedDate\n label={endLabel}\n value={draft.end}\n minValue={props.minValue}\n maxValue={props.maxValue}\n onChange={(next) => {\n if (next || props.clearable) setDraft({ start: draft.start, end: next });\n }}\n />\n </div>\n <AriaRangeCalendar\n aria-label={props.label}\n value={complete}\n onChange={(next) => setDraft({ start: next.start, end: next.end })}\n focusedValue={focus ?? undefined}\n onFocusChange={setFocus}\n minValue={props.minValue}\n maxValue={props.maxValue}\n visibleDuration={{ months: count }}\n pageBehavior=\"single\"\n selectionAlignment=\"start\"\n data-slot=\"range-calendar\"\n style={{ \"--density-control-h-sm\": \"var(--cell)\" } as CSSProperties}\n className={cn(\"relative flex flex-col font-sans\", compact && \"self-center\")}\n >\n <CalendarBridge onSnapshot={setSnapshot} />\n <RangeDriver />\n <div className=\"relative\">\n <AriaButton\n slot=\"previous\"\n aria-label={messages.previousMonth}\n className={cn(calendarNavVariants(), \"absolute start-0 top-0 z-20 size-8\")}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" aria-hidden=\"true\">\n <path d=\"m15 18-6-6 6-6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </AriaButton>\n <AriaButton\n slot=\"next\"\n aria-label={messages.nextMonth}\n className={cn(calendarNavVariants(), \"absolute end-0 top-0 z-20 size-8\")}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" aria-hidden=\"true\">\n <path d=\"m9 18 6-6-6-6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </AriaButton>\n <MonthSets count={count} />\n </div>\n </AriaRangeCalendar>\n </div>\n </div>\n\n <div\n data-slot=\"range-footer\"\n className={cn(\n \"mt-2.5 flex items-center justify-between gap-3 border-t-(length:--border-width) border-border pt-2.5 ps-3\",\n compact && \"flex-wrap\",\n )}\n >\n <div className={cn(\"grid min-w-0 gap-px\", compact && \"flex-[1_1_8rem]\")}>\n <span\n ref={summaryRef}\n data-slot=\"range-summary\"\n className=\"inline-flex w-[max-content] font-medium tabular-nums\"\n >\n <RollingWords text={shownText} direction={shownDirection} />\n </span>\n <span className=\"inline-flex min-h-4.5 text-xs text-muted-foreground tabular-nums\">\n {countText ? <RollingWords text={countText} direction={shownDirection} /> : null}\n </span>\n </div>\n <div className={cn(\"flex flex-none items-center gap-1.5\", compact && \"ms-auto\")}>\n {props.clearable ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => {\n setDraft(NO_RANGE);\n setSnapshot({ anchor: null, highlighted: null });\n }}\n >\n {messages.clear}\n </Button>\n ) : null}\n <Button variant=\"ghost\" size=\"sm\" onPress={() => close(true)}>\n {messages.cancel}\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onPress={apply}\n isDisabled={!shown && !(props.clearable && (committed.start || committed.end))}\n >\n {messages.apply}\n </Button>\n </div>\n </div>\n <p className=\"sr-only\" aria-live=\"polite\">\n {status}\n </p>\n </div>\n ) : null}\n </div>\n </div>\n {props.description == null ? null : (\n <span id={descriptionId} data-slot=\"date-range-picker-description\" className={descriptionClass}>\n {props.description}\n </span>\n )}\n {invalid ? (\n <span id={errorId} data-slot=\"date-range-picker-error\" className={errorClass}>\n {props.errorMessage}\n </span>\n ) : null}\n </div>\n );\n },\n);\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { datePickerInputVariants, datePickerLabelVariants, datePickerSegmentVariants, datePickerTriggerVariants, datePickerVariants } from "./picker-parts.js";
2
+ import { DateRangePicker, DateRangePickerMessages, DateRangePickerProps, DateRangePickerValue, DateRangePreset, defaultDateRangePresets } from "./date-range-picker.js";
3
+ import { DatePicker, DatePickerProps } from "./date-picker.js";
4
+ export { DatePicker, type DatePickerProps, DateRangePicker, type DateRangePickerMessages, type DateRangePickerProps, type DateRangePickerValue, type DateRangePreset, datePickerInputVariants, datePickerLabelVariants, datePickerSegmentVariants, datePickerTriggerVariants, datePickerVariants, defaultDateRangePresets };
@@ -0,0 +1,4 @@
1
+ import { datePickerInputVariants, datePickerLabelVariants, datePickerSegmentVariants, datePickerTriggerVariants, datePickerVariants } from "./picker-parts.js";
2
+ import { DateRangePicker, defaultDateRangePresets } from "./date-range-picker.js";
3
+ import { DatePicker } from "./date-picker.js";
4
+ export { DatePicker, DateRangePicker, datePickerInputVariants, datePickerLabelVariants, datePickerSegmentVariants, datePickerTriggerVariants, datePickerVariants, defaultDateRangePresets };
@@ -0,0 +1,46 @@
1
+ import { ReactNode } from "react";
2
+ import { DateValue } from "@internationalized/date";
3
+ //#region src/date-picker/picker-parts.d.ts
4
+ export declare const datePickerVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
5
+ export declare const datePickerLabelVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
6
+ /** The trigger: the field surface Input, Textarea and Select share. */
7
+ export declare const datePickerTriggerVariants: (props?: ({
8
+ size?: "sm" | "md" | "lg" | null | undefined;
9
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
10
+ /** The typed date's box, inside the popover: the field surface at the small rung. */
11
+ export declare const datePickerInputVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
12
+ /** One part (day, month, year) of the typed date. */
13
+ export declare const datePickerSegmentVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
14
+ export interface PickerSharedProps {
15
+ /**
16
+ * Accessible name, shown above the trigger. **Required**, as on Select: the
17
+ * trigger's name is this label followed by the value it shows.
18
+ */
19
+ label: string;
20
+ /** Hide the label visually while keeping it on the accessibility tree. @default false */
21
+ labelHidden?: boolean;
22
+ /** A quieter line under the trigger, read with it. */
23
+ description?: ReactNode;
24
+ /** Why the value is wrong, under the trigger. Draws the invalid edge. */
25
+ errorMessage?: ReactNode;
26
+ /** Shown on the trigger while nothing is chosen. @default "Choose a date" */
27
+ placeholder?: string;
28
+ /** The earliest day that may be chosen, typed or picked. */
29
+ minValue?: DateValue;
30
+ /** The latest day that may be chosen, typed or picked. */
31
+ maxValue?: DateValue;
32
+ /** Offer the Calendar's Clear button, for a value that may be left empty. @default false */
33
+ clearable?: boolean;
34
+ /** Visible text of the Clear button. @default "Clear" */
35
+ clearLabel?: string;
36
+ /** Disable the trigger. */
37
+ isDisabled?: boolean;
38
+ /** Height rung, shared with Input and Select. @default "md" */
39
+ size?: "sm" | "md" | "lg";
40
+ /** How a chosen day is written on the trigger. @default the locale's medium date */
41
+ formatValue?: (value: DateValue) => string;
42
+ /** Extra classes on the root. Merged last through `cn()`, so the consumer wins. */
43
+ className?: string;
44
+ }
45
+ //#endregion
46
+ //# sourceMappingURL=picker-parts.d.ts.map
@@ -0,0 +1,135 @@
1
+ "use client";
2
+ import { fieldSurfaceVariants } from "../lib/field-surface.js";
3
+ import { cva } from "class-variance-authority";
4
+ import { useMemo, useState } from "react";
5
+ import { DateField, DateInput, DateSegment, Label, useLocale } from "react-aria-components";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/date-picker/picker-parts.tsx
8
+ const datePickerVariants = cva(["group flex w-full flex-col gap-1.5 box-border font-sans"]);
9
+ const datePickerLabelVariants = cva(["text-sm leading-(--leading-normal) text-foreground"]);
10
+ /** The trigger: the field surface Input, Textarea and Select share. */
11
+ const datePickerTriggerVariants = cva([
12
+ "group-data-[invalid]:border-destructive-strong",
13
+ fieldSurfaceVariants(),
14
+ "[&:where([data-pressed])]:border-foreground",
15
+ "data-[hovered]:not-data-[disabled]:bg-muted data-[pressed]:bg-muted",
16
+ "group/trigger",
17
+ "flex items-center justify-between gap-2 text-start",
18
+ "text-base leading-(--leading-normal) cursor-pointer",
19
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0",
20
+ "[&_svg:not([class*='size-'])]:size-(--icon-sm)"
21
+ ], {
22
+ variants: {
23
+ /** The same rungs and tokens as Input, Select and Button. */
24
+ size: {
25
+ sm: "h-(--density-control-h-sm) px-(--density-control-pad-sm)",
26
+ md: "h-(--density-control-h-md) px-(--density-control-pad-md)",
27
+ lg: "h-(--density-control-h-lg) px-(--density-control-pad-lg)"
28
+ } },
29
+ defaultVariants: { size: "md" }
30
+ });
31
+ /** The typed date's box, inside the popover: the field surface at the small rung. */
32
+ const datePickerInputVariants = cva([
33
+ fieldSurfaceVariants(),
34
+ "flex items-center",
35
+ "h-(--density-control-h-sm) px-(--density-control-pad-sm)",
36
+ "text-base leading-(--leading-normal)"
37
+ ]);
38
+ /** One part (day, month, year) of the typed date. */
39
+ const datePickerSegmentVariants = cva([
40
+ "rounded-2xs px-0.5 tabular-nums outline-none",
41
+ "data-[placeholder]:text-muted-foreground",
42
+ "data-[focused]:bg-primary data-[focused]:text-primary-foreground",
43
+ "data-[type=literal]:px-0"
44
+ ]);
45
+ const descriptionClass = "text-sm leading-(--leading-normal) text-muted-foreground";
46
+ const hintClass = "motion-safe:transition-opacity motion-safe:duration-(--duration-quick) motion-safe:ease-settle group-has-[[aria-expanded=true]]:opacity-0";
47
+ const errorClass = "text-sm leading-(--leading-normal) text-destructive-strong";
48
+ function CalendarGlyph() {
49
+ return /* @__PURE__ */ jsxs("svg", {
50
+ "aria-hidden": "true",
51
+ viewBox: "0 0 16 16",
52
+ fill: "none",
53
+ stroke: "currentColor",
54
+ strokeWidth: "1.5",
55
+ strokeLinecap: "round",
56
+ strokeLinejoin: "round",
57
+ className: "text-muted-foreground",
58
+ children: [/* @__PURE__ */ jsx("rect", {
59
+ x: "2.5",
60
+ y: "3.5",
61
+ width: "11",
62
+ height: "10",
63
+ rx: "1.5"
64
+ }), /* @__PURE__ */ jsx("path", { d: "M2.5 6.5h11M5.5 2v3M10.5 2v3" })]
65
+ });
66
+ }
67
+ /** "15 Sept 2026" in the locale React Aria reports. A calendar day has no zone, so UTC is exact. */
68
+ /** The chevron turns half a turn while the list is open, on the gentle spring. */
69
+ function Chevron() {
70
+ return /* @__PURE__ */ jsx("svg", {
71
+ "aria-hidden": "true",
72
+ viewBox: "0 0 16 16",
73
+ fill: "none",
74
+ stroke: "currentColor",
75
+ strokeWidth: "1.75",
76
+ strokeLinecap: "round",
77
+ strokeLinejoin: "round",
78
+ className: "text-muted-foreground motion-safe:transition-[rotate] motion-safe:duration-(--duration-gentle) motion-safe:ease-gentle group-aria-expanded/trigger:rotate-180",
79
+ children: /* @__PURE__ */ jsx("path", { d: "m4 6 4 4 4-4" })
80
+ });
81
+ }
82
+ const pickerFooterButtonVariants = cva([
83
+ "picker-footer-button cursor-pointer rounded-md border-0 bg-transparent px-2 py-1",
84
+ "text-xs text-muted-foreground outline-none",
85
+ "data-[hovered]:bg-muted data-[hovered]:text-foreground",
86
+ "data-[focus-visible]:outline-solid data-[focus-visible]:outline-(length:--focus-ring-width)",
87
+ "data-[focus-visible]:outline-offset-(--focus-ring-offset) data-[focus-visible]:outline-(--color-ring)",
88
+ "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-(--opacity-disabled)"
89
+ ]);
90
+ function useDayFormat() {
91
+ const { locale } = useLocale();
92
+ return useMemo(() => {
93
+ const format = new Intl.DateTimeFormat(locale, {
94
+ dateStyle: "medium",
95
+ timeZone: "UTC"
96
+ });
97
+ return (value) => format.format(value.toDate("UTC"));
98
+ }, [locale]);
99
+ }
100
+ /** A value that may be controlled or not, without a dependency on react-stately. */
101
+ function useValue(value, defaultValue, onChange) {
102
+ const [inner, setInner] = useState(defaultValue);
103
+ const current = value === void 0 ? inner : value;
104
+ const set = (next) => {
105
+ if (value === void 0) setInner(next);
106
+ onChange?.(next);
107
+ };
108
+ return [current, set];
109
+ }
110
+ /** The typed date inside the popover. Reports only whole dates, or null once every part is cleared. */
111
+ function TypedDate({ label, value, onChange, minValue, maxValue }) {
112
+ return /* @__PURE__ */ jsxs(DateField, {
113
+ value,
114
+ onChange,
115
+ minValue,
116
+ maxValue,
117
+ "data-slot": "date-picker-typed",
118
+ className: "flex min-w-0 flex-1 flex-col gap-1",
119
+ children: [/* @__PURE__ */ jsx(Label, {
120
+ className: descriptionClass,
121
+ children: label
122
+ }), /* @__PURE__ */ jsx(DateInput, {
123
+ "data-slot": "date-picker-input",
124
+ className: datePickerInputVariants(),
125
+ children: (segment) => /* @__PURE__ */ jsx(DateSegment, {
126
+ segment,
127
+ className: datePickerSegmentVariants()
128
+ })
129
+ })]
130
+ });
131
+ }
132
+ //#endregion
133
+ export { CalendarGlyph, Chevron, TypedDate, datePickerInputVariants, datePickerLabelVariants, datePickerSegmentVariants, datePickerTriggerVariants, datePickerVariants, descriptionClass, errorClass, hintClass, pickerFooterButtonVariants, useDayFormat, useValue };
134
+
135
+ //# sourceMappingURL=picker-parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker-parts.js","names":["AriaDateField","AriaLabel","AriaDateInput","AriaDateSegment"],"sources":["../../src/date-picker/picker-parts.tsx"],"sourcesContent":["\"use client\";\n\nimport type { DateValue } from \"@internationalized/date\";\nimport { cva } from \"class-variance-authority\";\nimport { useMemo, useState, type ReactNode } from \"react\";\nimport {\n DateField as AriaDateField,\n DateInput as AriaDateInput,\n DateSegment as AriaDateSegment,\n Label as AriaLabel,\n useLocale,\n} from \"react-aria-components\";\n\nimport { fieldSurfaceVariants } from \"../lib/field-surface.js\";\n\n/*\n * The pieces DatePicker and DateRangePicker share: the field's classes, the\n * glyphs, the typed date field, and the value helpers. Neither file imports the\n * other, so the two pickers can each own their motion.\n */\n\nexport const datePickerVariants = cva([\"group flex w-full flex-col gap-1.5 box-border font-sans\"]);\n\nexport const datePickerLabelVariants = cva([\"text-sm leading-(--leading-normal) text-foreground\"]);\n\n/** The trigger: the field surface Input, Textarea and Select share. */\nexport const datePickerTriggerVariants = cva(\n [\n \"group-data-[invalid]:border-destructive-strong\",\n fieldSurfaceVariants(),\n // While the list is open the trigger is pressed and focus is inside it, so the\n // border and fill keep what they had. Ordinary variants: the base background is\n // a plain class, which a zero-specificity rule would lose to.\n \"[&:where([data-pressed])]:border-foreground\",\n \"data-[hovered]:not-data-[disabled]:bg-muted data-[pressed]:bg-muted\",\n \"group/trigger\",\n \"flex items-center justify-between gap-2 text-start\",\n \"text-base leading-(--leading-normal) cursor-pointer\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0\",\n \"[&_svg:not([class*='size-'])]:size-(--icon-sm)\",\n ],\n {\n variants: {\n /** The same rungs and tokens as Input, Select and Button. */\n size: {\n sm: \"h-(--density-control-h-sm) px-(--density-control-pad-sm)\",\n md: \"h-(--density-control-h-md) px-(--density-control-pad-md)\",\n lg: \"h-(--density-control-h-lg) px-(--density-control-pad-lg)\",\n },\n },\n defaultVariants: { size: \"md\" },\n },\n);\n\n/** The typed date's box, inside the popover: the field surface at the small rung. */\nexport const datePickerInputVariants = cva([\n fieldSurfaceVariants(),\n \"flex items-center\",\n \"h-(--density-control-h-sm) px-(--density-control-pad-sm)\",\n \"text-base leading-(--leading-normal)\",\n]);\n\n/** One part (day, month, year) of the typed date. */\nexport const datePickerSegmentVariants = cva([\n \"rounded-2xs px-0.5 tabular-nums outline-none\",\n \"data-[placeholder]:text-muted-foreground\",\n \"data-[focused]:bg-primary data-[focused]:text-primary-foreground\",\n \"data-[type=literal]:px-0\",\n]);\n\nexport const descriptionClass = \"text-sm leading-(--leading-normal) text-muted-foreground\";\n// The open list covers the hint; fading it keeps its first letters from showing past the list's corner.\nexport const hintClass =\n \"motion-safe:transition-opacity motion-safe:duration-(--duration-quick) motion-safe:ease-settle group-has-[[aria-expanded=true]]:opacity-0\";\nexport const errorClass = \"text-sm leading-(--leading-normal) text-destructive-strong\";\n\nexport function CalendarGlyph() {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-muted-foreground\"\n >\n <rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"10\" rx=\"1.5\" />\n <path d=\"M2.5 6.5h11M5.5 2v3M10.5 2v3\" />\n </svg>\n );\n}\n\n/** \"15 Sept 2026\" in the locale React Aria reports. A calendar day has no zone, so UTC is exact. */\n/** The chevron turns half a turn while the list is open, on the gentle spring. */\nexport function Chevron() {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-muted-foreground motion-safe:transition-[rotate] motion-safe:duration-(--duration-gentle) motion-safe:ease-gentle group-aria-expanded/trigger:rotate-180\"\n >\n <path d=\"m4 6 4 4 4-4\" />\n </svg>\n );\n}\n\nexport const pickerFooterButtonVariants = cva([\n \"picker-footer-button cursor-pointer rounded-md border-0 bg-transparent px-2 py-1\",\n \"text-xs text-muted-foreground outline-none\",\n \"data-[hovered]:bg-muted data-[hovered]:text-foreground\",\n \"data-[focus-visible]:outline-solid data-[focus-visible]:outline-(length:--focus-ring-width)\",\n \"data-[focus-visible]:outline-offset-(--focus-ring-offset) data-[focus-visible]:outline-(--color-ring)\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-(--opacity-disabled)\",\n]);\n\nexport function useDayFormat(): (value: DateValue) => string {\n const { locale } = useLocale();\n return useMemo(() => {\n const format = new Intl.DateTimeFormat(locale, { dateStyle: \"medium\", timeZone: \"UTC\" });\n return (value: DateValue) => format.format(value.toDate(\"UTC\"));\n }, [locale]);\n}\n\n/** A value that may be controlled or not, without a dependency on react-stately. */\nexport function useValue<T>(value: T | undefined, defaultValue: T, onChange?: (next: T) => void) {\n const [inner, setInner] = useState<T>(defaultValue);\n const current = value === undefined ? inner : value;\n const set = (next: T) => {\n if (value === undefined) setInner(next);\n onChange?.(next);\n };\n return [current, set] as const;\n}\n\n/** The typed date inside the popover. Reports only whole dates, or null once every part is cleared. */\nexport function TypedDate({\n label,\n value,\n onChange,\n minValue,\n maxValue,\n}: {\n label: string;\n value: DateValue | null;\n onChange: (value: DateValue | null) => void;\n minValue?: DateValue;\n maxValue?: DateValue;\n}) {\n return (\n <AriaDateField\n value={value}\n onChange={onChange}\n minValue={minValue}\n maxValue={maxValue}\n data-slot=\"date-picker-typed\"\n className=\"flex min-w-0 flex-1 flex-col gap-1\"\n >\n <AriaLabel className={descriptionClass}>{label}</AriaLabel>\n <AriaDateInput data-slot=\"date-picker-input\" className={datePickerInputVariants()}>\n {(segment) => <AriaDateSegment segment={segment} className={datePickerSegmentVariants()} />}\n </AriaDateInput>\n </AriaDateField>\n );\n}\n\nexport interface PickerSharedProps {\n /**\n * Accessible name, shown above the trigger. **Required**, as on Select: the\n * trigger's name is this label followed by the value it shows.\n */\n label: string;\n /** Hide the label visually while keeping it on the accessibility tree. @default false */\n labelHidden?: boolean;\n /** A quieter line under the trigger, read with it. */\n description?: ReactNode;\n /** Why the value is wrong, under the trigger. Draws the invalid edge. */\n errorMessage?: ReactNode;\n /** Shown on the trigger while nothing is chosen. @default \"Choose a date\" */\n placeholder?: string;\n /** The earliest day that may be chosen, typed or picked. */\n minValue?: DateValue;\n /** The latest day that may be chosen, typed or picked. */\n maxValue?: DateValue;\n /** Offer the Calendar's Clear button, for a value that may be left empty. @default false */\n clearable?: boolean;\n /** Visible text of the Clear button. @default \"Clear\" */\n clearLabel?: string;\n /** Disable the trigger. */\n isDisabled?: boolean;\n /** Height rung, shared with Input and Select. @default \"md\" */\n size?: \"sm\" | \"md\" | \"lg\";\n /** How a chosen day is written on the trigger. @default the locale's medium date */\n formatValue?: (value: DateValue) => string;\n /** Extra classes on the root. Merged last through `cn()`, so the consumer wins. */\n className?: string;\n}\n\n"],"mappings":";;;;;;;AAqBA,MAAa,qBAAqB,IAAI,CAAC,yDAAyD,CAAC;AAEjG,MAAa,0BAA0B,IAAI,CAAC,oDAAoD,CAAC;;AAGjG,MAAa,4BAA4B,IACvC;CACE;CACA,qBAAqB;CAIrB;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GACA;CACE,UAAU;;AAER,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;CACN,EACF;CACA,iBAAiB,EAAE,MAAM,KAAK;AAChC,CACF;;AAGA,MAAa,0BAA0B,IAAI;CACzC,qBAAqB;CACrB;CACA;CACA;AACF,CAAC;;AAGD,MAAa,4BAA4B,IAAI;CAC3C;CACA;CACA;CACA;AACF,CAAC;AAED,MAAa,mBAAmB;AAEhC,MAAa,YACX;AACF,MAAa,aAAa;AAE1B,SAAgB,gBAAgB;CAC9B,OACE,qBAAC,OAAD;EACE,eAAY;EACZ,SAAQ;EACR,MAAK;EACL,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,WAAU;EARZ,UAAA,CAUE,oBAAC,QAAD;GAAM,GAAE;GAAM,GAAE;GAAM,OAAM;GAAK,QAAO;GAAK,IAAG;EAAO,CAAA,GACvD,oBAAC,QAAD,EAAM,GAAE,+BAAgC,CAAA,CACrC;;AAET;;;AAIA,SAAgB,UAAU;CACxB,OACE,oBAAC,OAAD;EACE,eAAY;EACZ,SAAQ;EACR,MAAK;EACL,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,WAAU;EAEV,UAAA,oBAAC,QAAD,EAAM,GAAE,eAAgB,CAAA;CACrB,CAAA;AAET;AAEA,MAAa,6BAA6B,IAAI;CAC5C;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,eAA6C;CAC3D,MAAM,EAAE,WAAW,UAAU;CAC7B,OAAO,cAAc;EACnB,MAAM,SAAS,IAAI,KAAK,eAAe,QAAQ;GAAE,WAAW;GAAU,UAAU;EAAM,CAAC;EACvF,QAAQ,UAAqB,OAAO,OAAO,MAAM,OAAO,KAAK,CAAC;CAChE,GAAG,CAAC,MAAM,CAAC;AACb;;AAGA,SAAgB,SAAY,OAAsB,cAAiB,UAA8B;CAC/F,MAAM,CAAC,OAAO,YAAY,SAAY,YAAY;CAClD,MAAM,UAAU,UAAU,KAAA,IAAY,QAAQ;CAC9C,MAAM,OAAO,SAAY;EACvB,IAAI,UAAU,KAAA,GAAW,SAAS,IAAI;EACtC,WAAW,IAAI;CACjB;CACA,OAAO,CAAC,SAAS,GAAG;AACtB;;AAGA,SAAgB,UAAU,EACxB,OACA,OACA,UACA,UACA,YAOC;CACD,OACE,qBAACA,WAAD;EACS;EACG;EACA;EACA;EACV,aAAU;EACV,WAAU;EANZ,UAAA,CAQE,oBAACC,OAAD;GAAW,WAAW;GAAmB,UAAA;EAAiB,CAAA,GAC1D,oBAACC,WAAD;GAAe,aAAU;GAAoB,WAAW,wBAAwB;GAC5E,WAAA,YAAY,oBAACC,aAAD;IAA0B;IAAS,WAAW,0BAA0B;GAAI,CAAA;EAC7E,CAAA,CACF;;AAEnB"}
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from "react";
2
- import { DialogTrigger, ModalOverlayProps } from "react-aria-components";
2
+ import { DialogTrigger as DialogTrigger$1, ModalOverlayProps } from "react-aria-components";
3
3
  //#region src/dialog/dialog.d.ts
4
4
  /**
5
5
  * Dialog, ported from the legacy shadcn/Radix component onto React Aria's
@@ -39,18 +39,6 @@ export declare const dialogPanelVariants: (props?: import("class-variance-author
39
39
  export declare const dialogTitleVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
40
40
  export declare const dialogDescriptionVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
41
41
  export declare const dialogFooterVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
42
- /**
43
- * A modal dialog.
44
- *
45
- * @example
46
- * <Dialog isOpen={open} onOpenChange={setOpen} title="Delete user"
47
- * description="This cannot be undone.">
48
- * <DialogFooter>
49
- * <Button slot="close" variant="ghost">Cancel</Button>
50
- * <Button variant="destructive" onPress={remove}>Delete</Button>
51
- * </DialogFooter>
52
- * </Dialog>
53
- */
54
42
  export interface DialogProps extends Omit<ModalOverlayProps, "className" | "style" | "children"> {
55
43
  /**
56
44
  * The dialog's heading, and its accessible name.
@@ -119,6 +107,14 @@ export interface DialogProps extends Omit<ModalOverlayProps, "className" | "styl
119
107
  * @default true
120
108
  */
121
109
  isDismissable?: boolean;
110
+ /**
111
+ * How the dialog comes in: `rise` fades the overlay (blurring the page) and lifts
112
+ * the panel in on a spring; `none` leaves the entrance to the caller, as an
113
+ * edge-anchored preset (Sheet) does.
114
+ *
115
+ * @default "rise"
116
+ */
117
+ entrance?: "rise" | "none";
122
118
  }
123
119
  declare const Dialog$1: import("react").ForwardRefExoticComponent<DialogProps & import("react").RefAttributes<HTMLElement>>;
124
120
  /**
@@ -136,5 +132,5 @@ export interface DialogFooterProps {
136
132
  }
137
133
  export declare const DialogFooter: import("react").ForwardRefExoticComponent<DialogFooterProps & import("react").RefAttributes<HTMLDivElement>>;
138
134
  //#endregion
139
- export { Dialog$1 as Dialog, DialogTrigger };
135
+ export { Dialog$1 as Dialog, DialogTrigger$1 as DialogTrigger };
140
136
  //# sourceMappingURL=dialog.d.ts.map
@@ -1,9 +1,10 @@
1
1
  "use client";
2
- import { cn } from "../lib/cn.js";
2
+ import { cn, cnAll } from "../lib/cn.js";
3
+ import { SwapText } from "../lib/swap-text.js";
3
4
  import { cva } from "class-variance-authority";
4
5
  import { forwardRef } from "react";
5
- import { Button, Dialog, DialogTrigger, Heading, Modal, ModalOverlay, Text } from "react-aria-components";
6
- import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { Button, Dialog, DialogTrigger as DialogTrigger$1, Heading, Modal, ModalOverlay, Text } from "react-aria-components";
7
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
8
  //#region src/dialog/dialog.tsx
8
9
  /**
9
10
  * Dialog, ported from the legacy shadcn/Radix component onto React Aria's
@@ -60,8 +61,8 @@ const dialogCloseVariants = cva([
60
61
  "rounded-2xs box-border cursor-pointer",
61
62
  "border-(length:--border-width) border-transparent bg-transparent",
62
63
  "text-muted-foreground",
63
- "motion-safe:transition-colors motion-safe:duration-(--duration-fast) motion-safe:ease-standard",
64
- "data-[hovered]:text-foreground",
64
+ "calendar-nav-motion",
65
+ "data-[hovered]:bg-muted data-[hovered]:text-foreground",
65
66
  "outline-none",
66
67
  "data-[focus-visible]:outline-solid",
67
68
  "data-[focus-visible]:outline-(length:--focus-ring-width)",
@@ -69,32 +70,59 @@ const dialogCloseVariants = cva([
69
70
  "data-[focus-visible]:outline-(--color-ring)",
70
71
  "[&_svg]:pointer-events-none [&_svg]:size-4"
71
72
  ]);
72
- const Dialog$1 = forwardRef(function Dialog$2({ title, beforeTitle, description, children, className, closeButton = true, closeLabel = "Close", role = "dialog", isDismissable = true, overlayClassName, ...props }, ref) {
73
+ /**
74
+ * A modal dialog.
75
+ *
76
+ * @example
77
+ * <Dialog isOpen={open} onOpenChange={setOpen} title="Delete user"
78
+ * description="This cannot be undone.">
79
+ * <DialogFooter>
80
+ * <Button slot="close" variant="ghost">Cancel</Button>
81
+ * <Button variant="destructive" onPress={remove}>Delete</Button>
82
+ * </DialogFooter>
83
+ * </Dialog>
84
+ */
85
+ /** A string title or description swaps as a whole when its text changes while the dialog is open. */
86
+ function Swappable({ value, children }) {
87
+ if (typeof value !== "string") return /* @__PURE__ */ jsx(Fragment$1, { children });
88
+ return /* @__PURE__ */ jsx(SwapText, {
89
+ swapKey: value,
90
+ className: "block",
91
+ children
92
+ });
93
+ }
94
+ const Dialog$1 = forwardRef(function Dialog$2({ title, beforeTitle, description, children, className, closeButton = true, closeLabel = "Close", role = "dialog", isDismissable = true, overlayClassName, entrance = "rise", ...props }, ref) {
73
95
  return /* @__PURE__ */ jsx(ModalOverlay, {
74
96
  ...props,
75
97
  isDismissable,
76
98
  "data-slot": "dialog-overlay",
77
- className: cn(dialogOverlayVariants(), overlayClassName),
99
+ className: cnAll(dialogOverlayVariants(), entrance === "rise" && "dialog-overlay-motion", overlayClassName),
78
100
  children: /* @__PURE__ */ jsx(Modal, {
79
101
  className: "contents",
80
102
  children: /* @__PURE__ */ jsxs(Dialog, {
81
103
  ref,
82
104
  role,
83
105
  "data-slot": "dialog",
84
- className: cn(dialogPanelVariants(), className),
106
+ className: cnAll(dialogPanelVariants(), entrance === "rise" && "dialog-panel-motion", className),
85
107
  children: [
86
108
  beforeTitle,
87
109
  /* @__PURE__ */ jsx(Heading, {
88
110
  slot: "title",
89
111
  "data-slot": "dialog-title",
90
112
  className: dialogTitleVariants(),
91
- children: title
113
+ children: /* @__PURE__ */ jsx(Swappable, {
114
+ value: title,
115
+ children: title
116
+ })
92
117
  }),
93
118
  description == null ? null : /* @__PURE__ */ jsx(Text, {
94
119
  slot: "description",
95
120
  "data-slot": "dialog-description",
96
121
  className: dialogDescriptionVariants(),
97
- children: description
122
+ children: /* @__PURE__ */ jsx(Swappable, {
123
+ value: description,
124
+ children: description
125
+ })
98
126
  }),
99
127
  children,
100
128
  closeButton ? /* @__PURE__ */ jsx(Button, {
@@ -125,6 +153,6 @@ const DialogFooter = forwardRef(function DialogFooter({ children, className }, r
125
153
  });
126
154
  });
127
155
  //#endregion
128
- export { Dialog$1 as Dialog, DialogFooter, DialogTrigger, dialogDescriptionVariants, dialogFooterVariants, dialogOverlayVariants, dialogPanelVariants, dialogTitleVariants };
156
+ export { Dialog$1 as Dialog, DialogFooter, DialogTrigger$1 as DialogTrigger, dialogDescriptionVariants, dialogFooterVariants, dialogOverlayVariants, dialogPanelVariants, dialogTitleVariants };
129
157
 
130
158
  //# sourceMappingURL=dialog.js.map