@allxsmith/bestax-bulma 5.26.6 → 5.27.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bestax.css +1 -1
- package/dist/bestax.css.map +1 -1
- package/dist/esm/columns/Column.js +48 -0
- package/dist/esm/columns/Column.js.map +1 -0
- package/dist/esm/columns/Columns.js +53 -0
- package/dist/esm/columns/Columns.js.map +1 -0
- package/dist/esm/components/Avatar.js +299 -0
- package/dist/esm/components/Avatar.js.map +1 -0
- package/dist/esm/components/Avatars.js +81 -0
- package/dist/esm/components/Avatars.js.map +1 -0
- package/dist/esm/components/Badge.js +105 -0
- package/dist/esm/components/Badge.js.map +1 -0
- package/dist/esm/components/Breadcrumb.js +36 -0
- package/dist/esm/components/Breadcrumb.js.map +1 -0
- package/dist/esm/components/Card.js +252 -0
- package/dist/esm/components/Card.js.map +1 -0
- package/dist/esm/components/Carousel.js +351 -0
- package/dist/esm/components/Carousel.js.map +1 -0
- package/dist/esm/components/Collapse.js +193 -0
- package/dist/esm/components/Collapse.js.map +1 -0
- package/dist/esm/components/Collapses.js +99 -0
- package/dist/esm/components/Collapses.js.map +1 -0
- package/dist/esm/components/Dialog.js +230 -0
- package/dist/esm/components/Dialog.js.map +1 -0
- package/dist/esm/components/Dropdown.js +362 -0
- package/dist/esm/components/Dropdown.js.map +1 -0
- package/dist/esm/components/Loading.js +87 -0
- package/dist/esm/components/Loading.js.map +1 -0
- package/dist/esm/components/Menu.js +117 -0
- package/dist/esm/components/Menu.js.map +1 -0
- package/dist/esm/components/Message.js +56 -0
- package/dist/esm/components/Message.js.map +1 -0
- package/dist/esm/components/Modal.js +354 -0
- package/dist/esm/components/Modal.js.map +1 -0
- package/dist/esm/components/Navbar.js +287 -0
- package/dist/esm/components/Navbar.js.map +1 -0
- package/dist/esm/components/Pagination.js +191 -0
- package/dist/esm/components/Pagination.js.map +1 -0
- package/dist/esm/components/Panel.js +100 -0
- package/dist/esm/components/Panel.js.map +1 -0
- package/dist/esm/components/Popover.js +298 -0
- package/dist/esm/components/Popover.js.map +1 -0
- package/dist/esm/components/Reveal.js +157 -0
- package/dist/esm/components/Reveal.js.map +1 -0
- package/dist/esm/components/Sidebar.js +209 -0
- package/dist/esm/components/Sidebar.js.map +1 -0
- package/dist/esm/components/Steps.js +128 -0
- package/dist/esm/components/Steps.js.map +1 -0
- package/dist/esm/components/Tabs.js +335 -0
- package/dist/esm/components/Tabs.js.map +1 -0
- package/dist/esm/components/Toast.js +322 -0
- package/dist/esm/components/Toast.js.map +1 -0
- package/dist/esm/components/Tooltip.js +202 -0
- package/dist/esm/components/Tooltip.js.map +1 -0
- package/dist/esm/components/collapsesContext.js +12 -0
- package/dist/esm/components/collapsesContext.js.map +1 -0
- package/dist/esm/elements/Block.js +29 -0
- package/dist/esm/elements/Block.js.map +1 -0
- package/dist/esm/elements/Box.js +32 -0
- package/dist/esm/elements/Box.js.map +1 -0
- package/dist/esm/elements/Button.js +139 -0
- package/dist/esm/elements/Button.js.map +1 -0
- package/dist/esm/elements/Buttons.js +42 -0
- package/dist/esm/elements/Buttons.js.map +1 -0
- package/dist/esm/elements/Code.js +25 -0
- package/dist/esm/elements/Code.js.map +1 -0
- package/dist/esm/elements/Content.js +33 -0
- package/dist/esm/elements/Content.js.map +1 -0
- package/dist/esm/elements/Delete.js +35 -0
- package/dist/esm/elements/Delete.js.map +1 -0
- package/dist/esm/elements/Divider.js +27 -0
- package/dist/esm/elements/Divider.js.map +1 -0
- package/dist/esm/elements/Emphasis.js +25 -0
- package/dist/esm/elements/Emphasis.js.map +1 -0
- package/dist/esm/elements/Figure.js +58 -0
- package/dist/esm/elements/Figure.js.map +1 -0
- package/dist/esm/elements/Icon.js +256 -0
- package/dist/esm/elements/Icon.js.map +1 -0
- package/dist/esm/elements/IconText.js +36 -0
- package/dist/esm/elements/IconText.js.map +1 -0
- package/dist/esm/elements/Image.js +46 -0
- package/dist/esm/elements/Image.js.map +1 -0
- package/dist/esm/elements/Link.js +36 -0
- package/dist/esm/elements/Link.js.map +1 -0
- package/dist/esm/elements/LinkButton.js +37 -0
- package/dist/esm/elements/LinkButton.js.map +1 -0
- package/dist/esm/elements/ListItem.js +28 -0
- package/dist/esm/elements/ListItem.js.map +1 -0
- package/dist/esm/elements/Loader.js +37 -0
- package/dist/esm/elements/Loader.js.map +1 -0
- package/dist/esm/elements/Notification.js +316 -0
- package/dist/esm/elements/Notification.js.map +1 -0
- package/dist/esm/elements/OrderedList.js +31 -0
- package/dist/esm/elements/OrderedList.js.map +1 -0
- package/dist/esm/elements/Paragraph.js +28 -0
- package/dist/esm/elements/Paragraph.js.map +1 -0
- package/dist/esm/elements/Pre.js +25 -0
- package/dist/esm/elements/Pre.js.map +1 -0
- package/dist/esm/elements/Progress.js +33 -0
- package/dist/esm/elements/Progress.js.map +1 -0
- package/dist/esm/elements/Skeleton.js +30 -0
- package/dist/esm/elements/Skeleton.js.map +1 -0
- package/dist/esm/elements/Span.js +28 -0
- package/dist/esm/elements/Span.js.map +1 -0
- package/dist/esm/elements/Strong.js +25 -0
- package/dist/esm/elements/Strong.js.map +1 -0
- package/dist/esm/elements/SubTitle.js +51 -0
- package/dist/esm/elements/SubTitle.js.map +1 -0
- package/dist/esm/elements/Table.js +51 -0
- package/dist/esm/elements/Table.js.map +1 -0
- package/dist/esm/elements/Tag.js +49 -0
- package/dist/esm/elements/Tag.js.map +1 -0
- package/dist/esm/elements/Tags.js +34 -0
- package/dist/esm/elements/Tags.js.map +1 -0
- package/dist/esm/elements/Tbody.js +26 -0
- package/dist/esm/elements/Tbody.js.map +1 -0
- package/dist/esm/elements/Td.js +61 -0
- package/dist/esm/elements/Td.js.map +1 -0
- package/dist/esm/elements/Tfoot.js +26 -0
- package/dist/esm/elements/Tfoot.js.map +1 -0
- package/dist/esm/elements/Th.js +34 -0
- package/dist/esm/elements/Th.js.map +1 -0
- package/dist/esm/elements/Thead.js +26 -0
- package/dist/esm/elements/Thead.js.map +1 -0
- package/dist/esm/elements/Title.js +44 -0
- package/dist/esm/elements/Title.js.map +1 -0
- package/dist/esm/elements/Tr.js +31 -0
- package/dist/esm/elements/Tr.js.map +1 -0
- package/dist/esm/elements/UnorderedList.js +31 -0
- package/dist/esm/elements/UnorderedList.js.map +1 -0
- package/dist/esm/elements/iconProps.js +49 -0
- package/dist/esm/elements/iconProps.js.map +1 -0
- package/dist/esm/form/Autocomplete.js +279 -0
- package/dist/esm/form/Autocomplete.js.map +1 -0
- package/dist/esm/form/Checkbox.js +111 -0
- package/dist/esm/form/Checkbox.js.map +1 -0
- package/dist/esm/form/Checkboxes.js +89 -0
- package/dist/esm/form/Checkboxes.js.map +1 -0
- package/dist/esm/form/Control.js +79 -0
- package/dist/esm/form/Control.js.map +1 -0
- package/dist/esm/form/DateInput.js +87 -0
- package/dist/esm/form/DateInput.js.map +1 -0
- package/dist/esm/form/DateInputBase.js +263 -0
- package/dist/esm/form/DateInputBase.js.map +1 -0
- package/dist/esm/form/DateRangeInput.js +76 -0
- package/dist/esm/form/DateRangeInput.js.map +1 -0
- package/dist/esm/form/DateRangeInputBase.js +301 -0
- package/dist/esm/form/DateRangeInputBase.js.map +1 -0
- package/dist/esm/form/DateTimeInput.js +87 -0
- package/dist/esm/form/DateTimeInput.js.map +1 -0
- package/dist/esm/form/DateTimeInputBase.js +333 -0
- package/dist/esm/form/DateTimeInputBase.js.map +1 -0
- package/dist/esm/form/Field.js +153 -0
- package/dist/esm/form/Field.js.map +1 -0
- package/dist/esm/form/File.js +109 -0
- package/dist/esm/form/File.js.map +1 -0
- package/dist/esm/form/FormContext.js +170 -0
- package/dist/esm/form/FormContext.js.map +1 -0
- package/dist/esm/form/Input.js +88 -0
- package/dist/esm/form/Input.js.map +1 -0
- package/dist/esm/form/InputBase.js +40 -0
- package/dist/esm/form/InputBase.js.map +1 -0
- package/dist/esm/form/Numberinput.js +199 -0
- package/dist/esm/form/Numberinput.js.map +1 -0
- package/dist/esm/form/Radio.js +108 -0
- package/dist/esm/form/Radio.js.map +1 -0
- package/dist/esm/form/Radios.js +91 -0
- package/dist/esm/form/Radios.js.map +1 -0
- package/dist/esm/form/Rate.js +279 -0
- package/dist/esm/form/Rate.js.map +1 -0
- package/dist/esm/form/Select.js +81 -0
- package/dist/esm/form/Select.js.map +1 -0
- package/dist/esm/form/SelectBase.js +54 -0
- package/dist/esm/form/SelectBase.js.map +1 -0
- package/dist/esm/form/Slider.js +459 -0
- package/dist/esm/form/Slider.js.map +1 -0
- package/dist/esm/form/Switch.js +96 -0
- package/dist/esm/form/Switch.js.map +1 -0
- package/dist/esm/form/Taginput.js +352 -0
- package/dist/esm/form/Taginput.js.map +1 -0
- package/dist/esm/form/TextArea.js +77 -0
- package/dist/esm/form/TextArea.js.map +1 -0
- package/dist/esm/form/TextAreaBase.js +45 -0
- package/dist/esm/form/TextAreaBase.js.map +1 -0
- package/dist/esm/form/TimeInput.js +83 -0
- package/dist/esm/form/TimeInput.js.map +1 -0
- package/dist/esm/form/TimeInputBase.js +246 -0
- package/dist/esm/form/TimeInputBase.js.map +1 -0
- package/dist/esm/form/_pickerInternals/Calendar.js +760 -0
- package/dist/esm/form/_pickerInternals/Calendar.js.map +1 -0
- package/dist/esm/form/_pickerInternals/PickerPopover.js +95 -0
- package/dist/esm/form/_pickerInternals/PickerPopover.js.map +1 -0
- package/dist/esm/form/_pickerInternals/TimeWheels.js +721 -0
- package/dist/esm/form/_pickerInternals/TimeWheels.js.map +1 -0
- package/dist/esm/form/_pickerInternals/audioTick.js +109 -0
- package/dist/esm/form/_pickerInternals/audioTick.js.map +1 -0
- package/dist/esm/form/_pickerInternals/dateUtils.js +267 -0
- package/dist/esm/form/_pickerInternals/dateUtils.js.map +1 -0
- package/dist/esm/form/_pickerInternals/formatters.js +322 -0
- package/dist/esm/form/_pickerInternals/formatters.js.map +1 -0
- package/dist/esm/form/_pickerInternals/haptics.js +38 -0
- package/dist/esm/form/_pickerInternals/haptics.js.map +1 -0
- package/dist/esm/form/_pickerInternals/nativeInputSupport.js +25 -0
- package/dist/esm/form/_pickerInternals/nativeInputSupport.js.map +1 -0
- package/dist/esm/form/_pickerInternals/pickerTypes.js +50 -0
- package/dist/esm/form/_pickerInternals/pickerTypes.js.map +1 -0
- package/dist/esm/form/_pickerInternals/segmentMap.js +315 -0
- package/dist/esm/form/_pickerInternals/segmentMap.js.map +1 -0
- package/dist/esm/form/_pickerInternals/useNativeMobilePicker.js +49 -0
- package/dist/esm/form/_pickerInternals/useNativeMobilePicker.js.map +1 -0
- package/dist/esm/form/_pickerInternals/useSegmentedEntry.js +427 -0
- package/dist/esm/form/_pickerInternals/useSegmentedEntry.js.map +1 -0
- package/dist/esm/form/controlLoading.js +18 -0
- package/dist/esm/form/controlLoading.js.map +1 -0
- package/dist/esm/form/useAutoLabelId.js +54 -0
- package/dist/esm/form/useAutoLabelId.js.map +1 -0
- package/dist/esm/grid/Cell.js +35 -0
- package/dist/esm/grid/Cell.js.map +1 -0
- package/dist/esm/grid/Grid.js +51 -0
- package/dist/esm/grid/Grid.js.map +1 -0
- package/dist/esm/helpers/ClientOnly.js +33 -0
- package/dist/esm/helpers/ClientOnly.js.map +1 -0
- package/dist/esm/helpers/Config.js +60 -0
- package/dist/esm/helpers/Config.js.map +1 -0
- package/dist/esm/helpers/Theme.js +947 -0
- package/dist/esm/helpers/Theme.js.map +1 -0
- package/dist/esm/helpers/anchorAttrs.js +72 -0
- package/dist/esm/helpers/anchorAttrs.js.map +1 -0
- package/dist/esm/helpers/bulmaClassHelpers.js +415 -0
- package/dist/esm/helpers/bulmaClassHelpers.js.map +1 -0
- package/dist/esm/helpers/buttonType.js +24 -0
- package/dist/esm/helpers/buttonType.js.map +1 -0
- package/dist/esm/helpers/classNames.js +137 -0
- package/dist/esm/helpers/classNames.js.map +1 -0
- package/dist/esm/helpers/colorDeprecations.js +50 -0
- package/dist/esm/helpers/colorDeprecations.js.map +1 -0
- package/dist/esm/helpers/devWarnings.js +27 -0
- package/dist/esm/helpers/devWarnings.js.map +1 -0
- package/dist/esm/helpers/inertProps.js +27 -0
- package/dist/esm/helpers/inertProps.js.map +1 -0
- package/dist/esm/helpers/mergeBulmaStyles.js +20 -0
- package/dist/esm/helpers/mergeBulmaStyles.js.map +1 -0
- package/dist/esm/helpers/polymorphic.js +18 -0
- package/dist/esm/helpers/polymorphic.js.map +1 -0
- package/dist/esm/helpers/portal.js +76 -0
- package/dist/esm/helpers/portal.js.map +1 -0
- package/dist/esm/helpers/positionStacks.js +45 -0
- package/dist/esm/helpers/positionStacks.js.map +1 -0
- package/dist/esm/helpers/scrollLock.js +38 -0
- package/dist/esm/helpers/scrollLock.js.map +1 -0
- package/dist/esm/helpers/shadowDom.js +71 -0
- package/dist/esm/helpers/shadowDom.js.map +1 -0
- package/dist/esm/helpers/statusRegion.js +282 -0
- package/dist/esm/helpers/statusRegion.js.map +1 -0
- package/dist/esm/helpers/useAnchoredPosition.js +86 -0
- package/dist/esm/helpers/useAnchoredPosition.js.map +1 -0
- package/dist/esm/helpers/useBulmaClasses.js +158 -0
- package/dist/esm/helpers/useBulmaClasses.js.map +1 -0
- package/dist/esm/helpers/useClientLayoutEffect.js +13 -0
- package/dist/esm/helpers/useClientLayoutEffect.js.map +1 -0
- package/dist/esm/helpers/useColorClasses.js +84 -0
- package/dist/esm/helpers/useColorClasses.js.map +1 -0
- package/dist/esm/helpers/useFlexboxClasses.js +92 -0
- package/dist/esm/helpers/useFlexboxClasses.js.map +1 -0
- package/dist/esm/helpers/useFocusTrap.js +470 -0
- package/dist/esm/helpers/useFocusTrap.js.map +1 -0
- package/dist/esm/helpers/useIsHydrated.js +31 -0
- package/dist/esm/helpers/useIsHydrated.js.map +1 -0
- package/dist/esm/helpers/useOtherClasses.js +115 -0
- package/dist/esm/helpers/useOtherClasses.js.map +1 -0
- package/dist/esm/helpers/useSpacingClasses.js +82 -0
- package/dist/esm/helpers/useSpacingClasses.js.map +1 -0
- package/dist/esm/helpers/useTypographyClasses.js +93 -0
- package/dist/esm/helpers/useTypographyClasses.js.map +1 -0
- package/dist/esm/helpers/useVisibilityClasses.js +134 -0
- package/dist/esm/helpers/useVisibilityClasses.js.map +1 -0
- package/dist/esm/helpers/withSubComponents.js +24 -0
- package/dist/esm/helpers/withSubComponents.js.map +1 -0
- package/dist/esm/layout/Container.js +48 -0
- package/dist/esm/layout/Container.js.map +1 -0
- package/dist/esm/layout/Footer.js +33 -0
- package/dist/esm/layout/Footer.js.map +1 -0
- package/dist/esm/layout/Hero.js +90 -0
- package/dist/esm/layout/Hero.js.map +1 -0
- package/dist/esm/layout/Level.js +110 -0
- package/dist/esm/layout/Level.js.map +1 -0
- package/dist/esm/layout/Media.js +86 -0
- package/dist/esm/layout/Media.js.map +1 -0
- package/dist/esm/layout/Section.js +30 -0
- package/dist/esm/layout/Section.js.map +1 -0
- package/dist/extras.css +1 -1
- package/dist/extras.css.map +1 -1
- package/dist/index.cjs +821 -102
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +115 -16845
- package/dist/index.esm.js.map +1 -1
- package/dist/types/components/Tabs.d.ts +25 -3
- package/dist/types/elements/Icon.d.ts +10 -7
- package/dist/types/form/DateInputBase.d.ts +8 -6
- package/dist/types/form/DateRangeInput.d.ts +91 -0
- package/dist/types/form/DateRangeInputBase.d.ts +172 -0
- package/dist/types/form/DateTimeInputBase.d.ts +10 -6
- package/dist/types/form/File.d.ts +18 -5
- package/dist/types/form/FormContext.d.ts +11 -0
- package/dist/types/form/TimeInputBase.d.ts +1 -1
- package/dist/types/form/_pickerInternals/PickerPopover.d.ts +1 -0
- package/dist/types/form/_pickerInternals/dateUtils.d.ts +7 -0
- package/dist/types/form/_pickerInternals/formatters.d.ts +14 -0
- package/dist/types/form/_pickerInternals/pickerTypes.d.ts +13 -0
- package/dist/types/form/_pickerInternals/useSegmentedEntry.d.ts +12 -3
- package/dist/types/index.d.ts +4 -0
- package/dist/types-cjs/components/Tabs.d.ts +25 -3
- package/dist/types-cjs/elements/Icon.d.ts +10 -7
- package/dist/types-cjs/form/DateInputBase.d.ts +8 -6
- package/dist/types-cjs/form/DateRangeInput.d.ts +91 -0
- package/dist/types-cjs/form/DateRangeInputBase.d.ts +172 -0
- package/dist/types-cjs/form/DateTimeInputBase.d.ts +10 -6
- package/dist/types-cjs/form/File.d.ts +18 -5
- package/dist/types-cjs/form/FormContext.d.ts +11 -0
- package/dist/types-cjs/form/TimeInputBase.d.ts +1 -1
- package/dist/types-cjs/form/_pickerInternals/PickerPopover.d.ts +1 -0
- package/dist/types-cjs/form/_pickerInternals/dateUtils.d.ts +7 -0
- package/dist/types-cjs/form/_pickerInternals/formatters.d.ts +14 -0
- package/dist/types-cjs/form/_pickerInternals/pickerTypes.d.ts +13 -0
- package/dist/types-cjs/form/_pickerInternals/useSegmentedEntry.d.ts +12 -3
- package/dist/types-cjs/index.d.ts +4 -0
- package/dist/versions/bestax-no-dark-mode.css +1 -1
- package/dist/versions/bestax-no-dark-mode.css.map +1 -1
- package/dist/versions/bestax-no-helpers-prefixed.css +1 -1
- package/dist/versions/bestax-no-helpers-prefixed.css.map +1 -1
- package/dist/versions/bestax-no-helpers.css +1 -1
- package/dist/versions/bestax-no-helpers.css.map +1 -1
- package/dist/versions/bestax-prefixed.css +1 -1
- package/dist/versions/bestax-prefixed.css.map +1 -1
- package/package.json +1 -1
- package/src/scss/components/_tabs.scss +44 -0
- package/src/scss/form/_dateinput.scss +87 -8
- package/src/scss/form/_daterangeinput.scss +63 -0
- package/src/scss/form/_datetimeinput.scss +7 -2
- package/src/scss/form/_file.scss +37 -0
- package/src/scss/form/_index.scss +2 -0
- package/src/scss/form/_picker-popover.scss +1 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Calendar.js","sources":["../../../../src/form/_pickerInternals/Calendar.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n classNames,\n prefixedClassNames,\n usePrefixedClassNames,\n} from '../../helpers/classNames';\nimport { useConfig } from '../../helpers/Config';\nimport { getActiveElementInTree } from '../../helpers/shadowDom';\nimport { visuallyHidden } from '../../helpers/statusRegion';\nimport {\n DateGranularity,\n DateRangeValue,\n DayOfWeek,\n PickerLabels,\n isPopoverToggleKey,\n mergeLabels,\n} from './pickerTypes';\nimport {\n addDays,\n addMonths,\n addYears,\n buildMonthGrid,\n canCloseRange,\n clampDate,\n FIRST_YEAR,\n floorMin,\n isDayUnselectable,\n isPeriodUnselectable,\n isSameDay,\n isSameMonth,\n makeDate,\n startOfDay,\n startOfMonth,\n} from './dateUtils';\nimport { formatDate, getDayNames, getMonthNames } from './formatters';\n\n/** What every calendar takes, whichever way it picks. */\ninterface CalendarBaseProps {\n focusedDate: Date;\n onFocusedDateChange: (d: Date) => void;\n /**\n * Earliest selectable date. One before year 1, or none, counts as the start\n * of year 1.\n */\n min?: Date;\n max?: Date;\n shouldDisableDate?: (d: Date) => boolean;\n unselectableDates?: Date[];\n firstDayOfWeek?: DayOfWeek;\n locale?: string;\n dayNames?: string[];\n monthNames?: string[];\n nearbyMonthDays?: boolean;\n color?: 'primary' | 'link' | 'info' | 'success' | 'warning' | 'danger';\n size?: 'small' | 'medium' | 'large';\n className?: string;\n id?: string;\n /**\n * When true, the day or month grid takes focus as it renders, and again as\n * it comes back from the year list. With or without it, once a grid has\n * focus, focus follows its tab stop from cell to cell.\n */\n autoFocusCell?: boolean;\n /** Optional translatable string overrides. */\n labels?: PickerLabels;\n /**\n * Inclusive `[min, max]` year range shown in the year-dropdown view.\n * Defaults to ±100 years around the focused year, clamped by `min`/`max`\n * and never reaching below year 1.\n * At `'year'` granularity the window centres on the year focused when the\n * calendar mounted, so moving focus never reflows the list.\n */\n yearsRange?: [number, number];\n /**\n * What a selection means. `'day'` shows the day grid; `'month'` shows a\n * month grid for the focused year, with the year list one header click\n * away for jumping; `'year'` shows the year list as the selection surface.\n * A month or year cell is disabled when every day in it is, and `onSelect`\n * receives the period's first day.\n */\n granularity?: DateGranularity;\n}\n\n/** A calendar that picks one day, month or year. */\ninterface CalendarSingleProps {\n /** The selected date. */\n value: Date | null;\n /** Called with a picked date, or the first day of a picked period. */\n onSelect: (d: Date) => void;\n range?: never;\n onRangeSelect?: never;\n allowDisabledInRange?: never;\n}\n\n/** A calendar that picks a range of days. */\ninterface CalendarRangeProps {\n /**\n * The committed range, start first, which turns on range mode. The day grid\n * then picks two days: the first pick marks a start inside the calendar and\n * commits nothing, and the second calls `onRangeSelect` with both ends. A\n * pick that cannot end the range starts a new one instead: one before the\n * start, or one past a disabled day unless `allowDisabledInRange` is set.\n * While a start is pending the grid previews the range to the hovered day,\n * or to the focused day, and hides the committed one. A range with a start\n * and no end opens with that start pending. Escape takes back a pending pick\n * and stops there, so a popover around the calendar stays open; a pending\n * start that came from `range` is not a pick, and Escape goes on.\n */\n range: DateRangeValue;\n /** Called with both ends once the second day is picked. */\n onRangeSelect: (start: Date, end: Date) => void;\n /**\n * Let a range include days that `shouldDisableDate` or `unselectableDates`\n * disable. Its ends can still not be such days.\n */\n allowDisabledInRange?: boolean;\n /** Only the day grid picks a range. */\n granularity?: 'day';\n value?: never;\n onSelect?: never;\n}\n\n/**\n * The calendar picks one date through `value` and `onSelect`, or a range\n * through `range` and `onRangeSelect`, and its props take exactly one pair.\n */\nexport type CalendarProps = CalendarBaseProps &\n (CalendarSingleProps | CalendarRangeProps);\n\n/**\n * Selects the calendar's focused cell, the one tab stop of whichever grid or\n * year list is on show, for a popover to put focus on as it opens. It runs\n * against the whole panel, so it matches only inside the grid or the list.\n */\nexport const CALENDAR_FOCUSED_CELL =\n '[role=\"grid\"] [data-focused=\"true\"], [role=\"listbox\"] [data-focused-year=\"true\"]';\n\ntype CalendarView = 'days' | 'months' | 'years';\n\nconst BASE_VIEW: Record<DateGranularity, CalendarView> = {\n day: 'days',\n month: 'months',\n year: 'years',\n};\n\n// Months in rows of three, so the grid is four rows deep.\nconst MONTH_ROWS = [\n [0, 1, 2],\n [3, 4, 5],\n [6, 7, 8],\n [9, 10, 11],\n];\nconst MONTHS_PER_ROW = 3;\n// The year list's CSS lays it out four to a row.\nconst YEARS_PER_ROW = 4;\n\n/**\n * The month grid's keyboard, after the day grid's: arrows move a month or a\n * row, Home/End go to the row's ends, PageUp/PageDown move a year. Returns\n * the months to move by and the direction to search past disabled months, or\n * `null` for a key the grid doesn't handle. `col` is the focused month's\n * column.\n */\nfunction monthStep(key: string, col: number): [number, 1 | -1] | null {\n switch (key) {\n case 'ArrowLeft':\n return [-1, -1];\n case 'ArrowRight':\n return [1, 1];\n case 'ArrowUp':\n return [-MONTHS_PER_ROW, -1];\n case 'ArrowDown':\n return [MONTHS_PER_ROW, 1];\n case 'PageUp':\n return [-12, -1];\n case 'PageDown':\n return [12, 1];\n case 'Home':\n return [-col, 1];\n case 'End':\n return [MONTHS_PER_ROW - 1 - col, -1];\n default:\n return null;\n }\n}\n\n/**\n * Whether DOM focus should follow a grid's tab stop as it moves: focus is in\n * the grid, or fell to <body> while the grid held it last, as it does when\n * the focused cell leaves the page or becomes disabled. Focus is read in the\n * grid's own tree, so this holds inside a shadow root too.\n */\nfunction focusFollows(grid: HTMLElement, heldLast: boolean): boolean {\n const active = getActiveElementInTree(grid);\n if (grid.contains(active)) return true;\n return heldLast && active === grid.ownerDocument.body;\n}\n\n/**\n * The cell nearest index `i` that `disabled` leaves enabled, `i` itself when\n * it is. At equal distance the later cell wins. With every cell disabled it\n * stays `i`, as there is nothing to reach.\n */\nfunction nearestEnabled(i: number, disabled: boolean[]): number {\n if (!disabled[i]) return i;\n for (let d = 1; d < disabled.length; d++) {\n if (i + d < disabled.length && !disabled[i + d]) return i + d;\n if (i - d >= 0 && !disabled[i - d]) return i - d;\n }\n return i;\n}\n\n/** The long, spoken form of a date in a range's announcement. */\nconst LONG_DATE: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n};\n\n/** A range's pending start: its start, when it has no end. */\nconst pendingStartOf = (range?: DateRangeValue): Date | null =>\n range?.[0] && !range[1] ? startOfDay(range[0]) : null;\n\n/**\n * The day grid's cells in rows of a week. A grid owns rows and rows own\n * cells, so assistive technology can walk the grid, and the selection it\n * reports, row by row.\n */\nconst inWeeks = (days: React.ReactElement[], className: string) => {\n const rows: React.ReactElement[] = [];\n for (let i = 0; i < days.length; i += 7) {\n rows.push(\n <div key={i} role=\"row\" className={className}>\n {days.slice(i, i + 7)}\n </div>\n );\n }\n return rows;\n};\n\n/** A date's time, or `null` for none, for comparing ranges by value. */\nconst timeOf = (d: Date | null | undefined): number | null =>\n d ? d.getTime() : null;\n\n/**\n * The year list's keyboard, as the selection surface and as navigation:\n * arrows move a year or a row, Home/End go to the list's ends. Returns the\n * year to start from and the direction to search past disabled years, or\n * `null` for a key the list doesn't handle. As navigation no year is\n * disabled, so only the year is used.\n */\nfunction yearStep(\n key: string,\n focusedYear: number,\n years: number[]\n): [number, 1 | -1] | null {\n switch (key) {\n case 'ArrowLeft':\n return [focusedYear - 1, -1];\n case 'ArrowRight':\n return [focusedYear + 1, 1];\n case 'ArrowUp':\n return [focusedYear - YEARS_PER_ROW, -1];\n case 'ArrowDown':\n return [focusedYear + YEARS_PER_ROW, 1];\n case 'Home':\n return [years[0], 1];\n case 'End':\n return [years[years.length - 1], -1];\n default:\n return null;\n }\n}\n\nexport const Calendar: React.FC<CalendarProps> = ({\n value,\n focusedDate,\n onSelect,\n onFocusedDateChange,\n min: minProp,\n max,\n shouldDisableDate,\n unselectableDates,\n firstDayOfWeek = 0,\n locale,\n dayNames,\n monthNames,\n nearbyMonthDays = true,\n color,\n size,\n className,\n id,\n autoFocusCell = false,\n labels,\n yearsRange,\n granularity = 'day',\n range,\n onRangeSelect,\n allowDisabledInRange = false,\n}) => {\n const gridRef = useRef<HTMLDivElement>(null);\n const monthGridRef = useRef<HTMLDivElement>(null);\n const yearGridRef = useRef<HTMLDivElement>(null);\n const { classPrefix } = useConfig();\n const t = mergeLabels(labels);\n const baseView = BASE_VIEW[granularity];\n const isDayGranularity = granularity === 'day';\n const isYearGranularity = granularity === 'year';\n const [view, setView] = useState<CalendarView>(baseView);\n // Nothing before year 1 can be picked or reached, as in HTML's date inputs.\n const min = useMemo(() => floorMin(minProp), [minProp]);\n\n const computedDayNames = useMemo(() => {\n if (dayNames && dayNames.length === 7) return dayNames;\n const sundayFirst = getDayNames(locale, 'short');\n return [\n ...sundayFirst.slice(firstDayOfWeek),\n ...sundayFirst.slice(0, firstDayOfWeek),\n ];\n }, [dayNames, locale, firstDayOfWeek]);\n\n const computedMonthNames = useMemo(() => {\n if (monthNames && monthNames.length === 12) return monthNames;\n return getMonthNames(locale, 'long');\n }, [monthNames, locale]);\n\n // The month grid's cells are too narrow for long names, so they show the\n // short form unless the caller supplied names of their own.\n const monthCellNames = useMemo(() => {\n if (monthNames && monthNames.length === 12) return monthNames;\n return getMonthNames(locale, 'short');\n }, [monthNames, locale]);\n\n const cells = useMemo(\n () => buildMonthGrid(focusedDate, firstDayOfWeek),\n [focusedDate, firstDayOfWeek]\n );\n\n const isDateUnselectable = useCallback(\n (d: Date) =>\n isDayUnselectable(d, { min, max, shouldDisableDate, unselectableDates }),\n [min, max, shouldDisableDate, unselectableDates]\n );\n\n // A month or year is out of reach only when every day in it is.\n const isMonthUnselectable = useCallback(\n (d: Date) =>\n isPeriodUnselectable(d, 'month', {\n min,\n max,\n shouldDisableDate,\n unselectableDates,\n }),\n [min, max, shouldDisableDate, unselectableDates]\n );\n const isYearUnselectable = useCallback(\n (year: number) =>\n isPeriodUnselectable(makeDate(year), 'year', {\n min,\n max,\n shouldDisableDate,\n unselectableDates,\n }),\n [min, max, shouldDisableDate, unselectableDates]\n );\n\n // The day grid's one tab stop. A disabled button can't take focus, so when\n // the focused day is disabled the stop moves to the nearest enabled day of\n // the month on show, and focusing it makes it the focused day. A nearby\n // month's day is left out, as focusing it would turn the grid to its month.\n const tabStopDay = useMemo(() => {\n const days = cells.filter(c => c.inCurrentMonth).map(c => c.date);\n const i = nearestEnabled(\n focusedDate.getDate() - 1,\n days.map(isDateUnselectable)\n );\n return days[i];\n }, [cells, focusedDate, isDateUnselectable]);\n\n // ----- Range mode -----\n // Range props come only with the day grid.\n const rangeMode = !!range;\n const valuePending = pendingStartOf(range);\n\n // The start of a range being picked, which nothing outside the calendar\n // sees until its end is picked too. It starts as the range's own pending\n // start, and starts there again whenever the range changes from outside.\n const [anchor, setAnchor] = useState<Date | null>(valuePending);\n const rangeKey = `${timeOf(range?.[0])}|${timeOf(range?.[1])}`;\n const [anchorRangeKey, setAnchorRangeKey] = useState(rangeKey);\n if (anchorRangeKey !== rangeKey) {\n setAnchorRangeKey(rangeKey);\n setAnchor(valuePending);\n }\n // The day under the pointer while a start is pending, which the preview\n // runs to ahead of the focused day.\n const [hoverDate, setHoverDate] = useState<Date | null>(null);\n\n // Whether `day` can end a range that starts on `start`. The start is\n // checked as well as the end: one the range brought, or one picked before\n // the bounds or the disabled days changed, can rule itself out.\n const canEndAt = useCallback(\n (start: Date, day: Date) =>\n !isDateUnselectable(start) &&\n !isDateUnselectable(day) &&\n canCloseRange(\n start,\n day,\n { shouldDisableDate, unselectableDates },\n allowDisabledInRange\n ),\n [\n isDateUnselectable,\n shouldDisableDate,\n unselectableDates,\n allowDisabledInRange,\n ]\n );\n\n // A pick in range mode: the end of the pending range when it can be one,\n // and otherwise the start of a new one.\n const pickRangeDay = useCallback(\n (picked: Date) => {\n const day = startOfDay(picked);\n // The pointer is on the picked day, which the focused day now is too.\n setHoverDate(null);\n if (anchor && canEndAt(anchor, day)) {\n setAnchor(null);\n onRangeSelect?.(anchor, day);\n } else {\n setAnchor(day);\n }\n },\n [anchor, canEndAt, onRangeSelect]\n );\n\n // What the grid shows: while a start is pending, the range from it to the\n // hovered or focused day, when that day can end it; otherwise the\n // committed range.\n let shownStart: Date | null;\n let shownEnd: Date | null;\n if (anchor) {\n shownStart = anchor;\n const previewEnd = startOfDay(hoverDate ?? focusedDate);\n shownEnd = canEndAt(anchor, previewEnd) ? previewEnd : null;\n } else {\n shownStart = range?.[0] ? startOfDay(range[0]) : null;\n shownEnd = range?.[1] ? startOfDay(range[1]) : null;\n }\n const previewing = !!anchor;\n\n // Ids for the words that name a range's ends and state the whole range.\n const reactId = useId();\n const rangeIdBase = id ?? `calendar-${reactId}`;\n const rangeStartId = `${rangeIdBase}-range-start`;\n const rangeEndId = `${rangeIdBase}-range-end`;\n const rangePreviewEndId = `${rangeIdBase}-range-preview-end`;\n const rangeSummaryId = `${rangeIdBase}-range-summary`;\n // The selection in words: the pending start alone, or the committed ends.\n const selectedEnd = previewing ? null : shownEnd;\n const rangeSummary = [\n shownStart &&\n `${t.rangeStart}: ${formatDate(shownStart, LONG_DATE, locale)}`,\n selectedEnd &&\n `${t.rangeEnd}: ${formatDate(selectedEnd, LONG_DATE, locale)}`,\n ]\n .filter(Boolean)\n .join(', ');\n\n // Whether the grid on show holds focus, or held it last before focus went\n // nowhere: the cell that had it left the page or became disabled. A blur\n // that takes focus out of the grid, to nowhere included, is the user\n // leaving, so it clears this. A render that removes or disables the focused\n // cell sends no blur here: browsers fire none, or fire it inside React's\n // commit, where React delivers no events.\n const gridHeldFocusRef = useRef(false);\n const gridFocusHandlers = {\n onFocus: () => {\n gridHeldFocusRef.current = true;\n },\n onBlur: (e: React.FocusEvent<HTMLDivElement>) => {\n const next = e.relatedTarget as Node | null;\n if (!next || !e.currentTarget.contains(next)) {\n gridHeldFocusRef.current = false;\n }\n },\n };\n\n // Step from `next` by `direction` days until we hit a selectable date,\n // skipping past dates blocked by min/max, shouldDisableDate, or\n // unselectableDates. If the whole searched range is disabled, focus stays\n // put. Cap iterations to guard against pathologically empty ranges.\n const moveFocus = useCallback(\n (next: Date, direction: 1 | -1) => {\n let candidate = next;\n for (let i = 0; i < 366; i++) {\n if (candidate.getTime() < startOfDay(min).getTime()) return;\n if (max && candidate.getTime() > startOfDay(max).getTime()) return;\n if (!isDateUnselectable(candidate)) {\n onFocusedDateChange(candidate);\n return;\n }\n candidate = addDays(candidate, direction);\n }\n },\n [min, max, isDateUnselectable, onFocusedDateChange]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (isPopoverToggleKey(e)) return;\n // A key takes the range preview back from the pointer.\n setHoverDate(null);\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n moveFocus(addDays(focusedDate, -1), -1);\n break;\n case 'ArrowRight':\n e.preventDefault();\n moveFocus(addDays(focusedDate, 1), 1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n moveFocus(addDays(focusedDate, -7), -1);\n break;\n case 'ArrowDown':\n e.preventDefault();\n moveFocus(addDays(focusedDate, 7), 1);\n break;\n case 'PageUp':\n e.preventDefault();\n moveFocus(\n e.shiftKey ? addYears(focusedDate, -1) : addMonths(focusedDate, -1),\n -1\n );\n break;\n case 'PageDown':\n e.preventDefault();\n moveFocus(\n e.shiftKey ? addYears(focusedDate, 1) : addMonths(focusedDate, 1),\n 1\n );\n break;\n case 'Home': {\n e.preventDefault();\n const dayOfWeek = focusedDate.getDay();\n const offset = (dayOfWeek - firstDayOfWeek + 7) % 7;\n moveFocus(addDays(focusedDate, -offset), 1);\n break;\n }\n case 'End': {\n e.preventDefault();\n const dayOfWeek = focusedDate.getDay();\n const offset = (dayOfWeek - firstDayOfWeek + 7) % 7;\n moveFocus(addDays(focusedDate, 6 - offset), -1);\n break;\n }\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (isDateUnselectable(focusedDate)) break;\n if (rangeMode) pickRangeDay(focusedDate);\n else onSelect?.(focusedDate);\n break;\n case 'Escape':\n // A pending pick is taken back, and the key stops there so a\n // popover around the calendar stays open. The range's own pending\n // start is no pick, so Escape goes on to close the popover.\n if (anchor && !(valuePending && isSameDay(anchor, valuePending))) {\n e.preventDefault();\n e.stopPropagation();\n setAnchor(valuePending);\n }\n break;\n }\n },\n [\n focusedDate,\n firstDayOfWeek,\n isDateUnselectable,\n moveFocus,\n onSelect,\n rangeMode,\n pickRangeDay,\n anchor,\n valuePending,\n ]\n );\n\n // The month grid's counterpart to `moveFocus`: step by `direction` months\n // until a month with a selectable day turns up, stopping at the min/max\n // months. The cap guards against a range with nothing selectable.\n const moveMonthFocus = useCallback(\n (next: Date, direction: 1 | -1) => {\n let candidate = next;\n for (let i = 0; i < 120; i++) {\n const month = startOfMonth(candidate).getTime();\n if (month < startOfMonth(min).getTime()) return;\n if (max && month > startOfMonth(max).getTime()) return;\n if (!isMonthUnselectable(candidate)) {\n onFocusedDateChange(candidate);\n return;\n }\n candidate = addMonths(candidate, direction);\n }\n },\n [min, max, isMonthUnselectable, onFocusedDateChange]\n );\n\n const handleMonthKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (isPopoverToggleKey(e)) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (!isMonthUnselectable(focusedDate)) {\n onSelect?.(startOfMonth(focusedDate));\n }\n return;\n }\n const step = monthStep(e.key, focusedDate.getMonth() % MONTHS_PER_ROW);\n if (!step) return;\n e.preventDefault();\n moveMonthFocus(addMonths(focusedDate, step[0]), step[1]);\n },\n [focusedDate, isMonthUnselectable, moveMonthFocus, onSelect]\n );\n\n const calendarClass = usePrefixedClassNames('dateinput', {\n [`is-${color}`]: !!color,\n [`is-${size}`]: !!size,\n });\n const headerClass = usePrefixedClassNames('dateinput-header');\n const monthTriggerClass = usePrefixedClassNames('dateinput-month-trigger', {\n 'is-active': view === 'years',\n });\n const monthCaretClass = usePrefixedClassNames('dateinput-month-caret');\n const navGroupClass = usePrefixedClassNames('dateinput-nav-group');\n const navPrevClass = usePrefixedClassNames('dateinput-nav-prev');\n const navNextClass = usePrefixedClassNames('dateinput-nav-next');\n const monthLabelClass = usePrefixedClassNames('dateinput-month-label');\n const dayNamesRowClass = usePrefixedClassNames('dateinput-day-names');\n const dayNameClass = usePrefixedClassNames('dateinput-day-name');\n const gridClass = usePrefixedClassNames('dateinput-grid');\n const weekClass = usePrefixedClassNames('dateinput-week');\n const monthsGridClass = usePrefixedClassNames('dateinput-months-grid');\n const monthsRowClass = usePrefixedClassNames('dateinput-months-row');\n const yearsGridClass = usePrefixedClassNames('dateinput-years-grid');\n\n const focusedYear = focusedDate.getFullYear();\n const today = new Date();\n const todayYear = today.getFullYear();\n\n // The header steps a month at a time over the day grid and a year at a\n // time over the month grid, kept inside min/max. A step is off once the\n // month or year on show holds the bound or lies past it, as picking a year\n // from the list can leave it.\n const prevAnchor = isDayGranularity\n ? addMonths(focusedDate, -1)\n : clampDate(addYears(focusedDate, -1), min, max);\n const nextAnchor = isDayGranularity\n ? addMonths(focusedDate, 1)\n : clampDate(addYears(focusedDate, 1), min, max);\n const focusedMonth = startOfMonth(focusedDate).getTime();\n const prevDisabled = isDayGranularity\n ? focusedMonth <= startOfMonth(min).getTime()\n : focusedYear <= min.getFullYear();\n const nextDisabled = isDayGranularity\n ? !!max && focusedMonth >= startOfMonth(max).getTime()\n : !!max && focusedYear >= max.getFullYear();\n\n const labelId = id ? `${id}-label` : undefined;\n const monthLabel = isDayGranularity\n ? `${computedMonthNames[focusedDate.getMonth()]} ${focusedYear}`\n : String(focusedYear);\n\n // As the selection surface the year list is where focus moves, so its\n // window stays centred on the year focused at mount: re-centring on every\n // move would reflow the list under the keyboard.\n const [mountYear] = useState(focusedYear);\n const windowYear = isYearGranularity ? mountYear : focusedYear;\n\n const yearList = useMemo<number[]>(() => {\n const minYear = minProp\n ? min.getFullYear()\n : Math.max(FIRST_YEAR, windowYear - 100);\n const maxYear = max ? max.getFullYear() : windowYear + 100;\n const [lo, hi] = yearsRange ?? [minYear, maxYear];\n const start = Math.max(lo, minYear);\n const end = Math.min(hi, maxYear);\n const out: number[] = [];\n for (let y = start; y <= end; y++) out.push(y);\n return out;\n }, [windowYear, minProp, min, max, yearsRange]);\n\n // Only the selection surface disables years; as navigation every listed\n // year can be visited.\n const disabledYears = useMemo(\n () =>\n new Set(\n isYearGranularity ? yearList.filter(y => isYearUnselectable(y)) : []\n ),\n [isYearGranularity, yearList, isYearUnselectable]\n );\n // The year list's one tab stop, after the month grid's: when the focused\n // year is disabled the stop moves to the nearest enabled year in the list,\n // and focusing it makes it the focused year. As the selection surface a\n // year outside a non-empty list starts from the end it fell past, so the\n // list keeps a stop. As navigation it marks the current year, so a year\n // outside the list marks no option, and the stop itself follows focus.\n const tabStopYear = useMemo(() => {\n let i = yearList.indexOf(focusedYear);\n if (i < 0) {\n if (!isYearGranularity || yearList.length === 0) return focusedYear;\n i = focusedYear < yearList[0] ? 0 : yearList.length - 1;\n }\n return yearList[\n nearestEnabled(\n i,\n yearList.map(y => disabledYears.has(y))\n )\n ];\n }, [yearList, focusedYear, disabledYears, isYearGranularity]);\n\n // As navigation the keys move focus and leave the focused year alone, so\n // the tab stop goes to the year that last had focus while it is listed,\n // and Tab leaves the list rather than landing on the current year. It\n // starts over each time the list opens.\n const [navYear, setNavYear] = useState<number | null>(null);\n const listTabStop =\n navYear !== null && yearList.includes(navYear) ? navYear : tabStopYear;\n\n // Which of the focused year's months have no selectable day.\n const disabledMonths = useMemo(\n () =>\n granularity === 'month'\n ? Array.from({ length: 12 }, (_, m) =>\n isMonthUnselectable(makeDate(focusedYear, m))\n )\n : [],\n [granularity, focusedYear, isMonthUnselectable]\n );\n // The month grid's one tab stop. A disabled button can't take focus, so\n // when the focused month is disabled the stop moves to the nearest enabled\n // month, and focusing it makes it the focused month.\n const tabStopMonth = nearestEnabled(focusedDate.getMonth(), disabledMonths);\n\n const handleYearSelect = useCallback(\n (year: number) => {\n const next = new Date(focusedDate);\n next.setFullYear(year);\n // Keep month/day. The month grid also clamps into [min, max] so its\n // focused month is never one the bounds rule out.\n onFocusedDateChange(isDayGranularity ? next : clampDate(next, min, max));\n setView(baseView);\n },\n [focusedDate, onFocusedDateChange, isDayGranularity, min, max, baseView]\n );\n\n // Picking from the year list as the selection surface: focus follows the\n // pick and `onSelect` gets the year's first day.\n const handleYearPick = useCallback(\n (year: number) => {\n onFocusedDateChange(clampDate(makeDate(year), min, max));\n onSelect?.(makeDate(year));\n },\n [min, max, onFocusedDateChange, onSelect]\n );\n\n // Step through the listed years from `year` by `direction`, skipping\n // disabled ones, and focus the first selectable year found.\n const moveYearFocus = useCallback(\n (year: number, direction: 1 | -1) => {\n const first = yearList[0];\n const last = yearList[yearList.length - 1];\n for (let y = year; y >= first && y <= last; y += direction) {\n if (!disabledYears.has(y)) {\n onFocusedDateChange(clampDate(makeDate(y), min, max));\n return;\n }\n }\n },\n [yearList, disabledYears, onFocusedDateChange, min, max]\n );\n\n const handleYearListKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (isPopoverToggleKey(e)) return;\n if (isYearGranularity) {\n const step = yearStep(e.key, focusedYear, yearList);\n if (!step) return;\n e.preventDefault();\n moveYearFocus(step[0], step[1]);\n return;\n }\n // As navigation, Escape returns to the grid the list was opened from.\n // It stops there, so a popover around the calendar stays open and only\n // a second Escape closes it.\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n setView(baseView);\n return;\n }\n // The other keys move DOM focus from the year that has it and leave\n // the focused date alone. The list is centred on that date, so moving\n // it would reflow the list under the keyboard, and it would turn the\n // grid behind the list before anything is picked. Enter or Space\n // clicks the year with focus, which picks it.\n const options = Array.from(\n e.currentTarget.querySelectorAll<HTMLElement>('[role=\"option\"]')\n );\n const from = options.indexOf(e.target as HTMLElement);\n if (from < 0) return;\n const step = yearStep(e.key, yearList[from], yearList);\n if (!step) return;\n e.preventDefault();\n // The listed years run one apart, so a year's index is its distance\n // from the first. A step past either end finds no option.\n options[step[0] - yearList[0]]?.focus();\n },\n [isYearGranularity, baseView, focusedYear, yearList, moveYearFocus]\n );\n\n // The day or month grid takes focus as the popover opens on it, or comes\n // back to it from the year list.\n useEffect(() => {\n if (!autoFocusCell) return;\n const grid =\n view === 'days'\n ? gridRef.current\n : view === 'months'\n ? monthGridRef.current\n : null;\n grid?.querySelector<HTMLElement>('[data-focused=\"true\"]')?.focus();\n }, [autoFocusCell, view]);\n\n // From then on focus follows the tab stop only while the grid has it, or\n // has just lost it, so focus on a header button or a time wheel stays put.\n const tabStopDayTime = tabStopDay.getTime();\n useEffect(() => {\n const grid = gridRef.current;\n if (view !== 'days' || !grid) return;\n if (!focusFollows(grid, gridHeldFocusRef.current)) return;\n grid.querySelector<HTMLElement>('[data-focused=\"true\"]')?.focus();\n }, [tabStopDayTime, view]);\n\n useEffect(() => {\n const grid = monthGridRef.current;\n if (view !== 'months' || !grid) return;\n if (!focusFollows(grid, gridHeldFocusRef.current)) return;\n grid.querySelector<HTMLElement>('[data-focused=\"true\"]')?.focus();\n }, [focusedYear, tabStopMonth, view]);\n\n // When the year view opens as navigation, scroll the focused year into\n // view.\n useEffect(() => {\n if (view !== 'years' || isYearGranularity || !yearGridRef.current) return;\n const sel = yearGridRef.current.querySelector<HTMLElement>(\n '[data-focused-year=\"true\"]'\n );\n sel?.scrollIntoView({ block: 'center' });\n sel?.focus();\n }, [view, isYearGranularity]);\n\n // As the selection surface the year list opens with the focused year in\n // its middle. It scrolls the list itself rather than calling\n // `scrollIntoView`, which would also scroll the page to an inline calendar\n // on load, and focuses that year only when the popover asks.\n useEffect(() => {\n const list = yearGridRef.current;\n if (!isYearGranularity || !list) return;\n const target = list.querySelector<HTMLElement>(\n '[data-focused-year=\"true\"]'\n );\n if (!target) return;\n const rect = target.getBoundingClientRect();\n list.scrollTop +=\n rect.top -\n list.getBoundingClientRect().top -\n (list.clientHeight - rect.height) / 2;\n if (autoFocusCell) target.focus({ preventScroll: true });\n }, [isYearGranularity, autoFocusCell]);\n\n // Keyboard moves keep DOM focus on the focused year while the list has it.\n useEffect(() => {\n const list = yearGridRef.current;\n if (!isYearGranularity || !list) return;\n if (!list.contains(getActiveElementInTree(list))) return;\n list.querySelector<HTMLElement>('[data-focused-year=\"true\"]')?.focus();\n }, [isYearGranularity, focusedYear]);\n\n const navArrow = (d: string) => (\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\">\n <path\n d={d}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n return (\n <div className={classNames(calendarClass, className)} id={id}>\n <div className={headerClass}>\n {isYearGranularity ? (\n // The year list is the only view, so the label opens nothing.\n <span className={monthLabelClass} id={labelId}>\n {monthLabel}\n </span>\n ) : (\n <button\n type=\"button\"\n className={monthTriggerClass}\n aria-haspopup=\"listbox\"\n aria-expanded={view === 'years'}\n onClick={() => {\n setNavYear(null);\n setView(v => (v === 'years' ? baseView : 'years'));\n }}\n >\n <span className={monthLabelClass} id={labelId} aria-live=\"polite\">\n {monthLabel}\n </span>\n <svg\n className={monthCaretClass}\n viewBox=\"0 0 12 12\"\n width=\"10\"\n height=\"10\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2 4l4 4 4-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n {!isYearGranularity && (\n <div className={navGroupClass}>\n <button\n type=\"button\"\n className={navPrevClass}\n aria-label={isDayGranularity ? t.prevMonth : t.prevYear}\n disabled={prevDisabled || view !== baseView}\n onClick={() => onFocusedDateChange(prevAnchor)}\n >\n {navArrow('M10 3l-5 5 5 5')}\n </button>\n <button\n type=\"button\"\n className={navNextClass}\n aria-label={isDayGranularity ? t.nextMonth : t.nextYear}\n disabled={nextDisabled || view !== baseView}\n onClick={() => onFocusedDateChange(nextAnchor)}\n >\n {navArrow('M6 3l5 5-5 5')}\n </button>\n </div>\n )}\n </div>\n\n {view === 'days' && (\n <>\n <div className={dayNamesRowClass} aria-hidden=\"true\">\n {computedDayNames.map((name, i) => (\n <div key={i} className={dayNameClass}>\n {name}\n </div>\n ))}\n </div>\n <div\n ref={gridRef}\n role=\"grid\"\n aria-labelledby={labelId}\n aria-multiselectable={rangeMode || undefined}\n aria-describedby={rangeMode ? rangeSummaryId : undefined}\n className={gridClass}\n onKeyDown={handleKeyDown}\n onMouseLeave={anchor ? () => setHoverDate(null) : undefined}\n {...gridFocusHandlers}\n >\n {inWeeks(\n cells.map(cell => {\n const disabled = isDateUnselectable(cell.date);\n const time = cell.date.getTime();\n // Range mode. The range on show has its ends filled. Every day\n // of a committed range is selected, and of a preview only the\n // start.\n const isStart = time === timeOf(shownStart);\n const isEnd = time === timeOf(shownEnd);\n const inRange =\n !!shownStart &&\n !!shownEnd &&\n time > shownStart.getTime() &&\n time < shownEnd.getTime();\n // The day a pending range would end on, which isn't picked\n // yet, so its description says what picking it does.\n const isPreviewEnd = previewing && isEnd && !isStart;\n const isPreview = (previewing && inRange) || isPreviewEnd;\n const isFilled = rangeMode\n ? isStart || (isEnd && !previewing)\n : !!value && isSameDay(value, cell.date);\n const isSelected =\n isFilled || (rangeMode && !previewing && inRange);\n const describedBy = rangeMode\n ? [\n isStart && rangeStartId,\n isEnd && !previewing && rangeEndId,\n isPreviewEnd && rangePreviewEndId,\n ]\n .filter(Boolean)\n .join(' ') || undefined\n : undefined;\n const isFocused = isSameDay(cell.date, tabStopDay);\n const otherMonth = !cell.inCurrentMonth;\n const cellClass = prefixedClassNames(\n classPrefix,\n 'dateinput-cell',\n {\n 'is-selected': isFilled,\n 'is-range-start': isStart,\n 'is-range-end': isEnd,\n 'is-in-range': inRange,\n 'is-preview': isPreview,\n 'is-today': cell.isToday,\n 'is-disabled': disabled,\n 'is-other-month': otherMonth,\n }\n );\n const display = !otherMonth || nearbyMonthDays;\n return (\n <button\n key={cell.date.toISOString()}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={isFocused ? 0 : -1}\n aria-selected={isSelected}\n aria-disabled={disabled}\n aria-current={cell.isToday ? 'date' : undefined}\n aria-describedby={describedBy}\n data-focused={isFocused ? 'true' : undefined}\n disabled={disabled || !display}\n className={cellClass}\n onFocus={() => {\n // Reached by Tab while the focused day is disabled, or\n // by pointer: keys move on from here. A nearby month's\n // day waits for its click, which turns the grid.\n if (!otherMonth && !isSameDay(cell.date, focusedDate)) {\n onFocusedDateChange(cell.date);\n }\n }}\n // Mouseover rather than mouseenter: browsers send it to a\n // disabled day as well, where React holds mouseenter back,\n // so the preview leaves the last enabled day behind.\n onMouseOver={\n anchor ? () => setHoverDate(cell.date) : undefined\n }\n onClick={() => {\n if (disabled) return;\n onFocusedDateChange(cell.date);\n if (rangeMode) pickRangeDay(cell.date);\n else onSelect?.(cell.date);\n }}\n style={!display ? { visibility: 'hidden' } : undefined}\n >\n {cell.date.getDate()}\n </button>\n );\n }),\n weekClass\n )}\n </div>\n </>\n )}\n\n {view === 'months' && (\n <div\n ref={monthGridRef}\n role=\"grid\"\n aria-labelledby={labelId}\n className={monthsGridClass}\n onKeyDown={handleMonthKeyDown}\n {...gridFocusHandlers}\n >\n {MONTH_ROWS.map(row => (\n <div key={row[0]} role=\"row\" className={monthsRowClass}>\n {row.map(month => {\n const date = makeDate(focusedYear, month);\n const disabled = disabledMonths[month];\n const isSelected = !!value && isSameMonth(value, date);\n const isFocused = month === tabStopMonth;\n const isCurrent = isSameMonth(date, today);\n const cellClass = prefixedClassNames(\n classPrefix,\n 'dateinput-month-cell',\n {\n 'is-selected': isSelected,\n 'is-today': isCurrent,\n 'is-disabled': disabled,\n }\n );\n return (\n <button\n key={month}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={isFocused ? 0 : -1}\n aria-selected={isSelected}\n aria-disabled={disabled}\n aria-current={isCurrent ? 'date' : undefined}\n aria-label={computedMonthNames[month]}\n data-focused={isFocused ? 'true' : undefined}\n disabled={disabled}\n className={cellClass}\n onFocus={() => {\n // Reached by Tab while the focused month is disabled,\n // or by pointer: keys move on from here.\n if (month !== focusedDate.getMonth()) {\n onFocusedDateChange(clampDate(date, min, max));\n }\n }}\n onClick={() => {\n onFocusedDateChange(clampDate(date, min, max));\n onSelect?.(date);\n }}\n >\n {monthCellNames[month]}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n )}\n\n {view === 'years' && (\n <div\n ref={yearGridRef}\n className={yearsGridClass}\n role=\"listbox\"\n aria-label={isYearGranularity ? t.chooseYear : monthLabel}\n onKeyDown={handleYearListKeyDown}\n >\n {yearList.map(year => {\n const isFocused = year === tabStopYear;\n const isToday = year === todayYear;\n // As navigation the focused year is the current one. As the\n // selection surface the value's year is selected and focus roams.\n const isSelected = isYearGranularity\n ? !!value && value.getFullYear() === year\n : isFocused;\n const disabled = disabledYears.has(year);\n const cellCls = prefixedClassNames(\n classPrefix,\n 'dateinput-year-cell',\n {\n 'is-selected': isSelected,\n 'is-today': isToday,\n 'is-disabled': disabled,\n }\n );\n return (\n <button\n key={year}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isYearGranularity ? disabled : undefined}\n aria-current={isYearGranularity && isToday ? 'date' : undefined}\n data-focused-year={isFocused ? 'true' : undefined}\n tabIndex={year === listTabStop ? 0 : -1}\n disabled={disabled}\n className={cellCls}\n onFocus={() => {\n // As navigation, focusing a year by key or pointer only\n // moves the tab stop: nothing is committed until a year is\n // picked. As the selection surface it is reached by Tab\n // while the focused year is disabled, or by pointer, and\n // keys move on from here.\n if (!isYearGranularity) {\n setNavYear(year);\n } else if (year !== focusedYear) {\n onFocusedDateChange(clampDate(makeDate(year), min, max));\n }\n }}\n onClick={() =>\n isYearGranularity\n ? handleYearPick(year)\n : handleYearSelect(year)\n }\n >\n {year}\n </button>\n );\n })}\n </div>\n )}\n\n {rangeMode && (\n // The words the day cells and the grid point at. The live region\n // stays mounted while the year list is open, so it is in the page\n // already when a pick changes what it says.\n <>\n <span id={rangeStartId} hidden>\n {t.rangeStart}\n </span>\n <span id={rangeEndId} hidden>\n {t.rangeEnd}\n </span>\n <span id={rangePreviewEndId} hidden>\n {t.rangePreviewEnd}\n </span>\n <div id={rangeSummaryId} aria-live=\"polite\" style={visuallyHidden}>\n {rangeSummary}\n </div>\n </>\n )}\n </div>\n );\n};\n\nCalendar.displayName = 'Calendar';\n\nexport default Calendar;\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/* @allxsmith/bestax-bulma — AI agents: see AGENTS.md in the package root, or https://bestax.io/llms.txt */
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useRef, useMemo, useEffect } from 'react';
|
|
4
|
+
import { createPortal } from 'react-dom';
|
|
5
|
+
import { usePrefixedClassNames, classNames } from '../../helpers/classNames.js';
|
|
6
|
+
import { useFocusTrap } from '../../helpers/useFocusTrap.js';
|
|
7
|
+
import { useAnchoredPosition, marginGap } from '../../helpers/useAnchoredPosition.js';
|
|
8
|
+
|
|
9
|
+
const isBrowser = typeof window !== 'undefined';
|
|
10
|
+
const PickerPopover = ({ isOpen, onClose, anchorRef, children, position = 'bottom-left', appendToBody = false, className, trapFocus = true, closeOnClickOutside = true, closeOnEscape = true, ariaLabel, ariaLabelledBy, role = 'dialog', id, restoreFocusRef, initialFocusSelector, }) => {
|
|
11
|
+
const panelRef = useRef(null);
|
|
12
|
+
// Read as the trap turns on, once the panel's content has rendered.
|
|
13
|
+
const initialFocusRef = useMemo(() => initialFocusSelector === undefined
|
|
14
|
+
? undefined
|
|
15
|
+
: {
|
|
16
|
+
get current() {
|
|
17
|
+
return (panelRef.current?.querySelector(initialFocusSelector) ?? null);
|
|
18
|
+
},
|
|
19
|
+
}, [initialFocusSelector]);
|
|
20
|
+
const resolved = useAnchoredPosition(anchorRef, panelRef, {
|
|
21
|
+
active: isOpen,
|
|
22
|
+
position,
|
|
23
|
+
fixed: appendToBody,
|
|
24
|
+
// The gap comes from `--bulma-picker-popover-offset` as a margin, in place
|
|
25
|
+
// or portaled, so the coordinates leave it out and `auto` reads it off
|
|
26
|
+
// the panel.
|
|
27
|
+
offset: 0,
|
|
28
|
+
styledGap: marginGap,
|
|
29
|
+
});
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (!isOpen || !closeOnClickOutside || !isBrowser)
|
|
32
|
+
return undefined;
|
|
33
|
+
// Listen on `pointerdown` (rather than `mousedown`) so touch starts
|
|
34
|
+
// outside the popover dismiss it on mobile — including swipe-from-outside
|
|
35
|
+
// gestures, where the synthetic mouse event would otherwise lag a few
|
|
36
|
+
// hundred ms behind the actual touch.
|
|
37
|
+
const handler = (e) => {
|
|
38
|
+
const path = e.composedPath();
|
|
39
|
+
if (panelRef.current && path.includes(panelRef.current))
|
|
40
|
+
return;
|
|
41
|
+
if (anchorRef.current && path.includes(anchorRef.current))
|
|
42
|
+
return;
|
|
43
|
+
onClose();
|
|
44
|
+
};
|
|
45
|
+
document.addEventListener('pointerdown', handler);
|
|
46
|
+
return () => document.removeEventListener('pointerdown', handler);
|
|
47
|
+
}, [isOpen, closeOnClickOutside, anchorRef, onClose]);
|
|
48
|
+
// Escape closes it, and so does Alt+ArrowUp, the combobox's key for it,
|
|
49
|
+
// which the calendar and the time wheels inside leave to it.
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (!isOpen || !closeOnEscape || !isBrowser)
|
|
52
|
+
return undefined;
|
|
53
|
+
const handler = (e) => {
|
|
54
|
+
if (e.key === 'Escape') {
|
|
55
|
+
e.stopPropagation();
|
|
56
|
+
onClose();
|
|
57
|
+
}
|
|
58
|
+
else if (e.altKey && e.key === 'ArrowUp') {
|
|
59
|
+
e.preventDefault();
|
|
60
|
+
e.stopPropagation();
|
|
61
|
+
onClose();
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
document.addEventListener('keydown', handler);
|
|
65
|
+
return () => document.removeEventListener('keydown', handler);
|
|
66
|
+
}, [isOpen, closeOnEscape, onClose]);
|
|
67
|
+
useFocusTrap(panelRef, {
|
|
68
|
+
active: isOpen && trapFocus,
|
|
69
|
+
initialFocusRef,
|
|
70
|
+
restoreFocus: restoreFocusRef ?? true,
|
|
71
|
+
});
|
|
72
|
+
const panelClass = usePrefixedClassNames('picker-popover', {
|
|
73
|
+
'is-active': isOpen,
|
|
74
|
+
[`is-${resolved.position}`]: true,
|
|
75
|
+
'is-portal': appendToBody,
|
|
76
|
+
});
|
|
77
|
+
if (!isOpen)
|
|
78
|
+
return null;
|
|
79
|
+
const style = appendToBody
|
|
80
|
+
? {
|
|
81
|
+
position: 'fixed',
|
|
82
|
+
top: resolved.top,
|
|
83
|
+
left: resolved.left,
|
|
84
|
+
}
|
|
85
|
+
: {};
|
|
86
|
+
const panel = (jsx("div", { ref: panelRef, id: id, role: role, "aria-modal": role === 'dialog' ? 'false' : undefined, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, tabIndex: -1, className: classNames(panelClass, className), style: style, children: children }));
|
|
87
|
+
if (appendToBody && isBrowser) {
|
|
88
|
+
return createPortal(panel, document.body);
|
|
89
|
+
}
|
|
90
|
+
return panel;
|
|
91
|
+
};
|
|
92
|
+
PickerPopover.displayName = 'PickerPopover';
|
|
93
|
+
|
|
94
|
+
export { PickerPopover };
|
|
95
|
+
//# sourceMappingURL=PickerPopover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PickerPopover.js","sources":["../../../../src/form/_pickerInternals/PickerPopover.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { classNames, usePrefixedClassNames } from '../../helpers/classNames';\nimport { useFocusTrap } from '../../helpers/useFocusTrap';\nimport {\n marginGap,\n useAnchoredPosition,\n} from '../../helpers/useAnchoredPosition';\nimport { PickerPosition } from './pickerTypes';\n\nexport interface PickerPopoverProps {\n isOpen: boolean;\n onClose: () => void;\n anchorRef: React.RefObject<HTMLElement | null>;\n children: React.ReactNode;\n position?: PickerPosition;\n appendToBody?: boolean;\n className?: string;\n trapFocus?: boolean;\n closeOnClickOutside?: boolean;\n /** Close on Escape and on Alt+ArrowUp. Default `true`. */\n closeOnEscape?: boolean;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n role?: 'dialog' | 'group';\n id?: string;\n /**\n * Where focus goes when the popover closes. Without it, focus goes back to\n * whatever had it when the focus trap turned on, which is read after the\n * panel's content mounts: a calendar that focuses a cell as it mounts\n * would be recorded instead, and that cell leaves with the panel.\n */\n restoreFocusRef?: React.RefObject<HTMLElement | null>;\n /**\n * Selects the element in the panel that takes focus as it opens, such as a\n * calendar's focused date rather than the first button in its header. When\n * nothing matches, or the match can't take focus, the first tab stop does.\n */\n initialFocusSelector?: string;\n}\n\nconst isBrowser = typeof window !== 'undefined';\n\nexport const PickerPopover: React.FC<PickerPopoverProps> = ({\n isOpen,\n onClose,\n anchorRef,\n children,\n position = 'bottom-left',\n appendToBody = false,\n className,\n trapFocus = true,\n closeOnClickOutside = true,\n closeOnEscape = true,\n ariaLabel,\n ariaLabelledBy,\n role = 'dialog',\n id,\n restoreFocusRef,\n initialFocusSelector,\n}) => {\n const panelRef = useRef<HTMLDivElement>(null);\n // Read as the trap turns on, once the panel's content has rendered.\n const initialFocusRef = useMemo(\n () =>\n initialFocusSelector === undefined\n ? undefined\n : {\n get current() {\n return (\n panelRef.current?.querySelector<HTMLElement>(\n initialFocusSelector\n ) ?? null\n );\n },\n },\n [initialFocusSelector]\n );\n const resolved = useAnchoredPosition(anchorRef, panelRef, {\n active: isOpen,\n position,\n fixed: appendToBody,\n // The gap comes from `--bulma-picker-popover-offset` as a margin, in place\n // or portaled, so the coordinates leave it out and `auto` reads it off\n // the panel.\n offset: 0,\n styledGap: marginGap,\n });\n\n useEffect(() => {\n if (!isOpen || !closeOnClickOutside || !isBrowser) return undefined;\n // Listen on `pointerdown` (rather than `mousedown`) so touch starts\n // outside the popover dismiss it on mobile — including swipe-from-outside\n // gestures, where the synthetic mouse event would otherwise lag a few\n // hundred ms behind the actual touch.\n const handler = (e: PointerEvent) => {\n const path = e.composedPath();\n if (panelRef.current && path.includes(panelRef.current)) return;\n if (anchorRef.current && path.includes(anchorRef.current)) return;\n onClose();\n };\n document.addEventListener('pointerdown', handler);\n return () => document.removeEventListener('pointerdown', handler);\n }, [isOpen, closeOnClickOutside, anchorRef, onClose]);\n\n // Escape closes it, and so does Alt+ArrowUp, the combobox's key for it,\n // which the calendar and the time wheels inside leave to it.\n useEffect(() => {\n if (!isOpen || !closeOnEscape || !isBrowser) return undefined;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n onClose();\n } else if (e.altKey && e.key === 'ArrowUp') {\n e.preventDefault();\n e.stopPropagation();\n onClose();\n }\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [isOpen, closeOnEscape, onClose]);\n\n useFocusTrap(panelRef, {\n active: isOpen && trapFocus,\n initialFocusRef,\n restoreFocus: restoreFocusRef ?? true,\n });\n\n const panelClass = usePrefixedClassNames('picker-popover', {\n 'is-active': isOpen,\n [`is-${resolved.position}`]: true,\n 'is-portal': appendToBody,\n });\n\n if (!isOpen) return null;\n\n const style: React.CSSProperties = appendToBody\n ? {\n position: 'fixed',\n top: resolved.top,\n left: resolved.left,\n }\n : {};\n\n const panel = (\n <div\n ref={panelRef}\n id={id}\n role={role}\n aria-modal={role === 'dialog' ? 'false' : undefined}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n tabIndex={-1}\n className={classNames(panelClass, className)}\n style={style}\n >\n {children}\n </div>\n );\n\n if (appendToBody && isBrowser) {\n return createPortal(panel, document.body);\n }\n return panel;\n};\n\nPickerPopover.displayName = 'PickerPopover';\n\nexport default PickerPopover;\n"],"names":["_jsx"],"mappings":"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"}
|