@astryxdesign/core 0.1.8 → 0.1.9
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/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/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- 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/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/InternationalizationProvider.doc.mjs +99 -2
- package/src/i18n/resolve.ts +9 -21
- 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
|
@@ -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
|
*
|