@astryxdesign/core 0.1.9 → 0.2.0-canary.136a00f
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 +107 -0
- package/dist/Avatar/Avatar.d.ts +42 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +190 -59
- package/dist/Avatar/AvatarStatusDot.d.ts +6 -4
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +58 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -2
- package/dist/Banner/Banner.js +2 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -4
- package/dist/Breadcrumbs/index.d.ts +1 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +2 -1
- package/dist/Button/Button.d.ts +1 -1
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +6 -4
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +50 -9
- package/dist/Calendar/dayCellUtils.d.ts +4 -4
- package/dist/Calendar/dayCellUtils.js +2 -2
- package/dist/Calendar/styles.d.ts +30 -31
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +30 -31
- package/dist/Card/Card.js +1 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +22 -12
- package/dist/Chat/ChatComposerInput.js +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +3 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
- package/dist/Chat/ChatMessageBubble.js +8 -8
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +10 -3
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +6 -6
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +19 -4
- package/dist/Citation/Citation.d.ts +22 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +20 -6
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +16 -10
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +3 -1
- package/dist/CommandPalette/CommandPalette.d.ts +1 -1
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +42 -3
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +23 -5
- package/dist/ContextMenu/index.d.ts +1 -0
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +3 -1
- package/dist/DateInput/DateInput.d.ts +10 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +33 -19
- package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +23 -20
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +23 -18
- package/dist/Divider/Divider.d.ts +2 -2
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +13 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +22 -5
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +4 -1
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +8 -11
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +3 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
- package/dist/DropdownMenu/index.d.ts +10 -0
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +13 -0
- package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemHover.js +33 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
- package/dist/DropdownMenu/menuItemRoles.js +10 -1
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -6
- package/dist/Field/Field.d.ts +3 -1
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +4 -1
- package/dist/Field/FieldLabel.d.ts +2 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -5
- package/dist/Field/inputStyles.stylex.d.ts +1 -0
- package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
- package/dist/Field/inputStyles.stylex.js +1 -0
- package/dist/FieldStatus/FieldStatus.d.ts +10 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +39 -3
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +93 -65
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +10 -4
- package/dist/Icon/Icon.d.ts +15 -1
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +19 -3
- package/dist/Item/Item.d.ts +16 -3
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +31 -6
- package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
- package/dist/Layer/layerAnimations.stylex.js +10 -2
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +19 -13
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +6 -3
- package/dist/List/ListItem.d.ts +11 -1
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +2 -0
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -0
- package/dist/MetadataList/MetadataList.d.ts +1 -1
- package/dist/MetadataList/MetadataList.d.ts.map +1 -1
- package/dist/MetadataList/MetadataList.js +4 -2
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +80 -42
- package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
- package/dist/NumberInput/NumberInput.d.ts +10 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +22 -17
- package/dist/Outline/Outline.js +2 -2
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/PowerSearch/PowerSearch.d.ts +9 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +2 -0
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +6 -1
- package/dist/RadioList/RadioList.d.ts +2 -2
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +5 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +49 -19
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +5 -3
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +66 -17
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +5 -5
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +13 -10
- package/dist/SideNav/SideNavItem.d.ts +1 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +12 -10
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +2 -2
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +87 -34
- package/dist/Spinner/Spinner.d.ts +3 -2
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +11 -2
- package/dist/Switch/Switch.d.ts +8 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +171 -91
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabList.d.ts +2 -11
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +5 -9
- package/dist/TabList/TabListContext.d.ts +0 -5
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +0 -5
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +30 -4
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +37 -27
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +3 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +15 -7
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +29 -23
- package/dist/Table/types.d.ts +32 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +18 -19
- package/dist/TextInput/TextInput.d.ts +10 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +20 -17
- package/dist/Thumbnail/Thumbnail.js +2 -2
- package/dist/TimeInput/TimeInput.d.ts +10 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +17 -17
- package/dist/Timestamp/Timestamp.d.ts +31 -3
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +47 -76
- package/dist/Timestamp/formatInstant.d.ts +41 -0
- package/dist/Timestamp/formatInstant.d.ts.map +1 -0
- package/dist/Timestamp/formatInstant.js +177 -0
- package/dist/Timestamp/index.d.ts +1 -0
- package/dist/Timestamp/index.d.ts.map +1 -1
- package/dist/Timestamp/tooltipEntries.d.ts +56 -0
- package/dist/Timestamp/tooltipEntries.d.ts.map +1 -0
- package/dist/Timestamp/tooltipEntries.js +163 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +61 -9
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +3 -1
- package/dist/Token/Token.d.ts +34 -4
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +85 -45
- package/dist/Token/TokenLink.d.ts +62 -0
- package/dist/Token/TokenLink.d.ts.map +1 -0
- package/dist/Token/TokenLink.js +76 -0
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +9 -2
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +4 -2
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +17 -1
- package/dist/TopNav/TopNavItem.d.ts +3 -1
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +30 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +1 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +8 -6
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +32 -14
- package/dist/Typeahead/BaseTypeahead.d.ts +9 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +22 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +11 -2
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +20 -10
- package/dist/astryx.css +70 -30
- package/dist/astryx.umd.js +51 -51
- package/dist/astryx.umd.js.map +4 -4
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/isRtlElement.d.ts +18 -0
- package/dist/hooks/isRtlElement.d.ts.map +1 -0
- package/dist/hooks/isRtlElement.js +27 -0
- package/dist/hooks/useAnnounce.d.ts +3 -0
- package/dist/hooks/useAnnounce.d.ts.map +1 -1
- package/dist/hooks/useAnnounce.js +39 -1
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +52 -11
- package/dist/hooks/useGridFocus.d.ts +6 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +12 -9
- package/dist/hooks/useHotkeys.d.ts +9 -0
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +9 -0
- package/dist/hooks/useInputStatusIcon.d.ts +38 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
- package/dist/hooks/useInputStatusIcon.js +158 -0
- package/dist/hooks/useKeyboardHint.d.ts +1 -1
- package/dist/hooks/useKeyboardHint.d.ts.map +1 -1
- package/dist/hooks/useKeyboardHint.js +4 -2
- package/dist/hooks/useListFocus.d.ts +39 -1
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +54 -9
- 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/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/plainDate.d.ts +17 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +23 -4
- package/dist/utils/rtlStyles.d.ts +24 -0
- package/dist/utils/rtlStyles.d.ts.map +1 -0
- package/dist/utils/rtlStyles.js +27 -0
- package/locales/en.json +112 -0
- package/locales/pseudo.json +84 -0
- package/package.json +6 -1
- package/src/Avatar/Avatar.doc.mjs +50 -3
- package/src/Avatar/Avatar.test.tsx +218 -0
- package/src/Avatar/Avatar.tsx +285 -79
- package/src/Avatar/AvatarStatusDot.doc.mjs +4 -4
- package/src/Avatar/AvatarStatusDot.tsx +6 -4
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +162 -2
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +5 -2
- package/src/Banner/Banner.tsx +6 -6
- package/src/Breadcrumbs/BreadcrumbItem.tsx +10 -10
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +52 -1
- package/src/Breadcrumbs/index.ts +4 -0
- package/src/Button/Button.doc.mjs +0 -4
- package/src/Button/Button.test.tsx +16 -0
- package/src/Button/Button.tsx +6 -4
- package/src/Calendar/Calendar.test.tsx +170 -20
- package/src/Calendar/Calendar.tsx +73 -16
- package/src/Calendar/dayCellUtils.test.ts +18 -18
- package/src/Calendar/dayCellUtils.ts +2 -2
- package/src/Calendar/styles.ts +33 -39
- package/src/Card/Card.tsx +1 -1
- package/src/Carousel/Carousel.tsx +25 -6
- package/src/Chat/ChatComposer.doc.mjs +2 -2
- package/src/Chat/ChatComposerInput.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.tsx +2 -2
- package/src/Chat/ChatDictationButton.tsx +7 -1
- package/src/Chat/ChatLayout.tsx +4 -4
- package/src/Chat/ChatMessageBubble.tsx +15 -10
- package/src/Chat/ChatSystemMessage.test.tsx +5 -0
- package/src/Chat/ChatToolCalls.tsx +9 -2
- package/src/Chat/useTriggerMenu.tsx +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +23 -0
- package/src/CheckboxInput/CheckboxInput.tsx +21 -6
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
- package/src/CheckboxList/CheckboxList.test.tsx +94 -3
- package/src/CheckboxList/CheckboxListItem.tsx +17 -10
- package/src/Citation/Citation.doc.mjs +4 -3
- package/src/Citation/Citation.test.tsx +97 -0
- package/src/Citation/Citation.tsx +43 -11
- package/src/CodeBlock/CodeBlock.test.tsx +17 -0
- package/src/CodeBlock/CodeBlock.tsx +38 -11
- package/src/Collapsible/Collapsible.doc.mjs +1 -0
- package/src/Collapsible/Collapsible.test.tsx +7 -0
- package/src/Collapsible/Collapsible.tsx +16 -6
- package/src/CommandPalette/CommandPalette.test.tsx +95 -1
- package/src/CommandPalette/CommandPalette.tsx +41 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +59 -2
- package/src/ContextMenu/ContextMenu.tsx +22 -11
- package/src/ContextMenu/index.ts +5 -0
- package/src/DateInput/DateInput.doc.mjs +25 -0
- package/src/DateInput/DateInput.test.tsx +230 -0
- package/src/DateInput/DateInput.tsx +51 -29
- package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
- package/src/DateRangeInput/DateRangeInput.tsx +42 -30
- package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
- package/src/DateTimeInput/DateTimeInput.test.tsx +112 -0
- package/src/DateTimeInput/DateTimeInput.tsx +44 -39
- package/src/Divider/Divider.test.tsx +32 -8
- package/src/Divider/Divider.tsx +14 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +60 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +8 -2
- package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuRadioGroup.doc.mjs +4 -12
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +9 -10
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +20 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
- package/src/DropdownMenu/index.ts +16 -0
- package/src/DropdownMenu/menuItemHover.ts +39 -0
- package/src/DropdownMenu/menuItemRoles.ts +9 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
- package/src/Field/Field.tsx +14 -9
- package/src/Field/FieldLabel.test.tsx +25 -0
- package/src/Field/FieldLabel.tsx +12 -3
- package/src/Field/inputStyles.stylex.ts +2 -0
- package/src/FieldStatus/FieldStatus.test.tsx +72 -0
- package/src/FieldStatus/FieldStatus.tsx +48 -2
- package/src/FileInput/FileInput.doc.mjs +23 -2
- package/src/FileInput/FileInput.test.tsx +104 -13
- package/src/FileInput/FileInput.tsx +106 -79
- package/src/HoverCard/useHoverCard.tsx +15 -3
- package/src/Icon/Icon.doc.mjs +13 -0
- package/src/Icon/Icon.test.tsx +89 -0
- package/src/Icon/Icon.tsx +51 -3
- package/src/Item/Item.doc.mjs +5 -0
- package/src/Item/Item.test.tsx +88 -0
- package/src/Item/Item.tsx +57 -11
- package/src/Layer/layerAnimations.stylex.ts +23 -0
- package/src/Lightbox/Lightbox.tsx +15 -7
- package/src/List/List.test.tsx +17 -29
- package/src/List/List.tsx +6 -1
- package/src/List/ListItem.doc.mjs +12 -0
- package/src/List/ListItem.tsx +13 -0
- package/src/Markdown/Markdown.test.tsx +21 -0
- package/src/Markdown/Markdown.tsx +4 -0
- package/src/MetadataList/MetadataList.test.tsx +24 -0
- package/src/MetadataList/MetadataList.tsx +6 -2
- package/src/MultiSelector/MultiSelector.doc.mjs +20 -0
- package/src/MultiSelector/MultiSelector.test.tsx +402 -0
- package/src/MultiSelector/MultiSelector.tsx +120 -59
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +21 -0
- package/src/NumberInput/NumberInput.test.tsx +71 -0
- package/src/NumberInput/NumberInput.tsx +35 -26
- package/src/Outline/Outline.test.tsx +12 -12
- package/src/Outline/Outline.tsx +2 -2
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
- package/src/PowerSearch/PowerSearch.test.tsx +23 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/ProgressBar/ProgressBar.test.tsx +34 -0
- package/src/ProgressBar/ProgressBar.tsx +16 -1
- package/src/RadioList/RadioList.doc.mjs +6 -0
- package/src/RadioList/RadioList.test.tsx +26 -4
- package/src/RadioList/RadioList.tsx +2 -2
- package/src/RadioList/RadioListItem.tsx +12 -5
- package/src/Resizable/ResizeHandle.test.tsx +94 -0
- package/src/Resizable/ResizeHandle.tsx +70 -20
- package/src/SegmentedControl/SegmentedControl.test.tsx +28 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +22 -2
- package/src/Selector/Selector.doc.mjs +15 -0
- package/src/Selector/Selector.test.tsx +370 -0
- package/src/Selector/Selector.tsx +88 -20
- package/src/SideNav/SideNav.tsx +1 -8
- package/src/SideNav/SideNavCollapseButton.tsx +9 -7
- package/src/SideNav/SideNavItem.tsx +5 -3
- package/src/Skeleton/Skeleton.test.tsx +16 -0
- package/src/Skeleton/Skeleton.tsx +13 -1
- package/src/Slider/Slider.doc.mjs +6 -0
- package/src/Slider/Slider.test.tsx +240 -12
- package/src/Slider/Slider.tsx +96 -23
- package/src/Spinner/Spinner.test.tsx +10 -8
- package/src/Spinner/Spinner.tsx +15 -5
- package/src/Switch/Switch.doc.mjs +142 -42
- package/src/Switch/Switch.test.tsx +111 -0
- package/src/Switch/Switch.tsx +149 -32
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabList.doc.mjs +0 -6
- package/src/TabList/TabList.test.tsx +3 -15
- package/src/TabList/TabList.tsx +6 -17
- package/src/TabList/TabListContext.ts +0 -6
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +34 -2
- package/src/Table/Table.doc.mjs +11 -0
- package/src/Table/Table.test.tsx +85 -0
- package/src/Table/TableCell.tsx +3 -3
- package/src/Table/TableHeaderCell.tsx +3 -3
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +9 -6
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +19 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +27 -18
- package/src/Table/plugins/selection/useTableSelection.test.tsx +61 -3
- package/src/Table/plugins/selection/useTableSelection.tsx +3 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +38 -9
- package/src/Table/plugins/tree/useTableTreeData.tsx +17 -13
- package/src/Table/types.ts +33 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/TextArea/TextArea.doc.mjs +21 -0
- package/src/TextArea/TextArea.test.tsx +23 -0
- package/src/TextArea/TextArea.tsx +27 -26
- package/src/TextInput/TextInput.doc.mjs +21 -0
- package/src/TextInput/TextInput.test.tsx +150 -0
- package/src/TextInput/TextInput.tsx +28 -25
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
- package/src/Thumbnail/Thumbnail.tsx +1 -1
- package/src/TimeInput/TimeInput.doc.mjs +21 -0
- package/src/TimeInput/TimeInput.test.tsx +23 -0
- package/src/TimeInput/TimeInput.tsx +24 -25
- package/src/Timestamp/Timestamp.doc.mjs +32 -6
- package/src/Timestamp/Timestamp.test.tsx +371 -0
- package/src/Timestamp/Timestamp.tsx +96 -93
- package/src/Timestamp/formatInstant.ts +218 -0
- package/src/Timestamp/index.ts +4 -0
- package/src/Timestamp/tooltipEntries.test.ts +552 -0
- package/src/Timestamp/tooltipEntries.ts +210 -0
- package/src/Toast/ToastViewport.test.tsx +218 -8
- package/src/Toast/ToastViewport.tsx +71 -12
- package/src/ToggleButton/ToggleButton.test.tsx +24 -0
- package/src/ToggleButton/ToggleButton.tsx +19 -1
- package/src/Token/Token.test.tsx +166 -15
- package/src/Token/Token.tsx +104 -47
- package/src/Token/TokenLink.tsx +107 -0
- package/src/Token/index.ts +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +23 -1
- package/src/Tokenizer/Tokenizer.test.tsx +23 -0
- package/src/Tokenizer/Tokenizer.tsx +14 -2
- package/src/Tooltip/Tooltip.test.tsx +46 -0
- package/src/Tooltip/useTooltip.tsx +20 -0
- package/src/TopNav/TopNav.test.tsx +93 -2
- package/src/TopNav/TopNavItem.doc.mjs +3 -3
- package/src/TopNav/TopNavItem.tsx +35 -6
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +1 -1
- package/src/TreeList/TreeList.doc.mjs +6 -0
- package/src/TreeList/TreeList.test.tsx +50 -10
- package/src/TreeList/TreeList.tsx +5 -0
- package/src/TreeList/TreeListBranches.tsx +8 -6
- package/src/TreeList/TreeListItem.tsx +33 -11
- package/src/Typeahead/BaseTypeahead.tsx +42 -15
- package/src/Typeahead/Typeahead.doc.mjs +13 -0
- package/src/Typeahead/Typeahead.test.tsx +112 -0
- package/src/Typeahead/Typeahead.tsx +17 -1
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/__tests__/forcedColors.ts +60 -0
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/doc-mjs.d.ts +19 -0
- package/src/hooks/index.ts +6 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useAnnounce.test.tsx +75 -2
- package/src/hooks/useAnnounce.ts +47 -1
- package/src/hooks/useFocusTrap.test.tsx +104 -0
- package/src/hooks/useFocusTrap.ts +61 -12
- package/src/hooks/useGridFocus.doc.mjs +3 -3
- package/src/hooks/useGridFocus.test.tsx +41 -0
- package/src/hooks/useGridFocus.ts +21 -10
- package/src/hooks/useHotkeys.ts +9 -0
- package/src/hooks/useInputStatusIcon.test.tsx +162 -0
- package/src/hooks/useInputStatusIcon.tsx +224 -0
- package/src/hooks/useKeyboardHint.test.tsx +22 -0
- package/src/hooks/useKeyboardHint.tsx +6 -2
- package/src/hooks/useListFocus.doc.mjs +25 -3
- package/src/hooks/useListFocus.test.tsx +153 -1
- package/src/hooks/useListFocus.ts +102 -9
- package/src/i18n/InternationalizationContext.ts +4 -0
- 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/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +42 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/plainDate.test.ts +24 -6
- package/src/utils/plainDate.ts +18 -4
- package/src/utils/rtlStyles.ts +27 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as stylex from '@stylexjs/stylex';
|
|
2
|
-
import { type InputStatus } from '../Field';
|
|
2
|
+
import { type InputStatus, type FieldStatusVariant } from '../Field';
|
|
3
3
|
import { type ISOTimeString } from '../utils';
|
|
4
4
|
import type { BaseProps } from '../BaseProps';
|
|
5
5
|
import type { SizeValue } from '../utils/types';
|
|
@@ -144,6 +144,14 @@ export interface TimeInputProps extends Omit<BaseProps, 'onChange' | 'defaultVal
|
|
|
144
144
|
* If message is provided, displays below the input.
|
|
145
145
|
*/
|
|
146
146
|
status?: InputStatus;
|
|
147
|
+
/**
|
|
148
|
+
* How the status message is placed relative to the input.
|
|
149
|
+
* - 'attached': message overlaps directly below the input (bordered treatment)
|
|
150
|
+
* - 'detached': message floats below as a separate element with spacing
|
|
151
|
+
* - 'tooltip': no message box; the status icon becomes a focusable info-tip button that reveals the message on hover, keyboard focus, or tap
|
|
152
|
+
* @default 'attached'
|
|
153
|
+
*/
|
|
154
|
+
statusVariant?: FieldStatusVariant;
|
|
147
155
|
/**
|
|
148
156
|
* Width of the field. Numbers are treated as pixels, strings are used as-is
|
|
149
157
|
* (e.g. `'100%'`). Sizes the whole field (label, control, and status) so they
|
|
@@ -169,7 +177,7 @@ export interface TimeInputProps extends Omit<BaseProps, 'onChange' | 'defaultVal
|
|
|
169
177
|
* />
|
|
170
178
|
* ```
|
|
171
179
|
*/
|
|
172
|
-
export declare function TimeInput({ label, isLabelHidden, description, isOptional, isRequired, isDisabled, disabledMessage, value, onChange, changeAction, isLoading, min, max, hasSeconds, hasClear, hasAutoFocus, hourFormat, increment, placeholder: placeholderFromProps, size: sizeProp, status, labelTooltip, width, xstyle, className, style, ref, }: TimeInputProps): import("react").JSX.Element;
|
|
180
|
+
export declare function TimeInput({ label, isLabelHidden, description, isOptional, isRequired, isDisabled, disabledMessage, value, onChange, changeAction, isLoading, min, max, hasSeconds, hasClear, hasAutoFocus, hourFormat, increment, placeholder: placeholderFromProps, size: sizeProp, status, statusVariant, labelTooltip, width, xstyle, className, style, ref, }: TimeInputProps): import("react").JSX.Element;
|
|
173
181
|
export declare namespace TimeInput {
|
|
174
182
|
var displayName: string;
|
|
175
183
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../../src/TimeInput/TimeInput.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../../src/TimeInput/TimeInput.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAS3C,OAAO,EAEL,KAAK,WAAW,EAKhB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAIlB,OAAO,EACL,KAAK,aAAa,EAUnB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AA+D9C,QAAA,MAAM,UAAU;;;;;;;;;;;;;EAad,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,UAAU,CAAC;AAEpD,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,KAAK,CAAC;AAIhD,YAAY,EACV,WAAW,IAAI,eAAe,EAC9B,eAAe,IAAI,mBAAmB,GACvC,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,SAAS,EACT,UAAU,GAAG,cAAc,CAC5B;IACC,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,KAAK,IAAI,CAAC;IAEtD;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1E;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,GAAG,CAAC,EAAE,aAAa,CAAC;IAEpB;;OAEG;IACH,GAAG,CAAC,EAAE,aAAa,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,mBAAmB,CAAC;IAEjC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,aAAa,CAAC;IAErB;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;IAEnC;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,aAAqB,EACrB,WAAW,EACX,UAAkB,EAClB,UAAkB,EAClB,UAAkB,EAClB,eAAe,EACf,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,SAAiB,EACjB,GAAG,EACH,GAAG,EACH,UAAkB,EAClB,QAAgB,EAChB,YAAoB,EACpB,UAAkB,EAClB,SAAa,EACb,WAAW,EAAE,oBAAoB,EACjC,IAAI,EAAE,QAAQ,EACd,MAAM,EACN,aAA0B,EAC1B,YAAY,EACZ,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,GACJ,EAAE,cAAc,+BA4WhB;yBAzYe,SAAS"}
|
|
@@ -27,6 +27,7 @@ import { parseTimeInput, formatDisplayTime12h, formatDisplayTime24h, formatISOTi
|
|
|
27
27
|
import { useSize } from "../SizeContext/SizeContext.js";
|
|
28
28
|
import { useAnnounce } from "../hooks/useAnnounce.js";
|
|
29
29
|
import { useInputContainer } from "../hooks/useInputContainer.js";
|
|
30
|
+
import { useInputStatusIcon } from "../hooks/useInputStatusIcon.js";
|
|
30
31
|
import { useInputGroup } from "../InputGroup/InputGroupContext.js";
|
|
31
32
|
import { groupStyles } from "../InputGroup/groupStyles.js";
|
|
32
33
|
import { useTooltip } from "../Tooltip/index.js";
|
|
@@ -89,6 +90,7 @@ export function TimeInput({
|
|
|
89
90
|
placeholder: placeholderFromProps,
|
|
90
91
|
size: sizeProp,
|
|
91
92
|
status,
|
|
93
|
+
statusVariant = 'attached',
|
|
92
94
|
labelTooltip,
|
|
93
95
|
width,
|
|
94
96
|
xstyle,
|
|
@@ -136,20 +138,21 @@ export function TimeInput({
|
|
|
136
138
|
});
|
|
137
139
|
|
|
138
140
|
// Status icon mapping
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
success: 'success'
|
|
148
|
-
};
|
|
141
|
+
const {
|
|
142
|
+
statusIcon,
|
|
143
|
+
describedBy: statusTooltipDescribedBy
|
|
144
|
+
} = useInputStatusIcon({
|
|
145
|
+
status,
|
|
146
|
+
statusVariant,
|
|
147
|
+
isInGroup: !!inputGroup
|
|
148
|
+
});
|
|
149
149
|
const {
|
|
150
150
|
ariaLabelledBy,
|
|
151
151
|
ariaDescribedBy
|
|
152
|
-
} = getInputARIA(inputLabelID, [description ? descriptionID : null, status?.message ? statusMessageID : null,
|
|
152
|
+
} = getInputARIA(inputLabelID, [description ? descriptionID : null, statusVariant !== 'tooltip' && status?.message ? statusMessageID : null,
|
|
153
|
+
// The tooltip variant renders no message box; describe the input by the
|
|
154
|
+
// tooltip's content instead so the status is still announced.
|
|
155
|
+
statusTooltipDescribedBy, showsDisabledMessage ? disabledMessageTooltip.describedBy : null], inputGroup);
|
|
153
156
|
|
|
154
157
|
// Pending input while user is typing (null = show formatted value)
|
|
155
158
|
const [pendingInput, setPendingInput] = useState(null);
|
|
@@ -310,7 +313,7 @@ export function TimeInput({
|
|
|
310
313
|
...mergeProps(themeProps('time-input', {
|
|
311
314
|
size,
|
|
312
315
|
status: status?.type ?? null
|
|
313
|
-
}), stylex.props(inputWrapperStyles.base, sizeStyles[size], isDisabled && inputWrapperStyles.disabled, status && inputStatusBorderStyles[status.type], status && inputStatusHoverShadowStyles[status.type], status && inputStatusFocusWithinStyles[status.type], inputGroup && groupStyles.inGroup, xstyle), className, style),
|
|
316
|
+
}), stylex.props(inputWrapperStyles.base, sizeStyles[size], isDisabled && inputWrapperStyles.disabled, status && inputStatusBorderStyles[status.type], status && !isDisabled && inputStatusHoverShadowStyles[status.type], status && inputStatusFocusWithinStyles[status.type], inputGroup && groupStyles.inGroup, xstyle), className, style),
|
|
314
317
|
children: [/*#__PURE__*/_jsx("div", {
|
|
315
318
|
...{
|
|
316
319
|
className: "x78zum5 x6s0dn4 xl56j7k x2lah0s"
|
|
@@ -390,11 +393,7 @@ export function TimeInput({
|
|
|
390
393
|
size: "sm",
|
|
391
394
|
color: "secondary"
|
|
392
395
|
})
|
|
393
|
-
}),
|
|
394
|
-
icon: statusIconMap[status.type],
|
|
395
|
-
size: "md",
|
|
396
|
-
color: statusIconColorMap[status.type]
|
|
397
|
-
})]
|
|
396
|
+
}), statusIcon]
|
|
398
397
|
});
|
|
399
398
|
if (inputGroup) {
|
|
400
399
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
@@ -415,6 +414,7 @@ export function TimeInput({
|
|
|
415
414
|
message: status.message,
|
|
416
415
|
messageID: status.message ? statusMessageID : undefined
|
|
417
416
|
} : undefined,
|
|
417
|
+
statusVariant: statusVariant,
|
|
418
418
|
labelTooltip: labelTooltip,
|
|
419
419
|
width: width,
|
|
420
420
|
children: [inputWrapper, showsDisabledMessage && disabledMessageTooltip.renderTooltip(disabledMessage)]
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { TextType, TextSize, TextColor, TextWeight } from '../theme/types';
|
|
2
2
|
import type { BaseProps } from '../BaseProps';
|
|
3
|
+
import type { TimestampTooltipEntry } from './tooltipEntries';
|
|
3
4
|
export type TimestampFormat = 'relative' | 'auto' | 'date' | 'date_long' | 'date_weekday' | 'date_time' | 'time' | 'system_date' | 'system_date_time' | 'system_time';
|
|
4
5
|
export interface TimestampProps extends BaseProps<HTMLTimeElement> {
|
|
5
6
|
/** Ref forwarded to the root `<time>` element. */
|
|
@@ -32,8 +33,35 @@ export interface TimestampProps extends BaseProps<HTMLTimeElement> {
|
|
|
32
33
|
*/
|
|
33
34
|
hasTooltip?: boolean;
|
|
34
35
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
36
|
+
* Lines to show in the hover tooltip, so one instant can be read in several
|
|
37
|
+
* time zones and/or formats at once. Each entry is one line, rendered in the
|
|
38
|
+
* order given, with an optional label.
|
|
39
|
+
*
|
|
40
|
+
* Configuring entries also attaches the tooltip to absolute formats, which
|
|
41
|
+
* otherwise have no tooltip at all. `hasTooltip={false}` still suppresses it,
|
|
42
|
+
* and an empty array is treated as no configuration.
|
|
43
|
+
*
|
|
44
|
+
* @default undefined — a single line with the full absolute time in the
|
|
45
|
+
* viewer's own time zone
|
|
46
|
+
* @example
|
|
47
|
+
* ```
|
|
48
|
+
* <Timestamp
|
|
49
|
+
* value={savedAt}
|
|
50
|
+
* tooltipEntries={[
|
|
51
|
+
* {label: 'Your time'},
|
|
52
|
+
* {timezoneID: 'UTC', label: 'UTC'},
|
|
53
|
+
* ]}
|
|
54
|
+
* />
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
tooltipEntries?: ReadonlyArray<TimestampTooltipEntry>;
|
|
58
|
+
/**
|
|
59
|
+
* Whether to append the timezone abbreviation after the timestamp text.
|
|
60
|
+
* Applies to the date_time and time formats. The system_* formats stay
|
|
61
|
+
* machine-readable and never carry a timezone abbreviation.
|
|
62
|
+
*
|
|
63
|
+
* Affects the visible text only — use `tooltipEntries` to control the
|
|
64
|
+
* tooltip's time zones.
|
|
37
65
|
* @default false
|
|
38
66
|
*/
|
|
39
67
|
isTimezoneShown?: boolean;
|
|
@@ -79,7 +107,7 @@ export interface TimestampProps extends BaseProps<HTMLTimeElement> {
|
|
|
79
107
|
* <Timestamp value={event.timestamp} format="system_date_time" />
|
|
80
108
|
* ```
|
|
81
109
|
*/
|
|
82
|
-
export declare function Timestamp({ value, format, autoThreshold, hasTooltip, isTimezoneShown, isLive, type, size, color, weight, xstyle, className, style, ref, 'data-testid': testId, }: TimestampProps): import("react").JSX.Element | null;
|
|
110
|
+
export declare function Timestamp({ value, format, autoThreshold, hasTooltip, tooltipEntries, isTimezoneShown, isLive, type, size, color, weight, xstyle, className, style, ref, 'data-testid': testId, }: TimestampProps): import("react").JSX.Element | null;
|
|
83
111
|
export declare namespace Timestamp {
|
|
84
112
|
var displayName: string;
|
|
85
113
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Timestamp.d.ts","sourceRoot":"","sources":["../../src/Timestamp/Timestamp.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAG9E,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Timestamp.d.ts","sourceRoot":"","sources":["../../src/Timestamp/Timestamp.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAG9E,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAK5C,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AAU5D,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,MAAM,GACN,MAAM,GACN,WAAW,GACX,cAAc,GACd,WAAW,GACX,MAAM,GACN,aAAa,GACb,kBAAkB,GAClB,aAAa,CAAC;AAElB,MAAM,WAAW,cAAe,SAAQ,SAAS,CAAC,eAAe,CAAC;IAChE,kDAAkD;IAClD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACjC,uFAAuF;IACvF,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,cAAc,CAAC,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC;IACtD;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;OAEG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA2LD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,MAAe,EACf,aAAsC,EACtC,UAAiB,EACjB,cAAc,EACd,eAAuB,EACvB,MAAc,EACd,IAAmB,EACnB,IAAI,EACJ,KAAmB,EACnB,MAAM,EACN,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,aAAa,EAAE,MAAM,GACtB,EAAE,cAAc,sCA4IhB;yBA7Je,SAAS"}
|
|
@@ -15,16 +15,17 @@
|
|
|
15
15
|
* - /apps/storybook/stories/Timestamp.stories.tsx
|
|
16
16
|
* - /packages/cli/templates/blocks/components/Timestamp/ (showcase blocks)
|
|
17
17
|
*/
|
|
18
|
-
import { useEffect, useRef, useState, lazy, Suspense } from 'react';
|
|
18
|
+
import { useEffect, useRef, useState, lazy, Suspense, Fragment } from 'react';
|
|
19
19
|
import * as stylex from '@stylexjs/stylex';
|
|
20
20
|
import { Text } from "../Text/index.js";
|
|
21
21
|
import { mergeProps, mergeRefs } from "../utils/index.js";
|
|
22
22
|
import { useDevWarning } from "../hooks/useDevWarning.js";
|
|
23
23
|
import { themeProps } from "../utils/themeProps.js";
|
|
24
24
|
import "../theme/tokens.stylex.js";
|
|
25
|
-
import { colorVars } from "../theme/tokens.stylex.js";
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
25
|
+
import { colorVars, spacingVars } from "../theme/tokens.stylex.js";
|
|
26
|
+
import { formatInstant } from "./formatInstant.js";
|
|
27
|
+
import { formatTooltipLines } from "./tooltipEntries.js";
|
|
28
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
28
29
|
const LazyXDSTooltip = /*#__PURE__*/lazy(async () => import('../Tooltip/Tooltip').then(mod => ({
|
|
29
30
|
default: mod.Tooltip
|
|
30
31
|
})));
|
|
@@ -137,73 +138,6 @@ function getRelativeTimeString(date, now) {
|
|
|
137
138
|
const years = Math.floor(diffSeconds / YEAR);
|
|
138
139
|
return `${years} ${years === 1 ? 'year' : 'years'} ago`;
|
|
139
140
|
}
|
|
140
|
-
function pad(n) {
|
|
141
|
-
return String(n).padStart(2, '0');
|
|
142
|
-
}
|
|
143
|
-
function formatTimestamp(date, format, isTimezoneShown) {
|
|
144
|
-
switch (format) {
|
|
145
|
-
case 'date':
|
|
146
|
-
return new Intl.DateTimeFormat(undefined, SHARED_DATE_FORMAT_OPTIONS.date).format(date);
|
|
147
|
-
case 'date_long':
|
|
148
|
-
return new Intl.DateTimeFormat(undefined, SHARED_DATE_FORMAT_OPTIONS.date_long).format(date);
|
|
149
|
-
case 'date_weekday':
|
|
150
|
-
return new Intl.DateTimeFormat(undefined, SHARED_DATE_FORMAT_OPTIONS.date_weekday).format(date);
|
|
151
|
-
case 'date_time':
|
|
152
|
-
return new Intl.DateTimeFormat(undefined, {
|
|
153
|
-
year: 'numeric',
|
|
154
|
-
month: 'short',
|
|
155
|
-
day: 'numeric',
|
|
156
|
-
hour: 'numeric',
|
|
157
|
-
minute: '2-digit',
|
|
158
|
-
...(isTimezoneShown ? {
|
|
159
|
-
timeZoneName: 'short'
|
|
160
|
-
} : {})
|
|
161
|
-
}).format(date);
|
|
162
|
-
case 'time':
|
|
163
|
-
return new Intl.DateTimeFormat(undefined, {
|
|
164
|
-
hour: 'numeric',
|
|
165
|
-
minute: '2-digit',
|
|
166
|
-
...(isTimezoneShown ? {
|
|
167
|
-
timeZoneName: 'short'
|
|
168
|
-
} : {})
|
|
169
|
-
}).format(date);
|
|
170
|
-
case 'system_date':
|
|
171
|
-
{
|
|
172
|
-
const y = date.getFullYear();
|
|
173
|
-
const m = pad(date.getMonth() + 1);
|
|
174
|
-
const d = pad(date.getDate());
|
|
175
|
-
return `${y}-${m}-${d}`;
|
|
176
|
-
}
|
|
177
|
-
case 'system_date_time':
|
|
178
|
-
{
|
|
179
|
-
const y = date.getFullYear();
|
|
180
|
-
const m = pad(date.getMonth() + 1);
|
|
181
|
-
const d = pad(date.getDate());
|
|
182
|
-
const h = pad(date.getHours());
|
|
183
|
-
const min = pad(date.getMinutes());
|
|
184
|
-
const s = pad(date.getSeconds());
|
|
185
|
-
return `${y}-${m}-${d} ${h}:${min}:${s}`;
|
|
186
|
-
}
|
|
187
|
-
case 'system_time':
|
|
188
|
-
{
|
|
189
|
-
const h = pad(date.getHours());
|
|
190
|
-
const min = pad(date.getMinutes());
|
|
191
|
-
const s = pad(date.getSeconds());
|
|
192
|
-
return `${h}:${min}:${s}`;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
function getFullAbsoluteString(date) {
|
|
197
|
-
return new Intl.DateTimeFormat(undefined, {
|
|
198
|
-
year: 'numeric',
|
|
199
|
-
month: 'long',
|
|
200
|
-
day: 'numeric',
|
|
201
|
-
hour: 'numeric',
|
|
202
|
-
minute: '2-digit',
|
|
203
|
-
second: '2-digit',
|
|
204
|
-
timeZoneName: 'short'
|
|
205
|
-
}).format(date);
|
|
206
|
-
}
|
|
207
141
|
|
|
208
142
|
/** Returns the interval (in ms) at which a relative timestamp should update. */
|
|
209
143
|
function getLiveInterval(diffSeconds) {
|
|
@@ -250,6 +184,7 @@ export function Timestamp({
|
|
|
250
184
|
format = 'auto',
|
|
251
185
|
autoThreshold = DEFAULT_AUTO_THRESHOLD,
|
|
252
186
|
hasTooltip = true,
|
|
187
|
+
tooltipEntries,
|
|
253
188
|
isTimezoneShown = false,
|
|
254
189
|
isLive = false,
|
|
255
190
|
type = 'supporting',
|
|
@@ -276,11 +211,14 @@ export function Timestamp({
|
|
|
276
211
|
const diffSeconds = Math.round((now.getTime() - date.getTime()) / 1000);
|
|
277
212
|
const effectiveFormat = format === 'auto' ? Math.abs(diffSeconds) <= autoThreshold ? 'relative' : 'date_time' : format;
|
|
278
213
|
|
|
279
|
-
// Format the display text
|
|
280
|
-
|
|
214
|
+
// Format the display text. No time zone is passed: the visible text always
|
|
215
|
+
// reads in the viewer's own zone, and only the tooltip names others.
|
|
216
|
+
const displayText = !isValidDate ? '' : effectiveFormat === 'relative' ? getRelativeTimeString(date, now) : isAbsoluteFormat(effectiveFormat) ? formatInstant(date, effectiveFormat, {
|
|
217
|
+
isTimezoneShown
|
|
218
|
+
}) : '';
|
|
281
219
|
|
|
282
220
|
// Full absolute text for tooltip and aria-label
|
|
283
|
-
const fullAbsoluteText = isValidDate ?
|
|
221
|
+
const fullAbsoluteText = isValidDate ? formatInstant(date, 'full') : '';
|
|
284
222
|
|
|
285
223
|
// Live updates
|
|
286
224
|
useEffect(() => {
|
|
@@ -299,7 +237,16 @@ export function Timestamp({
|
|
|
299
237
|
if (!isValidDate) {
|
|
300
238
|
return null;
|
|
301
239
|
}
|
|
302
|
-
|
|
240
|
+
|
|
241
|
+
// An empty array is not a second way to spell "off" — `hasTooltip` stays the
|
|
242
|
+
// only on/off axis — so normalize it away before anything reads it.
|
|
243
|
+
const entries = tooltipEntries !== undefined && tooltipEntries.length > 0 ? tooltipEntries : undefined;
|
|
244
|
+
|
|
245
|
+
// Absolute formats have never carried a tooltip. Leaving that gate closed
|
|
246
|
+
// when a consumer has explicitly configured tooltip lines would let `format`
|
|
247
|
+
// silently suppress another prop's output, so entry presence opens it too.
|
|
248
|
+
// With no entries this reduces to the original condition exactly.
|
|
249
|
+
const showTooltip = hasTooltip && (effectiveFormat === 'relative' || entries !== undefined);
|
|
303
250
|
const timestampProps = mergeProps(themeProps('timestamp', {
|
|
304
251
|
format: effectiveFormat
|
|
305
252
|
}), {
|
|
@@ -338,12 +285,36 @@ export function Timestamp({
|
|
|
338
285
|
})
|
|
339
286
|
});
|
|
340
287
|
if (showTooltip) {
|
|
288
|
+
// Built inside the branch so a timestamp without a tooltip allocates none
|
|
289
|
+
// of it. With no entries the content stays the bare string it has always
|
|
290
|
+
// been — no wrapper element is introduced around the default line.
|
|
291
|
+
const tooltipContent = entries === undefined ? fullAbsoluteText : /*#__PURE__*/_jsx("dl", {
|
|
292
|
+
...{
|
|
293
|
+
className: "xrvj5dj x1pmbctz x1tw44j4 x10im51j xrxpjvj"
|
|
294
|
+
},
|
|
295
|
+
children: formatTooltipLines(date, entries).map((line, index) =>
|
|
296
|
+
/*#__PURE__*/
|
|
297
|
+
// eslint-disable-next-line @eslint-react/no-array-index-key -- tooltip lines are fixed positional slots and two entries may legitimately be identical
|
|
298
|
+
_jsxs(Fragment, {
|
|
299
|
+
children: [/*#__PURE__*/_jsx("dt", {
|
|
300
|
+
...{
|
|
301
|
+
className: "x10im51j xrxpjvj xyri2b xepvkrk"
|
|
302
|
+
},
|
|
303
|
+
children: line.label ?? ''
|
|
304
|
+
}), /*#__PURE__*/_jsx("dd", {
|
|
305
|
+
...{
|
|
306
|
+
className: "x10im51j xrxpjvj"
|
|
307
|
+
},
|
|
308
|
+
children: line.value
|
|
309
|
+
})]
|
|
310
|
+
}, index))
|
|
311
|
+
});
|
|
341
312
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
342
313
|
children: [timeElement, /*#__PURE__*/_jsx(Suspense, {
|
|
343
314
|
fallback: null,
|
|
344
315
|
children: /*#__PURE__*/_jsx(LazyXDSTooltip, {
|
|
345
316
|
anchorRef: timeRef,
|
|
346
|
-
content:
|
|
317
|
+
content: tooltipContent,
|
|
347
318
|
placement: "above"
|
|
348
319
|
})
|
|
349
320
|
})]
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { TimestampFormat } from './Timestamp';
|
|
2
|
+
/**
|
|
3
|
+
* Every format that names a fixed instant, plus `'full'` — the long absolute
|
|
4
|
+
* style ("February 19, 2026 at 5:00:00 PM UTC") that backs a relative
|
|
5
|
+
* timestamp's accessible name and the tooltip's default line.
|
|
6
|
+
*
|
|
7
|
+
* `'relative'` and `'auto'` are excluded: a relative phrase names no instant,
|
|
8
|
+
* so a zone could not change what it says.
|
|
9
|
+
*/
|
|
10
|
+
export type InstantFormat = Exclude<TimestampFormat, 'relative' | 'auto'> | 'full';
|
|
11
|
+
export interface FormatInstantOptions {
|
|
12
|
+
/**
|
|
13
|
+
* IANA time zone identifier. Omit for the viewer's own zone — which is what
|
|
14
|
+
* `Intl` already does with no `timeZone`, so the omitted path never
|
|
15
|
+
* constructs an explicit-zone formatter and cannot drift from the host
|
|
16
|
+
* default.
|
|
17
|
+
*
|
|
18
|
+
* Must already be one the platform accepts. An identifier `Intl` does not
|
|
19
|
+
* recognize throws a `RangeError` from its constructor, before any
|
|
20
|
+
* formatting happens; deciding what to do about that belongs to whoever
|
|
21
|
+
* took the identifier from a consumer, not here (tooltipEntries resolves
|
|
22
|
+
* and warns in `resolveTimezoneID`, then passes only what survived).
|
|
23
|
+
*/
|
|
24
|
+
timeZone?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Whether to append the zone abbreviation. Honoured by `date_time` and
|
|
27
|
+
* `time` only: `'full'` always carries one because that is the style, and
|
|
28
|
+
* the `system_*` shapes never do — a trailing "PST" would break anything
|
|
29
|
+
* parsing them, which is why `isTimezoneShown` has never applied to them.
|
|
30
|
+
* @default false
|
|
31
|
+
*/
|
|
32
|
+
isTimezoneShown?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Renders one instant in one absolute format.
|
|
36
|
+
*
|
|
37
|
+
* Pure: the same arguments always produce the same string for a given host
|
|
38
|
+
* locale (and, when no `timeZone` is given, host zone).
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatInstant(date: Date, format: InstantFormat, { timeZone, isTimezoneShown }?: FormatInstantOptions): string;
|
|
41
|
+
//# sourceMappingURL=formatInstant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatInstant.d.ts","sourceRoot":"","sources":["../../src/Timestamp/formatInstant.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,aAAa,CAAC;AAMjD;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GACrB,OAAO,CAAC,eAAe,EAAE,UAAU,GAAG,MAAM,CAAC,GAC7C,MAAM,CAAC;AAEX,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA6ED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,aAAa,EACrB,EAAC,QAAQ,EAAE,eAAuB,EAAC,GAAE,oBAAyB,GAC7D,MAAM,CA0DR"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file formatInstant.ts
|
|
5
|
+
* @input A Date, one absolute format name, and an optional time zone
|
|
6
|
+
* @output That instant rendered as a string
|
|
7
|
+
* @position Leaf shared by Timestamp's visible text and each of its tooltip
|
|
8
|
+
* lines; owns every absolute format Timestamp can produce
|
|
9
|
+
*
|
|
10
|
+
* Timestamp renders the same instant on two surfaces — the visible text and,
|
|
11
|
+
* on hover, one line per configured time zone. They differ only in which zone
|
|
12
|
+
* they name and whether they carry a zone abbreviation, so they are one
|
|
13
|
+
* formatter parameterized by zone rather than two switches that have to be
|
|
14
|
+
* kept in step by hand. Adding a member to `TimestampFormat` now fails to
|
|
15
|
+
* compile in exactly one place.
|
|
16
|
+
*
|
|
17
|
+
* Each caller keeps its own policy for the zone abbreviation: the visible text
|
|
18
|
+
* takes it straight from the `isTimezoneShown` prop, a tooltip line derives it
|
|
19
|
+
* from how many zones are on screen (see tooltipEntries.ts). Only the
|
|
20
|
+
* rendering is shared, not the decision.
|
|
21
|
+
*
|
|
22
|
+
* Omitting `timeZone` means the viewer's own zone. That path hands `Intl` no
|
|
23
|
+
* `timeZone` and keeps `system_*` on plain `Date` getters, so it produces
|
|
24
|
+
* exactly what it produced before this module existed.
|
|
25
|
+
*
|
|
26
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
27
|
+
* - /packages/core/src/Timestamp/Timestamp.tsx
|
|
28
|
+
* - /packages/core/src/Timestamp/tooltipEntries.ts
|
|
29
|
+
* - /packages/core/src/Timestamp/Timestamp.test.tsx
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
import { SHARED_DATE_FORMAT_OPTIONS, getTimeZoneParts } from "../utils/plainDate.js";
|
|
33
|
+
|
|
34
|
+
// =============================================================================
|
|
35
|
+
// Types
|
|
36
|
+
// =============================================================================
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Every format that names a fixed instant, plus `'full'` — the long absolute
|
|
40
|
+
* style ("February 19, 2026 at 5:00:00 PM UTC") that backs a relative
|
|
41
|
+
* timestamp's accessible name and the tooltip's default line.
|
|
42
|
+
*
|
|
43
|
+
* `'relative'` and `'auto'` are excluded: a relative phrase names no instant,
|
|
44
|
+
* so a zone could not change what it says.
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// Option bags
|
|
49
|
+
// =============================================================================
|
|
50
|
+
|
|
51
|
+
/** The long absolute style, with seconds and a zone name. */
|
|
52
|
+
const FULL_OPTIONS = {
|
|
53
|
+
year: 'numeric',
|
|
54
|
+
month: 'long',
|
|
55
|
+
day: 'numeric',
|
|
56
|
+
hour: 'numeric',
|
|
57
|
+
minute: '2-digit',
|
|
58
|
+
second: '2-digit',
|
|
59
|
+
timeZoneName: 'short'
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/** The time-of-day part, shared by `time` and `date_time`. */
|
|
63
|
+
const TIME_OPTIONS = {
|
|
64
|
+
hour: 'numeric',
|
|
65
|
+
minute: '2-digit'
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The date part here is spelled out rather than taken from
|
|
70
|
+
* `SHARED_DATE_FORMAT_OPTIONS.date`. That bag is shared with DateInput, and
|
|
71
|
+
* pointing `date_time` at it would mean a change made for date-only fields
|
|
72
|
+
* silently reshaped every date-and-time reading too. The two agree today; they
|
|
73
|
+
* are not the same decision.
|
|
74
|
+
*/
|
|
75
|
+
const DATE_TIME_OPTIONS = {
|
|
76
|
+
year: 'numeric',
|
|
77
|
+
month: 'short',
|
|
78
|
+
day: 'numeric',
|
|
79
|
+
...TIME_OPTIONS
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// =============================================================================
|
|
83
|
+
// Formatting
|
|
84
|
+
// =============================================================================
|
|
85
|
+
|
|
86
|
+
function pad(n) {
|
|
87
|
+
return String(n).padStart(2, '0');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** The fields a `system_*` string is assembled from. */
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Wall-clock fields for an instant: in the named zone, or — with no zone —
|
|
94
|
+
* the viewer's own, read straight off the `Date`. The zone-less branch
|
|
95
|
+
* deliberately stays on plain getters so the default rendering never gains a
|
|
96
|
+
* dependency on `Intl` zone data it did not have before.
|
|
97
|
+
*
|
|
98
|
+
* The explicit return type is load-bearing: it is what forces the two branches
|
|
99
|
+
* to keep producing the same shape.
|
|
100
|
+
*/
|
|
101
|
+
function getWallClock(date, timeZone) {
|
|
102
|
+
return timeZone === undefined ? {
|
|
103
|
+
year: date.getFullYear(),
|
|
104
|
+
month: date.getMonth() + 1,
|
|
105
|
+
day: date.getDate(),
|
|
106
|
+
hour: date.getHours(),
|
|
107
|
+
minute: date.getMinutes(),
|
|
108
|
+
second: date.getSeconds()
|
|
109
|
+
} : getTimeZoneParts(date.getTime(), timeZone);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Renders one instant in one absolute format.
|
|
114
|
+
*
|
|
115
|
+
* Pure: the same arguments always produce the same string for a given host
|
|
116
|
+
* locale (and, when no `timeZone` is given, host zone).
|
|
117
|
+
*/
|
|
118
|
+
export function formatInstant(date, format, {
|
|
119
|
+
timeZone,
|
|
120
|
+
isTimezoneShown = false
|
|
121
|
+
} = {}) {
|
|
122
|
+
const zone = timeZone === undefined ? {} : {
|
|
123
|
+
timeZone
|
|
124
|
+
};
|
|
125
|
+
const zoneName = isTimezoneShown ? {
|
|
126
|
+
timeZoneName: 'short'
|
|
127
|
+
} : {};
|
|
128
|
+
switch (format) {
|
|
129
|
+
case 'full':
|
|
130
|
+
return new Intl.DateTimeFormat(undefined, {
|
|
131
|
+
...FULL_OPTIONS,
|
|
132
|
+
...zone
|
|
133
|
+
}).format(date);
|
|
134
|
+
case 'date':
|
|
135
|
+
return new Intl.DateTimeFormat(undefined, {
|
|
136
|
+
...SHARED_DATE_FORMAT_OPTIONS.date,
|
|
137
|
+
...zone
|
|
138
|
+
}).format(date);
|
|
139
|
+
case 'date_long':
|
|
140
|
+
return new Intl.DateTimeFormat(undefined, {
|
|
141
|
+
...SHARED_DATE_FORMAT_OPTIONS.date_long,
|
|
142
|
+
...zone
|
|
143
|
+
}).format(date);
|
|
144
|
+
case 'date_weekday':
|
|
145
|
+
return new Intl.DateTimeFormat(undefined, {
|
|
146
|
+
...SHARED_DATE_FORMAT_OPTIONS.date_weekday,
|
|
147
|
+
...zone
|
|
148
|
+
}).format(date);
|
|
149
|
+
case 'date_time':
|
|
150
|
+
return new Intl.DateTimeFormat(undefined, {
|
|
151
|
+
...DATE_TIME_OPTIONS,
|
|
152
|
+
...zoneName,
|
|
153
|
+
...zone
|
|
154
|
+
}).format(date);
|
|
155
|
+
case 'time':
|
|
156
|
+
return new Intl.DateTimeFormat(undefined, {
|
|
157
|
+
...TIME_OPTIONS,
|
|
158
|
+
...zoneName,
|
|
159
|
+
...zone
|
|
160
|
+
}).format(date);
|
|
161
|
+
case 'system_date':
|
|
162
|
+
{
|
|
163
|
+
const w = getWallClock(date, timeZone);
|
|
164
|
+
return `${w.year}-${pad(w.month)}-${pad(w.day)}`;
|
|
165
|
+
}
|
|
166
|
+
case 'system_date_time':
|
|
167
|
+
{
|
|
168
|
+
const w = getWallClock(date, timeZone);
|
|
169
|
+
return `${w.year}-${pad(w.month)}-${pad(w.day)} ${pad(w.hour)}:${pad(w.minute)}:${pad(w.second)}`;
|
|
170
|
+
}
|
|
171
|
+
case 'system_time':
|
|
172
|
+
{
|
|
173
|
+
const w = getWallClock(date, timeZone);
|
|
174
|
+
return `${pad(w.hour)}:${pad(w.minute)}:${pad(w.second)}`;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Timestamp/index.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,YAAY,EAAC,cAAc,EAAE,eAAe,EAAC,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Timestamp/index.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,YAAY,EAAC,cAAc,EAAE,eAAe,EAAC,MAAM,aAAa,CAAC;AACjE,YAAY,EACV,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { InstantFormat } from './formatInstant';
|
|
2
|
+
/**
|
|
3
|
+
* Formats available to a tooltip line.
|
|
4
|
+
*
|
|
5
|
+
* Every `TimestampFormat` that names a fixed instant, plus `'full'` — the long
|
|
6
|
+
* absolute style the tooltip has always shown ("February 19, 2026 at 5:00:00 PM
|
|
7
|
+
* UTC"). `'relative'` and `'auto'` are excluded: a relative phrase ignores any
|
|
8
|
+
* zone, which would make `timezoneID` silently inert on that line.
|
|
9
|
+
*
|
|
10
|
+
* `'full'` lives only in this vocabulary, never in `TimestampFormat` — nothing
|
|
11
|
+
* asked for it as a visible display format, and keeping it out means new
|
|
12
|
+
* members added to `TimestampFormat` become valid tooltip formats for free.
|
|
13
|
+
*
|
|
14
|
+
* The public spelling of {@link InstantFormat}: consumers reading Timestamp's
|
|
15
|
+
* props should not have to know the name of its internal formatter.
|
|
16
|
+
*/
|
|
17
|
+
export type TimestampTooltipFormat = InstantFormat;
|
|
18
|
+
/** One line of the Timestamp tooltip. */
|
|
19
|
+
export interface TimestampTooltipEntry {
|
|
20
|
+
/**
|
|
21
|
+
* IANA time zone identifier, e.g. `'UTC'`, `'America/Los_Angeles'`.
|
|
22
|
+
* Omit it — or pass `'local'` — for the viewer's own zone.
|
|
23
|
+
*
|
|
24
|
+
* Prefer region identifiers. Fixed-offset abbreviations such as `'EST'` are
|
|
25
|
+
* accepted by the platform but never observe daylight saving, so they read
|
|
26
|
+
* an hour wrong for half the year — `'America/New_York'` is what people
|
|
27
|
+
* usually mean by "Eastern".
|
|
28
|
+
*
|
|
29
|
+
* An identifier the platform does not recognize falls back to the viewer's
|
|
30
|
+
* zone with a console warning rather than throwing.
|
|
31
|
+
*/
|
|
32
|
+
timezoneID?: string;
|
|
33
|
+
/**
|
|
34
|
+
* How this line renders the instant.
|
|
35
|
+
* @default 'full'
|
|
36
|
+
*/
|
|
37
|
+
format?: TimestampTooltipFormat;
|
|
38
|
+
/**
|
|
39
|
+
* Text shown beside the time, e.g. `'Local'`, `'UTC'`, `'Pacific'`.
|
|
40
|
+
* Supplied already translated; Timestamp never invents or localizes labels.
|
|
41
|
+
*/
|
|
42
|
+
label?: string;
|
|
43
|
+
}
|
|
44
|
+
/** A rendered tooltip line. */
|
|
45
|
+
export interface TimestampTooltipLine {
|
|
46
|
+
label?: string;
|
|
47
|
+
value: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Renders one tooltip line per entry, in the order given.
|
|
51
|
+
*
|
|
52
|
+
* Pure: the same `date` and `entries` always produce the same lines for a given
|
|
53
|
+
* host zone and locale.
|
|
54
|
+
*/
|
|
55
|
+
export declare function formatTooltipLines(date: Date, entries: ReadonlyArray<TimestampTooltipEntry>): ReadonlyArray<TimestampTooltipLine>;
|
|
56
|
+
//# sourceMappingURL=tooltipEntries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltipEntries.d.ts","sourceRoot":"","sources":["../../src/Timestamp/tooltipEntries.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAMnD;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,sBAAsB,GAAG,aAAa,CAAC;AAEnD,yCAAyC;AACzC,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,+BAA+B;AAC/B,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAqGD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,aAAa,CAAC,qBAAqB,CAAC,GAC5C,aAAa,CAAC,oBAAoB,CAAC,CAoBrC"}
|