@astryxdesign/core 0.3.0 → 0.4.0-canary.058f476
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 +156 -0
- package/dist/AlertDialog/AlertDialog.d.ts +10 -2
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +22 -3
- package/dist/AppShell/AppShell.d.ts +2 -2
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +40 -9
- package/dist/AspectRatio/AspectRatio.d.ts +13 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +10 -2
- package/dist/AspectRatio/index.d.ts.map +1 -1
- package/dist/AspectRatio/index.js +1 -2
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +33 -20
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +2 -3
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +1 -2
- package/dist/Badge/index.d.ts.map +1 -1
- package/dist/Badge/index.js +1 -2
- package/dist/Banner/Banner.d.ts +3 -0
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +32 -17
- package/dist/Blockquote/Blockquote.d.ts.map +1 -1
- package/dist/Blockquote/Blockquote.js +1 -2
- package/dist/Blockquote/index.d.ts.map +1 -1
- package/dist/Blockquote/index.js +1 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
- package/dist/Breadcrumbs/index.d.ts +2 -1
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +1 -0
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +12 -16
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +2 -1
- package/dist/Calendar/styles.d.ts +0 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +0 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +1 -2
- package/dist/Card/index.d.ts.map +1 -1
- package/dist/Card/index.js +1 -2
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +8 -12
- package/dist/Center/Center.d.ts.map +1 -1
- package/dist/Center/Center.js +1 -2
- package/dist/Center/index.d.ts.map +1 -1
- package/dist/Center/index.js +1 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +2 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +3 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +4 -3
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +17 -17
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -6
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +36 -125
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -11
- package/dist/Code/Code.d.ts.map +1 -1
- package/dist/Code/Code.js +1 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +84 -67
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +35 -15
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +5 -0
- package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +6 -3
- package/dist/CommandPalette/CommandPaletteList.js +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +32 -31
- package/dist/ContextMenu/ContextMenu.d.ts +2 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +1 -1
- package/dist/ContextMenu/index.d.ts +2 -1
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +1 -0
- package/dist/DateInput/DateInput.d.ts +9 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +47 -33
- package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +55 -32
- package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +54 -30
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +4 -4
- package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +62 -20
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
- package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
- package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +10 -3
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
- package/dist/DropdownMenu/index.d.ts +2 -1
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +4 -0
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +35 -27
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +9 -5
- package/dist/Field/InputClearButton.d.ts +16 -3
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +15 -4
- package/dist/Field/PanelSearchInput.d.ts +81 -0
- package/dist/Field/PanelSearchInput.d.ts.map +1 -0
- package/dist/Field/PanelSearchInput.js +151 -0
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +21 -10
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +1 -2
- package/dist/Grid/index.d.ts.map +1 -1
- package/dist/Grid/index.js +1 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +3 -19
- package/dist/Icon/globalIconRegistry.d.ts +5 -4
- package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
- package/dist/Icon/globalIconRegistry.js +5 -4
- package/dist/Indicator/CheckIndicator.d.ts +25 -0
- package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
- package/dist/Indicator/CheckIndicator.js +155 -0
- package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
- package/dist/Indicator/CheckboxIndicator.js +173 -0
- package/dist/Indicator/RadioIndicator.d.ts +23 -0
- package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
- package/dist/Indicator/RadioIndicator.js +137 -0
- package/dist/Indicator/index.d.ts +24 -0
- package/dist/Indicator/index.d.ts.map +1 -0
- package/dist/Indicator/index.js +26 -0
- package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
- package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
- package/dist/Indicator/indicator.markers.stylex.js +21 -0
- package/dist/Indicator/indicatorRegistry.d.ts +71 -0
- package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
- package/dist/Indicator/indicatorRegistry.js +93 -0
- package/dist/Indicator/types.d.ts +177 -0
- package/dist/Indicator/types.d.ts.map +1 -0
- package/dist/Indicator/types.js +1 -0
- package/dist/Indicator/useIndicator.d.ts +18 -0
- package/dist/Indicator/useIndicator.d.ts.map +1 -0
- package/dist/Indicator/useIndicator.js +30 -0
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -8
- package/dist/Layer/useLayer.d.ts +14 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +25 -2
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +80 -103
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +4 -5
- package/dist/MobileNav/MobileNav.js +8 -8
- package/dist/MoreMenu/MoreMenu.d.ts +14 -1
- package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
- package/dist/MoreMenu/MoreMenu.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts +8 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +205 -170
- package/dist/NumberInput/NumberInput.d.ts +27 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +230 -42
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +2 -3
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +61 -63
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +6 -8
- package/dist/Popover/usePopover.d.ts +15 -0
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +14 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
- package/dist/ProgressBar/ProgressBar.d.ts +11 -4
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +95 -6
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +29 -84
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +2 -3
- package/dist/Section/Section.d.ts.map +1 -1
- package/dist/Section/Section.js +1 -2
- package/dist/Section/index.d.ts.map +1 -1
- package/dist/Section/index.js +1 -2
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +3 -11
- package/dist/Selector/Selector.d.ts +12 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +293 -183
- package/dist/Selector/hooks.d.ts +18 -6
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +57 -40
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +29 -14
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +56 -20
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +28 -22
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +1 -2
- package/dist/Skeleton/index.d.ts.map +1 -1
- package/dist/Skeleton/index.js +1 -2
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +2 -6
- package/dist/Stack/stack.stylex.d.ts +3 -3
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +14 -13
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +2 -3
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +41 -19
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +8 -0
- package/dist/Table/TableRow.d.ts +1 -1
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +4 -2
- package/dist/Table/index.d.ts +1 -1
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
- package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/index.js +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
- package/dist/Table/tableContextMenu.d.ts.map +1 -1
- package/dist/Table/tableContextMenu.js +2 -1
- package/dist/Table/types.d.ts +11 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +16 -6
- package/dist/TextInput/TextInput.d.ts +10 -1
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +13 -19
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +32 -26
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +14 -17
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +14 -3
- package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
- package/dist/Timestamp/TimestampHoverCard.js +16 -34
- package/dist/Timestamp/formatInstant.d.ts +11 -1
- package/dist/Timestamp/formatInstant.d.ts.map +1 -1
- package/dist/Timestamp/formatInstant.js +3 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +20 -11
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +4 -2
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +3 -19
- package/dist/TopNav/TopNav.d.ts.map +1 -1
- package/dist/TopNav/TopNav.js +6 -5
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +54 -16
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +3 -9
- package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +146 -60
- package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +83 -38
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +13 -0
- package/dist/TreeList/TreeListBranches.d.ts +1 -1
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +14 -4
- package/dist/TreeList/TreeListItem.d.ts +11 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +57 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +16 -8
- package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.js +1 -2
- package/dist/VisuallyHidden/index.d.ts.map +1 -1
- package/dist/VisuallyHidden/index.js +1 -2
- package/dist/astryx.css +86 -96
- package/dist/astryx.umd.js +56 -56
- package/dist/astryx.umd.js.map +4 -4
- package/dist/hooks/containerReveal.stylex.d.ts +61 -0
- package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
- package/dist/hooks/containerReveal.stylex.js +63 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/useClipboard.d.ts +59 -0
- package/dist/hooks/useClipboard.d.ts.map +1 -0
- package/dist/hooks/useClipboard.js +106 -0
- package/dist/hooks/useContainerReveal.d.ts +14 -8
- package/dist/hooks/useContainerReveal.d.ts.map +1 -1
- package/dist/hooks/useContainerReveal.js +28 -69
- package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
- package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
- package/dist/hooks/useIndicatorFocusRing.js +96 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
- package/dist/hooks/useInputStatusIcon.js +17 -4
- package/dist/hooks/useLongPress.d.ts.map +1 -1
- package/dist/hooks/useLongPress.js +12 -2
- package/dist/hooks/useScrollLock.d.ts.map +1 -1
- package/dist/hooks/useScrollLock.js +33 -18
- package/dist/hooks/useStreamingText.d.ts +18 -3
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +47 -7
- package/dist/hooks/useTreeFocus.d.ts.map +1 -1
- package/dist/hooks/useTreeFocus.js +9 -3
- package/dist/hooks/useTypeahead.d.ts +3 -2
- package/dist/hooks/useTypeahead.d.ts.map +1 -1
- package/dist/hooks/useTypeahead.js +19 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/defineTheme.d.ts +18 -2
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +10 -1
- package/dist/theme/derivedVarRegistry.d.ts +8 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +14 -13
- package/dist/theme/expandColorScale.d.ts +3 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +17 -7
- package/dist/theme/expandTypeScale.d.ts.map +1 -1
- package/dist/theme/expandTypeScale.js +17 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +11 -0
- package/dist/theme/index.d.ts +2 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/theme/tokens.stylex.d.ts +12 -0
- package/dist/theme/tokens.stylex.d.ts.map +1 -1
- package/dist/theme/tokens.stylex.js +23 -0
- package/dist/utils/focusOutline.stylex.d.ts +122 -0
- package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
- package/dist/utils/focusOutline.stylex.js +143 -0
- package/dist/utils/focusReturn.d.ts +24 -0
- package/dist/utils/focusReturn.d.ts.map +1 -0
- package/dist/utils/focusReturn.js +29 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +6 -1
- package/dist/utils/interactionModality.d.ts +34 -0
- package/dist/utils/interactionModality.d.ts.map +1 -0
- package/dist/utils/interactionModality.js +70 -0
- package/dist/utils/mergeRefs.d.ts.map +1 -1
- package/dist/utils/mergeRefs.js +7 -5
- package/dist/utils/rtlStyles.d.ts +2 -2
- package/dist/utils/rtlStyles.js +2 -2
- package/dist/utils/themeProps.d.ts +20 -1
- package/dist/utils/themeProps.d.ts.map +1 -1
- package/dist/utils/themeProps.js +8 -2
- package/locales/en.json +52 -0
- package/locales/pseudo.json +39 -0
- package/package.json +8 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
- package/src/AlertDialog/AlertDialog.test.tsx +208 -1
- package/src/AlertDialog/AlertDialog.tsx +21 -3
- package/src/AppShell/AppShell.doc.mjs +14 -0
- package/src/AppShell/AppShell.test.tsx +139 -0
- package/src/AppShell/AppShell.tsx +32 -22
- package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
- package/src/AspectRatio/AspectRatio.test.tsx +30 -0
- package/src/AspectRatio/AspectRatio.tsx +13 -2
- package/src/AspectRatio/index.ts +0 -2
- package/src/Avatar/Avatar.doc.mjs +2 -13
- package/src/Avatar/Avatar.test.tsx +33 -8
- package/src/Avatar/Avatar.tsx +52 -50
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
- package/src/Badge/Badge.tsx +0 -2
- package/src/Badge/index.ts +0 -2
- package/src/Banner/Banner.test.tsx +58 -1
- package/src/Banner/Banner.tsx +33 -11
- package/src/Blockquote/Blockquote.tsx +0 -2
- package/src/Blockquote/index.ts +0 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
- package/src/Breadcrumbs/index.ts +5 -1
- package/src/Button/Button.doc.mjs +2 -2
- package/src/Button/Button.tsx +22 -41
- package/src/Calendar/Calendar.tsx +2 -1
- package/src/Calendar/styles.ts +0 -8
- package/src/Card/Card.tsx +0 -2
- package/src/Card/index.ts +0 -2
- package/src/Carousel/Carousel.doc.mjs +3 -0
- package/src/Carousel/Carousel.tsx +10 -6
- package/src/Center/Center.tsx +0 -2
- package/src/Center/index.ts +0 -2
- package/src/Chat/Chat.doc.mjs +2 -0
- package/src/Chat/ChatDictationButton.tsx +7 -1
- package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
- package/src/Chat/ChatSendButton.tsx +2 -3
- package/src/Chat/ChatToolCalls.test.tsx +35 -0
- package/src/Chat/ChatToolCalls.tsx +36 -16
- package/src/Chat/useTriggerMenu.tsx +2 -5
- package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
- package/src/CheckboxInput/CheckboxInput.test.tsx +120 -0
- package/src/CheckboxInput/CheckboxInput.tsx +45 -202
- package/src/ClickableCard/ClickableCard.tsx +6 -11
- package/src/Code/Code.tsx +0 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
- package/src/CodeBlock/CodeBlock.test.tsx +91 -0
- package/src/CodeBlock/CodeBlock.tsx +57 -80
- package/src/Collapsible/Collapsible.tsx +22 -18
- package/src/CommandPalette/CommandPalette.test.tsx +83 -0
- package/src/CommandPalette/CommandPalette.tsx +5 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
- package/src/CommandPalette/CommandPaletteList.tsx +2 -2
- package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
- package/src/ComplexSelector/ComplexSelector.test.tsx +73 -0
- package/src/ComplexSelector/ComplexSelector.tsx +41 -28
- package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +41 -0
- package/src/ContextMenu/ContextMenu.tsx +3 -3
- package/src/ContextMenu/index.ts +5 -1
- package/src/DateInput/DateInput.doc.mjs +18 -3
- package/src/DateInput/DateInput.test.tsx +112 -11
- package/src/DateInput/DateInput.tsx +44 -25
- package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
- package/src/DateRangeInput/DateRangeInput.tsx +27 -21
- package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
- package/src/DateTimeInput/DateTimeInput.test.tsx +154 -1
- package/src/DateTimeInput/DateTimeInput.tsx +58 -17
- package/src/Dialog/Dialog.tsx +2 -9
- package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
- package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
- package/src/DropdownMenu/DropdownMenu.tsx +113 -52
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
- package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
- package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
- package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +2 -1
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
- package/src/DropdownMenu/index.ts +8 -1
- package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
- package/src/EmptyState/EmptyState.doc.mjs +4 -0
- package/src/EmptyState/EmptyState.test.tsx +62 -0
- package/src/EmptyState/EmptyState.tsx +16 -6
- package/src/Field/Field.doc.mjs +1 -0
- package/src/Field/InputClearButton.test.tsx +117 -0
- package/src/Field/InputClearButton.tsx +30 -3
- package/src/Field/PanelSearchInput.tsx +271 -0
- package/src/FileInput/FileInput.tsx +21 -8
- package/src/Grid/Grid.tsx +0 -2
- package/src/Grid/index.ts +0 -2
- package/src/HoverCard/useHoverCard.tsx +2 -23
- package/src/Icon/Icon.doc.mjs +2 -1
- package/src/Icon/globalIconRegistry.tsx +5 -4
- package/src/Indicator/CheckIndicator.tsx +174 -0
- package/src/Indicator/CheckboxIndicator.tsx +257 -0
- package/src/Indicator/Indicator.doc.mjs +344 -0
- package/src/Indicator/Indicator.test.tsx +393 -0
- package/src/Indicator/RadioIndicator.tsx +206 -0
- package/src/Indicator/index.ts +46 -0
- package/src/Indicator/indicator.markers.stylex.ts +19 -0
- package/src/Indicator/indicatorRegistry.test.tsx +106 -0
- package/src/Indicator/indicatorRegistry.ts +120 -0
- package/src/Indicator/types.ts +197 -0
- package/src/Indicator/useIndicator.ts +39 -0
- package/src/Item/Item.doc.mjs +1 -1
- package/src/Item/Item.tsx +7 -14
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +85 -0
- package/src/Layer/useLayer.tsx +39 -1
- package/src/Lightbox/Lightbox.doc.mjs +1 -1
- package/src/Lightbox/Lightbox.tsx +45 -49
- package/src/Link/Link.tsx +4 -11
- package/src/MobileNav/MobileNav.tsx +3 -3
- package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
- package/src/MoreMenu/MoreMenu.test.tsx +68 -1
- package/src/MoreMenu/MoreMenu.tsx +19 -0
- package/src/MultiSelector/MultiSelector.doc.mjs +18 -1
- package/src/MultiSelector/MultiSelector.test.tsx +387 -18
- package/src/MultiSelector/MultiSelector.tsx +267 -220
- package/src/NumberInput/NumberInput.doc.mjs +265 -50
- package/src/NumberInput/NumberInput.test.tsx +726 -21
- package/src/NumberInput/NumberInput.tsx +353 -59
- package/src/Outline/Outline.tsx +2 -5
- package/src/Pagination/Pagination.doc.mjs +1 -1
- package/src/Pagination/Pagination.test.tsx +22 -7
- package/src/Pagination/Pagination.tsx +38 -35
- package/src/Popover/Popover.doc.mjs +2 -0
- package/src/Popover/Popover.tsx +6 -7
- package/src/Popover/usePopover.tsx +37 -4
- package/src/PowerSearch/PowerSearch.tsx +1 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
- package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
- package/src/ProgressBar/ProgressBar.test.tsx +224 -1
- package/src/ProgressBar/ProgressBar.tsx +126 -30
- package/src/RadioList/RadioList.doc.mjs +4 -2
- package/src/RadioList/RadioListItem.tsx +31 -130
- package/src/Resizable/ResizeHandle.tsx +2 -9
- package/src/Section/Section.tsx +0 -2
- package/src/Section/index.ts +0 -2
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
- package/src/SelectableCard/SelectableCard.tsx +4 -9
- package/src/Selector/Selector.doc.mjs +17 -4
- package/src/Selector/Selector.test.tsx +1394 -100
- package/src/Selector/Selector.tsx +355 -212
- package/src/Selector/hooks.ts +77 -50
- package/src/SideNav/SideNav.test.tsx +46 -0
- package/src/SideNav/SideNav.tsx +1 -0
- package/src/SideNav/SideNavCollapseButton.tsx +15 -10
- package/src/SideNav/SideNavHeading.tsx +48 -10
- package/src/SideNav/SideNavItem.tsx +20 -12
- package/src/Skeleton/Skeleton.tsx +0 -2
- package/src/Skeleton/index.ts +0 -2
- package/src/Slider/Slider.tsx +2 -11
- package/src/Stack/Stack.doc.mjs +110 -0
- package/src/StatusDot/StatusDot.doc.mjs +12 -3
- package/src/Switch/Switch.test.tsx +32 -0
- package/src/Switch/Switch.tsx +18 -10
- package/src/TabList/Tab.tsx +2 -9
- package/src/TabList/TabMenu.tsx +14 -21
- package/src/Table/BaseTable.tsx +11 -0
- package/src/Table/Table.test.tsx +31 -0
- package/src/Table/TableRow.tsx +6 -0
- package/src/Table/index.ts +1 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
- package/src/Table/plugins/rowExpansion/index.ts +1 -4
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
- package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
- package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
- package/src/Table/tableContextMenu.test.tsx +27 -0
- package/src/Table/tableContextMenu.tsx +1 -0
- package/src/Table/types.ts +11 -0
- package/src/Table/useTableGroupedRows.doc.mjs +1 -1
- package/src/Table/useTableRowExpansion.doc.mjs +43 -66
- package/src/TextArea/TextArea.doc.mjs +42 -2
- package/src/TextArea/TextArea.test.tsx +219 -0
- package/src/TextArea/TextArea.tsx +34 -7
- package/src/TextInput/TextInput.doc.mjs +18 -2
- package/src/TextInput/TextInput.test.tsx +189 -0
- package/src/TextInput/TextInput.tsx +25 -31
- package/src/Thumbnail/Thumbnail.tsx +2 -9
- package/src/TimeInput/TimeInput.doc.mjs +2 -2
- package/src/TimeInput/TimeInput.test.tsx +84 -3
- package/src/TimeInput/TimeInput.tsx +26 -28
- package/src/Timestamp/Timestamp.doc.mjs +4 -3
- package/src/Timestamp/Timestamp.test.tsx +91 -14
- package/src/Timestamp/Timestamp.tsx +14 -2
- package/src/Timestamp/TimestampHoverCard.tsx +13 -35
- package/src/Timestamp/formatInstant.ts +16 -1
- package/src/Token/Token.tsx +5 -28
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +45 -3
- package/src/Tokenizer/Tokenizer.tsx +10 -2
- package/src/Tooltip/useTooltip.tsx +2 -23
- package/src/TopNav/TopNav.tsx +1 -3
- package/src/TopNav/TopNavHeading.tsx +42 -13
- package/src/TopNav/TopNavItem.tsx +3 -21
- package/src/TopNav/TopNavMegaMenu.doc.mjs +5 -0
- package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
- package/src/TopNav/TopNavMegaMenu.tsx +118 -53
- package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
- package/src/TopNav/TopNavMenu.tsx +34 -37
- package/src/TreeList/TreeList.doc.mjs +5 -0
- package/src/TreeList/TreeList.test.tsx +208 -8
- package/src/TreeList/TreeList.tsx +22 -0
- package/src/TreeList/TreeListBranches.tsx +25 -2
- package/src/TreeList/TreeListItem.tsx +89 -52
- package/src/Typeahead/BaseTypeahead.tsx +19 -6
- package/src/Typeahead/Typeahead.doc.mjs +1 -0
- package/src/Typeahead/Typeahead.test.tsx +76 -3
- package/src/VisuallyHidden/VisuallyHidden.tsx +0 -2
- package/src/VisuallyHidden/index.ts +0 -2
- package/src/hooks/containerReveal.stylex.ts +102 -0
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useClipboard.doc.mjs +87 -0
- package/src/hooks/useClipboard.test.tsx +151 -0
- package/src/hooks/useClipboard.ts +135 -0
- package/src/hooks/useContainerReveal.doc.mjs +7 -7
- package/src/hooks/useContainerReveal.test.tsx +42 -62
- package/src/hooks/useContainerReveal.ts +36 -91
- package/src/hooks/useImageMode.test.ts +1 -1
- package/src/hooks/useIndicatorFocusRing.tsx +120 -0
- package/src/hooks/useInputStatusIcon.tsx +8 -8
- package/src/hooks/useLongPress.test.tsx +18 -0
- package/src/hooks/useLongPress.ts +12 -2
- package/src/hooks/useScrollLock.test.ts +72 -0
- package/src/hooks/useScrollLock.ts +51 -19
- package/src/hooks/useStreamingText.test.ts +46 -1
- package/src/hooks/useStreamingText.ts +49 -7
- package/src/hooks/useTreeFocus.test.tsx +50 -0
- package/src/hooks/useTreeFocus.ts +14 -3
- package/src/hooks/useTypeahead.test.tsx +150 -0
- package/src/hooks/useTypeahead.ts +24 -9
- package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
- package/src/index.ts +1 -0
- package/src/serverSafeComponents.test.ts +665 -0
- package/src/theme/defineTheme.ts +27 -0
- package/src/theme/derivedVarRegistry.test.ts +21 -1
- package/src/theme/derivedVarRegistry.ts +19 -6
- package/src/theme/expandColorScale.test.ts +14 -0
- package/src/theme/expandColorScale.ts +24 -9
- package/src/theme/expandTypeScale.test.ts +43 -0
- package/src/theme/expandTypeScale.ts +17 -0
- package/src/theme/generateThemeRules.test.ts +78 -20
- package/src/theme/generateThemeRules.ts +11 -0
- package/src/theme/index.ts +15 -0
- package/src/theme/tokens.stylex.ts +18 -0
- package/src/theme/tokens.test.ts +37 -0
- package/src/utils/focusOutline.stylex.ts +177 -0
- package/src/utils/focusReturn.test.ts +42 -0
- package/src/utils/focusReturn.ts +31 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/interactionModality.ts +74 -0
- package/src/utils/mergeRefs.test.ts +48 -0
- package/src/utils/mergeRefs.ts +12 -6
- package/src/utils/rtlStyles.ts +2 -2
- package/src/utils/themeProps.ts +26 -4
- package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
- package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
- package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
- package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
- package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
- package/dist/RadioList/radio.markers.stylex.js +0 -12
- package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
- package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
- package/dist/hooks/containerReveal.pool.stylex.js +0 -292
- package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
- package/src/RadioList/radio.markers.stylex.ts +0 -10
- package/src/hooks/containerReveal.pool.stylex.ts +0 -571
|
@@ -157,6 +157,7 @@ export function EmptyState({
|
|
|
157
157
|
return (
|
|
158
158
|
<div
|
|
159
159
|
ref={ref}
|
|
160
|
+
{...props}
|
|
160
161
|
role="status"
|
|
161
162
|
{...mergeProps(
|
|
162
163
|
themeProps('empty-state', {variant: isCompact ? 'compact' : null}),
|
|
@@ -167,13 +168,17 @@ export function EmptyState({
|
|
|
167
168
|
),
|
|
168
169
|
className,
|
|
169
170
|
style,
|
|
170
|
-
)}
|
|
171
|
-
{...props}>
|
|
171
|
+
)}>
|
|
172
172
|
{icon != null && <div aria-hidden="true">{icon}</div>}
|
|
173
173
|
<div {...stylex.props(styles.textGroup)}>
|
|
174
174
|
{createElement(
|
|
175
175
|
HeadingTag,
|
|
176
|
-
|
|
176
|
+
mergeProps(
|
|
177
|
+
themeProps('empty-state-title', {
|
|
178
|
+
variant: isCompact ? 'compact' : null,
|
|
179
|
+
}),
|
|
180
|
+
stylex.props(styles.title, isCompact && styles.titleCompact),
|
|
181
|
+
),
|
|
177
182
|
title,
|
|
178
183
|
)}
|
|
179
184
|
{description != null && (
|
|
@@ -182,9 +187,14 @@ export function EmptyState({
|
|
|
182
187
|
// mismatches. The StyleX style sets margin: 0, so appearance is
|
|
183
188
|
// unchanged.
|
|
184
189
|
<div
|
|
185
|
-
{...
|
|
186
|
-
|
|
187
|
-
|
|
190
|
+
{...mergeProps(
|
|
191
|
+
themeProps('empty-state-description', {
|
|
192
|
+
variant: isCompact ? 'compact' : null,
|
|
193
|
+
}),
|
|
194
|
+
stylex.props(
|
|
195
|
+
styles.description,
|
|
196
|
+
isCompact && styles.descriptionCompact,
|
|
197
|
+
),
|
|
188
198
|
)}>
|
|
189
199
|
{description}
|
|
190
200
|
</div>
|
package/src/Field/Field.doc.mjs
CHANGED
|
@@ -34,6 +34,7 @@ export const docs = {
|
|
|
34
34
|
className: 'astryx-input-status-icon',
|
|
35
35
|
visualProps: ['size', 'status'],
|
|
36
36
|
},
|
|
37
|
+
{className: 'astryx-input-clear-icon'},
|
|
37
38
|
],
|
|
38
39
|
vars: [
|
|
39
40
|
{name: '--_field-radius', description: 'Border radius of input fields', default: 'var(--radius-element)', private: true},
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file InputClearButton.test.tsx
|
|
5
|
+
* @input Uses vitest, @testing-library/react, InputClearButton, Icon, theme
|
|
6
|
+
* @output Unit tests for the shared clear-button primitive
|
|
7
|
+
* @position Testing; validates InputClearButton.tsx — the single home for the
|
|
8
|
+
* clearable input family's clear (✕) affordance and its theme target.
|
|
9
|
+
*
|
|
10
|
+
* SYNC: When InputClearButton.tsx changes, update tests to match new behavior.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {describe, it, expect, vi} from 'vitest';
|
|
14
|
+
import {render, screen, fireEvent} from '@testing-library/react';
|
|
15
|
+
import {InputClearButton} from './InputClearButton';
|
|
16
|
+
import {Icon} from '../Icon';
|
|
17
|
+
import {defineTheme} from '../theme/defineTheme';
|
|
18
|
+
import {generateThemeCSS} from '../theme/generateThemeRules';
|
|
19
|
+
|
|
20
|
+
function generateThemeTestCSS(theme: Parameters<typeof generateThemeCSS>[0]) {
|
|
21
|
+
const {prose, component} = generateThemeCSS(theme);
|
|
22
|
+
return [prose, component].filter(Boolean).join('\n\n');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const getGlyph = (): HTMLElement => {
|
|
26
|
+
const button = screen.getByRole('button', {name: 'Clear'});
|
|
27
|
+
const icon = button.querySelector('.astryx-icon');
|
|
28
|
+
if (icon == null) {
|
|
29
|
+
throw new Error('clear glyph not found');
|
|
30
|
+
}
|
|
31
|
+
return icon as HTMLElement;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
describe('InputClearButton', () => {
|
|
35
|
+
it('renders a real button with the given accessible label', () => {
|
|
36
|
+
render(<InputClearButton label="Clear" onClick={() => {}} />);
|
|
37
|
+
const button = screen.getByRole('button', {name: 'Clear'});
|
|
38
|
+
expect(button.tagName).toBe('BUTTON');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('fires onClick with the native event when pressed', () => {
|
|
42
|
+
const onClick = vi.fn();
|
|
43
|
+
render(<InputClearButton label="Clear" onClick={onClick} />);
|
|
44
|
+
fireEvent.click(screen.getByRole('button', {name: 'Clear'}));
|
|
45
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
46
|
+
expect(onClick.mock.calls[0][0]).toBeInstanceOf(Object);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('renders the astryx-input-clear-icon target on the glyph', () => {
|
|
50
|
+
// One canonical target on the icon element itself — so a theme restyles
|
|
51
|
+
// the clear glyph across the whole input family from a single place.
|
|
52
|
+
render(<InputClearButton label="Clear" onClick={() => {}} />);
|
|
53
|
+
const glyph = getGlyph();
|
|
54
|
+
expect(glyph).toHaveClass('astryx-input-clear-icon');
|
|
55
|
+
expect(glyph).toHaveClass('astryx-icon');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('matches a standalone inherit/sm close icon aside from the target class', () => {
|
|
59
|
+
// The glyph is a secondary/sm close icon (matching the other field
|
|
60
|
+
// affordances — chevrons, calendar toggles, status icons); aside from the
|
|
61
|
+
// target class it is exactly that standalone Icon, so the default look is
|
|
62
|
+
// defined once here rather than per input.
|
|
63
|
+
render(<InputClearButton label="Clear" onClick={() => {}} />);
|
|
64
|
+
const glyph = getGlyph();
|
|
65
|
+
|
|
66
|
+
const {container} = render(
|
|
67
|
+
<Icon icon="close" size="sm" color="secondary" />,
|
|
68
|
+
);
|
|
69
|
+
const refIcon = container.querySelector('.astryx-icon') as HTMLElement;
|
|
70
|
+
|
|
71
|
+
const styleClasses = (el: HTMLElement) =>
|
|
72
|
+
el.className
|
|
73
|
+
.split(' ')
|
|
74
|
+
.filter(c => c !== 'astryx-input-clear-icon')
|
|
75
|
+
.sort();
|
|
76
|
+
|
|
77
|
+
expect(styleClasses(glyph)).toEqual(styleClasses(refIcon));
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('merges an extra iconClassName beside the canonical target', () => {
|
|
81
|
+
// Consumers that shipped a component-specific target before the family
|
|
82
|
+
// converged pass it through here to keep emitting it for a deprecation
|
|
83
|
+
// window.
|
|
84
|
+
render(
|
|
85
|
+
<InputClearButton
|
|
86
|
+
label="Clear"
|
|
87
|
+
onClick={() => {}}
|
|
88
|
+
iconClassName="astryx-date-input-clear-icon"
|
|
89
|
+
/>,
|
|
90
|
+
);
|
|
91
|
+
const glyph = getGlyph();
|
|
92
|
+
expect(glyph).toHaveClass('astryx-input-clear-icon');
|
|
93
|
+
expect(glyph).toHaveClass('astryx-date-input-clear-icon');
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('exposes input-clear-icon so a theme reaches the glyph color, size, and hover', () => {
|
|
97
|
+
const theme = defineTheme({
|
|
98
|
+
name: 'input-clear-icon-test',
|
|
99
|
+
components: {
|
|
100
|
+
'input-clear-icon': {
|
|
101
|
+
base: {
|
|
102
|
+
width: '12px',
|
|
103
|
+
height: '12px',
|
|
104
|
+
fontSize: '12px',
|
|
105
|
+
color: 'var(--color-icon-secondary)',
|
|
106
|
+
':hover': {color: 'var(--color-icon-primary)'},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
const css = generateThemeTestCSS(theme);
|
|
112
|
+
expect(css).toContain('.astryx-input-clear-icon {');
|
|
113
|
+
expect(css).toContain('width: 12px');
|
|
114
|
+
expect(css).toContain('.astryx-input-clear-icon:hover {');
|
|
115
|
+
expect(css).toContain('color: var(--color-icon-primary)');
|
|
116
|
+
});
|
|
117
|
+
});
|
|
@@ -5,14 +5,20 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* @file InputClearButton.tsx
|
|
7
7
|
* @input Uses React, Button, Icon
|
|
8
|
-
* @output Exports InputClearButton shared clear button
|
|
9
|
-
*
|
|
8
|
+
* @output Exports InputClearButton, the shared clear (✕) button rendered by
|
|
9
|
+
* every clearable input in the family.
|
|
10
|
+
* @position Shared primitive. Every input that renders a clear affordance —
|
|
11
|
+
* TextInput, NumberInput, TimeInput, DateInput, DateTimeInput,
|
|
12
|
+
* DateRangeInput, Selector, MultiSelector, Typeahead, Tokenizer, FileInput —
|
|
13
|
+
* routes it through here, so the glyph is themed in one place via the
|
|
14
|
+
* `astryx-input-clear-icon` target.
|
|
10
15
|
*/
|
|
11
16
|
|
|
12
17
|
import type {ReactNode} from 'react';
|
|
13
18
|
import * as stylex from '@stylexjs/stylex';
|
|
14
19
|
import {Button} from '../Button';
|
|
15
20
|
import {Icon} from '../Icon';
|
|
21
|
+
import {themeProps} from '../utils/themeProps';
|
|
16
22
|
|
|
17
23
|
const styles = stylex.create({
|
|
18
24
|
button: {
|
|
@@ -25,19 +31,40 @@ export interface InputClearButtonProps {
|
|
|
25
31
|
label: string;
|
|
26
32
|
onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
27
33
|
xstyle?: stylex.StyleXStyles;
|
|
34
|
+
/**
|
|
35
|
+
* Extra class(es) for the clear glyph itself, merged onto the shared
|
|
36
|
+
* `astryx-input-clear-icon` target. Used by inputs that shipped a
|
|
37
|
+
* component-specific clear-icon target before the family converged here
|
|
38
|
+
* (e.g. `astryx-date-input-clear-icon`) to keep emitting it for a
|
|
39
|
+
* deprecation window; new callers don't need it.
|
|
40
|
+
*/
|
|
41
|
+
iconClassName?: string;
|
|
28
42
|
}
|
|
29
43
|
|
|
30
44
|
export function InputClearButton({
|
|
31
45
|
label,
|
|
32
46
|
onClick,
|
|
33
47
|
xstyle,
|
|
48
|
+
iconClassName,
|
|
34
49
|
}: InputClearButtonProps): ReactNode {
|
|
50
|
+
const {className: iconTargetClassName} = themeProps('input-clear-icon');
|
|
35
51
|
return (
|
|
36
52
|
<Button
|
|
37
53
|
variant="ghost"
|
|
38
54
|
size="sm"
|
|
39
55
|
label={label}
|
|
40
|
-
icon={
|
|
56
|
+
icon={
|
|
57
|
+
<Icon
|
|
58
|
+
icon="close"
|
|
59
|
+
size="sm"
|
|
60
|
+
color="secondary"
|
|
61
|
+
className={
|
|
62
|
+
iconClassName != null
|
|
63
|
+
? `${iconTargetClassName} ${iconClassName}`
|
|
64
|
+
: iconTargetClassName
|
|
65
|
+
}
|
|
66
|
+
/>
|
|
67
|
+
}
|
|
41
68
|
onClick={onClick}
|
|
42
69
|
isIconOnly
|
|
43
70
|
xstyle={[styles.button, xstyle]}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file PanelSearchInput.tsx
|
|
7
|
+
* @input Uses React, StyleX, Icon, InputClearButton, theme tokens
|
|
8
|
+
* @output Exports PanelSearchInput — the search row that sits at the top of a
|
|
9
|
+
* dropdown panel
|
|
10
|
+
* @position Shared internal primitive; used by Selector and MultiSelector
|
|
11
|
+
*
|
|
12
|
+
* A dropdown panel is already a bordered, elevated surface. Nesting a bordered
|
|
13
|
+
* TextInput inside it draws a second box within that box, so the field reads as
|
|
14
|
+
* a control dropped into the menu rather than part of it. This row is the
|
|
15
|
+
* seamless alternative — magnifier, borderless input, clear button — separated
|
|
16
|
+
* from the options by a divider the panel owns.
|
|
17
|
+
*
|
|
18
|
+
* The field is shaped like the option rows under it rather than like a form
|
|
19
|
+
* input: same inset from the panel edge, same `--radius-element` corners, same
|
|
20
|
+
* height. The focus ring is drawn on that rounded box, so focus reads as "this
|
|
21
|
+
* row of the panel" — the same visual language as an item's highlight — instead
|
|
22
|
+
* of ringing the whole panel header. It appears for keyboard focus only; see
|
|
23
|
+
* `fieldKeyboardFocus` for why `:focus-visible` alone does not mean that.
|
|
24
|
+
*
|
|
25
|
+
* ┌─ panel ──────────────────┐
|
|
26
|
+
* │ ┌──────────────────────┐ │ ← field: rounded, inset, item-sized
|
|
27
|
+
* │ │ ⌕ Search… ✕ │ │
|
|
28
|
+
* │ └──────────────────────┘ │
|
|
29
|
+
* ├──────────────────────────┤ ← divider (full-bleed)
|
|
30
|
+
* │ ┌──────────────────────┐ │
|
|
31
|
+
* │ │ Apple │ │ ← option row: same box
|
|
32
|
+
*
|
|
33
|
+
* The clear button is the shared `InputClearButton`, so the affordance and its
|
|
34
|
+
* ghost-button behavior match every other input's clear. It renders AFTER the
|
|
35
|
+
* input in DOM order: the selector components' Tab handling depends on that
|
|
36
|
+
* order to keep the popup open while focus moves onto it.
|
|
37
|
+
*
|
|
38
|
+
* Not exported from the package: it is an implementation detail of the panels
|
|
39
|
+
* that use it, not public API.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
import {useCallback, useEffect, useState, type Ref} from 'react';
|
|
43
|
+
import * as stylex from '@stylexjs/stylex';
|
|
44
|
+
import {Icon} from '../Icon';
|
|
45
|
+
import {InputClearButton} from './InputClearButton';
|
|
46
|
+
import {mergeProps} from '../utils';
|
|
47
|
+
import {
|
|
48
|
+
getInteractionModality,
|
|
49
|
+
trackInteractionModality,
|
|
50
|
+
} from '../utils/interactionModality';
|
|
51
|
+
import {
|
|
52
|
+
colorVars,
|
|
53
|
+
durationVars,
|
|
54
|
+
easeVars,
|
|
55
|
+
radiusVars,
|
|
56
|
+
spacingVars,
|
|
57
|
+
typeScaleVars,
|
|
58
|
+
typographyVars,
|
|
59
|
+
} from '../theme/tokens.stylex';
|
|
60
|
+
import type {BaseProps} from '../BaseProps';
|
|
61
|
+
|
|
62
|
+
const styles = stylex.create({
|
|
63
|
+
// Gutter only. Matches the option list's own padding so the field below
|
|
64
|
+
// lines up with the option rows rather than with the panel edge.
|
|
65
|
+
wrapper: {
|
|
66
|
+
paddingBlock: spacingVars['--spacing-1'],
|
|
67
|
+
paddingInline: spacingVars['--spacing-1'],
|
|
68
|
+
},
|
|
69
|
+
// The field proper — the same box an option row draws: `--radius-element`
|
|
70
|
+
// corners and, at md, a 6/8 padding pair that lands it on the option row's
|
|
71
|
+
// 32px height. Focus rings THIS, not the full-width row.
|
|
72
|
+
field: {
|
|
73
|
+
boxSizing: 'border-box',
|
|
74
|
+
display: 'flex',
|
|
75
|
+
alignItems: 'center',
|
|
76
|
+
gap: spacingVars['--spacing-2'],
|
|
77
|
+
width: '100%',
|
|
78
|
+
paddingBlock: spacingVars['--spacing-1-5'],
|
|
79
|
+
paddingInline: spacingVars['--spacing-2'],
|
|
80
|
+
borderRadius: radiusVars['--radius-element'],
|
|
81
|
+
transitionProperty: 'box-shadow',
|
|
82
|
+
transitionDuration: {
|
|
83
|
+
default: durationVars['--duration-fast'],
|
|
84
|
+
'@media (prefers-reduced-motion: reduce)': '0s',
|
|
85
|
+
},
|
|
86
|
+
transitionTimingFunction: easeVars['--ease-standard'],
|
|
87
|
+
},
|
|
88
|
+
// The focus ring, applied only while focus was taken by keyboard (see
|
|
89
|
+
// `isKeyboardFocus`). `:has(input:focus-visible)` stays the CSS condition —
|
|
90
|
+
// the browser's heuristic still decides, this only narrows it — and rings
|
|
91
|
+
// the field rather than the bare <input> so the magnifier and the clear
|
|
92
|
+
// button sit inside it, and so tabbing ONTO the clear button does not
|
|
93
|
+
// re-ring the field.
|
|
94
|
+
//
|
|
95
|
+
// Inset, not the shared 3px-offset outline: the field is inset 4-5px from
|
|
96
|
+
// the panel edge, so an outline at that offset would land on the panel's own
|
|
97
|
+
// border and the divider. Measured, not guessed.
|
|
98
|
+
fieldKeyboardFocus: {
|
|
99
|
+
boxShadow: {
|
|
100
|
+
default: 'none',
|
|
101
|
+
':has(input:focus-visible)': `inset 0 0 0 2px ${colorVars['--color-accent']}`,
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
// The icon span needs explicit flex centering to avoid a line-height offset.
|
|
105
|
+
icon: {
|
|
106
|
+
display: 'flex',
|
|
107
|
+
alignItems: 'center',
|
|
108
|
+
flexShrink: 0,
|
|
109
|
+
},
|
|
110
|
+
input: {
|
|
111
|
+
flexGrow: 1,
|
|
112
|
+
flexShrink: 1,
|
|
113
|
+
minWidth: 0,
|
|
114
|
+
padding: 0,
|
|
115
|
+
margin: 0,
|
|
116
|
+
borderWidth: 0,
|
|
117
|
+
borderStyle: 'none',
|
|
118
|
+
backgroundColor: 'transparent',
|
|
119
|
+
color: colorVars['--color-text-primary'],
|
|
120
|
+
fontFamily: typographyVars['--font-family-body'],
|
|
121
|
+
// Matches the option rows below it, so the query reads as the first line of
|
|
122
|
+
// the list. The coarse-pointer floor keeps iOS from zooming on focus.
|
|
123
|
+
fontSize: {
|
|
124
|
+
default: typeScaleVars['--text-label-size'],
|
|
125
|
+
'@media (pointer: coarse)': `max(1rem, ${typeScaleVars['--text-label-size']})`,
|
|
126
|
+
},
|
|
127
|
+
lineHeight: typeScaleVars['--text-label-leading'],
|
|
128
|
+
// The field draws the focus ring (see `field`), so the bare input must not
|
|
129
|
+
// draw a second one inside it.
|
|
130
|
+
outline: 'none',
|
|
131
|
+
'::placeholder': {
|
|
132
|
+
color: colorVars['--color-text-secondary'],
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
export interface PanelSearchInputProps extends Omit<
|
|
138
|
+
BaseProps<HTMLInputElement>,
|
|
139
|
+
'onChange'
|
|
140
|
+
> {
|
|
141
|
+
/** Ref forwarded to the input element (for focus management). */
|
|
142
|
+
ref?: Ref<HTMLInputElement>;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Accessible name for the input. Rendered as `aria-label`: the panel has no
|
|
146
|
+
* visible label for the field, and a placeholder is not a reliable name.
|
|
147
|
+
*/
|
|
148
|
+
label: string;
|
|
149
|
+
|
|
150
|
+
/** Accessible name for the clear (✕) button, e.g. `Clear Search options`. */
|
|
151
|
+
clearLabel: string;
|
|
152
|
+
|
|
153
|
+
/** Placeholder text shown while the query is empty. */
|
|
154
|
+
placeholder?: string;
|
|
155
|
+
|
|
156
|
+
/** The current query. */
|
|
157
|
+
value: string;
|
|
158
|
+
|
|
159
|
+
/** Called with the next query on every keystroke and on clear. */
|
|
160
|
+
onValueChange: (value: string) => void;
|
|
161
|
+
|
|
162
|
+
/** Key handler for the input itself. */
|
|
163
|
+
onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
|
|
164
|
+
|
|
165
|
+
/** Focus handler for the input; runs after the ring's own bookkeeping. */
|
|
166
|
+
onFocus?: React.FocusEventHandler<HTMLInputElement>;
|
|
167
|
+
|
|
168
|
+
/** Blur handler for the input; runs after the ring's own bookkeeping. */
|
|
169
|
+
onBlur?: React.FocusEventHandler<HTMLInputElement>;
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Key handler for the row. Events from the input are handled by `onKeyDown`;
|
|
173
|
+
* this one exists for keys pressed on the clear button, which has no other
|
|
174
|
+
* handler of its own.
|
|
175
|
+
*/
|
|
176
|
+
onContainerKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Search row for the top of a dropdown panel: magnifier, borderless input, and
|
|
181
|
+
* a clear button once a query is typed, in a rounded box shaped like the
|
|
182
|
+
* option rows beneath it.
|
|
183
|
+
*
|
|
184
|
+
* `className`/`style`/`xstyle` apply to the outer row (use them to match the
|
|
185
|
+
* option list's inline padding); every other prop (`role`, `aria-*`, `id`, …)
|
|
186
|
+
* passes through to the `<input>`, so the caller owns the combobox wiring.
|
|
187
|
+
*/
|
|
188
|
+
export function PanelSearchInput({
|
|
189
|
+
ref,
|
|
190
|
+
label,
|
|
191
|
+
clearLabel,
|
|
192
|
+
placeholder,
|
|
193
|
+
value,
|
|
194
|
+
onValueChange,
|
|
195
|
+
onKeyDown,
|
|
196
|
+
onFocus,
|
|
197
|
+
onBlur,
|
|
198
|
+
onContainerKeyDown,
|
|
199
|
+
xstyle,
|
|
200
|
+
className,
|
|
201
|
+
style,
|
|
202
|
+
...props
|
|
203
|
+
}: PanelSearchInputProps) {
|
|
204
|
+
// `:focus-visible` matches a text input focused by POINTER as well (CSS
|
|
205
|
+
// Selectors 4, verified in Chromium), so it cannot express "keyboard focus"
|
|
206
|
+
// by itself. Gate it on how the user last interacted; the CSS condition
|
|
207
|
+
// stays `:focus-visible`, this only narrows it.
|
|
208
|
+
const [isKeyboardFocus, setIsKeyboardFocus] = useState(false);
|
|
209
|
+
|
|
210
|
+
useEffect(() => {
|
|
211
|
+
trackInteractionModality();
|
|
212
|
+
}, []);
|
|
213
|
+
|
|
214
|
+
const handleFocus = useCallback(
|
|
215
|
+
(e: React.FocusEvent<HTMLInputElement>) => {
|
|
216
|
+
setIsKeyboardFocus(getInteractionModality() === 'keyboard');
|
|
217
|
+
onFocus?.(e);
|
|
218
|
+
},
|
|
219
|
+
[onFocus],
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
const handleBlur = useCallback(
|
|
223
|
+
(e: React.FocusEvent<HTMLInputElement>) => {
|
|
224
|
+
setIsKeyboardFocus(false);
|
|
225
|
+
onBlur?.(e);
|
|
226
|
+
},
|
|
227
|
+
[onBlur],
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
const handleClear = useCallback(() => {
|
|
231
|
+
onValueChange('');
|
|
232
|
+
// Clearing puts the caret back where the user was typing, matching
|
|
233
|
+
// TextInput's built-in clear.
|
|
234
|
+
if (typeof ref === 'object' && ref?.current) {
|
|
235
|
+
ref.current.focus();
|
|
236
|
+
}
|
|
237
|
+
}, [onValueChange, ref]);
|
|
238
|
+
|
|
239
|
+
return (
|
|
240
|
+
<div
|
|
241
|
+
onKeyDown={onContainerKeyDown}
|
|
242
|
+
{...mergeProps(stylex.props(styles.wrapper, xstyle), className, style)}>
|
|
243
|
+
<div
|
|
244
|
+
data-keyboard-focus={isKeyboardFocus ? 'true' : undefined}
|
|
245
|
+
{...stylex.props(
|
|
246
|
+
styles.field,
|
|
247
|
+
isKeyboardFocus && styles.fieldKeyboardFocus,
|
|
248
|
+
)}>
|
|
249
|
+
<Icon icon="search" size="sm" color="secondary" xstyle={styles.icon} />
|
|
250
|
+
<input
|
|
251
|
+
ref={ref}
|
|
252
|
+
type="text"
|
|
253
|
+
aria-label={label}
|
|
254
|
+
placeholder={placeholder}
|
|
255
|
+
value={value}
|
|
256
|
+
onChange={e => onValueChange(e.target.value)}
|
|
257
|
+
onKeyDown={onKeyDown}
|
|
258
|
+
onFocus={handleFocus}
|
|
259
|
+
onBlur={handleBlur}
|
|
260
|
+
{...stylex.props(styles.input)}
|
|
261
|
+
{...props}
|
|
262
|
+
/>
|
|
263
|
+
{value !== '' && (
|
|
264
|
+
<InputClearButton label={clearLabel} onClick={handleClear} />
|
|
265
|
+
)}
|
|
266
|
+
</div>
|
|
267
|
+
</div>
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
PanelSearchInput.displayName = 'PanelSearchInput';
|
|
@@ -59,6 +59,7 @@ import type {BaseProps} from '../BaseProps';
|
|
|
59
59
|
import type {SizeValue} from '../utils/types';
|
|
60
60
|
import {themeProps} from '../utils/themeProps';
|
|
61
61
|
import {useTranslator} from '../i18n';
|
|
62
|
+
import type {TranslatorFn} from '../i18n';
|
|
62
63
|
|
|
63
64
|
function formatFileSize(bytes: number): string {
|
|
64
65
|
if (bytes < 1024) {
|
|
@@ -76,12 +77,13 @@ function validateFiles(
|
|
|
76
77
|
maxSize: number | undefined,
|
|
77
78
|
maxFiles: number | undefined,
|
|
78
79
|
isMultiple: boolean,
|
|
80
|
+
t: TranslatorFn,
|
|
79
81
|
): {valid: File[]; errors: string[]} {
|
|
80
82
|
const errors: string[] = [];
|
|
81
83
|
let valid = files;
|
|
82
84
|
|
|
83
85
|
if (accept) {
|
|
84
|
-
const acceptedTypes = accept.split(',').map(
|
|
86
|
+
const acceptedTypes = accept.split(',').map(s => s.trim().toLowerCase());
|
|
85
87
|
valid = valid.filter(file => {
|
|
86
88
|
const matches = acceptedTypes.some(type => {
|
|
87
89
|
if (type.startsWith('.')) {
|
|
@@ -93,7 +95,9 @@ function validateFiles(
|
|
|
93
95
|
return file.type.toLowerCase() === type;
|
|
94
96
|
});
|
|
95
97
|
if (!matches) {
|
|
96
|
-
errors.push(
|
|
98
|
+
errors.push(
|
|
99
|
+
t('@astryx.fileInput.errorInvalidType', {fileName: file.name}),
|
|
100
|
+
);
|
|
97
101
|
}
|
|
98
102
|
return matches;
|
|
99
103
|
});
|
|
@@ -102,7 +106,12 @@ function validateFiles(
|
|
|
102
106
|
if (maxSize != null) {
|
|
103
107
|
valid = valid.filter(file => {
|
|
104
108
|
if (file.size > maxSize) {
|
|
105
|
-
errors.push(
|
|
109
|
+
errors.push(
|
|
110
|
+
t('@astryx.fileInput.errorMaxSize', {
|
|
111
|
+
fileName: file.name,
|
|
112
|
+
maxSize: formatFileSize(maxSize),
|
|
113
|
+
}),
|
|
114
|
+
);
|
|
106
115
|
return false;
|
|
107
116
|
}
|
|
108
117
|
return true;
|
|
@@ -110,7 +119,7 @@ function validateFiles(
|
|
|
110
119
|
}
|
|
111
120
|
|
|
112
121
|
if (isMultiple && maxFiles != null && valid.length > maxFiles) {
|
|
113
|
-
errors.push(
|
|
122
|
+
errors.push(t('@astryx.fileInput.errorMaxFiles', {maxFiles}));
|
|
114
123
|
valid = valid.slice(0, maxFiles);
|
|
115
124
|
}
|
|
116
125
|
|
|
@@ -488,7 +497,9 @@ export function FileInput({
|
|
|
488
497
|
.filter(Boolean)
|
|
489
498
|
.join(' ') || undefined;
|
|
490
499
|
|
|
491
|
-
const defaultPlaceholder = isMultiple
|
|
500
|
+
const defaultPlaceholder = isMultiple
|
|
501
|
+
? t('@astryx.fileInput.placeholderMultiple')
|
|
502
|
+
: t('@astryx.fileInput.placeholder');
|
|
492
503
|
const displayPlaceholder = placeholder ?? defaultPlaceholder;
|
|
493
504
|
|
|
494
505
|
const handleFiles = useCallback(
|
|
@@ -503,6 +514,7 @@ export function FileInput({
|
|
|
503
514
|
maxSize,
|
|
504
515
|
maxFiles,
|
|
505
516
|
isMultiple,
|
|
517
|
+
t,
|
|
506
518
|
);
|
|
507
519
|
|
|
508
520
|
if (errors.length > 0) {
|
|
@@ -526,8 +538,8 @@ export function FileInput({
|
|
|
526
538
|
if (errors.length === 0) {
|
|
527
539
|
announce(
|
|
528
540
|
valid.length === 1
|
|
529
|
-
?
|
|
530
|
-
:
|
|
541
|
+
? t('@astryx.fileInput.fileSelected', {fileName: valid[0].name})
|
|
542
|
+
: t('@astryx.fileInput.filesSelected', {count: valid.length}),
|
|
531
543
|
);
|
|
532
544
|
}
|
|
533
545
|
|
|
@@ -547,6 +559,7 @@ export function FileInput({
|
|
|
547
559
|
changeAction,
|
|
548
560
|
startTransition,
|
|
549
561
|
announce,
|
|
562
|
+
t,
|
|
550
563
|
],
|
|
551
564
|
);
|
|
552
565
|
|
|
@@ -679,7 +692,7 @@ export function FileInput({
|
|
|
679
692
|
<>
|
|
680
693
|
<Icon icon="arrowUp" size="md" color="secondary" />
|
|
681
694
|
<span {...stylex.props(styles.placeholderText)}>
|
|
682
|
-
{isDragOver ? '
|
|
695
|
+
{isDragOver ? t('@astryx.fileInput.dropHint') : displayPlaceholder}
|
|
683
696
|
</span>
|
|
684
697
|
</>
|
|
685
698
|
);
|
package/src/Grid/Grid.tsx
CHANGED
package/src/Grid/index.ts
CHANGED
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
import {
|
|
16
16
|
useCallback,
|
|
17
17
|
useEffect,
|
|
18
|
-
useMemo,
|
|
19
18
|
useRef,
|
|
20
19
|
type ReactNode,
|
|
21
20
|
type RefCallback,
|
|
@@ -45,18 +44,6 @@ const styles = stylex.create({
|
|
|
45
44
|
boxShadow: shadowVars['--shadow-med'],
|
|
46
45
|
},
|
|
47
46
|
// Position-based margin styles
|
|
48
|
-
marginBlock: {
|
|
49
|
-
marginBlockStart: spacingVars['--spacing-1'],
|
|
50
|
-
marginBlockEnd: spacingVars['--spacing-1'],
|
|
51
|
-
marginInlineStart: 0,
|
|
52
|
-
marginInlineEnd: 0,
|
|
53
|
-
},
|
|
54
|
-
marginInline: {
|
|
55
|
-
marginBlockStart: 0,
|
|
56
|
-
marginBlockEnd: 0,
|
|
57
|
-
marginInlineStart: spacingVars['--spacing-1'],
|
|
58
|
-
marginInlineEnd: spacingVars['--spacing-1'],
|
|
59
|
-
},
|
|
60
47
|
// Content wrapper for padding and mouse events.
|
|
61
48
|
// `display: block` keeps the wrapper a block box even though it renders as a
|
|
62
49
|
// `span` (the layer uses inline-safe phrasing markup so it is valid inside a
|
|
@@ -265,22 +252,13 @@ export function useHoverCard(options: HoverCardOptions = {}): HoverCardReturn {
|
|
|
265
252
|
onHide,
|
|
266
253
|
} = options;
|
|
267
254
|
|
|
268
|
-
// Select margin style based on placement axis
|
|
269
|
-
const marginStyle =
|
|
270
|
-
placement === 'above' || placement === 'below'
|
|
271
|
-
? styles.marginBlock
|
|
272
|
-
: styles.marginInline;
|
|
273
|
-
|
|
274
255
|
const layer = useLayer({
|
|
275
256
|
mode: 'context',
|
|
276
257
|
onShow,
|
|
277
258
|
onHide,
|
|
278
259
|
});
|
|
279
260
|
|
|
280
|
-
const popoverXstyle =
|
|
281
|
-
() => [styles.container, marginStyle],
|
|
282
|
-
[marginStyle],
|
|
283
|
-
);
|
|
261
|
+
const popoverXstyle = styles.container;
|
|
284
262
|
|
|
285
263
|
const showTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
286
264
|
const hideTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
@@ -472,6 +450,7 @@ export function useHoverCard(options: HoverCardOptions = {}): HoverCardReturn {
|
|
|
472
450
|
const renderProps = {
|
|
473
451
|
placement: renderPlacement,
|
|
474
452
|
alignment: props?.alignment ?? alignment,
|
|
453
|
+
offset: spacingVars['--spacing-1'],
|
|
475
454
|
// A named dialog when a label is provided; otherwise a group. A group
|
|
476
455
|
// may validly be unnamed, an unnamed dialog may not — and hover cards
|
|
477
456
|
// are non-modal, so group is honest semantics without a name.
|