@plexui/vue 0.1.4 → 0.1.5

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 (44) hide show
  1. package/dist/es/components/DateRangePicker/Calendar.js +19 -18
  2. package/dist/es/components/DateRangePicker/Calendar.js.map +1 -1
  3. package/dist/es/components/DateRangePicker/DateRangePicker.js +5 -0
  4. package/dist/es/components/DateRangePicker/DateRangePicker.js.map +1 -1
  5. package/dist/es/components/DateRangePicker/context.js.map +1 -1
  6. package/dist/es/components/DateRangePicker/index.js.map +1 -1
  7. package/dist/es/components/DateRangePicker/types.js.map +1 -1
  8. package/dist/es/components/Dialog/Dialog.js +46 -11
  9. package/dist/es/components/Dialog/Dialog.js.map +1 -1
  10. package/dist/es/components/Field/Field.js +6 -3
  11. package/dist/es/components/Field/Field.js.map +1 -1
  12. package/dist/es/components/InputGroup/InputGroup.js +0 -1
  13. package/dist/es/components/InputGroup/InputGroup.js.map +1 -1
  14. package/dist/es/components/Menu/Menu.js +27 -5
  15. package/dist/es/components/Menu/Menu.js.map +1 -1
  16. package/dist/es/components/Popover/Popover.js +24 -9
  17. package/dist/es/components/Popover/Popover.js.map +1 -1
  18. package/dist/es/components/Select/Select.js +31 -15
  19. package/dist/es/components/Select/Select.js.map +1 -1
  20. package/dist/es/components/SelectControl/SelectControl.js +7 -4
  21. package/dist/es/components/SelectControl/SelectControl.js.map +1 -1
  22. package/dist/es/components/Transition/TransitionGroup.js +12 -1
  23. package/dist/es/components/Transition/TransitionGroup.js.map +1 -1
  24. package/dist/es/components/Transition/shared.js +30 -1
  25. package/dist/es/components/Transition/shared.js.map +1 -1
  26. package/dist/es/components/Transition/useTransitionChild.js +2 -2
  27. package/dist/es/components/Transition/useTransitionChild.js.map +1 -1
  28. package/dist/es/lib/dateUtils.js +5 -0
  29. package/dist/es/lib/dateUtils.js.map +1 -1
  30. package/dist/es/lib/helpers.js +30 -0
  31. package/dist/es/lib/helpers.js.map +1 -1
  32. package/dist/types/components/DateRangePicker/DateRangePicker.d.ts +23 -1
  33. package/dist/types/components/DateRangePicker/context.d.ts +2 -1
  34. package/dist/types/components/DateRangePicker/index.d.ts +1 -1
  35. package/dist/types/components/DateRangePicker/types.d.ts +2 -0
  36. package/dist/types/components/Field/Field.d.ts +2 -2
  37. package/dist/types/components/Select/Select.d.ts +11 -0
  38. package/dist/types/components/SelectControl/SelectControl.d.ts +11 -0
  39. package/dist/types/components/Transition/TransitionGroup.d.ts +11 -0
  40. package/dist/types/components/Transition/shared.d.ts +23 -0
  41. package/dist/types/components/Transition/useTransitionChild.d.ts +1 -0
  42. package/dist/types/lib/dateUtils.d.ts +5 -0
  43. package/dist/types/lib/helpers.d.ts +13 -0
  44. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import { DateTime, Interval } from "luxon";
2
2
  import { computed, createCommentVNode, defineComponent, h, onMounted, ref, shallowRef, watch } from "vue";
3
3
  import { useBreakpoint } from "../../composables/useBreakpoints.js";
4
- import { chunkIntoWeeks, getDaysOfMonth, isAfter, isBefore, isSameDay, isToday } from "../../lib/dateUtils.js";
4
+ import { chunkIntoWeeks, getDaysOfMonth, isAfter, isBefore, isSameDay, isToday, weekPosition } from "../../lib/dateUtils.js";
5
5
  import { waitForAnimationFrame } from "../../lib/helpers.js";
6
6
  import { Button } from "../Button/index.js";
7
7
  import { Check, ChevronLeft, ChevronRight } from "../Icon/index.js";
@@ -20,12 +20,9 @@ import {} from "./types.js";
20
20
  // `{isSmallUp && ...}`: TransitionGroup still renders its (empty) wrapper
21
21
  // when animations are off.
22
22
  // - React quirk kept: the day buttons have no `type`.
23
- const CALENDAR_WIDTH_PX = 210;
24
- const CALENDAR_GAP_PX = 32;
25
- const STEP_DISTANCE_PX = CALENDAR_WIDTH_PX + CALENDAR_GAP_PX;
26
- // The day a grid key moves to: a day, a week, the Sunday or Saturday of the
27
- // week (rows start on Sunday), or a month (Luxon clamps Jan 31 to Feb 28/29)
28
- const getKeyTarget = (key, day) => {
23
+ // The day a grid key moves to: a day, a week, the first or last day of the
24
+ // week row, or a month (Luxon clamps Jan 31 to Feb 28/29)
25
+ const getKeyTarget = (key, day, weekStartsOn) => {
29
26
  switch (key) {
30
27
  case "ArrowLeft":
31
28
  return day.minus({ days: 1 });
@@ -36,9 +33,9 @@ const getKeyTarget = (key, day) => {
36
33
  case "ArrowDown":
37
34
  return day.plus({ days: 7 });
38
35
  case "Home":
39
- return day.minus({ days: day.weekday % 7 });
36
+ return day.minus({ days: weekPosition(day, weekStartsOn) });
40
37
  case "End":
41
- return day.plus({ days: 6 - (day.weekday % 7) });
38
+ return day.plus({ days: 6 - weekPosition(day, weekStartsOn) });
42
39
  case "PageUp":
43
40
  return day.minus({ months: 1 });
44
41
  case "PageDown":
@@ -129,7 +126,7 @@ export const DateRangeCalendar = defineComponent({
129
126
  }
130
127
  // While a move waits for its month to render, the next key starts from
131
128
  // the day it is moving to (key repeat), not the day that still has focus
132
- const target = getKeyTarget(event.key, pendingFocus ?? day);
129
+ const target = getKeyTarget(event.key, pendingFocus ?? day, context.weekStartsOn);
133
130
  if (!target) {
134
131
  return;
135
132
  }
@@ -283,7 +280,7 @@ export const DateRangeCalendar = defineComponent({
283
280
  ]),
284
281
  h("div", {
285
282
  class: s.CalendarRange,
286
- style: { transform: `translate(${calendarSteps.value * -1 * STEP_DISTANCE_PX}px, 0)` },
283
+ style: { transform: `translate(calc(${calendarSteps.value * -1} * var(--calendar-step)), 0)` },
287
284
  }, [
288
285
  h(TransitionGroup, { enterDuration: 400, exitDuration: 400 }, {
289
286
  default: () => [
@@ -327,13 +324,15 @@ const CalendarView = defineComponent({
327
324
  stepPosition: { type: Number, required: true },
328
325
  },
329
326
  setup(props) {
327
+ const context = useDateRangeContext();
330
328
  // Lock position on mount and don't respond to changes
331
329
  const position = props.stepPosition;
332
330
  const view = computed(() => {
333
331
  const { date, min, max } = props;
332
+ const { weekStartsOn } = context;
334
333
  const monthStart = date.startOf("month");
335
334
  const endOfMonth = date.endOf("month");
336
- const daysBeforeMonthStart = monthStart.weekday % 7;
335
+ const daysBeforeMonthStart = weekPosition(monthStart, weekStartsOn);
337
336
  const blankDays = new Array(daysBeforeMonthStart).fill(null);
338
337
  const daysInMonth = getDaysOfMonth(monthStart);
339
338
  const calendarCells = [...blankDays, ...daysInMonth];
@@ -359,9 +358,11 @@ const CalendarView = defineComponent({
359
358
  const { selectionStart, maxRangeDays, isSelecting } = props;
360
359
  const [selectedStart, selectedEnd] = props.selectedDates || [];
361
360
  const rangeEndLimit = selectionStart && maxRangeDays != null ? selectionStart.plus({ days: maxRangeDays - 1 }) : undefined;
362
- return h("div", { "class": s.Calendar, "style": { left: `${position * STEP_DISTANCE_PX}px` }, "data-calendar": true }, [
361
+ const { weekStartsOn } = context;
362
+ const dayLabels = [...daysOfTheWeekLabels.slice(weekStartsOn), ...daysOfTheWeekLabels.slice(0, weekStartsOn)];
363
+ return h("div", { "class": s.Calendar, "style": { left: `calc(${position} * var(--calendar-step))` }, "data-calendar": true }, [
363
364
  h("p", { class: s.MonthLabel }, [startOfMonth.monthLong, " ", String(startOfMonth.year)]),
364
- h("div", { class: s.Week }, daysOfTheWeekLabels.map((day) => h("div", { key: day, class: s.DayLabel }, day))),
365
+ h("div", { class: s.Week }, dayLabels.map((day) => h("div", { key: day, class: s.DayLabel }, day))),
365
366
  ...weeks.map((week, weekIndex) => h("div", { class: s.Week, key: weekIndex }, week.map((d, dayIndex) => {
366
367
  if (!d) {
367
368
  return h("div", { class: s.Day, key: `${weekIndex}-${dayIndex}` });
@@ -374,13 +375,13 @@ const CalendarView = defineComponent({
374
375
  const isInRange = hasRange && selectedInterval.value?.contains(d);
375
376
  const dayIsToday = isToday(d);
376
377
  const isFirstRangeTrail = d.day === 1 &&
377
- // Trail doesn't make sense to display at the start of the week (Monday)
378
- d.weekday !== 7 &&
378
+ // Trail doesn't make sense to display at the start of the week
379
+ weekPosition(d, weekStartsOn) !== 0 &&
379
380
  isInRange &&
380
381
  !isStart;
381
382
  const isLastRangeTrail = d.day === d.daysInMonth &&
382
- // Trail doesn't make sense to display at the end of the week (Saturday)
383
- d.weekday !== 6 &&
383
+ // Trail doesn't make sense to display at the end of the week
384
+ weekPosition(d, weekStartsOn) !== 6 &&
384
385
  isInRange &&
385
386
  !isEnd;
386
387
  return h("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/Calendar.ts"],"names":[],"mappings":"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","sourcesContent":["import { DateTime, Interval } from \"luxon\"\nimport { computed, createCommentVNode, defineComponent, h, onMounted, ref, shallowRef, watch, type PropType } from \"vue\"\nimport { useBreakpoint } from \"../../composables/useBreakpoints.js\"\nimport { chunkIntoWeeks, getDaysOfMonth, isAfter, isBefore, isSameDay, isToday } from \"../../lib/dateUtils.js\"\nimport { waitForAnimationFrame } from \"../../lib/helpers.js\"\nimport { Button } from \"../Button/index.js\"\nimport { Check, ChevronLeft, ChevronRight } from \"../Icon/index.js\"\nimport { TransitionGroup } from \"../Transition/index.js\"\nimport s from \"@plexui/styles/components/DateRangePicker/Calendar.module.css\"\nimport { useDateRangeContext } from \"./context.js\"\nimport { type DateRange, type DateRangeShortcut } from \"./types.js\"\n\n// Vue port of packages/ui/src/components/DateRangePicker/Calendar.tsx.\n// - React's `[value]` effect is a watcher on the context value; the height\n// effect runs on mount and when the left month changes, after render.\n// - The `stable-view-N` key on the wrapper remounts the calendar view, as in\n// React, when the value jumps out of view.\n// - React's pending-focus effect is a post watcher on the left month; its\n// cleanup cancels the frame, as the effect's does.\n// - Below the `sm` breakpoint the right calendar is a placeholder, as React's\n// `{isSmallUp && ...}`: TransitionGroup still renders its (empty) wrapper\n// when animations are off.\n// - React quirk kept: the day buttons have no `type`.\n\nconst CALENDAR_WIDTH_PX = 210\nconst CALENDAR_GAP_PX = 32\nconst STEP_DISTANCE_PX = CALENDAR_WIDTH_PX + CALENDAR_GAP_PX\n\n// The day a grid key moves to: a day, a week, the Sunday or Saturday of the\n// week (rows start on Sunday), or a month (Luxon clamps Jan 31 to Feb 28/29)\nconst getKeyTarget = (key: string, day: DateTime): DateTime | null => {\n switch (key) {\n case \"ArrowLeft\":\n return day.minus({ days: 1 })\n case \"ArrowRight\":\n return day.plus({ days: 1 })\n case \"ArrowUp\":\n return day.minus({ days: 7 })\n case \"ArrowDown\":\n return day.plus({ days: 7 })\n case \"Home\":\n return day.minus({ days: day.weekday % 7 })\n case \"End\":\n return day.plus({ days: 6 - (day.weekday % 7) })\n case \"PageUp\":\n return day.minus({ months: 1 })\n case \"PageDown\":\n return day.plus({ months: 1 })\n default:\n return null\n }\n}\n\nconst monthIndex = (date: DateTime) => date.year * 12 + date.month\n\nexport const DateRangeCalendar = defineComponent({\n name: \"DateRangeCalendar\",\n setup() {\n const context = useDateRangeContext()\n const isSmallUp = useBreakpoint(\"sm\")\n const calendarContainerRef = shallowRef<HTMLDivElement | null>(null)\n // The day to focus once a key has moved the view to its month\n let pendingFocus: DateTime | null = null\n const selectionRange = shallowRef<DateRange | null>(null)\n const calendarSteps = ref(0)\n const forceRenderIncrement = ref(0)\n const leftCalendarDate = shallowRef<DateTime>(\n isSmallUp.value\n ? getLeftCalendarDate(context.value?.[0] ?? DateTime.now(), context.max)\n : (context.value?.[0] ?? DateTime.now()),\n )\n\n const rightCalendarDate = computed(() =>\n isSmallUp.value\n ? leftCalendarDate.value.plus({ months: 1 }).startOf(\"month\")\n : leftCalendarDate.value.startOf(\"month\"),\n )\n\n const canGoBack = () => !context.min || isBefore(context.min, leftCalendarDate.value.startOf(\"month\"))\n const canGoForward = () => !context.max || isBefore(rightCalendarDate.value.endOf(\"month\"), context.max)\n\n const handleNext = () => {\n calendarSteps.value += 1\n leftCalendarDate.value = leftCalendarDate.value.plus({ months: 1 })\n }\n\n const handlePrevious = () => {\n calendarSteps.value -= 1\n leftCalendarDate.value = leftCalendarDate.value.minus({ months: 1 })\n }\n\n const handleDateSelect = (selectedDate: DateTime) => {\n if (!selectionRange.value) {\n selectionRange.value = [selectedDate, selectedDate]\n return\n }\n\n const [currentSelectionStartDate] = selectionRange.value\n\n // Selecting a date before the current selected start date moves the start date\n // but does not resolve the selection\n if (isBefore(selectedDate, currentSelectionStartDate)) {\n selectionRange.value = [selectedDate, selectedDate]\n return\n }\n\n // Resolve the selection by emitting the value and clearing selection\n context.onChange([currentSelectionStartDate, selectedDate])\n selectionRange.value = null\n }\n\n const handleDateMouseEnter = (hoveredDate: DateTime) => {\n // If we're not actively selecting, no-op\n const currentSelectionRange = selectionRange.value\n if (!currentSelectionRange) {\n return\n }\n\n const [currentStartDate] = currentSelectionRange\n\n // When hovering a date before the current date, don't change the selection range\n if (isBefore(hoveredDate, currentStartDate)) {\n selectionRange.value = [currentStartDate, currentStartDate]\n return\n }\n\n selectionRange.value = [currentStartDate, hoveredDate]\n }\n\n const handleCalendarMouseLeave = () => {\n // If we're not actively selecting, no-op\n const currentSelectionRange = selectionRange.value\n if (!currentSelectionRange) {\n return\n }\n\n // Reset the end selection\n const [currentStartDate] = currentSelectionRange\n selectionRange.value = [currentStartDate, currentStartDate]\n }\n\n // Days are named by their full date; skip calendars that are leaving\n const focusDay = (day: DateTime) => {\n const label = day.toLocaleString(DateTime.DATE_HUGE)\n const buttons = calendarContainerRef.value?.querySelectorAll<HTMLButtonElement>(`button[aria-label=\"${label}\"]`)\n Array.from(buttons ?? [])\n .find((button) => !button.closest(\"[data-exiting]\"))\n ?.focus()\n }\n\n const handleDayKeyDown = (event: KeyboardEvent, day: DateTime) => {\n if (event.altKey || event.ctrlKey || event.metaKey) {\n return\n }\n\n // While a move waits for its month to render, the next key starts from\n // the day it is moving to (key repeat), not the day that still has focus\n const target = getKeyTarget(event.key, pendingFocus ?? day)\n if (!target) {\n return\n }\n\n event.preventDefault()\n\n // A disabled day (outside min/max, or past maxRangeDays while selecting)\n // keeps focus where it is\n const { min, max, maxRangeDays } = context\n const selection = selectionRange.value\n const rangeEndLimit =\n selection && maxRangeDays != null ? selection[0].plus({ days: maxRangeDays - 1 }) : undefined\n if (\n (min && isBefore(target, min.startOf(\"day\"))) ||\n (max && isAfter(target, max.endOf(\"day\"))) ||\n (rangeEndLimit && isAfter(target, rangeEndLimit))\n ) {\n return\n }\n\n const monthsBefore = monthIndex(leftCalendarDate.value) - monthIndex(target)\n const monthsAfter = monthIndex(target) - monthIndex(rightCalendarDate.value)\n if (monthsBefore <= 0 && monthsAfter <= 0) {\n pendingFocus = null\n focusDay(target)\n return\n }\n\n // Step the view like the month buttons; a day within min/max keeps every step in bounds\n if (monthsAfter > 0 ? !canGoForward() : !canGoBack()) {\n return\n }\n\n pendingFocus = target\n for (let step = 0; step < Math.max(monthsBefore, monthsAfter); step++) {\n if (monthsAfter > 0) {\n handleNext()\n } else {\n handlePrevious()\n }\n }\n }\n\n // Force re-renders when `value` changes out of brand from direct user-selection\n watch(\n () => context.value,\n (value) => {\n // When a new value is received, it could be out of band from the control of this calendar.\n // For example, a shortcut could be selected, or clear could be pressed. In either case, selection\n // should be reset so that the new `value` can be displayed fully.\n selectionRange.value = null\n\n // Nothing else to do when value is empty\n if (!value) {\n return\n }\n\n // Check if `value` is still within view of our calendar\n const viewInterval = Interval.fromDateTimes(\n leftCalendarDate.value.startOf(\"month\"),\n rightCalendarDate.value.endOf(\"month\"),\n )\n const isValueInRangeOfCalendar = viewInterval.contains(value[0]) || viewInterval.contains(value[1])\n if (!isValueInRangeOfCalendar) {\n // Reset state the calendar view entirely\n selectionRange.value = null\n calendarSteps.value = 0\n leftCalendarDate.value = isSmallUp.value ? getLeftCalendarDate(value[0], context.max) : value[0]\n forceRenderIncrement.value += 1\n }\n },\n )\n\n // Detect height changes when new calendars are rendered\n const measureHeight = () => {\n waitForAnimationFrame(() => {\n const container = calendarContainerRef.value\n\n if (!container) {\n return\n }\n\n let maxHeight = -Infinity\n\n // Find the tallest calendar\n container.querySelectorAll<HTMLElement>(\"[data-calendar]\")?.forEach((element) => {\n // NOTE: clientHeight does not respect the scale() that popover uses to animate in, which is what we want\n // We want to know the full height of the element, without any transform applied.\n const height = element.clientHeight\n\n // Ignore calendars that are exiting\n if (element.closest(\"[data-exiting]\")) {\n return\n }\n\n if (height > maxHeight) {\n maxHeight = height\n }\n })\n\n container.style.height = `${maxHeight}px`\n\n // Don't animate the initial height.\n // This is relevant when the calendar opens to a larger size than the default.\n if (!container.style.transition) {\n waitForAnimationFrame(() => {\n container.style.transition = `height 0.25s var(--cubic-move)`\n })\n }\n })\n }\n onMounted(measureHeight)\n watch(leftCalendarDate, measureHeight, { flush: \"post\" })\n\n // Focus a pending day once its month has rendered. TransitionGroup marks\n // the leaving calendar after this render, so wait a frame like the height does\n watch(\n leftCalendarDate,\n (_date, _previous, onCleanup) => {\n if (!pendingFocus) {\n return\n }\n\n onCleanup(\n waitForAnimationFrame(() => {\n const target = pendingFocus\n pendingFocus = null\n if (target) {\n focusDay(target)\n }\n }),\n )\n },\n { flush: \"post\" },\n )\n\n const setContainer = (el: unknown) => {\n calendarContainerRef.value = (el as HTMLDivElement | null) ?? null\n }\n\n return () => {\n const { value, min, max, maxRangeDays } = context\n const left = leftCalendarDate.value\n const right = rightCalendarDate.value\n const selection = selectionRange.value\n const selectedDisplayValue = selection || value\n const viewProps = {\n selectedDates: selectedDisplayValue,\n min,\n max,\n selectionStart: selection?.[0],\n maxRangeDays,\n isSelecting: !!selection,\n onDateSelect: handleDateSelect,\n onDateMouseEnter: handleDateMouseEnter,\n onDayKeyDown: handleDayKeyDown,\n }\n\n return h(\"div\", { key: `stable-view-${forceRenderIncrement.value}`, class: s.CalendarWrapper }, [\n h(\"div\", { ref: setContainer, class: s.CalendarContainer, onMouseleave: handleCalendarMouseLeave }, [\n h(\"div\", { class: s.Previous }, [\n h(\n Button,\n {\n \"variant\": \"ghost\",\n \"color\": \"secondary\",\n \"size\": \"sm\",\n \"pill\": false,\n \"gutterSize\": \"2xs\",\n \"iconSize\": \"sm\",\n \"onClick\": handlePrevious,\n \"disabled\": !canGoBack(),\n \"aria-label\": \"Previous month\",\n },\n { default: () => [h(ChevronLeft)] },\n ),\n ]),\n h(\"div\", { class: s.Next }, [\n h(\n Button,\n {\n \"variant\": \"ghost\",\n \"color\": \"secondary\",\n \"size\": \"sm\",\n \"pill\": false,\n \"gutterSize\": \"2xs\",\n \"iconSize\": \"sm\",\n \"onClick\": handleNext,\n \"disabled\": !canGoForward(),\n \"aria-label\": \"Next month\",\n },\n { default: () => [h(ChevronRight)] },\n ),\n ]),\n h(\n \"div\",\n {\n class: s.CalendarRange,\n style: { transform: `translate(${calendarSteps.value * -1 * STEP_DISTANCE_PX}px, 0)` },\n },\n [\n h(\n TransitionGroup,\n { enterDuration: 400, exitDuration: 400 },\n {\n default: () => [\n h(CalendarView, {\n key: left.toLocaleString({ month: \"long\", year: \"numeric\" }),\n stepPosition: calendarSteps.value,\n date: left,\n ...viewProps,\n }),\n isSmallUp.value\n ? h(CalendarView, {\n key: right.toLocaleString({ month: \"long\", year: \"numeric\" }),\n stepPosition: calendarSteps.value + 1,\n date: right,\n ...viewProps,\n })\n : createCommentVNode(),\n ],\n },\n ),\n ],\n ),\n ]),\n ])\n }\n },\n})\n\nconst daysOfTheWeekLabels = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"]\n\nconst CalendarView = defineComponent({\n name: \"DateRangeCalendarView\",\n props: {\n // Can be any day within the given month that the calendar should render for\n date: { type: Object as PropType<DateTime>, required: true },\n selectedDates: { type: Array as unknown as PropType<DateRange | null>, default: undefined },\n onDateSelect: Function as PropType<(dt: DateTime) => void>,\n onDateMouseEnter: Function as PropType<(dt: DateTime) => void>,\n onDayKeyDown: Function as PropType<(event: KeyboardEvent, dt: DateTime) => void>,\n min: Object as PropType<DateTime>,\n max: Object as PropType<DateTime>,\n selectionStart: { type: Object as PropType<DateTime | null>, default: undefined },\n maxRangeDays: Number,\n isSelecting: Boolean,\n stepPosition: { type: Number, required: true },\n },\n setup(props) {\n // Lock position on mount and don't respond to changes\n const position = props.stepPosition\n const view = computed(() => {\n const { date, min, max } = props\n const monthStart = date.startOf(\"month\")\n const endOfMonth = date.endOf(\"month\")\n\n const daysBeforeMonthStart = monthStart.weekday % 7\n const blankDays = new Array(daysBeforeMonthStart).fill(null)\n const daysInMonth = getDaysOfMonth(monthStart)\n const calendarCells = [...blankDays, ...daysInMonth]\n\n // Cells are start-of-day values and Interval excludes its end, so widen the\n // bounds to whole days: min/max days themselves stay selectable.\n const enabledDateInterval = Interval.fromDateTimes(\n (min || monthStart).startOf(\"day\"),\n (max || endOfMonth).endOf(\"day\"),\n )\n\n return {\n startOfMonth: monthStart,\n endOfMonth,\n weeks: chunkIntoWeeks(calendarCells, 7) as Array<Array<DateTime | null>>,\n enabledInterval: enabledDateInterval,\n }\n })\n\n const selectedInterval = computed<Interval | null>(() => {\n const [selectedStart, selectedEnd] = props.selectedDates || []\n if (!selectedStart || !selectedEnd) {\n return null\n }\n\n return Interval.fromDateTimes(selectedStart.startOf(\"day\"), selectedEnd.endOf(\"day\"))\n })\n\n return () => {\n const { startOfMonth, weeks, enabledInterval } = view.value\n const { selectionStart, maxRangeDays, isSelecting } = props\n const [selectedStart, selectedEnd] = props.selectedDates || []\n const rangeEndLimit =\n selectionStart && maxRangeDays != null ? selectionStart.plus({ days: maxRangeDays - 1 }) : undefined\n\n return h(\"div\", { \"class\": s.Calendar, \"style\": { left: `${position * STEP_DISTANCE_PX}px` }, \"data-calendar\": true }, [\n h(\"p\", { class: s.MonthLabel }, [startOfMonth.monthLong, \" \", String(startOfMonth.year)]),\n h(\n \"div\",\n { class: s.Week },\n daysOfTheWeekLabels.map((day) => h(\"div\", { key: day, class: s.DayLabel }, day)),\n ),\n ...weeks.map((week, weekIndex) =>\n h(\n \"div\",\n { class: s.Week, key: weekIndex },\n week.map((d, dayIndex) => {\n if (!d) {\n return h(\"div\", { class: s.Day, key: `${weekIndex}-${dayIndex}` })\n }\n\n // Check if 'day' is within selected range\n const enabled = enabledInterval.contains(d) && !(isSelecting && rangeEndLimit && isAfter(d, rangeEndLimit))\n const isStart = enabled && selectedStart && isSameDay(d, selectedStart)\n const isEnd = enabled && selectedEnd && isSameDay(d, selectedEnd)\n const hasRange = selectedStart && selectedEnd && !isSameDay(selectedStart, selectedEnd)\n const isInRange = hasRange && selectedInterval.value?.contains(d)\n const dayIsToday = isToday(d)\n const isFirstRangeTrail =\n d.day === 1 &&\n // Trail doesn't make sense to display at the start of the week (Monday)\n d.weekday !== 7 &&\n isInRange &&\n !isStart\n const isLastRangeTrail =\n d.day === d.daysInMonth &&\n // Trail doesn't make sense to display at the end of the week (Saturday)\n d.weekday !== 6 &&\n isInRange &&\n !isEnd\n\n return h(\n \"div\",\n {\n \"class\": s.Day,\n \"key\": dayIndex,\n \"data-is-start\": isStart ? \"\" : undefined,\n \"data-is-end\": isEnd ? \"\" : undefined,\n \"data-is-in-range\": isInRange ? \"\" : undefined,\n \"data-is-first-range-trail\": isFirstRangeTrail ? \"\" : undefined,\n \"data-is-last-range-trail\": isLastRangeTrail ? \"\" : undefined,\n },\n [\n // The full date names the day, which \"15\" alone does not across months\n h(\n \"button\",\n {\n \"class\": s.InteractiveDay,\n \"disabled\": !enabled,\n \"aria-label\": d.toLocaleString(DateTime.DATE_HUGE),\n \"aria-pressed\": isStart || isEnd || isInRange ? \"true\" : \"false\",\n \"aria-current\": dayIsToday ? \"date\" : undefined,\n \"onClick\": () => d && props.onDateSelect?.(d),\n \"onMouseenter\": () => d && props.onDateMouseEnter?.(d),\n \"onKeydown\": (event: KeyboardEvent) => d && props.onDayKeyDown?.(event, d),\n },\n [String(d.day), dayIsToday ? h(\"span\", { class: s.TodayDot }) : null],\n ),\n ],\n )\n }),\n ),\n ),\n ])\n }\n },\n})\n\nexport const DateRangeShortcuts = defineComponent({\n name: \"DateRangeShortcuts\",\n props: {\n shortcuts: Array as PropType<DateRangeShortcut[]>,\n },\n setup(props) {\n const isMediumUp = useBreakpoint(\"md\")\n const context = useDateRangeContext()\n\n return () => {\n const { shortcuts } = props\n if (!isMediumUp.value || !shortcuts?.length) {\n return null\n }\n\n const { value, min, max, maxRangeDays, onChange } = context\n\n return h(\n \"div\",\n { class: s.Shortcuts },\n shortcuts.map((shortcut) => {\n const { label, getDateRange } = shortcut\n const range = getDateRange()\n const [start, end] = range\n const isActive = !!value && isSameDay(value[0], start) && isSameDay(value[1], end)\n\n return h(\n Button,\n {\n key: label,\n class: \"mb-1\",\n variant: \"ghost\",\n color: \"primary\",\n pill: false,\n size: \"md\",\n iconSize: \"sm\",\n block: true,\n selected: isActive,\n disabled: !isRangeWithinLimits(range, min, max, maxRangeDays),\n onClick: () => onChange(range, shortcut),\n },\n { default: () => [h(\"span\", { class: s.ButtonText }, label), isActive ? h(Check) : null] },\n )\n }),\n )\n }\n },\n})\n\n// A shortcut follows the calendar's limits: whole days from min to max, and\n// no more than maxRangeDays days\nconst isRangeWithinLimits = ([start, end]: DateRange, min?: DateTime, max?: DateTime, maxRangeDays?: number) =>\n !(min && isBefore(start, min.startOf(\"day\"))) &&\n !(max && isAfter(end, max.endOf(\"day\"))) &&\n !(maxRangeDays != null && isAfter(end.startOf(\"day\"), start.startOf(\"day\").plus({ days: maxRangeDays - 1 })))\n\nconst getLeftCalendarDate = (targetDate: DateTime, maxDate?: DateTime) => {\n if (!maxDate) {\n return targetDate\n }\n\n return isBefore(targetDate.endOf(\"month\"), maxDate) ? targetDate : targetDate.minus({ months: 1 })\n}\n"]}
1
+ {"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/Calendar.ts"],"names":[],"mappings":"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","sourcesContent":["import { DateTime, Interval } from \"luxon\"\nimport { computed, createCommentVNode, defineComponent, h, onMounted, ref, shallowRef, watch, type PropType } from \"vue\"\nimport { useBreakpoint } from \"../../composables/useBreakpoints.js\"\nimport { chunkIntoWeeks, getDaysOfMonth, isAfter, isBefore, isSameDay, isToday, weekPosition } from \"../../lib/dateUtils.js\"\nimport { waitForAnimationFrame } from \"../../lib/helpers.js\"\nimport { Button } from \"../Button/index.js\"\nimport { Check, ChevronLeft, ChevronRight } from \"../Icon/index.js\"\nimport { TransitionGroup } from \"../Transition/index.js\"\nimport s from \"@plexui/styles/components/DateRangePicker/Calendar.module.css\"\nimport { useDateRangeContext } from \"./context.js\"\nimport { type DateRange, type DateRangeShortcut } from \"./types.js\"\n\n// Vue port of packages/ui/src/components/DateRangePicker/Calendar.tsx.\n// - React's `[value]` effect is a watcher on the context value; the height\n// effect runs on mount and when the left month changes, after render.\n// - The `stable-view-N` key on the wrapper remounts the calendar view, as in\n// React, when the value jumps out of view.\n// - React's pending-focus effect is a post watcher on the left month; its\n// cleanup cancels the frame, as the effect's does.\n// - Below the `sm` breakpoint the right calendar is a placeholder, as React's\n// `{isSmallUp && ...}`: TransitionGroup still renders its (empty) wrapper\n// when animations are off.\n// - React quirk kept: the day buttons have no `type`.\n\n// The day a grid key moves to: a day, a week, the first or last day of the\n// week row, or a month (Luxon clamps Jan 31 to Feb 28/29)\nconst getKeyTarget = (key: string, day: DateTime, weekStartsOn: number): DateTime | null => {\n switch (key) {\n case \"ArrowLeft\":\n return day.minus({ days: 1 })\n case \"ArrowRight\":\n return day.plus({ days: 1 })\n case \"ArrowUp\":\n return day.minus({ days: 7 })\n case \"ArrowDown\":\n return day.plus({ days: 7 })\n case \"Home\":\n return day.minus({ days: weekPosition(day, weekStartsOn) })\n case \"End\":\n return day.plus({ days: 6 - weekPosition(day, weekStartsOn) })\n case \"PageUp\":\n return day.minus({ months: 1 })\n case \"PageDown\":\n return day.plus({ months: 1 })\n default:\n return null\n }\n}\n\nconst monthIndex = (date: DateTime) => date.year * 12 + date.month\n\nexport const DateRangeCalendar = defineComponent({\n name: \"DateRangeCalendar\",\n setup() {\n const context = useDateRangeContext()\n const isSmallUp = useBreakpoint(\"sm\")\n const calendarContainerRef = shallowRef<HTMLDivElement | null>(null)\n // The day to focus once a key has moved the view to its month\n let pendingFocus: DateTime | null = null\n const selectionRange = shallowRef<DateRange | null>(null)\n const calendarSteps = ref(0)\n const forceRenderIncrement = ref(0)\n const leftCalendarDate = shallowRef<DateTime>(\n isSmallUp.value\n ? getLeftCalendarDate(context.value?.[0] ?? DateTime.now(), context.max)\n : (context.value?.[0] ?? DateTime.now()),\n )\n\n const rightCalendarDate = computed(() =>\n isSmallUp.value\n ? leftCalendarDate.value.plus({ months: 1 }).startOf(\"month\")\n : leftCalendarDate.value.startOf(\"month\"),\n )\n\n const canGoBack = () => !context.min || isBefore(context.min, leftCalendarDate.value.startOf(\"month\"))\n const canGoForward = () => !context.max || isBefore(rightCalendarDate.value.endOf(\"month\"), context.max)\n\n const handleNext = () => {\n calendarSteps.value += 1\n leftCalendarDate.value = leftCalendarDate.value.plus({ months: 1 })\n }\n\n const handlePrevious = () => {\n calendarSteps.value -= 1\n leftCalendarDate.value = leftCalendarDate.value.minus({ months: 1 })\n }\n\n const handleDateSelect = (selectedDate: DateTime) => {\n if (!selectionRange.value) {\n selectionRange.value = [selectedDate, selectedDate]\n return\n }\n\n const [currentSelectionStartDate] = selectionRange.value\n\n // Selecting a date before the current selected start date moves the start date\n // but does not resolve the selection\n if (isBefore(selectedDate, currentSelectionStartDate)) {\n selectionRange.value = [selectedDate, selectedDate]\n return\n }\n\n // Resolve the selection by emitting the value and clearing selection\n context.onChange([currentSelectionStartDate, selectedDate])\n selectionRange.value = null\n }\n\n const handleDateMouseEnter = (hoveredDate: DateTime) => {\n // If we're not actively selecting, no-op\n const currentSelectionRange = selectionRange.value\n if (!currentSelectionRange) {\n return\n }\n\n const [currentStartDate] = currentSelectionRange\n\n // When hovering a date before the current date, don't change the selection range\n if (isBefore(hoveredDate, currentStartDate)) {\n selectionRange.value = [currentStartDate, currentStartDate]\n return\n }\n\n selectionRange.value = [currentStartDate, hoveredDate]\n }\n\n const handleCalendarMouseLeave = () => {\n // If we're not actively selecting, no-op\n const currentSelectionRange = selectionRange.value\n if (!currentSelectionRange) {\n return\n }\n\n // Reset the end selection\n const [currentStartDate] = currentSelectionRange\n selectionRange.value = [currentStartDate, currentStartDate]\n }\n\n // Days are named by their full date; skip calendars that are leaving\n const focusDay = (day: DateTime) => {\n const label = day.toLocaleString(DateTime.DATE_HUGE)\n const buttons = calendarContainerRef.value?.querySelectorAll<HTMLButtonElement>(`button[aria-label=\"${label}\"]`)\n Array.from(buttons ?? [])\n .find((button) => !button.closest(\"[data-exiting]\"))\n ?.focus()\n }\n\n const handleDayKeyDown = (event: KeyboardEvent, day: DateTime) => {\n if (event.altKey || event.ctrlKey || event.metaKey) {\n return\n }\n\n // While a move waits for its month to render, the next key starts from\n // the day it is moving to (key repeat), not the day that still has focus\n const target = getKeyTarget(event.key, pendingFocus ?? day, context.weekStartsOn)\n if (!target) {\n return\n }\n\n event.preventDefault()\n\n // A disabled day (outside min/max, or past maxRangeDays while selecting)\n // keeps focus where it is\n const { min, max, maxRangeDays } = context\n const selection = selectionRange.value\n const rangeEndLimit =\n selection && maxRangeDays != null ? selection[0].plus({ days: maxRangeDays - 1 }) : undefined\n if (\n (min && isBefore(target, min.startOf(\"day\"))) ||\n (max && isAfter(target, max.endOf(\"day\"))) ||\n (rangeEndLimit && isAfter(target, rangeEndLimit))\n ) {\n return\n }\n\n const monthsBefore = monthIndex(leftCalendarDate.value) - monthIndex(target)\n const monthsAfter = monthIndex(target) - monthIndex(rightCalendarDate.value)\n if (monthsBefore <= 0 && monthsAfter <= 0) {\n pendingFocus = null\n focusDay(target)\n return\n }\n\n // Step the view like the month buttons; a day within min/max keeps every step in bounds\n if (monthsAfter > 0 ? !canGoForward() : !canGoBack()) {\n return\n }\n\n pendingFocus = target\n for (let step = 0; step < Math.max(monthsBefore, monthsAfter); step++) {\n if (monthsAfter > 0) {\n handleNext()\n } else {\n handlePrevious()\n }\n }\n }\n\n // Force re-renders when `value` changes out of brand from direct user-selection\n watch(\n () => context.value,\n (value) => {\n // When a new value is received, it could be out of band from the control of this calendar.\n // For example, a shortcut could be selected, or clear could be pressed. In either case, selection\n // should be reset so that the new `value` can be displayed fully.\n selectionRange.value = null\n\n // Nothing else to do when value is empty\n if (!value) {\n return\n }\n\n // Check if `value` is still within view of our calendar\n const viewInterval = Interval.fromDateTimes(\n leftCalendarDate.value.startOf(\"month\"),\n rightCalendarDate.value.endOf(\"month\"),\n )\n const isValueInRangeOfCalendar = viewInterval.contains(value[0]) || viewInterval.contains(value[1])\n if (!isValueInRangeOfCalendar) {\n // Reset state the calendar view entirely\n selectionRange.value = null\n calendarSteps.value = 0\n leftCalendarDate.value = isSmallUp.value ? getLeftCalendarDate(value[0], context.max) : value[0]\n forceRenderIncrement.value += 1\n }\n },\n )\n\n // Detect height changes when new calendars are rendered\n const measureHeight = () => {\n waitForAnimationFrame(() => {\n const container = calendarContainerRef.value\n\n if (!container) {\n return\n }\n\n let maxHeight = -Infinity\n\n // Find the tallest calendar\n container.querySelectorAll<HTMLElement>(\"[data-calendar]\")?.forEach((element) => {\n // NOTE: clientHeight does not respect the scale() that popover uses to animate in, which is what we want\n // We want to know the full height of the element, without any transform applied.\n const height = element.clientHeight\n\n // Ignore calendars that are exiting\n if (element.closest(\"[data-exiting]\")) {\n return\n }\n\n if (height > maxHeight) {\n maxHeight = height\n }\n })\n\n container.style.height = `${maxHeight}px`\n\n // Don't animate the initial height.\n // This is relevant when the calendar opens to a larger size than the default.\n if (!container.style.transition) {\n waitForAnimationFrame(() => {\n container.style.transition = `height 0.25s var(--cubic-move)`\n })\n }\n })\n }\n onMounted(measureHeight)\n watch(leftCalendarDate, measureHeight, { flush: \"post\" })\n\n // Focus a pending day once its month has rendered. TransitionGroup marks\n // the leaving calendar after this render, so wait a frame like the height does\n watch(\n leftCalendarDate,\n (_date, _previous, onCleanup) => {\n if (!pendingFocus) {\n return\n }\n\n onCleanup(\n waitForAnimationFrame(() => {\n const target = pendingFocus\n pendingFocus = null\n if (target) {\n focusDay(target)\n }\n }),\n )\n },\n { flush: \"post\" },\n )\n\n const setContainer = (el: unknown) => {\n calendarContainerRef.value = (el as HTMLDivElement | null) ?? null\n }\n\n return () => {\n const { value, min, max, maxRangeDays } = context\n const left = leftCalendarDate.value\n const right = rightCalendarDate.value\n const selection = selectionRange.value\n const selectedDisplayValue = selection || value\n const viewProps = {\n selectedDates: selectedDisplayValue,\n min,\n max,\n selectionStart: selection?.[0],\n maxRangeDays,\n isSelecting: !!selection,\n onDateSelect: handleDateSelect,\n onDateMouseEnter: handleDateMouseEnter,\n onDayKeyDown: handleDayKeyDown,\n }\n\n return h(\"div\", { key: `stable-view-${forceRenderIncrement.value}`, class: s.CalendarWrapper }, [\n h(\"div\", { ref: setContainer, class: s.CalendarContainer, onMouseleave: handleCalendarMouseLeave }, [\n h(\"div\", { class: s.Previous }, [\n h(\n Button,\n {\n \"variant\": \"ghost\",\n \"color\": \"secondary\",\n \"size\": \"sm\",\n \"pill\": false,\n \"gutterSize\": \"2xs\",\n \"iconSize\": \"sm\",\n \"onClick\": handlePrevious,\n \"disabled\": !canGoBack(),\n \"aria-label\": \"Previous month\",\n },\n { default: () => [h(ChevronLeft)] },\n ),\n ]),\n h(\"div\", { class: s.Next }, [\n h(\n Button,\n {\n \"variant\": \"ghost\",\n \"color\": \"secondary\",\n \"size\": \"sm\",\n \"pill\": false,\n \"gutterSize\": \"2xs\",\n \"iconSize\": \"sm\",\n \"onClick\": handleNext,\n \"disabled\": !canGoForward(),\n \"aria-label\": \"Next month\",\n },\n { default: () => [h(ChevronRight)] },\n ),\n ]),\n h(\n \"div\",\n {\n class: s.CalendarRange,\n style: { transform: `translate(calc(${calendarSteps.value * -1} * var(--calendar-step)), 0)` },\n },\n [\n h(\n TransitionGroup,\n { enterDuration: 400, exitDuration: 400 },\n {\n default: () => [\n h(CalendarView, {\n key: left.toLocaleString({ month: \"long\", year: \"numeric\" }),\n stepPosition: calendarSteps.value,\n date: left,\n ...viewProps,\n }),\n isSmallUp.value\n ? h(CalendarView, {\n key: right.toLocaleString({ month: \"long\", year: \"numeric\" }),\n stepPosition: calendarSteps.value + 1,\n date: right,\n ...viewProps,\n })\n : createCommentVNode(),\n ],\n },\n ),\n ],\n ),\n ]),\n ])\n }\n },\n})\n\nconst daysOfTheWeekLabels = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"]\n\nconst CalendarView = defineComponent({\n name: \"DateRangeCalendarView\",\n props: {\n // Can be any day within the given month that the calendar should render for\n date: { type: Object as PropType<DateTime>, required: true },\n selectedDates: { type: Array as unknown as PropType<DateRange | null>, default: undefined },\n onDateSelect: Function as PropType<(dt: DateTime) => void>,\n onDateMouseEnter: Function as PropType<(dt: DateTime) => void>,\n onDayKeyDown: Function as PropType<(event: KeyboardEvent, dt: DateTime) => void>,\n min: Object as PropType<DateTime>,\n max: Object as PropType<DateTime>,\n selectionStart: { type: Object as PropType<DateTime | null>, default: undefined },\n maxRangeDays: Number,\n isSelecting: Boolean,\n stepPosition: { type: Number, required: true },\n },\n setup(props) {\n const context = useDateRangeContext()\n // Lock position on mount and don't respond to changes\n const position = props.stepPosition\n const view = computed(() => {\n const { date, min, max } = props\n const { weekStartsOn } = context\n const monthStart = date.startOf(\"month\")\n const endOfMonth = date.endOf(\"month\")\n\n const daysBeforeMonthStart = weekPosition(monthStart, weekStartsOn)\n const blankDays = new Array(daysBeforeMonthStart).fill(null)\n const daysInMonth = getDaysOfMonth(monthStart)\n const calendarCells = [...blankDays, ...daysInMonth]\n\n // Cells are start-of-day values and Interval excludes its end, so widen the\n // bounds to whole days: min/max days themselves stay selectable.\n const enabledDateInterval = Interval.fromDateTimes(\n (min || monthStart).startOf(\"day\"),\n (max || endOfMonth).endOf(\"day\"),\n )\n\n return {\n startOfMonth: monthStart,\n endOfMonth,\n weeks: chunkIntoWeeks(calendarCells, 7) as Array<Array<DateTime | null>>,\n enabledInterval: enabledDateInterval,\n }\n })\n\n const selectedInterval = computed<Interval | null>(() => {\n const [selectedStart, selectedEnd] = props.selectedDates || []\n if (!selectedStart || !selectedEnd) {\n return null\n }\n\n return Interval.fromDateTimes(selectedStart.startOf(\"day\"), selectedEnd.endOf(\"day\"))\n })\n\n return () => {\n const { startOfMonth, weeks, enabledInterval } = view.value\n const { selectionStart, maxRangeDays, isSelecting } = props\n const [selectedStart, selectedEnd] = props.selectedDates || []\n const rangeEndLimit =\n selectionStart && maxRangeDays != null ? selectionStart.plus({ days: maxRangeDays - 1 }) : undefined\n\n const { weekStartsOn } = context\n const dayLabels = [...daysOfTheWeekLabels.slice(weekStartsOn), ...daysOfTheWeekLabels.slice(0, weekStartsOn)]\n return h(\"div\", { \"class\": s.Calendar, \"style\": { left: `calc(${position} * var(--calendar-step))` }, \"data-calendar\": true }, [\n h(\"p\", { class: s.MonthLabel }, [startOfMonth.monthLong, \" \", String(startOfMonth.year)]),\n h(\n \"div\",\n { class: s.Week },\n dayLabels.map((day) => h(\"div\", { key: day, class: s.DayLabel }, day)),\n ),\n ...weeks.map((week, weekIndex) =>\n h(\n \"div\",\n { class: s.Week, key: weekIndex },\n week.map((d, dayIndex) => {\n if (!d) {\n return h(\"div\", { class: s.Day, key: `${weekIndex}-${dayIndex}` })\n }\n\n // Check if 'day' is within selected range\n const enabled = enabledInterval.contains(d) && !(isSelecting && rangeEndLimit && isAfter(d, rangeEndLimit))\n const isStart = enabled && selectedStart && isSameDay(d, selectedStart)\n const isEnd = enabled && selectedEnd && isSameDay(d, selectedEnd)\n const hasRange = selectedStart && selectedEnd && !isSameDay(selectedStart, selectedEnd)\n const isInRange = hasRange && selectedInterval.value?.contains(d)\n const dayIsToday = isToday(d)\n const isFirstRangeTrail =\n d.day === 1 &&\n // Trail doesn't make sense to display at the start of the week\n weekPosition(d, weekStartsOn) !== 0 &&\n isInRange &&\n !isStart\n const isLastRangeTrail =\n d.day === d.daysInMonth &&\n // Trail doesn't make sense to display at the end of the week\n weekPosition(d, weekStartsOn) !== 6 &&\n isInRange &&\n !isEnd\n\n return h(\n \"div\",\n {\n \"class\": s.Day,\n \"key\": dayIndex,\n \"data-is-start\": isStart ? \"\" : undefined,\n \"data-is-end\": isEnd ? \"\" : undefined,\n \"data-is-in-range\": isInRange ? \"\" : undefined,\n \"data-is-first-range-trail\": isFirstRangeTrail ? \"\" : undefined,\n \"data-is-last-range-trail\": isLastRangeTrail ? \"\" : undefined,\n },\n [\n // The full date names the day, which \"15\" alone does not across months\n h(\n \"button\",\n {\n \"class\": s.InteractiveDay,\n \"disabled\": !enabled,\n \"aria-label\": d.toLocaleString(DateTime.DATE_HUGE),\n \"aria-pressed\": isStart || isEnd || isInRange ? \"true\" : \"false\",\n \"aria-current\": dayIsToday ? \"date\" : undefined,\n \"onClick\": () => d && props.onDateSelect?.(d),\n \"onMouseenter\": () => d && props.onDateMouseEnter?.(d),\n \"onKeydown\": (event: KeyboardEvent) => d && props.onDayKeyDown?.(event, d),\n },\n [String(d.day), dayIsToday ? h(\"span\", { class: s.TodayDot }) : null],\n ),\n ],\n )\n }),\n ),\n ),\n ])\n }\n },\n})\n\nexport const DateRangeShortcuts = defineComponent({\n name: \"DateRangeShortcuts\",\n props: {\n shortcuts: Array as PropType<DateRangeShortcut[]>,\n },\n setup(props) {\n const isMediumUp = useBreakpoint(\"md\")\n const context = useDateRangeContext()\n\n return () => {\n const { shortcuts } = props\n if (!isMediumUp.value || !shortcuts?.length) {\n return null\n }\n\n const { value, min, max, maxRangeDays, onChange } = context\n\n return h(\n \"div\",\n { class: s.Shortcuts },\n shortcuts.map((shortcut) => {\n const { label, getDateRange } = shortcut\n const range = getDateRange()\n const [start, end] = range\n const isActive = !!value && isSameDay(value[0], start) && isSameDay(value[1], end)\n\n return h(\n Button,\n {\n key: label,\n class: \"mb-1\",\n variant: \"ghost\",\n color: \"primary\",\n pill: false,\n size: \"md\",\n iconSize: \"sm\",\n block: true,\n selected: isActive,\n disabled: !isRangeWithinLimits(range, min, max, maxRangeDays),\n onClick: () => onChange(range, shortcut),\n },\n { default: () => [h(\"span\", { class: s.ButtonText }, label), isActive ? h(Check) : null] },\n )\n }),\n )\n }\n },\n})\n\n// A shortcut follows the calendar's limits: whole days from min to max, and\n// no more than maxRangeDays days\nconst isRangeWithinLimits = ([start, end]: DateRange, min?: DateTime, max?: DateTime, maxRangeDays?: number) =>\n !(min && isBefore(start, min.startOf(\"day\"))) &&\n !(max && isAfter(end, max.endOf(\"day\"))) &&\n !(maxRangeDays != null && isAfter(end.startOf(\"day\"), start.startOf(\"day\").plus({ days: maxRangeDays - 1 })))\n\nconst getLeftCalendarDate = (targetDate: DateTime, maxDate?: DateTime) => {\n if (!maxDate) {\n return targetDate\n }\n\n return isBefore(targetDate.endOf(\"month\"), maxDate) ? targetDate : targetDate.minus({ months: 1 })\n}\n"]}
@@ -24,6 +24,8 @@ const DateRangePickerComponent = defineComponent({
24
24
  max: Object,
25
25
  /** Maximum length of the selectable range in days (inclusive). */
26
26
  maxRangeDays: Number,
27
+ /** The day each week starts on, from 0 (Sunday) to 6 (Saturday). @default 0 */
28
+ weekStartsOn: { type: Number, default: 0 },
27
29
  /** Date range shortcuts for quick selection, shown to the left of the calendar. */
28
30
  shortcuts: Array,
29
31
  /** The preferred side of the trigger to render against when open. @default "bottom" */
@@ -87,6 +89,9 @@ const DateRangePickerComponent = defineComponent({
87
89
  get maxRangeDays() {
88
90
  return props.maxRangeDays;
89
91
  },
92
+ get weekStartsOn() {
93
+ return props.weekStartsOn;
94
+ },
90
95
  get triggerStepperUnit() {
91
96
  return props.triggerStepperUnit;
92
97
  },
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangePicker.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/DateRangePicker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DateTime } from \"luxon\"\nimport { computed, defineComponent, h, provide, toRaw, type PropType } from \"vue\"\nimport type { ControlSize } from \"@plexui/styles/types\"\nimport { isAfter } from \"../../lib/dateUtils.js\"\nimport { Popover, PopoverContent, PopoverTrigger, type PopoverAlign, type PopoverSide } from \"../Popover/index.js\"\nimport type { DropdownIconType } from \"../SelectControl/index.js\"\nimport { DateRangeCalendar, DateRangeShortcuts } from \"./Calendar.js\"\nimport { DateRangeContextKey, type DateRangeContextValue } from \"./context.js\"\nimport { DateRangeTrigger } from \"./Trigger.js\"\nimport { type DateRange, type DateRangeShortcut } from \"./types.js\"\n\n// Vue port of packages/ui/src/components/DateRangePicker/DateRangePicker.tsx.\n// - `value` + `update:value` (`v-model:value`), plus `change`, which also\n// carries the selected shortcut like React's `onChange(range, shortcut)`.\n// Like React the picker is controlled: a parent that does not update\n// `value` keeps the shown range.\n// - DateTime values are read unwrapped (`toRaw`), so a `ref()` holding a\n// range (a deep reactive proxy) works like a plain value.\n\nconst DateRangePickerComponent = defineComponent({\n name: \"DateRangePicker\",\n inheritAttrs: false,\n props: {\n /** The selected date range value (`v-model:value`). */\n value: { type: Array as unknown as PropType<DateRange | null>, default: null },\n /** Defines the earliest selectable date (inclusive). */\n min: Object as PropType<DateTime>,\n /** Defines the latest selectable date (inclusive). */\n max: Object as PropType<DateTime>,\n /** Maximum length of the selectable range in days (inclusive). */\n maxRangeDays: Number,\n /** Date range shortcuts for quick selection, shown to the left of the calendar. */\n shortcuts: Array as PropType<DateRangeShortcut[]>,\n /** The preferred side of the trigger to render against when open. @default \"bottom\" */\n side: { type: String as PropType<PopoverSide>, default: \"bottom\" },\n /** The distance in pixels from the trigger. @default 8 */\n sideOffset: { type: Number, default: 8 },\n /** The preferred alignment against the trigger. @default \"center\" */\n align: { type: String as PropType<PopoverAlign>, default: \"center\" },\n /** An offset in pixels from the \"start\" or \"end\" alignment options. @default 0 */\n alignOffset: Number,\n /** Disables the select visually and from interactions. @default false */\n disabled: { type: Boolean, default: false },\n /** Placeholder text for the select. @default \"Select date range...\" */\n placeholder: { type: String, default: \"Select date range...\" },\n /** Style variant for the select trigger. @default \"outline\" */\n variant: { type: String as PropType<\"soft\" | \"outline\" | \"ghost\">, default: \"outline\" },\n /** Determines if the select trigger should be a fully rounded pill shape. @default true */\n pill: { type: Boolean, default: true },\n /** Size of the control: `3xs` 22px up to `3xl` 48px. @default \"md\" */\n size: { type: String as PropType<ControlSize>, default: \"md\" },\n /** Icon displayed in the far right of the select trigger. @default \"dropdown\" */\n dropdownIconType: String as PropType<DropdownIconType>,\n /** Custom class applied to the select trigger */\n triggerClassName: String,\n /** Display calendar icon at the start of the trigger. @default true */\n triggerShowIcon: { type: Boolean, default: true },\n /** Shows a stepper in the trigger when the selected range matches the unit ('month'). */\n triggerStepperUnit: String as PropType<\"month\">,\n /** Format of dates displayed in the trigger. @default \"MM/dd/yy\" */\n triggerDateFormat: { type: String, default: \"MM/dd/yy\" },\n /** Display a clear action that allows the select to be unset. @default false */\n clearable: { type: Boolean, default: false },\n /** Extends select to 100% of available width. @default false */\n block: { type: Boolean, default: false },\n },\n emits: {\n \"update:value\": (_nextValue: DateRange | null) => true,\n \"change\": (_nextValue: DateRange | null, _shortcut?: DateRangeShortcut) => true,\n },\n setup(props, { emit }) {\n const unwrap = <T>(value: T): T => (value ? toRaw(value) : value)\n\n // A new range only when `value` or one of its endpoints changes, as the\n // identity React's effects see. The endpoints are read through the array\n // so that `range.value[0] = date` on a `ref()` range is tracked.\n const value = computed<DateRange | null>(() => {\n const range = props.value\n if (!range) return null\n return [toRaw(range[0]), toRaw(range[1])]\n })\n\n const store: DateRangeContextValue = {\n get value() {\n return value.value\n },\n get min() {\n return unwrap(props.min)\n },\n get max() {\n return unwrap(props.max)\n },\n get maxRangeDays() {\n return props.maxRangeDays\n },\n get triggerStepperUnit() {\n return props.triggerStepperUnit\n },\n get triggerClassName() {\n return props.triggerClassName\n },\n get triggerShowIcon() {\n return props.triggerShowIcon\n },\n get triggerDateFormat() {\n return props.triggerDateFormat\n },\n get disabled() {\n return props.disabled\n },\n get variant() {\n return props.variant\n },\n get pill() {\n return props.pill\n },\n get block() {\n return props.block\n },\n get size() {\n return props.size\n },\n get dropdownIconType() {\n return props.dropdownIconType\n },\n get clearable() {\n return props.clearable\n },\n get placeholder() {\n return props.placeholder\n },\n get shortcuts() {\n return props.shortcuts\n },\n onChange: (nextValue, shortcut) => {\n emit(\"update:value\", nextValue)\n emit(\"change\", nextValue, shortcut)\n },\n }\n provide(DateRangeContextKey, store)\n\n return () => {\n const { min, max } = store\n const { align } = props\n\n // min and max are inclusive, so equal bounds allow one date\n if (min && max && isAfter(min, max)) {\n throw new Error(\"DateRangePicker error: `min` date must not be after the `max` date\")\n }\n\n return h(Popover, null, {\n default: () => [\n h(PopoverTrigger, null, { default: () => [h(DateRangeTrigger)] }),\n h(\n PopoverContent,\n {\n minWidth: 230,\n side: props.side,\n sideOffset: props.sideOffset,\n align,\n alignOffset: props.alignOffset ?? (align === \"center\" ? 0 : -5),\n },\n {\n default: () => [\n h(\"div\", { class: \"flex\" }, [h(DateRangeShortcuts, { shortcuts: props.shortcuts }), h(DateRangeCalendar)]),\n ],\n },\n ),\n ],\n })\n }\n },\n})\n\nexport type DateRangePickerProps = InstanceType<typeof DateRangePickerComponent>[\"$props\"]\n\n/**\n * A date range picker: a SelectControl trigger (or a month stepper) opening\n * two calendars and optional shortcuts in a popover. Bind the range\n * (`[start, end]` luxon `DateTime`s) with `v-model:value`.\n */\nexport const DateRangePicker = DateRangePickerComponent\n"]}
1
+ {"version":3,"file":"DateRangePicker.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/DateRangePicker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DateTime } from \"luxon\"\nimport { computed, defineComponent, h, provide, toRaw, type PropType } from \"vue\"\nimport type { ControlSize } from \"@plexui/styles/types\"\nimport { isAfter } from \"../../lib/dateUtils.js\"\nimport { Popover, PopoverContent, PopoverTrigger, type PopoverAlign, type PopoverSide } from \"../Popover/index.js\"\nimport type { DropdownIconType } from \"../SelectControl/index.js\"\nimport { DateRangeCalendar, DateRangeShortcuts } from \"./Calendar.js\"\nimport { DateRangeContextKey, type DateRangeContextValue } from \"./context.js\"\nimport { DateRangeTrigger } from \"./Trigger.js\"\nimport { type DateRange, type DateRangeShortcut, type WeekStart } from \"./types.js\"\n\n// Vue port of packages/ui/src/components/DateRangePicker/DateRangePicker.tsx.\n// - `value` + `update:value` (`v-model:value`), plus `change`, which also\n// carries the selected shortcut like React's `onChange(range, shortcut)`.\n// Like React the picker is controlled: a parent that does not update\n// `value` keeps the shown range.\n// - DateTime values are read unwrapped (`toRaw`), so a `ref()` holding a\n// range (a deep reactive proxy) works like a plain value.\n\nconst DateRangePickerComponent = defineComponent({\n name: \"DateRangePicker\",\n inheritAttrs: false,\n props: {\n /** The selected date range value (`v-model:value`). */\n value: { type: Array as unknown as PropType<DateRange | null>, default: null },\n /** Defines the earliest selectable date (inclusive). */\n min: Object as PropType<DateTime>,\n /** Defines the latest selectable date (inclusive). */\n max: Object as PropType<DateTime>,\n /** Maximum length of the selectable range in days (inclusive). */\n maxRangeDays: Number,\n /** The day each week starts on, from 0 (Sunday) to 6 (Saturday). @default 0 */\n weekStartsOn: { type: Number as PropType<WeekStart>, default: 0 },\n /** Date range shortcuts for quick selection, shown to the left of the calendar. */\n shortcuts: Array as PropType<DateRangeShortcut[]>,\n /** The preferred side of the trigger to render against when open. @default \"bottom\" */\n side: { type: String as PropType<PopoverSide>, default: \"bottom\" },\n /** The distance in pixels from the trigger. @default 8 */\n sideOffset: { type: Number, default: 8 },\n /** The preferred alignment against the trigger. @default \"center\" */\n align: { type: String as PropType<PopoverAlign>, default: \"center\" },\n /** An offset in pixels from the \"start\" or \"end\" alignment options. @default 0 */\n alignOffset: Number,\n /** Disables the select visually and from interactions. @default false */\n disabled: { type: Boolean, default: false },\n /** Placeholder text for the select. @default \"Select date range...\" */\n placeholder: { type: String, default: \"Select date range...\" },\n /** Style variant for the select trigger. @default \"outline\" */\n variant: { type: String as PropType<\"soft\" | \"outline\" | \"ghost\">, default: \"outline\" },\n /** Determines if the select trigger should be a fully rounded pill shape. @default true */\n pill: { type: Boolean, default: true },\n /** Size of the control: `3xs` 22px up to `3xl` 48px. @default \"md\" */\n size: { type: String as PropType<ControlSize>, default: \"md\" },\n /** Icon displayed in the far right of the select trigger. @default \"dropdown\" */\n dropdownIconType: String as PropType<DropdownIconType>,\n /** Custom class applied to the select trigger */\n triggerClassName: String,\n /** Display calendar icon at the start of the trigger. @default true */\n triggerShowIcon: { type: Boolean, default: true },\n /** Shows a stepper in the trigger when the selected range matches the unit ('month'). */\n triggerStepperUnit: String as PropType<\"month\">,\n /** Format of dates displayed in the trigger. @default \"MM/dd/yy\" */\n triggerDateFormat: { type: String, default: \"MM/dd/yy\" },\n /** Display a clear action that allows the select to be unset. @default false */\n clearable: { type: Boolean, default: false },\n /** Extends select to 100% of available width. @default false */\n block: { type: Boolean, default: false },\n },\n emits: {\n \"update:value\": (_nextValue: DateRange | null) => true,\n \"change\": (_nextValue: DateRange | null, _shortcut?: DateRangeShortcut) => true,\n },\n setup(props, { emit }) {\n const unwrap = <T>(value: T): T => (value ? toRaw(value) : value)\n\n // A new range only when `value` or one of its endpoints changes, as the\n // identity React's effects see. The endpoints are read through the array\n // so that `range.value[0] = date` on a `ref()` range is tracked.\n const value = computed<DateRange | null>(() => {\n const range = props.value\n if (!range) return null\n return [toRaw(range[0]), toRaw(range[1])]\n })\n\n const store: DateRangeContextValue = {\n get value() {\n return value.value\n },\n get min() {\n return unwrap(props.min)\n },\n get max() {\n return unwrap(props.max)\n },\n get maxRangeDays() {\n return props.maxRangeDays\n },\n get weekStartsOn() {\n return props.weekStartsOn\n },\n get triggerStepperUnit() {\n return props.triggerStepperUnit\n },\n get triggerClassName() {\n return props.triggerClassName\n },\n get triggerShowIcon() {\n return props.triggerShowIcon\n },\n get triggerDateFormat() {\n return props.triggerDateFormat\n },\n get disabled() {\n return props.disabled\n },\n get variant() {\n return props.variant\n },\n get pill() {\n return props.pill\n },\n get block() {\n return props.block\n },\n get size() {\n return props.size\n },\n get dropdownIconType() {\n return props.dropdownIconType\n },\n get clearable() {\n return props.clearable\n },\n get placeholder() {\n return props.placeholder\n },\n get shortcuts() {\n return props.shortcuts\n },\n onChange: (nextValue, shortcut) => {\n emit(\"update:value\", nextValue)\n emit(\"change\", nextValue, shortcut)\n },\n }\n provide(DateRangeContextKey, store)\n\n return () => {\n const { min, max } = store\n const { align } = props\n\n // min and max are inclusive, so equal bounds allow one date\n if (min && max && isAfter(min, max)) {\n throw new Error(\"DateRangePicker error: `min` date must not be after the `max` date\")\n }\n\n return h(Popover, null, {\n default: () => [\n h(PopoverTrigger, null, { default: () => [h(DateRangeTrigger)] }),\n h(\n PopoverContent,\n {\n minWidth: 230,\n side: props.side,\n sideOffset: props.sideOffset,\n align,\n alignOffset: props.alignOffset ?? (align === \"center\" ? 0 : -5),\n },\n {\n default: () => [\n h(\"div\", { class: \"flex\" }, [h(DateRangeShortcuts, { shortcuts: props.shortcuts }), h(DateRangeCalendar)]),\n ],\n },\n ),\n ],\n })\n }\n },\n})\n\nexport type DateRangePickerProps = InstanceType<typeof DateRangePickerComponent>[\"$props\"]\n\n/**\n * A date range picker: a SelectControl trigger (or a month stepper) opening\n * two calendars and optional shortcuts in a popover. Bind the range\n * (`[start, end]` luxon `DateTime`s) with `v-model:value`.\n */\nexport const DateRangePicker = DateRangePickerComponent\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAqB,MAAM,KAAK,CAAA;AA+B/C,MAAM,CAAC,MAAM,mBAAmB,GAAwC,MAAM,CAAC,uBAAuB,CAAC,CAAA;AAEvG,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAA;IAEjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAChF,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA","sourcesContent":["import type { DateTime } from \"luxon\"\nimport { inject, type InjectionKey } from \"vue\"\nimport type { ControlSize } from \"@plexui/styles/types\"\nimport type { DropdownIconType } from \"../SelectControl/index.js\"\nimport type { DateRange, DateRangeShortcut } from \"./types.js\"\n\n// Vue port of packages/ui/src/components/DateRangePicker/context.tsx. The\n// values are getters over DateRangePicker's props (read them in render,\n// computed or watch to track them); React's `onChangeRef` is a plain\n// function here, as Vue props and emits are always current.\n\nexport type DateRangeContextValue = {\n readonly value: DateRange | null\n readonly min?: DateTime\n readonly max?: DateTime\n readonly maxRangeDays?: number\n readonly triggerStepperUnit?: \"month\"\n readonly triggerClassName?: string\n readonly triggerShowIcon?: boolean\n readonly triggerDateFormat: string\n readonly disabled: boolean\n readonly variant?: \"soft\" | \"outline\" | \"ghost\"\n readonly pill: boolean\n readonly block: boolean\n readonly size?: ControlSize\n readonly dropdownIconType?: DropdownIconType\n readonly clearable: boolean\n readonly placeholder: string\n readonly shortcuts?: DateRangeShortcut[]\n onChange: (nextValue: DateRange | null, shortcut?: DateRangeShortcut) => void\n}\n\nexport const DateRangeContextKey: InjectionKey<DateRangeContextValue> = Symbol(\"PlexUIDateRangePicker\")\n\nexport const useDateRangeContext = () => {\n const context = inject(DateRangeContextKey, null)\n\n if (!context) {\n throw new Error(\"DateRange components must be wrapped in <DateRangePicker />\")\n }\n\n return context\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAqB,MAAM,KAAK,CAAA;AAgC/C,MAAM,CAAC,MAAM,mBAAmB,GAAwC,MAAM,CAAC,uBAAuB,CAAC,CAAA;AAEvG,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAA;IAEjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAChF,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA","sourcesContent":["import type { DateTime } from \"luxon\"\nimport { inject, type InjectionKey } from \"vue\"\nimport type { ControlSize } from \"@plexui/styles/types\"\nimport type { DropdownIconType } from \"../SelectControl/index.js\"\nimport type { DateRange, DateRangeShortcut, WeekStart } from \"./types.js\"\n\n// Vue port of packages/ui/src/components/DateRangePicker/context.tsx. The\n// values are getters over DateRangePicker's props (read them in render,\n// computed or watch to track them); React's `onChangeRef` is a plain\n// function here, as Vue props and emits are always current.\n\nexport type DateRangeContextValue = {\n readonly value: DateRange | null\n readonly min?: DateTime\n readonly max?: DateTime\n readonly maxRangeDays?: number\n readonly weekStartsOn: WeekStart\n readonly triggerStepperUnit?: \"month\"\n readonly triggerClassName?: string\n readonly triggerShowIcon?: boolean\n readonly triggerDateFormat: string\n readonly disabled: boolean\n readonly variant?: \"soft\" | \"outline\" | \"ghost\"\n readonly pill: boolean\n readonly block: boolean\n readonly size?: ControlSize\n readonly dropdownIconType?: DropdownIconType\n readonly clearable: boolean\n readonly placeholder: string\n readonly shortcuts?: DateRangeShortcut[]\n onChange: (nextValue: DateRange | null, shortcut?: DateRangeShortcut) => void\n}\n\nexport const DateRangeContextKey: InjectionKey<DateRangeContextValue> = Symbol(\"PlexUIDateRangePicker\")\n\nexport const useDateRangeContext = () => {\n const context = inject(DateRangeContextKey, null)\n\n if (!context) {\n throw new Error(\"DateRange components must be wrapped in <DateRangePicker />\")\n }\n\n return context\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA6B,MAAM,sBAAsB,CAAA;AAEjF,OAAO,EAA0C,MAAM,YAAY,CAAA","sourcesContent":["export { DateRangePicker, type DateRangePickerProps } from \"./DateRangePicker.js\"\n\nexport { type DateRange, type DateRangeShortcut } from \"./types.js\"\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA6B,MAAM,sBAAsB,CAAA;AAEjF,OAAO,EAA0D,MAAM,YAAY,CAAA","sourcesContent":["export { DateRangePicker, type DateRangePickerProps } from \"./DateRangePicker.js\"\n\nexport { type DateRange, type DateRangeShortcut, type WeekStart } from \"./types.js\"\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,OAAO,CAAA","sourcesContent":["import { type DateTime } from \"luxon\"\n\nexport type DateRange = [DateTime, DateTime]\nexport type DateRangeShortcut = {\n label: string\n getDateRange: () => DateRange\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,OAAO,CAAA","sourcesContent":["import { type DateTime } from \"luxon\"\n\nexport type DateRange = [DateTime, DateTime]\n/** The day a week starts on: 0 is Sunday, 6 is Saturday. */\nexport type WeekStart = 0 | 1 | 2 | 3 | 4 | 5 | 6\nexport type DateRangeShortcut = {\n label: string\n getDateRange: () => DateRange\n}\n"]}
@@ -1,10 +1,11 @@
1
1
  import { cloneVNode, computed, createCommentVNode, defineComponent, h, inject, onBeforeUnmount, onMounted, provide, ref, watch, } from "vue";
2
2
  import { DialogContent as RekaDialogContent, DialogDescription as RekaDialogDescription, DialogOverlay as RekaDialogOverlay, DialogPortal as RekaDialogPortal, DialogRoot as RekaDialogRoot, DialogTitle as RekaDialogTitle, injectDialogRootContext, useForwardExpose, useId, } from "reka-ui";
3
3
  import { useEscCloseStack } from "../../composables/useEscCloseStack.js";
4
- import { preventDefaultHandler, toCssVariables } from "../../lib/helpers.js";
4
+ import { keepMovedFocus, preventDefaultHandler, toCssVariables } from "../../lib/helpers.js";
5
5
  import { dismissableSurfaces, useDeferredPointerDownOutside } from "../Popover/deferredPointerDownOutside.js";
6
6
  import { firstElementChild } from "../Tooltip/slot.js";
7
7
  import { TransitionGroup } from "../Transition/index.js";
8
+ import { overlayTiming, overlayTimingLarge } from "../Transition/shared.js";
8
9
  import s from "@plexui/styles/components/Dialog/Dialog.module.css";
9
10
  const DialogContextKey = Symbol("PlexUIDialog");
10
11
  const useDialogContext = () => {
@@ -108,9 +109,32 @@ export const DialogContent = defineComponent({
108
109
  },
109
110
  setup(props, { slots, attrs }) {
110
111
  const { open, setOpen, titleCount, descriptionCount } = useDialogContext();
112
+ const rootContext = injectDialogRootContext();
111
113
  // Radix's root makes the content id; Reka's trigger does, so a dialog
112
114
  // without one would render `id=""`
113
- injectDialogRootContext().contentId ||= useId(undefined, "reka-dialog-content");
115
+ rootContext.contentId ||= useId(undefined, "reka-dialog-content");
116
+ // Force-mounted content refocuses Reka's trigger the moment it closes.
117
+ // Focus waits for the exit, as in Radix: the trigger is held back until
118
+ // the content unmounts, where Reka's own close auto focus uses it.
119
+ let closingTrigger;
120
+ watch(open, (isOpen) => {
121
+ if (isOpen) {
122
+ if (closingTrigger)
123
+ rootContext.triggerElement.value = closingTrigger;
124
+ closingTrigger = undefined;
125
+ }
126
+ else {
127
+ closingTrigger = rootContext.triggerElement.value;
128
+ rootContext.triggerElement.value = undefined;
129
+ }
130
+ }, { flush: "sync" });
131
+ const handleCloseAutoFocus = (event) => {
132
+ props.onCloseAutoFocus?.(event);
133
+ keepMovedFocus(event);
134
+ if (closingTrigger)
135
+ rootContext.triggerElement.value = closingTrigger;
136
+ closingTrigger = undefined;
137
+ };
114
138
  // Escape goes through the shared stack, as in React, so the dialog
115
139
  // closes before overlays opened earlier (a forced-open Tooltip)
116
140
  useEscCloseStack(open, () => {
@@ -138,7 +162,7 @@ export const DialogContent = defineComponent({
138
162
  dismissableSurfaces.add(element);
139
163
  };
140
164
  const renderDialog = () => h("div", { key: "dialog" }, [
141
- h(RekaDialogOverlay, { class: s.Overlay, ref: setOverlayRef }),
165
+ h(RekaDialogOverlay, { class: s.Overlay, forceMount: true, ref: setOverlayRef }),
142
166
  h(RekaDialogContent, {
143
167
  "forceMount": true,
144
168
  "class": s.Content,
@@ -147,7 +171,7 @@ export const DialogContent = defineComponent({
147
171
  "data-mobile-placement": props.mobilePlacement,
148
172
  "data-pill": props.pill ? "" : undefined,
149
173
  "onOpenAutoFocus": props.onOpenAutoFocus,
150
- "onCloseAutoFocus": props.onCloseAutoFocus,
174
+ "onCloseAutoFocus": handleCloseAutoFocus,
151
175
  // Radix labels and describes the content only by mounted parts
152
176
  ...(titleCount.value > 0 ? {} : { "aria-labelledby": undefined }),
153
177
  ...(descriptionCount.value > 0 ? {} : { "aria-describedby": undefined }),
@@ -171,13 +195,24 @@ export const DialogContent = defineComponent({
171
195
  ],
172
196
  }),
173
197
  ]);
174
- return () => h(RekaDialogPortal, null, {
175
- default: () => [
176
- h(TransitionGroup, { class: s.Transition, enterDuration: 250, exitDuration: 150, disableAnimations: true },
177
- // `open && <div>` in React: closed still renders the empty wrapper
178
- { default: () => [open.value ? renderDialog() : createCommentVNode()] }),
179
- ],
180
- });
198
+ return () => {
199
+ const { placement, mobilePlacement } = props;
200
+ const crossesScreen = placement === "bottom" || placement === "start" || placement === "end" || mobilePlacement === "bottom";
201
+ return h(RekaDialogPortal, null, {
202
+ default: () => [
203
+ h(TransitionGroup,
204
+ // A dialog mounted open enters too, as `v-if` and `open` together do
205
+ {
206
+ class: s.Transition,
207
+ ...(crossesScreen ? overlayTimingLarge : overlayTiming),
208
+ overlay: true,
209
+ preventInitialTransition: false,
210
+ },
211
+ // `open && <div>` in React: closed still renders the empty wrapper
212
+ { default: () => [open.value ? renderDialog() : createCommentVNode()] }),
213
+ ],
214
+ });
215
+ };
181
216
  },
182
217
  });
183
218
  export const DialogHeader = defineComponent({