@astryxdesign/core 0.1.1 → 0.1.2-canary.04e71b2
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/CHANGELOG.md +105 -0
- package/README.md +131 -13
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +11 -5
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +4 -1
- package/dist/Banner/Banner.d.ts +7 -0
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +9 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +24 -5
- package/dist/Button/Button.d.ts +12 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +53 -17
- package/dist/Calendar/Calendar.d.ts +5 -4
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +82 -43
- package/dist/Calendar/hooks/index.d.ts +0 -2
- package/dist/Calendar/hooks/index.d.ts.map +1 -1
- package/dist/Calendar/hooks/index.js +1 -2
- package/dist/Calendar/index.d.ts +3 -3
- package/dist/Calendar/index.d.ts.map +1 -1
- package/dist/Calendar/index.js +1 -1
- package/dist/Calendar/styles.d.ts +3 -9
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +3 -11
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +17 -3
- package/dist/Center/Center.d.ts +11 -1
- package/dist/Center/Center.d.ts.map +1 -1
- package/dist/Center/Center.js +9 -3
- package/dist/Chat/ChatMessageList.d.ts +14 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +2 -0
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +4 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts +23 -2
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +51 -9
- package/dist/CheckboxList/CheckboxList.d.ts +13 -1
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +39 -9
- package/dist/CheckboxList/CheckboxListContext.d.ts +7 -0
- package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +49 -37
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +5 -5
- package/dist/ContextMenu/ContextMenu.d.ts +4 -5
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +93 -11
- package/dist/DateInput/DateInput.d.ts +23 -1
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +59 -8
- package/dist/DateRangeInput/DateRangeInput.d.ts +23 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +42 -9
- package/dist/DateTimeInput/DateTimeInput.d.ts +35 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +78 -15
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +12 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts +1 -8
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +42 -14
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +7 -1
- package/dist/Field/Field.d.ts +19 -2
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +4 -0
- package/dist/Field/FieldLabel.d.ts +21 -2
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +41 -26
- package/dist/FileInput/FileInput.d.ts +22 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +56 -10
- package/dist/Grid/Grid.d.ts +11 -1
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +8 -0
- package/dist/HoverCard/HoverCard.d.ts +2 -2
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +18 -6
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +7 -3
- package/dist/InputGroup/InputGroup.d.ts +2 -2
- package/dist/InputGroup/InputGroup.d.ts.map +1 -1
- package/dist/InputGroup/InputGroup.js +14 -5
- package/dist/InputGroup/InputGroupContext.d.ts +4 -0
- package/dist/InputGroup/InputGroupContext.d.ts.map +1 -1
- package/dist/InputGroup/InputGroupContext.js +2 -2
- package/dist/InputGroup/index.d.ts +1 -0
- package/dist/InputGroup/index.d.ts.map +1 -1
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +34 -2
- package/dist/Layer/anchorName.d.ts +20 -0
- package/dist/Layer/anchorName.d.ts.map +1 -0
- package/dist/Layer/anchorName.js +36 -0
- package/dist/Layer/layerAnimations.stylex.d.ts +4 -0
- package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
- package/dist/Layer/layerAnimations.stylex.js +8 -4
- package/dist/Layer/useLayer.d.ts +29 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +55 -11
- package/dist/Layout/Layout.d.ts +4 -11
- package/dist/Layout/Layout.d.ts.map +1 -1
- package/dist/Layout/Layout.js +10 -11
- package/dist/Layout/LayoutFooter.d.ts +2 -2
- package/dist/Layout/LayoutFooter.d.ts.map +1 -1
- package/dist/Layout/LayoutHeader.d.ts +2 -2
- package/dist/Layout/LayoutHeader.d.ts.map +1 -1
- package/dist/Layout/LayoutPanel.d.ts +2 -2
- package/dist/Layout/LayoutPanel.d.ts.map +1 -1
- package/dist/Layout/padding.stylex.d.ts +51 -0
- package/dist/Layout/padding.stylex.d.ts.map +1 -1
- package/dist/Layout/padding.stylex.js +63 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +4 -2
- package/dist/Link/Link.d.ts +17 -2
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +20 -9
- package/dist/Link/LinkProvider.d.ts +1 -0
- package/dist/Link/LinkProvider.d.ts.map +1 -1
- package/dist/Link/LinkProvider.js +1 -0
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +18 -3
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +13 -0
- package/dist/MoreMenu/MoreMenu.d.ts +1 -7
- package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
- package/dist/MoreMenu/MoreMenu.js +0 -2
- package/dist/MultiSelector/MultiSelector.d.ts +25 -2
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +103 -22
- package/dist/MultiSelector/hooks.d.ts +12 -1
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +14 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +34 -3
- package/dist/NumberInput/NumberInput.d.ts +23 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +62 -12
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +46 -28
- package/dist/Popover/usePopover.d.ts +25 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +18 -6
- package/dist/PowerSearch/PowerSearch.d.ts +11 -1
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +6 -1
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +3 -5
- package/dist/RadioList/RadioList.d.ts +20 -2
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +105 -9
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +13 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts +13 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +78 -44
- package/dist/SegmentedControl/SegmentedControlContext.d.ts +7 -0
- package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +13 -2
- package/dist/Selector/Selector.d.ts +22 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +84 -23
- package/dist/Selector/hooks.d.ts +8 -1
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +14 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +1 -1
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +8 -2
- package/dist/Slider/Slider.d.ts +21 -0
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +38 -11
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +1 -1
- package/dist/Stack/Stack.d.ts +38 -23
- package/dist/Stack/Stack.d.ts.map +1 -1
- package/dist/Stack/Stack.js +25 -1
- package/dist/Stack/StackItem.d.ts +12 -23
- package/dist/Stack/StackItem.d.ts.map +1 -1
- package/dist/Stack/StackItem.js +8 -1
- package/dist/Switch/Switch.d.ts +23 -2
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +41 -11
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +6 -0
- package/dist/TabList/TabList.d.ts +16 -4
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +86 -10
- package/dist/TabList/TabListContext.d.ts +5 -0
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +5 -0
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +6 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +38 -16
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +36 -7
- package/dist/Table/TableCell.d.ts +8 -1
- package/dist/Table/TableCell.d.ts.map +1 -1
- package/dist/Table/TableCell.js +10 -10
- package/dist/Table/TableHeaderCell.d.ts +8 -1
- package/dist/Table/TableHeaderCell.d.ts.map +1 -1
- package/dist/Table/TableHeaderCell.js +16 -16
- package/dist/Table/TableRow.d.ts +6 -1
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +15 -7
- package/dist/Table/index.d.ts +4 -1
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +3 -2
- package/dist/Table/plugins/pagination/paginateData.d.ts +2 -1
- package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/paginateData.js +8 -3
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +6 -1
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +59 -3
- package/dist/Table/plugins/stickyColumns/index.d.ts +3 -0
- package/dist/Table/plugins/stickyColumns/index.d.ts.map +1 -0
- package/dist/Table/plugins/stickyColumns/index.js +3 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts +25 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +369 -0
- package/dist/Table/tableContextMenu.d.ts +33 -0
- package/dist/Table/tableContextMenu.d.ts.map +1 -0
- package/dist/Table/tableContextMenu.js +133 -0
- package/dist/Table/types.d.ts +161 -5
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +1 -1
- package/dist/Text/text.stylex.d.ts +2 -2
- package/dist/Text/text.stylex.js +2 -2
- package/dist/TextArea/TextArea.d.ts +22 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +41 -9
- package/dist/TextInput/TextInput.d.ts +23 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +55 -10
- package/dist/TimeInput/TimeInput.d.ts +23 -1
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +53 -10
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +28 -3
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +14 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +132 -3
- package/dist/ToggleButton/ToggleButton.d.ts +7 -9
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +34 -57
- package/dist/Tokenizer/Tokenizer.d.ts +12 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +27 -5
- package/dist/Toolbar/Toolbar.d.ts +3 -3
- package/dist/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar/Toolbar.js +51 -7
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +57 -9
- package/dist/TreeList/TreeList.d.ts +1 -1
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +72 -2
- package/dist/TreeList/TreeListItem.d.ts +11 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +51 -12
- package/dist/TreeList/treeListItem.markers.stylex.d.ts +16 -0
- package/dist/TreeList/treeListItem.markers.stylex.d.ts.map +1 -0
- package/dist/TreeList/treeListItem.markers.stylex.js +22 -0
- package/dist/Typeahead/BaseTypeahead.d.ts +9 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +67 -6
- package/dist/Typeahead/Typeahead.d.ts +24 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +29 -5
- package/dist/VisuallyHidden/VisuallyHidden.d.ts +61 -0
- package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
- package/dist/VisuallyHidden/VisuallyHidden.js +65 -0
- package/dist/VisuallyHidden/index.d.ts +11 -0
- package/dist/VisuallyHidden/index.d.ts.map +1 -0
- package/dist/VisuallyHidden/index.js +13 -0
- package/dist/astryx.css +40 -1
- package/dist/astryx.umd.js +147 -0
- package/dist/astryx.umd.js.map +7 -0
- package/dist/hooks/focusableSelector.d.ts +22 -0
- package/dist/hooks/focusableSelector.d.ts.map +1 -0
- package/dist/hooks/focusableSelector.js +24 -0
- package/dist/hooks/index.d.ts +12 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +7 -2
- package/dist/hooks/useAnnounce.d.ts +40 -0
- package/dist/hooks/useAnnounce.d.ts.map +1 -0
- package/dist/hooks/useAnnounce.js +142 -0
- package/dist/hooks/useClickableContainer.d.ts +16 -1
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +16 -4
- package/dist/hooks/useEntryAnimation.d.ts.map +1 -1
- package/dist/hooks/useEntryAnimation.js +4 -4
- package/dist/hooks/useFocusTrap.d.ts +18 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +87 -3
- package/dist/hooks/useGridFocus.d.ts +88 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +261 -62
- package/dist/hooks/useKeyboardHint.d.ts +82 -0
- package/dist/hooks/useKeyboardHint.d.ts.map +1 -0
- package/dist/hooks/useKeyboardHint.js +220 -0
- package/dist/hooks/useListFocus.d.ts +78 -7
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +305 -52
- package/dist/hooks/useLongPress.d.ts +21 -0
- package/dist/hooks/useLongPress.d.ts.map +1 -0
- package/dist/hooks/useLongPress.js +89 -0
- package/dist/hooks/useTreeFocus.d.ts +157 -0
- package/dist/hooks/useTreeFocus.d.ts.map +1 -0
- package/dist/hooks/useTreeFocus.js +337 -0
- package/dist/hooks/useTypeahead.d.ts +63 -0
- package/dist/hooks/useTypeahead.d.ts.map +1 -0
- package/dist/hooks/useTypeahead.js +117 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/generateThemeRules.js +1 -1
- package/dist/theme/syntax/SyntaxTheme.d.ts +1 -1
- package/dist/theme/syntax/SyntaxTheme.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -2
- package/dist/theme/syntax/presets.d.ts +1 -1
- package/dist/theme/syntax/presets.d.ts.map +1 -1
- package/dist/theme/syntax/presets.js +1 -1
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.js +1 -1
- package/dist/theme/types.d.ts +1 -1
- package/dist/utils/dateTypes.d.ts +12 -0
- package/dist/utils/dateTypes.d.ts.map +1 -1
- package/dist/utils/dateTypes.js +41 -1
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/inputAria.d.ts +29 -0
- package/dist/utils/inputAria.d.ts.map +1 -0
- package/dist/utils/inputAria.js +30 -0
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +5 -2
- package/package.json +15 -5
- package/src/Avatar/Avatar.test.tsx +37 -0
- package/src/Avatar/Avatar.tsx +10 -5
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +3 -0
- package/src/Banner/Banner.doc.mjs +8 -0
- package/src/Banner/Banner.test.tsx +16 -7
- package/src/Banner/Banner.tsx +9 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +25 -7
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +31 -10
- package/src/Button/Button.doc.mjs +6 -0
- package/src/Button/Button.test.tsx +105 -11
- package/src/Button/Button.tsx +76 -21
- package/src/Calendar/Calendar.doc.mjs +4 -4
- package/src/Calendar/Calendar.test.tsx +168 -30
- package/src/Calendar/Calendar.tsx +121 -66
- package/src/Calendar/hooks/index.ts +0 -6
- package/src/Calendar/index.ts +1 -3
- package/src/Calendar/styles.ts +4 -9
- package/src/Carousel/Carousel.doc.mjs +7 -1
- package/src/Carousel/Carousel.test.tsx +20 -0
- package/src/Carousel/Carousel.tsx +16 -1
- package/src/Center/Center.doc.mjs +12 -2
- package/src/Center/Center.tsx +28 -3
- package/src/Chat/ChatComposer.doc.mjs +3 -0
- package/src/Chat/ChatComposerDrawer.doc.mjs +12 -0
- package/src/Chat/ChatMessageList.doc.mjs +8 -0
- package/src/Chat/ChatMessageList.test.tsx +18 -0
- package/src/Chat/ChatMessageList.tsx +16 -0
- package/src/Chat/useTriggerMenu.tsx +3 -0
- package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +172 -27
- package/src/CheckboxInput/CheckboxInput.tsx +78 -6
- package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
- package/src/CheckboxList/CheckboxList.test.tsx +169 -16
- package/src/CheckboxList/CheckboxList.tsx +56 -3
- package/src/CheckboxList/CheckboxListContext.tsx +7 -0
- package/src/Citation/Citation.doc.mjs +10 -0
- package/src/Citation/Citation.test.tsx +117 -0
- package/src/Citation/Citation.tsx +9 -1
- package/src/ClickableCard/ClickableCard.doc.mjs +15 -0
- package/src/CodeBlock/CodeBlock.test.tsx +115 -0
- package/src/CodeBlock/CodeBlock.tsx +61 -33
- package/src/CommandPalette/CommandPalette.test.tsx +47 -1
- package/src/CommandPalette/CommandPalette.tsx +9 -21
- package/src/ContextMenu/ContextMenu.doc.mjs +4 -4
- package/src/ContextMenu/ContextMenu.test.tsx +155 -1
- package/src/ContextMenu/ContextMenu.tsx +113 -16
- package/src/DateInput/DateInput.doc.mjs +281 -56
- package/src/DateInput/DateInput.test.tsx +188 -2
- package/src/DateInput/DateInput.tsx +89 -10
- package/src/DateRangeInput/DateRangeInput.doc.mjs +251 -46
- package/src/DateRangeInput/DateRangeInput.test.tsx +182 -20
- package/src/DateRangeInput/DateRangeInput.tsx +63 -5
- package/src/DateTimeInput/DateTimeInput.doc.mjs +368 -67
- package/src/DateTimeInput/DateTimeInput.test.tsx +279 -11
- package/src/DateTimeInput/DateTimeInput.tsx +125 -17
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.tsx +12 -0
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -8
- package/src/DropdownMenu/DropdownMenu.test.tsx +56 -42
- package/src/DropdownMenu/DropdownMenu.tsx +52 -18
- package/src/EmptyState/EmptyState.test.tsx +4 -2
- package/src/EmptyState/EmptyState.tsx +6 -2
- package/src/Field/Field.test.tsx +32 -0
- package/src/Field/Field.tsx +23 -5
- package/src/Field/FieldLabel.tsx +55 -17
- package/src/FileInput/FileInput.doc.mjs +17 -0
- package/src/FileInput/FileInput.test.tsx +283 -49
- package/src/FileInput/FileInput.tsx +76 -4
- package/src/Grid/Grid.doc.mjs +14 -4
- package/src/Grid/Grid.tsx +20 -0
- package/src/HoverCard/HoverCard.doc.mjs +3 -0
- package/src/HoverCard/HoverCard.test.tsx +189 -2
- package/src/HoverCard/HoverCard.tsx +20 -16
- package/src/HoverCard/useHoverCard.tsx +13 -10
- package/src/Icon/Icon.doc.mjs +8 -0
- package/src/InputGroup/InputGroup.doc.mjs +2 -2
- package/src/InputGroup/InputGroup.test.tsx +98 -60
- package/src/InputGroup/InputGroup.tsx +21 -4
- package/src/InputGroup/InputGroupContext.ts +9 -4
- package/src/InputGroup/index.ts +1 -0
- package/src/Kbd/Kbd.test.tsx +22 -4
- package/src/Kbd/Kbd.tsx +37 -12
- package/src/Layer/anchorName.test.ts +146 -0
- package/src/Layer/anchorName.ts +46 -0
- package/src/Layer/layerAnimations.stylex.ts +20 -4
- package/src/Layer/useLayer.doc.mjs +12 -2
- package/src/Layer/useLayer.tsx +100 -15
- package/src/Layout/Layout.doc.mjs +1 -1
- package/src/Layout/Layout.tsx +8 -16
- package/src/Layout/LayoutFooter.doc.mjs +4 -4
- package/src/Layout/LayoutFooter.tsx +3 -3
- package/src/Layout/LayoutHeader.doc.mjs +4 -4
- package/src/Layout/LayoutHeader.tsx +3 -3
- package/src/Layout/LayoutPanel.tsx +3 -3
- package/src/Layout/padding.stylex.ts +52 -0
- package/src/Lightbox/Lightbox.doc.mjs +9 -2
- package/src/Lightbox/Lightbox.test.tsx +53 -5
- package/src/Lightbox/Lightbox.tsx +9 -4
- package/src/Link/Link.doc.mjs +14 -0
- package/src/Link/Link.test.tsx +52 -2
- package/src/Link/Link.tsx +42 -7
- package/src/Link/LinkProvider.tsx +1 -0
- package/src/List/List.doc.mjs +7 -0
- package/src/Markdown/Markdown.doc.mjs +2 -0
- package/src/Markdown/Markdown.test.tsx +28 -26
- package/src/Markdown/Markdown.tsx +21 -6
- package/src/MetadataList/MetadataListItem.doc.mjs +4 -0
- package/src/MobileNav/MobileNav.doc.mjs +8 -8
- package/src/MobileNav/MobileNav.tsx +13 -0
- package/src/MobileNav/MobileNavReopen.test.tsx +118 -0
- package/src/MoreMenu/MoreMenu.doc.mjs +2 -17
- package/src/MoreMenu/MoreMenu.tsx +0 -9
- package/src/MultiSelector/MultiSelector.doc.mjs +25 -0
- package/src/MultiSelector/MultiSelector.test.tsx +375 -8
- package/src/MultiSelector/MultiSelector.tsx +145 -21
- package/src/MultiSelector/hooks.ts +27 -0
- package/src/NavMenu/NavHeadingMenu.test.tsx +77 -1
- package/src/NavMenu/NavHeadingMenu.tsx +50 -3
- package/src/NumberInput/NumberInput.doc.mjs +17 -0
- package/src/NumberInput/NumberInput.test.tsx +242 -40
- package/src/NumberInput/NumberInput.tsx +89 -11
- package/src/OverflowList/OverflowList.doc.mjs +17 -0
- package/src/Pagination/Pagination.doc.mjs +3 -3
- package/src/Pagination/Pagination.test.tsx +250 -14
- package/src/Pagination/Pagination.tsx +54 -29
- package/src/Popover/usePopover.doc.mjs +7 -3
- package/src/Popover/usePopover.tsx +49 -6
- package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
- package/src/PowerSearch/PowerSearch.test.tsx +97 -1
- package/src/PowerSearch/PowerSearch.tsx +16 -3
- package/src/ProgressBar/ProgressBar.test.tsx +45 -27
- package/src/ProgressBar/ProgressBar.tsx +3 -4
- package/src/RadioList/RadioList.doc.mjs +9 -0
- package/src/RadioList/RadioList.test.tsx +252 -16
- package/src/RadioList/RadioList.tsx +166 -10
- package/src/RadioList/RadioListItem.tsx +14 -2
- package/src/Resizable/Resizable.doc.mjs +1 -1
- package/src/Section/Section.doc.mjs +11 -0
- package/src/SegmentedControl/SegmentedControl.doc.mjs +9 -0
- package/src/SegmentedControl/SegmentedControl.test.tsx +214 -42
- package/src/SegmentedControl/SegmentedControl.tsx +102 -54
- package/src/SegmentedControl/SegmentedControlContext.ts +7 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +14 -1
- package/src/SelectableCard/SelectableCard.doc.mjs +15 -0
- package/src/Selector/Selector.doc.mjs +25 -0
- package/src/Selector/Selector.test.tsx +322 -15
- package/src/Selector/Selector.tsx +126 -40
- package/src/Selector/hooks.ts +23 -0
- package/src/SideNav/SideNav.test.tsx +16 -0
- package/src/SideNav/SideNavItem.tsx +2 -4
- package/src/Skeleton/Skeleton.doc.mjs +11 -1
- package/src/Skeleton/Skeleton.test.tsx +25 -0
- package/src/Skeleton/Skeleton.tsx +11 -1
- package/src/Slider/Slider.doc.mjs +19 -0
- package/src/Slider/Slider.test.tsx +158 -18
- package/src/Slider/Slider.tsx +54 -6
- package/src/Spinner/Spinner.tsx +7 -1
- package/src/Stack/Stack.doc.mjs +77 -0
- package/src/Stack/Stack.test.tsx +55 -5
- package/src/Stack/Stack.tsx +73 -24
- package/src/Stack/StackItem.test.tsx +23 -0
- package/src/Stack/StackItem.tsx +20 -23
- package/src/Switch/Switch.doc.mjs +15 -0
- package/src/Switch/Switch.test.tsx +162 -27
- package/src/Switch/Switch.tsx +61 -21
- package/src/TabList/Tab.tsx +6 -0
- package/src/TabList/TabList.doc.mjs +12 -0
- package/src/TabList/TabList.test.tsx +208 -0
- package/src/TabList/TabList.tsx +102 -12
- package/src/TabList/TabListContext.ts +7 -3
- package/src/TabList/TabMenu.tsx +6 -3
- package/src/Table/BaseTable.tsx +72 -41
- package/src/Table/Table.doc.mjs +14 -0
- package/src/Table/Table.test.tsx +39 -30
- package/src/Table/Table.tsx +27 -1
- package/src/Table/TableCell.tsx +25 -23
- package/src/Table/TableHeaderCell.tsx +28 -29
- package/src/Table/TableRow.tsx +37 -7
- package/src/Table/index.ts +6 -2
- package/src/Table/plugins/pagination/paginateData.ts +10 -3
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +16 -0
- package/src/Table/plugins/pagination/useTablePagination.tsx +8 -1
- package/src/Table/plugins/sortable/useTableSortable.test.tsx +91 -2
- package/src/Table/plugins/sortable/useTableSortable.tsx +53 -1
- package/src/Table/plugins/stickyColumns/index.ts +4 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.test.tsx +163 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +407 -0
- package/src/Table/tableContextMenu.test.tsx +157 -0
- package/src/Table/tableContextMenu.tsx +142 -0
- package/src/Table/types.ts +175 -4
- package/src/Table/useBaseTablePlugins.ts +1 -0
- package/src/Table/useTableColumnResize.doc.mjs +96 -0
- package/src/Table/useTableStickyColumns.doc.mjs +59 -0
- package/src/Text/Heading.doc.mjs +15 -2
- package/src/Text/Text.doc.mjs +7 -1
- package/src/Text/text.stylex.ts +2 -2
- package/src/TextArea/TextArea.doc.mjs +17 -0
- package/src/TextArea/TextArea.test.tsx +167 -35
- package/src/TextArea/TextArea.tsx +62 -15
- package/src/TextInput/TextInput.doc.mjs +17 -0
- package/src/TextInput/TextInput.test.tsx +168 -34
- package/src/TextInput/TextInput.tsx +77 -9
- package/src/TimeInput/TimeInput.doc.mjs +335 -60
- package/src/TimeInput/TimeInput.test.tsx +144 -7
- package/src/TimeInput/TimeInput.tsx +74 -5
- package/src/Timestamp/Timestamp.doc.mjs +9 -0
- package/src/Timestamp/Timestamp.test.tsx +44 -18
- package/src/Timestamp/Timestamp.tsx +30 -10
- package/src/Toast/Toast.tsx +14 -0
- package/src/Toast/ToastViewport.test.tsx +204 -0
- package/src/Toast/ToastViewport.tsx +167 -21
- package/src/ToggleButton/ToggleButton.doc.mjs +9 -3
- package/src/ToggleButton/ToggleButton.test.tsx +39 -18
- package/src/ToggleButton/ToggleButton.tsx +46 -83
- package/src/Tokenizer/Tokenizer.doc.mjs +15 -0
- package/src/Tokenizer/Tokenizer.test.tsx +105 -1
- package/src/Tokenizer/Tokenizer.tsx +41 -2
- package/src/Toolbar/Toolbar.doc.mjs +65 -5
- package/src/Toolbar/Toolbar.test.tsx +109 -6
- package/src/Toolbar/Toolbar.tsx +59 -5
- package/src/Tooltip/Tooltip.test.tsx +81 -0
- package/src/Tooltip/useTooltip.tsx +57 -11
- package/src/TreeList/TreeList.test.tsx +295 -6
- package/src/TreeList/TreeList.tsx +73 -1
- package/src/TreeList/TreeListItem.tsx +51 -5
- package/src/TreeList/treeListItem.markers.stylex.ts +20 -0
- package/src/Typeahead/BaseTypeahead.tsx +86 -9
- package/src/Typeahead/Typeahead.doc.mjs +136 -30
- package/src/Typeahead/Typeahead.test.tsx +331 -1
- package/src/Typeahead/Typeahead.tsx +52 -1
- package/src/VisuallyHidden/VisuallyHidden.doc.mjs +80 -0
- package/src/VisuallyHidden/VisuallyHidden.test.tsx +76 -0
- package/src/VisuallyHidden/VisuallyHidden.tsx +113 -0
- package/src/VisuallyHidden/index.ts +15 -0
- package/src/hooks/focusableSelector.ts +25 -0
- package/src/hooks/index.ts +28 -2
- package/src/hooks/useAnnounce.test.tsx +101 -0
- package/src/hooks/useAnnounce.ts +168 -0
- package/src/hooks/useClickableContainer.ts +16 -4
- package/src/hooks/useEntryAnimation.ts +16 -4
- package/src/hooks/useFocusTrap.test.tsx +132 -0
- package/src/hooks/useFocusTrap.ts +98 -4
- package/src/hooks/useGridFocus.doc.mjs +40 -2
- package/src/hooks/useGridFocus.test.tsx +132 -0
- package/src/hooks/useGridFocus.ts +343 -67
- package/src/hooks/useImageMode.test.ts +133 -0
- package/src/hooks/useKeyboardHint.doc.mjs +101 -0
- package/src/hooks/useKeyboardHint.test.tsx +70 -0
- package/src/hooks/useKeyboardHint.tsx +332 -0
- package/src/hooks/useListFocus.doc.mjs +50 -10
- package/src/hooks/useListFocus.test.tsx +375 -0
- package/src/hooks/useListFocus.ts +395 -57
- package/src/hooks/useLongPress.test.tsx +134 -0
- package/src/hooks/useLongPress.ts +119 -0
- package/src/hooks/useTreeFocus.doc.mjs +140 -0
- package/src/hooks/useTreeFocus.test.tsx +214 -0
- package/src/hooks/useTreeFocus.ts +559 -0
- package/src/hooks/useTypeahead.test.tsx +109 -0
- package/src/hooks/useTypeahead.ts +183 -0
- package/src/index.ts +1 -0
- package/src/theme/derivedVarRegistry.test.ts +4 -0
- package/src/theme/generateThemeRules.test.ts +7 -8
- package/src/theme/generateThemeRules.ts +1 -1
- package/src/theme/syntax/SyntaxTheme.tsx +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +20 -11
- package/src/theme/syntax/presets.ts +5 -2
- package/src/theme/syntax/tokens.ts +1 -1
- package/src/theme/types.ts +1 -1
- package/src/utils/dateTypes.test.ts +40 -0
- package/src/utils/dateTypes.ts +40 -0
- package/src/utils/index.ts +9 -0
- package/src/utils/inputAria.test.ts +39 -0
- package/src/utils/inputAria.ts +58 -0
- package/src/utils/timeParser.test.ts +10 -0
- package/src/utils/timeParser.ts +5 -2
- package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts +0 -57
- package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts.map +0 -1
- package/dist/Calendar/hooks/useCalendarRovingTabindex.js +0 -96
- package/src/Calendar/hooks/useCalendarRovingTabindex.ts +0 -118
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file useTypeahead.ts
|
|
7
|
+
* @input Uses React useCallback/useRef
|
|
8
|
+
* @output Exports useTypeahead hook for first-character (type-to-focus) search
|
|
9
|
+
* @position Core hook; adds APG typeahead to menus, listboxes, and other
|
|
10
|
+
* collections. Composes with useListFocus/useGridFocus (or any collection)
|
|
11
|
+
* via a caller-supplied getItemLabels + onMatch.
|
|
12
|
+
*
|
|
13
|
+
* SYNC: When modified, update:
|
|
14
|
+
* - /packages/core/src/hooks/index.ts
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {useCallback, useRef} from 'react';
|
|
18
|
+
|
|
19
|
+
export interface UseTypeaheadOptions {
|
|
20
|
+
/**
|
|
21
|
+
* Returns the current, in-DOM-order list of item labels to match against.
|
|
22
|
+
* An entry may be `null`/empty to mark a non-matchable slot (its index is
|
|
23
|
+
* preserved so it maps 1:1 to the caller's items).
|
|
24
|
+
*/
|
|
25
|
+
getItemLabels: () => ReadonlyArray<string | null | undefined>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Called with the index of the matched item so the caller can focus/select
|
|
29
|
+
* it (e.g. `useListFocus`'s `focusItem`).
|
|
30
|
+
*/
|
|
31
|
+
onMatch: (index: number) => void;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The index to start searching from — typically the currently focused item,
|
|
35
|
+
* so repeated presses of the same letter cycle through matches. Defaults to
|
|
36
|
+
* -1 (search from the top).
|
|
37
|
+
*/
|
|
38
|
+
getCurrentIndex?: () => number;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Milliseconds of inactivity after which the typed buffer resets.
|
|
42
|
+
* @default 750
|
|
43
|
+
*/
|
|
44
|
+
resetMs?: number;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Whether an index should be skipped (e.g. disabled items).
|
|
48
|
+
*/
|
|
49
|
+
isDisabled?: (index: number) => boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface UseTypeaheadReturn {
|
|
53
|
+
/**
|
|
54
|
+
* Keydown handler. Call it (or let it fall through) from the collection's
|
|
55
|
+
* own key handler. Returns `true` when it handled a printable character (so
|
|
56
|
+
* the caller can `preventDefault`/stop further handling), `false` otherwise.
|
|
57
|
+
*/
|
|
58
|
+
onKeyDown: (e: React.KeyboardEvent | KeyboardEvent) => boolean;
|
|
59
|
+
/** Clear the pending buffer (e.g. on close). */
|
|
60
|
+
reset: () => void;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Whether a key event represents a single printable character (a type-to-focus
|
|
65
|
+
* candidate) rather than a control/navigation key or a shortcut chord.
|
|
66
|
+
*/
|
|
67
|
+
function isPrintableCharacter(e: React.KeyboardEvent | KeyboardEvent): boolean {
|
|
68
|
+
return (
|
|
69
|
+
e.key.length === 1 &&
|
|
70
|
+
!e.ctrlKey &&
|
|
71
|
+
!e.metaKey &&
|
|
72
|
+
!e.altKey &&
|
|
73
|
+
// A lone space is used for activation in menus, not typeahead-from-empty.
|
|
74
|
+
e.key !== ' '
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* First-character ("type-ahead") search for a collection.
|
|
80
|
+
*
|
|
81
|
+
* Buffers printable keystrokes (resetting after `resetMs` of inactivity),
|
|
82
|
+
* matches items whose label starts with the buffer, and cycles from the
|
|
83
|
+
* current index — so pressing "s" repeatedly walks through the "s" items
|
|
84
|
+
* instead of sticking on the first. Space is reserved for activation and is
|
|
85
|
+
* only treated as typeahead while a buffer is already active.
|
|
86
|
+
*
|
|
87
|
+
* Additive and collection-agnostic: it does not move focus itself; the caller
|
|
88
|
+
* wires `onMatch` to its own focus/selection (e.g. `useListFocus.focusItem`).
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```
|
|
92
|
+
* const {listRef, handleKeyDown, focusItem, getItems} = useListFocus(...);
|
|
93
|
+
* const typeahead = useTypeahead({
|
|
94
|
+
* getItemLabels: () => getItems().map(el => el.textContent),
|
|
95
|
+
* onMatch: focusItem,
|
|
96
|
+
* getCurrentIndex: () => getItems().findIndex(el => el === document.activeElement),
|
|
97
|
+
* });
|
|
98
|
+
* const onKeyDown = (e) => { if (!typeahead.onKeyDown(e)) handleKeyDown(e); };
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export function useTypeahead(options: UseTypeaheadOptions): UseTypeaheadReturn {
|
|
102
|
+
const {
|
|
103
|
+
getItemLabels,
|
|
104
|
+
onMatch,
|
|
105
|
+
getCurrentIndex,
|
|
106
|
+
resetMs = 750,
|
|
107
|
+
isDisabled,
|
|
108
|
+
} = options;
|
|
109
|
+
|
|
110
|
+
const bufferRef = useRef('');
|
|
111
|
+
const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(
|
|
112
|
+
undefined,
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const reset = useCallback(() => {
|
|
116
|
+
bufferRef.current = '';
|
|
117
|
+
if (timeoutRef.current) {
|
|
118
|
+
clearTimeout(timeoutRef.current);
|
|
119
|
+
timeoutRef.current = undefined;
|
|
120
|
+
}
|
|
121
|
+
}, []);
|
|
122
|
+
|
|
123
|
+
const scheduleReset = useCallback(() => {
|
|
124
|
+
if (timeoutRef.current) {
|
|
125
|
+
clearTimeout(timeoutRef.current);
|
|
126
|
+
}
|
|
127
|
+
timeoutRef.current = setTimeout(() => {
|
|
128
|
+
bufferRef.current = '';
|
|
129
|
+
timeoutRef.current = undefined;
|
|
130
|
+
}, resetMs);
|
|
131
|
+
}, [resetMs]);
|
|
132
|
+
|
|
133
|
+
const onKeyDown = useCallback(
|
|
134
|
+
(e: React.KeyboardEvent | KeyboardEvent): boolean => {
|
|
135
|
+
// A bare Space with no active buffer is not typeahead (menus activate on
|
|
136
|
+
// Space); once the user is mid-typing, Space extends the query.
|
|
137
|
+
const isSpaceMidType = e.key === ' ' && bufferRef.current.length > 0;
|
|
138
|
+
if (!isPrintableCharacter(e) && !isSpaceMidType) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const labels = getItemLabels();
|
|
143
|
+
if (labels.length === 0) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Pressing the SAME single character repeatedly cycles to the next match
|
|
148
|
+
// rather than filtering deeper (APG behavior).
|
|
149
|
+
const char = e.key.toLowerCase();
|
|
150
|
+
const isRepeatSameChar =
|
|
151
|
+
bufferRef.current.length > 0 &&
|
|
152
|
+
bufferRef.current.split('').every(c => c === char);
|
|
153
|
+
const nextBuffer = isRepeatSameChar ? char : bufferRef.current + char;
|
|
154
|
+
bufferRef.current = nextBuffer;
|
|
155
|
+
scheduleReset();
|
|
156
|
+
|
|
157
|
+
const start = getCurrentIndex?.() ?? -1;
|
|
158
|
+
const count = labels.length;
|
|
159
|
+
// When repeating a single char, start the search AFTER the current item
|
|
160
|
+
// so we advance; otherwise include the current item.
|
|
161
|
+
const offset = isRepeatSameChar ? 1 : 0;
|
|
162
|
+
|
|
163
|
+
for (let i = 0; i < count; i++) {
|
|
164
|
+
const index = (start + offset + i + count) % count;
|
|
165
|
+
if (isDisabled?.(index)) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const label = labels[index];
|
|
169
|
+
if (
|
|
170
|
+
label != null &&
|
|
171
|
+
label.trim().toLowerCase().startsWith(nextBuffer)
|
|
172
|
+
) {
|
|
173
|
+
onMatch(index);
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return true;
|
|
178
|
+
},
|
|
179
|
+
[getItemLabels, onMatch, getCurrentIndex, scheduleReset, isDisabled],
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
return {onKeyDown, reset};
|
|
183
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -64,6 +64,10 @@ const STRUCTURAL_VARS = new Set([
|
|
|
64
64
|
'--indicator-color',
|
|
65
65
|
'--indicator-width',
|
|
66
66
|
'--table-resize-height',
|
|
67
|
+
// sticky-columns plugin: opaque backdrop (overridable) + the row overlay it
|
|
68
|
+
// replays on pinned cells. Structural/runtime, not themeable design tokens.
|
|
69
|
+
'--table-sticky-background',
|
|
70
|
+
'--table-row-overlay',
|
|
67
71
|
'--separator-display',
|
|
68
72
|
'--astryx-section-padding',
|
|
69
73
|
]);
|
|
@@ -101,7 +101,9 @@ describe('generateThemeRules', () => {
|
|
|
101
101
|
|
|
102
102
|
it('includes .astryx-heading.level-* rules for all 6 levels', () => {
|
|
103
103
|
for (let level = 1; level <= 6; level++) {
|
|
104
|
-
const rule = rules.find(r =>
|
|
104
|
+
const rule = rules.find(r =>
|
|
105
|
+
r.includes(`.astryx-heading.level-${level}`),
|
|
106
|
+
);
|
|
105
107
|
expect(rule).toBeDefined();
|
|
106
108
|
expect(rule).toContain('font-family');
|
|
107
109
|
expect(rule).toContain(`var(--text-heading-${level}-size)`);
|
|
@@ -137,9 +139,7 @@ describe('generateThemeRules', () => {
|
|
|
137
139
|
});
|
|
138
140
|
const pseudoRules = generateThemeRules(pseudoTheme);
|
|
139
141
|
expect(
|
|
140
|
-
pseudoRules.some(rule =>
|
|
141
|
-
rule.includes('.astryx-button:hover'),
|
|
142
|
-
),
|
|
142
|
+
pseudoRules.some(rule => rule.includes('.astryx-button:hover')),
|
|
143
143
|
).toBe(true);
|
|
144
144
|
});
|
|
145
145
|
|
|
@@ -186,7 +186,8 @@ describe('generateThemeRules', () => {
|
|
|
186
186
|
expect(rules.some(r => r.includes('.astryx-text.secondary'))).toBe(true);
|
|
187
187
|
expect(rules.some(r => r.includes('.astryx-heading.primary'))).toBe(true);
|
|
188
188
|
expect(rules.some(r => r.includes('.astryx-heading.disabled'))).toBe(true);
|
|
189
|
-
expect(rules.some(r => r.includes('.astryx-text.active'))).toBe(
|
|
189
|
+
expect(rules.some(r => r.includes('.astryx-text.active'))).toBe(false);
|
|
190
|
+
expect(rules.some(r => r.includes('.astryx-text.accent'))).toBe(true);
|
|
190
191
|
});
|
|
191
192
|
|
|
192
193
|
// --- Consistency ---
|
|
@@ -194,9 +195,7 @@ describe('generateThemeRules', () => {
|
|
|
194
195
|
it('generateThemeCSS returns prose and component blocks with @scope', () => {
|
|
195
196
|
const {prose, component} = generateThemeCSS(theme);
|
|
196
197
|
const combined = prose + component;
|
|
197
|
-
expect(combined).toContain(
|
|
198
|
-
'@scope ([data-astryx-theme="default"])',
|
|
199
|
-
);
|
|
198
|
+
expect(combined).toContain('@scope ([data-astryx-theme="default"])');
|
|
200
199
|
expect(combined).toContain('to ([data-astryx-theme])');
|
|
201
200
|
// Every rule from generateThemeRules should appear in one of the blocks
|
|
202
201
|
for (const rule of rules) {
|
|
@@ -472,7 +472,7 @@ function generateColorOverrides(
|
|
|
472
472
|
secondary: 'var(--color-text-secondary)',
|
|
473
473
|
disabled: 'var(--color-text-disabled)',
|
|
474
474
|
placeholder: 'var(--color-text-secondary)',
|
|
475
|
-
|
|
475
|
+
accent: 'var(--color-text-accent)',
|
|
476
476
|
};
|
|
477
477
|
|
|
478
478
|
const touchesText = 'text' in components;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* @output SyntaxTheme provider, useSyntaxTheme hook
|
|
9
9
|
* @position Provider component; wraps code surfaces to apply syntax coloring
|
|
10
10
|
*
|
|
11
|
-
* @see https://github.com/
|
|
11
|
+
* @see https://github.com/facebook/astryx/issues/1148
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import React, {createContext, use, useMemo} from 'react';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
'use strict';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file defineSyntaxTheme.ts
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* @output defineSyntaxTheme, SyntaxTheme, syntaxThemeStyle
|
|
9
9
|
* @position Syntax theme definition API; consumed by presets, SyntaxTheme, defineTheme
|
|
10
10
|
*
|
|
11
|
-
* @see https://github.com/
|
|
11
|
+
* @see https://github.com/facebook/astryx/issues/1148
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import {syntaxTokenDefaults, type SyntaxTokenName} from './tokens';
|
|
@@ -41,7 +41,10 @@ export type SyntaxThemeTokenKey =
|
|
|
41
41
|
export type SyntaxTokenValue = string | [light: string, dark: string];
|
|
42
42
|
|
|
43
43
|
/** Token map for defineSyntaxTheme input — values can be strings or tuples. */
|
|
44
|
-
export type SyntaxThemeTokenInput = Record<
|
|
44
|
+
export type SyntaxThemeTokenInput = Record<
|
|
45
|
+
SyntaxThemeTokenKey,
|
|
46
|
+
SyntaxTokenValue
|
|
47
|
+
>;
|
|
45
48
|
|
|
46
49
|
/** Resolved token map — all values are CSS strings (tuples resolved to light-dark()). */
|
|
47
50
|
export type SyntaxThemeTokenMap = Record<SyntaxThemeTokenKey, string>;
|
|
@@ -73,8 +76,9 @@ function toCSSProperty(key: SyntaxThemeTokenKey): SyntaxTokenName {
|
|
|
73
76
|
}
|
|
74
77
|
|
|
75
78
|
/** All valid human-readable token keys, derived from the defaults. */
|
|
76
|
-
export const ALL_SYNTAX_KEYS: SyntaxThemeTokenKey[] = Object.keys(
|
|
77
|
-
|
|
79
|
+
export const ALL_SYNTAX_KEYS: SyntaxThemeTokenKey[] = Object.keys(
|
|
80
|
+
syntaxTokenDefaults,
|
|
81
|
+
).map(k => k.replace(CSS_PREFIX, '') as SyntaxThemeTokenKey);
|
|
78
82
|
|
|
79
83
|
// =============================================================================
|
|
80
84
|
// Helpers
|
|
@@ -130,12 +134,17 @@ export function resolveSyntaxTokenForMode(
|
|
|
130
134
|
* },
|
|
131
135
|
* });
|
|
132
136
|
*/
|
|
133
|
-
export function defineSyntaxTheme(
|
|
137
|
+
export function defineSyntaxTheme(
|
|
138
|
+
input: SyntaxThemeInput,
|
|
139
|
+
): SyntaxThemeDefinition {
|
|
134
140
|
const missing = ALL_SYNTAX_KEYS.filter(key => !(key in input.tokens));
|
|
135
141
|
if (missing.length > 0) {
|
|
136
142
|
console.warn(
|
|
137
|
-
'[Astryx] defineSyntaxTheme("' +
|
|
138
|
-
|
|
143
|
+
'[Astryx] defineSyntaxTheme("' +
|
|
144
|
+
input.name +
|
|
145
|
+
'"): missing tokens: ' +
|
|
146
|
+
missing.join(', ') +
|
|
147
|
+
'. All 14 syntax tokens are required.',
|
|
139
148
|
);
|
|
140
149
|
}
|
|
141
150
|
|
|
@@ -169,7 +178,7 @@ export function syntaxThemeStyle(
|
|
|
169
178
|
|
|
170
179
|
/** Convert a syntax theme to CSS declarations (no selector wrapper). */
|
|
171
180
|
export function syntaxThemeToCSS(theme: SyntaxThemeDefinition): string {
|
|
172
|
-
return ALL_SYNTAX_KEYS
|
|
173
|
-
|
|
174
|
-
|
|
181
|
+
return ALL_SYNTAX_KEYS.map(
|
|
182
|
+
key => toCSSProperty(key) + ': ' + theme.tokens[key] + ';',
|
|
183
|
+
).join('\n ');
|
|
175
184
|
}
|
|
@@ -8,10 +8,13 @@
|
|
|
8
8
|
* All original themes are MIT licensed. Only color values are extracted.
|
|
9
9
|
* See THIRD_PARTY_LICENSES.md for full attribution.
|
|
10
10
|
*
|
|
11
|
-
* @see https://github.com/
|
|
11
|
+
* @see https://github.com/facebook/astryx/issues/1148
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
defineSyntaxTheme,
|
|
16
|
+
type SyntaxThemeDefinition,
|
|
17
|
+
} from './defineSyntaxTheme';
|
|
15
18
|
|
|
16
19
|
/** One Dark Pro (Binaryify) — MIT */
|
|
17
20
|
export const oneDarkPro: SyntaxThemeDefinition = defineSyntaxTheme({
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* 14-token architecture validated against 11 community code themes.
|
|
17
17
|
* All themes map cleanly to these 14 slots.
|
|
18
18
|
*
|
|
19
|
-
* @see https://github.com/
|
|
19
|
+
* @see https://github.com/facebook/astryx/issues/1148
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
22
|
export const syntaxTokenDefaults = {
|
package/src/theme/types.ts
CHANGED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file dateTypes.test.ts
|
|
5
|
+
* @input Uses vitest
|
|
6
|
+
* @output Test suite for date type helpers
|
|
7
|
+
* @position Tests for dateTypes.ts (normalizeDayOfWeek)
|
|
8
|
+
*
|
|
9
|
+
* SYNC: When dateTypes.ts changes, update tests accordingly
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {describe, it, expect} from 'vitest';
|
|
13
|
+
import {normalizeDayOfWeek} from './dateTypes';
|
|
14
|
+
|
|
15
|
+
describe('normalizeDayOfWeek', () => {
|
|
16
|
+
it('passes numeric days through unchanged', () => {
|
|
17
|
+
expect(normalizeDayOfWeek(0)).toBe(0);
|
|
18
|
+
expect(normalizeDayOfWeek(1)).toBe(1);
|
|
19
|
+
expect(normalizeDayOfWeek(6)).toBe(6);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('maps three-letter day names to their index', () => {
|
|
23
|
+
expect(normalizeDayOfWeek('sun')).toBe(0);
|
|
24
|
+
expect(normalizeDayOfWeek('mon')).toBe(1);
|
|
25
|
+
expect(normalizeDayOfWeek('tue')).toBe(2);
|
|
26
|
+
expect(normalizeDayOfWeek('wed')).toBe(3);
|
|
27
|
+
expect(normalizeDayOfWeek('thu')).toBe(4);
|
|
28
|
+
expect(normalizeDayOfWeek('fri')).toBe(5);
|
|
29
|
+
expect(normalizeDayOfWeek('sat')).toBe(6);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('is case-insensitive for day names', () => {
|
|
33
|
+
expect(normalizeDayOfWeek('MON' as 'mon')).toBe(1);
|
|
34
|
+
expect(normalizeDayOfWeek('Sat' as 'sat')).toBe(6);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('falls back to 0 (Sunday) for an unrecognized name', () => {
|
|
38
|
+
expect(normalizeDayOfWeek('xyz' as 'mon')).toBe(0);
|
|
39
|
+
});
|
|
40
|
+
});
|
package/src/utils/dateTypes.ts
CHANGED
|
@@ -17,6 +17,46 @@ export type ISODateString =
|
|
|
17
17
|
/** Day of week: 0 = Sunday through 6 = Saturday */
|
|
18
18
|
export type DayOfWeek = 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Three-letter lowercase weekday name, 'sun' through 'sat'.
|
|
22
|
+
* A more self-documenting alternative to the numeric {@link DayOfWeek}.
|
|
23
|
+
*/
|
|
24
|
+
export type DayOfWeekName =
|
|
25
|
+
| 'sun'
|
|
26
|
+
| 'mon'
|
|
27
|
+
| 'tue'
|
|
28
|
+
| 'wed'
|
|
29
|
+
| 'thu'
|
|
30
|
+
| 'fri'
|
|
31
|
+
| 'sat';
|
|
32
|
+
|
|
33
|
+
/** Weekday names indexed by {@link DayOfWeek} (0 = Sunday). */
|
|
34
|
+
const WEEKDAY_NAMES: ReadonlyArray<DayOfWeekName> = [
|
|
35
|
+
'sun',
|
|
36
|
+
'mon',
|
|
37
|
+
'tue',
|
|
38
|
+
'wed',
|
|
39
|
+
'thu',
|
|
40
|
+
'fri',
|
|
41
|
+
'sat',
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Normalize a weekday to its numeric {@link DayOfWeek}. Accepts either a
|
|
46
|
+
* number (0–6) or a three-letter day name ('sun'–'sat', case-insensitive),
|
|
47
|
+
* so APIs like `weekStartsOn` can take whichever is more readable at the
|
|
48
|
+
* call site. Unrecognized values fall back to 0 (Sunday).
|
|
49
|
+
*/
|
|
50
|
+
export function normalizeDayOfWeek(
|
|
51
|
+
value: DayOfWeek | DayOfWeekName,
|
|
52
|
+
): DayOfWeek {
|
|
53
|
+
if (typeof value === 'number') {
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
const index = WEEKDAY_NAMES.indexOf(value.toLowerCase() as DayOfWeekName);
|
|
57
|
+
return index === -1 ? 0 : (index as DayOfWeek);
|
|
58
|
+
}
|
|
59
|
+
|
|
20
60
|
/** Immutable date record with 1-based month. */
|
|
21
61
|
export interface PlainDate {
|
|
22
62
|
readonly year: number;
|
package/src/utils/index.ts
CHANGED
|
@@ -68,7 +68,16 @@ export {getKey, type Key, type KeyFallback} from './getKey';
|
|
|
68
68
|
|
|
69
69
|
export {mergeProps} from './mergeProps';
|
|
70
70
|
export {mergeRefs} from './mergeRefs';
|
|
71
|
+
export {themeProps, themeDataAttributes} from './themeProps';
|
|
72
|
+
export type {
|
|
73
|
+
ClassValue,
|
|
74
|
+
ClassProps,
|
|
75
|
+
ThemeDataAttributes,
|
|
76
|
+
ThemeProps,
|
|
77
|
+
} from './themeProps';
|
|
71
78
|
export {groupItems, getItemGroup} from './groupItems';
|
|
72
79
|
export type {ItemGroup} from './groupItems';
|
|
73
80
|
export {observeResize, unobserveResize} from './sharedResizeObserver';
|
|
74
81
|
export {isRenderable} from './isRenderable';
|
|
82
|
+
export {getInputARIA} from './inputAria';
|
|
83
|
+
export type {InputARIA, InputARIAInputGroup} from './inputAria';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, expect, it} from 'vitest';
|
|
4
|
+
import {getInputARIA} from './inputAria';
|
|
5
|
+
|
|
6
|
+
describe('getInputARIA', () => {
|
|
7
|
+
it('keeps standalone input labeling native while composing descriptions', () => {
|
|
8
|
+
expect(
|
|
9
|
+
getInputARIA('input-label', ['input-help', undefined, 'input-error']),
|
|
10
|
+
).toEqual({
|
|
11
|
+
ariaLabelledBy: undefined,
|
|
12
|
+
ariaDescribedBy: 'input-help input-error',
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('composes InputGroup context before input labels and descriptions', () => {
|
|
17
|
+
expect(
|
|
18
|
+
getInputARIA('input-label', ['input-help'], {
|
|
19
|
+
labelID: 'group-label',
|
|
20
|
+
describedByIDs: 'group-help group-error',
|
|
21
|
+
}),
|
|
22
|
+
).toEqual({
|
|
23
|
+
ariaLabelledBy: 'group-label input-label',
|
|
24
|
+
ariaDescribedBy: 'group-help group-error input-help',
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('deduplicates repeated IDs', () => {
|
|
29
|
+
expect(
|
|
30
|
+
getInputARIA('group-label', ['shared', 'input-help'], {
|
|
31
|
+
labelID: 'group-label',
|
|
32
|
+
describedByIDs: 'shared group-error',
|
|
33
|
+
}),
|
|
34
|
+
).toEqual({
|
|
35
|
+
ariaLabelledBy: 'group-label',
|
|
36
|
+
ariaDescribedBy: 'shared group-error input-help',
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file inputAria.ts
|
|
5
|
+
* @input Receives input label/description IDs and optional InputGroup context
|
|
6
|
+
* @output Exports helpers for consistent input ARIA composition
|
|
7
|
+
* @position Internal utility; used by inputs that compose labels/descriptions
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export interface InputARIAInputGroup {
|
|
11
|
+
/** ID of the visible InputGroup label. */
|
|
12
|
+
labelID: string;
|
|
13
|
+
/** Space-separated IDs for InputGroup description/status text. */
|
|
14
|
+
describedByIDs?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface InputARIA {
|
|
18
|
+
/** Value for aria-labelledby on the input. */
|
|
19
|
+
ariaLabelledBy?: string;
|
|
20
|
+
/** Value for aria-describedby on the input. */
|
|
21
|
+
ariaDescribedBy?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type AriaID = string | null | undefined | false;
|
|
25
|
+
|
|
26
|
+
function joinAriaIDs(...values: AriaID[]): string | undefined {
|
|
27
|
+
const ids = values
|
|
28
|
+
.flatMap(value =>
|
|
29
|
+
typeof value === 'string' ? value.trim().split(/\s+/) : [],
|
|
30
|
+
)
|
|
31
|
+
.filter(Boolean);
|
|
32
|
+
|
|
33
|
+
if (ids.length === 0) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return Array.from(new Set(ids)).join(' ');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Builds ARIA label/description wiring for an input.
|
|
42
|
+
*
|
|
43
|
+
* Standalone inputs keep their normal native label association. Grouped inputs
|
|
44
|
+
* are named by the visible InputGroup label plus their own input label, and
|
|
45
|
+
* inherit group description/status text in addition to input-local text.
|
|
46
|
+
*/
|
|
47
|
+
export function getInputARIA(
|
|
48
|
+
labelID: string,
|
|
49
|
+
describedByIDs: AriaID[] = [],
|
|
50
|
+
inputGroup?: InputARIAInputGroup | null,
|
|
51
|
+
): InputARIA {
|
|
52
|
+
return {
|
|
53
|
+
ariaLabelledBy: inputGroup
|
|
54
|
+
? joinAriaIDs(inputGroup.labelID, labelID)
|
|
55
|
+
: undefined,
|
|
56
|
+
ariaDescribedBy: joinAriaIDs(inputGroup?.describedByIDs, ...describedByIDs),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -144,11 +144,21 @@ describe('parseTimeInput', () => {
|
|
|
144
144
|
expect(parseTimeInput('12pm')).toBe('12:00');
|
|
145
145
|
});
|
|
146
146
|
|
|
147
|
+
it('parses dotted meridiems (a.m./p.m.)', () => {
|
|
148
|
+
expect(parseTimeInput('2:30 p.m.')).toBe('14:30');
|
|
149
|
+
expect(parseTimeInput('2:30 P.M.')).toBe('14:30');
|
|
150
|
+
expect(parseTimeInput('2:30 p.m')).toBe('14:30');
|
|
151
|
+
expect(parseTimeInput('12 a.m.')).toBe('00:00');
|
|
152
|
+
expect(parseTimeInput('12 p.m.')).toBe('12:00');
|
|
153
|
+
expect(parseTimeInput('2 p.m.')).toBe('14:00');
|
|
154
|
+
});
|
|
155
|
+
|
|
147
156
|
it('returns null for invalid input', () => {
|
|
148
157
|
expect(parseTimeInput('')).toBeNull();
|
|
149
158
|
expect(parseTimeInput('abc')).toBeNull();
|
|
150
159
|
expect(parseTimeInput('25:00')).toBeNull();
|
|
151
160
|
expect(parseTimeInput('13:00 PM')).toBeNull(); // 13 is invalid in 12h format
|
|
161
|
+
expect(parseTimeInput('13:00 p.m.')).toBeNull(); // dotted variant rejected too
|
|
152
162
|
});
|
|
153
163
|
});
|
|
154
164
|
|
package/src/utils/timeParser.ts
CHANGED
|
@@ -164,10 +164,13 @@ export function parseTimeInput(
|
|
|
164
164
|
|
|
165
165
|
const trimmed = input.trim().toLowerCase();
|
|
166
166
|
|
|
167
|
-
// Check for AM/PM
|
|
168
|
-
|
|
167
|
+
// Check for AM/PM. hasMeridiem is derived from isPM/isAM so the detection
|
|
168
|
+
// can never drift from them: it previously used its own regex without the
|
|
169
|
+
// optional dots, so dotted meridiems ("2:30 p.m.") skipped the 12h -> 24h
|
|
170
|
+
// conversion and parsed 12 hours off.
|
|
169
171
|
const isPM = /p\.?m?\.?\s*$/i.test(trimmed);
|
|
170
172
|
const isAM = /a\.?m?\.?\s*$/i.test(trimmed);
|
|
173
|
+
const hasMeridiem = isPM || isAM;
|
|
171
174
|
|
|
172
175
|
// Remove AM/PM suffix
|
|
173
176
|
const timeStr = trimmed.replace(/\s*[ap]\.?m?\.?\s*$/i, '').trim();
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { ISODateString } from '../../utils/dateTypes';
|
|
2
|
-
import { type PlainDate } from '../../utils/plainDate';
|
|
3
|
-
import type { CalendarDay } from './useCalendarDays';
|
|
4
|
-
/**
|
|
5
|
-
* Configuration for calendar roving tabindex
|
|
6
|
-
*/
|
|
7
|
-
export interface UseCalendarRovingTabindexOptions {
|
|
8
|
-
/** All days in the grid */
|
|
9
|
-
days: CalendarDay[];
|
|
10
|
-
/** Today's date as a PlainDate */
|
|
11
|
-
today: PlainDate;
|
|
12
|
-
/** The year being displayed */
|
|
13
|
-
year: number;
|
|
14
|
-
/** The month being displayed (1-based: 1 = January, 12 = December) */
|
|
15
|
-
month: number;
|
|
16
|
-
/** Function to check if a date is disabled */
|
|
17
|
-
isDateDisabled: (date: PlainDate) => boolean;
|
|
18
|
-
/** Currently selected date (if any) */
|
|
19
|
-
selectedDate?: PlainDate | null;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Return type for useCalendarRovingTabindex hook
|
|
23
|
-
*/
|
|
24
|
-
export interface UseCalendarRovingTabindexReturn {
|
|
25
|
-
/** The ISO date string of the tabbable element, or null */
|
|
26
|
-
tabbableDate: ISODateString | null;
|
|
27
|
-
/** Check if a specific date is the tabbable one */
|
|
28
|
-
isTabbable: (iso: ISODateString) => boolean;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Hook for managing roving tabindex in calendar grids.
|
|
32
|
-
*
|
|
33
|
-
* Implements the WAI-ARIA roving tabindex pattern where only one element
|
|
34
|
-
* in a group has tabindex="0" while others have tabindex="-1".
|
|
35
|
-
*
|
|
36
|
-
* Priority for tabbable element:
|
|
37
|
-
* 1. Today if visible in the current month and enabled
|
|
38
|
-
* 2. First enabled day in the month
|
|
39
|
-
*
|
|
40
|
-
* @example
|
|
41
|
-
* ```
|
|
42
|
-
* const {tabbableDate, isTabbable} = useCalendarRovingTabindex({
|
|
43
|
-
* days,
|
|
44
|
-
* today: {year: 2026, month: 1, day: 20},
|
|
45
|
-
* year: 2026,
|
|
46
|
-
* month: 1, // January (1-based)
|
|
47
|
-
* isDateDisabled,
|
|
48
|
-
* });
|
|
49
|
-
*
|
|
50
|
-
* // In day rendering:
|
|
51
|
-
* <button tabIndex={isTabbable(day.iso) ? 0 : -1}>
|
|
52
|
-
* {day.dayNumber}
|
|
53
|
-
* </button>
|
|
54
|
-
* ```
|
|
55
|
-
*/
|
|
56
|
-
export declare function useCalendarRovingTabindex(options: UseCalendarRovingTabindexOptions): UseCalendarRovingTabindexReturn;
|
|
57
|
-
//# sourceMappingURL=useCalendarRovingTabindex.d.ts.map
|