@astryxdesign/core 0.1.4-canary.fd7ab46 → 0.1.4
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 +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +18 -20
- package/dist/AlertDialog/useImperativeAlertDialog.js +3 -3
- package/dist/AppShell/AppShell.d.ts +1 -1
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +53 -55
- package/dist/AspectRatio/AspectRatio.d.ts +10 -48
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +12 -33
- package/dist/AspectRatio/index.d.ts +1 -1
- package/dist/AspectRatio/index.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +25 -27
- package/dist/Avatar/AvatarStatusDot.js +5 -5
- package/dist/AvatarGroup/AvatarGroup.js +5 -5
- package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
- package/dist/Badge/Badge.js +3 -3
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +25 -32
- package/dist/Blockquote/Blockquote.js +7 -7
- package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
- package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
- package/dist/Button/Button.js +19 -19
- package/dist/ButtonGroup/ButtonGroup.js +7 -7
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +48 -68
- package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
- package/dist/Calendar/styles.d.ts +2 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +2 -2
- package/dist/Card/Card.d.ts +2 -4
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +10 -18
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +21 -24
- package/dist/Carousel/carousel.markers.stylex.d.ts +7 -0
- package/dist/Carousel/carousel.markers.stylex.d.ts.map +1 -0
- package/dist/Carousel/carousel.markers.stylex.js +12 -0
- package/dist/Center/Center.js +3 -3
- package/dist/Chat/ChatComposer.js +23 -23
- package/dist/Chat/ChatComposerDrawer.js +14 -14
- package/dist/Chat/ChatComposerInput.d.ts +1 -1
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +15 -27
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +11 -13
- package/dist/Chat/ChatLayout.js +17 -17
- package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +10 -12
- package/dist/Chat/ChatMessage.js +12 -12
- package/dist/Chat/ChatMessageBubble.js +7 -7
- package/dist/Chat/ChatMessageList.js +14 -14
- package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +12 -14
- package/dist/Chat/ChatPastedTextToken.js +13 -13
- package/dist/Chat/ChatSendButton.js +3 -3
- package/dist/Chat/ChatSystemMessage.d.ts +1 -1
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +17 -17
- package/dist/Chat/ChatTokenizedText.d.ts +1 -1
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +15 -24
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +74 -81
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +15 -15
- package/dist/CheckboxInput/CheckboxInput.d.ts +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +23 -25
- package/dist/CheckboxList/CheckboxList.js +9 -9
- package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +6 -8
- package/dist/Citation/Citation.js +10 -10
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +9 -32
- package/dist/Code/Code.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts +1 -10
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +52 -88
- package/dist/Collapsible/Collapsible.d.ts +3 -9
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +22 -110
- package/dist/Collapsible/CollapsibleGroup.d.ts +7 -39
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +12 -73
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +0 -31
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +3 -33
- package/dist/Collapsible/index.d.ts +0 -1
- package/dist/Collapsible/index.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.d.ts +1 -4
- package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.js +6 -20
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +34 -36
- package/dist/CommandPalette/CommandPaletteEmpty.js +3 -3
- package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
- package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
- package/dist/CommandPalette/CommandPaletteInput.js +13 -13
- package/dist/CommandPalette/CommandPaletteItem.js +3 -3
- package/dist/CommandPalette/CommandPaletteList.js +3 -3
- package/dist/ContextMenu/ContextMenu.d.ts +2 -7
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +43 -76
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +21 -21
- package/dist/DateTimeInput/DateTimeInput.d.ts +2 -5
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +26 -30
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +9 -9
- package/dist/Dialog/DialogHeader.js +16 -16
- package/dist/Dialog/useImperativeDialog.js +3 -3
- package/dist/Divider/Divider.js +7 -7
- package/dist/DropdownMenu/DropdownMenu.js +10 -10
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +17 -2
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
- package/dist/DropdownMenu/renderDropdownItems.js +10 -10
- package/dist/EmptyState/EmptyState.js +9 -9
- package/dist/Field/Field.js +17 -17
- package/dist/Field/FieldLabel.js +15 -15
- package/dist/Field/InputClearButton.js +5 -5
- package/dist/FieldStatus/FieldStatus.js +3 -3
- package/dist/FileInput/FileInput.js +29 -29
- package/dist/FormLayout/FormLayout.js +5 -5
- package/dist/Grid/Grid.d.ts +3 -4
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +12 -29
- package/dist/Grid/GridSpan.js +3 -3
- package/dist/HStack/HStack.js +3 -3
- package/dist/Heading/Heading.js +10 -10
- package/dist/HoverCard/HoverCard.js +9 -9
- package/dist/HoverCard/useHoverCard.d.ts +1 -5
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +3 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +12 -16
- package/dist/Icon/defaultIcons.js +116 -116
- package/dist/IconButton/IconButton.js +3 -3
- package/dist/InputGroup/InputGroup.js +11 -11
- package/dist/InputGroup/InputGroupText.js +3 -3
- package/dist/Item/Item.js +18 -18
- package/dist/Kbd/Kbd.js +5 -5
- package/dist/Layer/LayerProvider.js +7 -7
- package/dist/Layer/useLayer.d.ts +2 -29
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +31 -44
- package/dist/Layout/Layout.js +21 -21
- package/dist/Layout/LayoutContent.js +3 -3
- package/dist/Layout/LayoutFooter.js +5 -5
- package/dist/Layout/LayoutHeader.js +5 -5
- package/dist/Layout/LayoutPanel.js +3 -3
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +31 -55
- package/dist/Lightbox/useLightbox.js +3 -3
- package/dist/Link/Link.js +15 -15
- package/dist/Link/LinkProvider.js +3 -3
- package/dist/Link/useLinkify.js +3 -3
- package/dist/List/List.js +11 -11
- package/dist/List/ListItem.js +11 -11
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +102 -102
- package/dist/MetadataList/MetadataList.js +10 -10
- package/dist/MetadataList/MetadataListItem.js +15 -15
- package/dist/MobileNav/MobileNav.js +15 -15
- package/dist/MobileNav/MobileNavToggle.js +5 -5
- package/dist/MoreMenu/MoreMenu.js +3 -3
- package/dist/MultiSelector/MultiSelector.js +56 -56
- package/dist/NavIcon/NavIcon.js +3 -3
- package/dist/NavMenu/NavHeadingMenu.js +5 -5
- package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +32 -48
- package/dist/Outline/Outline.js +15 -15
- package/dist/OverflowList/OverflowList.js +8 -8
- package/dist/Overlay/Overlay.js +3 -3
- package/dist/Overlay/OverlayScrim.js +5 -5
- package/dist/Overlay/useOverlay.js +3 -3
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +72 -125
- package/dist/Popover/Popover.js +16 -16
- package/dist/Popover/usePopover.js +7 -7
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +92 -110
- package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
- package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
- package/dist/PowerSearch/PowerSearchToken.js +5 -5
- package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -25
- package/dist/RadioList/RadioList.js +7 -7
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +21 -24
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +10 -28
- package/dist/Section/Section.js +5 -5
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +10 -32
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +12 -18
- package/dist/SelectableCard/SelectableCard.js +5 -5
- package/dist/Selector/Selector.js +46 -46
- package/dist/Selector/SelectorOption.js +3 -3
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +34 -38
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +6 -8
- package/dist/SideNav/SideNavHeading.js +87 -87
- package/dist/SideNav/SideNavItem.js +42 -42
- package/dist/SideNav/SideNavSection.d.ts +1 -1
- package/dist/SideNav/SideNavSection.d.ts.map +1 -1
- package/dist/SideNav/SideNavSection.js +16 -18
- package/dist/Skeleton/Skeleton.js +3 -3
- package/dist/Slider/Slider.js +23 -23
- package/dist/Spinner/Spinner.js +9 -9
- package/dist/StatusDot/StatusDot.js +5 -5
- package/dist/Switch/Switch.d.ts +4 -8
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +29 -34
- package/dist/TabList/Tab.js +18 -18
- package/dist/TabList/TabList.js +5 -5
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +30 -57
- package/dist/TabList/tab.markers.stylex.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +39 -50
- package/dist/Table/Table.js +7 -7
- package/dist/Table/TableBody.d.ts +1 -1
- package/dist/Table/TableBody.d.ts.map +1 -1
- package/dist/Table/TableBody.js +5 -9
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableFooter.d.ts +1 -1
- package/dist/Table/TableFooter.d.ts.map +1 -1
- package/dist/Table/TableFooter.js +5 -9
- package/dist/Table/TableHeader.d.ts +1 -1
- package/dist/Table/TableHeader.d.ts.map +1 -1
- package/dist/Table/TableHeader.js +5 -9
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/TableRow.js +5 -5
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +11 -14
- package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
- package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/paginateData.js +1 -5
- package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +22 -22
- package/dist/Table/plugins/selection/useTableSelection.js +18 -18
- package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelectionState.js +1 -11
- package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
- package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortableState.js +4 -8
- package/dist/Table/tableContextMenu.js +9 -9
- package/dist/Text/Text.js +10 -10
- package/dist/TextArea/TextArea.js +14 -14
- package/dist/TextInput/TextInput.js +15 -15
- package/dist/Thumbnail/Thumbnail.d.ts +2 -3
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +29 -30
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +21 -26
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +26 -37
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +17 -25
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +11 -23
- package/dist/Toast/useToast.js +4 -4
- package/dist/ToggleButton/ToggleButton.js +12 -12
- package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
- package/dist/Token/Token.js +21 -21
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +34 -36
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.d.ts +1 -5
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +3 -3
- package/dist/TopNav/TopNav.js +32 -32
- package/dist/TopNav/TopNavHeading.js +67 -67
- package/dist/TopNav/TopNavItem.js +5 -5
- package/dist/TopNav/TopNavMegaMenu.js +30 -30
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +14 -25
- package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
- package/dist/TopNav/TopNavMenu.js +32 -32
- package/dist/TreeList/TreeList.js +8 -8
- package/dist/TreeList/TreeListBranches.js +11 -11
- package/dist/TreeList/TreeListItem.js +30 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +20 -23
- package/dist/Typeahead/Typeahead.js +12 -12
- package/dist/Typeahead/TypeaheadItem.js +10 -10
- package/dist/VStack/VStack.js +3 -3
- package/dist/astryx.css +0 -7
- package/dist/astryx.umd.js +60 -60
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +2 -8
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.d.ts +1 -1
- package/dist/hooks/focusableSelector.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.js +1 -1
- package/dist/hooks/index.d.ts +0 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +0 -1
- package/dist/hooks/useFocusTrap.d.ts +0 -3
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +1 -38
- package/dist/hooks/useInteractiveRole.d.ts +2 -6
- package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
- package/dist/hooks/useInteractiveRole.js +2 -6
- package/dist/hooks/useKeyboardHint.js +9 -9
- package/dist/hooks/useStreamingText.d.ts +1 -3
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +5 -14
- package/dist/theme/MediaTheme.js +3 -3
- package/dist/theme/Theme.js +7 -7
- package/dist/theme/defineTheme.d.ts +1 -1
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +3 -10
- package/dist/theme/hct.d.ts +15 -0
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +9 -9
- package/dist/theme/syntax/SyntaxTheme.js +5 -5
- package/dist/theme/tokens.d.ts +2 -10
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +4 -220
- package/dist/utils/index.d.ts +0 -3
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -3
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +5 -8
- package/package.json +3 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +0 -4
- package/src/AlertDialog/AlertDialog.tsx +0 -2
- package/src/AppShell/AppShell.tsx +0 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +1 -28
- package/src/AspectRatio/AspectRatio.test.tsx +1 -142
- package/src/AspectRatio/AspectRatio.tsx +10 -70
- package/src/AspectRatio/index.ts +1 -5
- package/src/Avatar/Avatar.doc.mjs +0 -11
- package/src/Avatar/Avatar.test.tsx +1 -32
- package/src/Avatar/Avatar.tsx +20 -12
- package/src/Banner/Banner.doc.mjs +0 -8
- package/src/Banner/Banner.test.tsx +0 -38
- package/src/Banner/Banner.tsx +1 -8
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +17 -122
- package/src/Calendar/Calendar.tsx +5 -26
- package/src/Calendar/dayCellUtils.ts +1 -3
- package/src/Calendar/styles.ts +2 -12
- package/src/Card/Card.tsx +6 -16
- package/src/Carousel/Carousel.doc.mjs +12 -12
- package/src/Carousel/Carousel.test.tsx +0 -13
- package/src/Carousel/Carousel.tsx +2 -4
- package/src/Carousel/carousel.markers.stylex.ts +10 -0
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +1 -27
- package/src/Chat/ChatComposerInput.tsx +15 -20
- package/src/Chat/ChatDictationButton.tsx +4 -4
- package/src/Chat/ChatLayoutScrollButton.tsx +1 -3
- package/src/Chat/ChatMessageMetadata.tsx +6 -4
- package/src/Chat/ChatSystemMessage.test.tsx +11 -26
- package/src/Chat/ChatSystemMessage.tsx +7 -7
- package/src/Chat/ChatTokenizedText.test.tsx +16 -29
- package/src/Chat/ChatTokenizedText.tsx +8 -15
- package/src/Chat/ChatToolCalls.test.tsx +0 -55
- package/src/Chat/ChatToolCalls.tsx +12 -10
- package/src/Chat/index.ts +4 -1
- package/src/Chat/useTriggerMenu.tsx +4 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
- package/src/CheckboxInput/CheckboxInput.test.tsx +4 -71
- package/src/CheckboxInput/CheckboxInput.tsx +0 -2
- package/src/CheckboxList/CheckboxList.test.tsx +0 -19
- package/src/CheckboxList/CheckboxListItem.tsx +2 -11
- package/src/Citation/Citation.doc.mjs +0 -5
- package/src/ClickableCard/ClickableCard.tsx +2 -45
- package/src/CodeBlock/CodeBlock.doc.mjs +2 -7
- package/src/CodeBlock/CodeBlock.test.tsx +3 -122
- package/src/CodeBlock/CodeBlock.tsx +4 -62
- package/src/Collapsible/Collapsible.doc.mjs +4 -8
- package/src/Collapsible/Collapsible.tsx +10 -86
- package/src/Collapsible/CollapsibleGroup.doc.mjs +3 -27
- package/src/Collapsible/CollapsibleGroup.test.tsx +0 -318
- package/src/Collapsible/CollapsibleGroup.tsx +9 -107
- package/src/Collapsible/CollapsibleGroupContext.tsx +2 -42
- package/src/Collapsible/index.ts +0 -4
- package/src/Collapsible/useCollapsible.ts +6 -20
- package/src/CommandPalette/CommandPalette.doc.mjs +0 -4
- package/src/CommandPalette/CommandPalette.tsx +3 -5
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +0 -5
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +0 -10
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +0 -6
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +0 -6
- package/src/CommandPalette/CommandPaletteList.doc.mjs +0 -9
- package/src/ContextMenu/ContextMenu.doc.mjs +0 -15
- package/src/ContextMenu/ContextMenu.test.tsx +0 -87
- package/src/ContextMenu/ContextMenu.tsx +28 -87
- package/src/ContextMenu/ContextMenuItem.doc.mjs +0 -6
- package/src/DateInput/DateInput.test.tsx +20 -11
- package/src/DateRangeInput/DateRangeInput.test.tsx +44 -31
- package/src/DateTimeInput/DateTimeInput.doc.mjs +2 -3
- package/src/DateTimeInput/DateTimeInput.test.tsx +16 -118
- package/src/DateTimeInput/DateTimeInput.tsx +2 -8
- package/src/DateTimeInput/index.ts +0 -1
- package/src/Dialog/Dialog.doc.mjs +0 -4
- package/src/Dialog/DialogHeader.doc.mjs +0 -45
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +2 -22
- package/src/DropdownMenu/DropdownMenuItem.tsx +17 -5
- package/src/Field/Field.test.tsx +4 -1
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +3 -0
- package/src/Grid/Grid.test.tsx +18 -43
- package/src/Grid/Grid.tsx +9 -26
- package/src/HoverCard/HoverCard.doc.mjs +6 -6
- package/src/HoverCard/useHoverCard.doc.mjs +5 -5
- package/src/HoverCard/useHoverCard.tsx +2 -9
- package/src/Icon/Icon.test.tsx +29 -41
- package/src/Icon/Icon.tsx +2 -6
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/Item/Item.tsx +1 -1
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +2 -221
- package/src/Layer/useLayer.tsx +30 -69
- package/src/Layout/LayoutContent.doc.mjs +0 -12
- package/src/Layout/LayoutPanel.doc.mjs +0 -40
- package/src/Lightbox/Lightbox.doc.mjs +0 -5
- package/src/Lightbox/Lightbox.test.tsx +2 -123
- package/src/Lightbox/Lightbox.tsx +1 -29
- package/src/Markdown/Markdown.tsx +7 -9
- package/src/Markdown/parser.perf.test.ts +12 -34
- package/src/NavMenu/NavMenu.doc.mjs +0 -15
- package/src/NumberInput/NumberInput.test.tsx +3 -48
- package/src/NumberInput/NumberInput.tsx +15 -32
- package/src/Overlay/Overlay.doc.mjs +0 -6
- package/src/Pagination/Pagination.test.tsx +0 -162
- package/src/Pagination/Pagination.tsx +26 -80
- package/src/Popover/Popover.doc.mjs +6 -6
- package/src/Popover/Popover.test.tsx +0 -65
- package/src/Popover/usePopover.doc.mjs +1 -1
- package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
- package/src/PowerSearch/PowerSearch.test.tsx +1 -109
- package/src/PowerSearch/PowerSearch.tsx +16 -37
- package/src/ProgressBar/ProgressBar.test.tsx +0 -30
- package/src/ProgressBar/ProgressBar.tsx +5 -12
- package/src/RadioList/RadioList.test.tsx +0 -19
- package/src/RadioList/RadioListItem.tsx +4 -9
- package/src/Resizable/ResizeHandle.tsx +4 -22
- package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
- package/src/SegmentedControl/SegmentedControl.test.tsx +0 -192
- package/src/SegmentedControl/SegmentedControl.tsx +5 -27
- package/src/SegmentedControl/SegmentedControlItem.tsx +4 -9
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.test.tsx +1 -27
- package/src/SideNav/SideNav.doc.mjs +1 -7
- package/src/SideNav/SideNav.test.tsx +0 -66
- package/src/SideNav/SideNav.tsx +2 -6
- package/src/SideNav/SideNavCollapseButton.tsx +3 -4
- package/src/SideNav/SideNavSection.tsx +4 -6
- package/src/Switch/Switch.doc.mjs +7 -7
- package/src/Switch/Switch.test.tsx +3 -102
- package/src/Switch/Switch.tsx +7 -20
- package/src/TabList/TabList.test.tsx +1 -185
- package/src/TabList/TabMenu.tsx +9 -45
- package/src/Table/BaseTable.tsx +2 -13
- package/src/Table/Table.test.tsx +0 -87
- package/src/Table/TableBody.tsx +2 -15
- package/src/Table/TableFooter.tsx +2 -15
- package/src/Table/TableHeader.tsx +2 -15
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +0 -13
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +1 -3
- package/src/Table/plugins/pagination/paginateData.ts +1 -5
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +0 -13
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +0 -23
- package/src/Table/plugins/selection/useTableSelectionState.tsx +6 -11
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +1 -35
- package/src/Table/plugins/sortable/useTableSortableState.tsx +4 -8
- package/src/TextArea/TextArea.test.tsx +3 -3
- package/src/TextInput/TextInput.test.tsx +3 -3
- package/src/Thumbnail/Thumbnail.test.tsx +2 -36
- package/src/Thumbnail/Thumbnail.tsx +2 -4
- package/src/TimeInput/TimeInput.test.tsx +0 -37
- package/src/TimeInput/TimeInput.tsx +1 -11
- package/src/Timestamp/Timestamp.doc.mjs +1 -1
- package/src/Timestamp/Timestamp.test.tsx +0 -52
- package/src/Timestamp/Timestamp.tsx +16 -30
- package/src/Toast/Toast.tsx +3 -11
- package/src/Toast/ToastViewport.test.tsx +0 -64
- package/src/Toast/ToastViewport.tsx +0 -12
- package/src/ToggleButton/ToggleButton.doc.mjs +0 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +0 -54
- package/src/Tokenizer/Tokenizer.tsx +4 -5
- package/src/Tooltip/Tooltip.doc.mjs +6 -6
- package/src/Tooltip/useTooltip.doc.mjs +5 -5
- package/src/Tooltip/useTooltip.tsx +2 -12
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +7 -23
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +2 -9
- package/src/TreeList/TreeList.doc.mjs +2 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +0 -19
- package/src/Typeahead/BaseTypeahead.tsx +2 -5
- package/src/Typeahead/Typeahead.doc.mjs +1 -1
- package/src/Typeahead/Typeahead.test.tsx +1 -45
- package/src/docs-types.ts +1 -9
- package/src/hooks/focusableSelector.ts +1 -1
- package/src/hooks/index.ts +0 -3
- package/src/hooks/useFocusTrap.doc.mjs +2 -4
- package/src/hooks/useFocusTrap.test.tsx +1 -149
- package/src/hooks/useFocusTrap.ts +1 -50
- package/src/hooks/useInteractiveRole.ts +4 -12
- package/src/hooks/useStreamingText.test.ts +19 -54
- package/src/hooks/useStreamingText.ts +5 -16
- package/src/hooks/useTreeFocus.test.tsx +3 -1
- package/src/reset.css +0 -29
- package/src/theme/SyntaxTheme.doc.mjs +4 -4
- package/src/theme/defineTheme.ts +13 -4
- package/src/theme/derivedVarRegistry.test.ts +2 -2
- package/src/theme/expandColorScale.test.ts +0 -29
- package/src/theme/expandColorScale.ts +6 -11
- package/src/theme/hct.ts +17 -9
- package/src/theme/tokens.test.ts +9 -182
- package/src/theme/tokens.ts +4 -239
- package/src/theme/useTheme.test.tsx +0 -20
- package/src/utils/index.ts +0 -4
- package/src/utils/sharedResizeObserver.test.ts +2 -2
- package/src/utils/timeParser.test.ts +0 -13
- package/src/utils/timeParser.ts +5 -8
- package/dist/hooks/useHotkeys.d.ts +0 -51
- package/dist/hooks/useHotkeys.d.ts.map +0 -1
- package/dist/hooks/useHotkeys.js +0 -160
- package/dist/utils/color.d.ts +0 -42
- package/dist/utils/color.d.ts.map +0 -1
- package/dist/utils/color.js +0 -150
- package/dist/utils/composeEventHandlers.d.ts +0 -30
- package/dist/utils/composeEventHandlers.d.ts.map +0 -1
- package/dist/utils/composeEventHandlers.js +0 -40
- package/src/Chat/ChatDictationButton.test.tsx +0 -43
- package/src/Chat/ChatLayoutScrollButton.test.tsx +0 -33
- package/src/Chat/ChatMessageMetadata.test.tsx +0 -32
- package/src/Collapsible/Collapsible.test.tsx +0 -405
- package/src/FieldStatus/FieldStatus.test.tsx +0 -282
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +0 -185
- package/src/Layout/Layout.test.tsx +0 -285
- package/src/Layout/LayoutSlots.test.tsx +0 -364
- package/src/Outline/parseOutlineFromMarkdown.test.ts +0 -80
- package/src/OverflowList/OverflowList.test.tsx +0 -416
- package/src/Overlay/Overlay.test.tsx +0 -356
- package/src/Resizable/ResizeHandle.test.tsx +0 -218
- package/src/SizeContext/SizeContext.test.tsx +0 -226
- package/src/__tests__/TestIcon.tsx +0 -26
- package/src/__tests__/fastRoleQueries.ts +0 -66
- package/src/docPropReferences.test.ts +0 -178
- package/src/hooks/useHotkeys.doc.mjs +0 -52
- package/src/hooks/useHotkeys.test.ts +0 -245
- package/src/hooks/useHotkeys.ts +0 -203
- package/src/utils/color.test.ts +0 -133
- package/src/utils/color.ts +0 -148
- package/src/utils/composeEventHandlers.test.ts +0 -71
- package/src/utils/composeEventHandlers.ts +0 -44
- package/src/utils/mergeProps.test.ts +0 -166
|
@@ -13,24 +13,11 @@ export interface TableFooterProps extends BaseProps<HTMLTableSectionElement> {
|
|
|
13
13
|
children: ReactNode;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export function TableFooter({
|
|
17
|
-
ref,
|
|
18
|
-
children,
|
|
19
|
-
xstyle,
|
|
20
|
-
className,
|
|
21
|
-
style,
|
|
22
|
-
...rest
|
|
23
|
-
}: TableFooterProps) {
|
|
16
|
+
export function TableFooter({ref, children, xstyle}: TableFooterProps) {
|
|
24
17
|
return (
|
|
25
18
|
<tfoot
|
|
26
19
|
ref={ref}
|
|
27
|
-
{...mergeProps(
|
|
28
|
-
themeProps('table-footer'),
|
|
29
|
-
stylex.props(xstyle),
|
|
30
|
-
className,
|
|
31
|
-
style,
|
|
32
|
-
)}
|
|
33
|
-
{...rest}>
|
|
20
|
+
{...mergeProps(themeProps('table-footer'), stylex.props(xstyle))}>
|
|
34
21
|
{children}
|
|
35
22
|
</tfoot>
|
|
36
23
|
);
|
|
@@ -13,24 +13,11 @@ export interface TableHeaderProps extends BaseProps<HTMLTableSectionElement> {
|
|
|
13
13
|
children: ReactNode;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export function TableHeader({
|
|
17
|
-
ref,
|
|
18
|
-
children,
|
|
19
|
-
xstyle,
|
|
20
|
-
className,
|
|
21
|
-
style,
|
|
22
|
-
...rest
|
|
23
|
-
}: TableHeaderProps) {
|
|
16
|
+
export function TableHeader({ref, children, xstyle}: TableHeaderProps) {
|
|
24
17
|
return (
|
|
25
18
|
<thead
|
|
26
19
|
ref={ref}
|
|
27
|
-
{...mergeProps(
|
|
28
|
-
themeProps('table-header'),
|
|
29
|
-
stylex.props(xstyle),
|
|
30
|
-
className,
|
|
31
|
-
style,
|
|
32
|
-
)}
|
|
33
|
-
{...rest}>
|
|
20
|
+
{...mergeProps(themeProps('table-header'), stylex.props(xstyle))}>
|
|
34
21
|
{children}
|
|
35
22
|
</thead>
|
|
36
23
|
);
|
|
@@ -551,19 +551,6 @@ describe('useTableColumnResize', () => {
|
|
|
551
551
|
expect(handle).toHaveAttribute('aria-valuenow', '200');
|
|
552
552
|
});
|
|
553
553
|
|
|
554
|
-
it('handle has a numeric aria-valuenow on initial render (before any width is measured)', () => {
|
|
555
|
-
// A focusable role="separator" requires aria-valuenow per the ARIA spec.
|
|
556
|
-
// Before the column width has been measured there is no override width, so
|
|
557
|
-
// the handle must fall back to a defined numeric value (the column
|
|
558
|
-
// minWidth) rather than omitting the attribute.
|
|
559
|
-
render(<ResizeTable minWidth={80} />);
|
|
560
|
-
const handle = getResizeHandles()[0];
|
|
561
|
-
const valueNow = handle.getAttribute('aria-valuenow');
|
|
562
|
-
expect(valueNow).not.toBeNull();
|
|
563
|
-
expect(Number.isNaN(Number(valueNow))).toBe(false);
|
|
564
|
-
expect(valueNow).toBe('80');
|
|
565
|
-
});
|
|
566
|
-
|
|
567
554
|
it('handle has aria-label with column header text', () => {
|
|
568
555
|
render(<ResizeTable />);
|
|
569
556
|
const handle = getResizeHandles()[0];
|
|
@@ -676,9 +676,7 @@ function ResizeHandle({
|
|
|
676
676
|
<div
|
|
677
677
|
role="separator"
|
|
678
678
|
aria-orientation="vertical"
|
|
679
|
-
|
|
680
|
-
// back to the column's minWidth before the width has been measured.
|
|
681
|
-
aria-valuenow={currentWidth ?? minWidth}
|
|
679
|
+
aria-valuenow={currentWidth ?? undefined}
|
|
682
680
|
aria-valuemin={minWidth}
|
|
683
681
|
aria-valuemax={maxWidth === Infinity ? undefined : maxWidth}
|
|
684
682
|
aria-label={ariaLabel}
|
|
@@ -38,10 +38,6 @@ export function paginateData<T>(
|
|
|
38
38
|
const size = Number.isFinite(pageSize)
|
|
39
39
|
? Math.max(1, Math.floor(pageSize))
|
|
40
40
|
: 10;
|
|
41
|
-
|
|
42
|
-
// count from the END of the data (page -1 returns the tail dressed up as a
|
|
43
|
-
// page), and a fractional page returns a slice straddling two pages.
|
|
44
|
-
const p = Number.isFinite(page) ? Math.max(1, Math.floor(page)) : 1;
|
|
45
|
-
const start = (p - 1) * size;
|
|
41
|
+
const start = (page - 1) * size;
|
|
46
42
|
return data.slice(start, start + size);
|
|
47
43
|
}
|
|
@@ -132,19 +132,6 @@ describe('paginateData', () => {
|
|
|
132
132
|
expect(paginateData([], 1, 10)).toEqual([]);
|
|
133
133
|
});
|
|
134
134
|
|
|
135
|
-
it('clamps invalid page numbers to the first page (#3593)', () => {
|
|
136
|
-
const data = generateItems(30);
|
|
137
|
-
// Negative pages previously fed a negative index to Array.slice, which
|
|
138
|
-
// counts from the END of the data — the tail dressed up as a page.
|
|
139
|
-
expect(paginateData(data, -1, 10)[0].id).toBe('1');
|
|
140
|
-
expect(paginateData(data, 0, 10)[0].id).toBe('1');
|
|
141
|
-
expect(paginateData(data, NaN, 10)[0].id).toBe('1');
|
|
142
|
-
// Fractional pages floor to the containing page instead of straddling two.
|
|
143
|
-
expect(paginateData(data, 1.5, 10).map(i => i.id)).toEqual(
|
|
144
|
-
paginateData(data, 1, 10).map(i => i.id),
|
|
145
|
-
);
|
|
146
|
-
});
|
|
147
|
-
|
|
148
135
|
it('returns empty array when page exceeds data', () => {
|
|
149
136
|
const data = generateItems(10);
|
|
150
137
|
expect(paginateData(data, 5, 10)).toEqual([]);
|
|
@@ -302,29 +302,6 @@ describe('useTableSelectionState with filtered data', () => {
|
|
|
302
302
|
expect(screen.getByTestId('selected-keys')).toHaveTextContent('1,3');
|
|
303
303
|
});
|
|
304
304
|
|
|
305
|
-
it('select-all is unchecked when the filter matches nothing (#3591)', async () => {
|
|
306
|
-
const user = userEvent.setup();
|
|
307
|
-
render(<FilteredSelectionTable />);
|
|
308
|
-
|
|
309
|
-
// Select Bob, then filter to an empty result set.
|
|
310
|
-
const checkboxes = screen.getAllByLabelText('Select row');
|
|
311
|
-
await user.click(checkboxes[1]);
|
|
312
|
-
expect(screen.getByTestId('selected-keys')).toHaveTextContent('2');
|
|
313
|
-
|
|
314
|
-
const input = screen.getByTestId('filter-input');
|
|
315
|
-
await user.clear(input);
|
|
316
|
-
await user.type(input, 'zzz');
|
|
317
|
-
|
|
318
|
-
// Zero visible rows must not read as "all selected" — previously the
|
|
319
|
-
// header checkbox rendered checked here and deselect-all was a no-op.
|
|
320
|
-
const selectAll = screen.getByLabelText('Select all rows');
|
|
321
|
-
expect(selectAll).not.toBeChecked();
|
|
322
|
-
|
|
323
|
-
// The hidden selection itself is preserved (frozen), as designed.
|
|
324
|
-
await user.clear(input);
|
|
325
|
-
expect(screen.getByTestId('selected-keys')).toHaveTextContent('2');
|
|
326
|
-
});
|
|
327
|
-
|
|
328
305
|
it('selections persist when filter changes', async () => {
|
|
329
306
|
const user = userEvent.setup();
|
|
330
307
|
render(<FilteredSelectionTable />);
|
|
@@ -125,17 +125,12 @@ export function useTableSelectionState<T extends Record<string, unknown>>(
|
|
|
125
125
|
[selectedKeys, selectableIDs],
|
|
126
126
|
);
|
|
127
127
|
|
|
128
|
-
const getAllSelected = useCallback(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
if (selectableIDs.size === 0) {
|
|
135
|
-
return false;
|
|
136
|
-
}
|
|
137
|
-
return allSelectableIDs.size === selectedKeys.size;
|
|
138
|
-
}, [allSelectableIDs, selectableIDs, selectedKeys]);
|
|
128
|
+
const getAllSelected = useCallback(
|
|
129
|
+
() =>
|
|
130
|
+
allSelectableIDs.size === selectedKeys.size &&
|
|
131
|
+
allSelectableIDs.size !== 0,
|
|
132
|
+
[allSelectableIDs, selectedKeys],
|
|
133
|
+
);
|
|
139
134
|
|
|
140
135
|
// Use refs to keep onSelectAll stable
|
|
141
136
|
const frozenSelectedIDsRef = useRef(frozenSelectedIDs);
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import {describe, it, expect, vi} from 'vitest';
|
|
11
|
-
import {render,
|
|
11
|
+
import {render, screen, within} from '@testing-library/react';
|
|
12
12
|
import userEvent from '@testing-library/user-event';
|
|
13
13
|
import {useState} from 'react';
|
|
14
14
|
import {Table} from '../../Table';
|
|
@@ -421,40 +421,6 @@ describe('useTableSortableState', () => {
|
|
|
421
421
|
});
|
|
422
422
|
});
|
|
423
423
|
|
|
424
|
-
describe('NaN handling', () => {
|
|
425
|
-
it('keeps valid numbers sorted when a NaN cell is present', () => {
|
|
426
|
-
const data: Employee[] = [
|
|
427
|
-
{id: '1', name: 'A', age: 5, department: 'X', salary: 1},
|
|
428
|
-
{id: '2', name: 'B', age: NaN, department: 'X', salary: 1},
|
|
429
|
-
{id: '3', name: 'C', age: 1, department: 'X', salary: 1},
|
|
430
|
-
{id: '4', name: 'D', age: 3, department: 'X', salary: 1},
|
|
431
|
-
];
|
|
432
|
-
const {result} = renderHook(() =>
|
|
433
|
-
useTableSortableState({
|
|
434
|
-
data,
|
|
435
|
-
defaultSort: [{sortKey: 'age', direction: 'ascending'}],
|
|
436
|
-
}),
|
|
437
|
-
);
|
|
438
|
-
// NaN groups at the end like null; the valid numbers stay ordered.
|
|
439
|
-
expect(result.current.sortedData.map(e => e.age)).toEqual([1, 3, 5, NaN]);
|
|
440
|
-
});
|
|
441
|
-
|
|
442
|
-
it('sorts NaN to the start in descending order, like null', () => {
|
|
443
|
-
const data: Employee[] = [
|
|
444
|
-
{id: '1', name: 'A', age: 5, department: 'X', salary: 1},
|
|
445
|
-
{id: '2', name: 'B', age: NaN, department: 'X', salary: 1},
|
|
446
|
-
{id: '3', name: 'C', age: 1, department: 'X', salary: 1},
|
|
447
|
-
];
|
|
448
|
-
const {result} = renderHook(() =>
|
|
449
|
-
useTableSortableState({
|
|
450
|
-
data,
|
|
451
|
-
defaultSort: [{sortKey: 'age', direction: 'descending'}],
|
|
452
|
-
}),
|
|
453
|
-
);
|
|
454
|
-
expect(result.current.sortedData.map(e => e.age)).toEqual([NaN, 5, 1]);
|
|
455
|
-
});
|
|
456
|
-
});
|
|
457
|
-
|
|
458
424
|
describe('null/undefined handling', () => {
|
|
459
425
|
it('sorts null values to the end', () => {
|
|
460
426
|
const data: Employee[] = [
|
|
@@ -168,18 +168,14 @@ function defaultCompare<T extends Record<string, unknown>>(
|
|
|
168
168
|
const aVal = a[sortKey];
|
|
169
169
|
const bVal = b[sortKey];
|
|
170
170
|
|
|
171
|
-
// null/undefined
|
|
172
|
-
|
|
173
|
-
// the comparator inconsistent and corrupts the order of the other rows.
|
|
174
|
-
const aMissing = aVal == null || (typeof aVal === 'number' && Number.isNaN(aVal));
|
|
175
|
-
const bMissing = bVal == null || (typeof bVal === 'number' && Number.isNaN(bVal));
|
|
176
|
-
if (aMissing && bMissing) {
|
|
171
|
+
// null/undefined sort to the end
|
|
172
|
+
if (aVal == null && bVal == null) {
|
|
177
173
|
return 0;
|
|
178
174
|
}
|
|
179
|
-
if (
|
|
175
|
+
if (aVal == null) {
|
|
180
176
|
return 1;
|
|
181
177
|
}
|
|
182
|
-
if (
|
|
178
|
+
if (bVal == null) {
|
|
183
179
|
return -1;
|
|
184
180
|
}
|
|
185
181
|
|
|
@@ -13,7 +13,7 @@ import {useState} from 'react';
|
|
|
13
13
|
import {describe, it, expect, vi, beforeEach} from 'vitest';
|
|
14
14
|
import {render, screen, fireEvent, waitFor} from '@testing-library/react';
|
|
15
15
|
import userEvent from '@testing-library/user-event';
|
|
16
|
-
import {
|
|
16
|
+
import {MagnifyingGlassIcon} from '@heroicons/react/24/outline';
|
|
17
17
|
import {TextArea} from './TextArea';
|
|
18
18
|
|
|
19
19
|
// Mock showPopover/hidePopover since jsdom does not implement them. Used by the
|
|
@@ -193,7 +193,7 @@ describe('TextArea', () => {
|
|
|
193
193
|
label="Description"
|
|
194
194
|
value=""
|
|
195
195
|
onChange={() => {}}
|
|
196
|
-
startIcon={
|
|
196
|
+
startIcon={MagnifyingGlassIcon}
|
|
197
197
|
/>,
|
|
198
198
|
);
|
|
199
199
|
expect(screen.getByRole('textbox')).toBeInTheDocument();
|
|
@@ -577,7 +577,7 @@ describe('TextArea', () => {
|
|
|
577
577
|
label="Notes"
|
|
578
578
|
value=""
|
|
579
579
|
onChange={() => {}}
|
|
580
|
-
startIcon={<
|
|
580
|
+
startIcon={<MagnifyingGlassIcon />}
|
|
581
581
|
/>,
|
|
582
582
|
);
|
|
583
583
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
import {describe, it, expect, vi, beforeEach} from 'vitest';
|
|
13
13
|
import {render, screen, fireEvent, waitFor} from '@testing-library/react';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
|
-
import {
|
|
15
|
+
import {MagnifyingGlassIcon} from '@heroicons/react/24/outline';
|
|
16
16
|
import {TextInput} from './TextInput';
|
|
17
17
|
|
|
18
18
|
// Mock showPopover/hidePopover since jsdom does not implement them. Used by the
|
|
@@ -163,7 +163,7 @@ describe('TextInput', () => {
|
|
|
163
163
|
label="Search"
|
|
164
164
|
value=""
|
|
165
165
|
onChange={() => {}}
|
|
166
|
-
startIcon={
|
|
166
|
+
startIcon={MagnifyingGlassIcon}
|
|
167
167
|
/>,
|
|
168
168
|
);
|
|
169
169
|
expect(screen.getByRole('textbox')).toBeInTheDocument();
|
|
@@ -482,7 +482,7 @@ describe('TextInput', () => {
|
|
|
482
482
|
label="Search"
|
|
483
483
|
value=""
|
|
484
484
|
onChange={() => {}}
|
|
485
|
-
startIcon={<
|
|
485
|
+
startIcon={<MagnifyingGlassIcon />}
|
|
486
486
|
/>,
|
|
487
487
|
);
|
|
488
488
|
|
|
@@ -37,45 +37,11 @@ describe('Thumbnail', () => {
|
|
|
37
37
|
expect(screen.getByRole('status')).toBeInTheDocument();
|
|
38
38
|
});
|
|
39
39
|
|
|
40
|
-
it('
|
|
40
|
+
it('uses label as accessible name on root', () => {
|
|
41
41
|
render(<Thumbnail label="photo.png" data-testid="thumb" />);
|
|
42
|
-
|
|
43
|
-
// not by a bare aria-label on a generic div (aria-prohibited-attr).
|
|
44
|
-
const group = screen.getByRole('group', {name: 'photo.png'});
|
|
45
|
-
expect(group).toBe(screen.getByTestId('thumb'));
|
|
42
|
+
expect(screen.getByTestId('thumb')).toHaveAttribute('aria-label', 'photo.png');
|
|
46
43
|
});
|
|
47
44
|
|
|
48
|
-
it('does not put aria-label on a generic (roleless) element', () => {
|
|
49
|
-
render(<Thumbnail label="photo.png" data-testid="thumb" />);
|
|
50
|
-
const thumb = screen.getByTestId('thumb');
|
|
51
|
-
// The labeled element must declare a role so the name is legitimate.
|
|
52
|
-
expect(thumb).toHaveAttribute('role', 'group');
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('keeps interactive children accessible while exposing the group name', () => {
|
|
56
|
-
const onRemove = vi.fn();
|
|
57
|
-
render(
|
|
58
|
-
<Thumbnail
|
|
59
|
-
src="/img.jpg"
|
|
60
|
-
alt="Clickable"
|
|
61
|
-
label="file.png"
|
|
62
|
-
onClick={vi.fn()}
|
|
63
|
-
onRemove={onRemove}
|
|
64
|
-
/>,
|
|
65
|
-
);
|
|
66
|
-
// A group role (unlike img) must not hide descendant controls.
|
|
67
|
-
expect(
|
|
68
|
-
screen.getByRole('group', {name: 'file.png — Clickable'}),
|
|
69
|
-
).toBeInTheDocument();
|
|
70
|
-
expect(
|
|
71
|
-
screen.getByRole('button', {name: 'Open file.png — Clickable'}),
|
|
72
|
-
).toBeInTheDocument();
|
|
73
|
-
expect(
|
|
74
|
-
screen.getByRole('button', {name: 'Remove file.png — Clickable'}),
|
|
75
|
-
).toBeInTheDocument();
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
|
|
79
45
|
it('label is shown via tooltip, not as inline text', () => {
|
|
80
46
|
render(<Thumbnail label="photo.png" data-testid="thumb" />);
|
|
81
47
|
// Label should exist in DOM (tooltip) but not as a direct child text node
|
|
@@ -58,9 +58,8 @@ export interface ThumbnailProps extends BaseProps<HTMLDivElement> {
|
|
|
58
58
|
alt?: string;
|
|
59
59
|
/**
|
|
60
60
|
* Accessible label for the thumbnail (e.g. file name).
|
|
61
|
-
* Not rendered visually — shown in a tooltip on hover
|
|
62
|
-
* accessible name
|
|
63
|
-
* name for the remove button.
|
|
61
|
+
* Not rendered visually — shown in a tooltip on hover and used
|
|
62
|
+
* as accessible name for the remove button.
|
|
64
63
|
*/
|
|
65
64
|
label?: string;
|
|
66
65
|
/**
|
|
@@ -297,7 +296,6 @@ export function Thumbnail({
|
|
|
297
296
|
<div
|
|
298
297
|
ref={ref}
|
|
299
298
|
data-testid={testId}
|
|
300
|
-
role="group"
|
|
301
299
|
aria-label={accessibleName}
|
|
302
300
|
{...mergeProps(
|
|
303
301
|
themeProps('thumbnail'),
|
|
@@ -160,43 +160,6 @@ describe('TimeInput', () => {
|
|
|
160
160
|
expect(onChange).not.toHaveBeenCalled();
|
|
161
161
|
});
|
|
162
162
|
|
|
163
|
-
it('sets aria-invalid="true" when typed input is out of range', () => {
|
|
164
|
-
render(<TimeInput label="Time" onChange={() => {}} />);
|
|
165
|
-
|
|
166
|
-
const input = screen.getByRole('textbox');
|
|
167
|
-
fireEvent.change(input, {target: {value: '25:99'}});
|
|
168
|
-
|
|
169
|
-
expect(input).toHaveAttribute('aria-invalid', 'true');
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
it('does not set aria-invalid when typed input is a valid time', () => {
|
|
173
|
-
render(<TimeInput label="Time" onChange={() => {}} />);
|
|
174
|
-
|
|
175
|
-
const input = screen.getByRole('textbox');
|
|
176
|
-
fireEvent.change(input, {target: {value: '3:45 pm'}});
|
|
177
|
-
|
|
178
|
-
expect(input).not.toHaveAttribute('aria-invalid');
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
it('announces an alert message when typed input is invalid', () => {
|
|
182
|
-
render(<TimeInput label="Time" onChange={() => {}} />);
|
|
183
|
-
|
|
184
|
-
const input = screen.getByRole('textbox');
|
|
185
|
-
fireEvent.change(input, {target: {value: '25:99'}});
|
|
186
|
-
|
|
187
|
-
expect(screen.getByRole('alert')).toHaveTextContent('Invalid time');
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
it('does not announce an alert message when input is valid', () => {
|
|
191
|
-
render(<TimeInput label="Time" onChange={() => {}} />);
|
|
192
|
-
|
|
193
|
-
const input = screen.getByRole('textbox');
|
|
194
|
-
fireEvent.change(input, {target: {value: '3:45 pm'}});
|
|
195
|
-
|
|
196
|
-
expect(screen.getByRole('alert')).toHaveTextContent('');
|
|
197
|
-
expect(screen.queryByText('Invalid time')).not.toBeInTheDocument();
|
|
198
|
-
});
|
|
199
|
-
|
|
200
163
|
it('calls onChange on blur when input is valid', async () => {
|
|
201
164
|
const user = userEvent.setup();
|
|
202
165
|
const onChange = vi.fn();
|
|
@@ -635,9 +635,7 @@ export function TimeInput({
|
|
|
635
635
|
data-autofocus={hasAutoFocus || undefined}
|
|
636
636
|
aria-describedby={ariaDescribedBy}
|
|
637
637
|
aria-required={isRequired === true ? 'true' : undefined}
|
|
638
|
-
aria-invalid={
|
|
639
|
-
status?.type === 'error' || !isInputValid ? 'true' : undefined
|
|
640
|
-
}
|
|
638
|
+
aria-invalid={status?.type === 'error' ? 'true' : undefined}
|
|
641
639
|
aria-busy={isBusy || undefined}
|
|
642
640
|
aria-labelledby={ariaLabelledBy}
|
|
643
641
|
{...stylex.props(
|
|
@@ -646,14 +644,6 @@ export function TimeInput({
|
|
|
646
644
|
!isInputValid && styles.inputInvalid,
|
|
647
645
|
)}
|
|
648
646
|
/>
|
|
649
|
-
{/*
|
|
650
|
-
Live region announcing invalid typed input to assistive technology.
|
|
651
|
-
The value silently reverts on blur, so without this a screen-reader
|
|
652
|
-
user would get no feedback that their entry was rejected (WCAG 3.3.1).
|
|
653
|
-
*/}
|
|
654
|
-
<VisuallyHidden as="div" role="alert" aria-live="assertive">
|
|
655
|
-
{!isInputValid ? 'Invalid time' : ''}
|
|
656
|
-
</VisuallyHidden>
|
|
657
647
|
{isBusy && <Spinner size="sm" />}
|
|
658
648
|
{hasClear && value && !isDisabled && (
|
|
659
649
|
<button
|
|
@@ -33,31 +33,6 @@ describe('Timestamp', () => {
|
|
|
33
33
|
expect(screen.getByText('2 hours ago')).toBeInTheDocument();
|
|
34
34
|
});
|
|
35
35
|
|
|
36
|
-
it('does not round a tier up past its own boundary', () => {
|
|
37
|
-
// Just under each threshold the count must stay within the tier, e.g.
|
|
38
|
-
// 59.98 minutes is "59 minutes ago", never "60 minutes ago".
|
|
39
|
-
const {rerender} = render(
|
|
40
|
-
<Timestamp value={Date.now() / 1000 - 3599} format="relative" />,
|
|
41
|
-
);
|
|
42
|
-
expect(screen.getByText('59 minutes ago')).toBeInTheDocument();
|
|
43
|
-
|
|
44
|
-
rerender(
|
|
45
|
-
<Timestamp value={Date.now() / 1000 - 86399} format="relative" />,
|
|
46
|
-
);
|
|
47
|
-
expect(screen.getByText('23 hours ago')).toBeInTheDocument();
|
|
48
|
-
|
|
49
|
-
rerender(
|
|
50
|
-
<Timestamp value={Date.now() / 1000 - 2591999} format="relative" />,
|
|
51
|
-
);
|
|
52
|
-
expect(screen.getByText('29 days ago')).toBeInTheDocument();
|
|
53
|
-
|
|
54
|
-
// Same guarantee on the future side.
|
|
55
|
-
rerender(
|
|
56
|
-
<Timestamp value={Date.now() / 1000 + 3599} format="relative" />,
|
|
57
|
-
);
|
|
58
|
-
expect(screen.getByText('in 59 minutes')).toBeInTheDocument();
|
|
59
|
-
});
|
|
60
|
-
|
|
61
36
|
it('renders "now" for very recent times', () => {
|
|
62
37
|
const fiveSecondsAgo = Date.now() / 1000 - 5;
|
|
63
38
|
render(<Timestamp value={fiveSecondsAgo} format="relative" />);
|
|
@@ -315,31 +290,4 @@ describe('Timestamp', () => {
|
|
|
315
290
|
const el = screen.getByRole('time');
|
|
316
291
|
expect(el.textContent).not.toContain('ago');
|
|
317
292
|
});
|
|
318
|
-
|
|
319
|
-
// --- Invalid values ---
|
|
320
|
-
|
|
321
|
-
it('renders nothing instead of crashing on an unparseable string value', () => {
|
|
322
|
-
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
323
|
-
try {
|
|
324
|
-
const {container} = render(
|
|
325
|
-
<Timestamp value="not-a-date" data-testid="ts" />,
|
|
326
|
-
);
|
|
327
|
-
expect(container).toBeEmptyDOMElement();
|
|
328
|
-
expect(warn).toHaveBeenCalledWith(
|
|
329
|
-
expect.stringContaining('could not parse value'),
|
|
330
|
-
);
|
|
331
|
-
} finally {
|
|
332
|
-
warn.mockRestore();
|
|
333
|
-
}
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
it('renders nothing instead of crashing on a NaN value', () => {
|
|
337
|
-
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
338
|
-
try {
|
|
339
|
-
const {container} = render(<Timestamp value={NaN} data-testid="ts" />);
|
|
340
|
-
expect(container).toBeEmptyDOMElement();
|
|
341
|
-
} finally {
|
|
342
|
-
warn.mockRestore();
|
|
343
|
-
}
|
|
344
|
-
});
|
|
345
293
|
});
|
|
@@ -180,22 +180,22 @@ function getRelativeTimeString(date: Date, now: Date): string {
|
|
|
180
180
|
return 'in a few seconds';
|
|
181
181
|
}
|
|
182
182
|
if (absDiff < HOUR) {
|
|
183
|
-
const mins = Math.
|
|
183
|
+
const mins = Math.round(absDiff / MINUTE);
|
|
184
184
|
return `in ${mins} ${mins === 1 ? 'minute' : 'minutes'}`;
|
|
185
185
|
}
|
|
186
186
|
if (absDiff < DAY) {
|
|
187
|
-
const hours = Math.
|
|
187
|
+
const hours = Math.round(absDiff / HOUR);
|
|
188
188
|
return `in ${hours} ${hours === 1 ? 'hour' : 'hours'}`;
|
|
189
189
|
}
|
|
190
190
|
if (absDiff < MONTH) {
|
|
191
|
-
const days = Math.
|
|
191
|
+
const days = Math.round(absDiff / DAY);
|
|
192
192
|
return `in ${days} ${days === 1 ? 'day' : 'days'}`;
|
|
193
193
|
}
|
|
194
194
|
if (absDiff < YEAR) {
|
|
195
|
-
const months = Math.
|
|
195
|
+
const months = Math.round(absDiff / MONTH);
|
|
196
196
|
return `in ${months} ${months === 1 ? 'month' : 'months'}`;
|
|
197
197
|
}
|
|
198
|
-
const years = Math.
|
|
198
|
+
const years = Math.round(absDiff / YEAR);
|
|
199
199
|
return `in ${years} ${years === 1 ? 'year' : 'years'}`;
|
|
200
200
|
}
|
|
201
201
|
|
|
@@ -203,25 +203,25 @@ function getRelativeTimeString(date: Date, now: Date): string {
|
|
|
203
203
|
return `${diffSeconds} seconds ago`;
|
|
204
204
|
}
|
|
205
205
|
if (diffSeconds < HOUR) {
|
|
206
|
-
const mins = Math.
|
|
206
|
+
const mins = Math.round(diffSeconds / MINUTE);
|
|
207
207
|
return `${mins} ${mins === 1 ? 'minute' : 'minutes'} ago`;
|
|
208
208
|
}
|
|
209
209
|
if (diffSeconds < DAY) {
|
|
210
|
-
const hours = Math.
|
|
210
|
+
const hours = Math.round(diffSeconds / HOUR);
|
|
211
211
|
return `${hours} ${hours === 1 ? 'hour' : 'hours'} ago`;
|
|
212
212
|
}
|
|
213
213
|
if (diffSeconds < 2 * DAY) {
|
|
214
214
|
return 'yesterday';
|
|
215
215
|
}
|
|
216
216
|
if (diffSeconds < MONTH) {
|
|
217
|
-
const days = Math.
|
|
217
|
+
const days = Math.round(diffSeconds / DAY);
|
|
218
218
|
return `${days} days ago`;
|
|
219
219
|
}
|
|
220
220
|
if (diffSeconds < YEAR) {
|
|
221
|
-
const months = Math.
|
|
221
|
+
const months = Math.round(diffSeconds / MONTH);
|
|
222
222
|
return `${months} ${months === 1 ? 'month' : 'months'} ago`;
|
|
223
223
|
}
|
|
224
|
-
const years = Math.
|
|
224
|
+
const years = Math.round(diffSeconds / YEAR);
|
|
225
225
|
return `${years} ${years === 1 ? 'year' : 'years'} ago`;
|
|
226
226
|
}
|
|
227
227
|
|
|
@@ -360,12 +360,7 @@ export function Timestamp({
|
|
|
360
360
|
const [now, setNow] = useState(() => new Date());
|
|
361
361
|
|
|
362
362
|
const date = parseValue(value);
|
|
363
|
-
|
|
364
|
-
// missing data) yields an Invalid Date, and formatting one throws "Invalid
|
|
365
|
-
// time value" — crashing the whole tree. Compute nothing from it here and
|
|
366
|
-
// bail out below (after the hooks) instead.
|
|
367
|
-
const isValidDate = !Number.isNaN(date.getTime());
|
|
368
|
-
const isoString = isValidDate ? date.toISOString() : '';
|
|
363
|
+
const isoString = date.toISOString();
|
|
369
364
|
|
|
370
365
|
// Determine effective format
|
|
371
366
|
const diffSeconds = Math.round((now.getTime() - date.getTime()) / 1000);
|
|
@@ -377,20 +372,19 @@ export function Timestamp({
|
|
|
377
372
|
: format;
|
|
378
373
|
|
|
379
374
|
// Format the display text
|
|
380
|
-
const displayText =
|
|
381
|
-
|
|
382
|
-
: effectiveFormat === 'relative'
|
|
375
|
+
const displayText =
|
|
376
|
+
effectiveFormat === 'relative'
|
|
383
377
|
? getRelativeTimeString(date, now)
|
|
384
378
|
: isAbsoluteFormat(effectiveFormat)
|
|
385
379
|
? formatTimestamp(date, effectiveFormat, isTimezoneShown)
|
|
386
380
|
: '';
|
|
387
381
|
|
|
388
382
|
// Full absolute text for tooltip and aria-label
|
|
389
|
-
const fullAbsoluteText =
|
|
383
|
+
const fullAbsoluteText = getFullAbsoluteString(date);
|
|
390
384
|
|
|
391
385
|
// Live updates
|
|
392
386
|
useEffect(() => {
|
|
393
|
-
if (!isLive ||
|
|
387
|
+
if (!isLive || effectiveFormat !== 'relative') {
|
|
394
388
|
return;
|
|
395
389
|
}
|
|
396
390
|
|
|
@@ -400,15 +394,7 @@ export function Timestamp({
|
|
|
400
394
|
}, interval);
|
|
401
395
|
|
|
402
396
|
return () => clearInterval(timer);
|
|
403
|
-
}, [isLive,
|
|
404
|
-
|
|
405
|
-
// Placed after all hooks so the hook order stays stable across renders.
|
|
406
|
-
if (!isValidDate) {
|
|
407
|
-
console.warn(
|
|
408
|
-
`Timestamp: could not parse value ${JSON.stringify(value)} as a date. Rendering nothing.`,
|
|
409
|
-
);
|
|
410
|
-
return null;
|
|
411
|
-
}
|
|
397
|
+
}, [isLive, effectiveFormat, diffSeconds]);
|
|
412
398
|
|
|
413
399
|
const showTooltip = hasTooltip && effectiveFormat === 'relative';
|
|
414
400
|
|