@servicetitan/anvil2 1.45.1 → 1.46.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 (171) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/{Calendar-Dq_of5A3.js → Calendar-BQ5F2ENO.js} +1173 -166
  3. package/dist/Calendar-BQ5F2ENO.js.map +1 -0
  4. package/dist/Calendar.css +83 -47
  5. package/dist/Calendar.js +1 -1
  6. package/dist/{Checkbox-3y2d9mBd.js → Checkbox-DDrmVC-u.js} +2 -2
  7. package/dist/{Checkbox-3y2d9mBd.js.map → Checkbox-DDrmVC-u.js.map} +1 -1
  8. package/dist/{Checkbox-BiOzGpgJ.js → Checkbox-Dl4KTwEJ.js} +3 -3
  9. package/dist/{Checkbox-BiOzGpgJ.js.map → Checkbox-Dl4KTwEJ.js.map} +1 -1
  10. package/dist/Checkbox.js +2 -2
  11. package/dist/{useInfiniteCombobox-BN2uGhBh.js → Combobox-B9nesJuc.js} +19 -186
  12. package/dist/Combobox-B9nesJuc.js.map +1 -0
  13. package/dist/Combobox.js +2 -1
  14. package/dist/Combobox.js.map +1 -1
  15. package/dist/{DateField-B2mnasH5.js → DateField-DXxPsRtf.js} +4 -4
  16. package/dist/{DateField-B2mnasH5.js.map → DateField-DXxPsRtf.js.map} +1 -1
  17. package/dist/DateField.js +1 -1
  18. package/dist/{DateFieldRange-DPbyzuHb.js → DateFieldRange-Xauviu1w.js} +34 -28
  19. package/dist/DateFieldRange-Xauviu1w.js.map +1 -0
  20. package/dist/DateFieldRange.js +1 -1
  21. package/dist/{DateFieldSingle-CfAJDcx9.js → DateFieldSingle-yLnwpVzd.js} +27 -27
  22. package/dist/DateFieldSingle-yLnwpVzd.js.map +1 -0
  23. package/dist/DateFieldSingle.js +1 -1
  24. package/dist/{DateFieldYearless-ydxcsmRV.js → DateFieldYearless-Ba7HiTiI.js} +2 -2
  25. package/dist/{DateFieldYearless-ydxcsmRV.js.map → DateFieldYearless-Ba7HiTiI.js.map} +1 -1
  26. package/dist/DateFieldYearless.js +1 -1
  27. package/dist/{DaysOfTheWeek-BYvE9QK5.js → DaysOfTheWeek-BYSYZySH.js} +2 -2
  28. package/dist/{DaysOfTheWeek-BYvE9QK5.js.map → DaysOfTheWeek-BYSYZySH.js.map} +1 -1
  29. package/dist/DaysOfTheWeek.js +1 -1
  30. package/dist/{Dialog-DpH2Qvbd.js → Dialog-CgkrvrQu.js} +2 -2
  31. package/dist/{Dialog-DpH2Qvbd.js.map → Dialog-CgkrvrQu.js.map} +1 -1
  32. package/dist/Dialog.js +1 -1
  33. package/dist/Dnd.js +1 -1
  34. package/dist/DndSort.js +1 -1
  35. package/dist/{Drawer-DI_k6W2k.js → Drawer-CM4ZbAro.js} +2 -2
  36. package/dist/{Drawer-DI_k6W2k.js.map → Drawer-CM4ZbAro.js.map} +1 -1
  37. package/dist/Drawer.js +1 -1
  38. package/dist/{FieldLabel-BfnCXung.js → FieldLabel-BsbTTyom.js} +3 -14
  39. package/dist/FieldLabel-BsbTTyom.js.map +1 -0
  40. package/dist/FieldLabel.js +1 -1
  41. package/dist/{InputMask-O_qi1p_3.js → InputMask-_F139qFu.js} +2 -2
  42. package/dist/{InputMask-O_qi1p_3.js.map → InputMask-_F139qFu.js.map} +1 -1
  43. package/dist/InputMask.js +1 -1
  44. package/dist/{ListView-jR2ZkBB7.js → ListView-pb3rIcze.js} +2 -2
  45. package/dist/{ListView-jR2ZkBB7.js.map → ListView-pb3rIcze.js.map} +1 -1
  46. package/dist/ListView.js +1 -1
  47. package/dist/{NumberField-1_gRsWT4.js → NumberField-CkZZrkYC.js} +5 -5
  48. package/dist/{NumberField-1_gRsWT4.js.map → NumberField-CkZZrkYC.js.map} +1 -1
  49. package/dist/NumberField.js +1 -1
  50. package/dist/{Page-CY6QRlvb.js → Page-cKXkjMmd.js} +2 -2
  51. package/dist/{Page-CY6QRlvb.js.map → Page-cKXkjMmd.js.map} +1 -1
  52. package/dist/Page.js +1 -1
  53. package/dist/{ProgressBar-BnXuQ6Bx.js → ProgressBar-DXcXZEJ2.js} +2 -2
  54. package/dist/{ProgressBar-BnXuQ6Bx.js.map → ProgressBar-DXcXZEJ2.js.map} +1 -1
  55. package/dist/ProgressBar.js +1 -1
  56. package/dist/{Radio-CwmRUIzo.js → Radio-C89VCMXd.js} +2 -2
  57. package/dist/{Radio-CwmRUIzo.js.map → Radio-C89VCMXd.js.map} +1 -1
  58. package/dist/Radio.js +2 -2
  59. package/dist/{RadioGroup-BNCWIHOG.js → RadioGroup-C_4buUtG.js} +2 -2
  60. package/dist/{RadioGroup-BNCWIHOG.js.map → RadioGroup-C_4buUtG.js.map} +1 -1
  61. package/dist/{SearchField-BKXkoWPs.js → SearchField-Bb0uObwG.js} +2 -2
  62. package/dist/{SearchField-BKXkoWPs.js.map → SearchField-Bb0uObwG.js.map} +1 -1
  63. package/dist/SearchField.js +1 -1
  64. package/dist/{SelectCard-DOGCG0zr.js → SelectCard-BTYZg9TG.js} +3 -3
  65. package/dist/{SelectCard-DOGCG0zr.js.map → SelectCard-BTYZg9TG.js.map} +1 -1
  66. package/dist/SelectCard.js +1 -1
  67. package/dist/{SelectTrigger-BMo0e-F7.js → SelectTrigger-f1hvRrSC.js} +2 -2
  68. package/dist/{SelectTrigger-BMo0e-F7.js.map → SelectTrigger-f1hvRrSC.js.map} +1 -1
  69. package/dist/SelectTrigger.js +1 -1
  70. package/dist/{SelectTriggerBase-BMMxnXrw.js → SelectTriggerBase-DP9fmRSo.js} +2 -2
  71. package/dist/{SelectTriggerBase-BMMxnXrw.js.map → SelectTriggerBase-DP9fmRSo.js.map} +1 -1
  72. package/dist/{TextField-CwgE_JJU.js → TextField-BiHxlzE3.js} +2 -2
  73. package/dist/{TextField-CwgE_JJU.js.map → TextField-BiHxlzE3.js.map} +1 -1
  74. package/dist/{TextField-DlsZEkS0.js → TextField-D8fow9j7.js} +2 -2
  75. package/dist/{TextField-DlsZEkS0.js.map → TextField-D8fow9j7.js.map} +1 -1
  76. package/dist/TextField.js +1 -1
  77. package/dist/{Textarea-DU-SpoDL.js → Textarea-BdVJJlbP.js} +2 -2
  78. package/dist/{Textarea-DU-SpoDL.js.map → Textarea-BdVJJlbP.js.map} +1 -1
  79. package/dist/Textarea.js +1 -1
  80. package/dist/{TimeField-CfhyRfX9.js → TimeField-CmbErrsZ.js} +2 -2
  81. package/dist/{TimeField-CfhyRfX9.js.map → TimeField-CmbErrsZ.js.map} +1 -1
  82. package/dist/TimeField.js +1 -1
  83. package/dist/Toast.js +2 -2
  84. package/dist/{Toaster-BgjT0p8b.js → Toaster-9cpG_tWR.js} +2 -2
  85. package/dist/{Toaster-BgjT0p8b.js.map → Toaster-9cpG_tWR.js.map} +1 -1
  86. package/dist/{Toaster-CfC9wod0.js → Toaster-B7zUwJOt.js} +2 -2
  87. package/dist/{Toaster-CfC9wod0.js.map → Toaster-B7zUwJOt.js.map} +1 -1
  88. package/dist/Toolbar-D4zuUFhb.js +2077 -0
  89. package/dist/Toolbar-D4zuUFhb.js.map +1 -0
  90. package/dist/Toolbar.css +139 -28
  91. package/dist/Toolbar.d.ts +3 -3
  92. package/dist/Toolbar.js +1 -1
  93. package/dist/beta/components/Toolbar/Filters/FilterButton.d.ts +30 -0
  94. package/dist/beta/components/Toolbar/Filters/FilterDateRange.d.ts +37 -0
  95. package/dist/beta/components/Toolbar/Filters/FilterDateSingle.d.ts +30 -0
  96. package/dist/beta/components/Toolbar/Filters/FilterDrawer.d.ts +15 -0
  97. package/dist/beta/components/Toolbar/Filters/FilterGroup.d.ts +25 -0
  98. package/dist/beta/components/Toolbar/Filters/FilterItemWrapper.d.ts +24 -0
  99. package/dist/beta/components/Toolbar/Filters/FilterSelect.d.ts +29 -0
  100. package/dist/beta/components/Toolbar/Filters/FilterToggleButton.d.ts +24 -0
  101. package/dist/beta/components/Toolbar/Filters/internal/FilterGroupContext.d.ts +40 -0
  102. package/dist/beta/components/Toolbar/Filters/internal/types.d.ts +130 -0
  103. package/dist/beta/components/Toolbar/Filters/internal/utils/filter-state.d.ts +40 -0
  104. package/dist/beta/components/Toolbar/Filters/internal/utils/test.d.ts +57 -0
  105. package/dist/beta/components/Toolbar/Toolbar.d.ts +302 -0
  106. package/dist/beta/components/Toolbar/ToolbarButton.d.ts +41 -0
  107. package/dist/beta/components/Toolbar/ToolbarButtonLink.d.ts +43 -0
  108. package/dist/beta/components/Toolbar/ToolbarButtonToggle.d.ts +42 -0
  109. package/dist/beta/components/Toolbar/ToolbarControlGroup.d.ts +20 -0
  110. package/dist/beta/components/Toolbar/ToolbarSearchField.d.ts +20 -0
  111. package/dist/beta/components/Toolbar/ToolbarSelect.d.ts +108 -0
  112. package/dist/beta/components/Toolbar/index.d.ts +9 -0
  113. package/dist/beta/components/Toolbar/internal/ToolbarItemOverflowContext.d.ts +19 -0
  114. package/dist/beta/components/Toolbar/internal/ToolbarItemWrapper.d.ts +40 -0
  115. package/dist/beta/components/Toolbar/internal/ToolbarOverflowContext.d.ts +35 -0
  116. package/dist/beta/components/Toolbar/internal/ToolbarOverflowMenu.d.ts +29 -0
  117. package/dist/beta/components/Toolbar/internal/utils/accessibility.d.ts +26 -0
  118. package/dist/beta/components/Toolbar/internal/utils/test.d.ts +29 -0
  119. package/dist/beta/components/Toolbar/types.d.ts +50 -0
  120. package/dist/beta/components/index.d.ts +1 -0
  121. package/dist/beta/index.d.ts +1 -0
  122. package/dist/beta.d.ts +2 -0
  123. package/dist/beta.js +2 -0
  124. package/dist/beta.js.map +1 -0
  125. package/dist/components/Combobox/ComboboxTypes.d.ts +8 -0
  126. package/dist/components/DateFieldRange/DateFieldRange.d.ts +2 -2
  127. package/dist/components/DateFieldRange/internal/DateFieldRangeCalendar.d.ts +1 -1
  128. package/dist/components/DateFieldRange/internal/useDateFieldRangeState.d.ts +2 -7
  129. package/dist/components/DateFieldSingle/DateFieldSingle.d.ts +2 -2
  130. package/dist/components/DateFieldSingle/internal/useDateFieldSingleState.d.ts +2 -7
  131. package/dist/components/Dialog/index.d.ts +1 -1
  132. package/dist/components/NumberField/NumberField.d.ts +4 -4
  133. package/dist/{indeterminate_check_box-Bg24oeHy.js → indeterminate_check_box-RY9zr3xS.js} +17 -17
  134. package/dist/{indeterminate_check_box-Bg24oeHy.js.map → indeterminate_check_box-RY9zr3xS.js.map} +1 -1
  135. package/dist/indeterminate_check_box.css +72 -66
  136. package/dist/{index-CqdP5W00.js → index-V5Ez2gq_.js} +2 -2
  137. package/dist/{index-CqdP5W00.js.map → index-V5Ez2gq_.js.map} +1 -1
  138. package/dist/index.css +125 -26
  139. package/dist/index.js +773 -41
  140. package/dist/index.js.map +1 -1
  141. package/dist/index2.css +88 -105
  142. package/dist/internal/components/YearSelector/YearSelector.d.ts +67 -0
  143. package/dist/internal/components/YearSelector/index.d.ts +1 -0
  144. package/dist/internal/components/YearSelector/internal/YearItem.d.ts +10 -0
  145. package/dist/internal/components/YearSelector/internal/useYearSelectorKeys.d.ts +19 -0
  146. package/dist/internal/hooks/index.d.ts +1 -0
  147. package/dist/internal/hooks/useContainerQuery/index.d.ts +1 -0
  148. package/dist/internal/hooks/useContainerQuery/useContainerQuery.d.ts +46 -0
  149. package/dist/internal/hooks/useFocusWithin/useFocusWithin.d.ts +11 -16
  150. package/dist/types/PassThroughProps.d.ts +4 -0
  151. package/dist/types/index.d.ts +1 -0
  152. package/dist/{useDateFieldOrchestration-Cqa7dxtr.js → useDateFieldOrchestration-BNJCsRkS.js} +2 -2
  153. package/dist/{useDateFieldOrchestration-Cqa7dxtr.js.map → useDateFieldOrchestration-BNJCsRkS.js.map} +1 -1
  154. package/dist/useFocusWithin-BhhgRXdZ.js +32 -0
  155. package/dist/useFocusWithin-BhhgRXdZ.js.map +1 -0
  156. package/dist/useInfiniteCombobox-WcRgC9p6.js +179 -0
  157. package/dist/useInfiniteCombobox-WcRgC9p6.js.map +1 -0
  158. package/dist/useIntersectionObserver-BEmMDO3P.js +70 -0
  159. package/dist/useIntersectionObserver-BEmMDO3P.js.map +1 -0
  160. package/package.json +3 -1
  161. package/dist/Calendar-Dq_of5A3.js.map +0 -1
  162. package/dist/DateFieldRange-DPbyzuHb.js.map +0 -1
  163. package/dist/DateFieldSingle-CfAJDcx9.js.map +0 -1
  164. package/dist/FieldLabel-BfnCXung.js.map +0 -1
  165. package/dist/Toolbar-DK7tXy_W.js +0 -807
  166. package/dist/Toolbar-DK7tXy_W.js.map +0 -1
  167. package/dist/components/Calendar/internal/CalendarYearSelection.d.ts +0 -25
  168. package/dist/useFocusWithin-BhU7hoAD.js +0 -56
  169. package/dist/useFocusWithin-BhU7hoAD.js.map +0 -1
  170. package/dist/useInfiniteCombobox-BN2uGhBh.js.map +0 -1
  171. /package/dist/{useInfiniteCombobox.css → Combobox.css} +0 -0
@@ -1,5 +1,6 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { createContext, useContext, forwardRef, useState, useEffect, useRef, useCallback, useMemo, useLayoutEffect, useId } from 'react';
2
+ import * as React from 'react';
3
+ import { createContext, useContext, forwardRef, useState, useEffect, useRef, useCallback, useMemo, useId } from 'react';
3
4
  import { B as Button } from './Button-BxFXQ0-n.js';
4
5
  import { S as SvgKeyboardArrowDown } from './keyboard_arrow_down-C8WQ38p1.js';
5
6
  import { S as SvgKeyboardArrowUp } from './keyboard_arrow_up-CxzK6LAl.js';
@@ -8,8 +9,11 @@ import { c as cx } from './index-tZvMCc77.js';
8
9
  import { S as SrOnly } from './SrOnly-CTsYSuby.js';
9
10
  import { u as useSwipe } from './useSwipe-CULmVQEk.js';
10
11
  import { G as Grid } from './Grid-MGUC698u.js';
11
- import { S as SelectCard } from './SelectCard-DOGCG0zr.js';
12
+ import { S as SelectCard } from './SelectCard-BTYZg9TG.js';
12
13
  import { u as useMergeRefs } from './useMergeRefs-Bde85AWI.js';
14
+ import { flushSync } from 'react-dom';
15
+ import { u as useOptionallyControlledState } from './useOptionallyControlledState-DbDuos5L.js';
16
+ import { u as usePrevious } from './usePrevious-Bvq-5auG.js';
13
17
  import { u as useLayoutPropsUtil } from './useLayoutPropsUtil-DjD5IMh0.js';
14
18
 
15
19
  import './Calendar.css';// these aren't really private, but nor are they really useful to document
@@ -8174,37 +8178,37 @@ const CalendarYearButton = forwardRef((props, ref) => {
8174
8178
  });
8175
8179
  CalendarYearButton.displayName = "CalendarYearButton";
8176
8180
 
8177
- const calendar = "_calendar_sc127_2";
8178
- const header = "_header_sc127_15";
8179
- const controller = "_controller_sc127_46";
8180
- const spacer = "_spacer_sc127_53";
8181
- const cell = "_cell_sc127_66";
8182
- const overflow = "_overflow_sc127_97";
8183
- const weekday = "_weekday_sc127_103";
8184
- const range = "_range_sc127_148";
8185
- const selected = "_selected_sc127_158";
8186
- const styles = {
8181
+ const calendar = "_calendar_m3fpt_2";
8182
+ const header = "_header_m3fpt_15";
8183
+ const controller = "_controller_m3fpt_46";
8184
+ const spacer = "_spacer_m3fpt_53";
8185
+ const cell = "_cell_m3fpt_66";
8186
+ const overflow = "_overflow_m3fpt_97";
8187
+ const weekday = "_weekday_m3fpt_103";
8188
+ const range = "_range_m3fpt_148";
8189
+ const selected = "_selected_m3fpt_158";
8190
+ const styles$1 = {
8187
8191
  calendar: calendar,
8188
8192
  header: header,
8189
8193
  controller: controller,
8190
8194
  spacer: spacer,
8191
- "day-grid": "_day-grid_sc127_56",
8195
+ "day-grid": "_day-grid_m3fpt_56",
8192
8196
  cell: cell,
8193
8197
  overflow: overflow,
8194
8198
  weekday: weekday,
8195
- "month-selection": "_month-selection_sc127_115",
8196
- "selection-checkbox": "_selection-checkbox_sc127_115",
8197
- "year-selection": "_year-selection_sc127_116",
8198
- "selection-card": "_selection-card_sc127_125",
8199
- "range-first": "_range-first_sc127_148",
8200
- "range-last": "_range-last_sc127_148",
8199
+ "month-selection": "_month-selection_m3fpt_115",
8200
+ "selection-checkbox": "_selection-checkbox_m3fpt_115",
8201
+ "selection-card": "_selection-card_m3fpt_125",
8202
+ "range-first": "_range-first_m3fpt_148",
8203
+ "range-last": "_range-last_m3fpt_148",
8201
8204
  range: range,
8202
8205
  selected: selected,
8203
- "is-unavailable": "_is-unavailable_sc127_166",
8204
- "hover-last": "_hover-last_sc127_224",
8205
- "range-fill": "_range-fill_sc127_228",
8206
- "range-disabled": "_range-disabled_sc127_238",
8207
- "controller-button": "_controller-button_sc127_246"
8206
+ "is-unavailable": "_is-unavailable_m3fpt_166",
8207
+ "hover-last": "_hover-last_m3fpt_224",
8208
+ "range-fill": "_range-fill_m3fpt_228",
8209
+ "range-disabled": "_range-disabled_m3fpt_238",
8210
+ "controller-button": "_controller-button_m3fpt_246",
8211
+ "year-selector": "_year-selector_m3fpt_254"
8208
8212
  };
8209
8213
 
8210
8214
  const CalendarPrev = forwardRef(
@@ -8257,7 +8261,7 @@ const CalendarPrev = forwardRef(
8257
8261
  {
8258
8262
  ref,
8259
8263
  onClick: onClickHandler,
8260
- className: cx(styles["controller-button"], className),
8264
+ className: cx(styles$1["controller-button"], className),
8261
8265
  appearance: "ghost",
8262
8266
  size: "small",
8263
8267
  icon: SvgKeyboardArrowLeft,
@@ -8322,7 +8326,7 @@ const CalendarNext = forwardRef(
8322
8326
  onClick: onClickHandler,
8323
8327
  appearance: "ghost",
8324
8328
  size: "small",
8325
- className: cx(styles["controller-button"], className),
8329
+ className: cx(styles$1["controller-button"], className),
8326
8330
  icon: SvgKeyboardArrowRight,
8327
8331
  "aria-label": "Next Month",
8328
8332
  "data-anv": "calendar-next",
@@ -8611,14 +8615,14 @@ const CalendarDay = forwardRef(
8611
8615
  defaultTimeZone
8612
8616
  );
8613
8617
  const hoverRange = range && hoveredDate && value.start && !value.end && date.toMillis() > value.start.toMillis() && date.toMillis() <= hoveredDate.toMillis();
8614
- const cellCx = cx(styles["cell"], {
8615
- [styles["selected"]]: !isUnavailable && isSelectedDate(date),
8616
- [styles["range-first"]]: range && value.start && (value.end || hoveredDate) && isSameDay(date, value.start),
8617
- [styles["range-last"]]: range && (value.start && value.end && isSameDay(date, value.end) || hoverRange && isSameDay(date, hoveredDate)),
8618
- [styles["range"]]: isRange(date) || hoverRange,
8619
- [styles["is-unavailable"]]: isUnavailable,
8620
- [styles["overflow"]]: !isSameMonth(date, focusedDate),
8621
- [styles["hover-last"]]: hoverRange && isSameDay(date, hoveredDate)
8618
+ const cellCx = cx(styles$1["cell"], {
8619
+ [styles$1["selected"]]: !isUnavailable && isSelectedDate(date),
8620
+ [styles$1["range-first"]]: range && value.start && (value.end || hoveredDate) && isSameDay(date, value.start),
8621
+ [styles$1["range-last"]]: range && (value.start && value.end && isSameDay(date, value.end) || hoverRange && isSameDay(date, hoveredDate)),
8622
+ [styles$1["range"]]: isRange(date) || hoverRange,
8623
+ [styles$1["is-unavailable"]]: isUnavailable,
8624
+ [styles$1["overflow"]]: !isSameMonth(date, focusedDate),
8625
+ [styles$1["hover-last"]]: hoverRange && isSameDay(date, hoveredDate)
8622
8626
  });
8623
8627
  const isMinDate = minDate !== null && date.toMillis() <= minDate?.toMillis();
8624
8628
  const isMaxDate = maxDate !== null && date.toMillis() >= maxDate?.toMillis();
@@ -8634,9 +8638,9 @@ const CalendarDay = forwardRef(
8634
8638
  "div",
8635
8639
  {
8636
8640
  role: "presentation",
8637
- className: cx(styles["range-fill"], {
8638
- [styles["range-disabled"]]: isDisabled,
8639
- [styles["hover-last"]]: hoverRange && isSameDay(date, hoveredDate)
8641
+ className: cx(styles$1["range-fill"], {
8642
+ [styles$1["range-disabled"]]: isDisabled,
8643
+ [styles$1["hover-last"]]: hoverRange && isSameDay(date, hoveredDate)
8640
8644
  })
8641
8645
  }
8642
8646
  ) : null,
@@ -8649,7 +8653,7 @@ const CalendarDay = forwardRef(
8649
8653
  className: cellCx,
8650
8654
  onKeyDown: onKeyDownHandler,
8651
8655
  onMouseEnter: () => onMouseEnterHandler(date),
8652
- tabIndex: isSameDay(date, focusedDate) ? 0 : -1,
8656
+ tabIndex: disableAutofocus ? -1 : isSameDay(date, focusedDate) ? 0 : -1,
8653
8657
  disabled: isDisabled ? true : void 0,
8654
8658
  "aria-label": `${date.toLocaleString(dateFormat)}${isSelectedDate(date) ? " selected" : ""}${isMinDate ? ", You are on the first available date" : ""}${isMaxDate ? ", You are on the last available date" : ""}`,
8655
8659
  id: `${uid}-${date.toISODate()}`,
@@ -8788,7 +8792,7 @@ const CalendarMonth = forwardRef(
8788
8792
  startDay
8789
8793
  } = context;
8790
8794
  const initialized = useRef(false);
8791
- const ViewCX = cx(styles["grid"], className);
8795
+ const ViewCX = cx(styles$1["grid"], className);
8792
8796
  const futureDateSelection = useCallback(
8793
8797
  (targetDate) => {
8794
8798
  if (maxDate !== null && targetDate.toMillis() > maxDate?.toMillis()) {
@@ -8919,24 +8923,24 @@ const CalendarMonth = forwardRef(
8919
8923
  ...rest,
8920
8924
  ...touchProps,
8921
8925
  children: [
8922
- /* @__PURE__ */ jsxs("thead", { "aria-hidden": true, className: styles["weekdays"], children: [
8926
+ /* @__PURE__ */ jsxs("thead", { "aria-hidden": true, className: styles$1["weekdays"], children: [
8923
8927
  /* @__PURE__ */ jsx("tr", { children: weekdaysArr.map((weekday, i) => {
8924
8928
  return /* @__PURE__ */ jsx(
8925
8929
  "th",
8926
8930
  {
8927
8931
  scope: "col",
8928
- className: styles["weekday"],
8932
+ className: styles$1["weekday"],
8929
8933
  children: weekday
8930
8934
  },
8931
8935
  `${weekday}${i}`
8932
8936
  );
8933
8937
  }) }),
8934
- /* @__PURE__ */ jsx("tr", { className: styles["spacer"], children: /* @__PURE__ */ jsx("td", { colSpan: 7 }) })
8938
+ /* @__PURE__ */ jsx("tr", { className: styles$1["spacer"], children: /* @__PURE__ */ jsx("td", { colSpan: 7 }) })
8935
8939
  ] }),
8936
8940
  /* @__PURE__ */ jsx(
8937
8941
  "tbody",
8938
8942
  {
8939
- className: styles["day-grid"],
8943
+ className: styles$1["day-grid"],
8940
8944
  children: splitArr.map((week, i) => {
8941
8945
  return /* @__PURE__ */ jsx(CalendarWeek, { week }, i);
8942
8946
  })
@@ -8976,7 +8980,7 @@ const CalendarMonthSelection = forwardRef(({ onMonthSelection, ...props }, ref)
8976
8980
  }),
8977
8981
  [maxDate, minDate, selectedYear]
8978
8982
  );
8979
- const classes = cx(styles["month-selection"], props.className);
8983
+ const classes = cx(styles$1["month-selection"], props.className);
8980
8984
  const [focusedIndex, setFocusedIndex] = useState(selectedMonth - 1);
8981
8985
  useEffect(() => {
8982
8986
  if (minDate || maxDate) {
@@ -9085,10 +9089,10 @@ const CalendarMonthSelection = forwardRef(({ onMonthSelection, ...props }, ref)
9085
9089
  onChange: () => onMonthSelection(month),
9086
9090
  checked: selectedMonth === month && selectedYear === currentDate.year,
9087
9091
  checkboxProps: {
9088
- className: styles["selection-checkbox"],
9092
+ className: styles$1["selection-checkbox"],
9089
9093
  tabIndex: focusedIndex === index ? 0 : -1
9090
9094
  },
9091
- className: styles["selection-card"],
9095
+ className: styles$1["selection-card"],
9092
9096
  children: DateTime.fromObject({ month }).toFormat("MMMM")
9093
9097
  }
9094
9098
  ) }, month.toString()))
@@ -9099,134 +9103,1120 @@ const CalendarMonthSelection = forwardRef(({ onMonthSelection, ...props }, ref)
9099
9103
  });
9100
9104
  CalendarMonthSelection.displayName = "CalendarMonthSelection";
9101
9105
 
9102
- const CalendarYearSelection = forwardRef(({ onYearSelection, ...props }, ref) => {
9103
- const { maxDate, minDate, selectedYear } = useCalendar();
9104
- const containerRef = useRef(null);
9105
- const combinedRef = useMergeRefs([ref, containerRef]);
9106
- const initialYears = useMemo(
9107
- () => Array.from({ length: 52 }, (_, i) => {
9108
- const year = selectedYear - (selectedYear % 2 ? 24 : 25) + i;
9109
- const disabled = minDate && year < minDate.year || maxDate && year > maxDate.year;
9110
- return { year, disabled: disabled ?? false };
9111
- }),
9112
- [selectedYear, minDate, maxDate]
9106
+ function memo(getDeps, fn, opts) {
9107
+ let deps = opts.initialDeps ?? [];
9108
+ let result;
9109
+ function memoizedFunction() {
9110
+ var _a, _b, _c, _d;
9111
+ let depTime;
9112
+ if (opts.key && ((_a = opts.debug) == null ? void 0 : _a.call(opts))) depTime = Date.now();
9113
+ const newDeps = getDeps();
9114
+ const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);
9115
+ if (!depsChanged) {
9116
+ return result;
9117
+ }
9118
+ deps = newDeps;
9119
+ let resultTime;
9120
+ if (opts.key && ((_b = opts.debug) == null ? void 0 : _b.call(opts))) resultTime = Date.now();
9121
+ result = fn(...newDeps);
9122
+ if (opts.key && ((_c = opts.debug) == null ? void 0 : _c.call(opts))) {
9123
+ const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;
9124
+ const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;
9125
+ const resultFpsPercentage = resultEndTime / 16;
9126
+ const pad = (str, num) => {
9127
+ str = String(str);
9128
+ while (str.length < num) {
9129
+ str = " " + str;
9130
+ }
9131
+ return str;
9132
+ };
9133
+ console.info(
9134
+ `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,
9135
+ `
9136
+ font-size: .6rem;
9137
+ font-weight: bold;
9138
+ color: hsl(${Math.max(
9139
+ 0,
9140
+ Math.min(120 - 120 * resultFpsPercentage, 120)
9141
+ )}deg 100% 31%);`,
9142
+ opts == null ? void 0 : opts.key
9143
+ );
9144
+ }
9145
+ (_d = opts == null ? void 0 : opts.onChange) == null ? void 0 : _d.call(opts, result);
9146
+ return result;
9147
+ }
9148
+ memoizedFunction.updateDeps = (newDeps) => {
9149
+ deps = newDeps;
9150
+ };
9151
+ return memoizedFunction;
9152
+ }
9153
+ function notUndefined(value, msg) {
9154
+ if (value === void 0) {
9155
+ throw new Error(`Unexpected undefined${""}`);
9156
+ } else {
9157
+ return value;
9158
+ }
9159
+ }
9160
+ const approxEqual = (a, b) => Math.abs(a - b) < 1.01;
9161
+ const debounce = (targetWindow, fn, ms) => {
9162
+ let timeoutId;
9163
+ return function(...args) {
9164
+ targetWindow.clearTimeout(timeoutId);
9165
+ timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms);
9166
+ };
9167
+ };
9168
+
9169
+ const getRect = (element) => {
9170
+ const { offsetWidth, offsetHeight } = element;
9171
+ return { width: offsetWidth, height: offsetHeight };
9172
+ };
9173
+ const defaultKeyExtractor = (index) => index;
9174
+ const defaultRangeExtractor = (range) => {
9175
+ const start = Math.max(range.startIndex - range.overscan, 0);
9176
+ const end = Math.min(range.endIndex + range.overscan, range.count - 1);
9177
+ const arr = [];
9178
+ for (let i = start; i <= end; i++) {
9179
+ arr.push(i);
9180
+ }
9181
+ return arr;
9182
+ };
9183
+ const observeElementRect = (instance, cb) => {
9184
+ const element = instance.scrollElement;
9185
+ if (!element) {
9186
+ return;
9187
+ }
9188
+ const targetWindow = instance.targetWindow;
9189
+ if (!targetWindow) {
9190
+ return;
9191
+ }
9192
+ const handler = (rect) => {
9193
+ const { width, height } = rect;
9194
+ cb({ width: Math.round(width), height: Math.round(height) });
9195
+ };
9196
+ handler(getRect(element));
9197
+ if (!targetWindow.ResizeObserver) {
9198
+ return () => {
9199
+ };
9200
+ }
9201
+ const observer = new targetWindow.ResizeObserver((entries) => {
9202
+ const run = () => {
9203
+ const entry = entries[0];
9204
+ if (entry == null ? void 0 : entry.borderBoxSize) {
9205
+ const box = entry.borderBoxSize[0];
9206
+ if (box) {
9207
+ handler({ width: box.inlineSize, height: box.blockSize });
9208
+ return;
9209
+ }
9210
+ }
9211
+ handler(getRect(element));
9212
+ };
9213
+ instance.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();
9214
+ });
9215
+ observer.observe(element, { box: "border-box" });
9216
+ return () => {
9217
+ observer.unobserve(element);
9218
+ };
9219
+ };
9220
+ const addEventListenerOptions = {
9221
+ passive: true
9222
+ };
9223
+ const supportsScrollend = typeof window == "undefined" ? true : "onscrollend" in window;
9224
+ const observeElementOffset = (instance, cb) => {
9225
+ const element = instance.scrollElement;
9226
+ if (!element) {
9227
+ return;
9228
+ }
9229
+ const targetWindow = instance.targetWindow;
9230
+ if (!targetWindow) {
9231
+ return;
9232
+ }
9233
+ let offset = 0;
9234
+ const fallback = instance.options.useScrollendEvent && supportsScrollend ? () => void 0 : debounce(
9235
+ targetWindow,
9236
+ () => {
9237
+ cb(offset, false);
9238
+ },
9239
+ instance.options.isScrollingResetDelay
9113
9240
  );
9114
- const [dates, setDates] = useState(initialYears);
9115
- useLayoutEffect(() => {
9116
- containerRef.current?.scrollTo({
9117
- top: (containerRef.current?.scrollHeight ?? 0) / 2 - (containerRef.current?.clientHeight ?? 0) / 2
9118
- });
9119
- const container = containerRef.current;
9120
- if (!container) return;
9121
- const handleScroll = () => {
9122
- const { scrollTop, scrollHeight, clientHeight } = container;
9123
- const distanceFromTop = scrollTop;
9124
- const distanceFromBottom = scrollHeight - scrollTop - clientHeight;
9125
- if (distanceFromTop < 200 && !minDate) {
9126
- setDates((prevDates) => {
9127
- const firstYear = prevDates[0].year;
9128
- const newDates = Array.from({ length: 20 }, (_, i) => ({
9129
- year: firstYear - (20 - i),
9130
- disabled: false
9131
- }));
9132
- return [...newDates, ...prevDates];
9241
+ const createHandler = (isScrolling) => () => {
9242
+ const { horizontal, isRtl } = instance.options;
9243
+ offset = horizontal ? element["scrollLeft"] * (isRtl && -1 || 1) : element["scrollTop"];
9244
+ fallback();
9245
+ cb(offset, isScrolling);
9246
+ };
9247
+ const handler = createHandler(true);
9248
+ const endHandler = createHandler(false);
9249
+ endHandler();
9250
+ element.addEventListener("scroll", handler, addEventListenerOptions);
9251
+ const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;
9252
+ if (registerScrollendEvent) {
9253
+ element.addEventListener("scrollend", endHandler, addEventListenerOptions);
9254
+ }
9255
+ return () => {
9256
+ element.removeEventListener("scroll", handler);
9257
+ if (registerScrollendEvent) {
9258
+ element.removeEventListener("scrollend", endHandler);
9259
+ }
9260
+ };
9261
+ };
9262
+ const measureElement = (element, entry, instance) => {
9263
+ if (entry == null ? void 0 : entry.borderBoxSize) {
9264
+ const box = entry.borderBoxSize[0];
9265
+ if (box) {
9266
+ const size = Math.round(
9267
+ box[instance.options.horizontal ? "inlineSize" : "blockSize"]
9268
+ );
9269
+ return size;
9270
+ }
9271
+ }
9272
+ return element[instance.options.horizontal ? "offsetWidth" : "offsetHeight"];
9273
+ };
9274
+ const elementScroll = (offset, {
9275
+ adjustments = 0,
9276
+ behavior
9277
+ }, instance) => {
9278
+ var _a, _b;
9279
+ const toOffset = offset + adjustments;
9280
+ (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {
9281
+ [instance.options.horizontal ? "left" : "top"]: toOffset,
9282
+ behavior
9283
+ });
9284
+ };
9285
+ class Virtualizer {
9286
+ constructor(opts) {
9287
+ this.unsubs = [];
9288
+ this.scrollElement = null;
9289
+ this.targetWindow = null;
9290
+ this.isScrolling = false;
9291
+ this.measurementsCache = [];
9292
+ this.itemSizeCache = /* @__PURE__ */ new Map();
9293
+ this.pendingMeasuredCacheIndexes = [];
9294
+ this.scrollRect = null;
9295
+ this.scrollOffset = null;
9296
+ this.scrollDirection = null;
9297
+ this.scrollAdjustments = 0;
9298
+ this.elementsCache = /* @__PURE__ */ new Map();
9299
+ this.observer = /* @__PURE__ */ (() => {
9300
+ let _ro = null;
9301
+ const get = () => {
9302
+ if (_ro) {
9303
+ return _ro;
9304
+ }
9305
+ if (!this.targetWindow || !this.targetWindow.ResizeObserver) {
9306
+ return null;
9307
+ }
9308
+ return _ro = new this.targetWindow.ResizeObserver((entries) => {
9309
+ entries.forEach((entry) => {
9310
+ const run = () => {
9311
+ this._measureElement(entry.target, entry);
9312
+ };
9313
+ this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();
9314
+ });
9315
+ });
9316
+ };
9317
+ return {
9318
+ disconnect: () => {
9319
+ var _a;
9320
+ (_a = get()) == null ? void 0 : _a.disconnect();
9321
+ _ro = null;
9322
+ },
9323
+ observe: (target) => {
9324
+ var _a;
9325
+ return (_a = get()) == null ? void 0 : _a.observe(target, { box: "border-box" });
9326
+ },
9327
+ unobserve: (target) => {
9328
+ var _a;
9329
+ return (_a = get()) == null ? void 0 : _a.unobserve(target);
9330
+ }
9331
+ };
9332
+ })();
9333
+ this.range = null;
9334
+ this.setOptions = (opts2) => {
9335
+ Object.entries(opts2).forEach(([key, value]) => {
9336
+ if (typeof value === "undefined") delete opts2[key];
9337
+ });
9338
+ this.options = {
9339
+ debug: false,
9340
+ initialOffset: 0,
9341
+ overscan: 1,
9342
+ paddingStart: 0,
9343
+ paddingEnd: 0,
9344
+ scrollPaddingStart: 0,
9345
+ scrollPaddingEnd: 0,
9346
+ horizontal: false,
9347
+ getItemKey: defaultKeyExtractor,
9348
+ rangeExtractor: defaultRangeExtractor,
9349
+ onChange: () => {
9350
+ },
9351
+ measureElement,
9352
+ initialRect: { width: 0, height: 0 },
9353
+ scrollMargin: 0,
9354
+ gap: 0,
9355
+ indexAttribute: "data-index",
9356
+ initialMeasurementsCache: [],
9357
+ lanes: 1,
9358
+ isScrollingResetDelay: 150,
9359
+ enabled: true,
9360
+ isRtl: false,
9361
+ useScrollendEvent: false,
9362
+ useAnimationFrameWithResizeObserver: false,
9363
+ ...opts2
9364
+ };
9365
+ };
9366
+ this.notify = (sync) => {
9367
+ var _a, _b;
9368
+ (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);
9369
+ };
9370
+ this.maybeNotify = memo(
9371
+ () => {
9372
+ this.calculateRange();
9373
+ return [
9374
+ this.isScrolling,
9375
+ this.range ? this.range.startIndex : null,
9376
+ this.range ? this.range.endIndex : null
9377
+ ];
9378
+ },
9379
+ (isScrolling) => {
9380
+ this.notify(isScrolling);
9381
+ },
9382
+ {
9383
+ key: process.env.NODE_ENV !== "production" && "maybeNotify",
9384
+ debug: () => this.options.debug,
9385
+ initialDeps: [
9386
+ this.isScrolling,
9387
+ this.range ? this.range.startIndex : null,
9388
+ this.range ? this.range.endIndex : null
9389
+ ]
9390
+ }
9391
+ );
9392
+ this.cleanup = () => {
9393
+ this.unsubs.filter(Boolean).forEach((d) => d());
9394
+ this.unsubs = [];
9395
+ this.observer.disconnect();
9396
+ this.scrollElement = null;
9397
+ this.targetWindow = null;
9398
+ };
9399
+ this._didMount = () => {
9400
+ return () => {
9401
+ this.cleanup();
9402
+ };
9403
+ };
9404
+ this._willUpdate = () => {
9405
+ var _a;
9406
+ const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;
9407
+ if (this.scrollElement !== scrollElement) {
9408
+ this.cleanup();
9409
+ if (!scrollElement) {
9410
+ this.maybeNotify();
9411
+ return;
9412
+ }
9413
+ this.scrollElement = scrollElement;
9414
+ if (this.scrollElement && "ownerDocument" in this.scrollElement) {
9415
+ this.targetWindow = this.scrollElement.ownerDocument.defaultView;
9416
+ } else {
9417
+ this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;
9418
+ }
9419
+ this.elementsCache.forEach((cached) => {
9420
+ this.observer.observe(cached);
9133
9421
  });
9134
- } else if (distanceFromBottom < 200 && !maxDate) {
9135
- setDates((prevDates) => {
9136
- const lastYear = prevDates[prevDates.length - 1].year;
9137
- const newDates = Array.from({ length: 20 }, (_, i) => ({
9138
- year: lastYear + (i + 1),
9139
- disabled: false
9140
- }));
9141
- return [...prevDates, ...newDates];
9422
+ this._scrollToOffset(this.getScrollOffset(), {
9423
+ adjustments: void 0,
9424
+ behavior: void 0
9142
9425
  });
9426
+ this.unsubs.push(
9427
+ this.options.observeElementRect(this, (rect) => {
9428
+ this.scrollRect = rect;
9429
+ this.maybeNotify();
9430
+ })
9431
+ );
9432
+ this.unsubs.push(
9433
+ this.options.observeElementOffset(this, (offset, isScrolling) => {
9434
+ this.scrollAdjustments = 0;
9435
+ this.scrollDirection = isScrolling ? this.getScrollOffset() < offset ? "forward" : "backward" : null;
9436
+ this.scrollOffset = offset;
9437
+ this.isScrolling = isScrolling;
9438
+ this.maybeNotify();
9439
+ })
9440
+ );
9143
9441
  }
9144
9442
  };
9145
- container.addEventListener("scroll", handleScroll);
9146
- return () => container.removeEventListener("scroll", handleScroll);
9147
- }, [minDate, maxDate]);
9148
- const classes = cx(styles["year-selection"], props.className);
9149
- const [focusedIndex, setFocusedIndex] = useState(
9150
- // start focused on the middle of the year selection, with odd numbers on the left
9151
- selectedYear % 2 ? 24 : 25
9152
- );
9153
- const handleKeyDown = useCallback(
9154
- (e) => {
9155
- const target = e.target;
9156
- const cards = containerRef.current?.querySelectorAll(
9157
- "input[type='checkbox']"
9158
- );
9159
- if (!cards || cards.length === 0) {
9443
+ this.getSize = () => {
9444
+ if (!this.options.enabled) {
9445
+ this.scrollRect = null;
9446
+ return 0;
9447
+ }
9448
+ this.scrollRect = this.scrollRect ?? this.options.initialRect;
9449
+ return this.scrollRect[this.options.horizontal ? "width" : "height"];
9450
+ };
9451
+ this.getScrollOffset = () => {
9452
+ if (!this.options.enabled) {
9453
+ this.scrollOffset = null;
9454
+ return 0;
9455
+ }
9456
+ this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === "function" ? this.options.initialOffset() : this.options.initialOffset);
9457
+ return this.scrollOffset;
9458
+ };
9459
+ this.getFurthestMeasurement = (measurements, index) => {
9460
+ const furthestMeasurementsFound = /* @__PURE__ */ new Map();
9461
+ const furthestMeasurements = /* @__PURE__ */ new Map();
9462
+ for (let m = index - 1; m >= 0; m--) {
9463
+ const measurement = measurements[m];
9464
+ if (furthestMeasurementsFound.has(measurement.lane)) {
9465
+ continue;
9466
+ }
9467
+ const previousFurthestMeasurement = furthestMeasurements.get(
9468
+ measurement.lane
9469
+ );
9470
+ if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) {
9471
+ furthestMeasurements.set(measurement.lane, measurement);
9472
+ } else if (measurement.end < previousFurthestMeasurement.end) {
9473
+ furthestMeasurementsFound.set(measurement.lane, true);
9474
+ }
9475
+ if (furthestMeasurementsFound.size === this.options.lanes) {
9476
+ break;
9477
+ }
9478
+ }
9479
+ return furthestMeasurements.size === this.options.lanes ? Array.from(furthestMeasurements.values()).sort((a, b) => {
9480
+ if (a.end === b.end) {
9481
+ return a.index - b.index;
9482
+ }
9483
+ return a.end - b.end;
9484
+ })[0] : void 0;
9485
+ };
9486
+ this.getMeasurementOptions = memo(
9487
+ () => [
9488
+ this.options.count,
9489
+ this.options.paddingStart,
9490
+ this.options.scrollMargin,
9491
+ this.options.getItemKey,
9492
+ this.options.enabled
9493
+ ],
9494
+ (count, paddingStart, scrollMargin, getItemKey, enabled) => {
9495
+ this.pendingMeasuredCacheIndexes = [];
9496
+ return {
9497
+ count,
9498
+ paddingStart,
9499
+ scrollMargin,
9500
+ getItemKey,
9501
+ enabled
9502
+ };
9503
+ },
9504
+ {
9505
+ key: false
9506
+ }
9507
+ );
9508
+ this.getMeasurements = memo(
9509
+ () => [this.getMeasurementOptions(), this.itemSizeCache],
9510
+ ({ count, paddingStart, scrollMargin, getItemKey, enabled }, itemSizeCache) => {
9511
+ if (!enabled) {
9512
+ this.measurementsCache = [];
9513
+ this.itemSizeCache.clear();
9514
+ return [];
9515
+ }
9516
+ if (this.measurementsCache.length === 0) {
9517
+ this.measurementsCache = this.options.initialMeasurementsCache;
9518
+ this.measurementsCache.forEach((item) => {
9519
+ this.itemSizeCache.set(item.key, item.size);
9520
+ });
9521
+ }
9522
+ const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;
9523
+ this.pendingMeasuredCacheIndexes = [];
9524
+ const measurements = this.measurementsCache.slice(0, min);
9525
+ for (let i = min; i < count; i++) {
9526
+ const key = getItemKey(i);
9527
+ const furthestMeasurement = this.options.lanes === 1 ? measurements[i - 1] : this.getFurthestMeasurement(measurements, i);
9528
+ const start = furthestMeasurement ? furthestMeasurement.end + this.options.gap : paddingStart + scrollMargin;
9529
+ const measuredSize = itemSizeCache.get(key);
9530
+ const size = typeof measuredSize === "number" ? measuredSize : this.options.estimateSize(i);
9531
+ const end = start + size;
9532
+ const lane = furthestMeasurement ? furthestMeasurement.lane : i % this.options.lanes;
9533
+ measurements[i] = {
9534
+ index: i,
9535
+ start,
9536
+ size,
9537
+ end,
9538
+ key,
9539
+ lane
9540
+ };
9541
+ }
9542
+ this.measurementsCache = measurements;
9543
+ return measurements;
9544
+ },
9545
+ {
9546
+ key: process.env.NODE_ENV !== "production" && "getMeasurements",
9547
+ debug: () => this.options.debug
9548
+ }
9549
+ );
9550
+ this.calculateRange = memo(
9551
+ () => [
9552
+ this.getMeasurements(),
9553
+ this.getSize(),
9554
+ this.getScrollOffset(),
9555
+ this.options.lanes
9556
+ ],
9557
+ (measurements, outerSize, scrollOffset, lanes) => {
9558
+ return this.range = measurements.length > 0 && outerSize > 0 ? calculateRange({
9559
+ measurements,
9560
+ outerSize,
9561
+ scrollOffset,
9562
+ lanes
9563
+ }) : null;
9564
+ },
9565
+ {
9566
+ key: process.env.NODE_ENV !== "production" && "calculateRange",
9567
+ debug: () => this.options.debug
9568
+ }
9569
+ );
9570
+ this.getVirtualIndexes = memo(
9571
+ () => {
9572
+ let startIndex = null;
9573
+ let endIndex = null;
9574
+ const range = this.calculateRange();
9575
+ if (range) {
9576
+ startIndex = range.startIndex;
9577
+ endIndex = range.endIndex;
9578
+ }
9579
+ this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex]);
9580
+ return [
9581
+ this.options.rangeExtractor,
9582
+ this.options.overscan,
9583
+ this.options.count,
9584
+ startIndex,
9585
+ endIndex
9586
+ ];
9587
+ },
9588
+ (rangeExtractor, overscan, count, startIndex, endIndex) => {
9589
+ return startIndex === null || endIndex === null ? [] : rangeExtractor({
9590
+ startIndex,
9591
+ endIndex,
9592
+ overscan,
9593
+ count
9594
+ });
9595
+ },
9596
+ {
9597
+ key: process.env.NODE_ENV !== "production" && "getVirtualIndexes",
9598
+ debug: () => this.options.debug
9599
+ }
9600
+ );
9601
+ this.indexFromElement = (node) => {
9602
+ const attributeName = this.options.indexAttribute;
9603
+ const indexStr = node.getAttribute(attributeName);
9604
+ if (!indexStr) {
9605
+ console.warn(
9606
+ `Missing attribute name '${attributeName}={index}' on measured element.`
9607
+ );
9608
+ return -1;
9609
+ }
9610
+ return parseInt(indexStr, 10);
9611
+ };
9612
+ this._measureElement = (node, entry) => {
9613
+ const index = this.indexFromElement(node);
9614
+ const item = this.measurementsCache[index];
9615
+ if (!item) {
9160
9616
  return;
9161
9617
  }
9162
- const cardArray = Array.from(cards);
9163
- const currentIndex = cardArray.indexOf(target);
9164
- if (currentIndex === -1) return;
9165
- const updateFocusedIndex = (index) => {
9166
- e.preventDefault();
9167
- cardArray[index].focus();
9168
- setFocusedIndex(index);
9618
+ const key = item.key;
9619
+ const prevNode = this.elementsCache.get(key);
9620
+ if (prevNode !== node) {
9621
+ if (prevNode) {
9622
+ this.observer.unobserve(prevNode);
9623
+ }
9624
+ this.observer.observe(node);
9625
+ this.elementsCache.set(key, node);
9626
+ }
9627
+ if (node.isConnected) {
9628
+ this.resizeItem(index, this.options.measureElement(node, entry, this));
9629
+ }
9630
+ };
9631
+ this.resizeItem = (index, size) => {
9632
+ const item = this.measurementsCache[index];
9633
+ if (!item) {
9634
+ return;
9635
+ }
9636
+ const itemSize = this.itemSizeCache.get(item.key) ?? item.size;
9637
+ const delta = size - itemSize;
9638
+ if (delta !== 0) {
9639
+ if (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(item, delta, this) : item.start < this.getScrollOffset() + this.scrollAdjustments) {
9640
+ if (process.env.NODE_ENV !== "production" && this.options.debug) {
9641
+ console.info("correction", delta);
9642
+ }
9643
+ this._scrollToOffset(this.getScrollOffset(), {
9644
+ adjustments: this.scrollAdjustments += delta,
9645
+ behavior: void 0
9646
+ });
9647
+ }
9648
+ this.pendingMeasuredCacheIndexes.push(item.index);
9649
+ this.itemSizeCache = new Map(this.itemSizeCache.set(item.key, size));
9650
+ this.notify(false);
9651
+ }
9652
+ };
9653
+ this.measureElement = (node) => {
9654
+ if (!node) {
9655
+ this.elementsCache.forEach((cached, key) => {
9656
+ if (!cached.isConnected) {
9657
+ this.observer.unobserve(cached);
9658
+ this.elementsCache.delete(key);
9659
+ }
9660
+ });
9661
+ return;
9662
+ }
9663
+ this._measureElement(node, void 0);
9664
+ };
9665
+ this.getVirtualItems = memo(
9666
+ () => [this.getVirtualIndexes(), this.getMeasurements()],
9667
+ (indexes, measurements) => {
9668
+ const virtualItems = [];
9669
+ for (let k = 0, len = indexes.length; k < len; k++) {
9670
+ const i = indexes[k];
9671
+ const measurement = measurements[i];
9672
+ virtualItems.push(measurement);
9673
+ }
9674
+ return virtualItems;
9675
+ },
9676
+ {
9677
+ key: process.env.NODE_ENV !== "production" && "getVirtualItems",
9678
+ debug: () => this.options.debug
9679
+ }
9680
+ );
9681
+ this.getVirtualItemForOffset = (offset) => {
9682
+ const measurements = this.getMeasurements();
9683
+ if (measurements.length === 0) {
9684
+ return void 0;
9685
+ }
9686
+ return notUndefined(
9687
+ measurements[findNearestBinarySearch(
9688
+ 0,
9689
+ measurements.length - 1,
9690
+ (index) => notUndefined(measurements[index]).start,
9691
+ offset
9692
+ )]
9693
+ );
9694
+ };
9695
+ this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {
9696
+ const size = this.getSize();
9697
+ const scrollOffset = this.getScrollOffset();
9698
+ if (align === "auto") {
9699
+ align = toOffset >= scrollOffset + size ? "end" : "start";
9700
+ }
9701
+ if (align === "center") {
9702
+ toOffset += (itemSize - size) / 2;
9703
+ } else if (align === "end") {
9704
+ toOffset -= size;
9705
+ }
9706
+ const maxOffset = this.getTotalSize() + this.options.scrollMargin - size;
9707
+ return Math.max(Math.min(maxOffset, toOffset), 0);
9708
+ };
9709
+ this.getOffsetForIndex = (index, align = "auto") => {
9710
+ index = Math.max(0, Math.min(index, this.options.count - 1));
9711
+ const item = this.measurementsCache[index];
9712
+ if (!item) {
9713
+ return void 0;
9714
+ }
9715
+ const size = this.getSize();
9716
+ const scrollOffset = this.getScrollOffset();
9717
+ if (align === "auto") {
9718
+ if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {
9719
+ align = "end";
9720
+ } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {
9721
+ align = "start";
9722
+ } else {
9723
+ return [scrollOffset, align];
9724
+ }
9725
+ }
9726
+ const toOffset = align === "end" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;
9727
+ return [
9728
+ this.getOffsetForAlignment(toOffset, align, item.size),
9729
+ align
9730
+ ];
9731
+ };
9732
+ this.isDynamicMode = () => this.elementsCache.size > 0;
9733
+ this.scrollToOffset = (toOffset, { align = "start", behavior } = {}) => {
9734
+ if (behavior === "smooth" && this.isDynamicMode()) {
9735
+ console.warn(
9736
+ "The `smooth` scroll behavior is not fully supported with dynamic size."
9737
+ );
9738
+ }
9739
+ this._scrollToOffset(this.getOffsetForAlignment(toOffset, align), {
9740
+ adjustments: void 0,
9741
+ behavior
9742
+ });
9743
+ };
9744
+ this.scrollToIndex = (index, { align: initialAlign = "auto", behavior } = {}) => {
9745
+ if (behavior === "smooth" && this.isDynamicMode()) {
9746
+ console.warn(
9747
+ "The `smooth` scroll behavior is not fully supported with dynamic size."
9748
+ );
9749
+ }
9750
+ index = Math.max(0, Math.min(index, this.options.count - 1));
9751
+ let attempts = 0;
9752
+ const maxAttempts = 10;
9753
+ const tryScroll = (currentAlign) => {
9754
+ if (!this.targetWindow) return;
9755
+ const offsetInfo = this.getOffsetForIndex(index, currentAlign);
9756
+ if (!offsetInfo) {
9757
+ console.warn("Failed to get offset for index:", index);
9758
+ return;
9759
+ }
9760
+ const [offset, align] = offsetInfo;
9761
+ this._scrollToOffset(offset, { adjustments: void 0, behavior });
9762
+ this.targetWindow.requestAnimationFrame(() => {
9763
+ const currentOffset = this.getScrollOffset();
9764
+ const afterInfo = this.getOffsetForIndex(index, align);
9765
+ if (!afterInfo) {
9766
+ console.warn("Failed to get offset for index:", index);
9767
+ return;
9768
+ }
9769
+ if (!approxEqual(afterInfo[0], currentOffset)) {
9770
+ scheduleRetry(align);
9771
+ }
9772
+ });
9169
9773
  };
9170
- switch (e.key) {
9171
- case "ArrowLeft":
9172
- updateFocusedIndex(currentIndex - 1);
9173
- break;
9174
- case "ArrowRight":
9175
- updateFocusedIndex(currentIndex + 1);
9176
- break;
9177
- case "ArrowUp":
9178
- updateFocusedIndex(currentIndex - 2);
9179
- break;
9180
- case "ArrowDown":
9181
- updateFocusedIndex(currentIndex + 2);
9182
- break;
9183
- case "Enter":
9184
- case " ":
9185
- e.preventDefault();
9186
- onYearSelection(dates[currentIndex].year);
9187
- break;
9774
+ const scheduleRetry = (align) => {
9775
+ if (!this.targetWindow) return;
9776
+ attempts++;
9777
+ if (attempts < maxAttempts) {
9778
+ if (process.env.NODE_ENV !== "production" && this.options.debug) {
9779
+ console.info("Schedule retry", attempts, maxAttempts);
9780
+ }
9781
+ this.targetWindow.requestAnimationFrame(() => tryScroll(align));
9782
+ } else {
9783
+ console.warn(
9784
+ `Failed to scroll to index ${index} after ${maxAttempts} attempts.`
9785
+ );
9786
+ }
9787
+ };
9788
+ tryScroll(initialAlign);
9789
+ };
9790
+ this.scrollBy = (delta, { behavior } = {}) => {
9791
+ if (behavior === "smooth" && this.isDynamicMode()) {
9792
+ console.warn(
9793
+ "The `smooth` scroll behavior is not fully supported with dynamic size."
9794
+ );
9188
9795
  }
9189
- },
9190
- [dates, onYearSelection]
9796
+ this._scrollToOffset(this.getScrollOffset() + delta, {
9797
+ adjustments: void 0,
9798
+ behavior
9799
+ });
9800
+ };
9801
+ this.getTotalSize = () => {
9802
+ var _a;
9803
+ const measurements = this.getMeasurements();
9804
+ let end;
9805
+ if (measurements.length === 0) {
9806
+ end = this.options.paddingStart;
9807
+ } else if (this.options.lanes === 1) {
9808
+ end = ((_a = measurements[measurements.length - 1]) == null ? void 0 : _a.end) ?? 0;
9809
+ } else {
9810
+ const endByLane = Array(this.options.lanes).fill(null);
9811
+ let endIndex = measurements.length - 1;
9812
+ while (endIndex >= 0 && endByLane.some((val) => val === null)) {
9813
+ const item = measurements[endIndex];
9814
+ if (endByLane[item.lane] === null) {
9815
+ endByLane[item.lane] = item.end;
9816
+ }
9817
+ endIndex--;
9818
+ }
9819
+ end = Math.max(...endByLane.filter((val) => val !== null));
9820
+ }
9821
+ return Math.max(
9822
+ end - this.options.scrollMargin + this.options.paddingEnd,
9823
+ 0
9824
+ );
9825
+ };
9826
+ this._scrollToOffset = (offset, {
9827
+ adjustments,
9828
+ behavior
9829
+ }) => {
9830
+ this.options.scrollToFn(offset, { behavior, adjustments }, this);
9831
+ };
9832
+ this.measure = () => {
9833
+ this.itemSizeCache = /* @__PURE__ */ new Map();
9834
+ this.notify(false);
9835
+ };
9836
+ this.setOptions(opts);
9837
+ }
9838
+ }
9839
+ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
9840
+ while (low <= high) {
9841
+ const middle = (low + high) / 2 | 0;
9842
+ const currentValue = getCurrentValue(middle);
9843
+ if (currentValue < value) {
9844
+ low = middle + 1;
9845
+ } else if (currentValue > value) {
9846
+ high = middle - 1;
9847
+ } else {
9848
+ return middle;
9849
+ }
9850
+ }
9851
+ if (low > 0) {
9852
+ return low - 1;
9853
+ } else {
9854
+ return 0;
9855
+ }
9856
+ };
9857
+ function calculateRange({
9858
+ measurements,
9859
+ outerSize,
9860
+ scrollOffset,
9861
+ lanes
9862
+ }) {
9863
+ const lastIndex = measurements.length - 1;
9864
+ const getOffset = (index) => measurements[index].start;
9865
+ if (measurements.length <= lanes) {
9866
+ return {
9867
+ startIndex: 0,
9868
+ endIndex: lastIndex
9869
+ };
9870
+ }
9871
+ let startIndex = findNearestBinarySearch(
9872
+ 0,
9873
+ lastIndex,
9874
+ getOffset,
9875
+ scrollOffset
9876
+ );
9877
+ let endIndex = startIndex;
9878
+ if (lanes === 1) {
9879
+ while (endIndex < lastIndex && measurements[endIndex].end < scrollOffset + outerSize) {
9880
+ endIndex++;
9881
+ }
9882
+ } else if (lanes > 1) {
9883
+ const endPerLane = Array(lanes).fill(0);
9884
+ while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {
9885
+ const item = measurements[endIndex];
9886
+ endPerLane[item.lane] = item.end;
9887
+ endIndex++;
9888
+ }
9889
+ const startPerLane = Array(lanes).fill(scrollOffset + outerSize);
9890
+ while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {
9891
+ const item = measurements[startIndex];
9892
+ startPerLane[item.lane] = item.start;
9893
+ startIndex--;
9894
+ }
9895
+ startIndex = Math.max(0, startIndex - startIndex % lanes);
9896
+ endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));
9897
+ }
9898
+ return { startIndex, endIndex };
9899
+ }
9900
+
9901
+ const useIsomorphicLayoutEffect = typeof document !== "undefined" ? React.useLayoutEffect : React.useEffect;
9902
+ function useVirtualizerBase(options) {
9903
+ const rerender = React.useReducer(() => ({}), {})[1];
9904
+ const resolvedOptions = {
9905
+ ...options,
9906
+ onChange: (instance2, sync) => {
9907
+ var _a;
9908
+ if (sync) {
9909
+ flushSync(rerender);
9910
+ } else {
9911
+ rerender();
9912
+ }
9913
+ (_a = options.onChange) == null ? void 0 : _a.call(options, instance2, sync);
9914
+ }
9915
+ };
9916
+ const [instance] = React.useState(
9917
+ () => new Virtualizer(resolvedOptions)
9191
9918
  );
9919
+ instance.setOptions(resolvedOptions);
9920
+ useIsomorphicLayoutEffect(() => {
9921
+ return instance._didMount();
9922
+ }, []);
9923
+ useIsomorphicLayoutEffect(() => {
9924
+ return instance._willUpdate();
9925
+ });
9926
+ return instance;
9927
+ }
9928
+ function useVirtualizer(options) {
9929
+ return useVirtualizerBase({
9930
+ observeElementRect,
9931
+ observeElementOffset,
9932
+ scrollToFn: elementScroll,
9933
+ ...options
9934
+ });
9935
+ }
9936
+
9937
+ const styles = {
9938
+ "year-selector": "_year-selector_1pxps_2",
9939
+ "year-grid": "_year-grid_1pxps_9",
9940
+ "year-item": "_year-item_1pxps_26",
9941
+ "pseudo-focused": "_pseudo-focused_1pxps_29"
9942
+ };
9943
+
9944
+ const useYearSelectorKeys = ({
9945
+ columns,
9946
+ scrollToYear,
9947
+ initialFocus,
9948
+ onSelect,
9949
+ onConfirm,
9950
+ pseudoFocused,
9951
+ setPseudoFocused,
9952
+ min,
9953
+ max,
9954
+ disabled,
9955
+ required
9956
+ }) => {
9957
+ const listRef = useRef(null);
9958
+ useEffect(() => {
9959
+ const list = listRef.current;
9960
+ const handleKeyDown = (e) => {
9961
+ if (pseudoFocused === null) return;
9962
+ if ([
9963
+ "ArrowLeft",
9964
+ "ArrowRight",
9965
+ "ArrowUp",
9966
+ "ArrowDown",
9967
+ "Home",
9968
+ "PageUp",
9969
+ "PageDown",
9970
+ "Enter",
9971
+ " ",
9972
+ "Backspace",
9973
+ "Delete"
9974
+ ].includes(e.key)) {
9975
+ e.preventDefault();
9976
+ if (e.key === "ArrowLeft" || e.key === "ArrowRight" || e.key === "ArrowUp" || e.key === "ArrowDown") {
9977
+ const newYear = e.key === "ArrowLeft" || e.key === "ArrowUp" ? pseudoFocused - 1 : pseudoFocused + 1;
9978
+ const clampedYear = Math.min(Math.max(newYear, min), max);
9979
+ scrollToYear(newYear, { focus: true });
9980
+ setPseudoFocused(newYear);
9981
+ if (!disabled) {
9982
+ onSelect(clampedYear);
9983
+ }
9984
+ return;
9985
+ }
9986
+ if (!required && (e.key === "Backspace" || e.key === "Delete")) {
9987
+ onSelect(null);
9988
+ return;
9989
+ }
9990
+ if (e.key === "PageUp" || e.key === "PageDown") {
9991
+ const newYear = e.key === "PageUp" ? min : max;
9992
+ scrollToYear(newYear, { focus: true });
9993
+ setPseudoFocused(newYear);
9994
+ if (!disabled) {
9995
+ onSelect(newYear);
9996
+ }
9997
+ return;
9998
+ }
9999
+ if (e.key === "Home") {
10000
+ scrollToYear(initialFocus, { focus: true });
10001
+ setPseudoFocused(initialFocus);
10002
+ if (!disabled) {
10003
+ onSelect(initialFocus);
10004
+ }
10005
+ return;
10006
+ }
10007
+ if (e.key === "Enter" || e.key === " ") {
10008
+ if (!disabled) {
10009
+ onConfirm();
10010
+ }
10011
+ return;
10012
+ }
10013
+ }
10014
+ };
10015
+ list?.addEventListener("keydown", handleKeyDown);
10016
+ return () => {
10017
+ list?.removeEventListener("keydown", handleKeyDown);
10018
+ };
10019
+ }, [
10020
+ pseudoFocused,
10021
+ columns,
10022
+ scrollToYear,
10023
+ onSelect,
10024
+ min,
10025
+ max,
10026
+ initialFocus,
10027
+ disabled,
10028
+ setPseudoFocused,
10029
+ required,
10030
+ onConfirm
10031
+ ]);
10032
+ return { listRef };
10033
+ };
10034
+
10035
+ const YearItem = ({
10036
+ year,
10037
+ onChange,
10038
+ selected,
10039
+ pseudoFocused,
10040
+ disabled,
10041
+ onFocus,
10042
+ ...rest
10043
+ }) => {
9192
10044
  return /* @__PURE__ */ jsx(
9193
- "div",
10045
+ SelectCard,
9194
10046
  {
9195
- ref: combinedRef,
9196
- "data-anv": "calendar-year-selection",
9197
- className: classes,
9198
- ...props,
9199
- children: /* @__PURE__ */ jsx("div", { role: "grid", "aria-label": "Calendar year selection", children: /* @__PURE__ */ jsx(
9200
- Grid,
9201
- {
9202
- templateColumns: "repeat(2, minmax(0, 1fr))",
9203
- gap: 3,
9204
- onKeyDown: handleKeyDown,
9205
- role: "row",
9206
- children: dates.map(({ year, disabled }, index) => {
9207
- const yearDate = DateTime.fromObject({ year }).toFormat("yyyy");
9208
- return /* @__PURE__ */ jsx("div", { role: "gridcell", children: /* @__PURE__ */ jsx(
9209
- SelectCard,
9210
- {
9211
- id: yearDate,
9212
- onChange: () => onYearSelection(year),
9213
- checked: selectedYear === year,
9214
- checkboxProps: {
9215
- className: styles["selection-checkbox"],
9216
- tabIndex: focusedIndex === index ? 0 : -1
9217
- },
9218
- className: styles["selection-card"],
9219
- disabled,
9220
- children: yearDate
9221
- }
9222
- ) }, yearDate);
9223
- })
9224
- }
9225
- ) })
10047
+ disabled,
10048
+ id: year,
10049
+ onChange: !disabled ? () => onChange(year) : () => {
10050
+ },
10051
+ checked: selected,
10052
+ checkboxProps: {
10053
+ tabIndex: -1,
10054
+ onFocus
10055
+ },
10056
+ flexGrow: 1,
10057
+ className: cx(styles["year-item"], {
10058
+ [styles["pseudo-focused"]]: pseudoFocused
10059
+ }),
10060
+ "data-year": year,
10061
+ tabIndex: -1,
10062
+ ...rest,
10063
+ children: year
9226
10064
  }
9227
10065
  );
9228
- });
9229
- CalendarYearSelection.displayName = "CalendarYearSelection";
10066
+ };
10067
+
10068
+ const DEFAULT_MIN = 1900;
10069
+ const DEFAULT_MAX = 2200;
10070
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
10071
+ const YearSelector = forwardRef(
10072
+ ({
10073
+ min = DEFAULT_MIN,
10074
+ max = DEFAULT_MAX,
10075
+ value: valueProp,
10076
+ defaultValue: defaultValueProp,
10077
+ onChange,
10078
+ onConfirm,
10079
+ startingYear = currentYear,
10080
+ columns: columnsProp,
10081
+ className,
10082
+ required = false,
10083
+ disabled = false,
10084
+ ariaLabel = "Year selection",
10085
+ rootProps
10086
+ }, ref) => {
10087
+ const columns = Math.max(columnsProp ?? 2, 1);
10088
+ const [value, setValue] = useOptionallyControlledState({
10089
+ controlledValue: valueProp,
10090
+ defaultValue: defaultValueProp ?? null,
10091
+ onChange
10092
+ });
10093
+ const previousValue = usePrevious(value);
10094
+ const initialFocusYear = value ?? startingYear;
10095
+ const [pseudoFocused, setPseudoFocused] = useState(initialFocusYear);
10096
+ const handleChange = (year) => {
10097
+ if (!required && value === year) {
10098
+ setValue(null);
10099
+ return;
10100
+ }
10101
+ setValue(year);
10102
+ if (year !== null) {
10103
+ setPseudoFocused(year);
10104
+ }
10105
+ };
10106
+ const handleItemChange = (year) => {
10107
+ handleChange(year);
10108
+ onConfirm?.(year);
10109
+ };
10110
+ const gap = 12;
10111
+ const rowHeight = 58;
10112
+ const rowCount = Math.ceil((max - min + 1) / columns);
10113
+ const initialOffset = (initialFocusYear - min) * (rowHeight + gap) / columns + gap / 2;
10114
+ const rowVirtualizer = useVirtualizer({
10115
+ count: rowCount,
10116
+ getScrollElement: () => parentRef.current,
10117
+ estimateSize: () => rowHeight,
10118
+ gap,
10119
+ initialOffset,
10120
+ paddingEnd: gap / 2
10121
+ });
10122
+ const scrollToYear = useCallback(
10123
+ (year, { focus } = {}) => {
10124
+ const index = Math.floor((year - min) / columns);
10125
+ rowVirtualizer.scrollToIndex(index, { align: "center" });
10126
+ if (focus) {
10127
+ setPseudoFocused(year);
10128
+ }
10129
+ },
10130
+ [min, columns, rowVirtualizer, setPseudoFocused]
10131
+ );
10132
+ const parentRef = useRef(null);
10133
+ const { listRef } = useYearSelectorKeys({
10134
+ columns,
10135
+ scrollToYear,
10136
+ initialFocus: initialFocusYear,
10137
+ onSelect: handleChange,
10138
+ onConfirm: () => onConfirm?.(value),
10139
+ min,
10140
+ max,
10141
+ disabled,
10142
+ pseudoFocused,
10143
+ setPseudoFocused,
10144
+ required
10145
+ });
10146
+ useEffect(() => {
10147
+ if (value !== null && previousValue !== value) {
10148
+ scrollToYear(value, { focus: true });
10149
+ }
10150
+ }, [value, previousValue, scrollToYear, listRef]);
10151
+ const jointRef = useMergeRefs([parentRef, listRef, ref]);
10152
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
10153
+ "div",
10154
+ {
10155
+ ref: jointRef,
10156
+ "aria-label": ariaLabel,
10157
+ tabIndex: 0,
10158
+ className: cx(styles["year-selector"], className),
10159
+ role: "spinbutton",
10160
+ "aria-valuenow": value ?? void 0,
10161
+ "aria-valuemin": min,
10162
+ "aria-valuemax": max,
10163
+ "aria-valuetext": value ? `${value}` : "No year selected",
10164
+ "data-test": rowVirtualizer.options.paddingEnd,
10165
+ style: {
10166
+ maxHeight: `${rowVirtualizer.getTotalSize() + 8}px`
10167
+ },
10168
+ ...rootProps,
10169
+ children: /* @__PURE__ */ jsx(
10170
+ "div",
10171
+ {
10172
+ style: {
10173
+ height: `${rowVirtualizer.getTotalSize()}px`,
10174
+ width: "100%",
10175
+ position: "relative"
10176
+ },
10177
+ children: rowVirtualizer.getVirtualItems().map((virtualItem) => {
10178
+ const years = Array.from(
10179
+ { length: columns },
10180
+ (_, i) => virtualItem.index * columns + i + min
10181
+ );
10182
+ return /* @__PURE__ */ jsx(
10183
+ "div",
10184
+ {
10185
+ "data-testid": "v-row",
10186
+ className: styles["year-grid"],
10187
+ style: {
10188
+ transform: `translateY(${virtualItem.start}px)`,
10189
+ gridTemplateColumns: `repeat(${columns}, 1fr)`
10190
+ },
10191
+ children: years.map((year) => {
10192
+ if (year > max) return /* @__PURE__ */ jsx("div", {}, year);
10193
+ return /* @__PURE__ */ jsx(
10194
+ YearItem,
10195
+ {
10196
+ disabled,
10197
+ year,
10198
+ onChange: handleItemChange,
10199
+ selected: value === year,
10200
+ pseudoFocused: pseudoFocused === year,
10201
+ onFocus: () => {
10202
+ listRef.current?.focus();
10203
+ setPseudoFocused(year);
10204
+ }
10205
+ },
10206
+ year
10207
+ );
10208
+ })
10209
+ },
10210
+ virtualItem.key
10211
+ );
10212
+ })
10213
+ }
10214
+ )
10215
+ }
10216
+ ) });
10217
+ }
10218
+ );
10219
+ YearSelector.displayName = "YearSelector";
9230
10220
 
9231
10221
  const CalendarElement = forwardRef(
9232
10222
  (props, ref) => {
@@ -9261,6 +10251,8 @@ const CalendarElement = forwardRef(
9261
10251
  const combinedRef = useMergeRefs([ref, calendarRef]);
9262
10252
  const lastIValue = useRef(iValue);
9263
10253
  const buttonsRef = useRef(void 0);
10254
+ const yearButtonRef = useRef(null);
10255
+ const monthButtonRef = useRef(null);
9264
10256
  const [calendarWidth, setCalendarWidth] = useState(
9265
10257
  void 0
9266
10258
  );
@@ -9285,7 +10277,7 @@ const CalendarElement = forwardRef(
9285
10277
  ...style,
9286
10278
  ...layoutStyles
9287
10279
  };
9288
- const classNameCombined = cx(styles["calendar"], className);
10280
+ const classNameCombined = cx(styles$1["calendar"], className);
9289
10281
  const { nDate, nDefaultDate, nToday } = useMemo(
9290
10282
  () => ({
9291
10283
  nDate: iValue ? typeof iValue === "string" ? normalizeDate(iValue, defaultTimeZone) : {
@@ -9463,6 +10455,7 @@ const CalendarElement = forwardRef(
9463
10455
  }, []);
9464
10456
  const handleMonthSelection = useCallback(
9465
10457
  (month) => {
10458
+ monthButtonRef.current?.focus();
9466
10459
  setSelectedMonth(month);
9467
10460
  setFocusedDate(
9468
10461
  DateTime.fromObject({
@@ -9477,6 +10470,8 @@ const CalendarElement = forwardRef(
9477
10470
  );
9478
10471
  const handleYearSelection = useCallback(
9479
10472
  (year) => {
10473
+ if (year === null) return;
10474
+ yearButtonRef.current?.focus();
9480
10475
  setSelectedYear(year);
9481
10476
  setFocusedDate(
9482
10477
  DateTime.fromObject({
@@ -9487,7 +10482,7 @@ const CalendarElement = forwardRef(
9487
10482
  );
9488
10483
  setCalendarSelectionState("day");
9489
10484
  },
9490
- [focusedDate]
10485
+ [defaultTimeZone, focusedDate?.month]
9491
10486
  );
9492
10487
  return /* @__PURE__ */ jsx(CalendarContext.Provider, { value: providerValue, children: /* @__PURE__ */ jsxs(
9493
10488
  "div",
@@ -9499,17 +10494,18 @@ const CalendarElement = forwardRef(
9499
10494
  "data-anv": "calendar",
9500
10495
  ...remainingProps,
9501
10496
  children: [
9502
- /* @__PURE__ */ jsx("div", { className: styles["header"], children: /* @__PURE__ */ jsxs(
10497
+ /* @__PURE__ */ jsx("div", { className: styles$1["header"], children: /* @__PURE__ */ jsxs(
9503
10498
  "span",
9504
10499
  {
9505
10500
  "aria-label": "Calendar navigation",
9506
10501
  role: "toolbar",
9507
10502
  onKeyDown: handleHeaderKeyDown,
9508
- className: styles["controller"],
10503
+ className: styles$1["controller"],
9509
10504
  children: [
9510
10505
  /* @__PURE__ */ jsx(
9511
10506
  CalendarMonthButton,
9512
10507
  {
10508
+ ref: monthButtonRef,
9513
10509
  "data-calendar-header-button": true,
9514
10510
  calendarSelectionState,
9515
10511
  onClick: () => setCalendarSelectionState(
@@ -9520,6 +10516,7 @@ const CalendarElement = forwardRef(
9520
10516
  /* @__PURE__ */ jsx(
9521
10517
  CalendarYearButton,
9522
10518
  {
10519
+ ref: yearButtonRef,
9523
10520
  tabIndex: -1,
9524
10521
  "data-calendar-header-button": true,
9525
10522
  calendarSelectionState,
@@ -9538,7 +10535,17 @@ const CalendarElement = forwardRef(
9538
10535
  ) }),
9539
10536
  calendarSelectionState === "day" && /* @__PURE__ */ jsx(CalendarMonth, {}),
9540
10537
  calendarSelectionState === "month" && /* @__PURE__ */ jsx(CalendarMonthSelection, { onMonthSelection: handleMonthSelection }),
9541
- calendarSelectionState === "year" && /* @__PURE__ */ jsx(CalendarYearSelection, { onYearSelection: handleYearSelection })
10538
+ calendarSelectionState === "year" && // Wrapper div provides some manual offsetting to account for internal padding of the year selector
10539
+ /* @__PURE__ */ jsx("div", { className: styles$1["year-selector"], children: /* @__PURE__ */ jsx(
10540
+ YearSelector,
10541
+ {
10542
+ onConfirm: handleYearSelection,
10543
+ required: true,
10544
+ defaultValue: selectedYear,
10545
+ min: normalizedMinDate?.year,
10546
+ max: normalizedMaxDate?.year
10547
+ }
10548
+ ) })
9542
10549
  ]
9543
10550
  }
9544
10551
  ) });
@@ -9628,4 +10635,4 @@ const Calendar = Object.assign(CalendarElement, {
9628
10635
  });
9629
10636
 
9630
10637
  export { Calendar as C, DateTime as D, CalendarNow as a, CalendarYearButton as b, CalendarPrev as c, CalendarNext as d, CalendarMonthButton as e, CalendarMonth as f, isValidDate as i, toDateString as t };
9631
- //# sourceMappingURL=Calendar-Dq_of5A3.js.map
10638
+ //# sourceMappingURL=Calendar-BQ5F2ENO.js.map