@astryxdesign/core 0.1.8 → 0.1.9-canary.75d2d03
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 +100 -0
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +6 -2
- package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
- package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts +18 -2
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +63 -7
- package/dist/Avatar/AvatarStatusDot.d.ts +33 -5
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +144 -19
- package/dist/Banner/Banner.d.ts +9 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +31 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +208 -6
- package/dist/Breadcrumbs/index.d.ts +5 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +9 -1
- package/dist/Button/Button.d.ts +8 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +31 -2
- package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +30 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +30 -2
- package/dist/Calendar/dayCellUtils.js +1 -1
- package/dist/Card/Card.d.ts +8 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +28 -2
- package/dist/Carousel/Carousel.d.ts +4 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +24 -4
- package/dist/Chat/ChatComposer.d.ts +8 -0
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +46 -7
- package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +11 -1
- package/dist/Chat/ChatComposerInput.d.ts +20 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +35 -3
- package/dist/Chat/ChatContext.d.ts +33 -0
- package/dist/Chat/ChatContext.d.ts.map +1 -1
- package/dist/Chat/ChatContext.js +16 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +1 -1
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +4 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +7 -1
- package/dist/Chat/ChatToolCalls.d.ts +5 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +18 -9
- package/dist/Chat/index.d.ts +2 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts +2 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +22 -8
- package/dist/Chat/useSpeechRecognition.d.ts +0 -1
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +11 -1
- package/dist/ClickableCard/ClickableCard.d.ts +9 -2
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +8 -1
- package/dist/CommandPalette/CommandPalette.d.ts +1 -1
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +3 -1
- package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +6 -1
- package/dist/DateInput/DateInput.d.ts +47 -1
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +26 -2
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +10 -1
- package/dist/Dialog/Dialog.d.ts +3 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +57 -6
- package/dist/Dialog/DialogContext.d.ts +7 -0
- package/dist/Dialog/DialogContext.d.ts.map +1 -1
- package/dist/Dialog/DialogContext.js +2 -2
- package/dist/Dialog/DialogHeader.d.ts +5 -2
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +6 -1
- package/dist/Divider/Divider.js +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +2 -3
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +42 -15
- package/dist/FieldStatus/FieldStatus.d.ts +8 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +22 -4
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +10 -2
- package/dist/HoverCard/HoverCard.d.ts +9 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +2 -0
- package/dist/HoverCard/useHoverCard.d.ts +8 -0
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +7 -2
- package/dist/Icon/Icon.d.ts +7 -2
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Item/Item.d.ts +6 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +22 -1
- package/dist/Layer/useLayer.d.ts +6 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +2 -0
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +6 -1
- package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
- package/dist/MobileNav/MobileNavToggle.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +39 -12
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +16 -0
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/Outline/Outline.d.ts +0 -1
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +0 -1
- package/dist/OverflowList/OverflowList.d.ts +20 -3
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +29 -4
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +3 -9
- package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.d.ts +9 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +16 -13
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +4 -2
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +16 -0
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +21 -8
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +19 -2
- package/dist/Stack/stack.stylex.d.ts +9 -9
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +3 -2
- 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/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
- package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/index.js +3 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +4 -1
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +87 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -3
- package/dist/Thumbnail/Thumbnail.d.ts +26 -5
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +97 -54
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +15 -4
- package/dist/Timestamp/Timestamp.d.ts +3 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +8 -6
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +2 -5
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +16 -4
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +18 -8
- package/dist/TopNav/TopNavMegaMenu.js +10 -4
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
- package/dist/TopNav/TopNavMenu.d.ts +2 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +68 -6
- package/dist/TreeList/TreeList.d.ts +12 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +2 -0
- package/dist/TreeList/TreeListBranches.d.ts +5 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +10 -4
- package/dist/TreeList/TreeListItem.d.ts +8 -2
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +27 -7
- package/dist/TreeList/TreeListTypes.d.ts +25 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +2 -2
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/astryx.css +28 -18
- package/dist/astryx.umd.js +51 -51
- package/dist/astryx.umd.js.map +4 -4
- package/dist/authoring/doc.d.ts.map +1 -1
- package/dist/docs-types.d.ts +8 -0
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/computeOverflow.d.ts +47 -0
- package/dist/hooks/computeOverflow.d.ts.map +1 -0
- package/dist/hooks/computeOverflow.js +213 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -1
- package/dist/hooks/useDevWarning.d.ts +18 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -0
- package/dist/hooks/useDevWarning.js +49 -0
- package/dist/hooks/useOverflow.d.ts +19 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +36 -25
- package/dist/i18n/InternationalizationContext.d.ts +1 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -0
- package/dist/i18n/InternationalizationProvider.d.ts +8 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +5 -1
- package/dist/i18n/getLocaleDirection.d.ts +18 -0
- package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
- package/dist/i18n/getLocaleDirection.js +29 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +7 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- package/dist/i18n/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +51 -0
- package/dist/theme/hct.d.ts +0 -1
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
- package/dist/utils/devWarning.d.ts +42 -0
- package/dist/utils/devWarning.d.ts.map +1 -0
- package/dist/utils/devWarning.js +88 -0
- package/dist/utils/index.d.ts +3 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -2
- package/dist/utils/plainDate.d.ts +30 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +53 -0
- package/dist/utils/types.d.ts +13 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/locales/en.json +24 -0
- package/locales/fr-FR.json +14 -0
- package/locales/pseudo.json +18 -0
- package/package.json +1 -1
- package/src/AppShell/AppShell.tsx +6 -0
- package/src/AppShell/AppShellMobileContext.tsx +8 -0
- package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
- package/src/Avatar/Avatar.doc.mjs +15 -3
- package/src/Avatar/Avatar.test.tsx +156 -1
- package/src/Avatar/Avatar.tsx +96 -4
- package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
- package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
- package/src/Avatar/AvatarStatusDot.tsx +178 -21
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +30 -0
- package/src/Banner/Banner.tsx +47 -3
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
- package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +284 -2
- package/src/Breadcrumbs/index.ts +27 -0
- package/src/Button/Button.doc.mjs +9 -0
- package/src/Button/Button.test.tsx +49 -0
- package/src/Button/Button.tsx +25 -1
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
- package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
- package/src/ButtonGroup/ButtonGroup.tsx +32 -0
- package/src/Calendar/Calendar.doc.mjs +12 -1
- package/src/Calendar/Calendar.test.tsx +193 -0
- package/src/Calendar/Calendar.tsx +38 -16
- package/src/Calendar/dayCellUtils.test.ts +5 -0
- package/src/Calendar/dayCellUtils.ts +1 -1
- package/src/Card/Card.doc.mjs +9 -0
- package/src/Card/Card.test.tsx +21 -3
- package/src/Card/Card.tsx +35 -2
- package/src/Carousel/Carousel.doc.mjs +1 -0
- package/src/Carousel/Carousel.test.tsx +53 -0
- package/src/Carousel/Carousel.tsx +34 -4
- package/src/Chat/ChatComposer.doc.mjs +12 -3
- package/src/Chat/ChatComposer.test.tsx +115 -0
- package/src/Chat/ChatComposer.tsx +73 -9
- package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
- package/src/Chat/ChatComposerDrawer.tsx +11 -1
- package/src/Chat/ChatComposerInput.doc.mjs +7 -0
- package/src/Chat/ChatComposerInput.test.tsx +103 -0
- package/src/Chat/ChatComposerInput.tsx +49 -3
- package/src/Chat/ChatContext.tsx +37 -10
- package/src/Chat/ChatDictationButton.tsx +4 -1
- package/src/Chat/ChatLayout.tsx +3 -1
- package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
- package/src/Chat/ChatMessageMetadata.tsx +1 -2
- package/src/Chat/ChatSendButton.tsx +11 -1
- package/src/Chat/ChatToolCalls.test.tsx +64 -0
- package/src/Chat/ChatToolCalls.tsx +25 -4
- package/src/Chat/index.ts +5 -1
- package/src/Chat/useChatStreamScroll.test.tsx +49 -0
- package/src/Chat/useChatStreamScroll.ts +27 -10
- package/src/Chat/useSpeechRecognition.ts +1 -1
- package/src/Chat/useTriggerMenu.tsx +3 -1
- package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
- package/src/CheckboxInput/CheckboxInput.tsx +1 -1
- package/src/CheckboxList/CheckboxList.test.tsx +81 -3
- package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
- package/src/CheckboxList/CheckboxListItem.tsx +41 -5
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
- package/src/ClickableCard/ClickableCard.test.tsx +34 -0
- package/src/ClickableCard/ClickableCard.tsx +13 -3
- package/src/CodeBlock/CodeBlock.test.tsx +56 -0
- package/src/CodeBlock/CodeBlock.tsx +9 -1
- package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
- package/src/CommandPalette/CommandPalette.tsx +3 -1
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
- package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
- package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
- package/src/ContextMenu/ContextMenu.test.tsx +193 -0
- package/src/DateInput/DateInput.doc.mjs +16 -0
- package/src/DateInput/DateInput.test.tsx +108 -0
- package/src/DateInput/DateInput.tsx +68 -3
- package/src/DateInput/index.ts +1 -0
- package/src/DateTimeInput/DateTimeInput.test.tsx +35 -0
- package/src/DateTimeInput/DateTimeInput.tsx +14 -2
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.test.tsx +77 -4
- package/src/Dialog/Dialog.tsx +89 -5
- package/src/Dialog/DialogContext.ts +9 -2
- package/src/Dialog/DialogHeader.doc.mjs +2 -2
- package/src/Dialog/DialogHeader.tsx +9 -2
- package/src/Divider/Divider.tsx +2 -2
- package/src/DropdownMenu/DropdownMenu.test.tsx +169 -0
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +1 -2
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
- package/src/Field/Field.test.tsx +57 -12
- package/src/Field/Field.tsx +6 -5
- package/src/Field/FieldLabel.tsx +8 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
- package/src/FieldStatus/FieldStatus.test.tsx +78 -40
- package/src/FieldStatus/FieldStatus.tsx +22 -4
- package/src/FileInput/FileInput.test.tsx +52 -3
- package/src/FileInput/FileInput.tsx +13 -2
- package/src/HoverCard/HoverCard.doc.mjs +13 -0
- package/src/HoverCard/HoverCard.test.tsx +21 -2
- package/src/HoverCard/HoverCard.tsx +11 -0
- package/src/HoverCard/useHoverCard.doc.mjs +2 -0
- package/src/HoverCard/useHoverCard.tsx +24 -2
- package/src/Icon/Icon.doc.mjs +3 -2
- package/src/Icon/Icon.tsx +7 -2
- package/src/IconButton/IconButton.doc.mjs +8 -0
- package/src/IconButton/IconButton.test.tsx +15 -18
- package/src/Item/Item.test.tsx +40 -18
- package/src/Item/Item.tsx +38 -2
- package/src/Layer/useLayer.tsx +8 -0
- package/src/List/List.test.tsx +9 -8
- package/src/MobileNav/MobileNav.tsx +12 -1
- package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
- package/src/MobileNav/MobileNavToggle.tsx +9 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +4 -2
- package/src/MultiSelector/MultiSelector.test.tsx +172 -3
- package/src/MultiSelector/MultiSelector.tsx +55 -12
- package/src/MultiSelector/hooks.ts +17 -0
- package/src/NumberInput/NumberInput.test.tsx +11 -7
- package/src/NumberInput/NumberInput.tsx +1 -2
- package/src/Outline/Outline.tsx +0 -1
- package/src/OverflowList/OverflowList.doc.mjs +39 -6
- package/src/OverflowList/OverflowList.test.tsx +111 -0
- package/src/OverflowList/OverflowList.tsx +48 -8
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/Popover/Popover.tsx +7 -4
- package/src/Popover/usePopover.tsx +9 -13
- package/src/PowerSearch/PowerSearch.doc.mjs +14 -0
- package/src/PowerSearch/PowerSearch.test.tsx +20 -0
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
- package/src/PowerSearch/usePowerSearchSource.ts +1 -2
- package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
- package/src/SelectableCard/SelectableCard.test.tsx +46 -4
- package/src/SelectableCard/SelectableCard.tsx +29 -16
- package/src/Selector/Selector.test.tsx +69 -0
- package/src/Selector/Selector.tsx +5 -1
- package/src/Selector/hooks.ts +17 -0
- package/src/SideNav/SideNav.test.tsx +119 -3
- package/src/SideNav/SideNavCollapseButton.tsx +6 -1
- package/src/SideNav/SideNavHeading.tsx +24 -8
- package/src/SideNav/SideNavItem.tsx +5 -1
- package/src/Slider/Slider.test.tsx +75 -2
- package/src/Slider/Slider.tsx +21 -5
- package/src/Switch/Switch.test.tsx +32 -1
- package/src/Table/BaseTable.tsx +3 -5
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +6 -2
- package/src/Table/plugins/rowStatus/index.ts +7 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
- package/src/Table/plugins/selection/useTableSelection.test.tsx +16 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +19 -1
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
- package/src/Table/plugins/tree/useTableTreeData.tsx +128 -1
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
- package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
- package/src/Table/useBaseTablePlugins.ts +10 -6
- package/src/Table/useTableRowStatus.doc.mjs +30 -0
- package/src/Table/useTableSelection.doc.mjs +65 -14
- package/src/Table/useTableTreeData.doc.mjs +29 -0
- package/src/Table/useTableTreeState.doc.mjs +2 -2
- package/src/TextArea/TextArea.test.tsx +9 -1
- package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
- package/src/Thumbnail/Thumbnail.test.tsx +98 -7
- package/src/Thumbnail/Thumbnail.tsx +141 -41
- package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
- package/src/TimeInput/TimeInput.test.tsx +76 -1
- package/src/TimeInput/TimeInput.tsx +19 -6
- package/src/Timestamp/Timestamp.doc.mjs +4 -4
- package/src/Timestamp/Timestamp.test.tsx +32 -0
- package/src/Timestamp/Timestamp.tsx +28 -8
- package/src/Toast/useToast.tsx +7 -8
- package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +15 -1
- package/src/Tokenizer/Tokenizer.test.tsx +183 -2
- package/src/Tokenizer/Tokenizer.tsx +16 -4
- package/src/TopNav/TopNav.test.tsx +125 -1
- package/src/TopNav/TopNavHeading.tsx +24 -8
- package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
- package/src/TopNav/TopNavMegaMenu.tsx +10 -4
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
- package/src/TopNav/TopNavMenu.test.tsx +118 -4
- package/src/TopNav/TopNavMenu.tsx +83 -5
- package/src/TreeList/TreeList.doc.mjs +22 -0
- package/src/TreeList/TreeList.test.tsx +232 -0
- package/src/TreeList/TreeList.tsx +18 -2
- package/src/TreeList/TreeListBranches.tsx +16 -2
- package/src/TreeList/TreeListItem.tsx +51 -11
- package/src/TreeList/TreeListTypes.ts +27 -1
- package/src/TreeList/index.ts +2 -2
- package/src/authoring/doc.ts +1 -3
- package/src/docs-types.ts +5 -0
- package/src/hooks/computeOverflow.test.ts +422 -0
- package/src/hooks/computeOverflow.ts +290 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useDevWarning.test.tsx +45 -0
- package/src/hooks/useDevWarning.ts +54 -0
- package/src/hooks/useOverflow.test.ts +96 -4
- package/src/hooks/useOverflow.ts +74 -33
- package/src/i18n/InternationalizationContext.ts +4 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
- package/src/i18n/InternationalizationProvider.tsx +12 -2
- package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
- package/src/i18n/__tests__/useDirection.test.tsx +66 -0
- package/src/i18n/getLocaleDirection.ts +29 -0
- package/src/i18n/index.ts +6 -0
- package/src/i18n/resolve.ts +9 -21
- package/src/i18n/useDirection.ts +29 -0
- package/src/theme/Theme.tsx +11 -14
- package/src/theme/generateThemeRules.test.ts +65 -0
- package/src/theme/generateThemeRules.ts +56 -0
- package/src/theme/hct.ts +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
- package/src/utils/devWarning.test.ts +56 -0
- package/src/utils/devWarning.ts +102 -0
- package/src/utils/index.ts +6 -0
- package/src/utils/plainDate.test.ts +22 -0
- package/src/utils/plainDate.ts +61 -0
- package/src/utils/types.ts +14 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file getLocaleDirection.ts
|
|
5
|
+
* @input BCP 47 locale tag
|
|
6
|
+
* @output 'ltr' | 'rtl'
|
|
7
|
+
* @position Server-safe helper for computing text direction from a locale.
|
|
8
|
+
* Callable in React Server Components / Next.js layouts to set <html dir>.
|
|
9
|
+
*
|
|
10
|
+
* Uses Intl.Locale.getTextInfo() (CLDR-backed) with a try/catch fallback to
|
|
11
|
+
* 'ltr'. React 19 baseline covers all target browsers + Node ≥20; the older
|
|
12
|
+
* accessor form (`.textInfo`) is handled as a fallback for defensive parity.
|
|
13
|
+
*
|
|
14
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
15
|
+
* - /packages/core/src/i18n/InternationalizationProvider.tsx (uses this to derive default)
|
|
16
|
+
* - /packages/core/src/i18n/useDirection.ts (client-side hook counterpart)
|
|
17
|
+
* - /packages/core/src/i18n/index.ts (public export)
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
export function getLocaleDirection(locale: string): 'ltr' | 'rtl' {
|
|
21
|
+
try {
|
|
22
|
+
const loc = new Intl.Locale(locale);
|
|
23
|
+
// @ts-expect-error — older engines expose accessor form `.textInfo`
|
|
24
|
+
const info = typeof loc.getTextInfo === 'function' ? loc.getTextInfo() : loc.textInfo;
|
|
25
|
+
return info?.direction === 'rtl' ? 'rtl' : 'ltr';
|
|
26
|
+
} catch {
|
|
27
|
+
return 'ltr';
|
|
28
|
+
}
|
|
29
|
+
}
|
package/src/i18n/index.ts
CHANGED
|
@@ -10,10 +10,14 @@
|
|
|
10
10
|
* The public API is deliberately small:
|
|
11
11
|
* - InternationalizationProvider — provider component
|
|
12
12
|
* - useTranslator — hook returning a translator function
|
|
13
|
+
* - useDirection — hook returning the ambient text direction
|
|
14
|
+
* - getLocaleDirection — server-safe locale → direction helper
|
|
13
15
|
* - Translator — interface for consumer-injected runtimes
|
|
14
16
|
*
|
|
15
17
|
* SYNC: When modified, update these files to stay in sync:
|
|
16
18
|
* - /packages/core/src/index.ts
|
|
19
|
+
* - /packages/core/src/i18n/useDirection.ts
|
|
20
|
+
* - /packages/core/src/i18n/getLocaleDirection.ts
|
|
17
21
|
*/
|
|
18
22
|
|
|
19
23
|
export {InternationalizationProvider} from './InternationalizationProvider';
|
|
@@ -22,6 +26,8 @@ export {InternationalizationContext} from './InternationalizationContext';
|
|
|
22
26
|
export type {InternationalizationContextValue} from './InternationalizationContext';
|
|
23
27
|
export {useTranslator} from './useTranslator';
|
|
24
28
|
export type {TranslatorFn} from './useTranslator';
|
|
29
|
+
export {useDirection} from './useDirection';
|
|
30
|
+
export {getLocaleDirection} from './getLocaleDirection';
|
|
25
31
|
export type {Translator} from './translator';
|
|
26
32
|
export type {
|
|
27
33
|
Locale,
|
package/src/i18n/resolve.ts
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
import IntlMessageFormat from 'intl-messageformat';
|
|
23
23
|
import type {Catalog, Locale, MessagesByLocale, Overrides} from './types';
|
|
24
24
|
import enSource from '../../locales/en.json' with {type: 'json'};
|
|
25
|
+
import {warnOnce, __resetDevWarnings} from '../utils/devWarning';
|
|
25
26
|
|
|
26
27
|
const EN_CATALOG = enSource as Catalog;
|
|
27
28
|
|
|
@@ -72,23 +73,6 @@ export function resolveLocaleChain(locale: Locale): Locale[] {
|
|
|
72
73
|
return chain;
|
|
73
74
|
}
|
|
74
75
|
|
|
75
|
-
/**
|
|
76
|
-
* Missing-key warn-once tracking. Fires ONLY when a key is missing from
|
|
77
|
-
* every source including the shipped `en` catalog — that's a real bug
|
|
78
|
-
* (typo, stale catalog, deleted key). Fallback to `en` from a non-en
|
|
79
|
-
* locale is expected and silent, matching the FormatJS / i18next default
|
|
80
|
-
* of not spamming the console when a translation simply hasn't been
|
|
81
|
-
* written yet.
|
|
82
|
-
*/
|
|
83
|
-
const warnedMissing = new Set<string>();
|
|
84
|
-
|
|
85
|
-
function warnOnce(bucket: Set<string>, key: string, message: string): void {
|
|
86
|
-
if (!bucket.has(key)) {
|
|
87
|
-
bucket.add(key);
|
|
88
|
-
console.warn(message);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
76
|
function lookup(
|
|
93
77
|
key: string,
|
|
94
78
|
locale: Locale,
|
|
@@ -135,10 +119,14 @@ export function resolve(
|
|
|
135
119
|
const result = lookup(key, locale, messages, overrides);
|
|
136
120
|
|
|
137
121
|
if (result === null) {
|
|
122
|
+
// Fires ONLY when a key is missing from every source including the
|
|
123
|
+
// shipped `en` catalog — a real bug (typo, stale catalog, deleted key).
|
|
124
|
+
// Fallback to `en` from a non-en locale is expected and stays silent,
|
|
125
|
+
// matching the FormatJS / i18next default.
|
|
138
126
|
warnOnce(
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
`
|
|
127
|
+
`astryx-i18n:${locale}::${key}`,
|
|
128
|
+
'astryx-i18n',
|
|
129
|
+
`missing key: ${key} (locale: ${locale})`,
|
|
142
130
|
);
|
|
143
131
|
return key;
|
|
144
132
|
}
|
|
@@ -161,5 +149,5 @@ export function resolve(
|
|
|
161
149
|
*/
|
|
162
150
|
export function __resetForTests(): void {
|
|
163
151
|
formatterCache.clear();
|
|
164
|
-
|
|
152
|
+
__resetDevWarnings();
|
|
165
153
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file useDirection.ts
|
|
7
|
+
* @input InternationalizationContext (via use())
|
|
8
|
+
* @output 'ltr' | 'rtl'
|
|
9
|
+
* @position Client hook for reading the ambient text direction. Returns 'ltr'
|
|
10
|
+
* when called outside a provider (matches the silent-en-fallback pattern of
|
|
11
|
+
* useTranslator).
|
|
12
|
+
*
|
|
13
|
+
* Use this in components that need to swap directional icons, mirror
|
|
14
|
+
* behavioral logic (slider math, keyboard nav), or apply direction-specific
|
|
15
|
+
* styling that CSS logical properties can't express.
|
|
16
|
+
*
|
|
17
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
18
|
+
* - /packages/core/src/i18n/InternationalizationContext.ts
|
|
19
|
+
* - /packages/core/src/i18n/getLocaleDirection.ts (server-safe counterpart)
|
|
20
|
+
* - /packages/core/src/i18n/index.ts
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import {use} from 'react';
|
|
24
|
+
import {InternationalizationContext} from './InternationalizationContext';
|
|
25
|
+
|
|
26
|
+
export function useDirection(): 'ltr' | 'rtl' {
|
|
27
|
+
const ctx = use(InternationalizationContext);
|
|
28
|
+
return ctx.direction;
|
|
29
|
+
}
|
package/src/theme/Theme.tsx
CHANGED
|
@@ -45,6 +45,7 @@ import {registerIcons} from '../Icon/globalIconRegistry';
|
|
|
45
45
|
import {generateThemeCSS, type DefinedTheme} from './defineTheme';
|
|
46
46
|
import {dataAttr} from '../naming';
|
|
47
47
|
import {ThemeContext} from './useTheme';
|
|
48
|
+
import {warnOnce} from '../utils/devWarning';
|
|
48
49
|
|
|
49
50
|
/**
|
|
50
51
|
* Theme provider props
|
|
@@ -97,9 +98,6 @@ ThemeNestingContext.displayName = 'ThemeNestingContext';
|
|
|
97
98
|
/** Track which themes have already been injected */
|
|
98
99
|
const injectedThemes = new Set<string>();
|
|
99
100
|
|
|
100
|
-
/** Track which themes have already logged the perf warning */
|
|
101
|
-
const warnedThemes = new Set<string>();
|
|
102
|
-
|
|
103
101
|
/**
|
|
104
102
|
* Hook to inject theme CSS into the document.
|
|
105
103
|
* Built themes (from `astryx theme build`) skip injection — their CSS
|
|
@@ -120,17 +118,16 @@ function useThemeStyleInjection(theme: DefinedTheme): void {
|
|
|
120
118
|
}
|
|
121
119
|
|
|
122
120
|
// One-time perf hint per theme
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
121
|
+
warnOnce(
|
|
122
|
+
`theme-injection:${theme.name}`,
|
|
123
|
+
'Theme',
|
|
124
|
+
`"${theme.name}" is using runtime style injection. ` +
|
|
125
|
+
`For better performance, use the pre-built theme:\n\n` +
|
|
126
|
+
` import {${theme.name}Theme} from '@astryxdesign/theme-${theme.name}/built';\n` +
|
|
127
|
+
` import '@astryxdesign/theme-${theme.name}/theme.css';\n\n` +
|
|
128
|
+
`For custom themes, run \`npx @astryxdesign/cli theme build <file>\` to generate ` +
|
|
129
|
+
`the built artifacts.`,
|
|
130
|
+
);
|
|
134
131
|
|
|
135
132
|
const {prose, component} = generateThemeCSS(theme);
|
|
136
133
|
if (!prose && !component) {
|
|
@@ -190,6 +190,61 @@ describe('generateThemeRules', () => {
|
|
|
190
190
|
expect(rules.some(r => r.includes('.astryx-text.accent'))).toBe(true);
|
|
191
191
|
});
|
|
192
192
|
|
|
193
|
+
// --- Size-prop overrides (so `size` beats a themed `type`) ---
|
|
194
|
+
|
|
195
|
+
it('emits Text size-prop font-size overrides in the same layer as type rules', () => {
|
|
196
|
+
// Digit-leading sizes are prefixed (size-2xs); word sizes stay bare.
|
|
197
|
+
const sizeRule = rules.find(
|
|
198
|
+
r => r.includes('.astryx-text.size-2xs') && r.includes('font-size'),
|
|
199
|
+
);
|
|
200
|
+
expect(sizeRule).toBeDefined();
|
|
201
|
+
expect(sizeRule).toContain('var(--font-size-2xs)');
|
|
202
|
+
|
|
203
|
+
// `xsm` maps to the --font-size-xs token (matches sizeStyles).
|
|
204
|
+
const xsmRule = rules.find(r => r.includes('.astryx-text.xsm'));
|
|
205
|
+
expect(xsmRule).toBeDefined();
|
|
206
|
+
expect(xsmRule).toContain('var(--font-size-xs)');
|
|
207
|
+
|
|
208
|
+
// Overrides set only font-size — line-height/family come from `type`.
|
|
209
|
+
expect(xsmRule).not.toContain('line-height');
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('emits a size override for every TextSize value', () => {
|
|
213
|
+
const sizes = [
|
|
214
|
+
'size-4xs',
|
|
215
|
+
'size-3xs',
|
|
216
|
+
'size-2xs',
|
|
217
|
+
'xsm',
|
|
218
|
+
'sm',
|
|
219
|
+
'base',
|
|
220
|
+
'lg',
|
|
221
|
+
'xl',
|
|
222
|
+
'size-2xl',
|
|
223
|
+
'size-3xl',
|
|
224
|
+
'size-4xl',
|
|
225
|
+
];
|
|
226
|
+
for (const cls of sizes) {
|
|
227
|
+
expect(
|
|
228
|
+
rules.some(
|
|
229
|
+
r => r.includes(`.astryx-text.${cls}`) && r.includes('font-size'),
|
|
230
|
+
),
|
|
231
|
+
).toBe(true);
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it('orders size overrides after the themed type font-size rules', () => {
|
|
236
|
+
// Source order breaks specificity ties within a layer, so the size
|
|
237
|
+
// override must come after the `.astryx-text.<type>` type rule.
|
|
238
|
+
const typeIdx = rules.findIndex(
|
|
239
|
+
r => r.includes('.astryx-text.supporting') && r.includes('font-size'),
|
|
240
|
+
);
|
|
241
|
+
const sizeIdx = rules.findIndex(
|
|
242
|
+
r => r.includes('.astryx-text.size-2xs') && r.includes('font-size'),
|
|
243
|
+
);
|
|
244
|
+
expect(typeIdx).toBeGreaterThanOrEqual(0);
|
|
245
|
+
expect(sizeIdx).toBeGreaterThan(typeIdx);
|
|
246
|
+
});
|
|
247
|
+
|
|
193
248
|
// --- Consistency ---
|
|
194
249
|
|
|
195
250
|
it('generateThemeCSS returns prose and component blocks with @scope', () => {
|
|
@@ -202,6 +257,16 @@ describe('generateThemeRules', () => {
|
|
|
202
257
|
expect(combined).toContain(rule);
|
|
203
258
|
}
|
|
204
259
|
});
|
|
260
|
+
|
|
261
|
+
it('routes Text size overrides into the component (astryx-theme) block', () => {
|
|
262
|
+
// The size override only beats a themed type if it lands in the same
|
|
263
|
+
// layer as the type rules (astryx-theme / component block), not the
|
|
264
|
+
// reset-tier prose block.
|
|
265
|
+
const {prose, component} = generateThemeCSS(theme);
|
|
266
|
+
expect(component).toContain('.astryx-text.size-2xs');
|
|
267
|
+
expect(component).toContain('.astryx-text.xsm');
|
|
268
|
+
expect(prose).not.toContain('.astryx-text.size-2xs');
|
|
269
|
+
});
|
|
205
270
|
});
|
|
206
271
|
|
|
207
272
|
describe('generateThemeRules with weight overrides', () => {
|
|
@@ -301,6 +301,10 @@ export function generateThemeRules(theme: DefinedTheme): string[] {
|
|
|
301
301
|
// 4. Prop-level color overrides (for text/heading/link specificity)
|
|
302
302
|
generateColorOverrides(theme.components || {}, parts);
|
|
303
303
|
|
|
304
|
+
// 5. Text `size`-prop font-size overrides (so an explicit size beats a
|
|
305
|
+
// themed type's font-size across the astryx-base → astryx-theme layers)
|
|
306
|
+
generateSizeOverrides(theme.components || {}, parts);
|
|
307
|
+
|
|
304
308
|
// (on-media rules are generated separately — see generateOnMediaCSS)
|
|
305
309
|
|
|
306
310
|
return parts;
|
|
@@ -500,6 +504,58 @@ function generateColorOverrides(
|
|
|
500
504
|
}
|
|
501
505
|
}
|
|
502
506
|
|
|
507
|
+
/**
|
|
508
|
+
* Map a Text `size` prop value to its raw font-size token.
|
|
509
|
+
* Mirrors `sizeStyles` in `Text/text.stylex.ts` (note `xsm` → `--font-size-xs`).
|
|
510
|
+
* <!-- SYNC: packages/core/src/Text/text.stylex.ts (sizeStyles) -->
|
|
511
|
+
*/
|
|
512
|
+
const TEXT_SIZE_TOKEN_MAP: Record<string, string> = {
|
|
513
|
+
'4xs': 'var(--font-size-4xs)',
|
|
514
|
+
'3xs': 'var(--font-size-3xs)',
|
|
515
|
+
'2xs': 'var(--font-size-2xs)',
|
|
516
|
+
xsm: 'var(--font-size-xs)',
|
|
517
|
+
sm: 'var(--font-size-sm)',
|
|
518
|
+
base: 'var(--font-size-base)',
|
|
519
|
+
lg: 'var(--font-size-lg)',
|
|
520
|
+
xl: 'var(--font-size-xl)',
|
|
521
|
+
'2xl': 'var(--font-size-2xl)',
|
|
522
|
+
'3xl': 'var(--font-size-3xl)',
|
|
523
|
+
'4xl': 'var(--font-size-4xl)',
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Generate `size`-prop font-size overrides for the Text component.
|
|
528
|
+
*
|
|
529
|
+
* The `size` prop is documented as a font-size override that wins over the
|
|
530
|
+
* size implied by `type`. Its StyleX class lives in `@layer astryx-base`, but a
|
|
531
|
+
* theme's per-type font-size rule (`.astryx-text.<type>`) lives in the higher
|
|
532
|
+
* `@layer astryx-theme`, so the layer cascade let the theme silently shadow
|
|
533
|
+
* `size` for any `type` the theme styled. Re-emitting the size classes here —
|
|
534
|
+
* same layer as the type rules, same `.astryx-text.<x>` specificity, later in
|
|
535
|
+
* source — restores `size` as a real override.
|
|
536
|
+
*
|
|
537
|
+
* Only `font-size` is overridden; line-height and other type properties are
|
|
538
|
+
* intentionally preserved, matching the prop's documented contract.
|
|
539
|
+
*
|
|
540
|
+
* Gated on the theme touching `text` (which includes the auto-generated
|
|
541
|
+
* type-scale rules) — with no theme type rule to beat, the base-layer StyleX
|
|
542
|
+
* class already wins and no override is needed.
|
|
543
|
+
*/
|
|
544
|
+
function generateSizeOverrides(
|
|
545
|
+
components: Record<string, unknown>,
|
|
546
|
+
parts: string[],
|
|
547
|
+
): void {
|
|
548
|
+
if (!('text' in components)) {
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
for (const [sizeName, sizeValue] of Object.entries(TEXT_SIZE_TOKEN_MAP)) {
|
|
552
|
+
const suffix = parseStyleKey(`size:${sizeName}`);
|
|
553
|
+
parts.push(
|
|
554
|
+
` ${componentClassSelector('text', suffix)} { font-size: ${sizeValue}; }`,
|
|
555
|
+
);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
503
559
|
/**
|
|
504
560
|
* Generate theme rules split into component and prose groups.
|
|
505
561
|
*
|
package/src/theme/hct.ts
CHANGED
|
@@ -110,7 +110,7 @@ function labToXyz(L: number, a: number, b: number): [number, number, number] {
|
|
|
110
110
|
// Tone <-> Y (CIE Luminance)
|
|
111
111
|
// =============================================================================
|
|
112
112
|
|
|
113
|
-
|
|
113
|
+
function toneToY(tone: number): number {
|
|
114
114
|
return labFInv((tone + 16) / 116);
|
|
115
115
|
}
|
|
116
116
|
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import {syntaxTokenDefaults, type SyntaxTokenName} from './tokens';
|
|
15
|
+
import {devWarn} from '../../utils/devWarning';
|
|
15
16
|
|
|
16
17
|
// =============================================================================
|
|
17
18
|
// Types
|
|
@@ -139,12 +140,10 @@ export function defineSyntaxTheme(
|
|
|
139
140
|
): SyntaxThemeDefinition {
|
|
140
141
|
const missing = ALL_SYNTAX_KEYS.filter(key => !(key in input.tokens));
|
|
141
142
|
if (missing.length > 0) {
|
|
142
|
-
|
|
143
|
-
'
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
missing.join(', ') +
|
|
147
|
-
'. All 14 syntax tokens are required.',
|
|
143
|
+
devWarn(
|
|
144
|
+
'defineSyntaxTheme',
|
|
145
|
+
`"${input.name}": missing tokens: ${missing.join(', ')}. ` +
|
|
146
|
+
`All 14 syntax tokens are required.`,
|
|
148
147
|
);
|
|
149
148
|
}
|
|
150
149
|
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {afterEach, describe, expect, it, vi} from 'vitest';
|
|
4
|
+
import {
|
|
5
|
+
devWarn,
|
|
6
|
+
devError,
|
|
7
|
+
warnOnce,
|
|
8
|
+
formatDevMessage,
|
|
9
|
+
__resetDevWarnings,
|
|
10
|
+
} from './devWarning';
|
|
11
|
+
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
__resetDevWarnings();
|
|
14
|
+
vi.restoreAllMocks();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
describe('formatDevMessage', () => {
|
|
18
|
+
it('formats as "Component: message"', () => {
|
|
19
|
+
expect(formatDevMessage('Field', 'oops')).toBe('Field: oops');
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
describe('devWarn', () => {
|
|
24
|
+
it('warns in the standardized format and forwards extra args', () => {
|
|
25
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
26
|
+
const detail = {a: 1};
|
|
27
|
+
devWarn('Popover', 'no button', detail);
|
|
28
|
+
expect(warn).toHaveBeenCalledWith('Popover: no button', detail);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('devError', () => {
|
|
33
|
+
it('errors in the standardized format', () => {
|
|
34
|
+
const error = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
35
|
+
const err = new Error('boom');
|
|
36
|
+
devError('Table', 'plugin threw:', err);
|
|
37
|
+
expect(error).toHaveBeenCalledWith('Table: plugin threw:', err);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
describe('warnOnce', () => {
|
|
42
|
+
it('fires at most once per key', () => {
|
|
43
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
44
|
+
warnOnce('k', 'Theme', 'runtime injection');
|
|
45
|
+
warnOnce('k', 'Theme', 'runtime injection');
|
|
46
|
+
expect(warn).toHaveBeenCalledTimes(1);
|
|
47
|
+
expect(warn).toHaveBeenCalledWith('Theme: runtime injection');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('fires again for a different key', () => {
|
|
51
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
52
|
+
warnOnce('a', 'Theme', 'one');
|
|
53
|
+
warnOnce('b', 'Theme', 'two');
|
|
54
|
+
expect(warn).toHaveBeenCalledTimes(2);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file devWarning.ts
|
|
5
|
+
* @input A component/hook name and a message
|
|
6
|
+
* @output Standardized `Component: message` console warnings and errors
|
|
7
|
+
* @position Shared dev-logging utility used across components and hooks
|
|
8
|
+
*
|
|
9
|
+
* Standardizes how the design system surfaces information to the builder:
|
|
10
|
+
* every message reads `Component: message` (e.g. `Field: isOptional and
|
|
11
|
+
* isRequired are mutually exclusive.`), so the source is always obvious in
|
|
12
|
+
* the console.
|
|
13
|
+
*
|
|
14
|
+
* Prefer the `useDevWarning` hook inside components — it guards against
|
|
15
|
+
* repeating a warning on every render. These imperative helpers exist for
|
|
16
|
+
* the non-render contexts a hook can't cover: plain functions, module
|
|
17
|
+
* initialization, and inside effects.
|
|
18
|
+
*
|
|
19
|
+
* SYNC: When modified, update:
|
|
20
|
+
* - /packages/core/src/utils/index.ts
|
|
21
|
+
* - /packages/core/src/hooks/useDevWarning.ts (the render-path counterpart)
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const isDev = process.env.NODE_ENV !== 'production';
|
|
25
|
+
|
|
26
|
+
/** Format a message as `Component: message`. */
|
|
27
|
+
export function formatDevMessage(component: string, message: string): string {
|
|
28
|
+
return `${component}: ${message}`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Dev-only `console.warn` in the standardized `Component: message` format.
|
|
33
|
+
* A no-op in production — warnings are builder guardrails, not shipped noise.
|
|
34
|
+
* Extra args (e.g. an offending value) are forwarded to `console.warn`.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```
|
|
38
|
+
* devWarn('Popover', 'children must contain a <button>.');
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function devWarn(
|
|
42
|
+
component: string,
|
|
43
|
+
message: string,
|
|
44
|
+
...args: unknown[]
|
|
45
|
+
): void {
|
|
46
|
+
if (!isDev) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
console.warn(formatDevMessage(component, message), ...args);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* `console.error` in the standardized `Component: message` format. Unlike
|
|
54
|
+
* {@link devWarn}, this runs in production too: it reports real runtime
|
|
55
|
+
* failures (e.g. a thrown callback) that should reach error telemetry.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```
|
|
59
|
+
* devError('Table', 'Plugin at index 0 threw in transform:', error);
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export function devError(
|
|
63
|
+
component: string,
|
|
64
|
+
message: string,
|
|
65
|
+
...args: unknown[]
|
|
66
|
+
): void {
|
|
67
|
+
console.error(formatDevMessage(component, message), ...args);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const warnedKeys = new Set<string>();
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Dev-only warning that fires at most once per `key` for the lifetime of the
|
|
74
|
+
* app. Use for singleton warnings that aren't tied to a component instance —
|
|
75
|
+
* a missing translation key, a per-theme perf hint, a one-time fallback.
|
|
76
|
+
* For per-component-instance warnings, use the `useDevWarning` hook instead.
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```
|
|
80
|
+
* warnOnce(`theme:${name}`, 'Theme', `"${name}" uses runtime injection.`);
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export function warnOnce(
|
|
84
|
+
key: string,
|
|
85
|
+
component: string,
|
|
86
|
+
message: string,
|
|
87
|
+
...args: unknown[]
|
|
88
|
+
): void {
|
|
89
|
+
if (!isDev || warnedKeys.has(key)) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
warnedKeys.add(key);
|
|
93
|
+
console.warn(formatDevMessage(component, message), ...args);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Clear `warnOnce` dedup state. Test-only.
|
|
98
|
+
* @internal
|
|
99
|
+
*/
|
|
100
|
+
export function __resetDevWarnings(): void {
|
|
101
|
+
warnedKeys.clear();
|
|
102
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -42,12 +42,16 @@ export {
|
|
|
42
42
|
plainDateSetEndOfWeekExclusive,
|
|
43
43
|
plainDateGetWeekNumber,
|
|
44
44
|
plainDateFormat,
|
|
45
|
+
formatSharedDate,
|
|
45
46
|
DATE_FORMAT_WITH_WEEKDAY,
|
|
47
|
+
DATE_FORMAT_SHORT_WITH_WEEKDAY,
|
|
46
48
|
DATE_FORMAT_LONG,
|
|
47
49
|
DATE_FORMAT_MONTH_YEAR,
|
|
48
50
|
DATE_FORMAT_SHORT,
|
|
49
51
|
DATE_FORMAT_SHORT_WITH_YEAR,
|
|
52
|
+
SHARED_DATE_FORMAT_OPTIONS,
|
|
50
53
|
} from './plainDate';
|
|
54
|
+
export type {SharedDateFormat} from './plainDate';
|
|
51
55
|
|
|
52
56
|
export {
|
|
53
57
|
parseISOTime,
|
|
@@ -92,3 +96,5 @@ export {
|
|
|
92
96
|
toGLFloats,
|
|
93
97
|
} from './color';
|
|
94
98
|
export type {RGBA} from './color';
|
|
99
|
+
|
|
100
|
+
export {devWarn, devError, warnOnce, formatDevMessage} from './devWarning';
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
plainDateSetEndOfWeekExclusive,
|
|
27
27
|
plainDateGetWeekNumber,
|
|
28
28
|
plainDateFormat,
|
|
29
|
+
formatSharedDate,
|
|
29
30
|
DATE_FORMAT_WITH_WEEKDAY,
|
|
30
31
|
} from './plainDate';
|
|
31
32
|
import type {ISODateString} from './dateTypes';
|
|
@@ -521,3 +522,24 @@ describe('plainDateFormat', () => {
|
|
|
521
522
|
expect(result).toContain('25');
|
|
522
523
|
});
|
|
523
524
|
});
|
|
525
|
+
|
|
526
|
+
describe('formatSharedDate', () => {
|
|
527
|
+
const pd: PlainDate = {year: 2026, month: 1, day: 25};
|
|
528
|
+
|
|
529
|
+
it('formats the short-month "date" shape', () => {
|
|
530
|
+
expect(formatSharedDate(pd, 'date')).toBe('Jan 25, 2026');
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
it('formats the long-month "date_long" shape', () => {
|
|
534
|
+
expect(formatSharedDate(pd, 'date_long')).toBe('January 25, 2026');
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
it('formats the weekday "date_weekday" shape', () => {
|
|
538
|
+
// 2026-01-25 is a Sunday.
|
|
539
|
+
expect(formatSharedDate(pd, 'date_weekday')).toBe('Sun, Jan 25, 2026');
|
|
540
|
+
});
|
|
541
|
+
|
|
542
|
+
it('formats the ISO "system_date" shape', () => {
|
|
543
|
+
expect(formatSharedDate(pd, 'system_date')).toBe('2026-01-25');
|
|
544
|
+
});
|
|
545
|
+
});
|
package/src/utils/plainDate.ts
CHANGED
|
@@ -229,6 +229,15 @@ export const DATE_FORMAT_WITH_WEEKDAY: Intl.DateTimeFormatOptions = {
|
|
|
229
229
|
day: 'numeric',
|
|
230
230
|
};
|
|
231
231
|
|
|
232
|
+
// e.g. "Wed, May 21, 2026" (locale-dependent) — short weekday + short month.
|
|
233
|
+
// Backs the shared `date_weekday` format used by both Timestamp and DateInput.
|
|
234
|
+
export const DATE_FORMAT_SHORT_WITH_WEEKDAY: Intl.DateTimeFormatOptions = {
|
|
235
|
+
weekday: 'short',
|
|
236
|
+
month: 'short',
|
|
237
|
+
day: 'numeric',
|
|
238
|
+
year: 'numeric',
|
|
239
|
+
};
|
|
240
|
+
|
|
232
241
|
// e.g. "May 21, 2026" (locale-dependent)
|
|
233
242
|
export const DATE_FORMAT_LONG: Intl.DateTimeFormatOptions = {
|
|
234
243
|
year: 'numeric',
|
|
@@ -263,3 +272,55 @@ export function plainDateFormat(
|
|
|
263
272
|
plainDateToDate(pd),
|
|
264
273
|
);
|
|
265
274
|
}
|
|
275
|
+
|
|
276
|
+
// =============================================================================
|
|
277
|
+
// Shared date-only format vocabulary
|
|
278
|
+
// =============================================================================
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* The date-only members of Timestamp's `format` vocabulary that a
|
|
282
|
+
* calendar-date field (no time-of-day) can render. Both Timestamp and
|
|
283
|
+
* DateInput share these string literals and the mapping below so that the same
|
|
284
|
+
* literal renders the same date shape in either component.
|
|
285
|
+
*
|
|
286
|
+
* - `date`: locale short-month date, e.g. "Mar 21, 2026"
|
|
287
|
+
* - `date_long`: locale long-month date, e.g. "March 21, 2026"
|
|
288
|
+
* - `date_weekday`: short weekday + short-month date, e.g. "Wed, Mar 21, 2026"
|
|
289
|
+
* - `system_date`: ISO 8601 calendar date, e.g. "2026-03-21"
|
|
290
|
+
*/
|
|
291
|
+
export type SharedDateFormat =
|
|
292
|
+
'date' | 'date_long' | 'date_weekday' | 'system_date';
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Intl option bags for the locale-aware shared date members. `system_date` is
|
|
296
|
+
* intentionally absent — it is emitted as a fixed ISO `YYYY-MM-DD` string, not
|
|
297
|
+
* via `Intl` — and is handled directly by {@link formatSharedDate}.
|
|
298
|
+
*
|
|
299
|
+
* This is the single source of truth consumed by both Timestamp's
|
|
300
|
+
* `formatTimestamp` switch and DateInput's display path, so the two never
|
|
301
|
+
* drift for the members they share.
|
|
302
|
+
*/
|
|
303
|
+
export const SHARED_DATE_FORMAT_OPTIONS: Record<
|
|
304
|
+
Exclude<SharedDateFormat, 'system_date'>,
|
|
305
|
+
Intl.DateTimeFormatOptions
|
|
306
|
+
> = {
|
|
307
|
+
date: DATE_FORMAT_SHORT_WITH_YEAR,
|
|
308
|
+
date_long: DATE_FORMAT_LONG,
|
|
309
|
+
date_weekday: DATE_FORMAT_SHORT_WITH_WEEKDAY,
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Renders a {@link PlainDate} using one of the {@link SharedDateFormat}
|
|
314
|
+
* members. The shared entry point DateInput uses for the named-format path;
|
|
315
|
+
* Timestamp maps the same members onto {@link SHARED_DATE_FORMAT_OPTIONS} in
|
|
316
|
+
* its own `formatTimestamp` switch (its input is a `Date`, not a `PlainDate`).
|
|
317
|
+
*/
|
|
318
|
+
export function formatSharedDate(
|
|
319
|
+
pd: PlainDate,
|
|
320
|
+
format: SharedDateFormat,
|
|
321
|
+
): string {
|
|
322
|
+
if (format === 'system_date') {
|
|
323
|
+
return plainDateToISO(pd);
|
|
324
|
+
}
|
|
325
|
+
return plainDateFormat(pd, SHARED_DATE_FORMAT_OPTIONS[format]);
|
|
326
|
+
}
|
package/src/utils/types.ts
CHANGED
|
@@ -12,6 +12,20 @@
|
|
|
12
12
|
*/
|
|
13
13
|
export type SizeValue = number | string;
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* Resting elevation level for configurable surfaces.
|
|
17
|
+
*
|
|
18
|
+
* Maps to the shadow token scale:
|
|
19
|
+
* - `none` = flat (`box-shadow: none`)
|
|
20
|
+
* - `low` = `--shadow-low`
|
|
21
|
+
* - `med` = `--shadow-med`
|
|
22
|
+
* - `high` = `--shadow-high`
|
|
23
|
+
*
|
|
24
|
+
* Components narrow this union to the steps they actually need — e.g. Card
|
|
25
|
+
* exposes all four, while ChatComposer exposes only `'none' | 'low'`.
|
|
26
|
+
*/
|
|
27
|
+
export type Elevation = 'none' | 'low' | 'med' | 'high';
|
|
28
|
+
|
|
15
29
|
/**
|
|
16
30
|
* Numeric spacing step from the Astryx spacing scale.
|
|
17
31
|
*
|