@lifesg/react-design-system 4.0.0-alpha.8 → 4.0.0-alpha.9

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 (199) hide show
  1. package/accordion/accordion-item.js.map +1 -1
  2. package/accordion/accordion.js.map +1 -1
  3. package/alert/alert.js.map +1 -1
  4. package/cjs/accordion/accordion-item.js.map +1 -1
  5. package/cjs/accordion/accordion.js.map +1 -1
  6. package/cjs/alert/alert.js.map +1 -1
  7. package/cjs/countdown-timer/countdown-timer.js.map +1 -1
  8. package/cjs/data-table/data-table.js +1 -1
  9. package/cjs/data-table/data-table.js.map +1 -1
  10. package/cjs/date-range-input/date-range-input.js.map +1 -1
  11. package/cjs/e-signature/e-signature-canvas.js.map +1 -1
  12. package/cjs/error-display/inactivity-timer.js.map +1 -1
  13. package/cjs/external/dompurify/dist/purify.es.js +2 -2
  14. package/cjs/external/dompurify/dist/purify.es.js.map +1 -1
  15. package/cjs/file-download/file-list-card/file-list-card.js.map +1 -1
  16. package/cjs/file-upload/custom-sensors.js.map +1 -1
  17. package/cjs/file-upload/file-list/file-list.js.map +1 -1
  18. package/cjs/filter/addons/filter-item-checkbox-helpers.js.map +1 -1
  19. package/cjs/filter/addons/filter-item-checkbox.js.map +1 -1
  20. package/cjs/filter/filter-item.js.map +1 -1
  21. package/cjs/filter/filter.js.map +1 -1
  22. package/cjs/form/form-textarea/form-textarea.js +1 -1
  23. package/cjs/form/form-textarea/form-textarea.js.map +1 -1
  24. package/cjs/fullscreen-image-carousel/stateful-image.js.map +1 -1
  25. package/cjs/histogram-slider/histogram-slider.js.map +1 -1
  26. package/cjs/input-range-slider/input-range-slider.js.map +1 -1
  27. package/cjs/input-slider/input-slider.js.map +1 -1
  28. package/cjs/input-textarea/textarea-counter.js.map +1 -1
  29. package/cjs/input-textarea/textarea.js +1 -1
  30. package/cjs/input-textarea/textarea.js.map +1 -1
  31. package/cjs/input-textarea/textarea.styles.js +1 -1
  32. package/cjs/input-textarea/textarea.styles.js.map +1 -1
  33. package/{input-textarea/textarea.styles_q77m5x.css → cjs/input-textarea/textarea.styles_6we7bs.css} +3 -1
  34. package/cjs/modal/index.js.map +1 -1
  35. package/cjs/modal-v2/modal-v2.js +1 -1
  36. package/cjs/modal-v2/modal-v2.js.map +1 -1
  37. package/cjs/modal-v2/slots/card.js +1 -1
  38. package/cjs/modal-v2/slots/card.js.map +1 -1
  39. package/cjs/modal-v2/slots/header.js +2 -0
  40. package/cjs/modal-v2/slots/header.js.map +1 -0
  41. package/cjs/modal-v2/slots/slot-styles.js +1 -1
  42. package/cjs/modal-v2/slots/slot-styles.js.map +1 -1
  43. package/cjs/modal-v2/slots/{slot-styles_13sd376.css → slot-styles_10ut1v7.css} +5 -1
  44. package/cjs/navbar/navbar-items.js +1 -1
  45. package/cjs/navbar/navbar-items.js.map +1 -1
  46. package/cjs/navbar/navbar-items.styles.js +1 -1
  47. package/cjs/navbar/navbar-items.styles.js.map +1 -1
  48. package/cjs/navbar/{navbar-items.styles_1i3ltot.css → navbar-items.styles_1b1zx.css} +9 -8
  49. package/cjs/navbar/navbar-logo-data.js +1 -1
  50. package/cjs/navbar/navbar-logo-data.js.map +1 -1
  51. package/cjs/navbar/navbar.js.map +1 -1
  52. package/cjs/otp-input/otp-input.js.map +1 -1
  53. package/cjs/overlay/overlay.js.map +1 -1
  54. package/cjs/pagination/pagination.js.map +1 -1
  55. package/cjs/phone-number-input/phone-number-input.js.map +1 -1
  56. package/cjs/predictive-text-input/predictive-text-input.js.map +1 -1
  57. package/cjs/shared/dropdown-list/dropdown-list.js.map +1 -1
  58. package/cjs/shared/internal-calendar/calendar-manager.js.map +1 -1
  59. package/cjs/shared/standalone-date-input/standalone-date-input.js.map +1 -1
  60. package/cjs/theme/types.js +1 -1
  61. package/cjs/theme/types.js.map +1 -1
  62. package/cjs/time-slot-bar/time-slot-bar.js.map +1 -1
  63. package/cjs/time-slot-bar-week/time-slot-bar-week-days.js.map +1 -1
  64. package/cjs/timetable/timetable.js.map +1 -1
  65. package/cjs/toggle/toggle-icon.js +1 -1
  66. package/cjs/toggle/toggle-icon.js.map +1 -1
  67. package/cjs/toggle/toggle-icon.styles.js +1 -1
  68. package/cjs/toggle/toggle-icon.styles.js.map +1 -1
  69. package/cjs/toggle/{toggle-icon.styles_ba71y.css → toggle-icon.styles_o6dxr3.css} +3 -2
  70. package/cjs/toggle/toggle.js +1 -1
  71. package/cjs/toggle/toggle.js.map +1 -1
  72. package/cjs/toggle/toggle.styles.js +1 -1
  73. package/cjs/toggle/toggle.styles.js.map +1 -1
  74. package/cjs/toggle/toggle.styles_11tmfsr.css +41 -0
  75. package/cjs/unit-number/unit-number-input.js.map +1 -1
  76. package/cjs/util/is-styled-components.js.map +1 -1
  77. package/cjs/util/string-helper.js +1 -1
  78. package/cjs/util/string-helper.js.map +1 -1
  79. package/cjs/util/use-event-listener.js.map +1 -1
  80. package/cjs/util/use-state-actions.js.map +1 -1
  81. package/countdown-timer/countdown-timer.js.map +1 -1
  82. package/data-table/data-table.js +1 -1
  83. package/data-table/data-table.js.map +1 -1
  84. package/data-table/types.d.ts +2 -2
  85. package/date-range-input/date-range-input.js.map +1 -1
  86. package/docs/component-catalog.json +1 -1
  87. package/e-signature/e-signature-canvas.js.map +1 -1
  88. package/error-display/inactivity-timer.js.map +1 -1
  89. package/external/dompurify/dist/purify.es.js +2 -2
  90. package/external/dompurify/dist/purify.es.js.map +1 -1
  91. package/file-download/file-list-card/file-list-card.js.map +1 -1
  92. package/file-upload/custom-sensors.d.ts +2 -2
  93. package/file-upload/custom-sensors.js.map +1 -1
  94. package/file-upload/file-list/file-list.js.map +1 -1
  95. package/filter/addons/filter-item-checkbox-helpers.js.map +1 -1
  96. package/filter/addons/filter-item-checkbox.js.map +1 -1
  97. package/filter/filter-item.js.map +1 -1
  98. package/filter/filter.js.map +1 -1
  99. package/form/form-textarea/form-textarea.js +1 -1
  100. package/form/form-textarea/form-textarea.js.map +1 -1
  101. package/fullscreen-image-carousel/stateful-image.js.map +1 -1
  102. package/fullscreen-image-carousel/types.d.ts +2 -2
  103. package/histogram-slider/histogram-slider.js.map +1 -1
  104. package/input-range-slider/input-range-slider.js.map +1 -1
  105. package/input-slider/input-slider.js.map +1 -1
  106. package/input-textarea/textarea-counter.js.map +1 -1
  107. package/input-textarea/textarea.js +1 -1
  108. package/input-textarea/textarea.js.map +1 -1
  109. package/input-textarea/textarea.styles.d.ts +2 -0
  110. package/input-textarea/textarea.styles.js +1 -1
  111. package/input-textarea/textarea.styles.js.map +1 -1
  112. package/{cjs/input-textarea/textarea.styles_q77m5x.css → input-textarea/textarea.styles_6we7bs.css} +3 -1
  113. package/input-textarea/types.d.ts +7 -0
  114. package/modal/index.d.ts +4 -0
  115. package/modal/index.js.map +1 -1
  116. package/modal/types.d.ts +2 -0
  117. package/modal-v2/modal-v2.d.ts +6 -0
  118. package/modal-v2/modal-v2.js +1 -1
  119. package/modal-v2/modal-v2.js.map +1 -1
  120. package/modal-v2/slots/card.js +1 -1
  121. package/modal-v2/slots/card.js.map +1 -1
  122. package/modal-v2/slots/header.d.ts +5 -0
  123. package/modal-v2/slots/header.js +2 -0
  124. package/modal-v2/slots/header.js.map +1 -0
  125. package/modal-v2/slots/index.d.ts +1 -0
  126. package/modal-v2/slots/slot-styles.d.ts +4 -0
  127. package/modal-v2/slots/slot-styles.js +1 -1
  128. package/modal-v2/slots/slot-styles.js.map +1 -1
  129. package/modal-v2/slots/{slot-styles_13sd376.css → slot-styles_10ut1v7.css} +5 -1
  130. package/modal-v2/types.d.ts +21 -0
  131. package/navbar/navbar-items.js +1 -1
  132. package/navbar/navbar-items.js.map +1 -1
  133. package/navbar/navbar-items.styles.d.ts +2 -1
  134. package/navbar/navbar-items.styles.js +1 -1
  135. package/navbar/navbar-items.styles.js.map +1 -1
  136. package/navbar/{navbar-items.styles_1i3ltot.css → navbar-items.styles_1b1zx.css} +9 -8
  137. package/navbar/navbar-logo-data.js +1 -1
  138. package/navbar/navbar-logo-data.js.map +1 -1
  139. package/navbar/navbar.js.map +1 -1
  140. package/otp-input/otp-input.js.map +1 -1
  141. package/overlay/overlay.js.map +1 -1
  142. package/package.json +1 -1
  143. package/pagination/pagination.js.map +1 -1
  144. package/phone-number-input/phone-number-input.js.map +1 -1
  145. package/predictive-text-input/predictive-text-input.js.map +1 -1
  146. package/shared/dropdown-list/dropdown-list.js.map +1 -1
  147. package/shared/internal-calendar/calendar-manager.js.map +1 -1
  148. package/shared/standalone-date-input/standalone-date-input.js.map +1 -1
  149. package/theme/styles/a11y-playground.css +358 -87
  150. package/theme/styles/bookingsg.css +391 -85
  151. package/theme/styles/careercompass.css +396 -90
  152. package/theme/styles/ccube.css +402 -45
  153. package/theme/styles/imda.css +348 -85
  154. package/theme/styles/lifesg.css +377 -87
  155. package/theme/styles/mylegacy.css +382 -85
  156. package/theme/styles/oneservice.css +349 -86
  157. package/theme/styles/pa.css +172 -63
  158. package/theme/styles/rbs.css +403 -46
  159. package/theme/styles/sgw-digital-lobby.css +352 -87
  160. package/theme/styles/smgs.css +401 -95
  161. package/theme/styles/spf.css +208 -99
  162. package/theme/styles/supportgowhere.css +387 -90
  163. package/theme/styles/tote-board.css +816 -0
  164. package/theme/types.d.ts +1 -1
  165. package/theme/types.js +1 -1
  166. package/theme/types.js.map +1 -1
  167. package/time-slot-bar/time-slot-bar.js.map +1 -1
  168. package/time-slot-bar-week/time-slot-bar-week-days.js.map +1 -1
  169. package/timetable/timetable.js.map +1 -1
  170. package/toggle/toggle-icon.d.ts +2 -1
  171. package/toggle/toggle-icon.js +1 -1
  172. package/toggle/toggle-icon.js.map +1 -1
  173. package/toggle/toggle-icon.styles.d.ts +1 -0
  174. package/toggle/toggle-icon.styles.js +1 -1
  175. package/toggle/toggle-icon.styles.js.map +1 -1
  176. package/toggle/{toggle-icon.styles_ba71y.css → toggle-icon.styles_o6dxr3.css} +3 -2
  177. package/toggle/toggle.js +1 -1
  178. package/toggle/toggle.js.map +1 -1
  179. package/toggle/toggle.styles.d.ts +18 -15
  180. package/toggle/toggle.styles.js +1 -1
  181. package/toggle/toggle.styles.js.map +1 -1
  182. package/toggle/toggle.styles_11tmfsr.css +41 -0
  183. package/unit-number/unit-number-input.js.map +1 -1
  184. package/util/is-styled-components.js.map +1 -1
  185. package/util/string-helper.d.ts +2 -2
  186. package/util/string-helper.js +1 -1
  187. package/util/string-helper.js.map +1 -1
  188. package/util/use-event-listener.js.map +1 -1
  189. package/util/use-state-actions.js.map +1 -1
  190. package/cjs/form/form-textarea/form-textarea.styles.js +0 -2
  191. package/cjs/form/form-textarea/form-textarea.styles.js.map +0 -1
  192. package/cjs/form/form-textarea/form-textarea.styles_1kneyif.css +0 -3
  193. package/cjs/toggle/toggle.styles_1t5qrye.css +0 -38
  194. package/form/form-textarea/form-textarea.styles.d.ts +0 -3
  195. package/form/form-textarea/form-textarea.styles.js +0 -2
  196. package/form/form-textarea/form-textarea.styles.js.map +0 -1
  197. package/form/form-textarea/form-textarea.styles_1kneyif.css +0 -3
  198. package/theme/styles/default.css +0 -158
  199. package/toggle/toggle.styles_1t5qrye.css +0 -38
@@ -1 +1 @@
1
- {"version":3,"file":"calendar-manager.js","sources":["../../../src/shared/internal-calendar/calendar-manager.tsx"],"sourcesContent":["import { ChevronDownIcon } from \"@lifesg/react-icons/chevron-down\";\nimport { ChevronLeftIcon } from \"@lifesg/react-icons/chevron-left\";\nimport { ChevronRightIcon } from \"@lifesg/react-icons/chevron-right\";\nimport clsx from \"clsx\";\nimport type { Dayjs } from \"dayjs\";\nimport dayjs from \"dayjs\";\nimport React, { useEffect, useImperativeHandle, useRef, useState } from \"react\";\n\nimport { Button } from \"../../button\";\nimport { DateHelper } from \"../../util\";\nimport { CalendarHelper } from \"../../util/calendar-helper\";\nimport { inertValue } from \"../accessibility\";\nimport { ClickableIcon } from \"../clickable-icon\";\nimport * as styles from \"./calendar-manager.styles\";\nimport { InternalCalendarMonth } from \"./internal-calendar-month\";\nimport { InternalCalendarYear } from \"./internal-calendar-year\";\nimport type {\n CalendarAction,\n CalendarManagerProps,\n CalendarManagerRef,\n View,\n} from \"./types\";\n\nconst Component = (\n {\n children,\n initialCalendarDate,\n minDate,\n maxDate,\n currentFocus,\n selectedStartDate,\n selectedEndDate,\n selectWithinRange,\n dynamicHeight = false,\n allowDisabledSelection,\n onCalendarDateChange,\n /* action button props */\n withButton,\n doneButtonDisabled,\n onDismiss,\n /* header props */\n showNavigationHeader = true,\n getLeftArrowDate,\n getRightArrowDate,\n isLeftArrowDisabled: _isLeftArrowDisabled,\n isRightArrowDisabled: _isRightArrowDisabled,\n getMonthHeaderLabel,\n getYearHeaderLabel,\n isFocusable = false,\n ...otherProps\n }: CalendarManagerProps,\n ref: React.ForwardedRef<CalendarManagerRef>\n) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n // the current visible date in month/year views and header\n const [calendarDate, setCalendarDate] = useState<Dayjs>(\n DateHelper.toDayjs(initialCalendarDate)\n );\n // the selected date in month/year views and the current visible date in day view\n const [viewCalendarDate, setViewCalendarDate] = useState<Dayjs>(\n DateHelper.toDayjs(initialCalendarDate)\n );\n const [currentView, setCurrentView] = useState<View>(\"default\");\n\n const doneButtonRef = useRef<HTMLButtonElement>(null);\n const cancelButtonRef = useRef<HTMLButtonElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const yearDropdownRef = useRef<HTMLButtonElement>(null);\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useImperativeHandle(ref, () => {\n return {\n defaultView() {\n setCurrentView(\"default\");\n },\n resetView() {\n const date = DateHelper.toDayjs(initialCalendarDate);\n setCalendarDate(date);\n setViewCalendarDate(date);\n\n setCurrentView(\"default\");\n },\n setCalendarDate(value?: string) {\n const date = DateHelper.toDayjs(value);\n setCalendarDate(date);\n setViewCalendarDate(date);\n },\n };\n });\n\n useEffect(() => {\n const date = DateHelper.toDayjs(initialCalendarDate);\n setCalendarDate(date);\n setViewCalendarDate(date);\n }, [initialCalendarDate]);\n\n useEffect(() => {\n performOnCalendarDateChange(viewCalendarDate);\n // more accurate than calendarDate since it accounts for selection state\n // in month/year views\n }, [viewCalendarDate]);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleMonthDropdownClick = () => {\n if (currentView !== \"month-options\") {\n setCurrentView(\"month-options\");\n\n // Maintain focus when selecting month dropdown\n containerRef.current?.focus();\n } else {\n setCurrentView(\"default\");\n setCalendarDate(viewCalendarDate);\n }\n };\n\n const handleMonthDropdownKeydown = (\n event: React.KeyboardEvent<HTMLButtonElement>\n ) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handleMonthDropdownClick();\n yearDropdownRef.current?.focus(); // Focus on year dropdown after month selection\n }\n\n // Up and Down arrow keys will change the month\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const nextDate =\n event.key === \"ArrowUp\"\n ? calendarDate.subtract(1, \"month\")\n : calendarDate.add(1, \"month\");\n\n if (\n !CalendarHelper.isWithinRange(\n nextDate,\n minDate ? dayjs(minDate) : undefined,\n maxDate ? dayjs(maxDate) : undefined,\n \"month\"\n )\n )\n return;\n setCalendarDate(nextDate);\n\n if (currentView === \"default\") {\n setViewCalendarDate(nextDate);\n }\n }\n };\n\n const handleYearDropdownClick = () => {\n /**\n * If the view is in the month options view,\n * then clicking will send the view back to\n * default\n */\n if (currentView !== \"default\") {\n setCurrentView(\"default\");\n setCalendarDate(viewCalendarDate);\n } else {\n setCurrentView(\"year-options\");\n }\n };\n\n const handleYearDropdownKeydown = (\n event: React.KeyboardEvent<HTMLButtonElement>\n ) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handleYearDropdownClick();\n }\n\n // Up and Down arrow keys will change the year\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const isYearView = currentView === \"year-options\";\n let nextDate: Dayjs;\n\n if (isYearView) {\n // In year options view, change decade\n nextDate =\n event.key === \"ArrowUp\"\n ? calendarDate.subtract(10, \"year\")\n : calendarDate.add(10, \"year\");\n } else {\n // In default view, change year\n nextDate =\n event.key === \"ArrowUp\"\n ? calendarDate.subtract(1, \"year\")\n : calendarDate.add(1, \"year\");\n }\n\n if (\n !CalendarHelper.isWithinRange(\n nextDate,\n minDate ? dayjs(minDate) : undefined,\n maxDate ? dayjs(maxDate) : undefined,\n \"year\"\n )\n )\n return;\n\n setCalendarDate(nextDate);\n\n if (currentView === \"default\") {\n setViewCalendarDate(nextDate);\n }\n }\n };\n\n const handleLeftArrowClick = () => {\n // Maintain focus as button could become disabled\n containerRef.current?.focus();\n\n const nextDate = getLeftArrowDate\n ? getLeftArrowDate(calendarDate)\n : calendarDate.subtract(1, \"month\");\n\n switch (currentView) {\n case \"default\":\n setViewCalendarDate(nextDate);\n setCalendarDate(nextDate);\n break;\n case \"month-options\":\n setCalendarDate((date) => date.subtract(1, \"year\"));\n break;\n case \"year-options\":\n setCalendarDate((date) => date.subtract(10, \"year\"));\n break;\n }\n };\n\n const handleRightArrowClick = () => {\n // Maintain focus as button could become disabled\n containerRef.current?.focus();\n\n const nextDate = getRightArrowDate\n ? getRightArrowDate(calendarDate)\n : calendarDate.add(1, \"month\");\n\n switch (currentView) {\n case \"default\":\n setViewCalendarDate(nextDate);\n setCalendarDate(nextDate);\n break;\n case \"month-options\":\n setCalendarDate((date) => date.add(1, \"year\"));\n break;\n case \"year-options\":\n setCalendarDate((date) => date.add(10, \"year\"));\n break;\n }\n };\n\n const handleMonthYearSelect = (value: Dayjs) => {\n setCalendarDate(value);\n setViewCalendarDate(value);\n\n if (!withButton) {\n setCurrentView(\"default\");\n }\n };\n\n const handleCancelButton = () => {\n const initialValue = DateHelper.toDayjs(initialCalendarDate);\n setCalendarDate(initialValue);\n setViewCalendarDate(initialValue);\n\n if (currentView === \"default\") {\n performOnDismissHandler(\"reset\");\n } else {\n setCurrentView(\"default\");\n }\n };\n\n const handleDoneButton = (isDisabled: boolean | undefined) => {\n if (isDisabled) return;\n\n setCalendarDate(viewCalendarDate);\n\n if (currentView === \"default\") {\n performOnDismissHandler(\"confirmed\");\n } else {\n setCurrentView(\"default\");\n }\n };\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n const performOnCalendarDateChange = (date: Dayjs) => {\n if (onCalendarDateChange) {\n onCalendarDateChange(date);\n }\n };\n\n const performOnDismissHandler = (action: CalendarAction) => {\n if (onDismiss) {\n onDismiss(action);\n }\n };\n\n const isLeftArrowDisabled = () => {\n if (!minDate || allowDisabledSelection) {\n return false;\n }\n\n const min = dayjs(minDate);\n if (currentView === \"month-options\") {\n return !CalendarHelper.isPreviousYearWithinRange(calendarDate, min);\n } else if (currentView === \"year-options\") {\n return !CalendarHelper.isPreviousDecadeWithinRange(\n calendarDate,\n min\n );\n } else {\n if (_isLeftArrowDisabled) {\n return _isLeftArrowDisabled(calendarDate);\n }\n return !CalendarHelper.isPreviousMonthWithinRange(\n calendarDate,\n min\n );\n }\n };\n\n const isRightArrowDisabled = () => {\n if (!maxDate || allowDisabledSelection) {\n return false;\n }\n\n const max = dayjs(maxDate);\n if (currentView === \"month-options\") {\n return !CalendarHelper.isNextYearWithinRange(calendarDate, max);\n } else if (currentView === \"year-options\") {\n return !CalendarHelper.isNextDecadeWithinRange(calendarDate, max);\n } else {\n if (_isRightArrowDisabled) {\n return _isRightArrowDisabled(calendarDate);\n }\n return !CalendarHelper.isNextMonthWithinRange(calendarDate, max);\n }\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n\n const getYearHeaderText = (): string => {\n if (currentView === \"year-options\") {\n const { beginDecade, endDecade } =\n CalendarHelper.getStartEndDecade(calendarDate);\n\n return `${beginDecade} to ${endDecade}`;\n } else {\n return getYearHeaderLabel\n ? getYearHeaderLabel(calendarDate)\n : calendarDate.format(\"YYYY\");\n }\n };\n\n const renderDropdownButtons = () => {\n const monthLabel = getMonthHeaderLabel\n ? getMonthHeaderLabel(calendarDate)\n : calendarDate.format(\"MMM\");\n\n const fullMonthLabel = dayjs(monthLabel, \"MMM\").format(\"MMMM\");\n\n const yearLabel = getYearHeaderText();\n const viewToYearLabel: Record<View, string> = {\n \"month-options\": `${yearLabel}, Close month selection`,\n \"year-options\": `${yearLabel}, Close year selection`,\n default: `${yearLabel}, Select year`,\n };\n\n return (\n <>\n <button\n className={clsx(\n styles.dropdownButton,\n currentView !== \"default\" && styles.hidden\n )}\n aria-label={`${fullMonthLabel}, Select month`}\n type=\"button\"\n id=\"month-dropdown\"\n onClick={handleMonthDropdownClick}\n onKeyDown={handleMonthDropdownKeydown}\n tabIndex={isFocusable ? 0 : -1}\n >\n <span className={styles.dropdownText}>{monthLabel}</span>\n <ChevronDownIcon\n className={clsx(\n styles.icon,\n styles.iconChevronDown,\n currentView === \"month-options\" &&\n styles.iconChevronDownExpanded\n )}\n />\n </button>\n <button\n ref={yearDropdownRef}\n className={styles.dropdownButton}\n aria-label={viewToYearLabel[currentView]}\n type=\"button\"\n id=\"year-dropdown\"\n onClick={handleYearDropdownClick}\n onKeyDown={handleYearDropdownKeydown}\n tabIndex={isFocusable ? 0 : -1}\n >\n <span className={styles.dropdownText}>{yearLabel}</span>\n <ChevronDownIcon\n className={clsx(\n styles.icon,\n styles.iconChevronDown,\n currentView !== \"default\" &&\n styles.iconChevronDownExpanded\n )}\n />\n </button>\n </>\n );\n };\n\n const renderOptionsOverlay = () => {\n switch (currentView) {\n case \"month-options\":\n return (\n <InternalCalendarMonth\n calendarDate={calendarDate}\n currentFocus={currentFocus}\n minDate={minDate}\n maxDate={maxDate}\n selectedStartDate={selectedStartDate}\n selectedEndDate={selectedEndDate}\n viewCalendarDate={viewCalendarDate}\n isNewSelection={!!selectWithinRange}\n onMonthSelect={handleMonthYearSelect}\n allowDisabledSelection={allowDisabledSelection}\n />\n );\n case \"year-options\":\n return (\n <InternalCalendarYear\n setCalendarDate={setCalendarDate}\n calendarDate={calendarDate}\n currentFocus={currentFocus}\n minDate={minDate}\n maxDate={maxDate}\n selectedStartDate={selectedStartDate}\n selectedEndDate={selectedEndDate}\n viewCalendarDate={viewCalendarDate}\n isNewSelection={!!selectWithinRange}\n onYearSelect={handleMonthYearSelect}\n allowDisabledSelection={allowDisabledSelection}\n />\n );\n default:\n return null;\n }\n };\n\n const renderHeader = () => {\n const viewToSelection: Record<View, string> = {\n \"month-options\": \"year\",\n \"year-options\": \"decade\",\n default: \"month\",\n };\n\n const selection = viewToSelection[currentView];\n\n return (\n <div\n className={styles.header}\n data-id=\"calendar-header\"\n data-testid=\"calendar-header\"\n >\n <div className={styles.headerInputDropdown}>\n {renderDropdownButtons()}\n </div>\n <div className={styles.headerArrows}>\n <ClickableIcon\n className={styles.headerArrowButton}\n aria-label={`Previous ${selection}`}\n data-testid=\"left-arrow-btn\"\n disabled={isLeftArrowDisabled()}\n focusHighlight={false}\n focusOutline=\"browser\"\n onClick={handleLeftArrowClick}\n tabIndex={isFocusable ? 0 : -1}\n >\n <ChevronLeftIcon className={styles.icon} />\n </ClickableIcon>\n <ClickableIcon\n className={styles.headerArrowButton}\n aria-label={`Next ${selection}`}\n data-testid=\"right-arrow-btn\"\n disabled={isRightArrowDisabled()}\n focusHighlight={false}\n focusOutline=\"browser\"\n onClick={handleRightArrowClick}\n tabIndex={isFocusable ? 0 : -1}\n >\n <ChevronRightIcon className={styles.icon} />\n </ClickableIcon>\n </div>\n </div>\n );\n };\n\n const renderActionButtons = () => {\n if (!withButton) return;\n\n const isDayView = currentView === \"default\";\n\n const disabled = !isDayView ? false : doneButtonDisabled;\n\n return (\n <div className={styles.actionButtonSection}>\n <Button\n className={styles.actionButton}\n ref={cancelButtonRef}\n data-testid=\"cancel-button\"\n styleType=\"light\"\n type=\"button\"\n onClick={handleCancelButton}\n sizeType=\"small\"\n >\n Cancel\n </Button>\n <Button\n className={styles.actionButton}\n data-testid=\"done-button\"\n ref={doneButtonRef}\n type=\"button\"\n onClick={() => handleDoneButton(disabled)}\n disabled={disabled}\n sizeType=\"small\"\n >\n Done\n </Button>\n </div>\n );\n };\n\n const renderViews = () => {\n const defaultView =\n typeof children === \"function\"\n ? children({ calendarDate: viewCalendarDate, currentView })\n : children;\n\n if (dynamicHeight) {\n return (\n <>\n {currentView === \"default\" && defaultView}\n {renderOptionsOverlay()}\n </>\n );\n } else {\n const isDefaultView = currentView === \"default\";\n return (\n // Prevent interaction with the default view when options are open\n <>\n <div\n className={styles.defaultView}\n inert={inertValue(!isDefaultView)}\n >\n {defaultView}\n </div>\n <div\n className={clsx(\n styles.optionsOverlay,\n isDefaultView && styles.hidden\n )}\n >\n {renderOptionsOverlay()}\n </div>\n </>\n );\n }\n };\n\n return (\n <div\n className={styles.container}\n ref={containerRef}\n data-id=\"calendar-container\"\n data-testid=\"calendar-container\"\n aria-label={viewCalendarDate.format(\"MMMM, YYYY\")}\n role=\"group\"\n {...otherProps}\n >\n {showNavigationHeader && renderHeader()}\n <div className={styles.toggleZone} data-testid=\"toggle-zone\">\n {renderViews()}\n </div>\n {renderActionButtons()}\n </div>\n );\n};\n\nexport const CalendarManager = React.forwardRef(Component);\n"],"names":["CalendarManager","React","forwardRef","_a","ref","children","initialCalendarDate","minDate","maxDate","currentFocus","selectedStartDate","selectedEndDate","selectWithinRange","dynamicHeight","allowDisabledSelection","onCalendarDateChange","withButton","doneButtonDisabled","onDismiss","showNavigationHeader","getLeftArrowDate","getRightArrowDate","isLeftArrowDisabled","_isLeftArrowDisabled","isRightArrowDisabled","_isRightArrowDisabled","getMonthHeaderLabel","getYearHeaderLabel","isFocusable","otherProps","__rest","calendarDate","setCalendarDate","useState","DateHelper","toDayjs","viewCalendarDate","setViewCalendarDate","currentView","setCurrentView","doneButtonRef","useRef","cancelButtonRef","containerRef","yearDropdownRef","useImperativeHandle","defaultView","resetView","date","value","useEffect","performOnCalendarDateChange","handleMonthDropdownClick","current","focus","handleMonthDropdownKeydown","event","key","preventDefault","nextDate","subtract","add","CalendarHelper","isWithinRange","dayjs","undefined","handleYearDropdownClick","handleYearDropdownKeydown","handleLeftArrowClick","handleRightArrowClick","handleMonthYearSelect","handleCancelButton","initialValue","performOnDismissHandler","action","min","isPreviousYearWithinRange","isPreviousDecadeWithinRange","isPreviousMonthWithinRange","max","isNextYearWithinRange","isNextDecadeWithinRange","isNextMonthWithinRange","renderDropdownButtons","monthLabel","format","fullMonthLabel","yearLabel","beginDecade","endDecade","getStartEndDecade","getYearHeaderText","viewToYearLabel","default","_jsxs","_Fragment","className","clsx","styles.dropdownButton","styles.hidden","type","id","onClick","onKeyDown","tabIndex","_jsx","styles.dropdownText","ChevronDownIcon","styles.icon","styles.iconChevronDown","styles.iconChevronDownExpanded","renderOptionsOverlay","InternalCalendarMonth","isNewSelection","onMonthSelect","InternalCalendarYear","onYearSelect","styles.container","role","selection","styles.header","styles.headerInputDropdown","styles.headerArrows","ClickableIcon","styles.headerArrowButton","disabled","focusHighlight","focusOutline","ChevronLeftIcon","ChevronRightIcon","renderHeader","styles.toggleZone","isDefaultView","styles.defaultView","inert","inertValue","styles.optionsOverlay","renderViews","styles.actionButtonSection","Button","styles.actionButton","styleType","sizeType","renderActionButtons"],"mappings":"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"}
1
+ {"version":3,"file":"calendar-manager.js","sources":["../../../src/shared/internal-calendar/calendar-manager.tsx"],"sourcesContent":["import { ChevronDownIcon } from \"@lifesg/react-icons/chevron-down\";\nimport { ChevronLeftIcon } from \"@lifesg/react-icons/chevron-left\";\nimport { ChevronRightIcon } from \"@lifesg/react-icons/chevron-right\";\nimport clsx from \"clsx\";\nimport type { Dayjs } from \"dayjs\";\nimport dayjs from \"dayjs\";\nimport React, { useEffect, useImperativeHandle, useRef, useState } from \"react\";\n\nimport { Button } from \"../../button\";\nimport { DateHelper } from \"../../util\";\nimport { CalendarHelper } from \"../../util/calendar-helper\";\nimport { inertValue } from \"../accessibility\";\nimport { ClickableIcon } from \"../clickable-icon\";\nimport * as styles from \"./calendar-manager.styles\";\nimport { InternalCalendarMonth } from \"./internal-calendar-month\";\nimport { InternalCalendarYear } from \"./internal-calendar-year\";\nimport type {\n CalendarAction,\n CalendarManagerProps,\n CalendarManagerRef,\n View,\n} from \"./types\";\n\nconst Component = (\n {\n children,\n initialCalendarDate,\n minDate,\n maxDate,\n currentFocus,\n selectedStartDate,\n selectedEndDate,\n selectWithinRange,\n dynamicHeight = false,\n allowDisabledSelection,\n onCalendarDateChange,\n /* action button props */\n withButton,\n doneButtonDisabled,\n onDismiss,\n /* header props */\n showNavigationHeader = true,\n getLeftArrowDate,\n getRightArrowDate,\n isLeftArrowDisabled: _isLeftArrowDisabled,\n isRightArrowDisabled: _isRightArrowDisabled,\n getMonthHeaderLabel,\n getYearHeaderLabel,\n isFocusable = false,\n ...otherProps\n }: CalendarManagerProps,\n ref: React.ForwardedRef<CalendarManagerRef>\n) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n // the current visible date in month/year views and header\n const [calendarDate, setCalendarDate] = useState<Dayjs>(\n DateHelper.toDayjs(initialCalendarDate)\n );\n // the selected date in month/year views and the current visible date in day view\n const [viewCalendarDate, setViewCalendarDate] = useState<Dayjs>(\n DateHelper.toDayjs(initialCalendarDate)\n );\n const [currentView, setCurrentView] = useState<View>(\"default\");\n\n const doneButtonRef = useRef<HTMLButtonElement>(null);\n const cancelButtonRef = useRef<HTMLButtonElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const yearDropdownRef = useRef<HTMLButtonElement>(null);\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useImperativeHandle(ref, () => {\n return {\n defaultView() {\n setCurrentView(\"default\");\n },\n resetView() {\n const date = DateHelper.toDayjs(initialCalendarDate);\n setCalendarDate(date);\n setViewCalendarDate(date);\n\n setCurrentView(\"default\");\n },\n setCalendarDate(value?: string) {\n const date = DateHelper.toDayjs(value);\n setCalendarDate(date);\n setViewCalendarDate(date);\n },\n };\n });\n\n useEffect(() => {\n const date = DateHelper.toDayjs(initialCalendarDate);\n setCalendarDate(date);\n setViewCalendarDate(date);\n }, [initialCalendarDate]);\n\n useEffect(() => {\n performOnCalendarDateChange(viewCalendarDate);\n // more accurate than calendarDate since it accounts for selection state\n // in month/year views\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [viewCalendarDate]);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleMonthDropdownClick = () => {\n if (currentView !== \"month-options\") {\n setCurrentView(\"month-options\");\n\n // Maintain focus when selecting month dropdown\n containerRef.current?.focus();\n } else {\n setCurrentView(\"default\");\n setCalendarDate(viewCalendarDate);\n }\n };\n\n const handleMonthDropdownKeydown = (\n event: React.KeyboardEvent<HTMLButtonElement>\n ) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handleMonthDropdownClick();\n yearDropdownRef.current?.focus(); // Focus on year dropdown after month selection\n }\n\n // Up and Down arrow keys will change the month\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const nextDate =\n event.key === \"ArrowUp\"\n ? calendarDate.subtract(1, \"month\")\n : calendarDate.add(1, \"month\");\n\n if (\n !CalendarHelper.isWithinRange(\n nextDate,\n minDate ? dayjs(minDate) : undefined,\n maxDate ? dayjs(maxDate) : undefined,\n \"month\"\n )\n )\n return;\n setCalendarDate(nextDate);\n\n if (currentView === \"default\") {\n setViewCalendarDate(nextDate);\n }\n }\n };\n\n const handleYearDropdownClick = () => {\n /**\n * If the view is in the month options view,\n * then clicking will send the view back to\n * default\n */\n if (currentView !== \"default\") {\n setCurrentView(\"default\");\n setCalendarDate(viewCalendarDate);\n } else {\n setCurrentView(\"year-options\");\n }\n };\n\n const handleYearDropdownKeydown = (\n event: React.KeyboardEvent<HTMLButtonElement>\n ) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handleYearDropdownClick();\n }\n\n // Up and Down arrow keys will change the year\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const isYearView = currentView === \"year-options\";\n let nextDate: Dayjs;\n\n if (isYearView) {\n // In year options view, change decade\n nextDate =\n event.key === \"ArrowUp\"\n ? calendarDate.subtract(10, \"year\")\n : calendarDate.add(10, \"year\");\n } else {\n // In default view, change year\n nextDate =\n event.key === \"ArrowUp\"\n ? calendarDate.subtract(1, \"year\")\n : calendarDate.add(1, \"year\");\n }\n\n if (\n !CalendarHelper.isWithinRange(\n nextDate,\n minDate ? dayjs(minDate) : undefined,\n maxDate ? dayjs(maxDate) : undefined,\n \"year\"\n )\n )\n return;\n\n setCalendarDate(nextDate);\n\n if (currentView === \"default\") {\n setViewCalendarDate(nextDate);\n }\n }\n };\n\n const handleLeftArrowClick = () => {\n // Maintain focus as button could become disabled\n containerRef.current?.focus();\n\n const nextDate = getLeftArrowDate\n ? getLeftArrowDate(calendarDate)\n : calendarDate.subtract(1, \"month\");\n\n switch (currentView) {\n case \"default\":\n setViewCalendarDate(nextDate);\n setCalendarDate(nextDate);\n break;\n case \"month-options\":\n setCalendarDate((date) => date.subtract(1, \"year\"));\n break;\n case \"year-options\":\n setCalendarDate((date) => date.subtract(10, \"year\"));\n break;\n }\n };\n\n const handleRightArrowClick = () => {\n // Maintain focus as button could become disabled\n containerRef.current?.focus();\n\n const nextDate = getRightArrowDate\n ? getRightArrowDate(calendarDate)\n : calendarDate.add(1, \"month\");\n\n switch (currentView) {\n case \"default\":\n setViewCalendarDate(nextDate);\n setCalendarDate(nextDate);\n break;\n case \"month-options\":\n setCalendarDate((date) => date.add(1, \"year\"));\n break;\n case \"year-options\":\n setCalendarDate((date) => date.add(10, \"year\"));\n break;\n }\n };\n\n const handleMonthYearSelect = (value: Dayjs) => {\n setCalendarDate(value);\n setViewCalendarDate(value);\n\n if (!withButton) {\n setCurrentView(\"default\");\n }\n };\n\n const handleCancelButton = () => {\n const initialValue = DateHelper.toDayjs(initialCalendarDate);\n setCalendarDate(initialValue);\n setViewCalendarDate(initialValue);\n\n if (currentView === \"default\") {\n performOnDismissHandler(\"reset\");\n } else {\n setCurrentView(\"default\");\n }\n };\n\n const handleDoneButton = (isDisabled: boolean | undefined) => {\n if (isDisabled) return;\n\n setCalendarDate(viewCalendarDate);\n\n if (currentView === \"default\") {\n performOnDismissHandler(\"confirmed\");\n } else {\n setCurrentView(\"default\");\n }\n };\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n const performOnCalendarDateChange = (date: Dayjs) => {\n if (onCalendarDateChange) {\n onCalendarDateChange(date);\n }\n };\n\n const performOnDismissHandler = (action: CalendarAction) => {\n if (onDismiss) {\n onDismiss(action);\n }\n };\n\n const isLeftArrowDisabled = () => {\n if (!minDate || allowDisabledSelection) {\n return false;\n }\n\n const min = dayjs(minDate);\n if (currentView === \"month-options\") {\n return !CalendarHelper.isPreviousYearWithinRange(calendarDate, min);\n } else if (currentView === \"year-options\") {\n return !CalendarHelper.isPreviousDecadeWithinRange(\n calendarDate,\n min\n );\n } else {\n if (_isLeftArrowDisabled) {\n return _isLeftArrowDisabled(calendarDate);\n }\n return !CalendarHelper.isPreviousMonthWithinRange(\n calendarDate,\n min\n );\n }\n };\n\n const isRightArrowDisabled = () => {\n if (!maxDate || allowDisabledSelection) {\n return false;\n }\n\n const max = dayjs(maxDate);\n if (currentView === \"month-options\") {\n return !CalendarHelper.isNextYearWithinRange(calendarDate, max);\n } else if (currentView === \"year-options\") {\n return !CalendarHelper.isNextDecadeWithinRange(calendarDate, max);\n } else {\n if (_isRightArrowDisabled) {\n return _isRightArrowDisabled(calendarDate);\n }\n return !CalendarHelper.isNextMonthWithinRange(calendarDate, max);\n }\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n\n const getYearHeaderText = (): string => {\n if (currentView === \"year-options\") {\n const { beginDecade, endDecade } =\n CalendarHelper.getStartEndDecade(calendarDate);\n\n return `${beginDecade} to ${endDecade}`;\n } else {\n return getYearHeaderLabel\n ? getYearHeaderLabel(calendarDate)\n : calendarDate.format(\"YYYY\");\n }\n };\n\n const renderDropdownButtons = () => {\n const monthLabel = getMonthHeaderLabel\n ? getMonthHeaderLabel(calendarDate)\n : calendarDate.format(\"MMM\");\n\n const fullMonthLabel = dayjs(monthLabel, \"MMM\").format(\"MMMM\");\n\n const yearLabel = getYearHeaderText();\n const viewToYearLabel: Record<View, string> = {\n \"month-options\": `${yearLabel}, Close month selection`,\n \"year-options\": `${yearLabel}, Close year selection`,\n default: `${yearLabel}, Select year`,\n };\n\n return (\n <>\n <button\n className={clsx(\n styles.dropdownButton,\n currentView !== \"default\" && styles.hidden\n )}\n aria-label={`${fullMonthLabel}, Select month`}\n type=\"button\"\n id=\"month-dropdown\"\n onClick={handleMonthDropdownClick}\n onKeyDown={handleMonthDropdownKeydown}\n tabIndex={isFocusable ? 0 : -1}\n >\n <span className={styles.dropdownText}>{monthLabel}</span>\n <ChevronDownIcon\n className={clsx(\n styles.icon,\n styles.iconChevronDown,\n currentView === \"month-options\" &&\n styles.iconChevronDownExpanded\n )}\n />\n </button>\n <button\n ref={yearDropdownRef}\n className={styles.dropdownButton}\n aria-label={viewToYearLabel[currentView]}\n type=\"button\"\n id=\"year-dropdown\"\n onClick={handleYearDropdownClick}\n onKeyDown={handleYearDropdownKeydown}\n tabIndex={isFocusable ? 0 : -1}\n >\n <span className={styles.dropdownText}>{yearLabel}</span>\n <ChevronDownIcon\n className={clsx(\n styles.icon,\n styles.iconChevronDown,\n currentView !== \"default\" &&\n styles.iconChevronDownExpanded\n )}\n />\n </button>\n </>\n );\n };\n\n const renderOptionsOverlay = () => {\n switch (currentView) {\n case \"month-options\":\n return (\n <InternalCalendarMonth\n calendarDate={calendarDate}\n currentFocus={currentFocus}\n minDate={minDate}\n maxDate={maxDate}\n selectedStartDate={selectedStartDate}\n selectedEndDate={selectedEndDate}\n viewCalendarDate={viewCalendarDate}\n isNewSelection={!!selectWithinRange}\n onMonthSelect={handleMonthYearSelect}\n allowDisabledSelection={allowDisabledSelection}\n />\n );\n case \"year-options\":\n return (\n <InternalCalendarYear\n setCalendarDate={setCalendarDate}\n calendarDate={calendarDate}\n currentFocus={currentFocus}\n minDate={minDate}\n maxDate={maxDate}\n selectedStartDate={selectedStartDate}\n selectedEndDate={selectedEndDate}\n viewCalendarDate={viewCalendarDate}\n isNewSelection={!!selectWithinRange}\n onYearSelect={handleMonthYearSelect}\n allowDisabledSelection={allowDisabledSelection}\n />\n );\n default:\n return null;\n }\n };\n\n const renderHeader = () => {\n const viewToSelection: Record<View, string> = {\n \"month-options\": \"year\",\n \"year-options\": \"decade\",\n default: \"month\",\n };\n\n const selection = viewToSelection[currentView];\n\n return (\n <div\n className={styles.header}\n data-id=\"calendar-header\"\n data-testid=\"calendar-header\"\n >\n <div className={styles.headerInputDropdown}>\n {renderDropdownButtons()}\n </div>\n <div className={styles.headerArrows}>\n <ClickableIcon\n className={styles.headerArrowButton}\n aria-label={`Previous ${selection}`}\n data-testid=\"left-arrow-btn\"\n disabled={isLeftArrowDisabled()}\n focusHighlight={false}\n focusOutline=\"browser\"\n onClick={handleLeftArrowClick}\n tabIndex={isFocusable ? 0 : -1}\n >\n <ChevronLeftIcon className={styles.icon} />\n </ClickableIcon>\n <ClickableIcon\n className={styles.headerArrowButton}\n aria-label={`Next ${selection}`}\n data-testid=\"right-arrow-btn\"\n disabled={isRightArrowDisabled()}\n focusHighlight={false}\n focusOutline=\"browser\"\n onClick={handleRightArrowClick}\n tabIndex={isFocusable ? 0 : -1}\n >\n <ChevronRightIcon className={styles.icon} />\n </ClickableIcon>\n </div>\n </div>\n );\n };\n\n const renderActionButtons = () => {\n if (!withButton) return;\n\n const isDayView = currentView === \"default\";\n\n const disabled = !isDayView ? false : doneButtonDisabled;\n\n return (\n <div className={styles.actionButtonSection}>\n <Button\n className={styles.actionButton}\n ref={cancelButtonRef}\n data-testid=\"cancel-button\"\n styleType=\"light\"\n type=\"button\"\n onClick={handleCancelButton}\n sizeType=\"small\"\n >\n Cancel\n </Button>\n <Button\n className={styles.actionButton}\n data-testid=\"done-button\"\n ref={doneButtonRef}\n type=\"button\"\n onClick={() => handleDoneButton(disabled)}\n disabled={disabled}\n sizeType=\"small\"\n >\n Done\n </Button>\n </div>\n );\n };\n\n const renderViews = () => {\n const defaultView =\n typeof children === \"function\"\n ? children({ calendarDate: viewCalendarDate, currentView })\n : children;\n\n if (dynamicHeight) {\n return (\n <>\n {currentView === \"default\" && defaultView}\n {renderOptionsOverlay()}\n </>\n );\n } else {\n const isDefaultView = currentView === \"default\";\n return (\n // Prevent interaction with the default view when options are open\n <>\n <div\n className={styles.defaultView}\n inert={inertValue(!isDefaultView)}\n >\n {defaultView}\n </div>\n <div\n className={clsx(\n styles.optionsOverlay,\n isDefaultView && styles.hidden\n )}\n >\n {renderOptionsOverlay()}\n </div>\n </>\n );\n }\n };\n\n return (\n <div\n className={styles.container}\n ref={containerRef}\n data-id=\"calendar-container\"\n data-testid=\"calendar-container\"\n aria-label={viewCalendarDate.format(\"MMMM, YYYY\")}\n role=\"group\"\n {...otherProps}\n >\n {showNavigationHeader && renderHeader()}\n <div className={styles.toggleZone} data-testid=\"toggle-zone\">\n {renderViews()}\n </div>\n {renderActionButtons()}\n </div>\n );\n};\n\nexport const CalendarManager = React.forwardRef(Component);\n"],"names":["CalendarManager","React","forwardRef","_a","ref","children","initialCalendarDate","minDate","maxDate","currentFocus","selectedStartDate","selectedEndDate","selectWithinRange","dynamicHeight","allowDisabledSelection","onCalendarDateChange","withButton","doneButtonDisabled","onDismiss","showNavigationHeader","getLeftArrowDate","getRightArrowDate","isLeftArrowDisabled","_isLeftArrowDisabled","isRightArrowDisabled","_isRightArrowDisabled","getMonthHeaderLabel","getYearHeaderLabel","isFocusable","otherProps","__rest","calendarDate","setCalendarDate","useState","DateHelper","toDayjs","viewCalendarDate","setViewCalendarDate","currentView","setCurrentView","doneButtonRef","useRef","cancelButtonRef","containerRef","yearDropdownRef","useImperativeHandle","defaultView","resetView","date","value","useEffect","performOnCalendarDateChange","handleMonthDropdownClick","current","focus","handleMonthDropdownKeydown","event","key","preventDefault","nextDate","subtract","add","CalendarHelper","isWithinRange","dayjs","undefined","handleYearDropdownClick","handleYearDropdownKeydown","handleLeftArrowClick","handleRightArrowClick","handleMonthYearSelect","handleCancelButton","initialValue","performOnDismissHandler","action","min","isPreviousYearWithinRange","isPreviousDecadeWithinRange","isPreviousMonthWithinRange","max","isNextYearWithinRange","isNextDecadeWithinRange","isNextMonthWithinRange","renderDropdownButtons","monthLabel","format","fullMonthLabel","yearLabel","beginDecade","endDecade","getStartEndDecade","getYearHeaderText","viewToYearLabel","default","_jsxs","_Fragment","className","clsx","styles.dropdownButton","styles.hidden","type","id","onClick","onKeyDown","tabIndex","_jsx","styles.dropdownText","ChevronDownIcon","styles.icon","styles.iconChevronDown","styles.iconChevronDownExpanded","renderOptionsOverlay","InternalCalendarMonth","isNewSelection","onMonthSelect","InternalCalendarYear","onYearSelect","styles.container","role","selection","styles.header","styles.headerInputDropdown","styles.headerArrows","ClickableIcon","styles.headerArrowButton","disabled","focusHighlight","focusOutline","ChevronLeftIcon","ChevronRightIcon","renderHeader","styles.toggleZone","isDefaultView","styles.defaultView","inert","inertValue","styles.optionsOverlay","renderViews","styles.actionButtonSection","Button","styles.actionButton","styleType","sizeType","renderActionButtons"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"standalone-date-input.js","sources":["../../../src/shared/standalone-date-input/standalone-date-input.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport React, { useEffect, useImperativeHandle, useRef, useState } from \"react\";\n\nimport { DateInputHelper, StringHelper, useStateRef } from \"../../util\";\nimport * as styles from \"./standalone-date-input.styles\";\n\ndayjs.extend(customParseFormat);\n\ntype StartInputNames = [\"start-day\", \"start-month\", \"start-year\"];\ntype EndInputNames = [\"end-day\", \"end-month\", \"end-year\"];\n\nexport type FieldType =\n | StartInputNames[number]\n | EndInputNames[number]\n | \"none\";\n\ninterface Props {\n disabled?: boolean | undefined;\n readOnly?: boolean | undefined;\n hideInputKeyboard?: boolean | undefined;\n names: StartInputNames | EndInputNames;\n value: string | undefined;\n hoverValue?: string | undefined;\n focused: boolean;\n placeholder?: string | undefined;\n label?: string | undefined;\n inputLabels?: string[] | undefined;\n onChange: (value: string) => void;\n onFocus?: ((event: React.FocusEvent) => void) | undefined;\n onBlur?: ((valid: boolean) => void) | undefined;\n}\n\nexport interface StandaloneDateInputRef {\n ref: React.RefObject<HTMLDivElement>;\n resetPlaceholder: () => void;\n resetInput: () => void;\n focusYearRef: () => void;\n}\n\nexport const Component = (\n {\n disabled,\n readOnly,\n names,\n value,\n focused,\n hoverValue,\n placeholder,\n label,\n onChange,\n onFocus,\n onBlur,\n hideInputKeyboard,\n inputLabels = [\"Date\", \"Month\", \"Year\"],\n }: Props,\n ref: React.ForwardedRef<StandaloneDateInputRef>\n) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const inputMode = hideInputKeyboard ? \"none\" : \"numeric\";\n\n const [dayValue, setDayValue, dayValueRef] = useStateRef<string>(\"\");\n const [monthValue, setMonthValue, monthValueRef] = useStateRef<string>(\"\");\n const [yearValue, setYearValue, yearValueRef] = useStateRef<string>(\"\");\n const [currentFocus, setCurrentFocus] = useState<FieldType>(\"none\");\n const [hidePlaceholder, setHidePlaceholder] = useState<boolean>(false);\n\n const nodeRef = useRef<HTMLDivElement>(null);\n const dayInputRef = useRef<HTMLInputElement>(null);\n const monthInputRef = useRef<HTMLInputElement>(null);\n const yearInputRef = useRef<HTMLInputElement>(null);\n\n const [hoverDayValue, hoverMonthValue, hoverYearValue] =\n parseToInputValues(hoverValue);\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n const [day = \"\", month = \"\", year = \"\"] = parseToInputValues(value);\n setDayValue(day);\n setMonthValue(month);\n setYearValue(year);\n\n // re-focus on day input if all 3 inputs get cleared while typing\n if (\n !day &&\n !month &&\n !year &&\n nodeRef.current &&\n nodeRef.current.contains(document.activeElement)\n )\n dayInputRef.current?.focus();\n }, [value]);\n\n useEffect(() => {\n // clear internal focus state\n if (!focused) {\n setCurrentFocus(\"none\");\n }\n\n // ensure at least one input is focused\n if (focused) {\n setHidePlaceholder(true);\n\n if (\n nodeRef.current &&\n !nodeRef.current.contains(document.activeElement)\n ) {\n dayInputRef.current?.focus();\n }\n }\n }, [focused]);\n\n useImperativeHandle(\n ref,\n () => ({\n ref: nodeRef,\n resetPlaceholder() {\n setHidePlaceholder(false);\n },\n resetInput() {\n const [day = \"\", month = \"\", year = \"\"] =\n parseToInputValues(value);\n setDayValue(day);\n setMonthValue(month);\n setYearValue(year);\n },\n focusYearRef() {\n yearInputRef.current?.focus();\n },\n }),\n [setDayValue, setMonthValue, setYearValue, value]\n );\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleSectionClick = () => {\n if (disabled || readOnly) {\n return;\n }\n\n setHidePlaceholder(true);\n\n if (\n nodeRef.current &&\n !nodeRef.current.contains(document.activeElement)\n ) {\n dayInputRef.current?.focus();\n }\n };\n\n const handleSectionFocus = (event: React.FocusEvent) => {\n if (disabled) {\n return;\n }\n\n setHidePlaceholder(true);\n\n if (!focused) {\n onFocus?.(event);\n }\n };\n\n const handlePlaceholderClick = (event: React.MouseEvent) => {\n event.preventDefault();\n dayInputRef.current?.focus();\n };\n\n const handleInputFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n event.target.select();\n const targetName = event.target.name as FieldType;\n setCurrentFocus(targetName);\n };\n\n const handleInputBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n const [dayName, monthName, yearName] = names;\n const date = {\n [dayName]: dayValueRef.current,\n [monthName]: monthValueRef.current,\n [yearName]: yearValueRef.current,\n };\n\n const targetName = event.target.name as FieldType;\n const targetValue = date[targetName];\n\n // pad single digits for day and month inputs\n\n const paddedValue =\n targetName !== yearName\n ? StringHelper.padValue(targetValue, true)\n : targetValue;\n\n switch (targetName) {\n case dayName:\n date[dayName] = paddedValue;\n setDayValue(paddedValue);\n break;\n case monthName:\n date[monthName] = paddedValue;\n setMonthValue(paddedValue);\n break;\n case yearName:\n default:\n break;\n }\n\n const value = `${date[yearName]}-${date[monthName]}-${date[dayName]}`;\n const isValid = dayjs(value, \"YYYY-MM-DD\", true).isValid();\n const isEmpty = !date[dayName] && !date[monthName] && !date[yearName];\n const isPadded = targetValue !== paddedValue;\n\n if (isValid && isPadded) {\n onChange(value);\n }\n\n if (nodeRef.current && !nodeRef.current.contains(event.relatedTarget)) {\n // entire field was blurred\n setCurrentFocus(\"none\");\n onBlur?.(isEmpty || isValid);\n }\n };\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (hoverValue) {\n // do not modify inputs when selecting date from another source\n return;\n }\n\n const targetName = event.target.name as FieldType;\n const targetValue = event.target.value.replace(/[^0-9]/g, \"\");\n\n const date = {\n day: dayValue,\n month: monthValue,\n year: yearValue,\n };\n\n switch (targetName) {\n case names[0]:\n date.day = targetValue;\n setDayValue(targetValue);\n // auto focus the next input once filled in\n if (targetValue.length === 2) {\n monthInputRef.current?.focus();\n }\n break;\n case names[1]:\n date.month = targetValue;\n setMonthValue(targetValue);\n // auto focus the next input once filled in\n if (targetValue.length === 2) {\n yearInputRef.current?.focus();\n }\n break;\n case names[2]:\n date.year = targetValue;\n setYearValue(targetValue);\n break;\n default:\n break;\n }\n\n if (!date.day && !date.month && !date.year) {\n onChange(\"\");\n return;\n }\n\n const value = `${date.year}-${date.month}-${date.day}`;\n const isValid = dayjs(value, \"YYYY-MM-DD\", true).isValid();\n\n if (isValid) {\n onChange(value);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n /**\n * Allow going to the field before if user presses Backspace\n * on an empty field\n */\n if (event.code === \"Backspace\" || event.key === \"Backspace\") {\n if (currentFocus === names[1] && monthValue.length === 0) {\n dayInputRef.current?.focus();\n }\n\n if (currentFocus === names[2] && yearValue.length === 0) {\n monthInputRef.current?.focus();\n }\n }\n };\n\n // =============================================================================\n // HELPERS\n // =============================================================================\n function parseToInputValues(stringVal: string | undefined) {\n if (!stringVal) {\n return [undefined, undefined, undefined];\n } else {\n const sanitized = DateInputHelper.sanitizeInput(stringVal);\n\n if (!sanitized) {\n return [undefined, undefined, undefined];\n }\n\n const day = dayjs(sanitized, \"YYYY-MM-DD\", true);\n\n return [\n StringHelper.padValue(day.date().toString()),\n StringHelper.padValue((day.month() + 1).toString()),\n day.year().toString(),\n ];\n }\n }\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderPlaceholder = () => {\n if (value || readOnly || !placeholder) {\n return;\n }\n\n return (\n <div\n className={clsx(\n styles.placeholder,\n disabled && styles.placeholderDisabled,\n hidePlaceholder && styles.placeholderHide\n )}\n onMouseDown={handlePlaceholderClick}\n >\n {placeholder}\n </div>\n );\n };\n\n return (\n <div\n role=\"group\"\n aria-label={label}\n className={styles.inputSection}\n onClick={handleSectionClick}\n onFocus={handleSectionFocus}\n >\n <div ref={nodeRef} className={styles.inputContainer}>\n <span\n className={clsx(\n styles.inputSizerBase,\n styles.dayInputSizer\n )}\n >\n <input\n ref={dayInputRef}\n name={names[0]}\n maxLength={2}\n value={hoverDayValue ?? dayValue}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onChange={handleInputChange}\n type=\"text\"\n inputMode={inputMode}\n pattern=\"[0-9]{2}\"\n data-testid={`${names[0]}-input`}\n aria-label={inputLabels[0]}\n disabled={disabled}\n readOnly={readOnly}\n tabIndex={readOnly ? -1 : 0}\n autoComplete=\"off\"\n placeholder={\n currentFocus === names[0] && !readOnly ? \"\" : \"DD\"\n }\n className={clsx(\n styles.baseInput,\n !!hoverValue && styles.baseInputHover\n )}\n />\n </span>\n <span\n className={clsx(\n styles.divider,\n !!hoverValue && styles.dividerHover,\n disabled && styles.dividerDisabled,\n !disabled &&\n dayValue.length === 0 &&\n styles.dividerInactive\n )}\n >\n /\n </span>\n <span\n className={clsx(\n styles.inputSizerBase,\n styles.monthInputSizer\n )}\n >\n <input\n ref={monthInputRef}\n name={names[1]}\n maxLength={2}\n value={hoverMonthValue ?? monthValue}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n type=\"text\"\n inputMode={inputMode}\n pattern=\"[0-9]{2}\"\n data-testid={`${names[1]}-input`}\n aria-label={inputLabels[1]}\n disabled={disabled}\n readOnly={readOnly}\n tabIndex={readOnly ? -1 : 0}\n autoComplete=\"off\"\n placeholder={\n currentFocus === names[1] && !readOnly ? \"\" : \"MM\"\n }\n className={clsx(\n styles.baseInput,\n !!hoverValue && styles.baseInputHover\n )}\n />\n </span>\n <span\n className={clsx(\n styles.divider,\n !!hoverValue && styles.dividerHover,\n disabled && styles.dividerDisabled,\n !disabled &&\n monthValue.length === 0 &&\n styles.dividerInactive\n )}\n >\n /\n </span>\n <span\n className={clsx(\n styles.inputSizerBase,\n styles.yearInputSizer\n )}\n >\n <input\n ref={yearInputRef}\n name={names[2]}\n maxLength={4}\n value={hoverYearValue ?? yearValue}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n type=\"text\"\n inputMode={inputMode}\n pattern=\"[0-9]{4}\"\n data-testid={`${names[2]}-input`}\n aria-label={inputLabels[2]}\n disabled={disabled}\n readOnly={readOnly}\n tabIndex={readOnly ? -1 : 0}\n autoComplete=\"off\"\n placeholder={\n currentFocus === names[2] && !readOnly ? \"\" : \"YYYY\"\n }\n className={clsx(\n styles.baseInput,\n !!hoverValue && styles.baseInputHover\n )}\n />\n </span>\n </div>\n {renderPlaceholder()}\n </div>\n );\n};\n\nexport const StandaloneDateInput = React.forwardRef(Component);\n"],"names":["dayjs","extend","customParseFormat","Component","disabled","readOnly","names","value","focused","hoverValue","placeholder","label","onChange","onFocus","onBlur","hideInputKeyboard","inputLabels","ref","inputMode","dayValue","setDayValue","dayValueRef","useStateRef","monthValue","setMonthValue","monthValueRef","yearValue","setYearValue","yearValueRef","currentFocus","setCurrentFocus","useState","hidePlaceholder","setHidePlaceholder","nodeRef","useRef","dayInputRef","monthInputRef","yearInputRef","hoverDayValue","hoverMonthValue","hoverYearValue","parseToInputValues","useEffect","day","month","year","current","contains","document","activeElement","_a","focus","useImperativeHandle","resetPlaceholder","resetInput","focusYearRef","handlePlaceholderClick","event","preventDefault","handleInputFocus","target","select","targetName","name","handleInputBlur","dayName","monthName","yearName","date","targetValue","paddedValue","StringHelper","padValue","isValid","isEmpty","relatedTarget","handleInputChange","replace","length","_b","handleKeyDown","code","key","stringVal","sanitized","DateInputHelper","sanitizeInput","undefined","toString","_jsxs","role","className","styles.inputSection","onClick","children","styles.inputContainer","_jsx","clsx","styles.inputSizerBase","styles.dayInputSizer","maxLength","type","pattern","tabIndex","autoComplete","styles.baseInput","styles.baseInputHover","styles.divider","styles.dividerHover","styles.dividerDisabled","styles.dividerInactive","styles.monthInputSizer","onKeyDown","styles.yearInputSizer","styles.placeholder","styles.placeholderDisabled","styles.placeholderHide","onMouseDown","renderPlaceholder","StandaloneDateInput","React","forwardRef"],"mappings":"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"}
1
+ {"version":3,"file":"standalone-date-input.js","sources":["../../../src/shared/standalone-date-input/standalone-date-input.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport React, { useEffect, useImperativeHandle, useRef, useState } from \"react\";\n\nimport { DateInputHelper, StringHelper, useStateRef } from \"../../util\";\nimport * as styles from \"./standalone-date-input.styles\";\n\ndayjs.extend(customParseFormat);\n\ntype StartInputNames = [\"start-day\", \"start-month\", \"start-year\"];\ntype EndInputNames = [\"end-day\", \"end-month\", \"end-year\"];\n\nexport type FieldType =\n | StartInputNames[number]\n | EndInputNames[number]\n | \"none\";\n\ninterface Props {\n disabled?: boolean | undefined;\n readOnly?: boolean | undefined;\n hideInputKeyboard?: boolean | undefined;\n names: StartInputNames | EndInputNames;\n value: string | undefined;\n hoverValue?: string | undefined;\n focused: boolean;\n placeholder?: string | undefined;\n label?: string | undefined;\n inputLabels?: string[] | undefined;\n onChange: (value: string) => void;\n onFocus?: ((event: React.FocusEvent) => void) | undefined;\n onBlur?: ((valid: boolean) => void) | undefined;\n}\n\nexport interface StandaloneDateInputRef {\n ref: React.RefObject<HTMLDivElement>;\n resetPlaceholder: () => void;\n resetInput: () => void;\n focusYearRef: () => void;\n}\n\nexport const Component = (\n {\n disabled,\n readOnly,\n names,\n value,\n focused,\n hoverValue,\n placeholder,\n label,\n onChange,\n onFocus,\n onBlur,\n hideInputKeyboard,\n inputLabels = [\"Date\", \"Month\", \"Year\"],\n }: Props,\n ref: React.ForwardedRef<StandaloneDateInputRef>\n) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const inputMode = hideInputKeyboard ? \"none\" : \"numeric\";\n\n const [dayValue, setDayValue, dayValueRef] = useStateRef<string>(\"\");\n const [monthValue, setMonthValue, monthValueRef] = useStateRef<string>(\"\");\n const [yearValue, setYearValue, yearValueRef] = useStateRef<string>(\"\");\n const [currentFocus, setCurrentFocus] = useState<FieldType>(\"none\");\n const [hidePlaceholder, setHidePlaceholder] = useState<boolean>(false);\n\n const nodeRef = useRef<HTMLDivElement>(null);\n const dayInputRef = useRef<HTMLInputElement>(null);\n const monthInputRef = useRef<HTMLInputElement>(null);\n const yearInputRef = useRef<HTMLInputElement>(null);\n\n const [hoverDayValue, hoverMonthValue, hoverYearValue] =\n parseToInputValues(hoverValue);\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n const [day = \"\", month = \"\", year = \"\"] = parseToInputValues(value);\n setDayValue(day);\n setMonthValue(month);\n setYearValue(year);\n\n // re-focus on day input if all 3 inputs get cleared while typing\n if (\n !day &&\n !month &&\n !year &&\n nodeRef.current &&\n nodeRef.current.contains(document.activeElement)\n )\n dayInputRef.current?.focus();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n useEffect(() => {\n // clear internal focus state\n if (!focused) {\n setCurrentFocus(\"none\");\n }\n\n // ensure at least one input is focused\n if (focused) {\n setHidePlaceholder(true);\n\n if (\n nodeRef.current &&\n !nodeRef.current.contains(document.activeElement)\n ) {\n dayInputRef.current?.focus();\n }\n }\n }, [focused]);\n\n useImperativeHandle(\n ref,\n () => ({\n ref: nodeRef,\n resetPlaceholder() {\n setHidePlaceholder(false);\n },\n resetInput() {\n const [day = \"\", month = \"\", year = \"\"] =\n parseToInputValues(value);\n setDayValue(day);\n setMonthValue(month);\n setYearValue(year);\n },\n focusYearRef() {\n yearInputRef.current?.focus();\n },\n }),\n [setDayValue, setMonthValue, setYearValue, value]\n );\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleSectionClick = () => {\n if (disabled || readOnly) {\n return;\n }\n\n setHidePlaceholder(true);\n\n if (\n nodeRef.current &&\n !nodeRef.current.contains(document.activeElement)\n ) {\n dayInputRef.current?.focus();\n }\n };\n\n const handleSectionFocus = (event: React.FocusEvent) => {\n if (disabled) {\n return;\n }\n\n setHidePlaceholder(true);\n\n if (!focused) {\n onFocus?.(event);\n }\n };\n\n const handlePlaceholderClick = (event: React.MouseEvent) => {\n event.preventDefault();\n dayInputRef.current?.focus();\n };\n\n const handleInputFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n event.target.select();\n const targetName = event.target.name as FieldType;\n setCurrentFocus(targetName);\n };\n\n const handleInputBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n const [dayName, monthName, yearName] = names;\n const date = {\n [dayName]: dayValueRef.current,\n [monthName]: monthValueRef.current,\n [yearName]: yearValueRef.current,\n };\n\n const targetName = event.target.name as FieldType;\n const targetValue = date[targetName];\n\n // pad single digits for day and month inputs\n\n const paddedValue =\n targetName !== yearName\n ? StringHelper.padValue(targetValue, true)\n : targetValue;\n\n switch (targetName) {\n case dayName:\n date[dayName] = paddedValue;\n setDayValue(paddedValue);\n break;\n case monthName:\n date[monthName] = paddedValue;\n setMonthValue(paddedValue);\n break;\n case yearName:\n default:\n break;\n }\n\n const value = `${date[yearName]}-${date[monthName]}-${date[dayName]}`;\n const isValid = dayjs(value, \"YYYY-MM-DD\", true).isValid();\n const isEmpty = !date[dayName] && !date[monthName] && !date[yearName];\n const isPadded = targetValue !== paddedValue;\n\n if (isValid && isPadded) {\n onChange(value);\n }\n\n if (nodeRef.current && !nodeRef.current.contains(event.relatedTarget)) {\n // entire field was blurred\n setCurrentFocus(\"none\");\n onBlur?.(isEmpty || isValid);\n }\n };\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (hoverValue) {\n // do not modify inputs when selecting date from another source\n return;\n }\n\n const targetName = event.target.name as FieldType;\n const targetValue = event.target.value.replace(/[^0-9]/g, \"\");\n\n const date = {\n day: dayValue,\n month: monthValue,\n year: yearValue,\n };\n\n switch (targetName) {\n case names[0]:\n date.day = targetValue;\n setDayValue(targetValue);\n // auto focus the next input once filled in\n if (targetValue.length === 2) {\n monthInputRef.current?.focus();\n }\n break;\n case names[1]:\n date.month = targetValue;\n setMonthValue(targetValue);\n // auto focus the next input once filled in\n if (targetValue.length === 2) {\n yearInputRef.current?.focus();\n }\n break;\n case names[2]:\n date.year = targetValue;\n setYearValue(targetValue);\n break;\n default:\n break;\n }\n\n if (!date.day && !date.month && !date.year) {\n onChange(\"\");\n return;\n }\n\n const value = `${date.year}-${date.month}-${date.day}`;\n const isValid = dayjs(value, \"YYYY-MM-DD\", true).isValid();\n\n if (isValid) {\n onChange(value);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n /**\n * Allow going to the field before if user presses Backspace\n * on an empty field\n */\n if (event.code === \"Backspace\" || event.key === \"Backspace\") {\n if (currentFocus === names[1] && monthValue.length === 0) {\n dayInputRef.current?.focus();\n }\n\n if (currentFocus === names[2] && yearValue.length === 0) {\n monthInputRef.current?.focus();\n }\n }\n };\n\n // =============================================================================\n // HELPERS\n // =============================================================================\n function parseToInputValues(stringVal: string | undefined) {\n if (!stringVal) {\n return [undefined, undefined, undefined];\n } else {\n const sanitized = DateInputHelper.sanitizeInput(stringVal);\n\n if (!sanitized) {\n return [undefined, undefined, undefined];\n }\n\n const day = dayjs(sanitized, \"YYYY-MM-DD\", true);\n\n return [\n StringHelper.padValue(day.date().toString()),\n StringHelper.padValue((day.month() + 1).toString()),\n day.year().toString(),\n ];\n }\n }\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderPlaceholder = () => {\n if (value || readOnly || !placeholder) {\n return;\n }\n\n return (\n <div\n className={clsx(\n styles.placeholder,\n disabled && styles.placeholderDisabled,\n hidePlaceholder && styles.placeholderHide\n )}\n onMouseDown={handlePlaceholderClick}\n >\n {placeholder}\n </div>\n );\n };\n\n return (\n <div\n role=\"group\"\n aria-label={label}\n className={styles.inputSection}\n onClick={handleSectionClick}\n onFocus={handleSectionFocus}\n >\n <div ref={nodeRef} className={styles.inputContainer}>\n <span\n className={clsx(\n styles.inputSizerBase,\n styles.dayInputSizer\n )}\n >\n <input\n ref={dayInputRef}\n name={names[0]}\n maxLength={2}\n value={hoverDayValue ?? dayValue}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onChange={handleInputChange}\n type=\"text\"\n inputMode={inputMode}\n pattern=\"[0-9]{2}\"\n data-testid={`${names[0]}-input`}\n aria-label={inputLabels[0]}\n disabled={disabled}\n readOnly={readOnly}\n tabIndex={readOnly ? -1 : 0}\n autoComplete=\"off\"\n placeholder={\n currentFocus === names[0] && !readOnly ? \"\" : \"DD\"\n }\n className={clsx(\n styles.baseInput,\n !!hoverValue && styles.baseInputHover\n )}\n />\n </span>\n <span\n className={clsx(\n styles.divider,\n !!hoverValue && styles.dividerHover,\n disabled && styles.dividerDisabled,\n !disabled &&\n dayValue.length === 0 &&\n styles.dividerInactive\n )}\n >\n /\n </span>\n <span\n className={clsx(\n styles.inputSizerBase,\n styles.monthInputSizer\n )}\n >\n <input\n ref={monthInputRef}\n name={names[1]}\n maxLength={2}\n value={hoverMonthValue ?? monthValue}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n type=\"text\"\n inputMode={inputMode}\n pattern=\"[0-9]{2}\"\n data-testid={`${names[1]}-input`}\n aria-label={inputLabels[1]}\n disabled={disabled}\n readOnly={readOnly}\n tabIndex={readOnly ? -1 : 0}\n autoComplete=\"off\"\n placeholder={\n currentFocus === names[1] && !readOnly ? \"\" : \"MM\"\n }\n className={clsx(\n styles.baseInput,\n !!hoverValue && styles.baseInputHover\n )}\n />\n </span>\n <span\n className={clsx(\n styles.divider,\n !!hoverValue && styles.dividerHover,\n disabled && styles.dividerDisabled,\n !disabled &&\n monthValue.length === 0 &&\n styles.dividerInactive\n )}\n >\n /\n </span>\n <span\n className={clsx(\n styles.inputSizerBase,\n styles.yearInputSizer\n )}\n >\n <input\n ref={yearInputRef}\n name={names[2]}\n maxLength={4}\n value={hoverYearValue ?? yearValue}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n type=\"text\"\n inputMode={inputMode}\n pattern=\"[0-9]{4}\"\n data-testid={`${names[2]}-input`}\n aria-label={inputLabels[2]}\n disabled={disabled}\n readOnly={readOnly}\n tabIndex={readOnly ? -1 : 0}\n autoComplete=\"off\"\n placeholder={\n currentFocus === names[2] && !readOnly ? \"\" : \"YYYY\"\n }\n className={clsx(\n styles.baseInput,\n !!hoverValue && styles.baseInputHover\n )}\n />\n </span>\n </div>\n {renderPlaceholder()}\n </div>\n );\n};\n\nexport const StandaloneDateInput = React.forwardRef(Component);\n"],"names":["dayjs","extend","customParseFormat","Component","disabled","readOnly","names","value","focused","hoverValue","placeholder","label","onChange","onFocus","onBlur","hideInputKeyboard","inputLabels","ref","inputMode","dayValue","setDayValue","dayValueRef","useStateRef","monthValue","setMonthValue","monthValueRef","yearValue","setYearValue","yearValueRef","currentFocus","setCurrentFocus","useState","hidePlaceholder","setHidePlaceholder","nodeRef","useRef","dayInputRef","monthInputRef","yearInputRef","hoverDayValue","hoverMonthValue","hoverYearValue","parseToInputValues","useEffect","day","month","year","current","contains","document","activeElement","_a","focus","useImperativeHandle","resetPlaceholder","resetInput","focusYearRef","handlePlaceholderClick","event","preventDefault","handleInputFocus","target","select","targetName","name","handleInputBlur","dayName","monthName","yearName","date","targetValue","paddedValue","StringHelper","padValue","isValid","isEmpty","relatedTarget","handleInputChange","replace","length","_b","handleKeyDown","code","key","stringVal","sanitized","DateInputHelper","sanitizeInput","undefined","toString","_jsxs","role","className","styles.inputSection","onClick","children","styles.inputContainer","_jsx","clsx","styles.inputSizerBase","styles.dayInputSizer","maxLength","type","pattern","tabIndex","autoComplete","styles.baseInput","styles.baseInputHover","styles.divider","styles.dividerHover","styles.dividerDisabled","styles.dividerInactive","styles.monthInputSizer","onKeyDown","styles.yearInputSizer","styles.placeholder","styles.placeholderDisabled","styles.placeholderHide","onMouseDown","renderPlaceholder","StandaloneDateInput","React","forwardRef"],"mappings":"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"}