@astryxdesign/core 0.1.4 → 0.1.5-canary.76e6697
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +141 -0
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +20 -18
- package/dist/AlertDialog/useImperativeAlertDialog.d.ts +0 -2
- package/dist/AlertDialog/useImperativeAlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/useImperativeAlertDialog.js +3 -5
- package/dist/AppShell/AppShell.d.ts +1 -1
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +55 -53
- package/dist/AspectRatio/AspectRatio.d.ts +48 -10
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +33 -12
- 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 +28 -26
- package/dist/Avatar/AvatarStatusDot.js +6 -6
- package/dist/AvatarGroup/AvatarGroup.js +6 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -7
- package/dist/Badge/Badge.js +3 -3
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +32 -25
- 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 +68 -48
- 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 +4 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +18 -10
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +24 -21
- 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 +27 -15
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +13 -11
- 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 +12 -10
- 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 +14 -12
- 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 +24 -15
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +81 -74
- 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 +25 -23
- 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 +8 -6
- package/dist/Citation/Citation.js +10 -10
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +32 -9
- package/dist/Code/Code.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts +10 -1
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +88 -52
- package/dist/Collapsible/Collapsible.d.ts +9 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +109 -22
- package/dist/Collapsible/CollapsibleGroup.d.ts +37 -7
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +64 -12
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +24 -0
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +26 -3
- package/dist/Collapsible/index.d.ts +1 -0
- package/dist/Collapsible/index.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.d.ts +4 -1
- package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.js +20 -6
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +36 -34
- 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 +7 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +76 -43
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +21 -21
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +30 -26
- 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 +2 -17
- 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 +4 -3
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +29 -12
- 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 +5 -1
- 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 +16 -12
- 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 +29 -2
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +44 -31
- 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 +55 -31
- package/dist/Lightbox/useLightbox.d.ts +0 -1
- package/dist/Lightbox/useLightbox.d.ts.map +1 -1
- package/dist/Lightbox/useLightbox.js +3 -4
- package/dist/Link/Link.d.ts +0 -2
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +15 -17
- 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.d.ts +1 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +26 -23
- 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 +48 -32
- 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.d.ts +0 -3
- package/dist/Overlay/useOverlay.d.ts.map +1 -1
- package/dist/Overlay/useOverlay.js +3 -6
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +125 -72
- 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 +110 -92
- 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 +25 -18
- 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 +24 -21
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +28 -10
- 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 +32 -10
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
- 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 +38 -34
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +8 -6
- 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 +18 -16
- 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 +8 -4
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +34 -29
- 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 +57 -30
- package/dist/TabList/tab.markers.stylex.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +50 -39
- 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 +9 -5
- 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 +9 -5
- package/dist/Table/TableHeader.d.ts +1 -1
- package/dist/Table/TableHeader.d.ts.map +1 -1
- package/dist/Table/TableHeader.js +9 -5
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/TableRow.js +5 -5
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
- package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
- package/dist/Table/plugins/groupedRows/index.d.ts +3 -0
- package/dist/Table/plugins/groupedRows/index.d.ts.map +1 -0
- package/dist/Table/plugins/groupedRows/index.js +3 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +78 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +250 -0
- package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/paginateData.js +5 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +23 -23
- 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 +11 -1
- 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 +8 -4
- 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 +3 -2
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +30 -29
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +26 -21
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +37 -26
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +25 -17
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +23 -11
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +44 -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 +36 -34
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.d.ts +5 -1
- 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 +25 -14
- 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 +23 -20
- package/dist/Typeahead/Typeahead.js +12 -12
- package/dist/Typeahead/TypeaheadItem.js +10 -10
- package/dist/VStack/VStack.js +3 -3
- package/dist/VisuallyHidden/VisuallyHidden.d.ts +0 -3
- package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.js +0 -3
- package/dist/astryx.css +7 -0
- package/dist/astryx.umd.js +63 -63
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +8 -2
- 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 +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +3 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +38 -1
- package/dist/hooks/useHotkeys.d.ts +51 -0
- package/dist/hooks/useHotkeys.d.ts.map +1 -0
- package/dist/hooks/useHotkeys.js +160 -0
- package/dist/hooks/useInteractiveRole.d.ts +6 -2
- package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
- package/dist/hooks/useInteractiveRole.js +6 -2
- package/dist/hooks/useKeyboardHint.js +9 -9
- package/dist/hooks/useStreamingText.d.ts +3 -1
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +14 -5
- 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 +10 -3
- package/dist/theme/hct.d.ts +0 -15
- 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 +10 -2
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +220 -4
- package/dist/theme/useTheme.d.ts +3 -2
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +73 -6
- package/dist/utils/color.d.ts +42 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/color.js +150 -0
- package/dist/utils/composeEventHandlers.d.ts +30 -0
- package/dist/utils/composeEventHandlers.d.ts.map +1 -0
- package/dist/utils/composeEventHandlers.js +40 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +8 -5
- package/package.json +4 -4
- package/src/AlertDialog/AlertDialog.doc.mjs +4 -0
- package/src/AlertDialog/AlertDialog.tsx +2 -0
- package/src/AlertDialog/useImperativeAlertDialog.tsx +0 -2
- package/src/AppShell/AppShell.tsx +2 -0
- package/src/AspectRatio/AspectRatio.doc.mjs +28 -1
- package/src/AspectRatio/AspectRatio.test.tsx +142 -1
- package/src/AspectRatio/AspectRatio.tsx +70 -10
- package/src/AspectRatio/index.ts +5 -1
- package/src/Avatar/Avatar.doc.mjs +11 -0
- package/src/Avatar/Avatar.test.tsx +32 -1
- package/src/Avatar/Avatar.tsx +14 -22
- package/src/Avatar/AvatarStatusDot.tsx +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +1 -0
- package/src/AvatarGroup/AvatarGroup.tsx +2 -2
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -2
- package/src/Banner/Banner.doc.mjs +8 -0
- package/src/Banner/Banner.test.tsx +38 -0
- package/src/Banner/Banner.tsx +8 -1
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +122 -17
- package/src/Calendar/Calendar.tsx +26 -5
- package/src/Calendar/dayCellUtils.ts +3 -1
- package/src/Calendar/styles.ts +12 -2
- package/src/Card/Card.doc.mjs +1 -1
- package/src/Card/Card.tsx +16 -6
- package/src/Carousel/Carousel.doc.mjs +12 -12
- package/src/Carousel/Carousel.test.tsx +13 -0
- package/src/Carousel/Carousel.tsx +4 -2
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +27 -1
- package/src/Chat/ChatComposerInput.tsx +20 -15
- package/src/Chat/ChatDictationButton.test.tsx +43 -0
- package/src/Chat/ChatDictationButton.tsx +4 -4
- package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
- package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
- package/src/Chat/ChatMessageMetadata.tsx +4 -6
- package/src/Chat/ChatSystemMessage.test.tsx +26 -11
- package/src/Chat/ChatSystemMessage.tsx +7 -7
- package/src/Chat/ChatTokenizedText.test.tsx +29 -16
- package/src/Chat/ChatTokenizedText.tsx +15 -8
- package/src/Chat/ChatToolCalls.test.tsx +55 -0
- package/src/Chat/ChatToolCalls.tsx +10 -12
- package/src/Chat/index.ts +1 -4
- package/src/Chat/useTriggerMenu.tsx +1 -4
- package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
- package/src/CheckboxInput/CheckboxInput.test.tsx +71 -4
- package/src/CheckboxInput/CheckboxInput.tsx +2 -0
- package/src/CheckboxList/CheckboxList.test.tsx +19 -0
- package/src/CheckboxList/CheckboxListItem.tsx +11 -2
- package/src/Citation/Citation.doc.mjs +5 -0
- package/src/ClickableCard/ClickableCard.tsx +45 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
- package/src/CodeBlock/CodeBlock.test.tsx +122 -3
- package/src/CodeBlock/CodeBlock.tsx +62 -4
- package/src/Collapsible/Collapsible.doc.mjs +8 -4
- package/src/Collapsible/Collapsible.test.tsx +403 -0
- package/src/Collapsible/Collapsible.tsx +85 -10
- package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
- package/src/Collapsible/CollapsibleGroup.test.tsx +314 -0
- package/src/Collapsible/CollapsibleGroup.tsx +97 -9
- package/src/Collapsible/CollapsibleGroupContext.tsx +34 -2
- package/src/Collapsible/index.ts +1 -0
- package/src/Collapsible/useCollapsible.ts +20 -6
- package/src/CommandPalette/CommandPalette.doc.mjs +5 -0
- package/src/CommandPalette/CommandPalette.tsx +5 -3
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
- package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
- package/src/ContextMenu/ContextMenu.test.tsx +87 -0
- package/src/ContextMenu/ContextMenu.tsx +87 -28
- package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
- package/src/DateInput/DateInput.test.tsx +11 -20
- package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -6
- package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
- package/src/DateTimeInput/DateTimeInput.doc.mjs +3 -2
- package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
- package/src/DateTimeInput/DateTimeInput.tsx +8 -2
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +4 -0
- package/src/Dialog/DialogHeader.doc.mjs +45 -0
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +22 -2
- package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/Field/Field.test.tsx +1 -4
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FieldStatus/FieldStatus.test.tsx +282 -0
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
- package/src/Grid/Grid.test.tsx +43 -18
- package/src/Grid/Grid.tsx +26 -9
- package/src/HoverCard/HoverCard.doc.mjs +6 -6
- package/src/HoverCard/useHoverCard.doc.mjs +5 -5
- package/src/HoverCard/useHoverCard.tsx +9 -2
- package/src/Icon/Icon.test.tsx +41 -29
- package/src/Icon/Icon.tsx +6 -2
- package/src/InputGroup/InputGroup.doc.mjs +1 -0
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
- package/src/Item/Item.tsx +1 -1
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +221 -2
- package/src/Layer/useLayer.tsx +69 -30
- package/src/Layout/Layout.test.tsx +285 -0
- package/src/Layout/LayoutContent.doc.mjs +12 -0
- package/src/Layout/LayoutPanel.doc.mjs +40 -0
- package/src/Layout/LayoutSlots.test.tsx +364 -0
- package/src/Lightbox/Lightbox.doc.mjs +5 -0
- package/src/Lightbox/Lightbox.test.tsx +123 -2
- package/src/Lightbox/Lightbox.tsx +29 -1
- package/src/Lightbox/useLightbox.tsx +0 -1
- package/src/Link/Link.tsx +0 -2
- package/src/Markdown/Markdown.tsx +9 -7
- package/src/Markdown/parser.perf.test.ts +34 -12
- package/src/MobileNav/MobileNav.test.tsx +56 -0
- package/src/MobileNav/MobileNav.tsx +13 -8
- package/src/NavMenu/NavMenu.doc.mjs +15 -0
- package/src/NumberInput/NumberInput.test.tsx +48 -3
- package/src/NumberInput/NumberInput.tsx +32 -15
- package/src/Outline/Outline.doc.mjs +2 -0
- package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
- package/src/OverflowList/OverflowList.test.tsx +416 -0
- package/src/Overlay/Overlay.doc.mjs +6 -0
- package/src/Overlay/Overlay.test.tsx +356 -0
- package/src/Overlay/useOverlay.tsx +0 -3
- package/src/Pagination/Pagination.test.tsx +162 -0
- package/src/Pagination/Pagination.tsx +80 -26
- package/src/Popover/Popover.doc.mjs +6 -6
- package/src/Popover/Popover.test.tsx +65 -0
- package/src/Popover/usePopover.doc.mjs +1 -1
- package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
- package/src/PowerSearch/PowerSearch.test.tsx +109 -1
- package/src/PowerSearch/PowerSearch.tsx +37 -16
- package/src/ProgressBar/ProgressBar.doc.mjs +2 -0
- package/src/ProgressBar/ProgressBar.test.tsx +30 -0
- package/src/ProgressBar/ProgressBar.tsx +12 -5
- package/src/RadioList/RadioList.test.tsx +19 -0
- package/src/RadioList/RadioListItem.tsx +9 -4
- package/src/Resizable/ResizeHandle.test.tsx +218 -0
- package/src/Resizable/ResizeHandle.tsx +22 -4
- package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
- package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
- package/src/SegmentedControl/SegmentedControl.tsx +27 -5
- package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.test.tsx +27 -1
- package/src/SideNav/SideNav.doc.mjs +7 -1
- package/src/SideNav/SideNav.test.tsx +66 -0
- package/src/SideNav/SideNav.tsx +6 -2
- package/src/SideNav/SideNavCollapseButton.tsx +4 -3
- package/src/SideNav/SideNavSection.tsx +6 -4
- package/src/SizeContext/SizeContext.test.tsx +226 -0
- package/src/Switch/Switch.doc.mjs +7 -7
- package/src/Switch/Switch.test.tsx +102 -3
- package/src/Switch/Switch.tsx +20 -7
- package/src/TabList/TabList.test.tsx +185 -1
- package/src/TabList/TabMenu.tsx +45 -9
- package/src/Table/BaseTable.tsx +13 -2
- package/src/Table/Table.doc.mjs +6 -1
- package/src/Table/Table.test.tsx +87 -0
- package/src/Table/TableBody.tsx +15 -2
- package/src/Table/TableFooter.tsx +15 -2
- package/src/Table/TableHeader.tsx +15 -2
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
- package/src/Table/plugins/groupedRows/index.ts +7 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +231 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +349 -0
- package/src/Table/plugins/pagination/paginateData.ts +5 -1
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +1 -1
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
- package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
- package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
- package/src/Table/useTableGroupedRows.doc.mjs +71 -0
- package/src/TextArea/TextArea.test.tsx +3 -3
- package/src/TextInput/TextInput.test.tsx +3 -3
- package/src/Thumbnail/Thumbnail.test.tsx +36 -2
- package/src/Thumbnail/Thumbnail.tsx +4 -2
- package/src/TimeInput/TimeInput.test.tsx +37 -0
- package/src/TimeInput/TimeInput.tsx +11 -1
- package/src/Timestamp/Timestamp.doc.mjs +1 -1
- package/src/Timestamp/Timestamp.test.tsx +52 -0
- package/src/Timestamp/Timestamp.tsx +30 -16
- package/src/Toast/Toast.tsx +11 -3
- package/src/Toast/ToastViewport.test.tsx +64 -0
- package/src/Toast/ToastViewport.tsx +12 -0
- package/src/Toast/useToast.test.tsx +258 -0
- package/src/Toast/useToast.tsx +41 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +54 -0
- package/src/Tokenizer/Tokenizer.tsx +5 -4
- package/src/Tooltip/Tooltip.doc.mjs +6 -6
- package/src/Tooltip/useTooltip.doc.mjs +5 -5
- package/src/Tooltip/useTooltip.tsx +12 -2
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +23 -7
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
- package/src/TreeList/TreeList.doc.mjs +2 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
- package/src/Typeahead/BaseTypeahead.tsx +5 -2
- package/src/Typeahead/Typeahead.doc.mjs +1 -1
- package/src/Typeahead/Typeahead.test.tsx +45 -1
- package/src/VisuallyHidden/VisuallyHidden.tsx +0 -3
- package/src/__tests__/TestIcon.tsx +26 -0
- package/src/__tests__/fastRoleQueries.ts +66 -0
- package/src/docPropReferences.test.ts +178 -0
- package/src/docs-types.ts +9 -1
- package/src/hooks/focusableSelector.ts +1 -1
- package/src/hooks/index.ts +3 -0
- package/src/hooks/useFocusTrap.doc.mjs +4 -2
- package/src/hooks/useFocusTrap.test.tsx +149 -1
- package/src/hooks/useFocusTrap.ts +50 -1
- package/src/hooks/useHotkeys.doc.mjs +52 -0
- package/src/hooks/useHotkeys.test.ts +245 -0
- package/src/hooks/useHotkeys.ts +203 -0
- package/src/hooks/useInteractiveRole.ts +12 -4
- package/src/hooks/useStreamingText.test.ts +54 -19
- package/src/hooks/useStreamingText.ts +16 -5
- package/src/hooks/useTreeFocus.test.tsx +1 -3
- package/src/reset.css +29 -0
- package/src/theme/SyntaxTheme.doc.mjs +4 -4
- package/src/theme/defineTheme.ts +4 -13
- package/src/theme/derivedVarRegistry.test.ts +2 -2
- package/src/theme/expandColorScale.test.ts +29 -0
- package/src/theme/expandColorScale.ts +11 -6
- package/src/theme/hct.ts +9 -17
- package/src/theme/themingTargets.test.ts +353 -0
- package/src/theme/tokens.test.ts +182 -9
- package/src/theme/tokens.ts +239 -4
- package/src/theme/useTheme.test.tsx +126 -2
- package/src/theme/useTheme.ts +87 -6
- package/src/utils/color.test.ts +133 -0
- package/src/utils/color.ts +148 -0
- package/src/utils/composeEventHandlers.test.ts +71 -0
- package/src/utils/composeEventHandlers.ts +44 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/mergeProps.test.ts +166 -0
- package/src/utils/sharedResizeObserver.test.ts +2 -2
- package/src/utils/timeParser.test.ts +13 -0
- package/src/utils/timeParser.ts +8 -5
- package/dist/Carousel/carousel.markers.stylex.d.ts +0 -7
- package/dist/Carousel/carousel.markers.stylex.d.ts.map +0 -1
- package/dist/Carousel/carousel.markers.stylex.js +0 -12
- package/src/Carousel/carousel.markers.stylex.ts +0 -10
|
@@ -50,6 +50,12 @@ export const docs = {
|
|
|
50
50
|
description: 'StyleX styles for layout customization. Must be a stylex.create() value.',
|
|
51
51
|
},
|
|
52
52
|
],
|
|
53
|
+
playground: {
|
|
54
|
+
defaults: {
|
|
55
|
+
value: 'go-home',
|
|
56
|
+
children: 'Go to Dashboard',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
53
59
|
};
|
|
54
60
|
|
|
55
61
|
export const docsZh = {
|
|
@@ -27,6 +27,15 @@ export const docs = {
|
|
|
27
27
|
description: 'StyleX styles for layout customization. Must be a stylex.create() value.',
|
|
28
28
|
},
|
|
29
29
|
],
|
|
30
|
+
playground: {
|
|
31
|
+
defaults: {
|
|
32
|
+
children: [
|
|
33
|
+
{__element: 'CommandPaletteItem', props: {value: 'home', onSelect: undefined}, children: 'Go Home'},
|
|
34
|
+
{__element: 'CommandPaletteItem', props: {value: 'settings', onSelect: undefined}, children: 'Open Settings'},
|
|
35
|
+
{__element: 'CommandPaletteItem', props: {value: 'profile', onSelect: undefined}, children: 'View Profile'},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
},
|
|
30
39
|
};
|
|
31
40
|
|
|
32
41
|
export const docsZh = {
|
|
@@ -78,6 +78,21 @@ export const docs = {
|
|
|
78
78
|
{ guidance: false, description: 'Place more than 10–12 items in a single menu without grouping them into sections.' },
|
|
79
79
|
],
|
|
80
80
|
},
|
|
81
|
+
playground: {
|
|
82
|
+
defaults: {
|
|
83
|
+
children: {
|
|
84
|
+
__element: 'Card',
|
|
85
|
+
props: {padding: 6},
|
|
86
|
+
children: {__element: 'Text', props: {color: 'secondary'}, children: 'Right-click this area'},
|
|
87
|
+
},
|
|
88
|
+
items: [
|
|
89
|
+
{label: 'Edit'},
|
|
90
|
+
{label: 'Duplicate'},
|
|
91
|
+
{type: 'divider'},
|
|
92
|
+
{label: 'Delete'},
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
},
|
|
81
96
|
};
|
|
82
97
|
|
|
83
98
|
/** @type {import('../docs-types').TranslationDoc} */
|
|
@@ -172,6 +172,21 @@ describe('ContextMenu', () => {
|
|
|
172
172
|
expect(preventDefault).toHaveBeenCalled();
|
|
173
173
|
});
|
|
174
174
|
|
|
175
|
+
it('prevents default context menu on the opened menu container', () => {
|
|
176
|
+
render(
|
|
177
|
+
<ContextMenu items={[{label: 'Item 1'}]}>
|
|
178
|
+
<div>Right-click me</div>
|
|
179
|
+
</ContextMenu>,
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
fireEvent.contextMenu(screen.getByText('Right-click me'));
|
|
183
|
+
const menu = screen.getByRole('menu', {hidden: true});
|
|
184
|
+
const event = new MouseEvent('contextmenu', {bubbles: true});
|
|
185
|
+
const preventDefault = vi.spyOn(event, 'preventDefault');
|
|
186
|
+
menu.dispatchEvent(event);
|
|
187
|
+
expect(preventDefault).toHaveBeenCalled();
|
|
188
|
+
});
|
|
189
|
+
|
|
175
190
|
it('does not open when isDisabled is true', () => {
|
|
176
191
|
render(
|
|
177
192
|
<ContextMenu items={[{label: 'Item 1'}]} isDisabled>
|
|
@@ -449,4 +464,76 @@ describe('ContextMenu compound mode', () => {
|
|
|
449
464
|
).toBeInTheDocument();
|
|
450
465
|
expect(screen.getByRole('separator', {hidden: true})).toBeInTheDocument();
|
|
451
466
|
});
|
|
467
|
+
|
|
468
|
+
describe('cursor anchor positioning (#3465)', () => {
|
|
469
|
+
// The menu is anchored to a zero-size element placed at the cursor point
|
|
470
|
+
// *inside the trigger*, so it is positioned relative to the trigger's
|
|
471
|
+
// context (scroll-follow + auto-flip) rather than the viewport.
|
|
472
|
+
function getCursorAnchor(trigger: HTMLElement): HTMLElement {
|
|
473
|
+
const anchor = trigger.querySelector<HTMLElement>('[aria-hidden="true"]');
|
|
474
|
+
if (!anchor) {
|
|
475
|
+
throw new Error('cursor anchor not found');
|
|
476
|
+
}
|
|
477
|
+
return anchor;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
it('renders a zero-size cursor anchor inside the trigger', () => {
|
|
481
|
+
render(
|
|
482
|
+
<ContextMenu items={[{label: 'Item 1'}]} data-testid="ctx">
|
|
483
|
+
<div>Right-click me</div>
|
|
484
|
+
</ContextMenu>,
|
|
485
|
+
);
|
|
486
|
+
const anchor = getCursorAnchor(screen.getByTestId('ctx'));
|
|
487
|
+
expect(anchor.tagName).toBe('SPAN');
|
|
488
|
+
// Carries an anchor-name so the menu can be anchored to it via CSS
|
|
489
|
+
// anchor positioning (context mode), not fixed viewport coordinates.
|
|
490
|
+
expect(anchor.style.anchorName).toMatch(/^--astryx-layer-/);
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
it('places the cursor anchor at the pointer position relative to the trigger', () => {
|
|
494
|
+
render(
|
|
495
|
+
<ContextMenu items={[{label: 'Item 1'}]} data-testid="ctx">
|
|
496
|
+
<div>Right-click me</div>
|
|
497
|
+
</ContextMenu>,
|
|
498
|
+
);
|
|
499
|
+
const trigger = screen.getByTestId('ctx');
|
|
500
|
+
trigger.getBoundingClientRect = () =>
|
|
501
|
+
({
|
|
502
|
+
left: 100,
|
|
503
|
+
top: 50,
|
|
504
|
+
right: 300,
|
|
505
|
+
bottom: 150,
|
|
506
|
+
width: 200,
|
|
507
|
+
height: 100,
|
|
508
|
+
}) as DOMRect;
|
|
509
|
+
// Pointer at viewport (170, 90) -> local trigger offset (70, 40).
|
|
510
|
+
fireEvent.contextMenu(trigger, {clientX: 170, clientY: 90, detail: 1});
|
|
511
|
+
const anchor = getCursorAnchor(trigger);
|
|
512
|
+
expect(anchor.style.left).toBe('70px');
|
|
513
|
+
expect(anchor.style.top).toBe('40px');
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
it('anchors a keyboard-invoked menu to the trigger bottom-left', () => {
|
|
517
|
+
render(
|
|
518
|
+
<ContextMenu items={[{label: 'Item 1'}]} data-testid="ctx">
|
|
519
|
+
<div>Right-click me</div>
|
|
520
|
+
</ContextMenu>,
|
|
521
|
+
);
|
|
522
|
+
const trigger = screen.getByTestId('ctx');
|
|
523
|
+
trigger.getBoundingClientRect = () =>
|
|
524
|
+
({
|
|
525
|
+
left: 40,
|
|
526
|
+
top: 10,
|
|
527
|
+
right: 100,
|
|
528
|
+
bottom: 30,
|
|
529
|
+
width: 60,
|
|
530
|
+
height: 20,
|
|
531
|
+
}) as DOMRect;
|
|
532
|
+
// Keyboard-initiated contextmenu: coords (0,0), detail 0 -> local (0, height).
|
|
533
|
+
fireEvent.contextMenu(trigger, {clientX: 0, clientY: 0, detail: 0});
|
|
534
|
+
const anchor = getCursorAnchor(trigger);
|
|
535
|
+
expect(anchor.style.left).toBe('0px');
|
|
536
|
+
expect(anchor.style.top).toBe('20px');
|
|
537
|
+
});
|
|
538
|
+
});
|
|
452
539
|
});
|
|
@@ -3,11 +3,16 @@
|
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @file ContextMenu.tsx
|
|
6
|
-
* @input Uses React, StyleX, useLayer (
|
|
6
|
+
* @input Uses React, StyleX, useLayer (context mode), useListFocus
|
|
7
7
|
* @output Exports ContextMenu component
|
|
8
8
|
* @position Core implementation; consumed by index.ts
|
|
9
9
|
*
|
|
10
|
-
* Right-click context menu positioned at cursor
|
|
10
|
+
* Right-click context menu positioned at the cursor. The cursor point is
|
|
11
|
+
* captured as an offset *inside the trigger* and materialized as a zero-size
|
|
12
|
+
* anchor element, so the menu is positioned relative to the trigger's context
|
|
13
|
+
* (via CSS anchor positioning) rather than the viewport. It therefore follows
|
|
14
|
+
* the content on scroll and auto-flips at viewport edges, while still appearing
|
|
15
|
+
* under the cursor.
|
|
11
16
|
* Reuses DropdownMenu item rendering and keyboard navigation.
|
|
12
17
|
*
|
|
13
18
|
* Supports two content modes with a single keyboard/focus path:
|
|
@@ -53,7 +58,7 @@ import {
|
|
|
53
58
|
easeVars,
|
|
54
59
|
shadowVars,
|
|
55
60
|
} from '../theme/tokens.stylex';
|
|
56
|
-
import {mergeProps} from '../utils';
|
|
61
|
+
import {mergeProps, mergeRefs} from '../utils';
|
|
57
62
|
import type {BaseProps} from '../BaseProps';
|
|
58
63
|
import type {StyleXStyles} from '../theme/types';
|
|
59
64
|
import {themeProps} from '../utils/themeProps';
|
|
@@ -67,9 +72,23 @@ import type {
|
|
|
67
72
|
const styles = stylex.create({
|
|
68
73
|
// Trigger wrapper: suppress the iOS long-press callout/selection so the
|
|
69
74
|
// long-press opens our context menu instead of the native text/callout UI.
|
|
75
|
+
// `position: relative` establishes the containing block for the absolutely
|
|
76
|
+
// positioned cursor anchor below, so the anchor point tracks the trigger
|
|
77
|
+
// (and scrolls with it) instead of the page.
|
|
70
78
|
trigger: {
|
|
79
|
+
position: 'relative',
|
|
71
80
|
WebkitTouchCallout: 'none',
|
|
72
81
|
},
|
|
82
|
+
// Zero-size anchor placed at the cursor point within the trigger. The menu
|
|
83
|
+
// is anchored to this element, so it sits under the cursor yet is positioned
|
|
84
|
+
// relative to the trigger's context — it follows the content on scroll and
|
|
85
|
+
// the browser can auto-flip it against the viewport edges.
|
|
86
|
+
cursorAnchor: {
|
|
87
|
+
position: 'absolute',
|
|
88
|
+
width: 0,
|
|
89
|
+
height: 0,
|
|
90
|
+
pointerEvents: 'none',
|
|
91
|
+
},
|
|
73
92
|
menu: {
|
|
74
93
|
boxSizing: 'border-box',
|
|
75
94
|
display: 'flex',
|
|
@@ -87,6 +106,7 @@ const styles = stylex.create({
|
|
|
87
106
|
transitionProperty: 'opacity',
|
|
88
107
|
transitionDuration: durationVars['--duration-fast'],
|
|
89
108
|
transitionTimingFunction: easeVars['--ease-standard'],
|
|
109
|
+
userSelect: 'none',
|
|
90
110
|
},
|
|
91
111
|
popover: {
|
|
92
112
|
minWidth: '160px',
|
|
@@ -200,7 +220,13 @@ export function ContextMenu({
|
|
|
200
220
|
const menuContent = 'menuContent' in props ? props.menuContent : undefined;
|
|
201
221
|
|
|
202
222
|
const menuId = useId();
|
|
223
|
+
// Cursor point in the trigger's local coordinate space (offset from the
|
|
224
|
+
// trigger's top-left, in-flow). Stored here and written to the zero-size
|
|
225
|
+
// anchor element so the menu is positioned relative to the trigger context
|
|
226
|
+
// — it scrolls with the content instead of sitting at a fixed viewport point.
|
|
203
227
|
const positionRef = useRef({x: 0, y: 0});
|
|
228
|
+
const cursorAnchorRef = useRef<HTMLSpanElement>(null);
|
|
229
|
+
const triggerRef = useRef<HTMLDivElement>(null);
|
|
204
230
|
// Element focused before the menu opened, restored when it closes so focus
|
|
205
231
|
// does not fall to <body> after Escape or outside-click dismissal.
|
|
206
232
|
const triggerFocusRef = useRef<HTMLElement | null>(null);
|
|
@@ -208,7 +234,7 @@ export function ContextMenu({
|
|
|
208
234
|
const [isOpen, setIsOpen] = useState(false);
|
|
209
235
|
|
|
210
236
|
const layer = useLayer({
|
|
211
|
-
mode: '
|
|
237
|
+
mode: 'context',
|
|
212
238
|
onHide: useCallback(() => {
|
|
213
239
|
setIsOpen(false);
|
|
214
240
|
onOpenChange?.(false);
|
|
@@ -326,34 +352,53 @@ export function ContextMenu({
|
|
|
326
352
|
[listNavKeyDown, typeahead],
|
|
327
353
|
);
|
|
328
354
|
|
|
355
|
+
// Place the zero-size cursor anchor at a point in the trigger's local
|
|
356
|
+
// coordinate space and open the menu. Positioning the anchor inside the
|
|
357
|
+
// trigger (rather than storing viewport coordinates on the menu itself) is
|
|
358
|
+
// what makes the menu context-relative: it scrolls with the content and the
|
|
359
|
+
// browser auto-flips it against the viewport edges via CSS anchor positioning.
|
|
360
|
+
const openAtLocalPoint = useCallback(
|
|
361
|
+
(localX: number, localY: number, focusEl: HTMLElement | null) => {
|
|
362
|
+
positionRef.current = {x: localX, y: localY};
|
|
363
|
+
const anchorEl = cursorAnchorRef.current;
|
|
364
|
+
if (anchorEl) {
|
|
365
|
+
anchorEl.style.left = `${localX}px`;
|
|
366
|
+
anchorEl.style.top = `${localY}px`;
|
|
367
|
+
}
|
|
368
|
+
// Remember the element focused before opening so we can restore it on
|
|
369
|
+
// close (Escape or outside-click), instead of dropping focus to <body>.
|
|
370
|
+
triggerFocusRef.current =
|
|
371
|
+
document.activeElement instanceof HTMLElement
|
|
372
|
+
? document.activeElement
|
|
373
|
+
: focusEl;
|
|
374
|
+
layer.show();
|
|
375
|
+
requestAnimationFrame(() => focusFirst());
|
|
376
|
+
},
|
|
377
|
+
[layer, focusFirst],
|
|
378
|
+
);
|
|
379
|
+
|
|
329
380
|
const handleContextMenu = useCallback(
|
|
330
381
|
(e: React.MouseEvent) => {
|
|
331
382
|
if (isDisabled) {
|
|
332
383
|
return;
|
|
333
384
|
}
|
|
334
385
|
e.preventDefault();
|
|
386
|
+
const trigger = triggerRef.current;
|
|
387
|
+
const rect = trigger?.getBoundingClientRect();
|
|
335
388
|
// A keyboard-initiated contextmenu (Shift+F10 / the Menu key) fires a
|
|
336
389
|
// `contextmenu` event whose coordinates are (0, 0) in several browsers.
|
|
337
|
-
// Detect that and anchor the menu to the trigger's
|
|
338
|
-
// menu is reachable without a pointer (menus-8).
|
|
390
|
+
// Detect that and anchor the menu to the trigger's bottom-left instead,
|
|
391
|
+
// so the menu is reachable without a pointer (menus-8).
|
|
339
392
|
const isKeyboardInvoked =
|
|
340
393
|
e.clientX === 0 && e.clientY === 0 && e.detail === 0;
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
// Remember the element focused before opening so we can restore it on
|
|
348
|
-
// close (Escape or outside-click), instead of dropping focus to <body>.
|
|
349
|
-
triggerFocusRef.current =
|
|
350
|
-
document.activeElement instanceof HTMLElement
|
|
351
|
-
? document.activeElement
|
|
352
|
-
: (e.currentTarget as HTMLElement);
|
|
353
|
-
layer.show();
|
|
354
|
-
requestAnimationFrame(() => focusFirst());
|
|
394
|
+
// Convert the viewport cursor point into the trigger's local space so
|
|
395
|
+
// the anchor lives inside the (scrollable) trigger context.
|
|
396
|
+
const localX = isKeyboardInvoked || !rect ? 0 : e.clientX - rect.left;
|
|
397
|
+
const localY =
|
|
398
|
+
isKeyboardInvoked || !rect ? (rect?.height ?? 0) : e.clientY - rect.top;
|
|
399
|
+
openAtLocalPoint(localX, localY, e.currentTarget as HTMLElement);
|
|
355
400
|
},
|
|
356
|
-
[isDisabled,
|
|
401
|
+
[isDisabled, openAtLocalPoint],
|
|
357
402
|
);
|
|
358
403
|
|
|
359
404
|
// Touch long-press invocation (menus-8). iOS Safari never synthesizes a
|
|
@@ -364,11 +409,14 @@ export function ContextMenu({
|
|
|
364
409
|
disabled: isDisabled,
|
|
365
410
|
onLongPress: useCallback(
|
|
366
411
|
(point: {x: number; y: number}) => {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
412
|
+
const rect = triggerRef.current?.getBoundingClientRect();
|
|
413
|
+
openAtLocalPoint(
|
|
414
|
+
rect ? point.x - rect.left : point.x,
|
|
415
|
+
rect ? point.y - rect.top : point.y,
|
|
416
|
+
triggerRef.current,
|
|
417
|
+
);
|
|
370
418
|
},
|
|
371
|
-
[
|
|
419
|
+
[openAtLocalPoint],
|
|
372
420
|
),
|
|
373
421
|
});
|
|
374
422
|
|
|
@@ -387,7 +435,7 @@ export function ContextMenu({
|
|
|
387
435
|
return (
|
|
388
436
|
<>
|
|
389
437
|
<div
|
|
390
|
-
ref={ref}
|
|
438
|
+
ref={mergeRefs(ref, triggerRef)}
|
|
391
439
|
onContextMenu={handleContextMenu}
|
|
392
440
|
{...longPressHandlers}
|
|
393
441
|
data-testid={testId}
|
|
@@ -400,6 +448,16 @@ export function ContextMenu({
|
|
|
400
448
|
: []),
|
|
401
449
|
)}>
|
|
402
450
|
{children}
|
|
451
|
+
<span
|
|
452
|
+
ref={mergeRefs(cursorAnchorRef, layer.ref)}
|
|
453
|
+
aria-hidden="true"
|
|
454
|
+
{...mergeProps(stylex.props(styles.cursorAnchor), {
|
|
455
|
+
style: {
|
|
456
|
+
left: `${positionRef.current.x}px`,
|
|
457
|
+
top: `${positionRef.current.y}px`,
|
|
458
|
+
},
|
|
459
|
+
})}
|
|
460
|
+
/>
|
|
403
461
|
</div>
|
|
404
462
|
|
|
405
463
|
{layer.render(
|
|
@@ -409,6 +467,7 @@ export function ContextMenu({
|
|
|
409
467
|
role="menu"
|
|
410
468
|
aria-label={label}
|
|
411
469
|
onKeyDown={listKeyDown}
|
|
470
|
+
onContextMenu={e => e.preventDefault()}
|
|
412
471
|
{...mergeProps(
|
|
413
472
|
themeProps('context-menu'),
|
|
414
473
|
stylex.props(styles.menu, xstyle),
|
|
@@ -420,8 +479,8 @@ export function ContextMenu({
|
|
|
420
479
|
</DropdownMenuContext>
|
|
421
480
|
</div>,
|
|
422
481
|
{
|
|
423
|
-
|
|
424
|
-
|
|
482
|
+
placement: 'below',
|
|
483
|
+
alignment: 'start',
|
|
425
484
|
xstyle: [popoverXstyle, layerAnimations.below],
|
|
426
485
|
},
|
|
427
486
|
)}
|
|
@@ -12,6 +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 {getButton, queryButton} from '../__tests__/fastRoleQueries';
|
|
15
16
|
import {DateInput} from './DateInput';
|
|
16
17
|
import {InputGroup} from '../InputGroup';
|
|
17
18
|
import {InputGroupText} from '../InputGroup/InputGroupText';
|
|
@@ -92,14 +93,14 @@ describe('DateInput', () => {
|
|
|
92
93
|
|
|
93
94
|
it('calendar button is focusable and clickable', () => {
|
|
94
95
|
render(<DateInput label="Date" onChange={() => {}} />);
|
|
95
|
-
const button =
|
|
96
|
+
const button = getButton('Open calendar');
|
|
96
97
|
expect(button).toBeInTheDocument();
|
|
97
98
|
expect(button).not.toBeDisabled();
|
|
98
99
|
});
|
|
99
100
|
|
|
100
101
|
it('calendar button is disabled when isDisabled is true', () => {
|
|
101
102
|
render(<DateInput label="Date" isDisabled onChange={() => {}} />);
|
|
102
|
-
const button =
|
|
103
|
+
const button = getButton('Open calendar');
|
|
103
104
|
expect(button).toBeDisabled();
|
|
104
105
|
});
|
|
105
106
|
|
|
@@ -282,7 +283,7 @@ describe('DateInput', () => {
|
|
|
282
283
|
it('disables input and button when isLoading is true', () => {
|
|
283
284
|
render(<DateInput label="Date" isLoading onChange={() => {}} />);
|
|
284
285
|
expect(screen.getByRole('combobox')).toBeDisabled();
|
|
285
|
-
expect(
|
|
286
|
+
expect(getButton('Open calendar')).toBeDisabled();
|
|
286
287
|
});
|
|
287
288
|
|
|
288
289
|
it('shows spinner when isLoading is true', () => {
|
|
@@ -475,7 +476,7 @@ describe('DateInput', () => {
|
|
|
475
476
|
|
|
476
477
|
it('does not open popover when clicking calendar button while disabled', () => {
|
|
477
478
|
render(<DateInput label="Date" isDisabled onChange={() => {}} />);
|
|
478
|
-
const button =
|
|
479
|
+
const button = getButton('Open calendar');
|
|
479
480
|
fireEvent.click(button);
|
|
480
481
|
expect(screen.getByRole('combobox')).toHaveAttribute(
|
|
481
482
|
'aria-expanded',
|
|
@@ -513,23 +514,17 @@ describe('DateInput', () => {
|
|
|
513
514
|
hasClear
|
|
514
515
|
/>,
|
|
515
516
|
);
|
|
516
|
-
expect(
|
|
517
|
-
screen.getByRole('button', {name: 'Clear Date'}),
|
|
518
|
-
).toBeInTheDocument();
|
|
517
|
+
expect(getButton('Clear Date')).toBeInTheDocument();
|
|
519
518
|
});
|
|
520
519
|
|
|
521
520
|
it('does not show clear button when value is undefined', () => {
|
|
522
521
|
render(<DateInput label="Date" onChange={() => {}} hasClear />);
|
|
523
|
-
expect(
|
|
524
|
-
screen.queryByRole('button', {name: 'Clear Date'}),
|
|
525
|
-
).not.toBeInTheDocument();
|
|
522
|
+
expect(queryButton('Clear Date')).not.toBeInTheDocument();
|
|
526
523
|
});
|
|
527
524
|
|
|
528
525
|
it('does not show clear button when hasClear is false', () => {
|
|
529
526
|
render(<DateInput label="Date" value="2026-01-15" onChange={() => {}} />);
|
|
530
|
-
expect(
|
|
531
|
-
screen.queryByRole('button', {name: 'Clear Date'}),
|
|
532
|
-
).not.toBeInTheDocument();
|
|
527
|
+
expect(queryButton('Clear Date')).not.toBeInTheDocument();
|
|
533
528
|
});
|
|
534
529
|
|
|
535
530
|
it('does not show clear button when disabled', () => {
|
|
@@ -542,9 +537,7 @@ describe('DateInput', () => {
|
|
|
542
537
|
isDisabled
|
|
543
538
|
/>,
|
|
544
539
|
);
|
|
545
|
-
expect(
|
|
546
|
-
screen.queryByRole('button', {name: 'Clear Date'}),
|
|
547
|
-
).not.toBeInTheDocument();
|
|
540
|
+
expect(queryButton('Clear Date')).not.toBeInTheDocument();
|
|
548
541
|
});
|
|
549
542
|
|
|
550
543
|
it('calls onChange with undefined when clear is clicked', () => {
|
|
@@ -557,7 +550,7 @@ describe('DateInput', () => {
|
|
|
557
550
|
hasClear
|
|
558
551
|
/>,
|
|
559
552
|
);
|
|
560
|
-
fireEvent.click(
|
|
553
|
+
fireEvent.click(getButton('Clear Date'));
|
|
561
554
|
expect(onChange).toHaveBeenCalledWith(undefined);
|
|
562
555
|
});
|
|
563
556
|
});
|
|
@@ -699,9 +692,7 @@ describe('DateInput', () => {
|
|
|
699
692
|
expect(input).toHaveAttribute('aria-disabled', 'true');
|
|
700
693
|
expect(input.getAttribute('aria-describedby')).toContain(tooltip.id);
|
|
701
694
|
expect(tooltip).toHaveTextContent('Scheduling is locked');
|
|
702
|
-
expect(
|
|
703
|
-
screen.getByRole('button', {name: 'Open calendar'}),
|
|
704
|
-
).toBeDisabled();
|
|
695
|
+
expect(getButton('Open calendar')).toBeDisabled();
|
|
705
696
|
});
|
|
706
697
|
});
|
|
707
698
|
|
|
@@ -57,7 +57,8 @@ export const docs = {
|
|
|
57
57
|
{
|
|
58
58
|
name: 'value',
|
|
59
59
|
type: 'DateRange | null',
|
|
60
|
-
description:
|
|
60
|
+
description:
|
|
61
|
+
'Selected date range or null. Import the `DateRange` type from `@astryxdesign/core/DateRangeInput` — it is `{start: ISODateString, end: ISODateString}`. Do NOT redeclare your own DateRange type; use the exported one so TypeScript structurally matches.',
|
|
61
62
|
required: true,
|
|
62
63
|
},
|
|
63
64
|
{
|
|
@@ -83,12 +84,14 @@ export const docs = {
|
|
|
83
84
|
{
|
|
84
85
|
name: 'min',
|
|
85
86
|
type: 'ISODateString',
|
|
86
|
-
description:
|
|
87
|
+
description:
|
|
88
|
+
'Minimum selectable date. `ISODateString` is a template literal type (`\\`${number}${number}${number}${number}-${number}${number}-${number}${number}\\``) — pass a string literal like `"2026-01-28"`, not a runtime string variable. Import it from `@astryxdesign/core/Calendar` or use `as ISODateString` if computing the value dynamically.',
|
|
87
89
|
},
|
|
88
90
|
{
|
|
89
91
|
name: 'max',
|
|
90
92
|
type: 'ISODateString',
|
|
91
|
-
description:
|
|
93
|
+
description:
|
|
94
|
+
'Maximum selectable date. Same template literal type as `min` — use a YYYY-MM-DD string literal or cast with `as ISODateString`.',
|
|
92
95
|
},
|
|
93
96
|
{
|
|
94
97
|
name: 'dateConstraints',
|
|
@@ -283,10 +286,10 @@ export const docsDense = {
|
|
|
283
286
|
isDisabled: 'disable trigger+picker',
|
|
284
287
|
disabledMessage:
|
|
285
288
|
'reason shown in a tooltip on hover/focus when disabled; keeps trigger focusable via aria-disabled',
|
|
286
|
-
value: 'selected range {start, end} or null',
|
|
289
|
+
value: 'selected range {start, end} or null — import DateRange type from @astryxdesign/core/DateRangeInput (do not redeclare)',
|
|
287
290
|
onChange: 'callback on range change; null on clear',
|
|
288
|
-
min: 'min selectable date',
|
|
289
|
-
max: 'max selectable date',
|
|
291
|
+
min: 'min selectable date — ISODateString template literal type (YYYY-MM-DD); use string literal or cast `as ISODateString`',
|
|
292
|
+
max: 'max selectable date — ISODateString template literal type (YYYY-MM-DD); use string literal or cast `as ISODateString`',
|
|
290
293
|
dateConstraints: 'custom constraint fns to disable dates',
|
|
291
294
|
presets: 'preset ranges as quick-select options',
|
|
292
295
|
hasClear: 'clear button when range is set (default true)',
|