@astryxdesign/core 0.1.6 → 0.1.7-canary.04cd8f7
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 +68 -0
- package/README.md +25 -14
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +4 -1
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +3 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +4 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +8 -6
- package/dist/Breadcrumbs/Breadcrumbs.d.ts +1 -1
- package/dist/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
- package/dist/Breadcrumbs/Breadcrumbs.js +4 -1
- package/dist/Button/Button.d.ts +10 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +49 -6
- package/dist/ButtonGroup/ButtonGroup.d.ts +20 -5
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +27 -11
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +29 -7
- package/dist/Carousel/Carousel.d.ts +1 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +8 -5
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +4 -1
- package/dist/Chat/ChatComposerDrawer.d.ts +1 -1
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +9 -2
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +6 -2
- package/dist/Chat/ChatLayout.d.ts +1 -11
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +6 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +4 -2
- package/dist/Chat/ChatMessage.d.ts +1 -1
- package/dist/Chat/ChatMessage.d.ts.map +1 -1
- package/dist/Chat/ChatMessage.js +8 -2
- package/dist/Chat/ChatMessageBubble.d.ts +1 -1
- package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
- package/dist/Chat/ChatMessageBubble.js +3 -1
- package/dist/Chat/ChatMessageList.d.ts +1 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +3 -1
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +13 -8
- package/dist/Chat/ChatPastedTextToken.d.ts.map +1 -1
- package/dist/Chat/ChatPastedTextToken.js +3 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +3 -1
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts +12 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +43 -6
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +4 -2
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +4 -2
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +4 -2
- package/dist/CheckboxList/CheckboxList.d.ts +1 -1
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +3 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +3 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +10 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +71 -53
- package/dist/Collapsible/Collapsible.d.ts +11 -1
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +36 -4
- package/dist/CommandPalette/CommandPalette.d.ts +1 -1
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +8 -3
- package/dist/CommandPalette/CommandPaletteInput.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +4 -1
- package/dist/CommandPalette/CommandPaletteList.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteList.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteList.js +4 -1
- package/dist/ContextMenu/ContextMenu.d.ts +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +8 -4
- package/dist/ContextMenu/index.d.ts +3 -0
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +7 -1
- package/dist/DateInput/DateInput.d.ts +1 -1
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +10 -5
- package/dist/DateRangeInput/DateRangeInput.d.ts +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +11 -6
- package/dist/DateTimeInput/DateTimeInput.d.ts +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +15 -7
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +15 -12
- package/dist/Dialog/DialogHeader.d.ts +1 -1
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +7 -3
- package/dist/DropdownMenu/DropdownMenu.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +19 -9
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +89 -0
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +170 -0
- package/dist/DropdownMenu/DropdownMenuContext.d.ts +17 -1
- package/dist/DropdownMenu/DropdownMenuContext.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuContext.js +18 -0
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +69 -0
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +70 -0
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +69 -0
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +178 -0
- package/dist/DropdownMenu/index.d.ts +5 -1
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +10 -1
- package/dist/DropdownMenu/menuItemRoles.d.ts +13 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemRoles.js +15 -0
- package/dist/EmptyState/EmptyState.d.ts +4 -1
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +11 -1
- package/dist/Icon/Icon.d.ts +17 -12
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +28 -20
- package/dist/Kbd/Kbd.js +1 -1
- package/dist/Layer/useLayer.d.ts +10 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +23 -1
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +6 -4
- package/dist/Link/Link.d.ts +5 -1
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +32 -1
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +10 -8
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +4 -2
- package/dist/MobileNav/MobileNavToggle.d.ts +1 -1
- package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
- package/dist/MobileNav/MobileNavToggle.js +4 -1
- package/dist/MoreMenu/MoreMenu.d.ts +1 -1
- package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
- package/dist/MoreMenu/MoreMenu.js +4 -1
- package/dist/MultiSelector/MultiSelector.d.ts +1 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +13 -6
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +5 -1
- package/dist/Outline/Outline.d.ts +1 -1
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +4 -1
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +38 -11
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +4 -1
- package/dist/PowerSearch/PowerSearch.d.ts +1 -1
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +22 -12
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +26 -20
- package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchToken.js +7 -3
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +34 -21
- package/dist/PowerSearch/formatFilterValue.d.ts +2 -1
- package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatFilterValue.js +19 -9
- package/dist/PowerSearch/index.d.ts +2 -1
- package/dist/PowerSearch/index.d.ts.map +1 -1
- package/dist/PowerSearch/index.js +1 -0
- package/dist/PowerSearch/resolveOperatorLabel.d.ts +23 -0
- package/dist/PowerSearch/resolveOperatorLabel.d.ts.map +1 -0
- package/dist/PowerSearch/resolveOperatorLabel.js +28 -0
- package/dist/PowerSearch/types.d.ts +28 -2
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchConfig.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchConfig.js +27 -27
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.js +15 -8
- package/dist/Resizable/ResizeHandle.d.ts +1 -1
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +4 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +52 -14
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +4 -2
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +3 -1
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +5 -3
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +7 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +4 -2
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabList.d.ts +1 -1
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +6 -1
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +29 -16
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +5 -3
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.js +56 -19
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +12 -5
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +6 -3
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +8 -6
- package/dist/Table/plugins/rowIndex/useTableRowIndex.d.ts +1 -1
- package/dist/Table/plugins/rowIndex/useTableRowIndex.js +1 -1
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +5 -2
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +6 -4
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -2
- package/dist/Table/plugins/tree/index.d.ts +5 -0
- package/dist/Table/plugins/tree/index.d.ts.map +1 -0
- package/dist/Table/plugins/tree/index.js +4 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +38 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -0
- package/dist/Table/plugins/tree/useTableTreeData.js +358 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts +51 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -0
- package/dist/Table/plugins/tree/useTableTreeState.js +175 -0
- package/dist/Table/types.d.ts +17 -10
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +6 -3
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +5 -1
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +8 -2
- package/dist/TimeInput/TimeInput.d.ts +1 -1
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +7 -2
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +18 -3
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +3 -1
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +3 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +8 -2
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +3 -1
- package/dist/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar/Toolbar.js +8 -1
- package/dist/TopNav/TopNav.d.ts +2 -1
- package/dist/TopNav/TopNav.d.ts.map +1 -1
- package/dist/TopNav/TopNav.js +4 -1
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +5 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +5 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +7 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +8 -4
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -1
- package/dist/VisuallyHidden/VisuallyHidden.d.ts +1 -0
- package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.js +1 -0
- package/dist/astryx.css +38 -4
- package/dist/astryx.umd.js +62 -60
- package/dist/astryx.umd.js.map +4 -4
- package/dist/authoring/doc.d.ts +145 -0
- package/dist/authoring/doc.d.ts.map +1 -0
- package/dist/authoring/doc.js +100 -0
- package/dist/authoring/index.d.ts +29 -0
- package/dist/authoring/index.d.ts.map +1 -0
- package/dist/authoring/index.js +28 -0
- package/dist/authoring/integration.d.ts +35 -0
- package/dist/authoring/integration.d.ts.map +1 -0
- package/dist/authoring/integration.js +30 -0
- package/dist/authoring/template.d.ts +66 -0
- package/dist/authoring/template.d.ts.map +1 -0
- package/dist/authoring/template.js +55 -0
- package/dist/config.d.ts +80 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +40 -0
- package/dist/docs-types.d.ts +13 -4
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.d.ts +12 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -0
- package/dist/i18n/InternationalizationContext.js +29 -0
- package/dist/i18n/InternationalizationProvider.d.ts +61 -0
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -0
- package/dist/i18n/InternationalizationProvider.js +44 -0
- package/dist/i18n/index.d.ts +24 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +21 -0
- package/dist/i18n/resolve.d.ts +22 -0
- package/dist/i18n/resolve.d.ts.map +1 -0
- package/dist/i18n/resolve.js +141 -0
- package/dist/i18n/translator.d.ts +25 -0
- package/dist/i18n/translator.d.ts.map +1 -0
- package/dist/i18n/translator.js +1 -0
- package/dist/i18n/types.d.ts +47 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +1 -0
- package/dist/i18n/useTranslator.d.ts +15 -0
- package/dist/i18n/useTranslator.d.ts.map +1 -0
- package/dist/i18n/useTranslator.js +39 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/theme/Theme.js +1 -1
- package/dist/theme/defineTheme.d.ts +1 -1
- package/dist/theme/defineTheme.js +1 -1
- package/dist/theme/hct.d.ts +0 -1
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +0 -3
- package/dist/utils/color.d.ts +13 -1
- package/dist/utils/color.d.ts.map +1 -1
- package/dist/utils/color.js +23 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/locales/en.json +754 -0
- package/locales/pseudo.json +566 -0
- package/package.json +23 -2
- package/src/AlertDialog/AlertDialog.doc.mjs +5 -0
- package/src/AlertDialog/AlertDialog.tsx +4 -1
- package/src/AppShell/AppShell.doc.mjs +8 -2
- package/src/AppShell/AppShell.tsx +3 -1
- package/src/AvatarGroup/AvatarGroup.tsx +4 -1
- package/src/Banner/Banner.tsx +10 -5
- package/src/Breadcrumbs/Breadcrumbs.tsx +4 -1
- package/src/Button/Button.doc.mjs +8 -0
- package/src/Button/Button.test.tsx +27 -0
- package/src/Button/Button.tsx +51 -5
- package/src/ButtonGroup/ButtonGroup.test.tsx +386 -2
- package/src/ButtonGroup/ButtonGroup.tsx +27 -11
- package/src/Calendar/Calendar.test.tsx +103 -2
- package/src/Calendar/Calendar.tsx +29 -6
- package/src/Card/Card.doc.mjs +3 -3
- package/src/Carousel/Carousel.tsx +10 -7
- package/src/Chat/ChatComposer.tsx +5 -1
- package/src/Chat/ChatComposerDrawer.tsx +9 -2
- package/src/Chat/ChatComposerInput.tsx +10 -4
- package/src/Chat/ChatLayout.test.tsx +127 -2
- package/src/Chat/ChatLayout.tsx +5 -12
- package/src/Chat/ChatLayoutScrollButton.tsx +4 -2
- package/src/Chat/ChatMessage.tsx +5 -1
- package/src/Chat/ChatMessageBubble.tsx +2 -0
- package/src/Chat/ChatMessageList.doc.mjs +1 -1
- package/src/Chat/ChatMessageList.tsx +2 -0
- package/src/Chat/ChatMessageMetadata.tsx +15 -9
- package/src/Chat/ChatPastedTextToken.tsx +3 -1
- package/src/Chat/ChatSendButton.tsx +3 -1
- package/src/Chat/ChatToolCalls.doc.mjs +1 -1
- package/src/Chat/index.ts +1 -0
- package/src/Chat/useChatStreamScroll.test.tsx +168 -0
- package/src/Chat/useChatStreamScroll.ts +67 -11
- package/src/Chat/useSpeechRecognition.ts +11 -2
- package/src/Chat/useTriggerMenu.tsx +4 -2
- package/src/CheckboxInput/CheckboxInput.doc.mjs +1 -1
- package/src/CheckboxInput/CheckboxInput.test.tsx +16 -0
- package/src/CheckboxInput/CheckboxInput.tsx +4 -2
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -1
- package/src/CheckboxList/CheckboxList.tsx +2 -0
- package/src/CheckboxList/CheckboxListItem.tsx +7 -1
- package/src/Citation/Citation.tsx +4 -2
- package/src/ClickableCard/ClickableCard.doc.mjs +1 -1
- package/src/CodeBlock/CodeBlock.tsx +91 -40
- package/src/Collapsible/Collapsible.doc.mjs +7 -0
- package/src/Collapsible/Collapsible.test.tsx +80 -0
- package/src/Collapsible/Collapsible.tsx +58 -5
- package/src/CommandPalette/CommandPalette.tsx +10 -3
- package/src/CommandPalette/CommandPaletteInput.test.tsx +1 -1
- package/src/CommandPalette/CommandPaletteInput.tsx +5 -1
- package/src/CommandPalette/CommandPaletteList.tsx +4 -1
- package/src/ContextMenu/ContextMenu.test.tsx +75 -1
- package/src/ContextMenu/ContextMenu.tsx +14 -6
- package/src/ContextMenu/index.ts +15 -0
- package/src/DateInput/DateInput.doc.mjs +2 -2
- package/src/DateInput/DateInput.test.tsx +17 -5
- package/src/DateInput/DateInput.tsx +13 -5
- package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
- package/src/DateRangeInput/DateRangeInput.tsx +14 -6
- package/src/DateTimeInput/DateTimeInput.doc.mjs +2 -2
- package/src/DateTimeInput/DateTimeInput.tsx +17 -7
- package/src/Dialog/Dialog.tsx +11 -15
- package/src/Dialog/DialogHeader.tsx +7 -3
- package/src/DropdownMenu/DropdownMenu.doc.mjs +23 -0
- package/src/DropdownMenu/DropdownMenu.tsx +23 -14
- package/src/DropdownMenu/DropdownMenuCheckboxItem.doc.mjs +95 -0
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +237 -0
- package/src/DropdownMenu/DropdownMenuContext.tsx +29 -1
- package/src/DropdownMenu/DropdownMenuItem.doc.mjs +7 -1
- package/src/DropdownMenu/DropdownMenuRadioGroup.doc.mjs +80 -0
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +119 -0
- package/src/DropdownMenu/DropdownMenuRadioItem.doc.mjs +80 -0
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +232 -0
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +163 -0
- package/src/DropdownMenu/index.ts +23 -3
- package/src/DropdownMenu/menuItemRoles.ts +22 -0
- package/src/EmptyState/EmptyState.doc.mjs +3 -3
- package/src/EmptyState/EmptyState.tsx +4 -1
- package/src/Field/Field.doc.mjs +3 -3
- package/src/Field/FieldLabel.doc.mjs +1 -1
- package/src/FileInput/FileInput.test.tsx +40 -1
- package/src/FileInput/FileInput.tsx +12 -1
- package/src/Grid/Grid.doc.mjs +5 -5
- package/src/Icon/Icon.test.tsx +46 -0
- package/src/Icon/Icon.tsx +37 -24
- package/src/InputGroup/InputGroup.doc.mjs +1 -1
- package/src/Kbd/Kbd.test.tsx +26 -0
- package/src/Kbd/Kbd.tsx +1 -1
- package/src/Layer/useLayer.doc.mjs +8 -5
- package/src/Layer/useLayer.test.tsx +136 -1
- package/src/Layer/useLayer.tsx +34 -2
- package/src/Lightbox/Lightbox.doc.mjs +7 -2
- package/src/Lightbox/Lightbox.tsx +6 -4
- package/src/Link/Link.test.tsx +74 -2
- package/src/Link/Link.tsx +48 -1
- package/src/Markdown/Markdown.tsx +12 -4
- package/src/MobileNav/MobileNav.tsx +4 -2
- package/src/MobileNav/MobileNavToggle.tsx +5 -3
- package/src/MoreMenu/MoreMenu.tsx +4 -1
- package/src/MultiSelector/MultiSelector.tsx +14 -5
- package/src/NumberInput/NumberInput.doc.mjs +2 -2
- package/src/NumberInput/NumberInput.tsx +3 -1
- package/src/Outline/Outline.tsx +4 -1
- package/src/OverflowList/OverflowList.doc.mjs +2 -2
- package/src/Pagination/Pagination.tsx +35 -12
- package/src/Popover/usePopover.tsx +6 -1
- package/src/PowerSearch/PowerSearch.doc.mjs +9 -4
- package/src/PowerSearch/PowerSearch.tsx +22 -10
- package/src/PowerSearch/PowerSearchEditPopover.tsx +27 -20
- package/src/PowerSearch/PowerSearchToken.tsx +17 -6
- package/src/PowerSearch/PowerSearchValueEditor.tsx +34 -21
- package/src/PowerSearch/formatFilterValue.test.ts +282 -0
- package/src/PowerSearch/formatFilterValue.ts +21 -8
- package/src/PowerSearch/index.ts +5 -0
- package/src/PowerSearch/resolveOperatorLabel.ts +34 -0
- package/src/PowerSearch/types.ts +33 -9
- package/src/PowerSearch/usePowerSearchConfig.ts +59 -27
- package/src/PowerSearch/usePowerSearchSource.ts +17 -8
- package/src/RadioList/RadioList.doc.mjs +1 -1
- package/src/Resizable/ResizeHandle.tsx +4 -1
- package/src/Section/Section.doc.mjs +4 -4
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.doc.mjs +6 -3
- package/src/Selector/Selector.test.tsx +114 -6
- package/src/Selector/Selector.tsx +68 -17
- package/src/Selector/SelectorOption.doc.mjs +1 -1
- package/src/SideNav/SideNav.tsx +4 -2
- package/src/SideNav/SideNavCollapseButton.tsx +3 -1
- package/src/SideNav/SideNavHeading.tsx +5 -3
- package/src/SideNav/SideNavItem.doc.mjs +2 -2
- package/src/SideNav/SideNavItem.tsx +3 -1
- package/src/Slider/Slider.doc.mjs +2 -2
- package/src/Stack/Stack.doc.mjs +10 -10
- package/src/Switch/Switch.doc.mjs +3 -3
- package/src/Switch/Switch.test.tsx +16 -0
- package/src/Switch/Switch.tsx +4 -2
- package/src/TabList/Tab.tsx +5 -1
- package/src/TabList/TabList.doc.mjs +3 -3
- package/src/TabList/TabList.test.tsx +66 -0
- package/src/TabList/TabList.tsx +12 -1
- package/src/TabList/TabMenu.tsx +4 -1
- package/src/Table/BaseTable.tsx +36 -19
- package/src/Table/Table.doc.mjs +2 -0
- package/src/Table/Table.test.tsx +132 -1
- package/src/Table/Table.tsx +6 -4
- package/src/Table/index.ts +7 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +1 -1
- package/src/Table/plugins/filtering/useTableFiltering.tsx +31 -30
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +7 -5
- package/src/Table/plugins/pagination/useTablePagination.tsx +4 -1
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -8
- package/src/Table/plugins/rowIndex/useTableRowIndex.tsx +1 -1
- package/src/Table/plugins/selection/useTableSelection.tsx +6 -7
- package/src/Table/plugins/sortable/useTableSortable.tsx +8 -5
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +4 -4
- package/src/Table/plugins/tree/index.ts +12 -0
- package/src/Table/plugins/tree/useTableTreeData-perf.test.tsx +163 -0
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +594 -0
- package/src/Table/plugins/tree/useTableTreeData.tsx +495 -0
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +636 -0
- package/src/Table/plugins/tree/useTableTreeState.tsx +253 -0
- package/src/Table/types.ts +18 -12
- package/src/Table/useBaseTablePlugins.ts +6 -2
- package/src/Table/useTableFiltering.doc.mjs +2 -2
- package/src/Table/useTableGroupedRows.doc.mjs +3 -3
- package/src/Table/useTableSortable.doc.mjs +11 -11
- package/src/Table/useTableTreeData.doc.mjs +75 -0
- package/src/Table/useTableTreeState.doc.mjs +98 -0
- package/src/Text/Text.doc.mjs +2 -2
- package/src/TextArea/TextArea.doc.mjs +1 -1
- package/src/TextInput/TextInput.doc.mjs +1 -1
- package/src/TextInput/TextInput.tsx +3 -1
- package/src/Thumbnail/Thumbnail.tsx +4 -2
- package/src/TimeInput/TimeInput.doc.mjs +2 -2
- package/src/TimeInput/TimeInput.tsx +6 -2
- package/src/Timestamp/Timestamp.doc.mjs +4 -4
- package/src/Timestamp/Timestamp.test.tsx +120 -7
- package/src/Timestamp/Timestamp.tsx +21 -1
- package/src/Toast/Toast.tsx +3 -1
- package/src/Toast/ToastViewport.tsx +3 -1
- package/src/Token/Token.tsx +4 -2
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.tsx +4 -4
- package/src/Toolbar/Toolbar.doc.mjs +1 -1
- package/src/Toolbar/Toolbar.tsx +10 -3
- package/src/TopNav/TopNav.doc.mjs +1 -0
- package/src/TopNav/TopNav.test.tsx +30 -0
- package/src/TopNav/TopNav.tsx +6 -4
- package/src/TopNav/TopNavHeading.tsx +5 -3
- package/src/TreeList/TreeList.tsx +5 -1
- package/src/TreeList/TreeListItem.tsx +6 -1
- package/src/Typeahead/BaseTypeahead.tsx +11 -4
- package/src/Typeahead/Typeahead.doc.mjs +1 -1
- package/src/Typeahead/Typeahead.tsx +3 -1
- package/src/VisuallyHidden/VisuallyHidden.tsx +1 -0
- package/src/authoring/doc.ts +166 -0
- package/src/authoring/index.test.ts +52 -0
- package/src/authoring/index.ts +50 -0
- package/src/authoring/integration.ts +42 -0
- package/src/authoring/template.ts +74 -0
- package/src/config.test.ts +16 -0
- package/src/config.ts +92 -0
- package/src/docPropLiterals.test.ts +938 -0
- package/src/docs-types.ts +15 -10
- package/src/i18n/InternationalizationContext.ts +39 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +72 -0
- package/src/i18n/InternationalizationProvider.tsx +82 -0
- package/src/i18n/__tests__/e2e-pagination.test.tsx +172 -0
- package/src/i18n/__tests__/e2e-powersearch.test.tsx +130 -0
- package/src/i18n/__tests__/resolve.test.ts +284 -0
- package/src/i18n/index.ts +32 -0
- package/src/i18n/resolve.ts +165 -0
- package/src/i18n/translator.ts +31 -0
- package/src/i18n/types.ts +53 -0
- package/src/i18n/useTranslator.doc.mjs +46 -0
- package/src/i18n/useTranslator.ts +50 -0
- package/src/index.ts +3 -0
- package/src/theme/Theme.doc.mjs +4 -4
- package/src/theme/Theme.tsx +1 -1
- package/src/theme/defineTheme.ts +1 -1
- package/src/theme/hct.ts +0 -4
- package/src/utils/color.test.ts +101 -1
- package/src/utils/color.ts +23 -1
- package/src/utils/index.ts +8 -1
- package/dist/NavItem/index.d.ts +0 -9
- package/dist/NavItem/index.d.ts.map +0 -1
- package/dist/NavItem/index.js +0 -10
- package/src/NavItem/index.ts +0 -11
|
@@ -116,7 +116,7 @@ export const docs = {
|
|
|
116
116
|
name: 'startIcon',
|
|
117
117
|
type: 'IconType',
|
|
118
118
|
description:
|
|
119
|
-
'Icon component rendered inside the leading edge of the textarea wrapper. See `
|
|
119
|
+
'Icon component rendered inside the leading edge of the textarea wrapper. See `astryx docs icons` for valid semantic names.',
|
|
120
120
|
},
|
|
121
121
|
{
|
|
122
122
|
name: 'hasSpellCheck',
|
|
@@ -106,7 +106,7 @@ export const docs = {
|
|
|
106
106
|
name: 'startIcon',
|
|
107
107
|
type: 'IconType',
|
|
108
108
|
description:
|
|
109
|
-
'SVG icon component displayed at the start of the input. See `
|
|
109
|
+
'SVG icon component displayed at the start of the input. See `astryx docs icons` for valid semantic names.',
|
|
110
110
|
},
|
|
111
111
|
{
|
|
112
112
|
name: 'status',
|
|
@@ -123,6 +123,7 @@ import {useInputGroup} from '../InputGroup/InputGroupContext';
|
|
|
123
123
|
import type {BaseProps} from '../BaseProps';
|
|
124
124
|
import type {SizeValue} from '../utils/types';
|
|
125
125
|
import {themeProps} from '../utils/themeProps';
|
|
126
|
+
import {useTranslator} from '../i18n';
|
|
126
127
|
|
|
127
128
|
export type TextInputType = 'text' | 'password' | 'email';
|
|
128
129
|
|
|
@@ -298,6 +299,7 @@ export function TextInput({
|
|
|
298
299
|
ref,
|
|
299
300
|
...rest
|
|
300
301
|
}: TextInputProps) {
|
|
302
|
+
const t = useTranslator();
|
|
301
303
|
const size = useSize(sizeProp, 'md');
|
|
302
304
|
|
|
303
305
|
const id = useId();
|
|
@@ -448,7 +450,7 @@ export function TextInput({
|
|
|
448
450
|
<button
|
|
449
451
|
type="button"
|
|
450
452
|
onClick={handleClear}
|
|
451
|
-
aria-label={
|
|
453
|
+
aria-label={t('@astryx.textInput.clearLabel', {label})}
|
|
452
454
|
{...stylex.props(styles.clearButton)}>
|
|
453
455
|
<Icon icon="close" size="sm" color="secondary" />
|
|
454
456
|
</button>
|
|
@@ -40,6 +40,7 @@ import {useImageMode} from '../hooks/useImageMode';
|
|
|
40
40
|
import type {BaseProps} from '../BaseProps';
|
|
41
41
|
import {mergeProps} from '../utils';
|
|
42
42
|
import {themeProps} from '../utils/themeProps';
|
|
43
|
+
import {useTranslator} from '../i18n';
|
|
43
44
|
|
|
44
45
|
/** Sample the region behind the remove button (20px button, 4px inset, in 64px container). */
|
|
45
46
|
const BUTTON_REGION = {x: 0.5, y: 0.06, width: 0.44, height: 0.44};
|
|
@@ -252,6 +253,7 @@ export function Thumbnail({
|
|
|
252
253
|
ref,
|
|
253
254
|
...props
|
|
254
255
|
}: ThumbnailProps) {
|
|
256
|
+
const t = useTranslator();
|
|
255
257
|
const imageMode = useImageMode(src, {region: BUTTON_REGION, fallback: null});
|
|
256
258
|
|
|
257
259
|
const hasSrc = src != null;
|
|
@@ -281,7 +283,7 @@ export function Thumbnail({
|
|
|
281
283
|
onRemove != null && !isDisabled ? (
|
|
282
284
|
<Button
|
|
283
285
|
icon={<Icon icon="close" size="xsm" />}
|
|
284
|
-
label={
|
|
286
|
+
label={t('@astryx.thumbnail.remove', {accessibleName})}
|
|
285
287
|
variant="secondary"
|
|
286
288
|
size="sm"
|
|
287
289
|
isIconOnly
|
|
@@ -315,7 +317,7 @@ export function Thumbnail({
|
|
|
315
317
|
<button
|
|
316
318
|
type="button"
|
|
317
319
|
onClick={onClick}
|
|
318
|
-
aria-label={
|
|
320
|
+
aria-label={t('@astryx.thumbnail.open', {accessibleName})}
|
|
319
321
|
{...stylex.props(styles.interactiveButton)}>
|
|
320
322
|
{imageContent}
|
|
321
323
|
</button>
|
|
@@ -225,7 +225,7 @@ export const docs = {
|
|
|
225
225
|
},
|
|
226
226
|
{
|
|
227
227
|
name: 'status',
|
|
228
|
-
type: '
|
|
228
|
+
type: "{type: 'warning' | 'error' | 'success', message?: string}",
|
|
229
229
|
description:
|
|
230
230
|
'Status indicator that colors the border and displays an icon. When a message is provided it is rendered below the input.',
|
|
231
231
|
},
|
|
@@ -368,7 +368,7 @@ export const docsZh = {
|
|
|
368
368
|
},
|
|
369
369
|
{
|
|
370
370
|
name: 'status',
|
|
371
|
-
type: '
|
|
371
|
+
type: "{type: 'warning' | 'error' | 'success', message?: string}",
|
|
372
372
|
description:
|
|
373
373
|
'为边框着色并显示图标的状态指示器。当提供消息时,消息渲染在输入框下方。',
|
|
374
374
|
},
|
|
@@ -69,6 +69,7 @@ import {useInputGroup} from '../InputGroup/InputGroupContext';
|
|
|
69
69
|
import {groupStyles} from '../InputGroup/groupStyles';
|
|
70
70
|
import {useTooltip} from '../Tooltip';
|
|
71
71
|
import {themeProps} from '../utils/themeProps';
|
|
72
|
+
import {useTranslator} from '../i18n';
|
|
72
73
|
|
|
73
74
|
const styles = stylex.create({
|
|
74
75
|
icon: {
|
|
@@ -341,7 +342,7 @@ export function TimeInput({
|
|
|
341
342
|
hasAutoFocus = false,
|
|
342
343
|
hourFormat = '12h',
|
|
343
344
|
increment = 1,
|
|
344
|
-
placeholder
|
|
345
|
+
placeholder: placeholderFromProps,
|
|
345
346
|
size: sizeProp,
|
|
346
347
|
status,
|
|
347
348
|
labelTooltip,
|
|
@@ -351,6 +352,9 @@ export function TimeInput({
|
|
|
351
352
|
style,
|
|
352
353
|
ref,
|
|
353
354
|
}: TimeInputProps) {
|
|
355
|
+
const t = useTranslator();
|
|
356
|
+
const placeholder =
|
|
357
|
+
placeholderFromProps ?? t('@astryx.timeInput.placeholder');
|
|
354
358
|
const size = useSize(sizeProp, 'md');
|
|
355
359
|
|
|
356
360
|
const id = useId();
|
|
@@ -659,7 +663,7 @@ export function TimeInput({
|
|
|
659
663
|
<button
|
|
660
664
|
type="button"
|
|
661
665
|
onClick={handleClear}
|
|
662
|
-
aria-label={
|
|
666
|
+
aria-label={t('@astryx.timeInput.clearLabel', {label})}
|
|
663
667
|
{...stylex.props(styles.clearButton)}>
|
|
664
668
|
<Icon icon="close" size="sm" color="secondary" />
|
|
665
669
|
</button>
|
|
@@ -61,24 +61,24 @@ export const docs = {
|
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
name: 'type',
|
|
64
|
-
type: '
|
|
64
|
+
type: "'body' | 'large' | 'label' | 'supporting' | 'code' | 'display-1' | 'display-2' | 'display-3' | 'inherit'",
|
|
65
65
|
description: 'Semantic text type from Text. Determines size, weight, and line-height.',
|
|
66
66
|
default: "'supporting'",
|
|
67
67
|
},
|
|
68
68
|
{
|
|
69
69
|
name: 'size',
|
|
70
|
-
type: '
|
|
70
|
+
type: "'4xs' | '3xs' | '2xs' | 'xsm' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl'",
|
|
71
71
|
description: 'Explicit font size override. Overrides the size from type.',
|
|
72
72
|
},
|
|
73
73
|
{
|
|
74
74
|
name: 'color',
|
|
75
|
-
type: '
|
|
75
|
+
type: "'primary' | 'secondary' | 'disabled' | 'placeholder' | 'accent' | 'inherit'",
|
|
76
76
|
description: 'Text color.',
|
|
77
77
|
default: "'secondary'",
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
80
|
name: 'weight',
|
|
81
|
-
type: '
|
|
81
|
+
type: "'normal' | 'medium' | 'semibold' | 'bold'",
|
|
82
82
|
description: 'Font weight override.',
|
|
83
83
|
},
|
|
84
84
|
],
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
|
|
4
|
-
import {render, screen, act} from '@testing-library/react';
|
|
4
|
+
import {render, screen, act, waitFor} from '@testing-library/react';
|
|
5
|
+
import userEvent from '@testing-library/user-event';
|
|
5
6
|
import {Timestamp} from './Timestamp';
|
|
6
7
|
|
|
7
8
|
describe('Timestamp', () => {
|
|
@@ -41,9 +42,7 @@ describe('Timestamp', () => {
|
|
|
41
42
|
);
|
|
42
43
|
expect(screen.getByText('59 minutes ago')).toBeInTheDocument();
|
|
43
44
|
|
|
44
|
-
rerender(
|
|
45
|
-
<Timestamp value={Date.now() / 1000 - 86399} format="relative" />,
|
|
46
|
-
);
|
|
45
|
+
rerender(<Timestamp value={Date.now() / 1000 - 86399} format="relative" />);
|
|
47
46
|
expect(screen.getByText('23 hours ago')).toBeInTheDocument();
|
|
48
47
|
|
|
49
48
|
rerender(
|
|
@@ -52,9 +51,7 @@ describe('Timestamp', () => {
|
|
|
52
51
|
expect(screen.getByText('29 days ago')).toBeInTheDocument();
|
|
53
52
|
|
|
54
53
|
// Same guarantee on the future side.
|
|
55
|
-
rerender(
|
|
56
|
-
<Timestamp value={Date.now() / 1000 + 3599} format="relative" />,
|
|
57
|
-
);
|
|
54
|
+
rerender(<Timestamp value={Date.now() / 1000 + 3599} format="relative" />);
|
|
58
55
|
expect(screen.getByText('in 59 minutes')).toBeInTheDocument();
|
|
59
56
|
});
|
|
60
57
|
|
|
@@ -342,4 +339,120 @@ describe('Timestamp', () => {
|
|
|
342
339
|
warn.mockRestore();
|
|
343
340
|
}
|
|
344
341
|
});
|
|
342
|
+
|
|
343
|
+
// --- Tooltip keyboard reachability (WCAG 1.4.13 / 2.1.1) ---
|
|
344
|
+
|
|
345
|
+
describe('tooltip keyboard reachability', () => {
|
|
346
|
+
const originalMatches = HTMLElement.prototype.matches;
|
|
347
|
+
const originalShowPopover = HTMLElement.prototype.showPopover;
|
|
348
|
+
const originalHidePopover = HTMLElement.prototype.hidePopover;
|
|
349
|
+
|
|
350
|
+
beforeEach(() => {
|
|
351
|
+
// The tooltip is lazy-loaded via a dynamic import; real timers let the
|
|
352
|
+
// import promise and RTL's waitFor resolve naturally (the outer
|
|
353
|
+
// beforeEach installs fake timers, which would stall them).
|
|
354
|
+
vi.useRealTimers();
|
|
355
|
+
|
|
356
|
+
// Mock the Popover API, which jsdom does not implement.
|
|
357
|
+
HTMLElement.prototype.showPopover = vi.fn();
|
|
358
|
+
HTMLElement.prototype.hidePopover = vi.fn();
|
|
359
|
+
|
|
360
|
+
// jsdom does not derive :focus-visible from keyboard focus for a <time>
|
|
361
|
+
// element; treat the focused element as focus-visible so the tooltip's
|
|
362
|
+
// keyboard-focus path can be exercised.
|
|
363
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
364
|
+
(HTMLElement.prototype as any).matches = function (
|
|
365
|
+
selector: string,
|
|
366
|
+
): boolean {
|
|
367
|
+
if (selector === ':focus-visible') {
|
|
368
|
+
return this === document.activeElement;
|
|
369
|
+
}
|
|
370
|
+
return originalMatches.call(this, selector);
|
|
371
|
+
};
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
afterEach(() => {
|
|
375
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
376
|
+
(HTMLElement.prototype as any).matches = originalMatches;
|
|
377
|
+
HTMLElement.prototype.showPopover = originalShowPopover;
|
|
378
|
+
HTMLElement.prototype.hidePopover = originalHidePopover;
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
it('makes the <time> element focusable while the tooltip is attached', () => {
|
|
382
|
+
render(
|
|
383
|
+
<Timestamp
|
|
384
|
+
value={Date.now() / 1000 - 3600}
|
|
385
|
+
format="relative"
|
|
386
|
+
data-testid="ts"
|
|
387
|
+
/>,
|
|
388
|
+
);
|
|
389
|
+
expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
it('shows the tooltip when the timestamp receives keyboard focus', async () => {
|
|
393
|
+
const user = userEvent.setup();
|
|
394
|
+
render(
|
|
395
|
+
<Timestamp
|
|
396
|
+
value={Date.now() / 1000 - 3600}
|
|
397
|
+
format="relative"
|
|
398
|
+
data-testid="ts"
|
|
399
|
+
/>,
|
|
400
|
+
);
|
|
401
|
+
const el = screen.getByTestId('ts');
|
|
402
|
+
|
|
403
|
+
// Wait for the lazy-loaded tooltip layer to mount and confirm it
|
|
404
|
+
// carries the full absolute time (same string as the aria-label).
|
|
405
|
+
// Compare with normalized whitespace: Intl output can contain narrow
|
|
406
|
+
// no-break spaces that jest-dom's matcher normalization would break on.
|
|
407
|
+
const layer = await screen.findByRole('tooltip', {hidden: true});
|
|
408
|
+
const normalize = (s: string) => s.replace(/\s+/g, ' ');
|
|
409
|
+
expect(normalize(layer.textContent ?? '')).toContain(
|
|
410
|
+
normalize(el.getAttribute('aria-label') ?? '\0'),
|
|
411
|
+
);
|
|
412
|
+
|
|
413
|
+
// Tab onto the timestamp — the only tab stop in the document.
|
|
414
|
+
await user.tab();
|
|
415
|
+
expect(el).toHaveFocus();
|
|
416
|
+
await waitFor(() => {
|
|
417
|
+
expect(HTMLElement.prototype.showPopover).toHaveBeenCalled();
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
it('does not add a tab stop when the tooltip is disabled', () => {
|
|
422
|
+
render(
|
|
423
|
+
<Timestamp
|
|
424
|
+
value={Date.now() / 1000 - 3600}
|
|
425
|
+
format="relative"
|
|
426
|
+
hasTooltip={false}
|
|
427
|
+
data-testid="ts"
|
|
428
|
+
/>,
|
|
429
|
+
);
|
|
430
|
+
expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
it('does not add a tab stop for absolute formats (no tooltip)', () => {
|
|
434
|
+
render(
|
|
435
|
+
<Timestamp
|
|
436
|
+
value="2026-02-19T17:00:00Z"
|
|
437
|
+
format="date_time"
|
|
438
|
+
data-testid="ts"
|
|
439
|
+
/>,
|
|
440
|
+
);
|
|
441
|
+
expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
it('keeps the full absolute aria-label while the tooltip is attached', () => {
|
|
445
|
+
render(
|
|
446
|
+
<Timestamp
|
|
447
|
+
value={Date.now() / 1000 - 3600}
|
|
448
|
+
format="relative"
|
|
449
|
+
data-testid="ts"
|
|
450
|
+
/>,
|
|
451
|
+
);
|
|
452
|
+
const label = screen.getByTestId('ts').getAttribute('aria-label');
|
|
453
|
+
expect(label).toBeTruthy();
|
|
454
|
+
// The label is the full absolute string, not the relative text.
|
|
455
|
+
expect(label).not.toContain('ago');
|
|
456
|
+
});
|
|
457
|
+
});
|
|
345
458
|
});
|
|
@@ -23,6 +23,7 @@ import type {TextType, TextSize, TextColor, TextWeight} from '../theme/types';
|
|
|
23
23
|
import {mergeProps, mergeRefs} from '../utils';
|
|
24
24
|
import type {BaseProps} from '../BaseProps';
|
|
25
25
|
import {themeProps} from '../utils/themeProps';
|
|
26
|
+
import {colorVars} from '../theme/tokens.stylex';
|
|
26
27
|
|
|
27
28
|
const LazyXDSTooltip = lazy(async () =>
|
|
28
29
|
import('../Tooltip/Tooltip').then(mod => ({default: mod.Tooltip})),
|
|
@@ -118,6 +119,18 @@ const styles = stylex.create({
|
|
|
118
119
|
color: 'inherit',
|
|
119
120
|
fontWeight: 'inherit',
|
|
120
121
|
},
|
|
122
|
+
// Visible focus ring for the tooltip tab stop, matching the repo-wide
|
|
123
|
+
// focus-visible outline treatment (see Token, Thumbnail).
|
|
124
|
+
focusable: {
|
|
125
|
+
outline: {
|
|
126
|
+
default: null,
|
|
127
|
+
':focus-visible': `2px solid ${colorVars['--color-accent']}`,
|
|
128
|
+
},
|
|
129
|
+
outlineOffset: {
|
|
130
|
+
default: '0',
|
|
131
|
+
':focus-visible': '2px',
|
|
132
|
+
},
|
|
133
|
+
},
|
|
121
134
|
});
|
|
122
135
|
|
|
123
136
|
// =============================================================================
|
|
@@ -431,8 +444,15 @@ export function Timestamp({
|
|
|
431
444
|
aria-label={
|
|
432
445
|
effectiveFormat === 'relative' ? fullAbsoluteText : undefined
|
|
433
446
|
}
|
|
447
|
+
// The absolute-time tooltip is anchored here with the default 'auto'
|
|
448
|
+
// focus trigger, which only activates on focusable anchors. A bare
|
|
449
|
+
// <time> is not focusable, so without a tab stop sighted keyboard
|
|
450
|
+
// users could never reveal the tooltip (WCAG 1.4.13 / 2.1.1). Only
|
|
451
|
+
// add the tab stop while a tooltip is actually attached — no
|
|
452
|
+
// gratuitous tab stops otherwise.
|
|
453
|
+
tabIndex={showTooltip ? 0 : undefined}
|
|
434
454
|
data-testid={testId}
|
|
435
|
-
{...stylex.props(styles.time)}>
|
|
455
|
+
{...stylex.props(styles.time, showTooltip && styles.focusable)}>
|
|
436
456
|
{displayText}
|
|
437
457
|
</time>
|
|
438
458
|
</Text>
|
package/src/Toast/Toast.tsx
CHANGED
|
@@ -22,6 +22,7 @@ import {useTheme} from '../theme';
|
|
|
22
22
|
import {MediaTheme} from '../theme/MediaTheme';
|
|
23
23
|
import type {ToastType, ToastDismissReason} from './types';
|
|
24
24
|
import {themeProps} from '../utils/themeProps';
|
|
25
|
+
import {useTranslator} from '../i18n';
|
|
25
26
|
|
|
26
27
|
const styles = stylex.create({
|
|
27
28
|
root: {
|
|
@@ -115,6 +116,7 @@ export function Toast({
|
|
|
115
116
|
isExiting = false,
|
|
116
117
|
onDismiss,
|
|
117
118
|
}: ToastProps) {
|
|
119
|
+
const t = useTranslator();
|
|
118
120
|
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
119
121
|
const isPausedRef = useRef(false);
|
|
120
122
|
const remainingRef = useRef(autoHideDuration);
|
|
@@ -226,7 +228,7 @@ export function Toast({
|
|
|
226
228
|
variant="ghost"
|
|
227
229
|
size="sm"
|
|
228
230
|
icon={<Icon icon="close" size="sm" color="inherit" />}
|
|
229
|
-
label=
|
|
231
|
+
label={t('@astryx.toast.dismiss')}
|
|
230
232
|
onClick={handleDismiss}
|
|
231
233
|
isIconOnly
|
|
232
234
|
/>
|
|
@@ -17,6 +17,7 @@ import {INTERACTIVE_SELECTORS} from '../hooks/useClickableContainer';
|
|
|
17
17
|
import {Toast} from './Toast';
|
|
18
18
|
import {ToastContext, type ToastContextValue} from './ToastContext';
|
|
19
19
|
import type {ToastEntry, ToastPosition, ToastDismissReason} from './types';
|
|
20
|
+
import {useTranslator} from '../i18n';
|
|
20
21
|
|
|
21
22
|
const styles = stylex.create({
|
|
22
23
|
viewport: {
|
|
@@ -107,6 +108,7 @@ export function ToastViewport({
|
|
|
107
108
|
isTopLayer = true,
|
|
108
109
|
children,
|
|
109
110
|
}: ToastViewportProps) {
|
|
111
|
+
const t = useTranslator();
|
|
110
112
|
const [toasts, setToasts] = useState<ToastEntry[]>([]);
|
|
111
113
|
const [exitingIds, setExitingIds] = useState<Set<string>>(new Set());
|
|
112
114
|
const toastsRef = useRef(toasts);
|
|
@@ -363,7 +365,7 @@ export function ToastViewport({
|
|
|
363
365
|
<div
|
|
364
366
|
ref={viewportRef}
|
|
365
367
|
role="region"
|
|
366
|
-
aria-label=
|
|
368
|
+
aria-label={t('@astryx.toast.viewport')}
|
|
367
369
|
tabIndex={-1}
|
|
368
370
|
// popover="manual" promotes to the top layer (above dialogs).
|
|
369
371
|
// Omitted inside dialogs where the viewport is already in a top layer.
|
package/src/Token/Token.tsx
CHANGED
|
@@ -34,6 +34,7 @@ import {useLinkComponent} from '../Link/useLinkComponent';
|
|
|
34
34
|
import {useInteractiveRole} from '../hooks/useInteractiveRole';
|
|
35
35
|
import type {BaseProps} from '../BaseProps';
|
|
36
36
|
import {themeProps} from '../utils/themeProps';
|
|
37
|
+
import {useTranslator} from '../i18n';
|
|
37
38
|
|
|
38
39
|
// =============================================================================
|
|
39
40
|
// Types
|
|
@@ -324,6 +325,7 @@ export function Token({
|
|
|
324
325
|
'data-testid': testId,
|
|
325
326
|
ref,
|
|
326
327
|
}: TokenProps) {
|
|
328
|
+
const t = useTranslator();
|
|
327
329
|
const LinkComponent = useLinkComponent();
|
|
328
330
|
const role = useInteractiveRole({href, onClick, isDisabled});
|
|
329
331
|
|
|
@@ -342,7 +344,7 @@ export function Token({
|
|
|
342
344
|
{onRemove != null && (
|
|
343
345
|
<button
|
|
344
346
|
type="button"
|
|
345
|
-
aria-label={
|
|
347
|
+
aria-label={t('@astryx.token.remove', {label})}
|
|
346
348
|
onClick={e => {
|
|
347
349
|
e.stopPropagation();
|
|
348
350
|
onRemove(e);
|
|
@@ -432,7 +434,7 @@ export function Token({
|
|
|
432
434
|
{onRemove != null && (
|
|
433
435
|
<button
|
|
434
436
|
type="button"
|
|
435
|
-
aria-label={
|
|
437
|
+
aria-label={t('@astryx.token.remove', {label})}
|
|
436
438
|
onClick={e => {
|
|
437
439
|
e.stopPropagation();
|
|
438
440
|
onRemove(e);
|
|
@@ -84,7 +84,7 @@ export const docs = {
|
|
|
84
84
|
},
|
|
85
85
|
{
|
|
86
86
|
name: 'status',
|
|
87
|
-
type: '
|
|
87
|
+
type: "{type: 'warning' | 'error' | 'success', message?: string}",
|
|
88
88
|
description:
|
|
89
89
|
'Validation status object with type and message for error/warning/success states.',
|
|
90
90
|
},
|
|
@@ -296,7 +296,7 @@ export const docsZh = {
|
|
|
296
296
|
},
|
|
297
297
|
{
|
|
298
298
|
name: 'status',
|
|
299
|
-
type: '
|
|
299
|
+
type: "{type: 'warning' | 'error' | 'success', message?: string}",
|
|
300
300
|
description:
|
|
301
301
|
'\u9a8c\u8bc1\u72b6\u6001\u5bf9\u8c61\uff0c\u5305\u542b\u7c7b\u578b\u548c\u6d88\u606f\uff0c\u7528\u4e8e\u9519\u8bef/\u8b66\u544a/\u6210\u529f\u72b6\u6001\u3002',
|
|
302
302
|
},
|
|
@@ -52,6 +52,7 @@ import {
|
|
|
52
52
|
import type {SearchableItem, SearchSource} from '../Typeahead/types';
|
|
53
53
|
import {mergeProps} from '../utils';
|
|
54
54
|
import {themeProps} from '../utils/themeProps';
|
|
55
|
+
import {useTranslator} from '../i18n';
|
|
55
56
|
|
|
56
57
|
// Re-export status types for convenience
|
|
57
58
|
export type {
|
|
@@ -81,9 +82,7 @@ export type TokenizerSize = 'sm' | 'md' | 'lg';
|
|
|
81
82
|
* - `'unfocusedLayer'`: Shows a single line with "+ N more" when unfocused, expands as an overlay on focus.
|
|
82
83
|
*/
|
|
83
84
|
export type TokenizerOverflowBehavior =
|
|
84
|
-
| '
|
|
85
|
-
| 'unfocusedInline'
|
|
86
|
-
| 'unfocusedLayer';
|
|
85
|
+
'none' | 'unfocusedInline' | 'unfocusedLayer';
|
|
87
86
|
|
|
88
87
|
/**
|
|
89
88
|
* Imperative handle for Tokenizer handleRef.
|
|
@@ -403,6 +402,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
403
402
|
ref,
|
|
404
403
|
handleRef,
|
|
405
404
|
}: TokenizerProps<T>) {
|
|
405
|
+
const t = useTranslator();
|
|
406
406
|
const size = useSize(sizeProp, 'md');
|
|
407
407
|
const inputId = useId();
|
|
408
408
|
const descriptionId = useId();
|
|
@@ -786,7 +786,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
786
786
|
{endContent}
|
|
787
787
|
{hasClear && value.length > 0 && !isDisabled && (
|
|
788
788
|
<InputClearButton
|
|
789
|
-
label=
|
|
789
|
+
label={t('@astryx.tokenizer.clearAll')}
|
|
790
790
|
onClick={e => {
|
|
791
791
|
e.stopPropagation();
|
|
792
792
|
handleClearAll();
|
package/src/Toolbar/Toolbar.tsx
CHANGED
|
@@ -239,6 +239,7 @@ export function Toolbar({
|
|
|
239
239
|
const hasCenterContent = centerContent != null;
|
|
240
240
|
const hasStartContent = startContent != null;
|
|
241
241
|
const hasEndContent = endContent != null;
|
|
242
|
+
const hasBottomDivider = dividers?.includes('bottom') ?? false;
|
|
242
243
|
|
|
243
244
|
const gapVar = spacingVars[spacingStepToVar[gap]] as string;
|
|
244
245
|
|
|
@@ -316,9 +317,15 @@ export function Toolbar({
|
|
|
316
317
|
orientation === 'vertical' && styles.vertical,
|
|
317
318
|
sizeStyles.base,
|
|
318
319
|
dynamicStyles.gap(gapVar),
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
320
|
+
// Only drop the tab indicator through the toolbar's block padding
|
|
321
|
+
// onto the rail when a bottom divider is actually present.
|
|
322
|
+
// Without a divider, leave `--_tab-indicator-bottom` unset so a
|
|
323
|
+
// nested TabList's indicator keeps its own default (hugging the
|
|
324
|
+
// tab) instead of floating down into the toolbar's padding.
|
|
325
|
+
hasBottomDivider &&
|
|
326
|
+
dynamicStyles.tabIndicatorBottom(
|
|
327
|
+
`calc(-1 * (${blockPaddingVarForSize[size]} + 1px))`,
|
|
328
|
+
),
|
|
322
329
|
),
|
|
323
330
|
)}
|
|
324
331
|
{...props}>
|
|
@@ -13,6 +13,7 @@ import {describe, it, expect, vi} from 'vitest';
|
|
|
13
13
|
import {render, screen} from '@testing-library/react';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
15
|
import {TopNav} from './TopNav';
|
|
16
|
+
import {TopNavRenderContext} from './TopNavRenderContext';
|
|
16
17
|
import {TopNavHeading} from './TopNavHeading';
|
|
17
18
|
import {NavIcon} from '../NavIcon';
|
|
18
19
|
import {TopNavItem} from './TopNavItem';
|
|
@@ -45,6 +46,35 @@ describe('TopNav', () => {
|
|
|
45
46
|
);
|
|
46
47
|
});
|
|
47
48
|
|
|
49
|
+
it('defaults the landmark label to "Top navigation" when label is omitted', () => {
|
|
50
|
+
render(<TopNav />);
|
|
51
|
+
expect(
|
|
52
|
+
screen.getByRole('navigation', {name: 'Top navigation'}),
|
|
53
|
+
).toBeInTheDocument();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('defaults the landmark label in mobile-bar mode', () => {
|
|
57
|
+
render(
|
|
58
|
+
<TopNavRenderContext value="mobile-bar">
|
|
59
|
+
<TopNav heading={<span>Logo</span>} />
|
|
60
|
+
</TopNavRenderContext>,
|
|
61
|
+
);
|
|
62
|
+
expect(
|
|
63
|
+
screen.getByRole('navigation', {name: 'Top navigation'}),
|
|
64
|
+
).toBeInTheDocument();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('custom label overrides the default in mobile-bar mode', () => {
|
|
68
|
+
render(
|
|
69
|
+
<TopNavRenderContext value="mobile-bar">
|
|
70
|
+
<TopNav label="Utility navigation" />
|
|
71
|
+
</TopNavRenderContext>,
|
|
72
|
+
);
|
|
73
|
+
expect(
|
|
74
|
+
screen.getByRole('navigation', {name: 'Utility navigation'}),
|
|
75
|
+
).toBeInTheDocument();
|
|
76
|
+
});
|
|
77
|
+
|
|
48
78
|
it('renders heading slot content', () => {
|
|
49
79
|
render(<TopNav heading={<span data-testid="title-content">Logo</span>} />);
|
|
50
80
|
expect(screen.getByTestId('title-content')).toBeInTheDocument();
|
package/src/TopNav/TopNav.tsx
CHANGED
|
@@ -21,6 +21,7 @@ import type {BaseProps} from '../BaseProps';
|
|
|
21
21
|
import * as stylex from '@stylexjs/stylex';
|
|
22
22
|
import {spacingVars} from '../theme/tokens.stylex';
|
|
23
23
|
import {mergeProps} from '../utils';
|
|
24
|
+
import {useTranslator} from '../i18n';
|
|
24
25
|
import {TopNavSlotContext} from './TopNavContext';
|
|
25
26
|
import {useTopNavRenderMode} from './TopNavRenderContext';
|
|
26
27
|
import {useTopNavMobileContent} from './TopNavMobileContentContext';
|
|
@@ -147,6 +148,7 @@ export interface TopNavProps extends BaseProps<HTMLElement> {
|
|
|
147
148
|
/**
|
|
148
149
|
* Accessible label for the navigation landmark.
|
|
149
150
|
* Helps screen readers identify the navigation area.
|
|
151
|
+
* @default 'Top navigation'
|
|
150
152
|
*/
|
|
151
153
|
label?: string;
|
|
152
154
|
}
|
|
@@ -176,13 +178,15 @@ export function TopNav({
|
|
|
176
178
|
children,
|
|
177
179
|
centerContent,
|
|
178
180
|
endContent,
|
|
179
|
-
label,
|
|
181
|
+
label: labelFromProps,
|
|
180
182
|
xstyle,
|
|
181
183
|
className,
|
|
182
184
|
style,
|
|
183
185
|
ref,
|
|
184
186
|
...props
|
|
185
187
|
}: TopNavProps) {
|
|
188
|
+
const t = useTranslator();
|
|
189
|
+
const label = labelFromProps ?? t('@astryx.topNav.landmarkLabel');
|
|
186
190
|
const renderMode = useTopNavRenderMode();
|
|
187
191
|
const mobileContent = useTopNavMobileContent();
|
|
188
192
|
const {hasAutoToggle} = useAppShellMobile();
|
|
@@ -294,9 +298,7 @@ export function TopNav({
|
|
|
294
298
|
) : (
|
|
295
299
|
endContent && (
|
|
296
300
|
<div {...stylex.props(styles.endContent)}>
|
|
297
|
-
<TopNavSlotContext value="end">
|
|
298
|
-
{endContent}
|
|
299
|
-
</TopNavSlotContext>
|
|
301
|
+
<TopNavSlotContext value="end">{endContent}</TopNavSlotContext>
|
|
300
302
|
</div>
|
|
301
303
|
)
|
|
302
304
|
)}
|