@astryxdesign/core 0.4.7 → 0.5.0-canary.055e75f
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 +161 -1
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +45 -20
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +3 -2
- package/dist/AspectRatio/AspectRatio.d.ts +24 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +23 -4
- package/dist/Avatar/Avatar.d.ts +25 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +58 -19
- package/dist/Avatar/index.d.ts +2 -2
- package/dist/Avatar/index.d.ts.map +1 -1
- package/dist/Avatar/index.js +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +8 -4
- package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
- package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
- package/dist/Banner/Banner.d.ts +40 -15
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +51 -18
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +17 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +11 -6
- package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +26 -7
- package/dist/Calendar/Calendar.d.ts +3 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +14 -15
- package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
- package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
- package/dist/Calendar/getInitialFocusDate.js +62 -0
- package/dist/Calendar/styles.d.ts +5 -14
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +15 -15
- package/dist/Card/Card.d.ts +6 -9
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +6 -6
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +3 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -3
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +3 -3
- package/dist/Chat/ChatMessageList.d.ts +22 -3
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +6 -3
- package/dist/Chat/ChatTokenizedText.d.ts +2 -0
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +11 -6
- package/dist/Chat/useChatComposerTokens.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +10 -3
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +15 -4
- package/dist/CodeBlock/highlightRanges.js +1 -1
- package/dist/CodeBlock/highlightStyles.js +13 -13
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +3 -2
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +3 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +4 -3
- package/dist/DateInput/DateInput.d.ts +43 -0
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +22 -2
- package/dist/DateInput/NativeDateField.d.ts +10 -0
- package/dist/DateInput/NativeDateField.d.ts.map +1 -0
- package/dist/DateInput/NativeDateField.js +494 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +82 -23
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateInput/nativeDateSegments.d.ts +22 -0
- package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
- package/dist/DateInput/nativeDateSegments.js +111 -0
- package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +406 -12
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.d.ts +21 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +110 -58
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +3 -2
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +6 -2
- package/dist/HoverCard/HoverCard.d.ts +6 -0
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +104 -3
- package/dist/HoverCard/useHoverCard.d.ts +19 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +74 -26
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +6 -2
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +2 -19
- package/dist/Layer/LayerDepthContext.d.ts +52 -0
- package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
- package/dist/Layer/LayerDepthContext.js +66 -0
- package/dist/Layer/index.d.ts +3 -0
- package/dist/Layer/index.d.ts.map +1 -1
- package/dist/Layer/index.js +4 -0
- package/dist/Layer/layerStack.d.ts +98 -0
- package/dist/Layer/layerStack.d.ts.map +1 -0
- package/dist/Layer/layerStack.js +306 -0
- package/dist/Layer/useLayerDismissal.d.ts +93 -0
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
- package/dist/Layer/useLayerDismissal.js +91 -0
- package/dist/Lightbox/Lightbox.d.ts +1 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +103 -81
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +9 -4
- package/dist/Markdown/index.d.ts +1 -1
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/parser.d.ts +38 -1
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +182 -32
- package/dist/MobileNav/MobileNav.d.ts +6 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +61 -36
- package/dist/MultiSelector/MultiSelector.d.ts +32 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +63 -11
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.js +5 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +3 -2
- package/dist/NumberInput/NumberInput.d.ts +6 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +54 -104
- package/dist/NumberInput/numberInputCommit.d.ts +34 -0
- package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
- package/dist/NumberInput/numberInputCommit.js +71 -0
- package/dist/NumberInput/numberParser.d.ts +64 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -0
- package/dist/NumberInput/numberParser.js +350 -0
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +3 -2
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -2
- package/dist/Overlay/Overlay.d.ts.map +1 -1
- package/dist/Overlay/Overlay.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +20 -17
- package/dist/PowerSearch/PowerSearch.d.ts +8 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +19 -6
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
- package/dist/PowerSearch/types.d.ts +2 -0
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.js +14 -5
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +3 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +3 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +3 -3
- package/dist/Selector/Selector.d.ts +17 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +81 -14
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +4 -3
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +8 -7
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +4 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +37 -5
- package/dist/Spinner/Spinner.d.ts +3 -3
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +130 -78
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +6 -1
- package/dist/Stepper/Step.d.ts +140 -0
- package/dist/Stepper/Step.d.ts.map +1 -0
- package/dist/Stepper/Step.js +1045 -0
- package/dist/Stepper/StepStatus.d.ts +24 -0
- package/dist/Stepper/StepStatus.d.ts.map +1 -0
- package/dist/Stepper/StepStatus.js +1 -0
- package/dist/Stepper/Stepper.d.ts +93 -0
- package/dist/Stepper/Stepper.d.ts.map +1 -0
- package/dist/Stepper/Stepper.js +184 -0
- package/dist/Stepper/StepperContext.d.ts +41 -0
- package/dist/Stepper/StepperContext.d.ts.map +1 -0
- package/dist/Stepper/StepperContext.js +34 -0
- package/dist/Stepper/index.d.ts +8 -0
- package/dist/Stepper/index.d.ts.map +1 -0
- package/dist/Stepper/index.js +7 -0
- package/dist/Stepper/stepper.stylex.d.ts +15 -0
- package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
- package/dist/Stepper/stepper.stylex.js +20 -0
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +8 -3
- package/dist/TabList/Tab.d.ts +15 -2
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +32 -7
- package/dist/TabList/TabList.d.ts +46 -7
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +353 -23
- package/dist/TabList/TabListContext.d.ts +11 -1
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +11 -2
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +3 -2
- package/dist/TabList/index.d.ts +2 -2
- package/dist/TabList/index.d.ts.map +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +10 -2
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +3 -6
- package/dist/Table/TableRow.d.ts +16 -5
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +16 -5
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
- package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
- package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +19 -5
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
- package/dist/Table/types.d.ts +22 -4
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -0
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +6 -2
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +9 -3
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +3 -2
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +5 -3
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +27 -8
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +2 -2
- package/dist/Tokenizer/Tokenizer.d.ts +3 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +2 -0
- package/dist/Tooltip/Tooltip.d.ts +5 -0
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +5 -0
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +39 -24
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +5 -4
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +3 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +4 -3
- package/dist/Typeahead/BaseTypeahead.d.ts +2 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +68 -29
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -2
- package/dist/astryx.css +98 -7
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +7 -4
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +60 -95
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -18
- package/dist/hooks/useMergedRefs.d.ts +18 -0
- package/dist/hooks/useMergedRefs.d.ts.map +1 -0
- package/dist/hooks/useMergedRefs.js +25 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +24 -4
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.d.ts.map +1 -1
- package/dist/theme/syntax/tokens.js +5 -2
- package/dist/utils/groupItems.d.ts +5 -1
- package/dist/utils/groupItems.d.ts.map +1 -1
- package/dist/utils/groupItems.js +9 -9
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/isApplePlatform.d.ts +18 -0
- package/dist/utils/isApplePlatform.d.ts.map +1 -0
- package/dist/utils/isApplePlatform.js +37 -0
- package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
- package/dist/utils/sharedResizeObserver.js +10 -1
- package/dist/utils/timeParser.d.ts +1 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +26 -12
- package/locales/en.json +154 -10
- package/locales/pseudo.json +108 -0
- package/package.json +8 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
- package/src/AlertDialog/AlertDialog.test.tsx +211 -2
- package/src/AlertDialog/AlertDialog.tsx +62 -20
- package/src/AppShell/AppShell.tsx +3 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
- package/src/AspectRatio/AspectRatio.test.tsx +57 -10
- package/src/AspectRatio/AspectRatio.tsx +40 -1
- package/src/Avatar/Avatar.doc.mjs +14 -3
- package/src/Avatar/Avatar.test.tsx +97 -0
- package/src/Avatar/Avatar.tsx +125 -52
- package/src/Avatar/index.ts +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
- package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
- package/src/AvatarGroup/AvatarGroup.tsx +15 -6
- package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
- package/src/Banner/Banner.doc.mjs +13 -11
- package/src/Banner/Banner.test.tsx +102 -15
- package/src/Banner/Banner.tsx +72 -25
- package/src/BottomSheet/BottomSheet.test.tsx +123 -0
- package/src/BottomSheet/BottomSheet.tsx +17 -4
- package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
- package/src/Button/Button.doc.mjs +24 -1
- package/src/Button/Button.test.tsx +32 -4
- package/src/Button/Button.tsx +12 -5
- package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
- package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
- package/src/ButtonGroup/ButtonGroup.tsx +23 -5
- package/src/Calendar/Calendar.doc.mjs +4 -3
- package/src/Calendar/Calendar.test.tsx +103 -0
- package/src/Calendar/Calendar.tsx +19 -16
- package/src/Calendar/getInitialFocusDate.test.ts +94 -0
- package/src/Calendar/getInitialFocusDate.ts +93 -0
- package/src/Calendar/styles.ts +49 -31
- package/src/Card/Card.doc.mjs +10 -7
- package/src/Card/Card.test.tsx +44 -19
- package/src/Card/Card.tsx +12 -32
- package/src/Carousel/Carousel.tsx +3 -2
- package/src/Chat/ChatComposerInput.tsx +5 -1
- package/src/Chat/ChatLayout.tsx +3 -2
- package/src/Chat/ChatMessageList.doc.mjs +9 -1
- package/src/Chat/ChatMessageList.test.tsx +46 -0
- package/src/Chat/ChatMessageList.tsx +28 -4
- package/src/Chat/ChatTokenizedText.tsx +17 -10
- package/src/Chat/useChatComposerTokens.ts +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +8 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
- package/src/CodeBlock/CodeBlock.test.tsx +37 -0
- package/src/CodeBlock/CodeBlock.tsx +20 -4
- package/src/CodeBlock/highlightRanges.ts +1 -1
- package/src/CodeBlock/highlightStyles.ts +13 -13
- package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
- package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
- package/src/ContextMenu/ContextMenu.tsx +4 -3
- package/src/DateInput/DateInput.doc.mjs +16 -0
- package/src/DateInput/DateInput.tsx +55 -2
- package/src/DateInput/DateInputTouch.test.tsx +146 -32
- package/src/DateInput/NativeDateField.test.tsx +635 -0
- package/src/DateInput/NativeDateField.tsx +641 -0
- package/src/DateInput/TouchDateField.tsx +108 -24
- package/src/DateInput/index.ts +1 -0
- package/src/DateInput/nativeDateSegments.ts +127 -0
- package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
- package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
- package/src/DateTimeInput/DateTimeInput.tsx +556 -24
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +8 -3
- package/src/Dialog/Dialog.test.tsx +429 -2
- package/src/Dialog/Dialog.tsx +133 -58
- package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
- package/src/Field/Field.doc.mjs +13 -2
- package/src/Field/FieldLabel.test.tsx +29 -0
- package/src/Field/FieldLabel.tsx +7 -0
- package/src/FileInput/FileInput.tsx +3 -2
- package/src/Heading/Heading.test.tsx +23 -1
- package/src/Heading/Heading.tsx +6 -2
- package/src/HoverCard/HoverCard.doc.mjs +13 -2
- package/src/HoverCard/HoverCard.test.tsx +154 -4
- package/src/HoverCard/HoverCard.tsx +143 -3
- package/src/HoverCard/useHoverCard.tsx +104 -33
- package/src/Indicator/CheckboxIndicator.tsx +14 -8
- package/src/Indicator/Indicator.doc.mjs +2 -0
- package/src/Item/Item.tsx +5 -4
- package/src/Kbd/Kbd.tsx +2 -19
- package/src/Layer/LayerDepthContext.tsx +62 -0
- package/src/Layer/index.ts +9 -0
- package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
- package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
- package/src/Layer/layerStack.ts +362 -0
- package/src/Layer/useLayer.test.tsx +62 -14
- package/src/Layer/useLayerDismissal.test.tsx +469 -0
- package/src/Layer/useLayerDismissal.ts +173 -0
- package/src/Layout/Layout.doc.mjs +2 -2
- package/src/Lightbox/Lightbox.doc.mjs +12 -0
- package/src/Lightbox/Lightbox.tsx +124 -102
- package/src/Link/Link.doc.mjs +39 -0
- package/src/Markdown/Markdown.doc.mjs +5 -0
- package/src/Markdown/Markdown.tsx +9 -4
- package/src/Markdown/incremental.test.ts +16 -2
- package/src/Markdown/index.ts +1 -0
- package/src/Markdown/parser.perf.test.ts +96 -1
- package/src/Markdown/parser.test.ts +178 -2
- package/src/Markdown/parser.ts +253 -32
- package/src/MobileNav/MobileNav.tsx +62 -36
- package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
- package/src/MultiSelector/MultiSelector.test.tsx +277 -0
- package/src/MultiSelector/MultiSelector.tsx +142 -11
- package/src/MultiSelector/index.ts +1 -0
- package/src/NavIcon/NavIcon.doc.mjs +8 -2
- package/src/NavIcon/NavIcon.test.tsx +9 -0
- package/src/NavIcon/NavIcon.tsx +5 -1
- package/src/NavMenu/NavHeadingMenu.tsx +3 -2
- package/src/NumberInput/NumberInput.doc.mjs +31 -7
- package/src/NumberInput/NumberInput.test.tsx +436 -8
- package/src/NumberInput/NumberInput.tsx +62 -114
- package/src/NumberInput/numberInputCommit.test.ts +72 -0
- package/src/NumberInput/numberInputCommit.ts +103 -0
- package/src/NumberInput/numberParser.docblock.test.ts +234 -0
- package/src/NumberInput/numberParser.test.ts +222 -0
- package/src/NumberInput/numberParser.ts +403 -0
- package/src/Outline/Outline.tsx +3 -2
- package/src/OverflowList/OverflowList.tsx +3 -2
- package/src/Overlay/Overlay.tsx +3 -2
- package/src/Pagination/Pagination.test.tsx +3 -2
- package/src/Popover/usePopover.tsx +31 -28
- package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
- package/src/PowerSearch/PowerSearch.test.tsx +240 -1
- package/src/PowerSearch/PowerSearch.tsx +34 -5
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
- package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
- package/src/PowerSearch/types.ts +2 -0
- package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
- package/src/PowerSearch/usePowerSearchSource.ts +13 -3
- package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
- package/src/ProgressBar/ProgressBar.test.tsx +24 -0
- package/src/ProgressBar/ProgressBar.tsx +28 -8
- package/src/Resizable/ResizeHandle.tsx +3 -2
- package/src/SegmentedControl/SegmentedControl.tsx +3 -2
- package/src/SelectableCard/SelectableCard.tsx +3 -2
- package/src/Selector/Selector.doc.mjs +26 -1
- package/src/Selector/Selector.test.tsx +311 -1
- package/src/Selector/Selector.tsx +139 -16
- package/src/SideNav/SideNav.doc.mjs +6 -6
- package/src/SideNav/SideNav.tsx +4 -2
- package/src/SideNav/SideNavHeading.tsx +12 -12
- package/src/SideNav/SideNavItem.tsx +4 -2
- package/src/Slider/Slider.test.tsx +106 -1
- package/src/Slider/Slider.tsx +55 -3
- package/src/Spinner/Spinner.test.tsx +147 -1
- package/src/Spinner/Spinner.tsx +120 -101
- package/src/StatusDot/StatusDot.doc.mjs +8 -2
- package/src/StatusDot/StatusDot.test.tsx +9 -0
- package/src/StatusDot/StatusDot.tsx +7 -1
- package/src/Stepper/Step.doc.mjs +98 -0
- package/src/Stepper/Step.tsx +1638 -0
- package/src/Stepper/StepStatus.ts +26 -0
- package/src/Stepper/Stepper.doc.mjs +370 -0
- package/src/Stepper/Stepper.test.tsx +1024 -0
- package/src/Stepper/Stepper.tsx +258 -0
- package/src/Stepper/StepperContext.ts +71 -0
- package/src/Stepper/index.ts +18 -0
- package/src/Stepper/stepper.stylex.ts +19 -0
- package/src/Switch/Switch.doc.mjs +2 -0
- package/src/Switch/Switch.test.tsx +10 -0
- package/src/Switch/Switch.tsx +6 -2
- package/src/TabList/Tab.doc.mjs +13 -1
- package/src/TabList/Tab.tsx +67 -7
- package/src/TabList/TabList.doc.mjs +22 -6
- package/src/TabList/TabList.test.tsx +559 -0
- package/src/TabList/TabList.tsx +490 -22
- package/src/TabList/TabListContext.ts +13 -2
- package/src/TabList/TabMenu.tsx +3 -2
- package/src/TabList/index.ts +6 -2
- package/src/Table/BaseTable.tsx +12 -4
- package/src/Table/Table.doc.mjs +9 -2
- package/src/Table/Table.test.tsx +132 -14
- package/src/Table/Table.tsx +3 -8
- package/src/Table/TableBody.doc.mjs +40 -0
- package/src/Table/TableFooter.doc.mjs +40 -0
- package/src/Table/TableHeader.doc.mjs +40 -0
- package/src/Table/TableRow.tsx +16 -5
- package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
- package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
- package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
- package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/Table/types.ts +22 -4
- package/src/Table/useBaseTablePlugins.ts +5 -0
- package/src/Table/useTableGroupedRows.doc.mjs +5 -4
- package/src/Table/useTablePagination.doc.mjs +7 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Table/useTableSelection.doc.mjs +31 -0
- package/src/Text/Text.test.tsx +23 -1
- package/src/Text/Text.tsx +6 -2
- package/src/TextArea/TextArea.doc.mjs +8 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +15 -8
- package/src/TextInput/TextInput.doc.mjs +10 -0
- package/src/TextInput/TextInput.tsx +3 -2
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.tsx +2 -2
- package/src/Timestamp/Timestamp.test.tsx +18 -0
- package/src/Timestamp/Timestamp.tsx +4 -2
- package/src/Toast/Toast.doc.mjs +6 -0
- package/src/Toast/ToastViewport.tsx +17 -1
- package/src/Token/TokenLink.tsx +2 -2
- package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
- package/src/Tokenizer/Tokenizer.tsx +4 -0
- package/src/Toolbar/Toolbar.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.test.tsx +32 -0
- package/src/Tooltip/Tooltip.tsx +5 -0
- package/src/Tooltip/useTooltip.tsx +47 -24
- package/src/TopNav/TopNavHeading.tsx +5 -4
- package/src/TopNav/TopNavMegaMenu.tsx +3 -2
- package/src/TopNav/TopNavMenu.tsx +4 -3
- package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
- package/src/Typeahead/BaseTypeahead.tsx +85 -33
- package/src/Typeahead/Typeahead.doc.mjs +5 -0
- package/src/Typeahead/Typeahead.test.tsx +49 -0
- package/src/Typeahead/Typeahead.tsx +3 -2
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- package/src/hooks/useFocusTrap.test.tsx +14 -0
- package/src/hooks/useFocusTrap.ts +62 -111
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
- package/src/hooks/useHotkeys.ts +3 -18
- package/src/hooks/useMergedRefs.doc.mjs +79 -0
- package/src/hooks/useMergedRefs.test.tsx +62 -0
- package/src/hooks/useMergedRefs.ts +36 -0
- package/src/index.ts +1 -0
- package/src/raw-import.d.ts +14 -0
- package/src/theme/MediaTheme.doc.mjs +5 -5
- package/src/theme/derivedVarRegistry.test.ts +19 -3
- package/src/theme/derivedVarRegistry.ts +23 -4
- package/src/theme/generateThemeRules.test.ts +37 -0
- package/src/theme/syntax/tokens.ts +5 -2
- package/src/utils/groupItems.ts +12 -6
- package/src/utils/index.ts +1 -1
- package/src/utils/isApplePlatform.test.ts +61 -0
- package/src/utils/isApplePlatform.ts +37 -0
- package/src/utils/sharedResizeObserver.ts +10 -2
- package/src/utils/timeParser.test.ts +6 -1
- package/src/utils/timeParser.ts +35 -13
- package/src/__tests__/inputWidthContract.test.tsx +0 -69
package/src/Card/Card.test.tsx
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
|
+
import {createRef} from 'react';
|
|
3
4
|
import {describe, it, expect} from 'vitest';
|
|
4
5
|
import {render} from '@testing-library/react';
|
|
5
6
|
import {Card} from './Card';
|
|
@@ -10,17 +11,52 @@ describe('Card', () => {
|
|
|
10
11
|
expect(getByText('Hello')).toBeInTheDocument();
|
|
11
12
|
});
|
|
12
13
|
|
|
13
|
-
it('
|
|
14
|
-
const
|
|
15
|
-
const
|
|
14
|
+
it('forwards ref to the rendered element', () => {
|
|
15
|
+
const ref = createRef<HTMLDivElement>();
|
|
16
|
+
const {container} = render(<Card ref={ref}>C</Card>);
|
|
17
|
+
expect(ref.current).toBe(container.firstElementChild);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('spreads unknown props onto the same element that carries the theme target', () => {
|
|
21
|
+
const {getByTestId} = render(
|
|
22
|
+
<Card data-testid="card" id="promo" aria-label="Promotion">
|
|
23
|
+
C
|
|
24
|
+
</Card>,
|
|
25
|
+
);
|
|
26
|
+
const root = getByTestId('card');
|
|
27
|
+
expect(root).toHaveAttribute('id', 'promo');
|
|
28
|
+
expect(root).toHaveAttribute('aria-label', 'Promotion');
|
|
16
29
|
expect(root.className).toContain('astryx-card');
|
|
17
30
|
});
|
|
18
31
|
|
|
19
|
-
it('
|
|
20
|
-
const {container} = render(<Card
|
|
32
|
+
it('merges a consumer className instead of replacing the theme target', () => {
|
|
33
|
+
const {container} = render(<Card className="promo">C</Card>);
|
|
21
34
|
const root = container.firstElementChild!;
|
|
22
35
|
expect(root.className).toContain('astryx-card');
|
|
23
|
-
expect(root.className).toContain('
|
|
36
|
+
expect(root.className).toContain('promo');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('reflects variant as a theme data attribute', () => {
|
|
40
|
+
const {container} = render(<Card variant="muted">C</Card>);
|
|
41
|
+
expect(container.firstElementChild).toHaveAttribute(
|
|
42
|
+
'data-variant',
|
|
43
|
+
'muted',
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('reflects elevation as a theme data attribute', () => {
|
|
48
|
+
const {container} = render(<Card elevation="high">C</Card>);
|
|
49
|
+
expect(container.firstElementChild).toHaveAttribute(
|
|
50
|
+
'data-elevation',
|
|
51
|
+
'high',
|
|
52
|
+
);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('defaults to the default variant at rest elevation', () => {
|
|
56
|
+
const {container} = render(<Card>C</Card>);
|
|
57
|
+
const root = container.firstElementChild!;
|
|
58
|
+
expect(root).toHaveAttribute('data-variant', 'default');
|
|
59
|
+
expect(root).toHaveAttribute('data-elevation', 'none');
|
|
24
60
|
});
|
|
25
61
|
|
|
26
62
|
it('applies a distinct class for each elevation level', () => {
|
|
@@ -28,18 +64,7 @@ describe('Card', () => {
|
|
|
28
64
|
const {container} = render(<Card elevation={elevation}>C</Card>);
|
|
29
65
|
return container.firstElementChild!.className;
|
|
30
66
|
};
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
const med = classFor('med');
|
|
34
|
-
const high = classFor('high');
|
|
35
|
-
expect(new Set([none, low, med, high]).size).toBe(4);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('defaults to flat (elevation none) — same class as explicit none', () => {
|
|
39
|
-
const {container: defaultContainer} = render(<Card>C</Card>);
|
|
40
|
-
const {container: noneContainer} = render(<Card elevation="none">C</Card>);
|
|
41
|
-
expect(defaultContainer.firstElementChild!.className).toBe(
|
|
42
|
-
noneContainer.firstElementChild!.className,
|
|
43
|
-
);
|
|
67
|
+
const classes = (['none', 'low', 'med', 'high'] as const).map(classFor);
|
|
68
|
+
expect(new Set(classes).size).toBe(4);
|
|
44
69
|
});
|
|
45
70
|
});
|
package/src/Card/Card.tsx
CHANGED
|
@@ -23,13 +23,7 @@ import {
|
|
|
23
23
|
} from '../theme/tokens.stylex';
|
|
24
24
|
import {container} from '../Layout/container.stylex';
|
|
25
25
|
import type {SpacingToken} from '../Layout/container.stylex';
|
|
26
|
-
import {
|
|
27
|
-
paddingStyles,
|
|
28
|
-
containerPaddingInlineVarStyles,
|
|
29
|
-
containerPaddingBlockStartVarStyles,
|
|
30
|
-
containerPaddingBlockEndVarStyles,
|
|
31
|
-
spacingStepToToken,
|
|
32
|
-
} from '../Layout/padding.stylex';
|
|
26
|
+
import {spacingStepToToken} from '../Layout/padding.stylex';
|
|
33
27
|
import type {Elevation, SizeValue, SpacingStep} from '../utils/types';
|
|
34
28
|
import {mergeProps} from '../utils';
|
|
35
29
|
import type {BaseProps} from '../BaseProps';
|
|
@@ -176,14 +170,6 @@ export type {SizeValue} from '../utils/types';
|
|
|
176
170
|
|
|
177
171
|
export interface CardProps extends BaseProps<HTMLDivElement> {
|
|
178
172
|
ref?: React.Ref<HTMLDivElement>;
|
|
179
|
-
/**
|
|
180
|
-
* CSS class name(s) appended to the root element.
|
|
181
|
-
*/
|
|
182
|
-
className?: string;
|
|
183
|
-
/**
|
|
184
|
-
* Inline styles to apply to the root element.
|
|
185
|
-
*/
|
|
186
|
-
style?: React.CSSProperties;
|
|
187
173
|
/**
|
|
188
174
|
* Width of the card.
|
|
189
175
|
* Numbers are treated as pixels, strings are used as-is.
|
|
@@ -217,7 +203,12 @@ export interface CardProps extends BaseProps<HTMLDivElement> {
|
|
|
217
203
|
/**
|
|
218
204
|
* Internal padding of the card using the spacing scale.
|
|
219
205
|
* Accepts numeric spacing steps: 0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10.
|
|
220
|
-
*
|
|
206
|
+
*
|
|
207
|
+
* Omit it and the card takes the theme's card padding rather than a step, so
|
|
208
|
+
* passing a step is a decision to override the theme, not a way to restate
|
|
209
|
+
* the default.
|
|
210
|
+
*
|
|
211
|
+
* @default the theme's card padding (spacing step 4 with no theme)
|
|
221
212
|
*/
|
|
222
213
|
padding?: SpacingStep;
|
|
223
214
|
|
|
@@ -293,14 +284,15 @@ export function Card({
|
|
|
293
284
|
|
|
294
285
|
// When no explicit padding prop, use theme default (set via container tokens)
|
|
295
286
|
const useThemeDefault = padding == null;
|
|
296
|
-
const
|
|
297
|
-
|
|
287
|
+
const paddingToken = useThemeDefault
|
|
288
|
+
? undefined
|
|
289
|
+
: (spacingStepToToken[padding] as SpacingToken);
|
|
298
290
|
|
|
299
291
|
return (
|
|
300
292
|
<div
|
|
301
293
|
ref={ref}
|
|
302
294
|
{...mergeProps(
|
|
303
|
-
themeProps('card', {variant}),
|
|
295
|
+
themeProps('card', {variant, elevation}),
|
|
304
296
|
stylex.props(
|
|
305
297
|
styles.card,
|
|
306
298
|
variantStyles[variant],
|
|
@@ -313,7 +305,7 @@ export function Card({
|
|
|
313
305
|
minHeight ?? null,
|
|
314
306
|
),
|
|
315
307
|
...container(
|
|
316
|
-
|
|
308
|
+
paddingToken == null
|
|
317
309
|
? {useThemeDefault: 'card'}
|
|
318
310
|
: {
|
|
319
311
|
paddingInnerX: paddingToken,
|
|
@@ -322,18 +314,6 @@ export function Card({
|
|
|
322
314
|
paddingOuterY: paddingToken,
|
|
323
315
|
},
|
|
324
316
|
),
|
|
325
|
-
!useThemeDefault &&
|
|
326
|
-
effectivePadding !== 4 &&
|
|
327
|
-
paddingStyles[effectivePadding],
|
|
328
|
-
!useThemeDefault &&
|
|
329
|
-
effectivePadding !== 4 &&
|
|
330
|
-
containerPaddingInlineVarStyles[effectivePadding],
|
|
331
|
-
!useThemeDefault &&
|
|
332
|
-
effectivePadding !== 4 &&
|
|
333
|
-
containerPaddingBlockStartVarStyles[effectivePadding],
|
|
334
|
-
!useThemeDefault &&
|
|
335
|
-
effectivePadding !== 4 &&
|
|
336
|
-
containerPaddingBlockEndVarStyles[effectivePadding],
|
|
337
317
|
// Applied after the container padding so the border-inset calc wins;
|
|
338
318
|
// it reads the --container-padding-* vars set above.
|
|
339
319
|
variant === 'default' && styles.withBorder,
|
|
@@ -46,11 +46,12 @@ import {useLayer} from '../Layer';
|
|
|
46
46
|
import {useScrollOverflow} from '../hooks/useScrollOverflow';
|
|
47
47
|
import {isRtlElement} from '../hooks/isRtlElement';
|
|
48
48
|
import type {BaseProps} from '../BaseProps';
|
|
49
|
-
import {mergeProps,
|
|
49
|
+
import {mergeProps, rtlStyles} from '../utils';
|
|
50
50
|
import type {SpacingStep} from '../utils/types';
|
|
51
51
|
import {themeProps} from '../utils/themeProps';
|
|
52
52
|
import {useTranslator} from '../i18n';
|
|
53
53
|
|
|
54
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
54
55
|
/**
|
|
55
56
|
* Imperative control surface for the Carousel, accessed via the `handleRef`
|
|
56
57
|
* prop. Methods drive the same native-scroll machinery as the built-in
|
|
@@ -506,7 +507,7 @@ export function Carousel({
|
|
|
506
507
|
|
|
507
508
|
return (
|
|
508
509
|
<div
|
|
509
|
-
ref={
|
|
510
|
+
ref={useMergedRefs(ref, layer.ref as React.Ref<HTMLDivElement>)}
|
|
510
511
|
data-testid={testId}
|
|
511
512
|
{...htmlProps}
|
|
512
513
|
{...mergeProps(
|
|
@@ -255,6 +255,10 @@ const styles = stylex.create({
|
|
|
255
255
|
opacity: 0.5,
|
|
256
256
|
pointerEvents: 'none' as const,
|
|
257
257
|
},
|
|
258
|
+
tokenSpan: {
|
|
259
|
+
display: 'inline-flex',
|
|
260
|
+
verticalAlign: 'middle',
|
|
261
|
+
},
|
|
258
262
|
});
|
|
259
263
|
|
|
260
264
|
// =============================================================================
|
|
@@ -749,7 +753,7 @@ export function ChatComposerTokenElement({token}: {token: ChatComposerToken}) {
|
|
|
749
753
|
data-astryx-token=""
|
|
750
754
|
data-astryx-token-value={token.value}
|
|
751
755
|
contentEditable={false}
|
|
752
|
-
|
|
756
|
+
{...stylex.props(styles.tokenSpan)}>
|
|
753
757
|
{isCustomToken(token) ? (
|
|
754
758
|
token.render()
|
|
755
759
|
) : (
|
package/src/Chat/ChatLayout.tsx
CHANGED
|
@@ -33,7 +33,7 @@ import {type ReactNode, useMemo, useRef} from 'react';
|
|
|
33
33
|
import * as stylex from '@stylexjs/stylex';
|
|
34
34
|
import {spacingVars} from '../theme/tokens.stylex';
|
|
35
35
|
import type {BaseProps} from '../BaseProps';
|
|
36
|
-
import {mergeProps
|
|
36
|
+
import {mergeProps} from '../utils';
|
|
37
37
|
import {useChatStreamScroll} from './useChatStreamScroll';
|
|
38
38
|
import {useChatNewMessages} from './useChatNewMessages';
|
|
39
39
|
import {ChatLayoutScrollButton} from './ChatLayoutScrollButton';
|
|
@@ -41,6 +41,7 @@ import {ChatLayoutContext} from './ChatContext';
|
|
|
41
41
|
import {themeProps} from '../utils/themeProps';
|
|
42
42
|
import {useTranslator} from '../i18n';
|
|
43
43
|
|
|
44
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
44
45
|
// =============================================================================
|
|
45
46
|
// Types
|
|
46
47
|
// =============================================================================
|
|
@@ -343,7 +344,7 @@ export function ChatLayout({
|
|
|
343
344
|
<ChatLayoutContext value={layoutContext}>
|
|
344
345
|
<div
|
|
345
346
|
{...rest}
|
|
346
|
-
ref={
|
|
347
|
+
ref={useMergedRefs(ref, rootRef)}
|
|
347
348
|
data-testid={testId}
|
|
348
349
|
{...mergeProps(
|
|
349
350
|
themeProps('chat-layout', {density}),
|
|
@@ -7,7 +7,7 @@ export const docs = {
|
|
|
7
7
|
subComponentOf: 'Chat',
|
|
8
8
|
displayName: 'Chat Message List',
|
|
9
9
|
isHiddenFromOverview: true,
|
|
10
|
-
description: `Presentational message container with density context and infinite scroll support. Provides role="log" with aria-live="polite" for accessibility. A flex spacer pushes messages to the bottom when the list isn't full.`,
|
|
10
|
+
description: `Presentational message container with density context and infinite scroll support. Provides role="log" with aria-live="polite" for accessibility. A flex spacer pushes messages to the bottom when the list isn't full; set align="top" to start messages at the top instead.`,
|
|
11
11
|
props: [
|
|
12
12
|
{
|
|
13
13
|
name: 'children',
|
|
@@ -45,6 +45,12 @@ export const docs = {
|
|
|
45
45
|
type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
|
|
46
46
|
description: 'Gap between top-level message rows. Defaults to the selected density; override for LLM event streams or independent rows that need different spacing from density.',
|
|
47
47
|
},
|
|
48
|
+
{
|
|
49
|
+
name: 'align',
|
|
50
|
+
type: "'top' | 'bottom'",
|
|
51
|
+
description: "Vertical alignment when the list is shorter than its container. 'bottom' fills free space with a spacer so short conversations sit above the composer; 'top' omits the spacer so messages start at the top. Only affects a non-full list; overflowing lists scroll identically, preserving auto-scroll-to-bottom.",
|
|
52
|
+
default: "'bottom'",
|
|
53
|
+
},
|
|
48
54
|
{
|
|
49
55
|
name: 'isStreaming',
|
|
50
56
|
type: 'boolean',
|
|
@@ -65,6 +71,7 @@ export const docsZh = {
|
|
|
65
71
|
scrollToTopAction: '用户滚动到顶部时触发的异步操作。用于加载更早的消息。',
|
|
66
72
|
density: '视觉密度,通过上下文传递给子消息。',
|
|
67
73
|
gap: '顶层消息行之间的间距。默认跟随密度;当 LLM 事件流等独立行需要不同间距时可覆盖。',
|
|
74
|
+
align: "列表内容不足一屏时的垂直对齐方式。'bottom' 用占位块填满剩余空间,让简短对话贴近输入框;'top' 省略占位块,让消息从顶部开始。仅影响未填满的列表,溢出后两种模式滚动一致,保持自动滚动到底部。",
|
|
68
75
|
isStreaming: '是否有助手消息正在流式输出。标记日志为 aria-busy,让屏幕阅读器等待并在完成后一次性播报,而不是每个 token 都重复播报。',
|
|
69
76
|
},
|
|
70
77
|
};
|
|
@@ -80,6 +87,7 @@ export const docsDense = {
|
|
|
80
87
|
scrollToTopAction: 'async action at scroll top; load older msgs',
|
|
81
88
|
density: 'visual density; flows to children via context',
|
|
82
89
|
gap: 'top-level row gap; defaults to density spacing; override for independent LLM/tool rows',
|
|
90
|
+
align: "'top'|'bottom' (def bottom); bottom spacer pushes short lists down, top starts at top; overflow scrolls same either way",
|
|
83
91
|
isStreaming: 'assistant streaming? marks log aria-busy so SR announces the completed msg once',
|
|
84
92
|
},
|
|
85
93
|
};
|
|
@@ -83,4 +83,50 @@ describe('ChatMessageList', () => {
|
|
|
83
83
|
);
|
|
84
84
|
expect(screen.getByTestId('chat-list')).toBeTruthy();
|
|
85
85
|
});
|
|
86
|
+
|
|
87
|
+
// With no scrollToTopAction the spacer is the only aria-hidden element in
|
|
88
|
+
// the list, so its presence maps 1:1 to the aria-hidden count.
|
|
89
|
+
it('renders the bottom spacer by default', () => {
|
|
90
|
+
render(
|
|
91
|
+
<ChatMessageList data-testid="list">
|
|
92
|
+
<div>msg</div>
|
|
93
|
+
</ChatMessageList>,
|
|
94
|
+
);
|
|
95
|
+
expect(
|
|
96
|
+
screen.getByTestId('list').querySelectorAll('[aria-hidden]'),
|
|
97
|
+
).toHaveLength(1);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('renders the bottom spacer when align="bottom"', () => {
|
|
101
|
+
render(
|
|
102
|
+
<ChatMessageList align="bottom" data-testid="list">
|
|
103
|
+
<div>msg</div>
|
|
104
|
+
</ChatMessageList>,
|
|
105
|
+
);
|
|
106
|
+
expect(
|
|
107
|
+
screen.getByTestId('list').querySelectorAll('[aria-hidden]'),
|
|
108
|
+
).toHaveLength(1);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('omits the spacer when align="top"', () => {
|
|
112
|
+
render(
|
|
113
|
+
<ChatMessageList align="top" data-testid="list">
|
|
114
|
+
<div>msg</div>
|
|
115
|
+
</ChatMessageList>,
|
|
116
|
+
);
|
|
117
|
+
expect(
|
|
118
|
+
screen.getByTestId('list').querySelectorAll('[aria-hidden]'),
|
|
119
|
+
).toHaveLength(0);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('still renders children when align="top"', () => {
|
|
123
|
+
render(
|
|
124
|
+
<ChatMessageList align="top">
|
|
125
|
+
<ChatMessage sender="assistant">
|
|
126
|
+
<ChatMessageBubble>Hello</ChatMessageBubble>
|
|
127
|
+
</ChatMessage>
|
|
128
|
+
</ChatMessageList>,
|
|
129
|
+
);
|
|
130
|
+
expect(screen.getByText('Hello')).toBeTruthy();
|
|
131
|
+
});
|
|
86
132
|
});
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Renders a container with role="log" for chat message histories.
|
|
12
12
|
* Handles density context, configurable gap, empty state,
|
|
13
|
-
* a spacer that pushes messages to the bottom,
|
|
13
|
+
* a configurable spacer (align) that pushes messages to the bottom,
|
|
14
|
+
* and an infinite scroll sentinel.
|
|
14
15
|
*
|
|
15
16
|
* Auto-scroll and the scroll-to-bottom button are owned by
|
|
16
17
|
* ChatLayout. When used standalone (without a layout), the list
|
|
@@ -73,6 +74,24 @@ export interface ChatMessageListProps extends BaseProps<HTMLDivElement> {
|
|
|
73
74
|
*/
|
|
74
75
|
gap?: SpacingStep;
|
|
75
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Vertical alignment of messages when the list is shorter than its
|
|
79
|
+
* container.
|
|
80
|
+
*
|
|
81
|
+
* - `'bottom'` (default): a spacer fills the free space and pushes
|
|
82
|
+
* messages to the bottom, so a short conversation sits just above the
|
|
83
|
+
* composer — the familiar messaging-app layout.
|
|
84
|
+
* - `'top'`: the spacer is omitted, so messages start at the top and grow
|
|
85
|
+
* downward — better for document-style or log-style lists.
|
|
86
|
+
*
|
|
87
|
+
* This only changes the resting position of a non-full list. Once messages
|
|
88
|
+
* overflow the container the spacer collapses to zero in both modes, so
|
|
89
|
+
* ChatLayout auto-scroll-to-bottom behavior is identical either way.
|
|
90
|
+
*
|
|
91
|
+
* @default 'bottom'
|
|
92
|
+
*/
|
|
93
|
+
align?: 'top' | 'bottom';
|
|
94
|
+
|
|
76
95
|
/**
|
|
77
96
|
* Whether an assistant message is actively streaming into the list.
|
|
78
97
|
*
|
|
@@ -183,7 +202,8 @@ const gapStyles = stylex.create({
|
|
|
183
202
|
*
|
|
184
203
|
* Renders messages in a flex column with density-based spacing.
|
|
185
204
|
* Override gap to tune row spacing separately from density.
|
|
186
|
-
*
|
|
205
|
+
* By default a spacer pushes content to the bottom when the list isn't full;
|
|
206
|
+
* set `align='top'` to start messages at the top instead.
|
|
187
207
|
* Supports loading older messages via `scrollToTopAction`.
|
|
188
208
|
*
|
|
189
209
|
* Auto-scroll and the scroll-to-bottom button are owned by
|
|
@@ -204,6 +224,7 @@ export function ChatMessageList({
|
|
|
204
224
|
scrollToTopAction,
|
|
205
225
|
density = 'balanced',
|
|
206
226
|
gap,
|
|
227
|
+
align = 'bottom',
|
|
207
228
|
isStreaming = false,
|
|
208
229
|
xstyle,
|
|
209
230
|
className,
|
|
@@ -291,8 +312,11 @@ export function ChatMessageList({
|
|
|
291
312
|
</div>
|
|
292
313
|
)}
|
|
293
314
|
|
|
294
|
-
{/* Spacer pushes messages to bottom when list isn't full
|
|
295
|
-
|
|
315
|
+
{/* Spacer pushes messages to bottom when the list isn't full.
|
|
316
|
+
Omitted for top alignment so messages start at the top. */}
|
|
317
|
+
{align === 'bottom' && (
|
|
318
|
+
<div {...stylex.props(styles.spacer)} aria-hidden />
|
|
319
|
+
)}
|
|
296
320
|
|
|
297
321
|
{/* Messages or empty state */}
|
|
298
322
|
{hasChildren ? (
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
*
|
|
15
15
|
* SYNC: When modified, update:
|
|
16
16
|
* - /packages/core/src/Chat/index.ts
|
|
17
|
+
* - /packages/core/src/Chat/ChatComposerInput.tsx (token alignment must match,
|
|
18
|
+
* or a token moves when the message is sent)
|
|
17
19
|
* - /packages/cli/assets/templates/blocks/components/ChatTokenizedText/ (block examples)
|
|
18
20
|
*/
|
|
19
21
|
|
|
@@ -33,6 +35,10 @@ const styles = stylex.create({
|
|
|
33
35
|
root: {
|
|
34
36
|
display: 'inline',
|
|
35
37
|
},
|
|
38
|
+
token: {
|
|
39
|
+
display: 'inline-flex',
|
|
40
|
+
verticalAlign: 'middle',
|
|
41
|
+
},
|
|
36
42
|
});
|
|
37
43
|
|
|
38
44
|
// =============================================================================
|
|
@@ -156,16 +162,17 @@ function renderTokens(text: string, tokens: ChatComposerToken[]): ReactNode[] {
|
|
|
156
162
|
const token = tokenMap.get(matched);
|
|
157
163
|
if (token) {
|
|
158
164
|
parts.push(
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
165
|
+
<span key={`${matched}-${match.index}`} {...stylex.props(styles.token)}>
|
|
166
|
+
{isCustomToken(token) ? (
|
|
167
|
+
token.render()
|
|
168
|
+
) : (
|
|
169
|
+
<Badge
|
|
170
|
+
label={token.label}
|
|
171
|
+
variant={token.variant}
|
|
172
|
+
icon={token.icon}
|
|
173
|
+
/>
|
|
174
|
+
)}
|
|
175
|
+
</span>,
|
|
169
176
|
);
|
|
170
177
|
}
|
|
171
178
|
|
|
@@ -120,7 +120,7 @@ export function useChatComposerTokens({
|
|
|
120
120
|
span.setAttribute('data-astryx-token-id', id);
|
|
121
121
|
span.contentEditable = 'false';
|
|
122
122
|
span.style.display = 'inline-flex';
|
|
123
|
-
span.style.verticalAlign = '
|
|
123
|
+
span.style.verticalAlign = 'middle';
|
|
124
124
|
|
|
125
125
|
range.deleteContents();
|
|
126
126
|
range.insertNode(span);
|
|
@@ -133,6 +133,7 @@ export const docs = {
|
|
|
133
133
|
{className: 'astryx-checkbox-input', visualProps: ['size']},
|
|
134
134
|
{className: 'astryx-checkbox-indicator', visualProps: ['size'], states: ['checked', 'disabled']},
|
|
135
135
|
{className: 'astryx-checkbox', visualProps: ['size'], states: ['checked', 'disabled'], deprecatedFor: 'checkbox-indicator'},
|
|
136
|
+
{className: 'astryx-checkbox-label'},
|
|
136
137
|
],
|
|
137
138
|
},
|
|
138
139
|
usage: {
|
|
@@ -209,6 +210,7 @@ export const docsZh = {
|
|
|
209
210
|
},
|
|
210
211
|
{className: 'astryx-checkbox-indicator', visualProps: ['size'], states: ['checked', 'disabled']},
|
|
211
212
|
{className: 'astryx-checkbox', visualProps: ['size'], states: ['checked', 'disabled'], deprecatedFor: 'checkbox-indicator'},
|
|
213
|
+
{className: 'astryx-checkbox-label'},
|
|
212
214
|
],
|
|
213
215
|
},
|
|
214
216
|
};
|
|
@@ -719,3 +719,18 @@ describe('focus ring ownership (WCAG 2.4.7)', () => {
|
|
|
719
719
|
expect(indicatorOf(container).style.outlineStyle).toBe('');
|
|
720
720
|
});
|
|
721
721
|
});
|
|
722
|
+
|
|
723
|
+
describe('label theme target', () => {
|
|
724
|
+
it('names its own label so a theme can style it apart from a field label', () => {
|
|
725
|
+
// The control knows this label shares a row with it; the label does not.
|
|
726
|
+
// Both classes land on the one element, so a theme reaches every label
|
|
727
|
+
// through `astryx-field-label` and only this kind through
|
|
728
|
+
// `astryx-checkbox-label`.
|
|
729
|
+
render(
|
|
730
|
+
<CheckboxInput label="Notify me" value={false} onChange={() => {}} />,
|
|
731
|
+
);
|
|
732
|
+
const label = screen.getByText('Notify me').closest('label');
|
|
733
|
+
expect(label).toHaveClass('astryx-field-label');
|
|
734
|
+
expect(label).toHaveClass('astryx-checkbox-label');
|
|
735
|
+
});
|
|
736
|
+
});
|
|
@@ -44,7 +44,7 @@ import type {IconType} from '../Icon';
|
|
|
44
44
|
import type {InputStatus} from '../Field/types';
|
|
45
45
|
import {Spinner} from '../Spinner';
|
|
46
46
|
import {useTooltip} from '../Tooltip';
|
|
47
|
-
import {mergeProps
|
|
47
|
+
import {mergeProps} from '../utils';
|
|
48
48
|
import {indicatorScope} from '../Indicator/indicator.markers.stylex';
|
|
49
49
|
import {useIndicatorFocusRing} from '../hooks/useIndicatorFocusRing';
|
|
50
50
|
import {useResolvedRequired} from '../hooks/useResolvedRequired';
|
|
@@ -52,6 +52,7 @@ import {useIndicator} from '../Indicator';
|
|
|
52
52
|
import {themeProps} from '../utils/themeProps';
|
|
53
53
|
import {CheckboxListContext} from '../CheckboxList/CheckboxListContext';
|
|
54
54
|
|
|
55
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
55
56
|
const styles = stylex.create({
|
|
56
57
|
container: {
|
|
57
58
|
display: 'flex',
|
|
@@ -409,7 +410,7 @@ export function CheckboxInput({
|
|
|
409
410
|
{...focusProps}>
|
|
410
411
|
<input
|
|
411
412
|
{...rest}
|
|
412
|
-
ref={
|
|
413
|
+
ref={useMergedRefs(
|
|
413
414
|
ref,
|
|
414
415
|
indeterminateRef,
|
|
415
416
|
disabledMessageTooltip.positionRef,
|
|
@@ -477,6 +478,11 @@ export function CheckboxInput({
|
|
|
477
478
|
</div>
|
|
478
479
|
<div {...stylex.props(styles.labelWrapper)}>
|
|
479
480
|
<FieldLabel
|
|
481
|
+
// A checkbox's label shares a row with its control, unlike a form
|
|
482
|
+
// field's label above its input. Naming the label rather than the
|
|
483
|
+
// arrangement means a theme asks for the thing it wants, and the
|
|
484
|
+
// component that actually knows what this is says so.
|
|
485
|
+
{...themeProps('checkbox-label')}
|
|
480
486
|
label={label}
|
|
481
487
|
inputID={id}
|
|
482
488
|
isLabelHidden={isLabelHidden}
|
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
easeVars,
|
|
40
40
|
} from '../theme/tokens.stylex';
|
|
41
41
|
import type {SizeValue, SpacingStep, Elevation} from '../utils/types';
|
|
42
|
-
import {mergeProps
|
|
42
|
+
import {mergeProps} from '../utils';
|
|
43
43
|
import {Card} from '../Card/Card';
|
|
44
44
|
import type {CardVariant} from '../Card/Card';
|
|
45
45
|
import {useClickableContainer} from '../hooks/useClickableContainer';
|
|
@@ -48,6 +48,7 @@ import {useLinkComponent} from '../Link/useLinkComponent';
|
|
|
48
48
|
import {themeProps} from '../utils/themeProps';
|
|
49
49
|
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
50
50
|
|
|
51
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
51
52
|
// =============================================================================
|
|
52
53
|
// Styles — only the interactive layer, Card handles everything else
|
|
53
54
|
// =============================================================================
|
|
@@ -297,7 +298,7 @@ export function ClickableCard({
|
|
|
297
298
|
|
|
298
299
|
return (
|
|
299
300
|
<Card
|
|
300
|
-
ref={
|
|
301
|
+
ref={useMergedRefs(ref, containerRef)}
|
|
301
302
|
width={width}
|
|
302
303
|
height={height}
|
|
303
304
|
maxWidth={maxWidth}
|
|
@@ -95,6 +95,12 @@ export const docs = {
|
|
|
95
95
|
type: 'SyntaxThemeDefinition',
|
|
96
96
|
description: 'Per-instance syntax theme override. Shorthand for wrapping the block in <SyntaxTheme theme={...}>. Accepts a preset from @astryxdesign/core/theme/syntax or a theme created with defineSyntaxTheme(). Defaults to the nearest SyntaxTheme ancestor or the theme-level syntax colors.',
|
|
97
97
|
},
|
|
98
|
+
{
|
|
99
|
+
name: 'highlightMode',
|
|
100
|
+
type: "'auto' | 'ranges' | 'spans'",
|
|
101
|
+
description: 'Syntax highlighting rendering mode.',
|
|
102
|
+
default: "'auto'",
|
|
103
|
+
},
|
|
98
104
|
{
|
|
99
105
|
name: 'isCollapsible',
|
|
100
106
|
type: 'boolean',
|
|
@@ -141,10 +147,16 @@ export const docs = {
|
|
|
141
147
|
theming: {
|
|
142
148
|
targets: [
|
|
143
149
|
{className: 'astryx-code', visualProps: ['color']},
|
|
144
|
-
{className: 'astryx-
|
|
145
|
-
{className: 'astryx-
|
|
146
|
-
{className: 'astryx-
|
|
147
|
-
{className: 'astryx-
|
|
150
|
+
{className: 'astryx-code-block', visualProps: ['size', 'language', 'container']},
|
|
151
|
+
{className: 'astryx-code-block-header', visualProps: ['size', 'language', 'container']},
|
|
152
|
+
{className: 'astryx-code-block-title', visualProps: ['size', 'language']},
|
|
153
|
+
{className: 'astryx-code-block-copy-button'},
|
|
154
|
+
// Still emitted beside the names above, so themes written against
|
|
155
|
+
// them keep working. Drop in the next major.
|
|
156
|
+
{className: 'astryx-codeblock', visualProps: ['size', 'language', 'container'], deprecatedFor: 'code-block'},
|
|
157
|
+
{className: 'astryx-codeblock-header', visualProps: ['size', 'language', 'container'], deprecatedFor: 'code-block-header'},
|
|
158
|
+
{className: 'astryx-codeblock-title', visualProps: ['size', 'language'], deprecatedFor: 'code-block-title'},
|
|
159
|
+
{className: 'astryx-codeblock-copy-button', deprecatedFor: 'code-block-copy-button'},
|
|
148
160
|
],
|
|
149
161
|
vars: [
|
|
150
162
|
{name: '--_codeblock-gutter-width', description: 'Width of the line-number gutter, computed from the digit count of the last line so the code column starts at a stable offset.', default: '2ch', private: true},
|
|
@@ -396,3 +396,40 @@ describe('CodeBlock', () => {
|
|
|
396
396
|
});
|
|
397
397
|
});
|
|
398
398
|
});
|
|
399
|
+
|
|
400
|
+
describe('CodeBlock theme target names', () => {
|
|
401
|
+
it('renders the deprecated classes beside the current ones', () => {
|
|
402
|
+
const {container} = render(
|
|
403
|
+
<CodeBlock
|
|
404
|
+
code="const x = 1;"
|
|
405
|
+
language="javascript"
|
|
406
|
+
title="example.js"
|
|
407
|
+
/>,
|
|
408
|
+
);
|
|
409
|
+
expect(container.querySelector('.astryx-code-block')).toHaveClass(
|
|
410
|
+
'astryx-codeblock',
|
|
411
|
+
);
|
|
412
|
+
expect(container.querySelector('.astryx-code-block-header')).toHaveClass(
|
|
413
|
+
'astryx-codeblock-header',
|
|
414
|
+
);
|
|
415
|
+
expect(container.querySelector('.astryx-code-block-title')).toHaveClass(
|
|
416
|
+
'astryx-codeblock-title',
|
|
417
|
+
);
|
|
418
|
+
expect(screen.getByRole('button', {name: 'Copy code'})).toHaveClass(
|
|
419
|
+
'astryx-code-block-copy-button',
|
|
420
|
+
);
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
it('reaches the header and title through the current defineTheme keys', () => {
|
|
424
|
+
const theme = defineTheme({
|
|
425
|
+
name: 'code-block-header-target-test',
|
|
426
|
+
components: {
|
|
427
|
+
'code-block-header': {base: {paddingBlock: 'var(--spacing-1)'}},
|
|
428
|
+
'code-block-title': {base: {fontSize: 'var(--text-body-size)'}},
|
|
429
|
+
},
|
|
430
|
+
});
|
|
431
|
+
const css = generateThemeTestCSS(theme);
|
|
432
|
+
expect(css).toContain('.astryx-code-block-header');
|
|
433
|
+
expect(css).toContain('.astryx-code-block-title');
|
|
434
|
+
});
|
|
435
|
+
});
|