@astryxdesign/core 0.4.7 → 0.5.0-canary.32a62fd
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 +161 -1
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +3 -2
- package/dist/AspectRatio/AspectRatio.d.ts +24 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +23 -4
- package/dist/Avatar/Avatar.d.ts +25 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +58 -19
- package/dist/Avatar/index.d.ts +2 -2
- package/dist/Avatar/index.d.ts.map +1 -1
- package/dist/Avatar/index.js +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +8 -4
- package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
- package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
- package/dist/Banner/Banner.d.ts +40 -15
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +51 -18
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +17 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +5 -4
- package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +26 -7
- package/dist/Calendar/Calendar.d.ts +3 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +13 -14
- package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
- package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
- package/dist/Calendar/getInitialFocusDate.js +62 -0
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +3 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -3
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +3 -3
- package/dist/Chat/ChatMessageList.d.ts +22 -3
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +6 -3
- package/dist/Chat/ChatTokenizedText.d.ts +2 -0
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +11 -6
- package/dist/Chat/useChatComposerTokens.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +10 -3
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +15 -4
- package/dist/CodeBlock/highlightRanges.js +1 -1
- package/dist/CodeBlock/highlightStyles.js +13 -13
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +3 -2
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +3 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +4 -3
- package/dist/DateInput/DateInput.d.ts +43 -0
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +22 -2
- package/dist/DateInput/NativeDateField.d.ts +10 -0
- package/dist/DateInput/NativeDateField.d.ts.map +1 -0
- package/dist/DateInput/NativeDateField.js +477 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +38 -4
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +406 -12
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.d.ts +7 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +89 -58
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +3 -2
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +6 -2
- package/dist/HoverCard/HoverCard.d.ts +6 -0
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +52 -3
- package/dist/HoverCard/useHoverCard.d.ts +16 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +74 -26
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +6 -2
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +2 -19
- package/dist/Layer/LayerDepthContext.d.ts +52 -0
- package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
- package/dist/Layer/LayerDepthContext.js +66 -0
- package/dist/Layer/index.d.ts +3 -0
- package/dist/Layer/index.d.ts.map +1 -1
- package/dist/Layer/index.js +4 -0
- package/dist/Layer/layerStack.d.ts +98 -0
- package/dist/Layer/layerStack.d.ts.map +1 -0
- package/dist/Layer/layerStack.js +306 -0
- package/dist/Layer/useLayerDismissal.d.ts +93 -0
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
- package/dist/Layer/useLayerDismissal.js +91 -0
- package/dist/Lightbox/Lightbox.d.ts +1 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +103 -81
- package/dist/Markdown/index.d.ts +1 -1
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/parser.d.ts +38 -1
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +177 -29
- package/dist/MobileNav/MobileNav.d.ts +6 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +61 -36
- package/dist/MultiSelector/MultiSelector.d.ts +15 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +17 -6
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.js +5 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +3 -2
- package/dist/NumberInput/NumberInput.d.ts +1 -0
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +27 -37
- package/dist/NumberInput/numberParser.d.ts +43 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -0
- package/dist/NumberInput/numberParser.js +293 -0
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +3 -2
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -2
- package/dist/Overlay/Overlay.d.ts.map +1 -1
- package/dist/Overlay/Overlay.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +20 -17
- package/dist/PowerSearch/PowerSearch.d.ts +8 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +19 -6
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +19 -9
- package/dist/PowerSearch/types.d.ts +2 -0
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.js +14 -5
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +3 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +3 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +3 -3
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +5 -0
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +4 -3
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +8 -7
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +4 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +3 -3
- package/dist/Spinner/Spinner.d.ts +3 -3
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +130 -78
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +6 -1
- package/dist/Stepper/Step.d.ts +140 -0
- package/dist/Stepper/Step.d.ts.map +1 -0
- package/dist/Stepper/Step.js +1045 -0
- package/dist/Stepper/StepStatus.d.ts +24 -0
- package/dist/Stepper/StepStatus.d.ts.map +1 -0
- package/dist/Stepper/StepStatus.js +1 -0
- package/dist/Stepper/Stepper.d.ts +93 -0
- package/dist/Stepper/Stepper.d.ts.map +1 -0
- package/dist/Stepper/Stepper.js +184 -0
- package/dist/Stepper/StepperContext.d.ts +41 -0
- package/dist/Stepper/StepperContext.d.ts.map +1 -0
- package/dist/Stepper/StepperContext.js +34 -0
- package/dist/Stepper/index.d.ts +8 -0
- package/dist/Stepper/index.d.ts.map +1 -0
- package/dist/Stepper/index.js +7 -0
- package/dist/Stepper/stepper.stylex.d.ts +15 -0
- package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
- package/dist/Stepper/stepper.stylex.js +20 -0
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +8 -3
- package/dist/TabList/Tab.d.ts +15 -2
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +32 -7
- package/dist/TabList/TabList.d.ts +46 -7
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +353 -23
- package/dist/TabList/TabListContext.d.ts +11 -1
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +11 -2
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +3 -2
- package/dist/TabList/index.d.ts +2 -2
- package/dist/TabList/index.d.ts.map +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +10 -2
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +3 -6
- package/dist/Table/TableRow.d.ts +16 -5
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +16 -5
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
- package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
- package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +19 -5
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
- package/dist/Table/types.d.ts +22 -4
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -0
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +6 -2
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +9 -3
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +3 -2
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +5 -3
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +2 -2
- package/dist/Tokenizer/Tokenizer.d.ts +3 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +2 -0
- package/dist/Tooltip/Tooltip.d.ts +5 -0
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +5 -0
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +39 -24
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +5 -4
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +3 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +4 -3
- package/dist/Typeahead/BaseTypeahead.d.ts +2 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +68 -29
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -2
- package/dist/astryx.css +94 -7
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +7 -4
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +60 -95
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -18
- package/dist/hooks/useMergedRefs.d.ts +18 -0
- package/dist/hooks/useMergedRefs.d.ts.map +1 -0
- package/dist/hooks/useMergedRefs.js +25 -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/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +24 -4
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.d.ts.map +1 -1
- package/dist/theme/syntax/tokens.js +5 -2
- package/dist/utils/groupItems.d.ts +5 -1
- package/dist/utils/groupItems.d.ts.map +1 -1
- package/dist/utils/groupItems.js +9 -9
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/isApplePlatform.d.ts +18 -0
- package/dist/utils/isApplePlatform.d.ts.map +1 -0
- package/dist/utils/isApplePlatform.js +37 -0
- package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
- package/dist/utils/sharedResizeObserver.js +10 -1
- package/dist/utils/timeParser.d.ts +1 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +26 -12
- package/locales/en.json +31 -7
- package/locales/pseudo.json +18 -0
- package/package.json +8 -3
- package/src/AppShell/AppShell.tsx +3 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
- package/src/AspectRatio/AspectRatio.test.tsx +57 -10
- package/src/AspectRatio/AspectRatio.tsx +40 -1
- package/src/Avatar/Avatar.doc.mjs +14 -3
- package/src/Avatar/Avatar.test.tsx +97 -0
- package/src/Avatar/Avatar.tsx +125 -52
- package/src/Avatar/index.ts +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
- package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
- package/src/AvatarGroup/AvatarGroup.tsx +15 -6
- package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
- package/src/Banner/Banner.doc.mjs +13 -11
- package/src/Banner/Banner.test.tsx +102 -15
- package/src/Banner/Banner.tsx +72 -25
- package/src/BottomSheet/BottomSheet.test.tsx +123 -0
- package/src/BottomSheet/BottomSheet.tsx +17 -4
- package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
- package/src/Button/Button.doc.mjs +22 -0
- package/src/Button/Button.test.tsx +13 -0
- package/src/Button/Button.tsx +5 -4
- package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
- package/src/ButtonGroup/ButtonGroup.test.tsx +391 -1
- package/src/ButtonGroup/ButtonGroup.tsx +23 -5
- package/src/Calendar/Calendar.doc.mjs +4 -3
- package/src/Calendar/Calendar.test.tsx +52 -0
- package/src/Calendar/Calendar.tsx +18 -15
- package/src/Calendar/getInitialFocusDate.test.ts +94 -0
- package/src/Calendar/getInitialFocusDate.ts +93 -0
- package/src/Carousel/Carousel.tsx +3 -2
- package/src/Chat/ChatComposerInput.tsx +5 -1
- package/src/Chat/ChatLayout.tsx +3 -2
- package/src/Chat/ChatMessageList.doc.mjs +9 -1
- package/src/Chat/ChatMessageList.test.tsx +46 -0
- package/src/Chat/ChatMessageList.tsx +28 -4
- package/src/Chat/ChatTokenizedText.tsx +17 -10
- package/src/Chat/useChatComposerTokens.ts +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +8 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
- package/src/CodeBlock/CodeBlock.test.tsx +37 -0
- package/src/CodeBlock/CodeBlock.tsx +20 -4
- package/src/CodeBlock/highlightRanges.ts +1 -1
- package/src/CodeBlock/highlightStyles.ts +13 -13
- package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
- package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
- package/src/ContextMenu/ContextMenu.tsx +4 -3
- package/src/DateInput/DateInput.doc.mjs +16 -0
- package/src/DateInput/DateInput.tsx +55 -2
- package/src/DateInput/DateInputTouch.test.tsx +68 -9
- package/src/DateInput/NativeDateField.test.tsx +565 -0
- package/src/DateInput/NativeDateField.tsx +623 -0
- package/src/DateInput/TouchDateField.tsx +38 -4
- package/src/DateInput/index.ts +1 -0
- package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
- package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
- package/src/DateTimeInput/DateTimeInput.tsx +556 -24
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +8 -3
- package/src/Dialog/Dialog.test.tsx +261 -1
- package/src/Dialog/Dialog.tsx +109 -58
- package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
- package/src/Field/Field.doc.mjs +13 -2
- package/src/Field/FieldLabel.test.tsx +29 -0
- package/src/Field/FieldLabel.tsx +7 -0
- package/src/FileInput/FileInput.tsx +3 -2
- package/src/Heading/Heading.test.tsx +23 -1
- package/src/Heading/Heading.tsx +6 -2
- package/src/HoverCard/HoverCard.doc.mjs +13 -2
- package/src/HoverCard/HoverCard.test.tsx +101 -4
- package/src/HoverCard/HoverCard.tsx +71 -3
- package/src/HoverCard/useHoverCard.tsx +101 -33
- package/src/Indicator/CheckboxIndicator.tsx +14 -8
- package/src/Indicator/Indicator.doc.mjs +2 -0
- package/src/Item/Item.tsx +5 -4
- package/src/Kbd/Kbd.tsx +2 -19
- package/src/Layer/LayerDepthContext.tsx +62 -0
- package/src/Layer/index.ts +9 -0
- package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
- package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
- package/src/Layer/layerStack.ts +362 -0
- package/src/Layer/useLayerDismissal.test.tsx +469 -0
- package/src/Layer/useLayerDismissal.ts +173 -0
- package/src/Layout/Layout.doc.mjs +2 -2
- package/src/Lightbox/Lightbox.doc.mjs +12 -0
- package/src/Lightbox/Lightbox.tsx +124 -102
- package/src/Link/Link.doc.mjs +39 -0
- package/src/Markdown/Markdown.doc.mjs +5 -0
- package/src/Markdown/incremental.test.ts +16 -2
- package/src/Markdown/index.ts +1 -0
- package/src/Markdown/parser.perf.test.ts +96 -1
- package/src/Markdown/parser.test.ts +145 -2
- package/src/Markdown/parser.ts +244 -29
- package/src/MobileNav/MobileNav.tsx +62 -36
- package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +27 -0
- package/src/MultiSelector/MultiSelector.test.tsx +106 -0
- package/src/MultiSelector/MultiSelector.tsx +50 -6
- package/src/MultiSelector/index.ts +1 -0
- package/src/NavIcon/NavIcon.doc.mjs +8 -2
- package/src/NavIcon/NavIcon.test.tsx +9 -0
- package/src/NavIcon/NavIcon.tsx +5 -1
- package/src/NavMenu/NavHeadingMenu.tsx +3 -2
- package/src/NumberInput/NumberInput.doc.mjs +20 -0
- package/src/NumberInput/NumberInput.tsx +28 -29
- package/src/NumberInput/numberParser.test.ts +137 -0
- package/src/NumberInput/numberParser.ts +346 -0
- package/src/Outline/Outline.tsx +3 -2
- package/src/OverflowList/OverflowList.tsx +3 -2
- package/src/Overlay/Overlay.tsx +3 -2
- package/src/Popover/usePopover.tsx +31 -28
- package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
- package/src/PowerSearch/PowerSearch.test.tsx +240 -1
- package/src/PowerSearch/PowerSearch.tsx +34 -5
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +201 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +47 -1
- package/src/PowerSearch/PowerSearchValueEditor.tsx +15 -0
- package/src/PowerSearch/types.ts +2 -0
- package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
- package/src/PowerSearch/usePowerSearchSource.ts +13 -3
- package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
- package/src/ProgressBar/ProgressBar.test.tsx +24 -0
- package/src/ProgressBar/ProgressBar.tsx +28 -8
- package/src/Resizable/ResizeHandle.tsx +3 -2
- package/src/SegmentedControl/SegmentedControl.tsx +3 -2
- package/src/SelectableCard/SelectableCard.tsx +3 -2
- package/src/Selector/Selector.doc.mjs +12 -1
- package/src/Selector/Selector.test.tsx +45 -1
- package/src/Selector/Selector.tsx +11 -1
- package/src/SideNav/SideNav.doc.mjs +6 -6
- package/src/SideNav/SideNav.tsx +4 -2
- package/src/SideNav/SideNavHeading.tsx +12 -12
- package/src/SideNav/SideNavItem.tsx +4 -2
- package/src/Slider/Slider.tsx +3 -2
- package/src/Spinner/Spinner.test.tsx +147 -1
- package/src/Spinner/Spinner.tsx +120 -101
- package/src/StatusDot/StatusDot.doc.mjs +8 -2
- package/src/StatusDot/StatusDot.test.tsx +9 -0
- package/src/StatusDot/StatusDot.tsx +7 -1
- package/src/Stepper/Step.doc.mjs +98 -0
- package/src/Stepper/Step.tsx +1638 -0
- package/src/Stepper/StepStatus.ts +26 -0
- package/src/Stepper/Stepper.doc.mjs +370 -0
- package/src/Stepper/Stepper.test.tsx +1024 -0
- package/src/Stepper/Stepper.tsx +258 -0
- package/src/Stepper/StepperContext.ts +71 -0
- package/src/Stepper/index.ts +18 -0
- package/src/Stepper/stepper.stylex.ts +19 -0
- package/src/Switch/Switch.doc.mjs +2 -0
- package/src/Switch/Switch.test.tsx +10 -0
- package/src/Switch/Switch.tsx +6 -2
- package/src/TabList/Tab.doc.mjs +13 -1
- package/src/TabList/Tab.tsx +67 -7
- package/src/TabList/TabList.doc.mjs +22 -6
- package/src/TabList/TabList.test.tsx +559 -0
- package/src/TabList/TabList.tsx +490 -22
- package/src/TabList/TabListContext.ts +13 -2
- package/src/TabList/TabMenu.tsx +3 -2
- package/src/TabList/index.ts +6 -2
- package/src/Table/BaseTable.tsx +12 -4
- package/src/Table/Table.doc.mjs +9 -2
- package/src/Table/Table.test.tsx +132 -14
- package/src/Table/Table.tsx +3 -8
- package/src/Table/TableBody.doc.mjs +40 -0
- package/src/Table/TableFooter.doc.mjs +40 -0
- package/src/Table/TableHeader.doc.mjs +40 -0
- package/src/Table/TableRow.tsx +16 -5
- package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
- package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
- package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/Table/types.ts +22 -4
- package/src/Table/useBaseTablePlugins.ts +5 -0
- package/src/Table/useTableGroupedRows.doc.mjs +5 -4
- package/src/Table/useTablePagination.doc.mjs +7 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Table/useTableSelection.doc.mjs +31 -0
- package/src/Text/Text.test.tsx +23 -1
- package/src/Text/Text.tsx +6 -2
- package/src/TextArea/TextArea.doc.mjs +8 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +15 -8
- package/src/TextInput/TextInput.doc.mjs +10 -0
- package/src/TextInput/TextInput.tsx +3 -2
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.tsx +2 -2
- package/src/Timestamp/Timestamp.tsx +4 -2
- package/src/Toast/Toast.doc.mjs +6 -0
- package/src/Token/TokenLink.tsx +2 -2
- package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
- package/src/Tokenizer/Tokenizer.tsx +4 -0
- package/src/Toolbar/Toolbar.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.test.tsx +32 -0
- package/src/Tooltip/Tooltip.tsx +5 -0
- package/src/Tooltip/useTooltip.tsx +47 -24
- package/src/TopNav/TopNavHeading.tsx +5 -4
- package/src/TopNav/TopNavMegaMenu.tsx +3 -2
- package/src/TopNav/TopNavMenu.tsx +4 -3
- package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
- package/src/Typeahead/BaseTypeahead.tsx +85 -33
- package/src/Typeahead/Typeahead.doc.mjs +5 -0
- package/src/Typeahead/Typeahead.test.tsx +49 -0
- package/src/Typeahead/Typeahead.tsx +3 -2
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- package/src/hooks/useFocusTrap.test.tsx +14 -0
- package/src/hooks/useFocusTrap.ts +62 -111
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
- package/src/hooks/useHotkeys.ts +3 -18
- package/src/hooks/useMergedRefs.doc.mjs +79 -0
- package/src/hooks/useMergedRefs.test.tsx +62 -0
- package/src/hooks/useMergedRefs.ts +36 -0
- package/src/index.ts +1 -0
- package/src/theme/MediaTheme.doc.mjs +5 -5
- package/src/theme/derivedVarRegistry.test.ts +19 -3
- package/src/theme/derivedVarRegistry.ts +23 -4
- package/src/theme/generateThemeRules.test.ts +37 -0
- package/src/theme/syntax/tokens.ts +5 -2
- package/src/utils/groupItems.ts +12 -6
- package/src/utils/index.ts +1 -1
- package/src/utils/isApplePlatform.test.ts +61 -0
- package/src/utils/isApplePlatform.ts +37 -0
- package/src/utils/sharedResizeObserver.ts +10 -2
- package/src/utils/timeParser.test.ts +6 -1
- package/src/utils/timeParser.ts +35 -13
- package/src/__tests__/inputWidthContract.test.tsx +0 -69
|
@@ -7,7 +7,7 @@ export const docs = {
|
|
|
7
7
|
subComponentOf: 'Table',
|
|
8
8
|
displayName: 'useTableGroupedRows',
|
|
9
9
|
description:
|
|
10
|
-
|
|
10
|
+
"Hook that groups a flat data array into collapsible section rows. Each distinct groupBy value becomes a full-width section-header row with a chevron toggle, the group label, and a member count; collapsing hides that group's data rows while keeping the header visible. Mirrors useTableTreeState: the consumer owns the collapsedGroups set and the hook returns {data, plugin, idKey}: pass them to Table as data, plugins, and idKey respectively.",
|
|
11
11
|
props: [
|
|
12
12
|
{
|
|
13
13
|
name: 'data',
|
|
@@ -58,13 +58,14 @@ export const docs = {
|
|
|
58
58
|
/** @type {import('@astryxdesign/cli/authoring').ComponentTranslationDoc} */
|
|
59
59
|
export const docsDense = {
|
|
60
60
|
description:
|
|
61
|
-
'Groups a flat data array into collapsible section rows. Each groupBy value becomes a full-width header (chevron + label + count); collapsing hides its rows. Returns {data, plugin, idKey}: pass to Table data / plugins / idKey. Consumer owns the collapsedGroups set.',
|
|
61
|
+
'Groups a flat data array into collapsible section rows. Each groupBy value becomes a full-width header (chevron + label + count); collapsing hides its rows. Returns {data, plugin, idKey}: pass them to Table data / plugins / idKey. Consumer owns the collapsedGroups set.',
|
|
62
62
|
propDescriptions: {
|
|
63
63
|
data: 'The flat data to group.',
|
|
64
|
-
groupBy:
|
|
64
|
+
groupBy: "Derive a row's group key. Same key = same section.",
|
|
65
65
|
collapsedGroups: 'Set of currently-collapsed group keys.',
|
|
66
66
|
onToggleGroup: 'Called with the group key when a header is toggled.',
|
|
67
|
-
renderGroupHeader:
|
|
67
|
+
renderGroupHeader:
|
|
68
|
+
"Custom header content (right of chevron). Default '<key> (<count>)'.",
|
|
68
69
|
getRowKey: 'Stable key for a real row; positional fallback when omitted.',
|
|
69
70
|
groupOrder: 'Pin these group keys first; others keep first-seen order.',
|
|
70
71
|
},
|
|
@@ -72,6 +72,12 @@ export const docs = {
|
|
|
72
72
|
description: 'Horizontal alignment of the pagination controls.',
|
|
73
73
|
default: "'center'",
|
|
74
74
|
},
|
|
75
|
+
{
|
|
76
|
+
name: 'label',
|
|
77
|
+
type: 'string',
|
|
78
|
+
description: "Accessible name for the pagination nav landmark. With position='both' the two navs get distinct names — the label suffixed as '(top)' and '(bottom)' — so same-type landmarks stay unique (axe landmark-unique).",
|
|
79
|
+
default: "'Table pagination'",
|
|
80
|
+
},
|
|
75
81
|
],
|
|
76
82
|
};
|
|
77
83
|
|
|
@@ -129,5 +135,6 @@ export const docsDense = {
|
|
|
129
135
|
pageSize: 'Items per page. Default 10.',
|
|
130
136
|
variant: "Pagination variant: 'pages'|'count'|'compact'|'dots'|'none'.",
|
|
131
137
|
position: "Render position: 'below'|'above'|'both'|'none'.",
|
|
138
|
+
label: "Accessible name for the nav landmark; position='both' emits '<label> (top)' / '<label> (bottom)'.",
|
|
132
139
|
},
|
|
133
140
|
};
|
|
@@ -7,7 +7,7 @@ export const docs = {
|
|
|
7
7
|
subComponentOf: 'Table',
|
|
8
8
|
displayName: 'useTableRowStatus',
|
|
9
9
|
description:
|
|
10
|
-
'Hook that returns a TablePlugin which prepends a narrow column signaling per-row status: a colored status dot by default, or an icon when provided (shape + color is more accessible than color alone). getStatus maps a row to a semantic color (mapped to a theme token) or raw CSS color, an optional icon, and a required accessible label (shown in a tooltip on hover and announced to assistive technology, so status is never color-only); return null for no indicator. Memoize getStatus with useCallback for a stable plugin identity.',
|
|
10
|
+
'Hook that returns a TablePlugin which prepends a narrow column signaling per-row status: a colored status dot by default, or an icon when provided (shape + color is more accessible than color alone). getStatus maps a row to a semantic color (mapped to a theme token) or raw CSS color, an optional icon, and a required accessible label (shown in a tooltip on hover and announced to assistive technology, so status is never color-only); return null for no indicator. The column header is visually blank but carries a screen-reader-only localized name ("Row status", i18n key @astryx.table.rowStatus.columnHeader). Memoize getStatus with useCallback for a stable plugin identity.',
|
|
11
11
|
props: [
|
|
12
12
|
{
|
|
13
13
|
name: 'getStatus',
|
|
@@ -61,6 +61,13 @@ export const docs = {
|
|
|
61
61
|
description:
|
|
62
62
|
'Derives a human-readable identity for a row; the row checkbox\'s hidden label becomes `Select ${getRowLabel(item)}` so screen readers announce which row each checkbox selects. Falls back to "Select row" when omitted.',
|
|
63
63
|
},
|
|
64
|
+
{
|
|
65
|
+
name: 'hasRowHighlight',
|
|
66
|
+
type: 'boolean',
|
|
67
|
+
description:
|
|
68
|
+
'Paints checked rows with the accent wash. Set false when the surrounding UI already uses row background to mean something else (a row open in a detail panel, say) — the wash is an inline style, so it cannot be overridden from userland. Only the background is dropped: aria-selected is still set on checked rows either way.',
|
|
69
|
+
default: 'true',
|
|
70
|
+
},
|
|
64
71
|
],
|
|
65
72
|
examples: [
|
|
66
73
|
{
|
|
@@ -82,6 +89,21 @@ const selectionPlugin = useTableSelection({
|
|
|
82
89
|
idKey="id"
|
|
83
90
|
plugins={{selection: selectionPlugin}}
|
|
84
91
|
/>;
|
|
92
|
+
`,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
label: 'Opt out of the checked-row wash',
|
|
96
|
+
code: `
|
|
97
|
+
// This table already uses row background to mean "open in the detail
|
|
98
|
+
// panel". Turning the selection wash off keeps that meaning unambiguous;
|
|
99
|
+
// the checkbox and aria-selected still carry the selection.
|
|
100
|
+
const selectionPlugin = useTableSelection({
|
|
101
|
+
getIsItemSelected: item => selectedIds.has(item.id),
|
|
102
|
+
onSelectItem: ({item, isSelected}) => toggle(item.id, isSelected),
|
|
103
|
+
onSelectAll: ({isAllSelected}) => selectAll(isAllSelected),
|
|
104
|
+
getIsAllSelected: () => selectedIds.size === users.length,
|
|
105
|
+
hasRowHighlight: false,
|
|
106
|
+
});
|
|
85
107
|
`,
|
|
86
108
|
},
|
|
87
109
|
],
|
|
@@ -142,6 +164,13 @@ export const docsZh = {
|
|
|
142
164
|
description:
|
|
143
165
|
'为行派生人类可读的标识;行复选框的隐藏标签变为 `Select ${getRowLabel(item)}`,让屏幕阅读器播报每个复选框选择的是哪一行。省略时回退为 "Select row"。',
|
|
144
166
|
},
|
|
167
|
+
{
|
|
168
|
+
name: 'hasRowHighlight',
|
|
169
|
+
type: 'boolean',
|
|
170
|
+
description:
|
|
171
|
+
'为选中的行绘制强调色背景。当周围的界面已用行背景表达其他含义(例如该行已在详情面板中打开)时设为 false —— 该背景是内联样式,无法从业务代码覆盖。仅去掉背景:无论如何选中的行仍会设置 aria-selected。',
|
|
172
|
+
default: 'true',
|
|
173
|
+
},
|
|
145
174
|
],
|
|
146
175
|
};
|
|
147
176
|
|
|
@@ -164,5 +193,7 @@ export const docsDense = {
|
|
|
164
193
|
'Returns whether row checkbox is interactive; disabled rows show disabled checkbox.',
|
|
165
194
|
getRowLabel:
|
|
166
195
|
'Derives row identity for the checkbox\'s hidden label: `Select ${getRowLabel(item)}`. Falls back to "Select row" when omitted.',
|
|
196
|
+
hasRowHighlight:
|
|
197
|
+
'false => skip the accent wash on checked rows (inline style, not overridable from userland). aria-selected is unaffected. Defaults to true.',
|
|
167
198
|
},
|
|
168
199
|
};
|
package/src/Text/Text.test.tsx
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import {render, screen} from '@testing-library/react';
|
|
9
|
-
import {describe, it, expect} from 'vitest';
|
|
9
|
+
import {describe, it, expect, vi} from 'vitest';
|
|
10
10
|
import {Text} from './Text';
|
|
11
11
|
import type {TextType} from './Text';
|
|
12
12
|
import type {TextColor} from '../theme/types';
|
|
@@ -23,6 +23,28 @@ describe('Text', () => {
|
|
|
23
23
|
expect(screen.getByText('Hello World')).toBeInTheDocument();
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
+
it('keeps a forwarded ref attached across rerenders', () => {
|
|
27
|
+
const ref = vi.fn();
|
|
28
|
+
const {rerender} = render(
|
|
29
|
+
<Text ref={ref} type="body">
|
|
30
|
+
Before
|
|
31
|
+
</Text>,
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const element = screen.getByText('Before');
|
|
35
|
+
expect(ref).toHaveBeenLastCalledWith(element);
|
|
36
|
+
ref.mockClear();
|
|
37
|
+
|
|
38
|
+
rerender(
|
|
39
|
+
<Text ref={ref} type="body">
|
|
40
|
+
After
|
|
41
|
+
</Text>,
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
expect(ref).not.toHaveBeenCalled();
|
|
45
|
+
expect(screen.getByText('After')).toBe(element);
|
|
46
|
+
});
|
|
47
|
+
|
|
26
48
|
it('renders as span by default', () => {
|
|
27
49
|
render(<Text type="body">Text</Text>);
|
|
28
50
|
const element = screen.getByText('Text');
|
package/src/Text/Text.tsx
CHANGED
|
@@ -48,7 +48,8 @@ import {
|
|
|
48
48
|
} from './text.stylex';
|
|
49
49
|
import {useTruncation} from './useTruncation';
|
|
50
50
|
import type {LayerPlacement} from '../Layer';
|
|
51
|
-
import {mergeProps
|
|
51
|
+
import {mergeProps} from '../utils';
|
|
52
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
52
53
|
import type {BaseProps} from '../BaseProps';
|
|
53
54
|
import {themeProps} from '../utils/themeProps';
|
|
54
55
|
|
|
@@ -271,13 +272,16 @@ export function Text({
|
|
|
271
272
|
// Ref for the text element (used as tooltip anchor)
|
|
272
273
|
const textRef = useRef<HTMLElement>(null);
|
|
273
274
|
|
|
275
|
+
// Keep the merged ref stable across rerenders.
|
|
276
|
+
const mergedRef = useMergedRefs(ref, truncation.ref, textRef);
|
|
277
|
+
|
|
274
278
|
// Build inline style for -webkit-line-clamp (dynamic value)
|
|
275
279
|
const inlineStyle = maxLines > 1 ? {WebkitLineClamp: maxLines} : undefined;
|
|
276
280
|
|
|
277
281
|
return (
|
|
278
282
|
<>
|
|
279
283
|
<Component
|
|
280
|
-
ref={
|
|
284
|
+
ref={mergedRef}
|
|
281
285
|
{...mergeProps(
|
|
282
286
|
themeProps('text', {type, size, color: resolvedColor}),
|
|
283
287
|
stylex.props(
|
|
@@ -186,7 +186,10 @@ export const docs = {
|
|
|
186
186
|
],
|
|
187
187
|
theming: {
|
|
188
188
|
targets: [
|
|
189
|
-
{className: 'astryx-
|
|
189
|
+
{className: 'astryx-text-area', visualProps: ['size', 'status'], states: ['disabled', 'readonly']},
|
|
190
|
+
// Still emitted beside the names above, so themes written against
|
|
191
|
+
// them keep working. Drop in the next major.
|
|
192
|
+
{className: 'astryx-textarea', visualProps: ['size', 'status'], states: ['disabled', 'readonly'], deprecatedFor: 'text-area'},
|
|
190
193
|
],
|
|
191
194
|
vars: [
|
|
192
195
|
{
|
|
@@ -381,7 +384,10 @@ export const docsZh = {
|
|
|
381
384
|
],
|
|
382
385
|
theming: {
|
|
383
386
|
targets: [
|
|
384
|
-
{className: 'astryx-
|
|
387
|
+
{className: 'astryx-text-area', visualProps: ['size', 'status'], states: ['disabled', 'readonly']},
|
|
388
|
+
// Still emitted beside the names above, so themes written against
|
|
389
|
+
// them keep working. Drop in the next major.
|
|
390
|
+
{className: 'astryx-textarea', visualProps: ['size', 'status'], states: ['disabled', 'readonly'], deprecatedFor: 'text-area'},
|
|
385
391
|
],
|
|
386
392
|
vars: [
|
|
387
393
|
{
|
|
@@ -1155,3 +1155,14 @@ describe('TextArea readonly theme state', () => {
|
|
|
1155
1155
|
expect(root).not.toHaveAttribute('data-readonly');
|
|
1156
1156
|
});
|
|
1157
1157
|
});
|
|
1158
|
+
|
|
1159
|
+
describe('TextArea theme target names', () => {
|
|
1160
|
+
it('renders the deprecated class beside the current one', () => {
|
|
1161
|
+
const {container} = render(
|
|
1162
|
+
<TextArea label="Notes" value="" onChange={() => {}} />,
|
|
1163
|
+
);
|
|
1164
|
+
const root = container.querySelector('.astryx-text-area');
|
|
1165
|
+
expect(root).not.toBeNull();
|
|
1166
|
+
expect(root).toHaveClass('astryx-textarea');
|
|
1167
|
+
});
|
|
1168
|
+
});
|
|
@@ -46,7 +46,7 @@ import {
|
|
|
46
46
|
import {Icon, renderIconSlot, type IconType} from '../Icon';
|
|
47
47
|
import {Spinner} from '../Spinner';
|
|
48
48
|
import {useTooltip} from '../Tooltip';
|
|
49
|
-
import {mergeProps
|
|
49
|
+
import {mergeProps} from '../utils';
|
|
50
50
|
import type {BaseProps} from '../BaseProps';
|
|
51
51
|
import type {SizeValue} from '../utils/types';
|
|
52
52
|
import {useInputContainer} from '../hooks/useInputContainer';
|
|
@@ -58,6 +58,7 @@ import {themeProps} from '../utils/themeProps';
|
|
|
58
58
|
import {characterCount} from '../utils/characters';
|
|
59
59
|
import {useTranslator} from '../i18n';
|
|
60
60
|
|
|
61
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
61
62
|
const COUNTER_WARNING_THRESHOLD = 0.8;
|
|
62
63
|
|
|
63
64
|
const styles = stylex.create({
|
|
@@ -555,12 +556,18 @@ export function TextArea({
|
|
|
555
556
|
onClick={handleWrapperClick}
|
|
556
557
|
onMouseUp={handleWrapperMouseUp}
|
|
557
558
|
{...mergeProps(
|
|
558
|
-
themeProps(
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
559
|
+
themeProps(
|
|
560
|
+
'text-area',
|
|
561
|
+
{
|
|
562
|
+
size,
|
|
563
|
+
status: status?.type ?? null,
|
|
564
|
+
disabled: isDisabled ? 'disabled' : null,
|
|
565
|
+
readonly: isReadOnly ? 'readonly' : null,
|
|
566
|
+
},
|
|
567
|
+
// `textarea` ran the compound name together; themes styling it
|
|
568
|
+
// keep working until the next major.
|
|
569
|
+
{legacyNames: ['textarea']},
|
|
570
|
+
),
|
|
564
571
|
stylex.props(
|
|
565
572
|
inputWrapperStyles.base,
|
|
566
573
|
styles.wrapper,
|
|
@@ -580,7 +587,7 @@ export function TextArea({
|
|
|
580
587
|
)}
|
|
581
588
|
<textarea
|
|
582
589
|
{...rest}
|
|
583
|
-
ref={
|
|
590
|
+
ref={useMergedRefs(ref, textareaRef)}
|
|
584
591
|
id={id}
|
|
585
592
|
name={isDisabled ? undefined : htmlName}
|
|
586
593
|
value={optimisticValue}
|
|
@@ -71,6 +71,16 @@ export const docs = {
|
|
|
71
71
|
'Displays a "Required" indicator next to the label and sets aria-required. Mutually exclusive with isOptional.',
|
|
72
72
|
default: 'false',
|
|
73
73
|
},
|
|
74
|
+
{
|
|
75
|
+
name: 'onEnter',
|
|
76
|
+
type: '() => void',
|
|
77
|
+
description: 'Callback fired when the user presses the Enter key.',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'onKeyDown',
|
|
81
|
+
type: '(e: KeyboardEvent<HTMLInputElement>) => void',
|
|
82
|
+
description: 'Callback fired on keydown events on the input.',
|
|
83
|
+
},
|
|
74
84
|
{
|
|
75
85
|
name: 'isDisabled',
|
|
76
86
|
type: 'boolean',
|
|
@@ -97,7 +97,7 @@ export type {
|
|
|
97
97
|
InputStatus as TextInputStatus,
|
|
98
98
|
InputStatusType as TextInputStatusType,
|
|
99
99
|
} from '../Field';
|
|
100
|
-
import {mergeProps
|
|
100
|
+
import {mergeProps} from '../utils';
|
|
101
101
|
import {useSize} from '../SizeContext/SizeContext';
|
|
102
102
|
import {useInputContainer} from '../hooks/useInputContainer';
|
|
103
103
|
import {useInputStatusIcon} from '../hooks/useInputStatusIcon';
|
|
@@ -108,6 +108,7 @@ import type {SizeValue} from '../utils/types';
|
|
|
108
108
|
import {themeProps} from '../utils/themeProps';
|
|
109
109
|
import {useTranslator} from '../i18n';
|
|
110
110
|
|
|
111
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
111
112
|
export type TextInputType = 'text' | 'password' | 'email';
|
|
112
113
|
|
|
113
114
|
export interface TextInputProps extends Omit<
|
|
@@ -421,7 +422,7 @@ export function TextInput({
|
|
|
421
422
|
{inputGroup && <VisuallyHidden id={inputLabelID}>{label}</VisuallyHidden>}
|
|
422
423
|
<input
|
|
423
424
|
{...rest}
|
|
424
|
-
ref={
|
|
425
|
+
ref={useMergedRefs(ref, inputRef)}
|
|
425
426
|
id={id}
|
|
426
427
|
name={isDisabled ? undefined : htmlName}
|
|
427
428
|
type={type}
|
|
@@ -78,7 +78,7 @@ export const docs = {
|
|
|
78
78
|
{className: 'astryx-thumbnail'},
|
|
79
79
|
],
|
|
80
80
|
vars: [
|
|
81
|
-
{name: '--_thumbnail-hit-inset', description: 'Outset of the remove button\
|
|
81
|
+
{name: '--_thumbnail-hit-inset', description: 'Outset of the remove button\'s invisible hit area, applied to a ::after overlay. 0 on a fine pointer; negative on a coarse one, which grows the 20px button to the 24px touch target without changing what is drawn.', default: '0px', private: true},
|
|
82
82
|
],
|
|
83
83
|
},
|
|
84
84
|
usage: {
|
|
@@ -58,7 +58,6 @@ import {
|
|
|
58
58
|
isImeKeyEvent,
|
|
59
59
|
isTimeInRange,
|
|
60
60
|
mergeProps,
|
|
61
|
-
mergeRefs,
|
|
62
61
|
getInputARIA,
|
|
63
62
|
} from '../utils';
|
|
64
63
|
import type {BaseProps} from '../BaseProps';
|
|
@@ -74,6 +73,7 @@ import {useTooltip} from '../Tooltip';
|
|
|
74
73
|
import {themeProps} from '../utils/themeProps';
|
|
75
74
|
import {useTranslator} from '../i18n';
|
|
76
75
|
|
|
76
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
77
77
|
const styles = stylex.create({
|
|
78
78
|
icon: {
|
|
79
79
|
display: 'flex',
|
|
@@ -648,7 +648,7 @@ export function TimeInput({
|
|
|
648
648
|
</VisuallyHidden>
|
|
649
649
|
)}
|
|
650
650
|
<input
|
|
651
|
-
ref={
|
|
651
|
+
ref={useMergedRefs(ref, inputRef)}
|
|
652
652
|
id={id}
|
|
653
653
|
type="text"
|
|
654
654
|
value={displayValue}
|
|
@@ -20,7 +20,7 @@ import {lazy, Suspense, useEffect, useRef, useState} from 'react';
|
|
|
20
20
|
import * as stylex from '@stylexjs/stylex';
|
|
21
21
|
import {Text} from '../Text';
|
|
22
22
|
import type {TextType, TextSize, TextColor, TextWeight} from '../theme/types';
|
|
23
|
-
import {mergeProps
|
|
23
|
+
import {mergeProps} from '../utils';
|
|
24
24
|
import {useDevWarning} from '../hooks/useDevWarning';
|
|
25
25
|
import {useTranslator} from '../i18n';
|
|
26
26
|
import {useLocale} from '../i18n/useLocale';
|
|
@@ -33,6 +33,7 @@ import type {
|
|
|
33
33
|
TimestampTooltipLine,
|
|
34
34
|
} from './tooltipEntries';
|
|
35
35
|
|
|
36
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
36
37
|
// Load the overlay lazily so a card-less Timestamp — the default — never
|
|
37
38
|
// bundles HoverCard or the copy affordance's Icon/IconButton. Mirrors the code
|
|
38
39
|
// split the read-only Tooltip path used before it.
|
|
@@ -422,6 +423,7 @@ export function Timestamp({
|
|
|
422
423
|
const t = useTranslator();
|
|
423
424
|
const locale = useLocale();
|
|
424
425
|
const timeRef = useRef<HTMLTimeElement>(null);
|
|
426
|
+
const mergedTimeRef = useMergedRefs(ref, timeRef);
|
|
425
427
|
const [now, setNow] = useState(() => new Date());
|
|
426
428
|
|
|
427
429
|
const date = parseValue(value);
|
|
@@ -526,7 +528,7 @@ export function Timestamp({
|
|
|
526
528
|
xstyle={xstyle}
|
|
527
529
|
{...timestampProps}>
|
|
528
530
|
<time
|
|
529
|
-
ref={
|
|
531
|
+
ref={mergedTimeRef}
|
|
530
532
|
dateTime={isoString}
|
|
531
533
|
// `ariaLabelText` is '' only for an invalid date, which bails out
|
|
532
534
|
// before rendering — but keep the guard local: an empty aria-label
|
package/src/Toast/Toast.doc.mjs
CHANGED
|
@@ -60,6 +60,12 @@ export const docs = {
|
|
|
60
60
|
type: '(reason: "auto" | "manual") => void',
|
|
61
61
|
description: 'Callback fired when the toast is removed.',
|
|
62
62
|
},
|
|
63
|
+
{
|
|
64
|
+
name: 'onDismiss',
|
|
65
|
+
type: '(reason: "auto" | "manual") => void',
|
|
66
|
+
description: 'Callback fired when the toast is dismissed.',
|
|
67
|
+
required: true,
|
|
68
|
+
},
|
|
63
69
|
], theming: {
|
|
64
70
|
targets: [
|
|
65
71
|
{className: 'astryx-toast', visualProps: ['type']},
|
package/src/Token/TokenLink.tsx
CHANGED
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
|
|
28
28
|
import type {ReactNode, CSSProperties, Ref, HTMLAttributes} from 'react';
|
|
29
29
|
import {useRef} from 'react';
|
|
30
|
-
import {mergeRefs} from '../utils';
|
|
31
30
|
import {useClickableContainer} from '../hooks/useClickableContainer';
|
|
32
31
|
import type {LinkComponentType} from '../Link/types';
|
|
33
32
|
|
|
33
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
34
34
|
export interface TokenLinkProps extends HTMLAttributes<HTMLElement> {
|
|
35
35
|
/** Ref forwarded to the container element. */
|
|
36
36
|
ref?: Ref<HTMLElement>;
|
|
@@ -86,7 +86,7 @@ export function TokenLink({
|
|
|
86
86
|
|
|
87
87
|
return (
|
|
88
88
|
<span
|
|
89
|
-
ref={
|
|
89
|
+
ref={useMergedRefs(ref, containerRef)}
|
|
90
90
|
onClick={isDisabled ? undefined : onClick}
|
|
91
91
|
onMouseUp={isDisabled ? undefined : onMouseUp}
|
|
92
92
|
{...containerProps}>
|
|
@@ -135,6 +135,11 @@ export const docs = {
|
|
|
135
135
|
description: 'Maximum number of dropdown items to display.',
|
|
136
136
|
default: '10',
|
|
137
137
|
},
|
|
138
|
+
{
|
|
139
|
+
name: 'menuWidth',
|
|
140
|
+
type: 'number',
|
|
141
|
+
description: 'Fixed dropdown width in pixels. The menu never shrinks below its anchor width.',
|
|
142
|
+
},
|
|
138
143
|
{
|
|
139
144
|
name: 'emptySearchResultsText',
|
|
140
145
|
type: 'string',
|
|
@@ -201,6 +206,22 @@ export const docs = {
|
|
|
201
206
|
description:
|
|
202
207
|
'Width of the field (number = pixels, string used as-is, e.g. "100%"). Sizes the whole field (label, control, and status) so they stay aligned.',
|
|
203
208
|
},
|
|
209
|
+
{
|
|
210
|
+
name: 'tokenOverflowBehavior',
|
|
211
|
+
type: "'none' | 'unfocusedInline' | 'unfocusedLayer'",
|
|
212
|
+
description: 'Controls how tokens overflow when the container is too narrow.',
|
|
213
|
+
default: "'none'",
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: 'onFocus',
|
|
217
|
+
type: '(e: FocusEvent<HTMLInputElement>) => void',
|
|
218
|
+
description: 'Fires when focus enters the tokenizer input.',
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
name: 'onBlur',
|
|
222
|
+
type: '(e: FocusEvent<HTMLInputElement>) => void',
|
|
223
|
+
description: 'Fires when focus leaves the tokenizer input.',
|
|
224
|
+
},
|
|
204
225
|
{
|
|
205
226
|
name: 'xstyle',
|
|
206
227
|
type: 'StyleXStyles',
|
|
@@ -368,6 +389,11 @@ export const docsZh = {
|
|
|
368
389
|
description: '\u4e0b\u62c9\u5217\u8868\u663e\u793a\u7684\u6700\u5927\u9879\u76ee\u6570\u3002',
|
|
369
390
|
default: '10',
|
|
370
391
|
},
|
|
392
|
+
{
|
|
393
|
+
name: 'menuWidth',
|
|
394
|
+
type: 'number',
|
|
395
|
+
description: '下拉菜单的固定像素宽度。菜单不会小于其锚点宽度。',
|
|
396
|
+
},
|
|
371
397
|
{
|
|
372
398
|
name: 'emptySearchResultsText',
|
|
373
399
|
type: 'string',
|
|
@@ -490,6 +516,7 @@ export const docsDense = {
|
|
|
490
516
|
labelTooltip: 'Tooltip on label.',
|
|
491
517
|
hasEntriesOnFocus: 'Show bootstrap results on focus before typing.',
|
|
492
518
|
maxMenuItems: 'Max dropdown items to display.',
|
|
519
|
+
menuWidth: 'Fixed dropdown width in pixels.',
|
|
493
520
|
emptySearchResultsText: 'Text when search returns no results.',
|
|
494
521
|
hasAutoFocus: 'Auto-focus input on mount.',
|
|
495
522
|
size: 'Input+token size.',
|
|
@@ -156,6 +156,8 @@ export interface TokenizerProps<T extends SearchableItem> extends Omit<
|
|
|
156
156
|
hasEntriesOnFocus?: boolean;
|
|
157
157
|
/** Max dropdown items. @default 10 */
|
|
158
158
|
maxMenuItems?: number;
|
|
159
|
+
/** Fixed dropdown width in pixels. Never shrinks below the input width. */
|
|
160
|
+
menuWidth?: number;
|
|
159
161
|
/** Text shown when no results found. @default 'No results found' */
|
|
160
162
|
emptySearchResultsText?: string;
|
|
161
163
|
/** Whether the input is disabled. @default false */
|
|
@@ -393,6 +395,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
393
395
|
placeholder,
|
|
394
396
|
hasEntriesOnFocus,
|
|
395
397
|
maxMenuItems,
|
|
398
|
+
menuWidth,
|
|
396
399
|
emptySearchResultsText,
|
|
397
400
|
isDisabled = false,
|
|
398
401
|
htmlName,
|
|
@@ -778,6 +781,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
778
781
|
placeholder={value.length === 0 ? placeholder : ''}
|
|
779
782
|
hasEntriesOnFocus={isAtMax ? false : hasEntriesOnFocus}
|
|
780
783
|
maxMenuItems={maxMenuItems}
|
|
784
|
+
menuWidth={menuWidth}
|
|
781
785
|
emptySearchResultsText={emptySearchResultsText}
|
|
782
786
|
isDisabled={isDisabled}
|
|
783
787
|
isFocusableDisabled={showsDisabledMessage}
|
|
@@ -133,6 +133,11 @@ export const docs = {
|
|
|
133
133
|
description: 'Visual variant passed to Section.',
|
|
134
134
|
default: "'transparent'",
|
|
135
135
|
},
|
|
136
|
+
{
|
|
137
|
+
name: 'dividers',
|
|
138
|
+
type: "Array<'top' | 'bottom' | 'start' | 'end'>",
|
|
139
|
+
description: 'Borders/dividers rendered around the toolbar.',
|
|
140
|
+
},
|
|
136
141
|
{
|
|
137
142
|
name: 'xstyle',
|
|
138
143
|
type: 'StyleXStyles',
|
|
@@ -96,6 +96,11 @@ export const docs = {
|
|
|
96
96
|
type: 'boolean',
|
|
97
97
|
description: 'Whether the tooltip should be shown on mount. Still dismissible.',
|
|
98
98
|
},
|
|
99
|
+
{
|
|
100
|
+
name: 'isOpen',
|
|
101
|
+
type: 'boolean',
|
|
102
|
+
description: 'Controlled open state for the tooltip.',
|
|
103
|
+
},
|
|
99
104
|
],
|
|
100
105
|
},
|
|
101
106
|
],
|
|
@@ -276,6 +276,38 @@ describe('Tooltip', () => {
|
|
|
276
276
|
expect(onOpenChange).not.toHaveBeenCalledWith(false);
|
|
277
277
|
});
|
|
278
278
|
});
|
|
279
|
+
|
|
280
|
+
describe('controlled', () => {
|
|
281
|
+
// Escape asks a controlled tooltip to close by calling this same handler,
|
|
282
|
+
// so a consumer who complies sees the request and then this echo. Pinning
|
|
283
|
+
// the echo here keeps the two straight.
|
|
284
|
+
it('echoes the close through onOpenChange when the consumer flips isOpen', async () => {
|
|
285
|
+
const onOpenChange = vi.fn();
|
|
286
|
+
const {rerender} = render(
|
|
287
|
+
<Tooltip content="Pinned" isOpen onOpenChange={onOpenChange} delay={0}>
|
|
288
|
+
<button type="button">Trigger</button>
|
|
289
|
+
</Tooltip>,
|
|
290
|
+
);
|
|
291
|
+
await waitFor(() => {
|
|
292
|
+
expect(onOpenChange).toHaveBeenCalledWith(true);
|
|
293
|
+
});
|
|
294
|
+
onOpenChange.mockClear();
|
|
295
|
+
|
|
296
|
+
rerender(
|
|
297
|
+
<Tooltip
|
|
298
|
+
content="Pinned"
|
|
299
|
+
isOpen={false}
|
|
300
|
+
onOpenChange={onOpenChange}
|
|
301
|
+
delay={0}>
|
|
302
|
+
<button type="button">Trigger</button>
|
|
303
|
+
</Tooltip>,
|
|
304
|
+
);
|
|
305
|
+
|
|
306
|
+
await waitFor(() => {
|
|
307
|
+
expect(onOpenChange).toHaveBeenCalledWith(false);
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
});
|
|
279
311
|
describe('touch', () => {
|
|
280
312
|
// The modality is document-global; a tap in one case must not decide the
|
|
281
313
|
// next one's answer.
|
package/src/Tooltip/Tooltip.tsx
CHANGED
|
@@ -146,6 +146,11 @@ export interface TooltipProps {
|
|
|
146
146
|
* - `true`: force-show the tooltip (hover/focus hide is suppressed)
|
|
147
147
|
* - `false`: force-hide the tooltip
|
|
148
148
|
* - `undefined`: uncontrolled — hover/focus triggers manage visibility
|
|
149
|
+
*
|
|
150
|
+
* A controlled tooltip still takes Escape when it is the top-most layer, and
|
|
151
|
+
* answers by calling `onOpenChange(false)` without hiding itself — closing is
|
|
152
|
+
* your update's decision, exactly as for a controlled Dialog. Ignore the call
|
|
153
|
+
* and the tip stays, and so does the press: nothing underneath dismisses.
|
|
149
154
|
*/
|
|
150
155
|
isOpen?: boolean;
|
|
151
156
|
|