@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
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* - /packages/core/src/Lightbox/Lightbox.doc.mjs (props table, features, implementation notes)
|
|
13
13
|
* - /packages/core/src/Lightbox/Lightbox.test.tsx (tests for new/changed behavior)
|
|
14
14
|
* - /packages/core/src/Lightbox/index.ts (exports if types change)
|
|
15
|
+
* - /packages/core/src/Layer/useLayerDismissal.ts (dismissal stack)
|
|
15
16
|
* - /apps/storybook/stories/Lightbox.stories.tsx (storybook stories)
|
|
16
17
|
* - /packages/cli/assets/templates/blocks/components/Lightbox/ (showcase blocks)
|
|
17
18
|
*/
|
|
@@ -32,13 +33,16 @@ import {IconButton} from '../IconButton';
|
|
|
32
33
|
import {useAnnounce} from '../hooks/useAnnounce';
|
|
33
34
|
import {useScrollLock} from '../hooks/useScrollLock';
|
|
34
35
|
import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
|
|
35
|
-
import {mergeProps,
|
|
36
|
+
import {mergeProps, rtlStyles} from '../utils';
|
|
36
37
|
import type {BaseProps} from '../BaseProps';
|
|
37
38
|
import {themeProps} from '../utils/themeProps';
|
|
38
39
|
import {focusOutlineStyles} from '../utils/focusOutline.stylex';
|
|
39
40
|
import {overlayPaddingReset} from '../Layout/padding.stylex';
|
|
41
|
+
import {LayerDepthProvider} from '../Layer/LayerDepthContext';
|
|
42
|
+
import {useLayerDismissal} from '../Layer/useLayerDismissal';
|
|
40
43
|
import {useTranslator} from '../i18n';
|
|
41
44
|
|
|
45
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
42
46
|
/**
|
|
43
47
|
* Media type for lightbox items.
|
|
44
48
|
*/
|
|
@@ -315,6 +319,7 @@ export function Lightbox({
|
|
|
315
319
|
}: LightboxProps) {
|
|
316
320
|
const t = useTranslator();
|
|
317
321
|
const dialogRef = useRef<HTMLDialogElement>(null);
|
|
322
|
+
const mergedDialogRef = useMergedRefs(ref, dialogRef);
|
|
318
323
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
319
324
|
const imageWrapperRef = useRef<HTMLDivElement>(null);
|
|
320
325
|
const triggerElementRef = useRef<Element | null>(null);
|
|
@@ -416,13 +421,28 @@ export function Lightbox({
|
|
|
416
421
|
onOpenChange(false);
|
|
417
422
|
}, [onOpenChange]);
|
|
418
423
|
|
|
419
|
-
|
|
424
|
+
const {shouldDismissOnCloseRequest} = useLayerDismissal({
|
|
425
|
+
isActive: isOpen,
|
|
426
|
+
onDismiss: handleClose,
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
// The native `cancel` event is the browser's own close-watcher firing: an
|
|
430
|
+
// Android back gesture, or a close request the stack never saw a press for.
|
|
431
|
+
// Escape presses the stack owns never arrive here — it preventDefault()s
|
|
432
|
+
// those, which suppresses the close watcher.
|
|
433
|
+
//
|
|
434
|
+
// Always preventDefault so the browser cannot close a controlled <dialog>
|
|
435
|
+
// behind React's back, then answer with the stack's own rules: top-most
|
|
436
|
+
// only, and never while an IME composition is in progress.
|
|
420
437
|
const handleCancel = useCallback(
|
|
421
438
|
(e: React.SyntheticEvent) => {
|
|
422
439
|
e.preventDefault();
|
|
440
|
+
if (!shouldDismissOnCloseRequest()) {
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
423
443
|
handleClose();
|
|
424
444
|
},
|
|
425
|
-
[handleClose],
|
|
445
|
+
[handleClose, shouldDismissOnCloseRequest],
|
|
426
446
|
);
|
|
427
447
|
|
|
428
448
|
// Backdrop click. The layout container fills the whole transparent dialog,
|
|
@@ -583,7 +603,7 @@ export function Lightbox({
|
|
|
583
603
|
|
|
584
604
|
return (
|
|
585
605
|
<dialog
|
|
586
|
-
ref={
|
|
606
|
+
ref={mergedDialogRef}
|
|
587
607
|
onCancel={handleCancel}
|
|
588
608
|
onClick={e => {
|
|
589
609
|
handleBackdropClick(e);
|
|
@@ -601,112 +621,114 @@ export function Lightbox({
|
|
|
601
621
|
style,
|
|
602
622
|
)}
|
|
603
623
|
{...props}>
|
|
604
|
-
<
|
|
605
|
-
{
|
|
606
|
-
|
|
607
|
-
icon={<Icon icon="close" size="sm" color="inherit" />}
|
|
608
|
-
label={t('@astryx.lightbox.close')}
|
|
609
|
-
variant="ghost"
|
|
610
|
-
onClick={handleClose}
|
|
611
|
-
xstyle={[styles.closeButton, styles.controlButton]}
|
|
612
|
-
/>
|
|
613
|
-
|
|
614
|
-
{/* Gallery nav: prev — stays mounted and is disabled at the start of
|
|
615
|
-
the range so pressing/arrowing to the boundary doesn't unmount the
|
|
616
|
-
focused control and drop focus to <body>. */}
|
|
617
|
-
{isGallery && (
|
|
624
|
+
<LayerDepthProvider>
|
|
625
|
+
<div ref={containerRef} {...stylex.props(styles.container)}>
|
|
626
|
+
{/* Close button */}
|
|
618
627
|
<IconButton
|
|
619
|
-
icon={
|
|
620
|
-
|
|
621
|
-
icon="chevronLeft"
|
|
622
|
-
size="sm"
|
|
623
|
-
color="inherit"
|
|
624
|
-
xstyle={rtlStyles.mirror}
|
|
625
|
-
/>
|
|
626
|
-
}
|
|
627
|
-
label={t('@astryx.lightbox.previous')}
|
|
628
|
+
icon={<Icon icon="close" size="sm" color="inherit" />}
|
|
629
|
+
label={t('@astryx.lightbox.close')}
|
|
628
630
|
variant="ghost"
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
xstyle={[styles.navButton, styles.navPrev, styles.controlButton]}
|
|
631
|
+
onClick={handleClose}
|
|
632
|
+
xstyle={[styles.closeButton, styles.controlButton]}
|
|
632
633
|
/>
|
|
633
|
-
)}
|
|
634
|
-
|
|
635
|
-
{/* Media + caption group (centered together) */}
|
|
636
|
-
<div {...stylex.props(styles.mediaGroup)}>
|
|
637
|
-
<div
|
|
638
|
-
ref={imageWrapperRef}
|
|
639
|
-
// The wrapper is a keyboard-operable zoom toggle when zoom is
|
|
640
|
-
// enabled: Enter/Space toggles, aria-pressed reflects state.
|
|
641
|
-
role={isZoomTarget ? 'button' : undefined}
|
|
642
|
-
tabIndex={isZoomTarget ? 0 : undefined}
|
|
643
|
-
aria-pressed={isZoomTarget ? isZoomed : undefined}
|
|
644
|
-
aria-label={isZoomTarget ? t('@astryx.lightbox.zoom') : undefined}
|
|
645
|
-
{...stylex.props(
|
|
646
|
-
styles.imageWrapper,
|
|
647
|
-
isZoomTarget && focusOutlineStyles.focusVisible,
|
|
648
|
-
!isVideo && hasZoom && !isZoomed && styles.imageWrapperZoomable,
|
|
649
|
-
!isVideo && isZoomed && styles.imageWrapperZoomed,
|
|
650
|
-
!isVideo && isDragging && styles.imageWrapperDragging,
|
|
651
|
-
)}
|
|
652
|
-
onDoubleClick={isVideo ? undefined : handleDoubleClick}
|
|
653
|
-
onKeyDown={isZoomTarget ? handleImageKeyDown : undefined}
|
|
654
|
-
onPointerDown={isVideo ? undefined : handlePointerDown}>
|
|
655
|
-
{isVideo ? (
|
|
656
|
-
<video
|
|
657
|
-
src={currentItem.src}
|
|
658
|
-
aria-label={currentItem.alt}
|
|
659
|
-
controls
|
|
660
|
-
autoPlay={hasAutoPlay}
|
|
661
|
-
{...stylex.props(styles.video)}
|
|
662
|
-
/>
|
|
663
|
-
) : (
|
|
664
|
-
<img
|
|
665
|
-
src={currentItem.src}
|
|
666
|
-
alt={currentItem.alt}
|
|
667
|
-
draggable={false}
|
|
668
|
-
{...stylex.props(
|
|
669
|
-
styles.image,
|
|
670
|
-
isDragging && styles.imageDragging,
|
|
671
|
-
imageTransform != null &&
|
|
672
|
-
dynamicStyles.imageTransform(imageTransform),
|
|
673
|
-
)}
|
|
674
|
-
/>
|
|
675
|
-
)}
|
|
676
|
-
</div>
|
|
677
634
|
|
|
678
|
-
{
|
|
679
|
-
|
|
635
|
+
{/* Gallery nav: prev — stays mounted and is disabled at the start of
|
|
636
|
+
the range so pressing/arrowing to the boundary doesn't unmount the
|
|
637
|
+
focused control and drop focus to <body>. */}
|
|
638
|
+
{isGallery && (
|
|
639
|
+
<IconButton
|
|
640
|
+
icon={
|
|
641
|
+
<Icon
|
|
642
|
+
icon="chevronLeft"
|
|
643
|
+
size="sm"
|
|
644
|
+
color="inherit"
|
|
645
|
+
xstyle={rtlStyles.mirror}
|
|
646
|
+
/>
|
|
647
|
+
}
|
|
648
|
+
label={t('@astryx.lightbox.previous')}
|
|
649
|
+
variant="ghost"
|
|
650
|
+
isDisabled={!canPrev}
|
|
651
|
+
onClick={goToPrev}
|
|
652
|
+
xstyle={[styles.navButton, styles.navPrev, styles.controlButton]}
|
|
653
|
+
/>
|
|
680
654
|
)}
|
|
681
|
-
</div>
|
|
682
655
|
|
|
683
|
-
|
|
656
|
+
{/* Media + caption group (centered together) */}
|
|
657
|
+
<div {...stylex.props(styles.mediaGroup)}>
|
|
658
|
+
<div
|
|
659
|
+
ref={imageWrapperRef}
|
|
660
|
+
// The wrapper is a keyboard-operable zoom toggle when zoom is
|
|
661
|
+
// enabled: Enter/Space toggles, aria-pressed reflects state.
|
|
662
|
+
role={isZoomTarget ? 'button' : undefined}
|
|
663
|
+
tabIndex={isZoomTarget ? 0 : undefined}
|
|
664
|
+
aria-pressed={isZoomTarget ? isZoomed : undefined}
|
|
665
|
+
aria-label={isZoomTarget ? t('@astryx.lightbox.zoom') : undefined}
|
|
666
|
+
{...stylex.props(
|
|
667
|
+
styles.imageWrapper,
|
|
668
|
+
isZoomTarget && focusOutlineStyles.focusVisible,
|
|
669
|
+
!isVideo && hasZoom && !isZoomed && styles.imageWrapperZoomable,
|
|
670
|
+
!isVideo && isZoomed && styles.imageWrapperZoomed,
|
|
671
|
+
!isVideo && isDragging && styles.imageWrapperDragging,
|
|
672
|
+
)}
|
|
673
|
+
onDoubleClick={isVideo ? undefined : handleDoubleClick}
|
|
674
|
+
onKeyDown={isZoomTarget ? handleImageKeyDown : undefined}
|
|
675
|
+
onPointerDown={isVideo ? undefined : handlePointerDown}>
|
|
676
|
+
{isVideo ? (
|
|
677
|
+
<video
|
|
678
|
+
src={currentItem.src}
|
|
679
|
+
aria-label={currentItem.alt}
|
|
680
|
+
controls
|
|
681
|
+
autoPlay={hasAutoPlay}
|
|
682
|
+
{...stylex.props(styles.video)}
|
|
683
|
+
/>
|
|
684
|
+
) : (
|
|
685
|
+
<img
|
|
686
|
+
src={currentItem.src}
|
|
687
|
+
alt={currentItem.alt}
|
|
688
|
+
draggable={false}
|
|
689
|
+
{...stylex.props(
|
|
690
|
+
styles.image,
|
|
691
|
+
isDragging && styles.imageDragging,
|
|
692
|
+
imageTransform != null &&
|
|
693
|
+
dynamicStyles.imageTransform(imageTransform),
|
|
694
|
+
)}
|
|
695
|
+
/>
|
|
696
|
+
)}
|
|
697
|
+
</div>
|
|
698
|
+
|
|
699
|
+
{currentItem.caption && (
|
|
700
|
+
<div {...stylex.props(styles.caption)}>{currentItem.caption}</div>
|
|
701
|
+
)}
|
|
702
|
+
</div>
|
|
703
|
+
|
|
704
|
+
{/* Gallery nav: next — see "prev" above; stays mounted and disabled at
|
|
684
705
|
the end of the range instead of unmounting. */}
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
706
|
+
{isGallery && (
|
|
707
|
+
<IconButton
|
|
708
|
+
icon={
|
|
709
|
+
<Icon
|
|
710
|
+
icon="chevronRight"
|
|
711
|
+
size="sm"
|
|
712
|
+
color="inherit"
|
|
713
|
+
xstyle={rtlStyles.mirror}
|
|
714
|
+
/>
|
|
715
|
+
}
|
|
716
|
+
label={t('@astryx.lightbox.next')}
|
|
717
|
+
variant="ghost"
|
|
718
|
+
isDisabled={!canNext}
|
|
719
|
+
onClick={goToNext}
|
|
720
|
+
xstyle={[styles.navButton, styles.navNext, styles.controlButton]}
|
|
721
|
+
/>
|
|
722
|
+
)}
|
|
702
723
|
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
724
|
+
{/* Gallery counter */}
|
|
725
|
+
{isGallery && mediaArray.length > 1 && (
|
|
726
|
+
<div {...stylex.props(styles.counter)}>
|
|
727
|
+
{index + 1} / {mediaArray.length}
|
|
728
|
+
</div>
|
|
729
|
+
)}
|
|
730
|
+
</div>
|
|
731
|
+
</LayerDepthProvider>
|
|
710
732
|
</dialog>
|
|
711
733
|
);
|
|
712
734
|
}
|
package/src/Link/Link.doc.mjs
CHANGED
|
@@ -78,6 +78,17 @@ export const docs = {
|
|
|
78
78
|
description:
|
|
79
79
|
'Link relationship tokens. noopener noreferrer are merged automatically for target="_blank".',
|
|
80
80
|
},
|
|
81
|
+
{
|
|
82
|
+
name: 'download',
|
|
83
|
+
type: 'string | boolean',
|
|
84
|
+
description:
|
|
85
|
+
'Causes the browser to download the linked URL. A string specifies the suggested filename.',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'referrerPolicy',
|
|
89
|
+
type: 'HTMLAttributeReferrerPolicy',
|
|
90
|
+
description: 'Referrer policy for the link.',
|
|
91
|
+
},
|
|
81
92
|
{
|
|
82
93
|
name: 'onClick',
|
|
83
94
|
type: 'MouseEventHandler',
|
|
@@ -94,6 +105,34 @@ export const docs = {
|
|
|
94
105
|
description: 'Applies base font sizing',
|
|
95
106
|
default: 'false',
|
|
96
107
|
},
|
|
108
|
+
{
|
|
109
|
+
name: 'size',
|
|
110
|
+
type: "'4xs' | '3xs' | '2xs' | 'xsm' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl'",
|
|
111
|
+
description: 'Explicit font size override forwarded to Text.',
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: 'weight',
|
|
115
|
+
type: "'normal' | 'medium' | 'semibold' | 'bold'",
|
|
116
|
+
description: 'Font weight override forwarded to Text.',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'color',
|
|
120
|
+
type: "'primary' | 'secondary' | 'disabled' | 'placeholder' | 'accent' | 'inherit'",
|
|
121
|
+
description: 'Text color forwarded to Text.',
|
|
122
|
+
default: "'accent'",
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: 'display',
|
|
126
|
+
type: "'inline' | 'block'",
|
|
127
|
+
description: 'Display type for Text.',
|
|
128
|
+
default: "'inline'",
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: 'maxLines',
|
|
132
|
+
type: 'number',
|
|
133
|
+
description: 'Maximum lines before truncation.',
|
|
134
|
+
default: '0',
|
|
135
|
+
},
|
|
97
136
|
{
|
|
98
137
|
name: 'children',
|
|
99
138
|
type: 'ReactNode',
|
|
@@ -96,6 +96,11 @@ export const docs = {
|
|
|
96
96
|
description:
|
|
97
97
|
"Opt-in autolinking of bare URLs and emails. 'gfm' applies GitHub-Flavored Markdown autolink-literal rules: bare https?://..., www...., <scheme:url>, <email>, and user@host all become links. Trailing sentence punctuation and unbalanced trailing close-parens are excluded; matches inside code spans, code blocks, existing links, and image alt text are skipped. Default behavior (option unset) is unchanged.",
|
|
98
98
|
},
|
|
99
|
+
{
|
|
100
|
+
name: 'components',
|
|
101
|
+
type: 'MarkdownComponents',
|
|
102
|
+
description: 'Custom React component overrides for rendered Markdown elements (code, inlineCode, link, heading, paragraph, image, blockquote, hr, citation).',
|
|
103
|
+
},
|
|
99
104
|
{
|
|
100
105
|
name: 'xstyle',
|
|
101
106
|
type: 'StyleXStyles',
|
|
@@ -561,14 +561,19 @@ const headingStyles = {
|
|
|
561
561
|
const DANGEROUS_URL_PATTERN = /^(javascript|data|vbscript):/i;
|
|
562
562
|
|
|
563
563
|
function sanitizeUrl(url: string): string | null {
|
|
564
|
-
|
|
565
|
-
|
|
564
|
+
// Strip control characters before testing, the same normalization the
|
|
565
|
+
// parser's isSafeUrl applies — the anchored pattern must see the URL the
|
|
566
|
+
// way a browser will. Return the normalized value so the stripped
|
|
567
|
+
// characters don't ride along into an attribute or component override.
|
|
568
|
+
// eslint-disable-next-line no-control-regex -- control chars are the bypass
|
|
569
|
+
const normalized = url.replace(/[\x00-\x1f\x7f]/g, '').trim();
|
|
570
|
+
if (normalized.length === 0) {
|
|
566
571
|
return null;
|
|
567
572
|
}
|
|
568
|
-
if (DANGEROUS_URL_PATTERN.test(
|
|
573
|
+
if (DANGEROUS_URL_PATTERN.test(normalized)) {
|
|
569
574
|
return null;
|
|
570
575
|
}
|
|
571
|
-
return
|
|
576
|
+
return normalized;
|
|
572
577
|
}
|
|
573
578
|
|
|
574
579
|
// ---------------------------------------------------------------------------
|
|
@@ -131,12 +131,26 @@ describe('parseMarkdownIncremental', () => {
|
|
|
131
131
|
expect(state.settledText).toBe('');
|
|
132
132
|
});
|
|
133
133
|
|
|
134
|
-
it('unclosed fence
|
|
134
|
+
it('settles what precedes an unclosed fence, and nothing inside it', () => {
|
|
135
135
|
const state = createIncrementalState();
|
|
136
136
|
const input =
|
|
137
137
|
'# Title\n\n```python\ndef foo():\n pass\n\n# still inside fence';
|
|
138
138
|
parseMarkdownIncremental(input, state);
|
|
139
|
-
expect(state.
|
|
139
|
+
expect(state.settledText).toBe('# Title');
|
|
140
|
+
expect(state.settledBlocks).toHaveLength(1);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('does not hold back lines inside an unclosed fence', () => {
|
|
144
|
+
const state = createIncrementalState();
|
|
145
|
+
const blocks = parseMarkdownIncremental(
|
|
146
|
+
'Intro\n\n```ts\ntype Id = string | number;',
|
|
147
|
+
state,
|
|
148
|
+
);
|
|
149
|
+
const code = blocks.find(block => block.type === 'codeblock');
|
|
150
|
+
expect(code).toMatchObject({
|
|
151
|
+
type: 'codeblock',
|
|
152
|
+
content: 'type Id = string | number;',
|
|
153
|
+
});
|
|
140
154
|
});
|
|
141
155
|
|
|
142
156
|
it('handles task list streaming', () => {
|
package/src/Markdown/index.ts
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
parseMarkdownIncremental,
|
|
7
7
|
createIncrementalState,
|
|
8
8
|
} from './parser';
|
|
9
|
-
import type {BlockNode} from './parser';
|
|
9
|
+
import type {BlockNode, ParseOptions} from './parser';
|
|
10
10
|
|
|
11
11
|
function generateAIResponse(paragraphs: number): string {
|
|
12
12
|
const sections: string[] = [];
|
|
@@ -69,6 +69,44 @@ function simulateStreamingIncremental(
|
|
|
69
69
|
return parseMarkdownIncremental(fullText, state);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
/**
|
|
73
|
+
* How many blocks each chunk of a streamed document had to build.
|
|
74
|
+
*
|
|
75
|
+
* A block the parser kept in its settled cache is handed back as the very same
|
|
76
|
+
* object, so a returned block that is not one of the previous chunk's is one
|
|
77
|
+
* this chunk built. That makes the cache countable without reaching into the
|
|
78
|
+
* parser's internals.
|
|
79
|
+
*/
|
|
80
|
+
function blocksBuiltPerChunk(
|
|
81
|
+
fullText: string,
|
|
82
|
+
chunkSize: number,
|
|
83
|
+
options?: ParseOptions,
|
|
84
|
+
): number[] {
|
|
85
|
+
const state = createIncrementalState();
|
|
86
|
+
let previous: ReadonlySet<BlockNode> = new Set();
|
|
87
|
+
const built: number[] = [];
|
|
88
|
+
const step = (text: string) => {
|
|
89
|
+
const blocks =
|
|
90
|
+
options == null
|
|
91
|
+
? parseMarkdownIncremental(text, state)
|
|
92
|
+
: parseMarkdownIncremental(text, state, options);
|
|
93
|
+
built.push(blocks.reduce((n, b) => (previous.has(b) ? n : n + 1), 0));
|
|
94
|
+
previous = new Set(blocks);
|
|
95
|
+
};
|
|
96
|
+
for (let i = chunkSize; i <= fullText.length; i += chunkSize) {
|
|
97
|
+
step(fullText.slice(0, i));
|
|
98
|
+
}
|
|
99
|
+
step(fullText);
|
|
100
|
+
return built;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const percentile = (values: number[], p: number): number => {
|
|
104
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
105
|
+
return sorted[Math.min(sorted.length - 1, Math.floor(p * sorted.length))];
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const sum = (values: number[]): number => values.reduce((a, b) => a + b, 0);
|
|
109
|
+
|
|
72
110
|
// A single wall-clock measurement is flaky when the whole suite runs in
|
|
73
111
|
// parallel forks: scheduler contention can inflate a millisecond-scale
|
|
74
112
|
// sample well past a tight budget (observed 30.9ms against the 20ms Small
|
|
@@ -204,3 +242,60 @@ describe('parseMarkdown performance', () => {
|
|
|
204
242
|
expect(incrElapsed).toBeLessThanOrEqual(fullElapsed * 1.1);
|
|
205
243
|
});
|
|
206
244
|
});
|
|
245
|
+
|
|
246
|
+
// What the incremental parser exists for is a cache, so these assert the cache:
|
|
247
|
+
// integers that come out the same on a loaded CI box as on an idle laptop,
|
|
248
|
+
// unlike the wall-clock budgets above.
|
|
249
|
+
describe('parseMarkdownIncremental cache', () => {
|
|
250
|
+
it('builds a bounded number of blocks per chunk however long the document is', () => {
|
|
251
|
+
const chunkSize = 50;
|
|
252
|
+
const medians = [50, 200, 500].map(paragraphs =>
|
|
253
|
+
percentile(
|
|
254
|
+
blocksBuiltPerChunk(generateAIResponse(paragraphs), chunkSize),
|
|
255
|
+
0.5,
|
|
256
|
+
),
|
|
257
|
+
);
|
|
258
|
+
console.log(
|
|
259
|
+
` median blocks built per chunk (50/200/500 paragraphs): ${medians.join('/')}`,
|
|
260
|
+
);
|
|
261
|
+
// A chunk re-parses its unsettled tail, not the document — so the typical
|
|
262
|
+
// chunk's cost is a constant, and a 10x longer document does not move it.
|
|
263
|
+
expect(medians).toEqual([1, 1, 1]);
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
it('bounds the worst chunk, not just the typical one, at every document length', () => {
|
|
267
|
+
const chunkSize = 50;
|
|
268
|
+
const worst = [50, 200, 500].map(paragraphs =>
|
|
269
|
+
Math.max(
|
|
270
|
+
...blocksBuiltPerChunk(generateAIResponse(paragraphs), chunkSize),
|
|
271
|
+
),
|
|
272
|
+
);
|
|
273
|
+
console.log(
|
|
274
|
+
` worst chunk's blocks built (50/200/500 paragraphs): ${worst.join('/')}`,
|
|
275
|
+
);
|
|
276
|
+
// A cache that dumps on a minority of chunks is flat at the median and at
|
|
277
|
+
// p95 while the total work is still quadratic: the blank-line path of
|
|
278
|
+
// #5378 hit ~1.4% of chunks on this fixture, and no percentile bound saw
|
|
279
|
+
// it. The worst chunk does, and each collapse costs more as the document
|
|
280
|
+
// grows — so this asserts the worst one, and that a 10x document does not
|
|
281
|
+
// move it. Deterministic: same fixture, same chunking, integers with no
|
|
282
|
+
// timing input.
|
|
283
|
+
expect(worst).toEqual([3, 3, 3]);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
it('keeps the cache when source ranges are asked for', () => {
|
|
287
|
+
const text = generateAIResponse(200);
|
|
288
|
+
const chunkSize = 50;
|
|
289
|
+
const without = sum(blocksBuiltPerChunk(text, chunkSize));
|
|
290
|
+
const withRanges = sum(
|
|
291
|
+
blocksBuiltPerChunk(text, chunkSize, {sourceRanges: true}),
|
|
292
|
+
);
|
|
293
|
+
console.log(
|
|
294
|
+
` blocks built streaming ${text.length} chars: ${without} without ranges, ${withRanges} with`,
|
|
295
|
+
);
|
|
296
|
+
// Stamping offsets must not cost a cache entry. An implementation that
|
|
297
|
+
// tracked positions by invalidating the settled cache each chunk would
|
|
298
|
+
// still pass any time budget generous enough not to flake; it fails here.
|
|
299
|
+
expect(withRanges).toBe(without);
|
|
300
|
+
});
|
|
301
|
+
});
|