@astryxdesign/core 0.7.4 → 0.7.5-canary.07605c2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AlertDialog/AlertDialog.d.ts +2 -2
- package/dist/AlertDialog/index.d.ts +4 -4
- package/dist/AlertDialog/useImperativeAlertDialog.d.ts +1 -1
- package/dist/AppShell/AppShell.d.ts +4 -4
- package/dist/AppShell/index.d.ts +4 -4
- package/dist/AspectRatio/AspectRatio.d.ts +1 -1
- package/dist/AspectRatio/index.d.ts +2 -2
- package/dist/Avatar/Avatar.d.ts +2 -2
- package/dist/Avatar/AvatarStatusDot.d.ts +2 -2
- package/dist/Avatar/index.d.ts +4 -4
- package/dist/AvatarGroup/AvatarGroup.d.ts +2 -2
- package/dist/AvatarGroup/AvatarGroupContext.d.ts +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +1 -1
- package/dist/AvatarGroup/index.d.ts +6 -6
- package/dist/Badge/Badge.d.ts +2 -2
- package/dist/Badge/index.d.ts +2 -2
- package/dist/Banner/Banner.d.ts +4 -4
- package/dist/Banner/index.d.ts +2 -2
- package/dist/Blockquote/Blockquote.d.ts +1 -1
- package/dist/Blockquote/index.d.ts +2 -2
- package/dist/BottomSheet/BottomSheet.d.ts +10 -6
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +12 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts +3 -3
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts +1 -1
- package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts +2 -2
- package/dist/BottomSheet/index.d.ts +4 -4
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +4 -4
- package/dist/Breadcrumbs/Breadcrumbs.d.ts +2 -2
- package/dist/Breadcrumbs/index.d.ts +12 -12
- package/dist/Button/Button.d.ts +4 -4
- package/dist/Button/index.d.ts +2 -2
- package/dist/ButtonGroup/ButtonGroup.d.ts +4 -4
- package/dist/ButtonGroup/index.d.ts +4 -4
- package/dist/Calendar/Calendar.d.ts +3 -3
- package/dist/Calendar/dayCellUtils.d.ts +1 -1
- package/dist/Calendar/getInitialFocusDate.d.ts +2 -2
- package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +1 -1
- package/dist/Calendar/hooks/index.d.ts +6 -6
- package/dist/Calendar/hooks/useCalendarConstraints.d.ts +2 -2
- package/dist/Calendar/hooks/useCalendarDays.d.ts +2 -2
- package/dist/Calendar/hooks/useCalendarNavigation.d.ts +2 -2
- package/dist/Calendar/index.d.ts +5 -5
- package/dist/Calendar/utils.d.ts +1 -1
- package/dist/Card/Card.d.ts +4 -4
- package/dist/Card/index.d.ts +2 -2
- package/dist/Carousel/Carousel.d.ts +2 -2
- package/dist/Carousel/index.d.ts +2 -2
- package/dist/Center/Center.d.ts +2 -2
- package/dist/Center/index.d.ts +2 -2
- package/dist/Chat/ChatComposer.d.ts +1 -1
- package/dist/Chat/ChatComposerDrawer.d.ts +1 -1
- package/dist/Chat/ChatComposerInput.d.ts +4 -4
- package/dist/Chat/ChatDictationButton.d.ts +2 -2
- package/dist/Chat/ChatLayout.d.ts +1 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
- package/dist/Chat/ChatMessage.d.ts +2 -2
- package/dist/Chat/ChatMessageBubble.d.ts +2 -2
- package/dist/Chat/ChatMessageList.d.ts +3 -3
- package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
- package/dist/Chat/ChatSendButton.d.ts +1 -1
- package/dist/Chat/ChatSystemMessage.d.ts +1 -1
- package/dist/Chat/ChatTokenizedText.d.ts +2 -2
- package/dist/Chat/ChatToolCalls.d.ts +1 -1
- package/dist/Chat/index.d.ts +43 -43
- package/dist/Chat/useChatComposerTokens.d.ts +1 -1
- package/dist/Chat/useChatDictation.d.ts +1 -1
- package/dist/Chat/useChatPasteAsToken.d.ts +1 -1
- package/dist/Chat/useTriggerMenu.d.ts +2 -2
- package/dist/CheckboxInput/CheckboxInput.d.ts +4 -4
- package/dist/CheckboxInput/index.d.ts +2 -2
- package/dist/CheckboxList/CheckboxList.d.ts +4 -4
- package/dist/CheckboxList/CheckboxListItem.d.ts +2 -2
- package/dist/CheckboxList/index.d.ts +4 -4
- package/dist/Citation/Citation.d.ts +1 -1
- package/dist/Citation/index.d.ts +2 -2
- package/dist/ClickableCard/ClickableCard.d.ts +3 -3
- package/dist/ClickableCard/index.d.ts +2 -2
- package/dist/Code/Code.d.ts +1 -1
- package/dist/Code/index.d.ts +1 -1
- package/dist/CodeBlock/CodeBlock.d.ts +2 -2
- package/dist/CodeBlock/highlightRanges.d.ts +1 -1
- package/dist/CodeBlock/index.d.ts +8 -8
- package/dist/Collapsible/Collapsible.d.ts +2 -2
- package/dist/Collapsible/CollapsibleGroup.d.ts +2 -2
- package/dist/Collapsible/index.d.ts +7 -7
- package/dist/CommandPalette/CommandPalette.d.ts +2 -2
- package/dist/CommandPalette/CommandPaletteContext.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteFooter.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteList.d.ts +1 -1
- package/dist/CommandPalette/index.d.ts +16 -16
- package/dist/ComplexSelector/ComplexSelector.d.ts +5 -5
- package/dist/ComplexSelector/index.d.ts +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts +4 -4
- package/dist/ContextMenu/index.d.ts +9 -9
- package/dist/DateInput/DateInput.d.ts +7 -7
- package/dist/DateInput/MonthScroller.d.ts +1 -1
- package/dist/DateInput/NativeDateField.d.ts +1 -1
- package/dist/DateInput/TouchDateField.d.ts +1 -1
- package/dist/DateInput/index.d.ts +2 -2
- package/dist/DateInput/monthGeometry.d.ts +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts +6 -6
- package/dist/DateRangeInput/index.d.ts +2 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts +6 -6
- package/dist/DateTimeInput/NativeDateSegment.d.ts +3 -3
- package/dist/DateTimeInput/NativeTimeSegment.d.ts +4 -4
- package/dist/DateTimeInput/TouchDateTimeField.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts +2 -2
- package/dist/Dialog/Dialog.d.ts +3 -3
- package/dist/Dialog/DialogHeader.d.ts +1 -1
- package/dist/Dialog/index.d.ts +6 -6
- package/dist/Dialog/useImperativeDialog.d.ts +1 -1
- package/dist/Divider/Divider.d.ts +2 -2
- package/dist/Divider/index.d.ts +2 -2
- package/dist/Drawer/Drawer.d.ts +3 -3
- package/dist/Drawer/DrawerHeader.d.ts +1 -1
- package/dist/Drawer/index.d.ts +4 -4
- package/dist/DropdownMenu/DropdownMenu.d.ts +5 -5
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +2 -2
- package/dist/DropdownMenu/DropdownMenuDivider.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuGroup.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +2 -2
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +2 -2
- package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts +1 -1
- package/dist/DropdownMenu/index.d.ts +10 -10
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +2 -2
- package/dist/DropdownMenu/renderDropdownItems.d.ts +1 -1
- package/dist/DropdownMenu/useMenuDrillIn.d.ts +1 -1
- package/dist/EmptyState/EmptyState.d.ts +1 -1
- package/dist/EmptyState/index.d.ts +2 -2
- package/dist/Field/Field.d.ts +5 -5
- package/dist/Field/FieldLabel.d.ts +2 -2
- package/dist/Field/PanelSearchInput.d.ts +1 -1
- package/dist/Field/fieldInputFamily.testing.d.ts +1 -1
- package/dist/Field/fieldParts.d.ts +1 -1
- package/dist/Field/index.d.ts +10 -10
- package/dist/Field/inputDisabledFocus.d.ts +14 -0
- package/dist/Field/inputDisabledFocus.d.ts.map +1 -0
- package/dist/Field/inputDisabledFocus.js +19 -0
- package/dist/FieldStatus/FieldStatus.d.ts +3 -3
- package/dist/FieldStatus/index.d.ts +2 -2
- package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts +1 -1
- package/dist/FileInput/FileInput.d.ts +4 -4
- package/dist/FileInput/index.d.ts +2 -2
- package/dist/FormLayout/FormLayout.d.ts +2 -2
- package/dist/FormLayout/index.d.ts +4 -4
- package/dist/Grid/Grid.d.ts +3 -3
- package/dist/Grid/GridSpan.d.ts +1 -1
- package/dist/Grid/index.d.ts +4 -4
- package/dist/HStack/HStack.d.ts +2 -2
- package/dist/HStack/index.d.ts +1 -1
- package/dist/Heading/Heading.d.ts +4 -4
- package/dist/Heading/index.d.ts +1 -1
- package/dist/HoverCard/HoverCard.d.ts +4 -4
- package/dist/HoverCard/index.d.ts +4 -4
- package/dist/HoverCard/useHoverCard.d.ts +2 -2
- package/dist/Icon/Icon.d.ts +3 -3
- package/dist/Icon/IconDefaultSizeContext.d.ts +1 -1
- package/dist/Icon/defaultIcons.d.ts +1 -1
- package/dist/Icon/globalIconRegistry.d.ts +1 -1
- package/dist/Icon/index.d.ts +5 -5
- package/dist/Icon/useIcon.d.ts +1 -1
- package/dist/IconButton/IconButton.d.ts +1 -1
- package/dist/IconButton/index.d.ts +2 -2
- package/dist/Indicator/CheckIndicator.d.ts +1 -1
- package/dist/Indicator/CheckboxIndicator.d.ts +1 -1
- package/dist/Indicator/RadioIndicator.d.ts +1 -1
- package/dist/Indicator/index.d.ts +8 -8
- package/dist/Indicator/indicatorRegistry.d.ts +2 -2
- package/dist/Indicator/types.d.ts +1 -1
- package/dist/Indicator/useIndicator.d.ts +2 -2
- package/dist/InputGroup/InputGroup.d.ts +2 -2
- package/dist/InputGroup/InputGroupText.d.ts +1 -1
- package/dist/InputGroup/index.d.ts +6 -6
- package/dist/InteractiveRoleContext/InteractiveRoleContext.d.ts +1 -1
- package/dist/InteractiveRoleContext/index.d.ts +1 -1
- package/dist/Item/Item.d.ts +1 -1
- package/dist/Item/ItemSwipeLayer.d.ts +2 -2
- package/dist/Item/index.d.ts +2 -2
- package/dist/Kbd/Kbd.d.ts +1 -1
- package/dist/Kbd/index.d.ts +2 -2
- package/dist/Layer/LayerProvider.d.ts +1 -1
- package/dist/Layer/index.d.ts +18 -18
- package/dist/Layer/layerInset.d.ts +1 -1
- package/dist/Layer/layerSlideRules.d.ts +1 -1
- package/dist/Layer/modalOutlet.d.ts +1 -1
- package/dist/Layer/modalOutlet.js +1 -1
- package/dist/Layer/useLayerDismissal.d.ts +1 -1
- package/dist/Layout/Layout.d.ts +2 -2
- package/dist/Layout/LayoutContent.d.ts +2 -2
- package/dist/Layout/LayoutFooter.d.ts +2 -2
- package/dist/Layout/LayoutHeader.d.ts +2 -2
- package/dist/Layout/LayoutPanel.d.ts +3 -3
- package/dist/Layout/index.d.ts +29 -29
- package/dist/Layout/padding.stylex.d.ts +1 -1
- package/dist/Lightbox/Lightbox.d.ts +1 -1
- package/dist/Lightbox/index.d.ts +4 -4
- package/dist/Lightbox/useLightbox.d.ts +1 -1
- package/dist/Link/Link.d.ts +3 -3
- package/dist/Link/LinkContext.d.ts +1 -1
- package/dist/Link/LinkProvider.d.ts +1 -1
- package/dist/Link/index.d.ts +8 -8
- package/dist/Link/useLinkComponent.d.ts +1 -1
- package/dist/List/List.d.ts +3 -3
- package/dist/List/ListItem.d.ts +2 -2
- package/dist/List/index.d.ts +4 -4
- package/dist/Markdown/Markdown.d.ts +4 -4
- package/dist/Markdown/headingProjection.d.ts +3 -3
- package/dist/Markdown/index.d.ts +7 -7
- package/dist/Markdown/parser/index.d.ts +3 -3
- package/dist/Markdown/parser.d.ts +3 -3
- package/dist/Markdown/plugin-renderer/MarkdownPluginNodeRenderer.d.ts +1 -1
- package/dist/Markdown/plugin-renderer/index.d.ts +2 -2
- package/dist/Markdown/plugins/frontmatter.d.ts +2 -2
- package/dist/Markdown/plugins/headingLinks.d.ts +2 -2
- package/dist/Markdown/plugins/index.d.ts +14 -14
- package/dist/Markdown/plugins/protocol.d.ts +1 -1
- package/dist/Markdown/plugins/semanticFence.d.ts +2 -2
- package/dist/Markdown/plugins/softBreaks.d.ts +1 -1
- package/dist/Markdown/plugins/sourceDecoration.d.ts +2 -2
- package/dist/Markdown/plugins/sourceLines.d.ts +1 -1
- package/dist/Markdown/plugins/textTransform.d.ts +2 -2
- package/dist/Markdown/remark.d.ts +1 -1
- package/dist/Markdown/utils.d.ts +4 -4
- package/dist/MetadataList/MetadataList.d.ts +2 -2
- package/dist/MetadataList/MetadataListItem.d.ts +1 -1
- package/dist/MetadataList/index.d.ts +5 -5
- package/dist/MobileNav/MobileNav.d.ts +1 -1
- package/dist/MobileNav/MobileNavToggle.d.ts +1 -1
- package/dist/MobileNav/index.d.ts +4 -4
- package/dist/MoreMenu/MoreMenu.d.ts +4 -4
- package/dist/MoreMenu/index.d.ts +1 -1
- package/dist/MultiSelector/MultiSelector.d.ts +7 -7
- package/dist/MultiSelector/hooks.d.ts +1 -1
- package/dist/MultiSelector/index.d.ts +3 -3
- package/dist/MultiSelector/types.d.ts +1 -1
- package/dist/NavIcon/NavIcon.d.ts +1 -1
- package/dist/NavIcon/index.d.ts +2 -2
- package/dist/NavMenu/NavHeadingMenu.d.ts +2 -2
- package/dist/NavMenu/NavHeadingMenuItem.d.ts +2 -2
- package/dist/NavMenu/index.d.ts +6 -6
- package/dist/NumberInput/NumberInput.d.ts +8 -8
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +39 -14
- package/dist/NumberInput/index.d.ts +2 -2
- package/dist/NumberInput/numberInputCommit.d.ts +1 -1
- package/dist/NumberInput/numberParser.d.ts +1 -1
- package/dist/Outline/Outline.d.ts +3 -3
- package/dist/Outline/index.d.ts +7 -7
- package/dist/Outline/parseOutlineFromMarkdown.d.ts +2 -2
- package/dist/Outline/useOutlineFromDOM.d.ts +1 -1
- package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -3
- package/dist/Outline/useScrollSpy.d.ts +1 -1
- package/dist/OverflowList/OverflowList.d.ts +2 -2
- package/dist/OverflowList/index.d.ts +2 -2
- package/dist/Overlay/Overlay.d.ts +2 -2
- package/dist/Overlay/index.d.ts +5 -5
- package/dist/Overlay/useOverlay.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts +2 -2
- package/dist/Pagination/index.d.ts +2 -2
- package/dist/Popover/Popover.d.ts +3 -3
- package/dist/Popover/index.d.ts +4 -4
- package/dist/Popover/usePopover.d.ts +2 -2
- package/dist/PowerSearch/PowerSearch.d.ts +5 -5
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +2 -2
- package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
- package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +2 -2
- package/dist/PowerSearch/formatFilterValue.d.ts +3 -3
- package/dist/PowerSearch/index.d.ts +8 -8
- package/dist/PowerSearch/resolveDateTimeRangePart.d.ts +1 -1
- package/dist/PowerSearch/resolveOperatorLabel.d.ts +2 -2
- package/dist/PowerSearch/types.d.ts +1 -1
- package/dist/PowerSearch/useInternalConfig.d.ts +1 -1
- package/dist/PowerSearch/usePowerSearchConfig.d.ts +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts +3 -3
- package/dist/PowerSearch/utils.d.ts +3 -3
- package/dist/ProgressBar/ProgressBar.d.ts +2 -2
- package/dist/ProgressBar/index.d.ts +2 -2
- package/dist/RadioList/RadioList.d.ts +3 -3
- package/dist/RadioList/RadioListItem.d.ts +2 -2
- package/dist/RadioList/index.d.ts +4 -4
- package/dist/Resizable/ResizeHandle.d.ts +2 -2
- package/dist/Resizable/index.d.ts +6 -6
- package/dist/Resizable/useResizable.d.ts +2 -2
- package/dist/Resizable/utils.d.ts +3 -3
- package/dist/ScrollableArea/ScrollableArea.d.ts +3 -3
- package/dist/ScrollableArea/index.d.ts +4 -4
- package/dist/Section/Section.d.ts +3 -3
- package/dist/Section/index.d.ts +2 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts +2 -2
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/index.d.ts +5 -5
- package/dist/SelectableCard/SelectableCard.d.ts +3 -3
- package/dist/SelectableCard/index.d.ts +2 -2
- package/dist/Selector/Selector.d.ts +8 -8
- package/dist/Selector/SelectorOption.d.ts +1 -1
- package/dist/Selector/hooks.d.ts +1 -1
- package/dist/Selector/index.d.ts +4 -4
- package/dist/Selector/types.d.ts +1 -1
- package/dist/Selector/useSelectorPresentation.d.ts +2 -2
- package/dist/Selector/utils.d.ts +1 -1
- package/dist/SideNav/SideNav.d.ts +3 -3
- package/dist/SideNav/SideNavCollapseButton.d.ts +3 -3
- package/dist/SideNav/SideNavHeading.d.ts +2 -2
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +34 -0
- package/dist/SideNav/SideNavItem.d.ts +4 -4
- package/dist/SideNav/SideNavSection.d.ts +1 -1
- package/dist/SideNav/index.d.ts +14 -14
- package/dist/SizeContext/index.d.ts +1 -1
- package/dist/Skeleton/Skeleton.d.ts +1 -1
- package/dist/Skeleton/index.d.ts +2 -2
- package/dist/Slider/Slider.d.ts +3 -3
- package/dist/Slider/index.d.ts +2 -2
- package/dist/Spinner/Spinner.d.ts +1 -1
- package/dist/Spinner/index.d.ts +2 -2
- package/dist/Stack/Stack.d.ts +3 -3
- package/dist/Stack/StackItem.d.ts +2 -2
- package/dist/Stack/index.d.ts +6 -6
- package/dist/Stack/stack.stylex.d.ts +1 -1
- package/dist/StatusDot/StatusDot.d.ts +2 -2
- package/dist/StatusDot/index.d.ts +2 -2
- package/dist/Stepper/Step.d.ts +2 -2
- package/dist/Stepper/Step.d.ts.map +1 -1
- package/dist/Stepper/Step.js +3 -3
- package/dist/Stepper/Stepper.d.ts +2 -2
- package/dist/Stepper/index.d.ts +7 -7
- package/dist/Switch/Switch.d.ts +4 -4
- package/dist/Switch/index.d.ts +2 -2
- package/dist/TabList/Tab.d.ts +2 -2
- package/dist/TabList/TabList.d.ts +3 -3
- package/dist/TabList/TabMenu.d.ts +2 -2
- package/dist/TabList/index.d.ts +8 -8
- package/dist/Table/BaseTable.d.ts +1 -1
- package/dist/Table/Table.d.ts +1 -1
- package/dist/Table/TableBody.d.ts +1 -1
- package/dist/Table/TableCell.d.ts +3 -3
- package/dist/Table/TableContext.d.ts +1 -1
- package/dist/Table/TableFooter.d.ts +1 -1
- package/dist/Table/TableHeader.d.ts +1 -1
- package/dist/Table/TableHeaderCell.d.ts +3 -3
- package/dist/Table/TableRow.d.ts +2 -2
- package/dist/Table/TableSelectionToolbar.d.ts +2 -2
- package/dist/Table/columnUtils.d.ts +1 -1
- package/dist/Table/index.d.ts +54 -54
- package/dist/Table/plugins/columnResize/index.d.ts +2 -2
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts +1 -1
- package/dist/Table/plugins/columnSettings/index.d.ts +4 -4
- package/dist/Table/plugins/columnSettings/useTableColumnSettings.d.ts +2 -2
- package/dist/Table/plugins/columnSettings/useTableColumnSettingsState.d.ts +1 -1
- package/dist/Table/plugins/filtering/index.d.ts +4 -4
- package/dist/Table/plugins/filtering/useTableFilterState.d.ts +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts +2 -2
- package/dist/Table/plugins/groupedRows/index.d.ts +2 -2
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
- package/dist/Table/plugins/pagination/index.d.ts +3 -3
- package/dist/Table/plugins/pagination/useTablePagination.d.ts +1 -1
- package/dist/Table/plugins/rowExpansion/index.d.ts +2 -2
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +1 -1
- package/dist/Table/plugins/rowIndex/index.d.ts +2 -2
- package/dist/Table/plugins/rowIndex/useTableRowIndex.d.ts +1 -1
- package/dist/Table/plugins/rowStatus/index.d.ts +2 -2
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +2 -2
- package/dist/Table/plugins/selection/index.d.ts +4 -4
- package/dist/Table/plugins/selection/useTableSelection.d.ts +1 -1
- package/dist/Table/plugins/selection/useTableSelectionState.d.ts +1 -1
- package/dist/Table/plugins/sortable/index.d.ts +4 -4
- package/dist/Table/plugins/sortable/useTableSortable.d.ts +1 -1
- package/dist/Table/plugins/sortable/useTableSortableState.d.ts +1 -1
- package/dist/Table/plugins/stickyColumns/index.d.ts +2 -2
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts +1 -1
- package/dist/Table/plugins/tree/index.d.ts +4 -4
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +1 -1
- package/dist/Table/plugins/tree/useTableTreeState.d.ts +1 -1
- package/dist/Table/tableContextMenu.d.ts +2 -2
- package/dist/Table/types.d.ts +3 -3
- package/dist/Table/useBaseTablePlugins.d.ts +1 -1
- package/dist/Table/useTableCellStyles.d.ts +2 -2
- package/dist/Table/utils.d.ts +2 -2
- package/dist/Text/Text.d.ts +3 -3
- package/dist/Text/index.d.ts +4 -4
- package/dist/TextArea/TextArea.d.ts +10 -8
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +14 -11
- package/dist/TextArea/index.d.ts +2 -2
- package/dist/TextInput/TextInput.d.ts +11 -9
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +20 -11
- package/dist/TextInput/index.d.ts +2 -2
- package/dist/Thumbnail/Thumbnail.d.ts +1 -1
- package/dist/Thumbnail/index.d.ts +2 -2
- package/dist/TimeInput/TimeInput.d.ts +6 -6
- package/dist/TimeInput/TouchTimeField.d.ts +1 -1
- package/dist/TimeInput/index.d.ts +3 -3
- package/dist/Timer/Timer.d.ts +2 -2
- package/dist/Timer/index.d.ts +2 -2
- package/dist/Timestamp/Timestamp.d.ts +3 -3
- package/dist/Timestamp/TimestampHoverCard.d.ts +1 -1
- package/dist/Timestamp/formatInstant.d.ts +2 -2
- package/dist/Timestamp/formatRelativeTime.d.ts +1 -1
- package/dist/Timestamp/index.d.ts +3 -3
- package/dist/Timestamp/tooltipEntries.d.ts +2 -2
- package/dist/Toast/Toast.d.ts +2 -2
- package/dist/Toast/ToastContext.d.ts +1 -1
- package/dist/Toast/ToastViewport.d.ts +2 -2
- package/dist/Toast/index.d.ts +6 -6
- package/dist/Toast/useToast.d.ts +1 -1
- package/dist/ToggleButton/ToggleButton.d.ts +3 -3
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +1 -1
- package/dist/ToggleButton/index.d.ts +4 -4
- package/dist/Token/Token.d.ts +2 -2
- package/dist/Token/TokenLink.d.ts +1 -1
- package/dist/Token/index.d.ts +2 -2
- package/dist/Tokenizer/Tokenizer.d.ts +6 -6
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +44 -40
- package/dist/Tokenizer/index.d.ts +2 -2
- package/dist/Tokenizer/useEndLaneReserve.d.ts +3 -2
- package/dist/Tokenizer/useEndLaneReserve.d.ts.map +1 -1
- package/dist/Tokenizer/useEndLaneReserve.js +3 -2
- package/dist/Toolbar/Toolbar.d.ts +4 -4
- package/dist/Toolbar/index.d.ts +2 -2
- package/dist/Tooltip/Tooltip.d.ts +3 -3
- package/dist/Tooltip/index.d.ts +4 -4
- package/dist/Tooltip/useTooltip.d.ts +2 -2
- package/dist/TopNav/TopNav.d.ts +1 -1
- package/dist/TopNav/TopNavHeading.d.ts +2 -2
- package/dist/TopNav/TopNavItem.d.ts +3 -3
- package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.d.ts +2 -2
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/index.d.ts +16 -16
- package/dist/TreeList/TreeList.d.ts +3 -3
- package/dist/TreeList/TreeListItem.d.ts +1 -1
- package/dist/TreeList/TreeListTypes.d.ts +1 -1
- package/dist/TreeList/index.d.ts +3 -3
- package/dist/Typeahead/BaseTypeahead.d.ts +2 -2
- package/dist/Typeahead/Typeahead.d.ts +6 -6
- package/dist/Typeahead/TypeaheadItem.d.ts +2 -2
- package/dist/Typeahead/createStaticSource.d.ts +1 -1
- package/dist/Typeahead/index.d.ts +9 -9
- package/dist/Typeahead/utils.d.ts +3 -3
- package/dist/VStack/VStack.d.ts +2 -2
- package/dist/VStack/index.d.ts +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.d.ts +24 -6
- package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.js +24 -5
- package/dist/VisuallyHidden/index.d.ts +2 -2
- package/dist/astryx.css +6 -13
- package/dist/hooks/index.d.ts +52 -52
- package/dist/hooks/useAutoMediaMode.d.ts +1 -1
- package/dist/hooks/useInputContainer.d.ts +1 -1
- package/dist/hooks/useInputStatusIcon.d.ts +3 -3
- package/dist/hooks/useMenuPress.d.ts +1 -1
- package/dist/hooks/usePressFeedback.d.ts +1 -1
- package/dist/hooks/useScrollableArea.d.ts +1 -1
- package/dist/i18n/InternationalizationContext.d.ts +2 -2
- package/dist/i18n/InternationalizationProvider.d.ts +1 -1
- package/dist/i18n/index.d.ts +12 -12
- package/dist/i18n/resolve.d.ts +1 -1
- package/dist/i18n/useLocale.d.ts +1 -1
- package/dist/index.d.ts +111 -111
- package/dist/theme/Theme.d.ts +2 -2
- package/dist/theme/contrast.d.ts +1 -1
- package/dist/theme/defineTheme.d.ts +12 -12
- package/dist/theme/domainTokens/index.d.ts +6 -6
- package/dist/theme/generateThemeRules.d.ts +1 -1
- package/dist/theme/index.d.ts +31 -31
- package/dist/theme/localTokens.d.ts +1 -1
- package/dist/theme/mergeComponents.d.ts +1 -1
- package/dist/theme/onMediaTokens.d.ts +1 -1
- package/dist/theme/resolveThemeValues.d.ts +7 -7
- package/dist/theme/syntax/SyntaxTheme.d.ts +1 -1
- package/dist/theme/syntax/index.d.ts +7 -7
- package/dist/theme/syntax/presets.d.ts +1 -1
- package/dist/theme/themeAdaptations.d.ts +5 -5
- package/dist/theme/themeRegistry.d.ts +1 -1
- package/dist/theme/tokens.d.ts +1 -1
- package/dist/theme/types.d.ts +1 -1
- package/dist/theme/useTheme.d.ts +2 -2
- package/dist/utils/dateParser.d.ts +3 -3
- package/dist/utils/groupItems.d.ts +1 -1
- package/dist/utils/index.d.ts +29 -29
- package/dist/utils/plainDate.d.ts +3 -3
- package/package.json +5 -5
- package/src/Badge/Badge.doc.mjs +2 -1
- package/src/BottomSheet/BottomSheet.tsx +12 -1
- package/src/BottomSheet/__tests__/BottomSheetToastOutlet.a11y.chromium.spec.ts +82 -0
- package/src/Field/inputDisabledFocus.ts +28 -0
- package/src/Icon/Icon.spec.md +40 -29
- package/src/Layer/modalOutlet.ts +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +6 -6
- package/src/NumberInput/NumberInput.test.tsx +126 -14
- package/src/NumberInput/NumberInput.tsx +62 -16
- package/src/Pagination/Pagination.test.tsx +2 -2
- package/src/SideNav/SideNav.test.tsx +15 -6
- package/src/SideNav/SideNavHeading.tsx +41 -0
- package/src/Stepper/Step.tsx +7 -0
- package/src/Stepper/Stepper.test.tsx +33 -0
- package/src/TextArea/TextArea.doc.mjs +6 -6
- package/src/TextArea/TextArea.test.tsx +65 -6
- package/src/TextArea/TextArea.tsx +26 -14
- package/src/TextInput/TextInput.doc.mjs +8 -8
- package/src/TextInput/TextInput.test.tsx +72 -6
- package/src/TextInput/TextInput.tsx +32 -14
- package/src/Toast/ToastViewport.modalHost.test.tsx +139 -4
- package/src/Tokenizer/Tokenizer.test.tsx +26 -8
- package/src/Tokenizer/Tokenizer.tsx +65 -72
- package/src/Tokenizer/__tests__/TokenizerEndLane.a11y.chromium.spec.ts +471 -0
- package/src/Tokenizer/useEndLaneReserve.ts +3 -2
- package/src/VisuallyHidden/VisuallyHidden.doc.mjs +1 -1
- package/src/VisuallyHidden/VisuallyHidden.test.tsx +39 -0
- package/src/VisuallyHidden/VisuallyHidden.tsx +38 -5
package/src/Icon/Icon.spec.md
CHANGED
|
@@ -27,7 +27,7 @@ architecture:
|
|
|
27
27
|
architecture:public-component-api,
|
|
28
28
|
]
|
|
29
29
|
contributing: []
|
|
30
|
-
system_specs: []
|
|
30
|
+
system_specs: [spec:AST-087]
|
|
31
31
|
---
|
|
32
32
|
|
|
33
33
|
# Icon component contract
|
|
@@ -53,6 +53,7 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
53
53
|
**Owns**
|
|
54
54
|
|
|
55
55
|
- Accepting a semantic icon key or a supplied icon component as the glyph source.
|
|
56
|
+
- Passing the resolved size and a variant the entry can receive to a registry entry.
|
|
56
57
|
- Resolving explicit, component-owned contextual, and standalone size defaults.
|
|
57
58
|
- Applying Icon's size, color, theming target, and accessibility semantics to
|
|
58
59
|
the rendered glyph.
|
|
@@ -71,12 +72,13 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
71
72
|
|
|
72
73
|
## Public concepts
|
|
73
74
|
|
|
74
|
-
| Concept | Closed values or states | Meaning
|
|
75
|
-
| ------------- | --------------------------------------------------------- |
|
|
76
|
-
| Glyph source | semantic key, namespaced extension key, or icon component | Selects the visual symbol.
|
|
77
|
-
| Size | `xsm`, `sm`, `md`, `lg` | Selects the icon box size.
|
|
78
|
-
| Color | documented semantic and palette values | Selects the glyph color or inherits it from context.
|
|
79
|
-
| Accessibility | decorative or meaningfully labelled | Controls whether assistive technology receives the glyph.
|
|
75
|
+
| Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
|
|
76
|
+
| ------------- | --------------------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------ | ----------------------------------------------- | ---------------- | --------- | --------------------------------------------------------------------------------- |
|
|
77
|
+
| Glyph source | semantic key, namespaced extension key, or icon component | Selects the visual symbol. | Every render | Required | `component:Icon` | Stable | TypeScript rejects unsupported built-in string values. |
|
|
78
|
+
| Size | `xsm`, `sm`, `md`, `lg` | Selects the icon box size. | Every rendered glyph | nearest component-owned default; otherwise `md` | `component:Icon` | Stable | TypeScript rejects unsupported values. |
|
|
79
|
+
| Color | documented semantic and palette values | Selects the glyph color or inherits it from context. | Every rendered glyph | `inherit` | `component:Icon` | Stable | TypeScript rejects unsupported values. |
|
|
80
|
+
| Accessibility | decorative or meaningfully labelled | Controls whether assistive technology receives the glyph. | Every rendered glyph | Decorative | `component:Icon` | Stable | Empty labels use the decorative behavior. |
|
|
81
|
+
| Variant | names in `IconVariantMap`; the active theme lists its own | Requests a theme's alternate artwork for a registry glyph. | Registry glyphs only; never a supplied component | None | `component:Icon` | Stable | TypeScript rejects unknown names; an unlisted variant renders the normal artwork. |
|
|
80
82
|
|
|
81
83
|
A namespaced key that does not resolve currently renders nothing. This is
|
|
82
84
|
existing behavior, not an intentional fallback promise.
|
|
@@ -86,13 +88,15 @@ existing behavior, not an intentional fallback promise.
|
|
|
86
88
|
Requirements identify their basis so observed code is not mistaken for an
|
|
87
89
|
intentional decision.
|
|
88
90
|
|
|
89
|
-
| ID | Candidate invariant
|
|
90
|
-
| --- |
|
|
91
|
-
| FR1 | Icon MUST present at most one glyph from the supplied semantic key, namespaced key, or icon component.
|
|
92
|
-
| FR2 | Every rendered glyph MUST carry the `icon` theming target with its resolved size and selected color reflected as target data.
|
|
93
|
-
| FR3 | Icon MUST apply the resolved size as width and height for every glyph, plus font size where needed for 1em-based icon sources. This sizing contract MUST NOT promise an HTML or SVG element type.
|
|
94
|
-
| FR4 | Supported SVG and styling escape hatches MUST retain their established merge and override behavior.
|
|
95
|
-
| FR5 | An explicit Icon `size` MUST win. Without one, Icon MUST use the nearest default supplied by an owning Astryx component for its documented icon slot; without such a default, Icon MUST use `md`.
|
|
91
|
+
| ID | Candidate invariant | Basis | Draft review state |
|
|
92
|
+
| --- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------------- |
|
|
93
|
+
| FR1 | Icon MUST present at most one glyph from the supplied semantic key, namespaced key, or icon component. | Documented promise and current tests. | Settled intent. |
|
|
94
|
+
| FR2 | Every rendered glyph MUST carry the `icon` theming target with its resolved size and selected color reflected as target data. | Current source, docs, and theming tests. | Settled intent. |
|
|
95
|
+
| FR3 | Icon MUST apply the resolved size as width and height for every glyph, plus font size where needed for 1em-based icon sources. This sizing contract MUST NOT promise an HTML or SVG element type. | Human decision, current source, and tests. | Settled intent. |
|
|
96
|
+
| FR4 | Supported SVG and styling escape hatches MUST retain their established merge and override behavior. | Current source and regression tests. | Current compatibility behavior; verify before changing. |
|
|
97
|
+
| FR5 | An explicit Icon `size` MUST win. Without one, Icon MUST use the nearest default supplied by an owning Astryx component for its documented icon slot; without such a default, Icon MUST use `md`. | Component-size precedence and Button sizing decision. | Settled intent. |
|
|
98
|
+
| FR6 | In registry mode, Icon MUST pass `{size, variant}` to the selected entry, where `size` is the size resolved by ORD1 and `variant` is the requested variant when the active theme lists it and, for a theme-supplied entry, the theme that defined the entry lists it too, otherwise `undefined`. A supplied icon component MUST NOT receive `variant`, Icon MUST NOT forward `variant` to the DOM, and the `icon` target MUST NOT reflect it. | `spec:AST-087` FR1–FR5 and FR9. | Settled intent. |
|
|
99
|
+
| FR7 | The `icon` target MUST guarantee `width` and `height` on its `size:*` selectors as reviewed target-specific additions, so a theme sets each size's dimension. Without theme styles, sizes are 12, 16, 20, and 24px at a 16px root and scale with the root font size. | `spec:AST-087` FR10. | Settled intent. |
|
|
96
100
|
|
|
97
101
|
### Allowed variation
|
|
98
102
|
|
|
@@ -109,15 +113,18 @@ intentional decision.
|
|
|
109
113
|
|
|
110
114
|
### Representative states
|
|
111
115
|
|
|
112
|
-
| State | Required invariant
|
|
113
|
-
| -------------------------------- |
|
|
114
|
-
| Semantic key | One resolved glyph carries the `icon` target.
|
|
115
|
-
| Namespaced extension key | A resolved extension glyph carries the `icon` target.
|
|
116
|
-
| Supplied icon component | The supplied glyph carries the `icon` target.
|
|
117
|
-
| Standalone Icon without `size` | The resolved size is `md`.
|
|
118
|
-
| Owned icon slot without `size` | The nearest documented component default is used.
|
|
119
|
-
| Explicit Icon size in owned slot | The explicit Icon size wins over the contextual default.
|
|
120
|
-
| Unresolved namespaced key | No glyph is currently rendered.
|
|
116
|
+
| State | Required invariant | Allowed variation |
|
|
117
|
+
| -------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------- |
|
|
118
|
+
| Semantic key | One resolved glyph carries the `icon` target. | Theme, registry, or built-in artwork. |
|
|
119
|
+
| Namespaced extension key | A resolved extension glyph carries the `icon` target. | Consumer- or library-owned artwork. |
|
|
120
|
+
| Supplied icon component | The supplied glyph carries the `icon` target. | Component implementation and SVG internals. |
|
|
121
|
+
| Standalone Icon without `size` | The resolved size is `md`. | Glyph source and color. |
|
|
122
|
+
| Owned icon slot without `size` | The nearest documented component default is used. | The owning component's declared size mapping. |
|
|
123
|
+
| Explicit Icon size in owned slot | The explicit Icon size wins over the contextual default. | Any supported Icon size. |
|
|
124
|
+
| Unresolved namespaced key | No glyph is currently rendered. | No fallback behavior is established by intent. |
|
|
125
|
+
| Listed variant | The entry receives the size and the variant when its defining theme also lists it. | The theme's artwork for that request. |
|
|
126
|
+
| Unlisted or omitted variant | The entry receives `variant: undefined`. | The theme's normal artwork. |
|
|
127
|
+
| Variant on a supplied component | The component renders as given without `variant`. | Component implementation. |
|
|
121
128
|
|
|
122
129
|
### Transformation and precedence order
|
|
123
130
|
|
|
@@ -172,6 +179,8 @@ not promise a `span`, `svg`, or other element type.
|
|
|
172
179
|
rules for the `icon` target.
|
|
173
180
|
- `architecture:icon-resolution-and-component-slots` owns semantic-key and
|
|
174
181
|
component-slot resolution before Icon renders the selected source.
|
|
182
|
+
- `spec:AST-087` decides the `variant` request, theme-listed variant names, and
|
|
183
|
+
theme-set size dimensions.
|
|
175
184
|
- `architecture:public-component-api` owns admission and compatibility rules for
|
|
176
185
|
Icon's public props and observable defaults.
|
|
177
186
|
- The owning component or family specifies each contextual Icon-size mapping.
|
|
@@ -181,12 +190,14 @@ not promise a `span`, `svg`, or other element type.
|
|
|
181
190
|
|
|
182
191
|
## Verification map
|
|
183
192
|
|
|
184
|
-
| Contract | Verification | Representative states
|
|
185
|
-
| ------------------- | ------------------------------------------------------------------------------ |
|
|
186
|
-
| FR1, FR3, FR5 | `Icon.test.tsx` sizing suites and `IconButton.test.tsx` contextual-size suites | standalone default; Button sizes; explicit override; both modes
|
|
187
|
-
| FR2, FR4 | `Icon.test.tsx` target/styling suites plus source inspection | Both source modes; size and color variants
|
|
188
|
-
| AR1, AR2, AR3 | `Icon.test.tsx` accessible-name suites | Decorative, labelled, explicit ARIA override
|
|
189
|
-
|
|
|
193
|
+
| Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
|
|
194
|
+
| ------------------- | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
|
|
195
|
+
| FR1, FR3, FR5 | `Icon.test.tsx` sizing suites and `IconButton.test.tsx` contextual-size suites | standalone default; Button sizes; explicit override; both modes | Breaking source rendering, standalone fallback, contextual mapping, explicit precedence, or cross-mode sizing fails assertions. | `audit:Icon/behavior` |
|
|
196
|
+
| FR2, FR4 | `Icon.test.tsx` target/styling suites plus source inspection | Both source modes; size and color variants | Removing the target or breaking override composition fails existing assertions; `data-color` reflection currently lacks focused assertions. | `audit:Icon/theming` |
|
|
197
|
+
| AR1, AR2, AR3 | `Icon.test.tsx` accessible-name suites | Decorative, labelled, explicit ARIA override | Changing default or labelled semantics fails accessibility assertions. | `audit:Icon/accessibility` |
|
|
198
|
+
| FR6 | `Icon.test.tsx` variant suites (pending) | listed, unlisted, and omitted variant; no active list; inherited entry under a replaced list; supplied component | An unlisted variant, or one the entry's defining theme does not list, reaches an entry, or `variant` reaches a supplied component or the DOM. | `audit:Icon/behavior` |
|
|
199
|
+
| FR7 | Theme styling tests for each size (pending) | each size with and without theme styles | A themed size does not change the glyph dimension, or an unstyled size changes. | `audit:Icon/theming` |
|
|
200
|
+
| Theming anatomy map | `scripts/check-knowledge.mjs` | Canonical consumer anatomy and current target | Missing, extra, prefixed, or stale mappings fail repository validation. | `audit:Icon/theming` |
|
|
190
201
|
|
|
191
202
|
Focused coverage for `data-color` on both glyph source modes is a checkable test
|
|
192
203
|
gap; source inspection is the current evidence for that part of FR2.
|
package/src/Layer/modalOutlet.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file modalOutlet.ts
|
|
7
|
-
* @input The open Dialog `<dialog>` elements
|
|
7
|
+
* @input The open Dialog and scrim BottomSheet `<dialog>` elements
|
|
8
8
|
* @output Exports useModalOutlet (a modal supplies its outlet),
|
|
9
9
|
* getActiveModalOutlet, and subscribeModalOutlets (a global host follows
|
|
10
10
|
* the latest one)
|
|
@@ -81,7 +81,7 @@ export const docs = {
|
|
|
81
81
|
name: 'isReadOnly',
|
|
82
82
|
type: 'boolean',
|
|
83
83
|
description:
|
|
84
|
-
'Makes the input read-only: the value is shown at full opacity and still submits with the form, but cannot be edited. Unlike isDisabled, a read-only input is not dimmed and
|
|
84
|
+
'Makes the input read-only: the value is shown at full opacity and still submits with the form, but cannot be edited. Unlike isDisabled, a read-only input is not dimmed and keeps its form value. Stepping is off in every form while read-only: arrow keys, the wheel, and the number steppers. isDisabled takes precedence when both are set.',
|
|
85
85
|
default: 'false',
|
|
86
86
|
},
|
|
87
87
|
{
|
|
@@ -308,7 +308,7 @@ export const docs = {
|
|
|
308
308
|
{
|
|
309
309
|
guidance: false,
|
|
310
310
|
description:
|
|
311
|
-
"Wrap a disabled NumberInput in Tooltip to explain why it's disabled
|
|
311
|
+
"Wrap a disabled NumberInput in Tooltip to explain why it's disabled. Use the disabledMessage prop, which attaches the reason to the field itself.",
|
|
312
312
|
},
|
|
313
313
|
],
|
|
314
314
|
anatomy: [
|
|
@@ -401,7 +401,7 @@ export const docsZh = {
|
|
|
401
401
|
name: 'isReadOnly',
|
|
402
402
|
type: 'boolean',
|
|
403
403
|
description:
|
|
404
|
-
'将输入框设为只读:值以完整不透明度显示并仍随表单提交,但无法编辑。与 isDisabled
|
|
404
|
+
'将输入框设为只读:值以完整不透明度显示并仍随表单提交,但无法编辑。与 isDisabled 不同,只读输入框不会变暗,并保留其表单值。只读时所有步进方式均被禁用:方向键、滚轮和步进按钮。同时设置时 isDisabled 优先。',
|
|
405
405
|
default: 'false',
|
|
406
406
|
},
|
|
407
407
|
{
|
|
@@ -613,7 +613,7 @@ export const docsZh = {
|
|
|
613
613
|
{
|
|
614
614
|
guidance: false,
|
|
615
615
|
description:
|
|
616
|
-
"Wrap a disabled NumberInput in Tooltip to explain why it's disabled
|
|
616
|
+
"Wrap a disabled NumberInput in Tooltip to explain why it's disabled. Use the disabledMessage prop, which attaches the reason to the field itself.",
|
|
617
617
|
},
|
|
618
618
|
],
|
|
619
619
|
anatomy: [
|
|
@@ -687,7 +687,7 @@ export const docsDense = {
|
|
|
687
687
|
{
|
|
688
688
|
guidance: false,
|
|
689
689
|
description:
|
|
690
|
-
"Wrap a disabled NumberInput in Tooltip to explain why it's disabled
|
|
690
|
+
"Wrap a disabled NumberInput in Tooltip to explain why it's disabled. Use the disabledMessage prop, which attaches the reason to the field itself.",
|
|
691
691
|
},
|
|
692
692
|
],
|
|
693
693
|
anatomy: [
|
|
@@ -737,7 +737,7 @@ export const docsDense = {
|
|
|
737
737
|
isRequired: 'Field required (mutually exclusive w/ isOptional).',
|
|
738
738
|
isDisabled: 'Input disabled.',
|
|
739
739
|
isReadOnly:
|
|
740
|
-
'Read-only: value visible + still submits, but not editable. Unlike isDisabled: not dimmed
|
|
740
|
+
'Read-only: value visible + still submits, but not editable. Unlike isDisabled: not dimmed.',
|
|
741
741
|
disabledMessage:
|
|
742
742
|
'Explains why input is disabled. With isDisabled, shows tooltip on hover/focus + keeps input focusable via aria-disabled (field becomes read-only). Use instead of wrapping a disabled NumberInput in Tooltip.',
|
|
743
743
|
placeholder: 'Placeholder text.',
|
|
@@ -13,6 +13,8 @@ import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
|
|
|
13
13
|
import {act, useState} from 'react';
|
|
14
14
|
import {render, screen, fireEvent, waitFor} from '@testing-library/react';
|
|
15
15
|
import userEvent from '@testing-library/user-event';
|
|
16
|
+
import * as stylex from '@stylexjs/stylex';
|
|
17
|
+
import {colorVars} from '../theme/tokens.stylex';
|
|
16
18
|
import {TestIcon} from '../__tests__/TestIcon';
|
|
17
19
|
import {InternationalizationProvider} from '../i18n';
|
|
18
20
|
import {registerIcons, resetIcons} from '../Icon';
|
|
@@ -22,6 +24,21 @@ import {defineTheme} from '../theme/defineTheme';
|
|
|
22
24
|
import {generateThemeCSS} from '../theme/generateThemeRules';
|
|
23
25
|
import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
|
|
24
26
|
|
|
27
|
+
// jsdom cannot match `:focus-visible`: compare the ring's StyleX class hash.
|
|
28
|
+
const RING = stylex
|
|
29
|
+
.props(
|
|
30
|
+
stylex.create({
|
|
31
|
+
ring: {
|
|
32
|
+
boxShadow: {
|
|
33
|
+
default: null,
|
|
34
|
+
':has(> [aria-disabled="true"]:focus-visible)': `inset 0px 0px 0px 2px ${colorVars['--color-accent-muted']}`,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
}).ring,
|
|
38
|
+
)
|
|
39
|
+
.className!.split(' ')
|
|
40
|
+
.pop()!;
|
|
41
|
+
|
|
25
42
|
// FieldStatus announces status messages through the persistent useAnnounce
|
|
26
43
|
// singletons; remove them between tests so role/aria-live queries in this
|
|
27
44
|
// file never match a leftover region.
|
|
@@ -149,7 +166,7 @@ describe('NumberInput', () => {
|
|
|
149
166
|
expect(screen.getByRole('spinbutton')).not.toHaveAttribute('aria-required');
|
|
150
167
|
});
|
|
151
168
|
|
|
152
|
-
it('
|
|
169
|
+
it('exposes aria-disabled, not native disabled, when isDisabled is true (spec:AST-085)', () => {
|
|
153
170
|
render(
|
|
154
171
|
<NumberInput
|
|
155
172
|
label="Quantity"
|
|
@@ -158,7 +175,76 @@ describe('NumberInput', () => {
|
|
|
158
175
|
onChange={() => {}}
|
|
159
176
|
/>,
|
|
160
177
|
);
|
|
161
|
-
expect(screen.getByRole('spinbutton')).
|
|
178
|
+
expect(screen.getByRole('spinbutton')).toHaveAttribute(
|
|
179
|
+
'aria-disabled',
|
|
180
|
+
'true',
|
|
181
|
+
);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('keeps a disabled input in the tab order and rings it (spec:AST-085 FR1, FR6)', async () => {
|
|
185
|
+
const user = userEvent.setup();
|
|
186
|
+
render(
|
|
187
|
+
<>
|
|
188
|
+
<NumberInput label="First" value={1} onChange={() => {}} />
|
|
189
|
+
<NumberInput label="Second" value={2} onChange={() => {}} isDisabled />
|
|
190
|
+
</>,
|
|
191
|
+
);
|
|
192
|
+
await user.tab();
|
|
193
|
+
await user.tab();
|
|
194
|
+
const input = screen.getByRole('spinbutton', {name: 'Second'});
|
|
195
|
+
expect(input).toHaveFocus();
|
|
196
|
+
expect(input.parentElement).toHaveClass(RING);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it('runs no caller handler, steps nothing and submits no form while disabled (spec:AST-085 FR2)', async () => {
|
|
200
|
+
const user = userEvent.setup();
|
|
201
|
+
const handlers = {
|
|
202
|
+
onChange: vi.fn(),
|
|
203
|
+
onEnter: vi.fn(),
|
|
204
|
+
onKeyDown: vi.fn(),
|
|
205
|
+
onPaste: vi.fn(),
|
|
206
|
+
};
|
|
207
|
+
const onSubmit = vi.fn((e: React.FormEvent) => e.preventDefault());
|
|
208
|
+
render(
|
|
209
|
+
<form onSubmit={onSubmit}>
|
|
210
|
+
<NumberInput
|
|
211
|
+
label="Quantity"
|
|
212
|
+
value={5}
|
|
213
|
+
isDisabled
|
|
214
|
+
hasNumberSteppers
|
|
215
|
+
{...handlers}
|
|
216
|
+
/>
|
|
217
|
+
</form>,
|
|
218
|
+
);
|
|
219
|
+
await user.click(screen.getByRole('spinbutton'));
|
|
220
|
+
await user.keyboard('{ArrowUp}{ArrowDown}{Enter}');
|
|
221
|
+
await user.paste('9');
|
|
222
|
+
await user.click(screen.getByRole('button', {name: 'Increment Quantity'}));
|
|
223
|
+
for (const handler of [...Object.values(handlers), onSubmit]) {
|
|
224
|
+
expect(handler).not.toHaveBeenCalled();
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it('commits nothing when a field disabled mid-entry loses focus (spec:AST-085 FR2)', async () => {
|
|
229
|
+
const user = userEvent.setup();
|
|
230
|
+
const onChange = vi.fn();
|
|
231
|
+
const field = (isDisabled: boolean) => (
|
|
232
|
+
<NumberInput
|
|
233
|
+
label="Quantity"
|
|
234
|
+
value={5}
|
|
235
|
+
onChange={onChange}
|
|
236
|
+
isDisabled={isDisabled}
|
|
237
|
+
/>
|
|
238
|
+
);
|
|
239
|
+
const {rerender} = render(field(false));
|
|
240
|
+
const input = screen.getByRole('spinbutton');
|
|
241
|
+
await user.clear(input);
|
|
242
|
+
await user.type(input, '8');
|
|
243
|
+
onChange.mockClear();
|
|
244
|
+
rerender(field(true));
|
|
245
|
+
await user.tab();
|
|
246
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
247
|
+
expect(input).toHaveValue('5');
|
|
162
248
|
});
|
|
163
249
|
|
|
164
250
|
it('does not fire onChange when disabled', async () => {
|
|
@@ -1424,10 +1510,10 @@ describe('NumberInput', () => {
|
|
|
1424
1510
|
const increment = screen.getByRole('button', {
|
|
1425
1511
|
name: 'Increment Quantity',
|
|
1426
1512
|
});
|
|
1427
|
-
expect(increment).
|
|
1513
|
+
expect(increment).toHaveAttribute('aria-disabled', 'true');
|
|
1428
1514
|
expect(
|
|
1429
1515
|
screen.getByRole('button', {name: 'Decrement Quantity'}),
|
|
1430
|
-
).
|
|
1516
|
+
).toHaveAttribute('aria-disabled', 'true');
|
|
1431
1517
|
|
|
1432
1518
|
fireEvent.click(increment);
|
|
1433
1519
|
expect(handleChange).not.toHaveBeenCalled();
|
|
@@ -1446,7 +1532,10 @@ describe('NumberInput', () => {
|
|
|
1446
1532
|
/>
|
|
1447
1533
|
</form>,
|
|
1448
1534
|
);
|
|
1449
|
-
expect(screen.getByRole('spinbutton')).
|
|
1535
|
+
expect(screen.getByRole('spinbutton')).toHaveAttribute(
|
|
1536
|
+
'aria-disabled',
|
|
1537
|
+
'true',
|
|
1538
|
+
);
|
|
1450
1539
|
expect([
|
|
1451
1540
|
...new FormData(container.querySelector('form')!).keys(),
|
|
1452
1541
|
]).toEqual([]);
|
|
@@ -1693,7 +1782,7 @@ describe('NumberInput', () => {
|
|
|
1693
1782
|
expect(onChange).not.toHaveBeenCalled();
|
|
1694
1783
|
});
|
|
1695
1784
|
|
|
1696
|
-
it('
|
|
1785
|
+
it('stays focusable when disabled without a reason', () => {
|
|
1697
1786
|
render(
|
|
1698
1787
|
<NumberInput
|
|
1699
1788
|
label="Quantity"
|
|
@@ -1703,8 +1792,8 @@ describe('NumberInput', () => {
|
|
|
1703
1792
|
/>,
|
|
1704
1793
|
);
|
|
1705
1794
|
const input = screen.getByRole('spinbutton');
|
|
1706
|
-
expect(input).toBeDisabled();
|
|
1707
|
-
expect(input).
|
|
1795
|
+
expect(input).not.toBeDisabled();
|
|
1796
|
+
expect(input).toHaveAttribute('aria-disabled', 'true');
|
|
1708
1797
|
});
|
|
1709
1798
|
});
|
|
1710
1799
|
});
|
|
@@ -2006,14 +2095,14 @@ describe('NumberInput stepping', () => {
|
|
|
2006
2095
|
|
|
2007
2096
|
const input = screen.getByRole('spinbutton');
|
|
2008
2097
|
const increment = screen.getByRole('button', {name: 'Increment Amount'});
|
|
2009
|
-
expect(increment).
|
|
2098
|
+
expect(increment).not.toHaveAttribute('aria-disabled');
|
|
2010
2099
|
|
|
2011
2100
|
fireEvent.click(increment);
|
|
2012
2101
|
|
|
2013
2102
|
expect(input).toHaveValue('99.99');
|
|
2014
2103
|
expect(input).toHaveAttribute('aria-valuenow', '99.99');
|
|
2015
2104
|
expect(input).not.toHaveAttribute('aria-invalid');
|
|
2016
|
-
expect(increment).
|
|
2105
|
+
expect(increment).toHaveAttribute('aria-disabled', 'true');
|
|
2017
2106
|
});
|
|
2018
2107
|
|
|
2019
2108
|
it('allows wheel stepping by default and consumes the focused gesture', () => {
|
|
@@ -2259,10 +2348,33 @@ describe('NumberInput stepping', () => {
|
|
|
2259
2348
|
);
|
|
2260
2349
|
expect(
|
|
2261
2350
|
screen.getByRole('button', {name: 'Increment Quantity'}),
|
|
2262
|
-
).
|
|
2351
|
+
).toHaveAttribute('aria-disabled', 'true');
|
|
2263
2352
|
expect(
|
|
2264
2353
|
screen.getByRole('button', {name: 'Decrement Quantity'}),
|
|
2265
|
-
).not.
|
|
2354
|
+
).not.toHaveAttribute('aria-disabled');
|
|
2355
|
+
});
|
|
2356
|
+
|
|
2357
|
+
it('commits nothing from a click on the stepper at the reached boundary (spec:AST-085 FR2)', async () => {
|
|
2358
|
+
const user = userEvent.setup();
|
|
2359
|
+
const onChange = vi.fn();
|
|
2360
|
+
render(
|
|
2361
|
+
<NumberInput
|
|
2362
|
+
label="Quantity"
|
|
2363
|
+
value={5}
|
|
2364
|
+
onChange={onChange}
|
|
2365
|
+
min={0}
|
|
2366
|
+
max={10}
|
|
2367
|
+
hasNumberSteppers
|
|
2368
|
+
/>,
|
|
2369
|
+
);
|
|
2370
|
+
const input = screen.getByRole('spinbutton');
|
|
2371
|
+
await user.clear(input);
|
|
2372
|
+
await user.type(input, '10');
|
|
2373
|
+
onChange.mockClear();
|
|
2374
|
+
await user.click(
|
|
2375
|
+
screen.getByRole('button', {name: 'Increment Quantity'}),
|
|
2376
|
+
);
|
|
2377
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
2266
2378
|
});
|
|
2267
2379
|
|
|
2268
2380
|
it('disables both steppers with the input', () => {
|
|
@@ -2277,10 +2389,10 @@ describe('NumberInput stepping', () => {
|
|
|
2277
2389
|
);
|
|
2278
2390
|
expect(
|
|
2279
2391
|
screen.getByRole('button', {name: 'Increment Quantity'}),
|
|
2280
|
-
).
|
|
2392
|
+
).toHaveAttribute('aria-disabled', 'true');
|
|
2281
2393
|
expect(
|
|
2282
2394
|
screen.getByRole('button', {name: 'Decrement Quantity'}),
|
|
2283
|
-
).
|
|
2395
|
+
).toHaveAttribute('aria-disabled', 'true');
|
|
2284
2396
|
});
|
|
2285
2397
|
});
|
|
2286
2398
|
});
|
|
@@ -53,6 +53,7 @@ import {useTooltip} from '../Tooltip';
|
|
|
53
53
|
import {getInputARIA} from '../utils';
|
|
54
54
|
import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
|
|
55
55
|
import {usePressFeedback} from '../hooks/usePressFeedback';
|
|
56
|
+
import {inputDisabledFocusStyles} from '../Field/inputDisabledFocus';
|
|
56
57
|
import {useSize} from '../SizeContext/SizeContext';
|
|
57
58
|
import {useInputContainer} from '../hooks/useInputContainer';
|
|
58
59
|
import {useInputStatusIcon} from '../hooks/useInputStatusIcon';
|
|
@@ -261,7 +262,7 @@ interface NumberInputPropsBase extends Omit<
|
|
|
261
262
|
* Whether the input is read-only.
|
|
262
263
|
* The value is shown at full opacity and still submits with the form, but
|
|
263
264
|
* cannot be edited. Unlike `isDisabled`, a read-only input is not dimmed and
|
|
264
|
-
*
|
|
265
|
+
* keeps its form value — use it for a value the user should see and send
|
|
265
266
|
* but not change. Stepping is off in every form while read-only: arrow keys,
|
|
266
267
|
* the wheel, and the number steppers. `isDisabled` takes precedence when both
|
|
267
268
|
* are set.
|
|
@@ -275,8 +276,8 @@ interface NumberInputPropsBase extends Omit<
|
|
|
275
276
|
* keyboard and assistive technology. The field cannot be edited (it becomes
|
|
276
277
|
* read-only) while disabled.
|
|
277
278
|
*
|
|
278
|
-
* Use this instead of wrapping a disabled input in `Tooltip
|
|
279
|
-
*
|
|
279
|
+
* Use this instead of wrapping a disabled input in `Tooltip`, so the reason
|
|
280
|
+
* is attached to the field itself.
|
|
280
281
|
*
|
|
281
282
|
* @example
|
|
282
283
|
* ```
|
|
@@ -600,12 +601,20 @@ export function NumberInput({
|
|
|
600
601
|
const [pendingInput, setPendingInput] = useState<string | null>(null);
|
|
601
602
|
const [isFocused, setIsFocused] = useState(false);
|
|
602
603
|
|
|
603
|
-
// Disabled-reason tooltip.
|
|
604
|
-
// tooltip listeners attach to the input container (which already exists) and
|
|
604
|
+
// Disabled-reason tooltip. The tooltip listeners attach to the input container (which already exists) and
|
|
605
605
|
// the input stays perceivable via aria-disabled instead of the native
|
|
606
606
|
// disabled attribute. The field is made read-only so it can't be typed into,
|
|
607
607
|
// and value mutation is blocked by the isDisabled guard in the handlers.
|
|
608
608
|
const showsDisabledMessage = isDisabled && !!disabledMessage;
|
|
609
|
+
// A disabled field keeps its tab stop but, like a natively disabled one,
|
|
610
|
+
// runs no caller event handler other than focus and blur (`spec:AST-085` FR2).
|
|
611
|
+
const fieldProps = isDisabled
|
|
612
|
+
? Object.fromEntries(
|
|
613
|
+
Object.entries(rest).filter(
|
|
614
|
+
([key]) => !/^on[A-Z]/.test(key) || /^on(Focus|Blur)/.test(key),
|
|
615
|
+
),
|
|
616
|
+
)
|
|
617
|
+
: rest;
|
|
609
618
|
const disabledMessageTooltip = useTooltip({
|
|
610
619
|
placement: 'above',
|
|
611
620
|
// The container div is not naturally focusable; focusin bubbles up from
|
|
@@ -699,6 +708,12 @@ export function NumberInput({
|
|
|
699
708
|
if (pendingInput === null) {
|
|
700
709
|
return;
|
|
701
710
|
}
|
|
711
|
+
if (isDisabled) {
|
|
712
|
+
// A field disabled mid-entry commits nothing; its draft is dropped, as
|
|
713
|
+
// a natively disabled field's was (spec:AST-085 FR2).
|
|
714
|
+
setPendingInput(null);
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
702
717
|
|
|
703
718
|
const decision = resolveNumberInputCommit(pendingInput, {
|
|
704
719
|
min,
|
|
@@ -722,7 +737,17 @@ export function NumberInput({
|
|
|
722
737
|
onChange(decision.value);
|
|
723
738
|
}
|
|
724
739
|
},
|
|
725
|
-
[
|
|
740
|
+
[
|
|
741
|
+
hasClear,
|
|
742
|
+
isDisabled,
|
|
743
|
+
isIntegerOnly,
|
|
744
|
+
locale,
|
|
745
|
+
max,
|
|
746
|
+
min,
|
|
747
|
+
onChange,
|
|
748
|
+
pendingInput,
|
|
749
|
+
value,
|
|
750
|
+
],
|
|
726
751
|
);
|
|
727
752
|
|
|
728
753
|
// Blur ends the edit and displays the resulting committed value.
|
|
@@ -780,6 +805,13 @@ export function NumberInput({
|
|
|
780
805
|
// Handle keyboard events
|
|
781
806
|
const handleKeyDown = useCallback(
|
|
782
807
|
(e: KeyboardEvent<HTMLInputElement>) => {
|
|
808
|
+
if (isDisabled) {
|
|
809
|
+
// A read-only field still submits its form on Enter.
|
|
810
|
+
if (e.key === 'Enter') {
|
|
811
|
+
e.preventDefault();
|
|
812
|
+
}
|
|
813
|
+
return;
|
|
814
|
+
}
|
|
783
815
|
// The field is type="text" for formatted display, so an IME can compose
|
|
784
816
|
// into it: Enter commits the candidate and the arrows walk the candidate
|
|
785
817
|
// window. The composing keydown fires before compositionend, so without
|
|
@@ -804,7 +836,7 @@ export function NumberInput({
|
|
|
804
836
|
}
|
|
805
837
|
onKeyDown?.(e);
|
|
806
838
|
},
|
|
807
|
-
[commitPendingInput, onEnter, onKeyDown, stepValue],
|
|
839
|
+
[commitPendingInput, isDisabled, onEnter, onKeyDown, stepValue],
|
|
808
840
|
);
|
|
809
841
|
|
|
810
842
|
// React's delegated wheel listener can be passive, so use a native,
|
|
@@ -902,6 +934,7 @@ export function NumberInput({
|
|
|
902
934
|
hasNumberSteppers && styles.wrapperWithNumberSteppers,
|
|
903
935
|
sizeStyles[size],
|
|
904
936
|
isDisabled && inputWrapperStyles.disabled,
|
|
937
|
+
isDisabled && inputDisabledFocusStyles.ring,
|
|
905
938
|
status && inputStatusBorderStyles[status.type],
|
|
906
939
|
status && !isDisabled && inputStatusHoverShadowStyles[status.type],
|
|
907
940
|
status && inputStatusFocusWithinStyles[status.type],
|
|
@@ -914,7 +947,7 @@ export function NumberInput({
|
|
|
914
947
|
{startIcon && renderIconSlot(startIcon, {size: 'sm', color: 'secondary'})}
|
|
915
948
|
{inputGroup && <VisuallyHidden id={inputLabelID}>{label}</VisuallyHidden>}
|
|
916
949
|
<input
|
|
917
|
-
{...
|
|
950
|
+
{...fieldProps}
|
|
918
951
|
ref={mergedInputRef}
|
|
919
952
|
id={id}
|
|
920
953
|
name={isDisabled || formatValue ? undefined : htmlName}
|
|
@@ -928,12 +961,11 @@ export function NumberInput({
|
|
|
928
961
|
onBlur={handleBlur}
|
|
929
962
|
onKeyDown={handleKeyDown}
|
|
930
963
|
placeholder={placeholder}
|
|
931
|
-
//
|
|
932
|
-
//
|
|
933
|
-
//
|
|
934
|
-
disabled={isDisabled
|
|
935
|
-
|
|
936
|
-
readOnly={isReadOnly || showsDisabledMessage || undefined}
|
|
964
|
+
// A disabled input keeps its place in the tab order (spec:AST-085):
|
|
965
|
+
// aria-disabled instead of the native attribute, with readOnly + the
|
|
966
|
+
// handler guards keeping the value from changing.
|
|
967
|
+
aria-disabled={isDisabled ? 'true' : undefined}
|
|
968
|
+
readOnly={isReadOnly || isDisabled || undefined}
|
|
937
969
|
autoFocus={hasAutoFocus}
|
|
938
970
|
data-autofocus={hasAutoFocus || undefined}
|
|
939
971
|
aria-valuemin={min ?? undefined}
|
|
@@ -992,10 +1024,17 @@ export function NumberInput({
|
|
|
992
1024
|
type="button"
|
|
993
1025
|
tabIndex={-1}
|
|
994
1026
|
{...pressable}
|
|
995
|
-
disabled={
|
|
1027
|
+
aria-disabled={
|
|
1028
|
+
isDisabled || isReadOnly || !canIncrement || undefined
|
|
1029
|
+
}
|
|
996
1030
|
aria-label={t('@astryx.numberInput.incrementLabel', {label})}
|
|
997
1031
|
onPointerDown={event => event.preventDefault()}
|
|
998
1032
|
onClick={() => {
|
|
1033
|
+
// An aria-disabled stepper does nothing, as a natively disabled
|
|
1034
|
+
// one did (spec:AST-085 FR2).
|
|
1035
|
+
if (isDisabled || isReadOnly || !canIncrement) {
|
|
1036
|
+
return;
|
|
1037
|
+
}
|
|
999
1038
|
inputRef.current?.focus();
|
|
1000
1039
|
stepValue(1);
|
|
1001
1040
|
}}
|
|
@@ -1016,10 +1055,17 @@ export function NumberInput({
|
|
|
1016
1055
|
type="button"
|
|
1017
1056
|
tabIndex={-1}
|
|
1018
1057
|
{...pressable}
|
|
1019
|
-
disabled={
|
|
1058
|
+
aria-disabled={
|
|
1059
|
+
isDisabled || isReadOnly || !canDecrement || undefined
|
|
1060
|
+
}
|
|
1020
1061
|
aria-label={t('@astryx.numberInput.decrementLabel', {label})}
|
|
1021
1062
|
onPointerDown={event => event.preventDefault()}
|
|
1022
1063
|
onClick={() => {
|
|
1064
|
+
// An aria-disabled stepper does nothing, as a natively disabled
|
|
1065
|
+
// one did (spec:AST-085 FR2).
|
|
1066
|
+
if (isDisabled || isReadOnly || !canDecrement) {
|
|
1067
|
+
return;
|
|
1068
|
+
}
|
|
1023
1069
|
inputRef.current?.focus();
|
|
1024
1070
|
stepValue(-1);
|
|
1025
1071
|
}}
|
|
@@ -965,7 +965,7 @@ describe('Pagination', () => {
|
|
|
965
965
|
/>,
|
|
966
966
|
);
|
|
967
967
|
const box = screen.getByRole('spinbutton', {name: 'Go to page'});
|
|
968
|
-
expect(box).
|
|
968
|
+
expect(box).toHaveAttribute('aria-disabled', 'true');
|
|
969
969
|
// Disabled input never fires a change.
|
|
970
970
|
await user.type(box, '5{Enter}');
|
|
971
971
|
expect(onChange).not.toHaveBeenCalled();
|
|
@@ -999,7 +999,7 @@ describe('Pagination', () => {
|
|
|
999
999
|
// editable box is inert rather than accepting entries it can't resolve.
|
|
1000
1000
|
expect(
|
|
1001
1001
|
screen.getByRole('spinbutton', {name: 'Go to page'}),
|
|
1002
|
-
).
|
|
1002
|
+
).toHaveAttribute('aria-disabled', 'true');
|
|
1003
1003
|
});
|
|
1004
1004
|
|
|
1005
1005
|
it('renders the localized "Page" label by default and a custom pageLabel', () => {
|