@astryxdesign/core 0.1.3 → 0.1.4-canary.01e5b29
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 +51 -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.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 +55 -53
- package/dist/AspectRatio/AspectRatio.js +5 -5
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +27 -25
- 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 +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.d.ts.map +1 -1
- package/dist/Button/Button.js +47 -26
- package/dist/ButtonGroup/ButtonGroup.js +7 -7
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +108 -64
- package/dist/Calendar/dayCellUtils.d.ts +67 -5
- package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
- package/dist/Calendar/dayCellUtils.js +139 -18
- 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 +20 -19
- 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.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.js +15 -15
- package/dist/CheckboxInput/CheckboxInput.d.ts +6 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +32 -24
- 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.d.ts +15 -1
- package/dist/Code/Code.d.ts.map +1 -1
- package/dist/Code/Code.js +35 -5
- package/dist/Code/index.d.ts +1 -1
- package/dist/Code/index.d.ts.map +1 -1
- 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/CodeBlock/index.d.ts +1 -1
- package/dist/CodeBlock/index.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.d.ts +9 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +110 -22
- package/dist/Collapsible/CollapsibleGroup.d.ts +39 -7
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +73 -12
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +31 -0
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +33 -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.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.js +27 -7
- 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 +9 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +16 -11
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +23 -23
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -7
- 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.d.ts +0 -22
- package/dist/Divider/Divider.d.ts.map +1 -1
- 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.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.js +5 -5
- 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.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/Markdown/parser.d.ts +7 -0
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +300 -6
- 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.d.ts +7 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +64 -55
- 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.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 +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.d.ts +7 -1
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +10 -8
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +30 -22
- 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.d.ts +6 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +54 -45
- 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.d.ts +6 -0
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +31 -22
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +10 -10
- package/dist/StatusDot/StatusDot.js +5 -5
- package/dist/Switch/Switch.d.ts +13 -4
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +41 -30
- 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 +51 -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.d.ts.map +1 -1
- package/dist/Table/TableCell.js +76 -7
- 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/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/index.d.ts +3 -0
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/index.js +3 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
- 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.d.ts +5 -1
- package/dist/Table/tableContextMenu.d.ts.map +1 -1
- package/dist/Table/tableContextMenu.js +19 -12
- package/dist/Text/Text.d.ts +1 -1
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +14 -13
- package/dist/Text/text.stylex.d.ts +35 -0
- package/dist/Text/text.stylex.d.ts.map +1 -1
- package/dist/Text/text.stylex.js +52 -1
- 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.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 +6 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +38 -29
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- 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/astryx.css +23 -0
- package/dist/astryx.umd.js +60 -58
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +13 -1
- 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/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 +3 -3
- package/src/AlertDialog/AlertDialog.tsx +2 -0
- package/src/AppShell/AppShell.tsx +2 -0
- package/src/AspectRatio/AspectRatio.doc.mjs +1 -1
- package/src/Avatar/Avatar.doc.mjs +13 -2
- package/src/Avatar/Avatar.test.tsx +32 -1
- package/src/Avatar/Avatar.tsx +12 -20
- 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/Button/Button.tsx +39 -6
- package/src/ButtonGroup/ButtonGroup.doc.mjs +1 -1
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +201 -17
- package/src/Calendar/Calendar.tsx +79 -26
- package/src/Calendar/dayCellUtils.test.ts +306 -1
- package/src/Calendar/dayCellUtils.ts +206 -13
- 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 +1 -0
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +24 -0
- package/src/Chat/ChatComposerInput.tsx +17 -1
- 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/useChatNewMessages.test.tsx +4 -4
- package/src/CheckboxInput/CheckboxInput.doc.mjs +12 -4
- package/src/CheckboxInput/CheckboxInput.test.tsx +103 -0
- package/src/CheckboxInput/CheckboxInput.tsx +13 -0
- package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
- 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/Code/Code.test.tsx +54 -0
- package/src/Code/Code.tsx +48 -4
- package/src/Code/index.ts +1 -1
- 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/CodeBlock/index.ts +1 -1
- package/src/Collapsible/Collapsible.doc.mjs +8 -4
- package/src/Collapsible/Collapsible.test.tsx +405 -0
- package/src/Collapsible/Collapsible.tsx +86 -10
- package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
- package/src/Collapsible/CollapsibleGroup.test.tsx +318 -0
- package/src/Collapsible/CollapsibleGroup.tsx +107 -9
- package/src/Collapsible/CollapsibleGroupContext.tsx +42 -2
- package/src/Collapsible/index.ts +4 -0
- package/src/Collapsible/useCollapsible.ts +20 -6
- package/src/CommandPalette/CommandPalette.tsx +5 -3
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
- package/src/CommandPalette/CommandPaletteEmpty.tsx +15 -1
- 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 +15 -0
- package/src/ContextMenu/ContextMenu.tsx +19 -1
- package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
- package/src/DateInput/DateInput.doc.mjs +6 -1
- package/src/DateInput/DateInput.test.tsx +11 -20
- package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
- package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
- package/src/DateRangeInput/DateRangeInput.tsx +2 -2
- package/src/DateTimeInput/DateTimeInput.doc.mjs +4 -3
- package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
- package/src/DateTimeInput/DateTimeInput.tsx +9 -8
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/DialogHeader.doc.mjs +45 -0
- package/src/Divider/Divider.tsx +1 -23
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +5 -3
- package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/Field/Field.doc.mjs +1 -1
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FieldStatus/FieldStatus.test.tsx +282 -0
- package/src/FileInput/FileInput.doc.mjs +1 -1
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
- package/src/Grid/Grid.doc.mjs +3 -3
- package/src/Grid/Grid.test.tsx +43 -18
- package/src/Grid/Grid.tsx +26 -9
- package/src/Icon/Icon.test.tsx +41 -29
- package/src/Icon/Icon.tsx +6 -2
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
- package/src/Item/Item.tsx +1 -1
- 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/Layout/__tests__/edgeCompensation.test.tsx +72 -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/Markdown/Markdown.test.tsx +23 -0
- package/src/Markdown/Markdown.tsx +9 -7
- package/src/Markdown/incremental.test.ts +36 -0
- package/src/Markdown/parser.perf.test.ts +34 -12
- package/src/Markdown/parser.test.ts +210 -0
- package/src/Markdown/parser.ts +301 -6
- package/src/MobileNav/MobileNav.doc.mjs +20 -0
- package/src/MultiSelector/MultiSelector.doc.mjs +14 -1
- package/src/MultiSelector/MultiSelector.test.tsx +33 -0
- package/src/MultiSelector/MultiSelector.tsx +20 -0
- 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/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/Pagination/Pagination.test.tsx +162 -0
- package/src/Pagination/Pagination.tsx +80 -26
- package/src/Popover/Popover.test.tsx +65 -0
- package/src/PowerSearch/PowerSearch.doc.mjs +4 -4
- package/src/PowerSearch/PowerSearch.test.tsx +109 -1
- package/src/PowerSearch/PowerSearch.tsx +37 -16
- package/src/ProgressBar/ProgressBar.test.tsx +30 -0
- package/src/ProgressBar/ProgressBar.tsx +12 -5
- package/src/RadioList/RadioList.doc.mjs +7 -1
- package/src/RadioList/RadioList.test.tsx +65 -0
- package/src/RadioList/RadioList.tsx +10 -1
- package/src/RadioList/RadioListItem.tsx +13 -4
- package/src/Resizable/ResizeHandle.test.tsx +218 -0
- package/src/Resizable/ResizeHandle.tsx +22 -4
- package/src/Section/Section.test.tsx +4 -10
- package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
- 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.doc.mjs +12 -1
- package/src/Selector/Selector.test.tsx +30 -0
- package/src/Selector/Selector.tsx +18 -0
- 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/Slider/Slider.doc.mjs +14 -2
- package/src/Slider/Slider.test.tsx +30 -0
- package/src/Slider/Slider.tsx +20 -0
- package/src/Spinner/Spinner.tsx +1 -0
- package/src/Switch/Switch.doc.mjs +21 -9
- package/src/Switch/Switch.test.tsx +137 -0
- package/src/Switch/Switch.tsx +32 -7
- package/src/TabList/TabList.doc.mjs +3 -3
- package/src/TabList/TabList.test.tsx +185 -1
- package/src/TabList/TabMenu.tsx +45 -9
- package/src/Table/BaseTable.tsx +16 -3
- package/src/Table/Table.test.tsx +87 -0
- package/src/Table/TableBody.tsx +15 -2
- package/src/Table/TableCell.tsx +87 -8
- 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/pagination/paginateData.ts +5 -1
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
- package/src/Table/plugins/rowExpansion/index.ts +7 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
- 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/tableContextMenu.test.tsx +27 -3
- package/src/Table/tableContextMenu.tsx +20 -2
- package/src/Table/useTablePagination.doc.mjs +4 -1
- package/src/Table/useTableRowExpansion.doc.mjs +80 -0
- package/src/Table/useTableSortable.doc.mjs +4 -1
- package/src/Text/Text.doc.mjs +2 -2
- package/src/Text/Text.test.tsx +11 -0
- package/src/Text/Text.tsx +4 -2
- package/src/Text/text.stylex.ts +41 -0
- package/src/TextArea/TextArea.doc.mjs +1 -1
- package/src/TextArea/TextArea.test.tsx +3 -3
- package/src/TextInput/TextInput.doc.mjs +1 -1
- 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.doc.mjs +11 -6
- 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/ToggleButton/ToggleButton.doc.mjs +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +16 -4
- package/src/Tokenizer/Tokenizer.test.tsx +33 -0
- package/src/Tokenizer/Tokenizer.tsx +19 -0
- package/src/Toolbar/Toolbar.test.tsx +1 -1
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +18 -0
- 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 +7 -2
- package/src/Typeahead/Typeahead.test.tsx +45 -1
- 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 +14 -0
- 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/useKeyboardHint.doc.mjs +6 -6
- package/src/hooks/useStreamingText.test.ts +54 -19
- package/src/hooks/useStreamingText.ts +16 -5
- 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/tokens.test.ts +182 -9
- package/src/theme/tokens.ts +239 -4
- package/src/theme/useTheme.test.tsx +20 -0
- 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/src/Markdown/parser.ts
CHANGED
|
@@ -81,6 +81,13 @@ export type ParseOptions = {
|
|
|
81
81
|
type ResolvedOptions = {
|
|
82
82
|
readonly sourceIds: ReadonlySet<string> | undefined;
|
|
83
83
|
readonly autolink: 'gfm' | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Link reference definitions (`[label]: url`) collected from the whole
|
|
86
|
+
* document, keyed by normalized label. Internal only — populated by the
|
|
87
|
+
* block parser, never by the public `ParseOptions`. Enables `parseInlineImpl`
|
|
88
|
+
* to resolve full/collapsed/shortcut reference links and images.
|
|
89
|
+
*/
|
|
90
|
+
readonly linkDefs?: ReadonlyMap<string, string>;
|
|
84
91
|
};
|
|
85
92
|
|
|
86
93
|
const EMPTY_OPTS: ResolvedOptions = {sourceIds: undefined, autolink: undefined};
|
|
@@ -103,6 +110,228 @@ function resolveOptions(
|
|
|
103
110
|
return {sourceIds: opts.sourceIds, autolink: opts.autolink};
|
|
104
111
|
}
|
|
105
112
|
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
// Link reference definitions
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
|
|
117
|
+
// A CommonMark link reference definition line: up to 3 leading spaces, a
|
|
118
|
+
// bracketed label, `:`, a destination (bare or `<...>`), and an optional
|
|
119
|
+
// same-line title (captured as group 4 so a title-less definition can absorb a
|
|
120
|
+
// title on the following line). `^`-leading labels (`[^1]:`) are footnote
|
|
121
|
+
// definitions — a separate, unsupported feature — and are excluded so they
|
|
122
|
+
// pass through verbatim.
|
|
123
|
+
const LINK_DEFINITION_RE =
|
|
124
|
+
/^ {0,3}\[([^\]^](?:\\.|[^\]\\])*)\]:[ \t]*(?:<([^<>\n]*)>|(\S+))([ \t]+(?:"[^"\n]*"|'[^'\n]*'|\([^()\n]*\)))?[ \t]*$/;
|
|
125
|
+
|
|
126
|
+
// A line that is nothing but a title — the continuation form allowed when a
|
|
127
|
+
// definition's destination is followed by its title on the next line.
|
|
128
|
+
const LINK_TITLE_ONLY_RE = /^ {0,3}(?:"[^"\n]*"|'[^'\n]*'|\([^()\n]*\))[ \t]*$/;
|
|
129
|
+
|
|
130
|
+
// CommonMark matches reference labels case-insensitively with leading/trailing
|
|
131
|
+
// whitespace stripped and internal whitespace runs collapsed to one space.
|
|
132
|
+
function normalizeLinkLabel(label: string): string {
|
|
133
|
+
return label.trim().replace(/\s+/g, ' ').toLowerCase();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function matchLinkDefinition(
|
|
137
|
+
line: string,
|
|
138
|
+
): {label: string; destination: string; hasTitle: boolean} | null {
|
|
139
|
+
const match = LINK_DEFINITION_RE.exec(line);
|
|
140
|
+
if (match == null) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
const label = normalizeLinkLabel(match[1]);
|
|
144
|
+
// `match[2]` is the `<...>` destination (present but possibly empty, e.g.
|
|
145
|
+
// `<>` → empty href, valid per CommonMark); `match[3]` is the bare
|
|
146
|
+
// destination (always non-empty). One of the two always matches.
|
|
147
|
+
const destination = match[2] != null ? match[2] : match[3];
|
|
148
|
+
if (label === '' || destination == null) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return {label, destination, hasTitle: match[4] != null};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Collect link reference definitions from the whole document and return the
|
|
156
|
+
* input with the definition lines removed. A definition is recognized at a
|
|
157
|
+
* block boundary — document start, after a blank line, after another
|
|
158
|
+
* definition, or after a self-contained block (heading / thematic break /
|
|
159
|
+
* closed fenced code) — but never inside a fenced code block or as a lazy
|
|
160
|
+
* continuation of a paragraph, honoring CommonMark's rule that a definition
|
|
161
|
+
* cannot interrupt a paragraph. First definition wins, and definitions produce
|
|
162
|
+
* no output so stripping unreferenced ones is correct.
|
|
163
|
+
*
|
|
164
|
+
* Scope limit: definitions are collected at the top level only, and a
|
|
165
|
+
* definition directly following a list, blockquote, or table (with no blank
|
|
166
|
+
* line between) is not recognized. A definition nested inside a blockquote or
|
|
167
|
+
* list item resolves within that container (via the recursive parse) but is
|
|
168
|
+
* not exposed to references elsewhere in the document, unlike full CommonMark
|
|
169
|
+
* where every definition is global. Separating a footer definition block with
|
|
170
|
+
* a blank line — the usual form — always works.
|
|
171
|
+
*/
|
|
172
|
+
function extractLinkDefinitions(input: string): {
|
|
173
|
+
defs: ReadonlyMap<string, string>;
|
|
174
|
+
cleaned: string;
|
|
175
|
+
} {
|
|
176
|
+
const lines = input.split('\n');
|
|
177
|
+
const defs = new Map<string, string>();
|
|
178
|
+
const keep = new Array<boolean>(lines.length).fill(true);
|
|
179
|
+
let atBoundary = true;
|
|
180
|
+
let inFence = false;
|
|
181
|
+
let fenceMarker = '';
|
|
182
|
+
|
|
183
|
+
for (let index = 0; index < lines.length; index++) {
|
|
184
|
+
const line = lines[index];
|
|
185
|
+
if (inFence) {
|
|
186
|
+
if (line.startsWith(fenceMarker)) {
|
|
187
|
+
inFence = false;
|
|
188
|
+
fenceMarker = '';
|
|
189
|
+
// The line after a closed fence begins a new block.
|
|
190
|
+
atBoundary = true;
|
|
191
|
+
} else {
|
|
192
|
+
atBoundary = false;
|
|
193
|
+
}
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const fenceMatch = line.match(/^(`{3,}|~{3,})/);
|
|
197
|
+
if (fenceMatch) {
|
|
198
|
+
inFence = true;
|
|
199
|
+
fenceMarker = fenceMatch[1];
|
|
200
|
+
atBoundary = false;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (line.trim() === '') {
|
|
204
|
+
atBoundary = true;
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (atBoundary) {
|
|
208
|
+
const def = matchLinkDefinition(line);
|
|
209
|
+
if (def != null) {
|
|
210
|
+
if (!defs.has(def.label)) {
|
|
211
|
+
defs.set(def.label, def.destination);
|
|
212
|
+
}
|
|
213
|
+
keep[index] = false;
|
|
214
|
+
// A title-less definition absorbs a title on the following line
|
|
215
|
+
// (CommonMark), which then also produces no output.
|
|
216
|
+
if (
|
|
217
|
+
!def.hasTitle &&
|
|
218
|
+
index + 1 < lines.length &&
|
|
219
|
+
LINK_TITLE_ONLY_RE.test(lines[index + 1])
|
|
220
|
+
) {
|
|
221
|
+
keep[index + 1] = false;
|
|
222
|
+
index++;
|
|
223
|
+
}
|
|
224
|
+
// Consecutive definitions stay at a block boundary.
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// A heading or thematic break is a self-contained single-line block, so
|
|
229
|
+
// the next line begins a new block where a definition may appear.
|
|
230
|
+
atBoundary = /^ {0,3}#{1,6}(?: |\t|$)/.test(line) || isHorizontalRule(line);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (defs.size === 0) {
|
|
234
|
+
return {defs, cleaned: input};
|
|
235
|
+
}
|
|
236
|
+
const cleaned = lines.filter((_, index) => keep[index]).join('\n');
|
|
237
|
+
return {defs, cleaned};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** Order-independent signature of a link-definition set, for cache checks. */
|
|
241
|
+
function linkDefsSignature(defs: ReadonlyMap<string, string>): string {
|
|
242
|
+
if (defs.size === 0) {
|
|
243
|
+
return '';
|
|
244
|
+
}
|
|
245
|
+
return [...defs]
|
|
246
|
+
.sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))
|
|
247
|
+
.map(([label, dest]) => `${label}\u0000${dest}`)
|
|
248
|
+
.join('\u0001');
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Resolve a full (`[text][label]`), collapsed (`[text][]`), or shortcut
|
|
253
|
+
* (`[text]`) reference at `start` (which points at `[`) against `linkDefs`.
|
|
254
|
+
* Returns the node plus the index just past the reference, or null when it is
|
|
255
|
+
* not a resolvable reference (caller falls through to literal handling).
|
|
256
|
+
*/
|
|
257
|
+
function matchReferenceLink(
|
|
258
|
+
text: string,
|
|
259
|
+
start: number,
|
|
260
|
+
linkDefs: ReadonlyMap<string, string>,
|
|
261
|
+
opts: ResolvedOptions,
|
|
262
|
+
): {node: InlineNode; end: number} | null {
|
|
263
|
+
const textClose = text.indexOf(']', start + 1);
|
|
264
|
+
if (textClose === -1) {
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
const linkText = text.slice(start + 1, textClose);
|
|
268
|
+
// Full `[text][label]` / collapsed `[text][]` — a matching definition wins.
|
|
269
|
+
if (text[textClose + 1] === '[') {
|
|
270
|
+
const labelClose = text.indexOf(']', textClose + 2);
|
|
271
|
+
if (labelClose !== -1) {
|
|
272
|
+
const rawLabel = text.slice(textClose + 2, labelClose);
|
|
273
|
+
// Only truly-empty brackets are the collapsed form; a whitespace-only
|
|
274
|
+
// label (`[ ]`) is a full reference whose normalized label is empty and
|
|
275
|
+
// matches nothing.
|
|
276
|
+
const label = rawLabel === '' ? linkText : rawLabel;
|
|
277
|
+
const href = linkDefs.get(normalizeLinkLabel(label));
|
|
278
|
+
if (href != null) {
|
|
279
|
+
return {
|
|
280
|
+
node: {type: 'link', href, children: parseInlineImpl(linkText, opts)},
|
|
281
|
+
end: labelClose + 1,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
// No match — fall back to a shortcut `[text]` (CommonMark back-off),
|
|
285
|
+
// leaving the trailing `[label]` to be parsed separately.
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// Shortcut: `[text]`.
|
|
289
|
+
if (linkText.trim() === '') {
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
const href = linkDefs.get(normalizeLinkLabel(linkText));
|
|
293
|
+
if (href == null) {
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
node: {type: 'link', href, children: parseInlineImpl(linkText, opts)},
|
|
298
|
+
end: textClose + 1,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/** Reference-image equivalent of {@link matchReferenceLink} (`![alt][label]`). */
|
|
303
|
+
function matchReferenceImage(
|
|
304
|
+
text: string,
|
|
305
|
+
start: number,
|
|
306
|
+
linkDefs: ReadonlyMap<string, string>,
|
|
307
|
+
): {node: InlineNode; end: number} | null {
|
|
308
|
+
const altClose = text.indexOf(']', start + 2);
|
|
309
|
+
if (altClose === -1) {
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
const alt = text.slice(start + 2, altClose);
|
|
313
|
+
if (text[altClose + 1] === '[') {
|
|
314
|
+
const labelClose = text.indexOf(']', altClose + 2);
|
|
315
|
+
if (labelClose !== -1) {
|
|
316
|
+
const rawLabel = text.slice(altClose + 2, labelClose);
|
|
317
|
+
const label = rawLabel === '' ? alt : rawLabel;
|
|
318
|
+
const src = linkDefs.get(normalizeLinkLabel(label));
|
|
319
|
+
if (src != null) {
|
|
320
|
+
return {node: {type: 'image', src, alt}, end: labelClose + 1};
|
|
321
|
+
}
|
|
322
|
+
// No match — fall back to a shortcut `![alt]`.
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (alt.trim() === '') {
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
const src = linkDefs.get(normalizeLinkLabel(alt));
|
|
329
|
+
if (src == null) {
|
|
330
|
+
return null;
|
|
331
|
+
}
|
|
332
|
+
return {node: {type: 'image', src, alt}, end: altClose + 1};
|
|
333
|
+
}
|
|
334
|
+
|
|
106
335
|
// ---------------------------------------------------------------------------
|
|
107
336
|
// Inline parser helpers
|
|
108
337
|
// ---------------------------------------------------------------------------
|
|
@@ -260,6 +489,16 @@ function parseInlineImpl(text: string, opts: ResolvedOptions): InlineNode[] {
|
|
|
260
489
|
}
|
|
261
490
|
}
|
|
262
491
|
|
|
492
|
+
// --- Reference image ![alt][label] / ![alt][] / ![alt] ---
|
|
493
|
+
if (opts.linkDefs != null && text[i] === '!' && text[i + 1] === '[') {
|
|
494
|
+
const ref = matchReferenceImage(text, i, opts.linkDefs);
|
|
495
|
+
if (ref) {
|
|
496
|
+
nodes.push(ref.node);
|
|
497
|
+
i = ref.end;
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
263
502
|
// --- Citation: bracket [id] (before link — link requires `(` after `]`) ---
|
|
264
503
|
{
|
|
265
504
|
const citation = matchBracketCitation(text, i, opts);
|
|
@@ -287,6 +526,16 @@ function parseInlineImpl(text: string, opts: ResolvedOptions): InlineNode[] {
|
|
|
287
526
|
}
|
|
288
527
|
}
|
|
289
528
|
|
|
529
|
+
// --- Reference link [text][label] / [text][] / [text] ---
|
|
530
|
+
if (opts.linkDefs != null && text[i] === '[') {
|
|
531
|
+
const ref = matchReferenceLink(text, i, opts.linkDefs, opts);
|
|
532
|
+
if (ref) {
|
|
533
|
+
nodes.push(ref.node);
|
|
534
|
+
i = ref.end;
|
|
535
|
+
continue;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
290
539
|
// --- Bold-italic: *** or ___ ---
|
|
291
540
|
if (
|
|
292
541
|
(text[i] === '*' && text[i + 1] === '*' && text[i + 2] === '*') ||
|
|
@@ -971,8 +1220,30 @@ export function parseMarkdown(
|
|
|
971
1220
|
return parseMarkdownImpl(input, resolveOptions(arg));
|
|
972
1221
|
}
|
|
973
1222
|
|
|
974
|
-
function parseMarkdownImpl(
|
|
975
|
-
|
|
1223
|
+
function parseMarkdownImpl(
|
|
1224
|
+
input: string,
|
|
1225
|
+
baseOpts: ResolvedOptions,
|
|
1226
|
+
): BlockNode[] {
|
|
1227
|
+
// Collect this input's link reference definitions and strip their lines,
|
|
1228
|
+
// then merge them with any definitions inherited from an enclosing parse
|
|
1229
|
+
// (the incremental parser passes the whole document's definitions in; a
|
|
1230
|
+
// recursive blockquote/list parse inherits the outer definitions). Inherited
|
|
1231
|
+
// definitions win on conflict, matching CommonMark's first-definition-wins
|
|
1232
|
+
// in document order; locally-nested definitions still resolve within this
|
|
1233
|
+
// parse.
|
|
1234
|
+
const {defs, cleaned} = extractLinkDefinitions(input);
|
|
1235
|
+
const inherited = baseOpts.linkDefs;
|
|
1236
|
+
let linkDefs: ReadonlyMap<string, string> | undefined;
|
|
1237
|
+
if (defs.size === 0) {
|
|
1238
|
+
linkDefs = inherited;
|
|
1239
|
+
} else if (inherited == null) {
|
|
1240
|
+
linkDefs = defs;
|
|
1241
|
+
} else {
|
|
1242
|
+
linkDefs = new Map<string, string>([...defs, ...inherited]);
|
|
1243
|
+
}
|
|
1244
|
+
const opts: ResolvedOptions =
|
|
1245
|
+
linkDefs != null ? {...baseOpts, linkDefs} : baseOpts;
|
|
1246
|
+
const lines = cleaned.split('\n');
|
|
976
1247
|
const blocks: BlockNode[] = [];
|
|
977
1248
|
let index = 0;
|
|
978
1249
|
|
|
@@ -1106,6 +1377,13 @@ export interface IncrementalState {
|
|
|
1106
1377
|
* with newly-arriving content.
|
|
1107
1378
|
*/
|
|
1108
1379
|
autolink?: 'gfm';
|
|
1380
|
+
/**
|
|
1381
|
+
* Signature of the link reference definitions the cached `settledBlocks`
|
|
1382
|
+
* were parsed with. Definitions are document-global and typically arrive
|
|
1383
|
+
* (in a footer) after the references that use them, so when the set changes
|
|
1384
|
+
* the settled cache is invalidated to let earlier references resolve.
|
|
1385
|
+
*/
|
|
1386
|
+
linkDefsKey?: string;
|
|
1109
1387
|
}
|
|
1110
1388
|
|
|
1111
1389
|
export function createIncrementalState(): IncrementalState {
|
|
@@ -1434,16 +1712,33 @@ export function parseMarkdownIncremental(
|
|
|
1434
1712
|
state.settledText = '';
|
|
1435
1713
|
state.settledBlocks = [];
|
|
1436
1714
|
state.settledUpTo = 0;
|
|
1715
|
+
state.linkDefsKey = undefined;
|
|
1437
1716
|
return [];
|
|
1438
1717
|
}
|
|
1439
1718
|
|
|
1719
|
+
// Link reference definitions are document-global and usually stream in
|
|
1720
|
+
// (as a footer) after the references that use them, so collect them from the
|
|
1721
|
+
// whole input and pass them into every slice parse. When the set changes,
|
|
1722
|
+
// invalidate the settled cache so already-settled references re-resolve.
|
|
1723
|
+
const {defs: linkDefs} = extractLinkDefinitions(input);
|
|
1724
|
+
const linkDefsKey = linkDefsSignature(linkDefs);
|
|
1725
|
+
if (state.linkDefsKey !== linkDefsKey) {
|
|
1726
|
+
state.prevInput = '';
|
|
1727
|
+
state.settledText = '';
|
|
1728
|
+
state.settledBlocks = [];
|
|
1729
|
+
state.settledUpTo = 0;
|
|
1730
|
+
state.linkDefsKey = linkDefsKey;
|
|
1731
|
+
}
|
|
1732
|
+
const parseOpts: ResolvedOptions =
|
|
1733
|
+
linkDefs.size > 0 ? {...opts, linkDefs} : opts;
|
|
1734
|
+
|
|
1440
1735
|
const lines = input.split('\n');
|
|
1441
1736
|
const boundary = findSettledBoundary(lines);
|
|
1442
1737
|
|
|
1443
1738
|
if (boundary < 0) {
|
|
1444
1739
|
// Inside an unclosed fence or no blank-line boundary — full re-parse
|
|
1445
1740
|
state.prevInput = input;
|
|
1446
|
-
return parseMarkdownImpl(input,
|
|
1741
|
+
return parseMarkdownImpl(input, parseOpts);
|
|
1447
1742
|
}
|
|
1448
1743
|
|
|
1449
1744
|
const settledText = lines.slice(0, boundary).join('\n');
|
|
@@ -1461,15 +1756,15 @@ export function parseMarkdownIncremental(
|
|
|
1461
1756
|
) {
|
|
1462
1757
|
// Settled portion grew — parse only the new delta
|
|
1463
1758
|
const delta = settledText.slice(state.settledText.length);
|
|
1464
|
-
const deltaBlocks = parseMarkdownImpl(delta,
|
|
1759
|
+
const deltaBlocks = parseMarkdownImpl(delta, parseOpts);
|
|
1465
1760
|
settledBlocks = mergeSettledBlocks(state.settledBlocks, deltaBlocks);
|
|
1466
1761
|
} else {
|
|
1467
1762
|
// Content before the boundary changed — full re-parse of settled portion
|
|
1468
|
-
settledBlocks = parseMarkdownImpl(settledText,
|
|
1763
|
+
settledBlocks = parseMarkdownImpl(settledText, parseOpts);
|
|
1469
1764
|
}
|
|
1470
1765
|
|
|
1471
1766
|
const unsettledBlocks = unsettledText
|
|
1472
|
-
? parseMarkdownImpl(unsettledText,
|
|
1767
|
+
? parseMarkdownImpl(unsettledText, parseOpts)
|
|
1473
1768
|
: [];
|
|
1474
1769
|
|
|
1475
1770
|
state.settledText = settledText;
|
|
@@ -14,6 +14,26 @@ export const docs = {
|
|
|
14
14
|
name: 'MobileNav',
|
|
15
15
|
displayName: 'Mobile Nav',
|
|
16
16
|
description: 'A slide-out drawer for mobile navigation. Accepts SideNav children.',
|
|
17
|
+
// The drawer opens via showModal() and renders nothing while closed —
|
|
18
|
+
// overlay mode gives the Properties preview an open trigger instead of
|
|
19
|
+
// an empty stage (#2706). Declared on this entry (not the directory
|
|
20
|
+
// doc) so MobileNavToggle does not inherit it.
|
|
21
|
+
playground: {
|
|
22
|
+
overlay: true,
|
|
23
|
+
defaults: {
|
|
24
|
+
isOpen: false,
|
|
25
|
+
header: 'Navigation',
|
|
26
|
+
children: {
|
|
27
|
+
__element: 'SideNavSection',
|
|
28
|
+
props: {title: 'Main'},
|
|
29
|
+
children: [
|
|
30
|
+
{__element: 'SideNavItem', props: {label: 'Dashboard', isSelected: true}},
|
|
31
|
+
{__element: 'SideNavItem', props: {label: 'Projects'}},
|
|
32
|
+
{__element: 'SideNavItem', props: {label: 'Settings'}},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
17
37
|
props: [
|
|
18
38
|
{
|
|
19
39
|
name: 'isOpen',
|
|
@@ -112,11 +112,17 @@ export const docs = {
|
|
|
112
112
|
type: 'boolean',
|
|
113
113
|
description: 'Disables the selector.',
|
|
114
114
|
},
|
|
115
|
+
{
|
|
116
|
+
name: 'htmlName',
|
|
117
|
+
type: 'string',
|
|
118
|
+
description:
|
|
119
|
+
'The HTML name attribute for form submissions. Renders one hidden input per selected value, like a native multi-select.',
|
|
120
|
+
},
|
|
115
121
|
{
|
|
116
122
|
name: 'disabledMessage',
|
|
117
123
|
type: 'string',
|
|
118
124
|
description:
|
|
119
|
-
'Explains why the selector is disabled. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the trigger focusable via aria-disabled (activation stays blocked). Use this instead of wrapping a disabled MultiSelector in Tooltip
|
|
125
|
+
'Explains why the selector is disabled. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the trigger focusable via aria-disabled (activation stays blocked). Use this instead of wrapping a disabled MultiSelector in Tooltip. Disabled controls swallow the hover events an external Tooltip needs.',
|
|
120
126
|
},
|
|
121
127
|
{
|
|
122
128
|
name: 'isLabelHidden',
|
|
@@ -233,6 +239,7 @@ export const docsZh = {
|
|
|
233
239
|
hasSearch: '是否显示用于过滤选项的搜索输入。',
|
|
234
240
|
searchPlaceholder: '搜索输入的占位文本。',
|
|
235
241
|
isDisabled: '禁用选择器。',
|
|
242
|
+
htmlName: '用于表单提交的 HTML name 属性。为每个已选值渲染一个隐藏输入,类似原生多选。',
|
|
236
243
|
disabledMessage:
|
|
237
244
|
'解释选择器被禁用的原因。与 isDisabled 一起使用时,悬停/键盘聚焦时显示工具提示,并通过 aria-disabled 保持触发器可聚焦(仍无法激活)。请使用此属性,而不是用 Tooltip 包裹被禁用的选择器。',
|
|
238
245
|
isLabelHidden: '视觉上隐藏标签同时保持其可访问性。',
|
|
@@ -316,6 +323,11 @@ export const docsDense = {
|
|
|
316
323
|
description:
|
|
317
324
|
'Enable select-all when most users will want all or nearly all options selected.',
|
|
318
325
|
},
|
|
326
|
+
{
|
|
327
|
+
guidance: true,
|
|
328
|
+
description:
|
|
329
|
+
'Use inside InputGroup only for a short prefix or suffix addon; prefer count or labels trigger display so the group stays single-line.',
|
|
330
|
+
},
|
|
319
331
|
{
|
|
320
332
|
guidance: false,
|
|
321
333
|
description: 'Use for single-value selection; use Selector instead.',
|
|
@@ -352,6 +364,7 @@ export const docsDense = {
|
|
|
352
364
|
hasSearch: 'show search input',
|
|
353
365
|
searchPlaceholder: 'search placeholder',
|
|
354
366
|
isDisabled: 'disables selector',
|
|
367
|
+
htmlName: 'HTML name attr; one hidden input per selected value.',
|
|
355
368
|
disabledMessage:
|
|
356
369
|
'why disabled; w/ isDisabled shows tooltip on hover/focus, trigger stays focusable via aria-disabled; use instead of Tooltip wrapper',
|
|
357
370
|
isLabelHidden: 'visually hides label',
|
|
@@ -1042,4 +1042,37 @@ describe('MultiSelector', () => {
|
|
|
1042
1042
|
expect(trigger).toHaveAttribute('tabIndex', '-1');
|
|
1043
1043
|
});
|
|
1044
1044
|
});
|
|
1045
|
+
describe('form participation', () => {
|
|
1046
|
+
it('submits one entry per selected value under htmlName', () => {
|
|
1047
|
+
const {container} = render(
|
|
1048
|
+
<form>
|
|
1049
|
+
<MultiSelector
|
|
1050
|
+
label="Fruit"
|
|
1051
|
+
htmlName="fruit"
|
|
1052
|
+
options={['Apple', 'Banana', 'Orange']}
|
|
1053
|
+
value={['Apple', 'Orange']}
|
|
1054
|
+
onChange={() => {}}
|
|
1055
|
+
/>
|
|
1056
|
+
</form>,
|
|
1057
|
+
);
|
|
1058
|
+
const data = new FormData(container.querySelector('form')!);
|
|
1059
|
+
expect(data.getAll('fruit')).toEqual(['Apple', 'Orange']);
|
|
1060
|
+
});
|
|
1061
|
+
|
|
1062
|
+
it('is excluded from form data when disabled', () => {
|
|
1063
|
+
const {container} = render(
|
|
1064
|
+
<form>
|
|
1065
|
+
<MultiSelector
|
|
1066
|
+
label="Fruit"
|
|
1067
|
+
htmlName="fruit"
|
|
1068
|
+
options={['Apple']}
|
|
1069
|
+
value={['Apple']}
|
|
1070
|
+
onChange={() => {}}
|
|
1071
|
+
isDisabled
|
|
1072
|
+
/>
|
|
1073
|
+
</form>,
|
|
1074
|
+
);
|
|
1075
|
+
expect([...new FormData(container.querySelector('form')!).keys()]).toEqual([]);
|
|
1076
|
+
});
|
|
1077
|
+
});
|
|
1045
1078
|
});
|
|
@@ -439,6 +439,13 @@ export interface MultiSelectorProps<
|
|
|
439
439
|
*/
|
|
440
440
|
value: string[];
|
|
441
441
|
|
|
442
|
+
/**
|
|
443
|
+
* The HTML name attribute for form submissions. When set, hidden inputs
|
|
444
|
+
* carry one entry per selected value under this name, matching how a
|
|
445
|
+
* native multi-select serializes.
|
|
446
|
+
*/
|
|
447
|
+
htmlName?: string;
|
|
448
|
+
|
|
442
449
|
/**
|
|
443
450
|
* Callback when selection changes.
|
|
444
451
|
*/
|
|
@@ -597,6 +604,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
597
604
|
renderOption,
|
|
598
605
|
isDefaultOpen = false,
|
|
599
606
|
'data-testid': testId,
|
|
607
|
+
htmlName,
|
|
600
608
|
width,
|
|
601
609
|
xstyle,
|
|
602
610
|
className,
|
|
@@ -1280,6 +1288,18 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1280
1288
|
{renderTriggerContent()}
|
|
1281
1289
|
</span>
|
|
1282
1290
|
</button>
|
|
1291
|
+
{htmlName != null &&
|
|
1292
|
+
value.map(v => (
|
|
1293
|
+
<input
|
|
1294
|
+
key={v}
|
|
1295
|
+
type="hidden"
|
|
1296
|
+
name={htmlName}
|
|
1297
|
+
value={v}
|
|
1298
|
+
// Disabled native controls are excluded from form submission;
|
|
1299
|
+
// mirror that for the hidden carriers.
|
|
1300
|
+
disabled={isDisabled}
|
|
1301
|
+
/>
|
|
1302
|
+
))}
|
|
1283
1303
|
{isBusy && <Spinner size="sm" />}
|
|
1284
1304
|
{hasClear && value.length > 0 && !isDisabled && (
|
|
1285
1305
|
<button
|
|
@@ -17,12 +17,27 @@ export const docs = {
|
|
|
17
17
|
'NavHeadingMenuItem renders individual selectable items. ' +
|
|
18
18
|
'Pass as the menu prop of SideNavHeading or TopNavHeading.',
|
|
19
19
|
},
|
|
20
|
+
playground: {
|
|
21
|
+
defaults: {
|
|
22
|
+
children: [
|
|
23
|
+
{__element: 'NavHeadingMenuItem', props: {label: 'Dashboard', href: '#'}},
|
|
24
|
+
{__element: 'NavHeadingMenuItem', props: {label: 'Analytics', href: '#'}},
|
|
25
|
+
{__element: 'NavHeadingMenuItem', props: {label: 'Settings', href: '#'}},
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
},
|
|
20
29
|
props: [
|
|
21
30
|
{name: 'children', type: 'ReactNode', required: true, description: 'Menu items.'},
|
|
22
31
|
{name: 'size', type: "'sm' | 'md' | 'lg'", default: "'md'", description: 'Controls min-width and item padding.'},
|
|
23
32
|
{name: 'minWidth', type: 'number | string', description: 'Minimum width override.'},
|
|
24
33
|
{name: 'xstyle', type: 'StyleXStyles', description: 'StyleX styles for layout customization (margins, positioning, sizing). Must be a stylex.create() value, not an inline style object like style={{}}.'},
|
|
25
34
|
],
|
|
35
|
+
theming: {
|
|
36
|
+
targets: [
|
|
37
|
+
{className: 'astryx-nav-heading-menu', visualProps: ['size']},
|
|
38
|
+
{className: 'astryx-nav-heading-menu-item', visualProps: ['size']},
|
|
39
|
+
],
|
|
40
|
+
},
|
|
26
41
|
};
|
|
27
42
|
|
|
28
43
|
/** @type {import('../docs-types').TranslationDoc} */
|
|
@@ -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 {TestIcon} from '../__tests__/TestIcon';
|
|
16
16
|
import {NumberInput} from './NumberInput';
|
|
17
17
|
|
|
18
18
|
// Mock showPopover/hidePopover since jsdom does not implement them. Used by the
|
|
@@ -174,7 +174,7 @@ describe('NumberInput', () => {
|
|
|
174
174
|
label="Count"
|
|
175
175
|
value={null}
|
|
176
176
|
onChange={() => {}}
|
|
177
|
-
startIcon={
|
|
177
|
+
startIcon={TestIcon}
|
|
178
178
|
/>,
|
|
179
179
|
);
|
|
180
180
|
expect(screen.getByRole('spinbutton')).toBeInTheDocument();
|
|
@@ -707,7 +707,7 @@ describe('NumberInput', () => {
|
|
|
707
707
|
label="Qty"
|
|
708
708
|
value={0}
|
|
709
709
|
onChange={() => {}}
|
|
710
|
-
startIcon={<
|
|
710
|
+
startIcon={<TestIcon />}
|
|
711
711
|
/>,
|
|
712
712
|
);
|
|
713
713
|
|
|
@@ -867,3 +867,48 @@ describe('NumberInput', () => {
|
|
|
867
867
|
});
|
|
868
868
|
});
|
|
869
869
|
});
|
|
870
|
+
|
|
871
|
+
describe('keyboard clearing with hasClear (#3599)', () => {
|
|
872
|
+
it('commits null when the input is emptied and blurred', () => {
|
|
873
|
+
const onChange = vi.fn();
|
|
874
|
+
render(
|
|
875
|
+
<NumberInput label="Qty" hasClear value={42} onChange={onChange} />,
|
|
876
|
+
);
|
|
877
|
+
const input = screen.getByLabelText('Qty');
|
|
878
|
+
fireEvent.change(input, {target: {value: ''}});
|
|
879
|
+
fireEvent.blur(input);
|
|
880
|
+
expect(onChange).toHaveBeenCalledWith(null);
|
|
881
|
+
});
|
|
882
|
+
|
|
883
|
+
it('commits null when the input is emptied and Enter is pressed', () => {
|
|
884
|
+
const onChange = vi.fn();
|
|
885
|
+
render(
|
|
886
|
+
<NumberInput label="Qty" hasClear value={42} onChange={onChange} />,
|
|
887
|
+
);
|
|
888
|
+
const input = screen.getByLabelText('Qty');
|
|
889
|
+
fireEvent.change(input, {target: {value: ''}});
|
|
890
|
+
fireEvent.keyDown(input, {key: 'Enter'});
|
|
891
|
+
expect(onChange).toHaveBeenCalledWith(null);
|
|
892
|
+
});
|
|
893
|
+
|
|
894
|
+
it('does not fire when emptied and blurred with no prior value', () => {
|
|
895
|
+
const onChange = vi.fn();
|
|
896
|
+
render(
|
|
897
|
+
<NumberInput label="Qty" hasClear value={null} onChange={onChange} />,
|
|
898
|
+
);
|
|
899
|
+
const input = screen.getByLabelText('Qty');
|
|
900
|
+
fireEvent.change(input, {target: {value: ''}});
|
|
901
|
+
fireEvent.blur(input);
|
|
902
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
903
|
+
});
|
|
904
|
+
|
|
905
|
+
it('still reverts on blur when hasClear is not set', () => {
|
|
906
|
+
const onChange = vi.fn();
|
|
907
|
+
render(<NumberInput label="Qty" value={42} onChange={onChange} />);
|
|
908
|
+
const input = screen.getByLabelText('Qty');
|
|
909
|
+
fireEvent.change(input, {target: {value: ''}});
|
|
910
|
+
fireEvent.blur(input);
|
|
911
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
912
|
+
expect((input as HTMLInputElement).value).toBe('42');
|
|
913
|
+
});
|
|
914
|
+
});
|