@astryxdesign/core 0.7.5 → 0.7.6-canary.0ef60dd
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/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +5 -5
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +12 -3
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +7 -1
- package/dist/BottomSheet/BottomSheet.js +1 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +2 -1
- package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +30 -3
- package/dist/Button/Button.js +4 -4
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +6 -5
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +37 -4
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +12 -4
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +101 -15
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +8 -3
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +23 -12
- package/dist/DateTimeInput/NativeTimeSegment.d.ts.map +1 -1
- package/dist/DateTimeInput/NativeTimeSegment.js +5 -4
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +4 -3
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +34 -9
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +5 -4
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +2 -1
- package/dist/Drawer/Drawer.d.ts +1 -0
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +7 -2
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +7 -3
- package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +20 -2
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
- package/dist/DropdownMenu/lazyMenuBottomSheet.js +31 -3
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -16
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +2 -1
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +4 -4
- package/dist/Field/InputClearButton.js +3 -3
- package/dist/Field/PanelSearchInput.js +2 -2
- package/dist/FieldStatus/FieldStatus.js +2 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +7 -1
- package/dist/Heading/Heading.js +1 -1
- package/dist/Icon/Icon.js +1 -1
- package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckIndicator.js +2 -1
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +3 -1
- package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
- package/dist/Indicator/RadioIndicator.js +3 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +2 -1
- package/dist/Item/ItemSwipeLayer.js +1 -1
- package/dist/Layer/popoverOperations.d.ts +27 -0
- package/dist/Layer/popoverOperations.d.ts.map +1 -0
- package/dist/Layer/popoverOperations.js +159 -0
- package/dist/Layer/useLayer.d.ts +1 -1
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +93 -59
- package/dist/Layout/Layout.js +1 -1
- package/dist/Layout/LayoutContent.js +1 -1
- package/dist/Layout/LayoutFooter.js +1 -1
- package/dist/Layout/LayoutHeader.js +1 -1
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +5 -0
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
- package/dist/List/List.js +1 -1
- package/dist/List/ListItem.js +3 -3
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +7 -2
- package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +7 -6
- package/dist/MultiSelector/MultiSelector.d.ts +1 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +26 -10
- package/dist/NumberInput/NumberInput.d.ts +3 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +3 -3
- package/dist/NumberInput/numberParser.d.ts +3 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -1
- package/dist/NumberInput/numberParser.js +7 -44
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +16 -12
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +28 -2
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
- package/dist/Selector/useSelectorPresentation.d.ts +8 -1
- package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
- package/dist/Selector/useSelectorPresentation.js +20 -4
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +1 -1
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +10 -2
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +3 -3
- package/dist/Stack/Stack.js +1 -1
- package/dist/Stack/StackItem.js +1 -1
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +16 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
- package/dist/Text/Text.js +1 -1
- package/dist/Text/useTruncation.d.ts.map +1 -1
- package/dist/Text/useTruncation.js +23 -5
- package/dist/TextArea/TextArea.d.ts +1 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +13 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -3
- package/dist/TimeInput/TimeInput.d.ts +6 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +21 -14
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
- package/dist/TimeInput/TouchTimeField.js +5 -4
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +2 -2
- package/dist/Timestamp/TimestampHoverCard.js +4 -4
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +60 -20
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +82 -51
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +13 -2
- package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
- package/dist/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar/Toolbar.js +2 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +3 -0
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +1 -0
- package/dist/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +9 -1
- package/dist/astryx.css +20 -4
- package/dist/gestures/GestureArena.d.ts +6 -0
- package/dist/gestures/GestureArena.d.ts.map +1 -1
- package/dist/gestures/GestureArena.js +39 -0
- package/dist/gestures/GestureHost.d.ts +352 -0
- package/dist/gestures/GestureHost.d.ts.map +1 -0
- package/dist/gestures/GestureHost.js +1773 -0
- package/dist/gestures/GestureRecognizer.d.ts +10 -0
- package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/GestureRecognizer.js +16 -0
- package/dist/gestures/LongPressGestureRecognizer.d.ts +1 -0
- package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/LongPressGestureRecognizer.js +3 -0
- package/dist/gestures/PanGestureRecognizer.d.ts +1 -0
- package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/PanGestureRecognizer.js +3 -0
- package/dist/gestures/PinchGestureRecognizer.d.ts +31 -0
- package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/PinchGestureRecognizer.js +128 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +71 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.js +223 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts +37 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/SwipeGestureRecognizer.js +148 -0
- package/dist/gestures/TapGestureRecognizer.d.ts +1 -0
- package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/TapGestureRecognizer.js +3 -0
- package/dist/gestures/VelocityTracker.d.ts +6 -2
- package/dist/gestures/VelocityTracker.d.ts.map +1 -1
- package/dist/gestures/VelocityTracker.js +7 -3
- package/dist/gestures/haptics.d.ts +65 -0
- package/dist/gestures/haptics.d.ts.map +1 -0
- package/dist/gestures/haptics.js +182 -0
- package/dist/gestures/nativeScroll.d.ts +42 -0
- package/dist/gestures/nativeScroll.d.ts.map +1 -0
- package/dist/gestures/nativeScroll.js +228 -0
- package/dist/gestures/touchAction.d.ts +60 -0
- package/dist/gestures/touchAction.d.ts.map +1 -0
- package/dist/gestures/touchAction.js +157 -0
- package/dist/gestures/touchActionRule.d.ts +34 -0
- package/dist/gestures/touchActionRule.d.ts.map +1 -0
- package/dist/gestures/touchActionRule.js +140 -0
- package/dist/gestures/types.d.ts +18 -7
- package/dist/gestures/types.d.ts.map +1 -1
- package/dist/gestures/types.js +22 -2
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/modalAnnounce.d.ts.map +1 -1
- package/dist/hooks/modalAnnounce.js +107 -61
- package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
- package/dist/hooks/useAdaptivePresentation.js +4 -1
- package/dist/hooks/useAnnounce.d.ts +101 -42
- package/dist/hooks/useAnnounce.d.ts.map +1 -1
- package/dist/hooks/useAnnounce.js +161 -75
- package/dist/hooks/useAnnounceRenderedText.d.ts +11 -3
- package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
- package/dist/hooks/useAnnounceRenderedText.js +5 -3
- package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
- package/dist/hooks/useBusyAnnouncement.js +6 -12
- package/dist/hooks/useMenuHover.d.ts.map +1 -1
- package/dist/hooks/useMenuHover.js +12 -1
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +5 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +5 -0
- package/dist/motion/animator.d.ts +7 -1
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +119 -27
- package/dist/theme/defineTheme.d.ts +19 -5
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +64 -4
- package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
- package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
- package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
- package/dist/theme/domainTokens/index.d.ts +5 -4
- package/dist/theme/domainTokens/index.d.ts.map +1 -1
- package/dist/theme/domainTokens/index.js +5 -9
- package/dist/theme/index.d.ts +1 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/motionKnobs.d.ts +56 -0
- package/dist/theme/motionKnobs.d.ts.map +1 -0
- package/dist/theme/motionKnobs.js +48 -0
- package/dist/theme/resolveThemeValues.d.ts +11 -4
- package/dist/theme/resolveThemeValues.d.ts.map +1 -1
- package/dist/theme/resolveThemeValues.js +40 -4
- package/dist/theme/themeAdaptations.d.ts +7 -3
- package/dist/theme/themeAdaptations.d.ts.map +1 -1
- package/dist/theme/themeAdaptations.js +36 -7
- package/dist/theme/themeMotion.d.ts +96 -0
- package/dist/theme/themeMotion.d.ts.map +1 -0
- package/dist/theme/themeMotion.js +177 -0
- package/dist/theme/tokenReferences.d.ts +31 -0
- package/dist/theme/tokenReferences.d.ts.map +1 -0
- package/dist/theme/tokenReferences.js +132 -0
- package/dist/theme/tokens.d.ts +1 -0
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +9 -129
- package/dist/theme/tokens.stylex.d.ts +12 -0
- package/dist/theme/tokens.stylex.d.ts.map +1 -1
- package/dist/theme/tokens.stylex.js +12 -0
- package/dist/utils/focusReturn.d.ts +17 -1
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +11 -4
- package/dist/utils/getNodeText.d.ts +8 -0
- package/dist/utils/getNodeText.d.ts.map +1 -0
- package/dist/utils/getNodeText.js +37 -0
- package/dist/utils/interactionModality.d.ts +11 -2
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +58 -5
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +17 -8
- package/dist/utils/plainDate.d.ts +2 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +46 -3
- package/dist/utils/presentation.d.ts +50 -0
- package/dist/utils/presentation.d.ts.map +1 -0
- package/dist/utils/presentation.js +125 -0
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +20 -1
- package/dist/utils/primaryClick.d.ts +11 -0
- package/dist/utils/primaryClick.d.ts.map +1 -0
- package/dist/utils/primaryClick.js +25 -0
- package/dist/utils/timeFormat.d.ts +47 -0
- package/dist/utils/timeFormat.d.ts.map +1 -0
- package/dist/utils/timeFormat.js +240 -0
- package/dist/utils/touchPresentation.d.ts.map +1 -1
- package/dist/utils/touchPresentation.js +5 -3
- package/dist/utils/touchPresentation.stylex.d.ts +15 -0
- package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
- package/dist/utils/touchPresentation.stylex.js +33 -0
- package/dist/utils/unicodeDigits.d.ts +20 -0
- package/dist/utils/unicodeDigits.d.ts.map +1 -0
- package/dist/utils/unicodeDigits.js +70 -0
- package/locales/en.json +23 -3
- package/locales/pseudo.json +15 -0
- package/package.json +5 -4
- package/src/AlertDialog/AlertDialog.tsx +6 -5
- package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
- package/src/Avatar/Avatar.spec.md +22 -22
- package/src/Avatar/Avatar.tsx +18 -1
- package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
- package/src/Badge/Badge.doc.mjs +1 -1
- package/src/Badge/Badge.tsx +19 -2
- package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +260 -0
- package/src/BottomSheet/BottomSheet.test.tsx +46 -0
- package/src/BottomSheet/BottomSheet.tsx +1 -1
- package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
- package/src/BottomSheet/useSheetGestures.test.ts +52 -0
- package/src/BottomSheet/useSheetGestures.ts +37 -6
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
- package/src/Button/Button.tsx +4 -4
- package/src/Calendar/Calendar.spec.md +87 -48
- package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
- package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
- package/src/CheckboxInput/CheckboxInput.tsx +6 -5
- package/src/ClickableCard/ClickableCard.test.tsx +96 -0
- package/src/ClickableCard/ClickableCard.tsx +48 -4
- package/src/Collapsible/Collapsible.spec.md +2 -0
- package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
- package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
- package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
- package/src/ComplexSelector/ComplexSelector.test.tsx +37 -0
- package/src/ContextMenu/ContextMenu.test.tsx +35 -0
- package/src/DateInput/DateInput.test.tsx +115 -3
- package/src/DateInput/DateInput.tsx +29 -14
- package/src/DateInput/DateInputTouch.test.tsx +76 -0
- package/src/DateInput/MonthScroller.tsx +106 -20
- package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
- package/src/DateInput/TouchDateField.tsx +14 -3
- package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
- package/src/DateRangeInput/DateRangeInput.tsx +16 -12
- package/src/DateTimeInput/DateTimeInput.doc.mjs +10 -8
- package/src/DateTimeInput/DateTimeInput.spec.md +75 -51
- package/src/DateTimeInput/DateTimeInput.test.tsx +81 -0
- package/src/DateTimeInput/DateTimeInput.tsx +46 -24
- package/src/DateTimeInput/NativeTimeSegment.tsx +4 -6
- package/src/DateTimeInput/TouchDateTimeField.tsx +3 -7
- package/src/Dialog/Dialog.test.tsx +216 -2
- package/src/Dialog/Dialog.tsx +42 -9
- package/src/Dialog/DialogHeader.tsx +5 -4
- package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
- package/src/Divider/Divider.tsx +2 -1
- package/src/Drawer/Drawer.spec.md +111 -80
- package/src/Drawer/Drawer.test.tsx +35 -0
- package/src/Drawer/Drawer.tsx +13 -2
- package/src/Drawer/DrawerHeader.spec.md +181 -0
- package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +267 -0
- package/src/DropdownMenu/DropdownMenu.test.tsx +41 -0
- package/src/DropdownMenu/DropdownMenu.tsx +10 -3
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
- package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
- package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
- package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
- package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +60 -0
- package/src/DropdownMenu/lazyMenuBottomSheet.ts +36 -7
- package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
- package/src/EmptyState/EmptyState.tsx +2 -1
- package/src/Field/FieldLabel.tsx +5 -4
- package/src/Field/InputClearButton.tsx +3 -3
- package/src/Field/PanelSearchInput.tsx +2 -2
- package/src/FieldStatus/FieldStatus.tsx +2 -2
- package/src/FileInput/FileInput.test.tsx +21 -0
- package/src/FileInput/FileInput.tsx +4 -1
- package/src/FormLayout/FormLayout.spec.md +7 -8
- package/src/Heading/Heading.tsx +1 -1
- package/src/Icon/Icon.tsx +1 -1
- package/src/Indicator/CheckIndicator.spec.md +47 -42
- package/src/Indicator/CheckIndicator.tsx +2 -1
- package/src/Indicator/CheckboxIndicator.spec.md +40 -37
- package/src/Indicator/CheckboxIndicator.tsx +3 -1
- package/src/Indicator/Indicator.spec.md +188 -0
- package/src/Indicator/RadioIndicator.tsx +3 -1
- package/src/Item/Item.tsx +2 -1
- package/src/Item/ItemSwipeLayer.tsx +1 -1
- package/src/Kbd/Kbd.spec.md +81 -38
- package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +126 -0
- package/src/Layer/popoverOperations.test.ts +205 -0
- package/src/Layer/popoverOperations.ts +172 -0
- package/src/Layer/useLayer.test.tsx +348 -1
- package/src/Layer/useLayer.tsx +118 -71
- package/src/Layout/Layout.spec.md +127 -131
- package/src/Layout/Layout.tsx +1 -1
- package/src/Layout/LayoutContent.spec.md +205 -0
- package/src/Layout/LayoutContent.tsx +1 -1
- package/src/Layout/LayoutFooter.spec.md +190 -0
- package/src/Layout/LayoutFooter.tsx +1 -1
- package/src/Layout/LayoutHeader.spec.md +193 -0
- package/src/Layout/LayoutHeader.tsx +1 -1
- package/src/Layout/LayoutPanel.spec.md +194 -0
- package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
- package/src/Lightbox/Lightbox.test.tsx +18 -0
- package/src/Lightbox/Lightbox.tsx +5 -0
- package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
- package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
- package/src/List/List.tsx +1 -1
- package/src/List/ListItem.spec.md +205 -0
- package/src/List/ListItem.tsx +3 -3
- package/src/MetadataList/MetadataList.spec.md +187 -0
- package/src/MetadataList/MetadataListItem.spec.md +165 -0
- package/src/MobileNav/MobileNav.test.tsx +15 -0
- package/src/MobileNav/MobileNav.tsx +9 -1
- package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
- package/src/MoreMenu/MoreMenu.test.tsx +11 -0
- package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +7 -8
- package/src/MultiSelector/MultiSelector.spec.md +7 -4
- package/src/MultiSelector/MultiSelector.test.tsx +270 -1
- package/src/MultiSelector/MultiSelector.tsx +25 -10
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
- package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
- package/src/NumberInput/NumberInput.doc.mjs +13 -7
- package/src/NumberInput/NumberInput.spec.md +59 -37
- package/src/NumberInput/NumberInput.tsx +13 -3
- package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
- package/src/NumberInput/numberParser.ts +7 -45
- package/src/ProgressBar/ProgressBar.test.tsx +108 -32
- package/src/ProgressBar/ProgressBar.tsx +58 -10
- package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
- package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
- package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
- package/src/Resizable/useResizable.test.ts +43 -0
- package/src/Resizable/useResizable.ts +32 -9
- package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
- package/src/Selector/Selector.test.tsx +90 -1
- package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
- package/src/Selector/useSelectorPresentation.ts +31 -3
- package/src/SideNav/SideNav.test.tsx +27 -0
- package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
- package/src/Skeleton/Skeleton.tsx +3 -1
- package/src/Slider/Slider.test.tsx +31 -0
- package/src/Slider/Slider.tsx +8 -3
- package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
- package/src/Spinner/Spinner.tsx +5 -3
- package/src/Stack/Stack.tsx +1 -1
- package/src/Stack/StackItem.tsx +1 -1
- package/src/TabList/TabList.test.tsx +58 -4
- package/src/TabList/TabList.tsx +16 -1
- package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
- package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
- package/src/Text/Text.tsx +1 -1
- package/src/Text/useTruncation.test.tsx +128 -1
- package/src/Text/useTruncation.ts +23 -5
- package/src/TextArea/TextArea.spec.md +10 -13
- package/src/TextArea/TextArea.test.tsx +60 -0
- package/src/TextArea/TextArea.tsx +15 -1
- package/src/TextInput/TextInput.test.tsx +21 -0
- package/src/TextInput/TextInput.tsx +3 -1
- package/src/TimeInput/NativeTimeInput.test.tsx +17 -0
- package/src/TimeInput/Presentation.test.tsx +21 -0
- package/src/TimeInput/TimeInput.doc.mjs +8 -8
- package/src/TimeInput/TimeInput.spec.md +45 -48
- package/src/TimeInput/TimeInput.test.tsx +76 -0
- package/src/TimeInput/TimeInput.tsx +36 -18
- package/src/TimeInput/TouchTimeField.tsx +4 -6
- package/src/Timestamp/Timestamp.spec.md +6 -12
- package/src/Timestamp/Timestamp.test.tsx +30 -5
- package/src/Timestamp/Timestamp.tsx +6 -2
- package/src/Timestamp/TimestampHoverCard.tsx +4 -4
- package/src/Toast/Toast.spec.md +14 -20
- package/src/Toast/Toast.tsx +104 -36
- package/src/Toast/ToastViewport.test.tsx +719 -1
- package/src/Toast/ToastViewport.tsx +100 -50
- package/src/Tokenizer/Tokenizer.spec.md +5 -3
- package/src/Tokenizer/Tokenizer.test.tsx +68 -0
- package/src/Tokenizer/Tokenizer.tsx +14 -2
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +15 -4
- package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
- package/src/Toolbar/Toolbar.spec.md +5 -6
- package/src/Toolbar/Toolbar.test.tsx +30 -0
- package/src/Toolbar/Toolbar.tsx +2 -1
- package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
- package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
- package/src/TopNav/TopNav.test.tsx +27 -0
- package/src/TopNav/TopNavMegaMenu.test.tsx +21 -0
- package/src/TopNav/TopNavMegaMenu.tsx +4 -1
- package/src/TopNav/TopNavMenu.test.tsx +17 -0
- package/src/TopNav/TopNavMenu.tsx +1 -0
- package/src/Typeahead/Typeahead.test.tsx +40 -0
- package/src/Typeahead/Typeahead.tsx +12 -1
- package/src/__tests__/pressState.ts +8 -4
- package/src/gestures/GestureArena.ts +35 -0
- package/src/gestures/GestureHost.ts +2065 -0
- package/src/gestures/GestureRecognizer.ts +18 -0
- package/src/gestures/LongPressGestureRecognizer.ts +4 -0
- package/src/gestures/PanGestureRecognizer.ts +4 -0
- package/src/gestures/PinchGestureRecognizer.ts +148 -0
- package/src/gestures/ScreenEdgePanGestureRecognizer.ts +256 -0
- package/src/gestures/SwipeGestureRecognizer.ts +197 -0
- package/src/gestures/TapGestureRecognizer.ts +4 -0
- package/src/gestures/VelocityTracker.ts +10 -3
- package/src/gestures/__tests__/GestureHost.test.ts +2087 -0
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
- package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
- package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
- package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
- package/src/gestures/__tests__/arena.test.ts +5 -0
- package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +193 -0
- package/src/gestures/__tests__/browser/build-fixture.mjs +46 -0
- package/src/gestures/__tests__/browser/fixture.ts +307 -0
- package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +1137 -0
- package/src/gestures/__tests__/browserNegotiation.test.ts +293 -0
- package/src/gestures/__tests__/haptics.test.ts +187 -0
- package/src/gestures/__tests__/harness.ts +21 -2
- package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
- package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
- package/src/gestures/haptics.ts +203 -0
- package/src/gestures/nativeScroll.ts +277 -0
- package/src/gestures/touchAction.ts +191 -0
- package/src/gestures/touchActionRule.ts +157 -0
- package/src/gestures/types.ts +30 -9
- package/src/hooks/index.ts +5 -1
- package/src/hooks/modalAnnounce.ts +129 -72
- package/src/hooks/useAdaptivePresentation.ts +4 -1
- package/src/hooks/useAnnounce.doc.mjs +35 -3
- package/src/hooks/useAnnounce.replace.test.tsx +516 -0
- package/src/hooks/useAnnounce.ts +209 -102
- package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +10 -1
- package/src/hooks/useAnnounceRenderedText.ts +17 -3
- package/src/hooks/useBusyAnnouncement.ts +7 -10
- package/src/hooks/useMenuHover.ts +15 -1
- package/src/i18n/generated-locales/en.generated.ts +6 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +6 -0
- package/src/motion/README.md +11 -1
- package/src/motion/animator.test.ts +151 -3
- package/src/motion/animator.ts +149 -33
- package/src/theme/Theme.doc.mjs +1 -1
- package/src/theme/defineTheme.ts +117 -8
- package/src/theme/derivedVarRegistry.test.ts +4 -0
- package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
- package/src/theme/domainTokens/index.ts +6 -10
- package/src/theme/expandMotionScale.test.ts +1 -1
- package/src/theme/index.ts +5 -0
- package/src/theme/motionKnobs.ts +82 -0
- package/src/theme/resolveThemeValues.ts +68 -6
- package/src/theme/themeAdaptations.ts +52 -12
- package/src/theme/themeMotion.test.ts +620 -0
- package/src/theme/themeMotion.ts +221 -0
- package/src/theme/tokenReferences.ts +149 -0
- package/src/theme/tokens.stylex.ts +10 -0
- package/src/theme/tokens.ts +15 -158
- package/src/utils/focusReturn.ts +17 -6
- package/src/utils/getNodeText.test.ts +24 -0
- package/src/utils/getNodeText.ts +37 -0
- package/src/utils/interactionModality.test.ts +45 -1
- package/src/utils/interactionModality.ts +64 -5
- package/src/utils/interactionOverlay.stylex.ts +12 -3
- package/src/utils/plainDate.test.ts +90 -0
- package/src/utils/plainDate.ts +58 -3
- package/src/utils/presentation.test.ts +380 -0
- package/src/utils/presentation.ts +180 -0
- package/src/utils/pressFeedback.test.ts +138 -0
- package/src/utils/pressFeedback.ts +34 -11
- package/src/utils/pressPaintPriority.test.ts +80 -0
- package/src/utils/primaryClick.test.ts +38 -0
- package/src/utils/primaryClick.ts +28 -0
- package/src/utils/timeFormat.test.ts +204 -0
- package/src/utils/timeFormat.ts +314 -0
- package/src/utils/touchPresentation.stylex.ts +43 -0
- package/src/utils/touchPresentation.test.ts +140 -1
- package/src/utils/touchPresentation.ts +5 -3
- package/src/utils/unicodeDigits.test.ts +44 -0
- package/src/utils/unicodeDigits.ts +71 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 3
|
|
3
|
+
template_version: 7
|
|
4
|
+
kind: component
|
|
5
|
+
id: component:ListItem
|
|
6
|
+
authority: current
|
|
7
|
+
archive_reason: null
|
|
8
|
+
superseded_by: null
|
|
9
|
+
approved_by: cixzhang
|
|
10
|
+
approved_at: 2026-10-31
|
|
11
|
+
owners: [cixzhang]
|
|
12
|
+
review_triggers: [public-api, behavior, layout, theming]
|
|
13
|
+
verified_by:
|
|
14
|
+
[
|
|
15
|
+
packages/core/src/List/List.test.tsx,
|
|
16
|
+
packages/core/src/theme/themingTargets.test.ts,
|
|
17
|
+
scripts/check-knowledge.mjs,
|
|
18
|
+
]
|
|
19
|
+
modules: []
|
|
20
|
+
families: [family:navigation-destinations]
|
|
21
|
+
design_specs: []
|
|
22
|
+
architecture:
|
|
23
|
+
[
|
|
24
|
+
architecture:component-style-authoring,
|
|
25
|
+
architecture:component-theming-surface,
|
|
26
|
+
architecture:public-component-api,
|
|
27
|
+
]
|
|
28
|
+
contributing: []
|
|
29
|
+
system_specs: [spec:AST-057, spec:AST-103]
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# ListItem component contract
|
|
33
|
+
|
|
34
|
+
## Contract at a glance
|
|
35
|
+
|
|
36
|
+
| Area | Contract |
|
|
37
|
+
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
38
|
+
| Public contract | `ListItem` with `label`, `description`, `startContent`, `endContent`, `onClick`, `interactiveRef`, `href`, `target`, `rel`, `align`, `isDisabled`, `isSelected`, `swipeActions`, `swipeBehavior`, `xstyle`, `className`, `style`, and `ref`; the row carries `component:List`'s `list-item` target. `itemKey` (`spec:AST-103` DEC-4) is specified but not shipped. |
|
|
39
|
+
| Behavior | One `<li>` row rendered by `component:Item`, which receives every row prop. Inside a List the row takes the list's density, dividers, edge treatment, and marker; outside a List it uses Item's defaults and draws no marker. |
|
|
40
|
+
| End-user impact | Each list entry reads as one list item, with the list's bullet, number, or task checkbox before it and the same interaction Item gives any row. |
|
|
41
|
+
| Builder impact | None. |
|
|
42
|
+
| Compatibility/readiness | Records shipped behavior; no public change. Two implementation gaps, listed under Current-state impact. |
|
|
43
|
+
| Review checks | Reject a row that is not an `<li>`, a ListItem-level edge, density, or divider prop, a marker drawn outside a marked List, or a dropped Item prop. |
|
|
44
|
+
| Governing rules | `component:Item` (`align` for start and end content); `component:List`; `family:navigation-destinations`; `spec:AST-057`; `spec:AST-103`; `architecture:component-theming-surface`; `architecture:component-style-authoring` INV7. |
|
|
45
|
+
|
|
46
|
+
This table is a review projection; the body below is authoritative.
|
|
47
|
+
|
|
48
|
+
## Intent
|
|
49
|
+
|
|
50
|
+
ListItem is the row a List renders for each entry. It owns turning a row into
|
|
51
|
+
a list item: the `<li>` element, what it reads from its List, the marker drawn
|
|
52
|
+
before it, and how it applies `component:List`'s `list-item` target. Everything a row does as a row comes
|
|
53
|
+
from `component:Item`. Consumer usage lives in `ListItem.doc.mjs`.
|
|
54
|
+
|
|
55
|
+
## Compatibility and migration
|
|
56
|
+
|
|
57
|
+
- Released default preserved: `yes`
|
|
58
|
+
- Compatibility class: records shipped behavior; no public change
|
|
59
|
+
- Controlled/uncontrolled behavior: not applicable; `isSelected` and
|
|
60
|
+
`isDisabled` are caller-owned
|
|
61
|
+
- Migration decision: none
|
|
62
|
+
|
|
63
|
+
Consumer migration instructions belong in consumer docs and release notes.
|
|
64
|
+
|
|
65
|
+
## Current-state impact
|
|
66
|
+
|
|
67
|
+
- **Markers are extra elements.** A bullet marker is drawn as two decorative
|
|
68
|
+
`span` elements, and a number marker as one `span` carrying a counter
|
|
69
|
+
pseudo-element, beside the row's content. `architecture:component-style-authoring`
|
|
70
|
+
INV7 carries decoration with no semantic role on a pseudo-element rather than
|
|
71
|
+
an added element.
|
|
72
|
+
- **ListItem has no `itemKey` yet.** `spec:AST-103` DEC-4 and `component:List`
|
|
73
|
+
FR12 have each reorderable row name its item through an `itemKey` prop;
|
|
74
|
+
ListItem does not accept one yet.
|
|
75
|
+
|
|
76
|
+
## Ownership boundary
|
|
77
|
+
|
|
78
|
+
**Owns**
|
|
79
|
+
|
|
80
|
+
- Rendering the row as an `<li>` through `component:Item` and passing it every
|
|
81
|
+
row prop (FR1).
|
|
82
|
+
- Reading density, dividers, edge treatment, and marker from the enclosing
|
|
83
|
+
List, and the defaults outside one (FR2, FR3).
|
|
84
|
+
- Drawing the marker or a task item's read-only checkbox (FR4).
|
|
85
|
+
- Applying `component:List`'s `list-item` target to the row (FR5).
|
|
86
|
+
|
|
87
|
+
**Does not own / non-goals**
|
|
88
|
+
|
|
89
|
+
- `align`, the start and end content's alignment — owned by `component:Item`; swipe actions — owned by
|
|
90
|
+
`spec:AST-057`; link destinations — owned by
|
|
91
|
+
`family:navigation-destinations`, of which ListItem is a member.
|
|
92
|
+
- Item's label, description, slots, invisible button, delegated activation,
|
|
93
|
+
and disabled and selected semantics — Item's shipped behavior, uncontracted
|
|
94
|
+
here.
|
|
95
|
+
- What each edge treatment does to row geometry and the row inset, the touch
|
|
96
|
+
target, press paint, row motion, and row menus — owned by `component:List`.
|
|
97
|
+
- The `ListMarkerScope` that sets a marker or task state for Markdown's nested
|
|
98
|
+
lists — internal and uncontracted here.
|
|
99
|
+
- Whole number markers and text alignment for Markdown lists — owned by
|
|
100
|
+
`spec:AST-061` FR11 and `component:List` DEC-5.
|
|
101
|
+
|
|
102
|
+
## Public concepts
|
|
103
|
+
|
|
104
|
+
No component-local concept beyond the consumer props; row props are
|
|
105
|
+
`component:Item`'s.
|
|
106
|
+
|
|
107
|
+
## Behavioral and layout contract
|
|
108
|
+
|
|
109
|
+
| ID | Invariant | Basis |
|
|
110
|
+
| --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
|
|
111
|
+
| FR1 | ListItem renders `component:Item` as an `<li>` and passes `label`, `description`, `startContent`, `endContent`, `onClick`, `interactiveRef`, `href`, `target`, `rel`, `align`, `isDisabled`, `isSelected`, `swipeActions`, `swipeBehavior`, and `ref` to it unchanged, with other DOM and data props reaching the row. | Current source and tests |
|
|
112
|
+
| FR2 | Inside a List, the row takes the list's `density`, its `hasDividers` setting, which draws a divider between rows with no extra element and square corners, and its `edge` treatment. | Current source and tests |
|
|
113
|
+
| FR3 | Outside a List, the row uses `balanced` density, no dividers, the `padded` treatment, and no marker, keeping Item's inline inset. | Current source and tests |
|
|
114
|
+
| FR4 | In a List whose `listStyle` is `disc`, `circle`, or `decimal`, the row draws that marker before its content: a disc or circle shape, or a counter number. A task state set for the row draws a read-only, labelled checkbox in the marker's place. Each marker and the task checkbox sit on the label's first line. A List whose `listStyle` is `none` draws neither. Other markers, set internally for Markdown's nested lists, are uncontracted here. | Current source and tests |
|
|
115
|
+
| FR5 | The row carries `component:List`'s `list-item` target, merged with the caller's `className` and `style`; `xstyle` applies after ListItem's own styles. | Current source |
|
|
116
|
+
|
|
117
|
+
### Allowed variation
|
|
118
|
+
|
|
119
|
+
- **AV1 — Row content.** Label, description, and slot content vary.
|
|
120
|
+
- **AV2 — Theme styling.** Themes restyle `list-item`.
|
|
121
|
+
|
|
122
|
+
### Representative states
|
|
123
|
+
|
|
124
|
+
| State | Required invariant | Allowed variation |
|
|
125
|
+
| -------------------- | ------------------------------------------------ | ----------------- |
|
|
126
|
+
| Static row in a List | One `<li>`; no button or anchor. | Content. |
|
|
127
|
+
| Interactive row | Item's invisible button or anchor; one tab stop. | Content. |
|
|
128
|
+
| Divided list | A divider between rows; square corners. | Density. |
|
|
129
|
+
| Numbered list | A counter number before each row. | Number style. |
|
|
130
|
+
| Task row | A read-only checkbox in the marker's place. | Checked state. |
|
|
131
|
+
| Row outside a List | Item's inline inset; no marker. | Content. |
|
|
132
|
+
|
|
133
|
+
### Transformation and precedence order
|
|
134
|
+
|
|
135
|
+
- **ORD1 — Marker.** No marker when the List's `listStyle` is `none`; otherwise
|
|
136
|
+
a task checkbox when the row has a task state, then the marker.
|
|
137
|
+
- **ORD2 — Styling.** ListItem's own styles, then the caller's `xstyle`.
|
|
138
|
+
|
|
139
|
+
### Performance and resources
|
|
140
|
+
|
|
141
|
+
- No resource rule.
|
|
142
|
+
|
|
143
|
+
## Accessibility contract
|
|
144
|
+
|
|
145
|
+
- **AR1 — List semantics.** Inside a List, each row is an `<li>` in the List's
|
|
146
|
+
`<ul>` or `<ol>` (FR1).
|
|
147
|
+
- **AR2 — Row semantics.** Item's interaction, disabled, and selected semantics
|
|
148
|
+
apply unchanged; they are Item's shipped behavior, uncontracted here.
|
|
149
|
+
- **AR3 — Task state.** A task row's checkbox is read-only and labelled (FR4).
|
|
150
|
+
|
|
151
|
+
## Design relationships
|
|
152
|
+
|
|
153
|
+
| Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
|
|
154
|
+
| ---------------- | ----------------------------------------------- | ------------------------ | -------------- | ------------------ |
|
|
155
|
+
| Row | Presents one list entry through Item. | `component:Item` | Prominent | FR1, FR5 |
|
|
156
|
+
| Marker | Shows the list's bullet, number, or task state. | Current source | Supporting | FR4 |
|
|
157
|
+
|
|
158
|
+
No anatomy-theming map is recorded yet; the block is optional during
|
|
159
|
+
migration, so the map is deferred.
|
|
160
|
+
|
|
161
|
+
## Family and system relationships
|
|
162
|
+
|
|
163
|
+
- `component:Item` owns `align`, the start and end content's alignment; its
|
|
164
|
+
other row behavior is
|
|
165
|
+
uncontracted. `spec:AST-057` owns swipe actions and
|
|
166
|
+
`family:navigation-destinations` owns link destinations.
|
|
167
|
+
- `component:List` owns the edge treatment and its row geometry and inset;
|
|
168
|
+
its record leaves the density, divider, and marker-style settings
|
|
169
|
+
uncontracted, and FR2 and FR4 here cover what a row does with them.
|
|
170
|
+
- `architecture:component-theming-surface` owns target qualification;
|
|
171
|
+
`component:List` owns the `list-item` target, and FR5 covers how the row
|
|
172
|
+
applies it.
|
|
173
|
+
|
|
174
|
+
## Verification map
|
|
175
|
+
|
|
176
|
+
| Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
|
|
177
|
+
| -------- | -------------------------------------------------------------------------------- | ---------------------------------------------- | ------------------------------------------------------ | ------------------------------ |
|
|
178
|
+
| FR1, AR1 | `List.test.tsx` row element, align, data attribute, and swipe pass-through tests | Static and interactive rows | A row that is not an `<li>`, or a dropped prop, fails. | `audit:ListItem/behavior` |
|
|
179
|
+
| FR2 | `List.test.tsx` density, divider, radius, and edge treatment tests | Each density; dividers on and off; each edge | A row that ignores its List's settings fails. | `audit:ListItem/layout` |
|
|
180
|
+
| FR3 | `List.test.tsx` "keeps the inset of a ListItem outside a List" | Row outside a List | A row outside a List that loses its inset fails. | `audit:ListItem/layout` |
|
|
181
|
+
| FR4, AR3 | `List.test.tsx` marker and ListMarkerScope tests | Presence of a marker, none, scope marker, task | A missing, extra, or unlabelled marker fails. | `audit:ListItem/anatomy` |
|
|
182
|
+
| AR2 | `List.test.tsx` invisible button, anchor, disabled, and selection tests | Click, href, disabled, selected | Lost row semantics fail. | `audit:ListItem/accessibility` |
|
|
183
|
+
|
|
184
|
+
Read from source, with no focused test yet:
|
|
185
|
+
|
|
186
|
+
- FR1: `interactiveRef`, `rel`, and `ref` reaching the Item row.
|
|
187
|
+
- FR2: the divider border and square corners.
|
|
188
|
+
- FR4: each marker and the task checkbox sitting on the label's first line.
|
|
189
|
+
- FR3: `balanced` density, no dividers, and no marker outside a List.
|
|
190
|
+
- FR4: the shape of each bullet marker (the disc's fill, the circle's ring),
|
|
191
|
+
and the number marker and its counter.
|
|
192
|
+
- FR5: the `list-item` target, and `xstyle` applying after ListItem's styles.
|
|
193
|
+
|
|
194
|
+
## Decision log
|
|
195
|
+
|
|
196
|
+
No component-local decision is recorded.
|
|
197
|
+
|
|
198
|
+
## Open questions
|
|
199
|
+
|
|
200
|
+
None.
|
|
201
|
+
|
|
202
|
+
## Content boundary
|
|
203
|
+
|
|
204
|
+
This file does not duplicate consumer prop tables, Item's row behavior, or
|
|
205
|
+
List's edge and geometry rules. It links to their owners.
|
package/src/List/ListItem.tsx
CHANGED
|
@@ -39,9 +39,9 @@ import {
|
|
|
39
39
|
} from '../theme/tokens.stylex';
|
|
40
40
|
import type {BaseProps} from '../BaseProps';
|
|
41
41
|
import {ListContext, type ListMarker} from './ListContext';
|
|
42
|
-
import {CheckboxInput} from '../CheckboxInput';
|
|
43
|
-
import {mergeProps} from '../utils';
|
|
44
|
-
import {Item} from '../Item';
|
|
42
|
+
import {CheckboxInput} from '../CheckboxInput/CheckboxInput';
|
|
43
|
+
import {mergeProps} from '../utils/mergeProps';
|
|
44
|
+
import {Item} from '../Item/Item';
|
|
45
45
|
import {ItemMarkerColumnsContext} from '../Item/ItemMarkerColumnsContext';
|
|
46
46
|
import type {ItemAlign, ItemSwipeActions, ItemSwipeBehavior} from '../Item';
|
|
47
47
|
import {themeProps} from '../utils/themeProps';
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 3
|
|
3
|
+
template_version: 7
|
|
4
|
+
kind: component
|
|
5
|
+
id: component:MetadataList
|
|
6
|
+
authority: current
|
|
7
|
+
archive_reason: null
|
|
8
|
+
superseded_by: null
|
|
9
|
+
approved_by: cixzhang
|
|
10
|
+
approved_at: 2026-10-31
|
|
11
|
+
owners: [cixzhang]
|
|
12
|
+
review_triggers: [public-api, behavior, layout, theming, accessibility]
|
|
13
|
+
verified_by:
|
|
14
|
+
[
|
|
15
|
+
packages/core/src/MetadataList/MetadataList.test.tsx,
|
|
16
|
+
packages/core/src/theme/themingTargets.test.ts,
|
|
17
|
+
.github/visual-baseline/manifest.json,
|
|
18
|
+
scripts/check-knowledge.mjs,
|
|
19
|
+
]
|
|
20
|
+
modules: []
|
|
21
|
+
families: []
|
|
22
|
+
design_specs: []
|
|
23
|
+
architecture:
|
|
24
|
+
[architecture:component-theming-surface, architecture:public-component-api]
|
|
25
|
+
contributing: []
|
|
26
|
+
system_specs: [spec:AST-009]
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# MetadataList component contract
|
|
30
|
+
|
|
31
|
+
## Contract at a glance
|
|
32
|
+
|
|
33
|
+
| Area | Contract |
|
|
34
|
+
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
35
|
+
| Public contract | `children` (MetadataListItem entries), `columns`, `label` (`position`, `width`), `maxNumOfItems`, `orientation`, `title`, root `BaseProps`, `ref`. |
|
|
36
|
+
| Behavior | A description list of label and value pairs in one column, several columns, or a wrapping row, with an optional show more and show less toggle. |
|
|
37
|
+
| End-user impact | People scan labelled facts in a predictable grid, and assistive technology reads each label with its value. |
|
|
38
|
+
| Builder impact | None; the record describes shipped behavior. |
|
|
39
|
+
| Compatibility/readiness | Released behavior recorded as current; no API, default, or output changes. |
|
|
40
|
+
| Review checks | Reject a list that is not a `dl`, a toggle without its expanded state or controlled list, an unlocalized toggle label, or overridable reflection. |
|
|
41
|
+
| Governing rules | `architecture:public-component-api` INV5–INV8; `architecture:component-theming-surface`; WCAG 2.2 SC 1.3.1 and 4.1.2. |
|
|
42
|
+
|
|
43
|
+
This table is a review projection; the body below is authoritative.
|
|
44
|
+
|
|
45
|
+
## Intent
|
|
46
|
+
|
|
47
|
+
MetadataList presents read-only key and value facts as a description list. It
|
|
48
|
+
owns the arrangement of its entries, the label placement it passes to them, and
|
|
49
|
+
the optional disclosure that collapses a long list; callers own the facts.
|
|
50
|
+
|
|
51
|
+
Consumer syntax and examples belong in `MetadataList.doc.mjs`.
|
|
52
|
+
|
|
53
|
+
## Compatibility and migration
|
|
54
|
+
|
|
55
|
+
- Released default preserved: `yes` — one column, vertical, labels at the
|
|
56
|
+
start, no collapse.
|
|
57
|
+
- Compatibility class: records shipped behavior; no public prop, default, DOM,
|
|
58
|
+
target, or styling output changes.
|
|
59
|
+
- Controlled/uncontrolled behavior: the expanded state of the disclosure is
|
|
60
|
+
uncontrolled.
|
|
61
|
+
- Migration decision: none
|
|
62
|
+
|
|
63
|
+
Consumer migration instructions belong in consumer docs and release notes.
|
|
64
|
+
|
|
65
|
+
## Ownership boundary
|
|
66
|
+
|
|
67
|
+
**Owns**
|
|
68
|
+
|
|
69
|
+
- The root, its `metadata-list` target, the optional title, the `dl`, and
|
|
70
|
+
the show more and show less toggle.
|
|
71
|
+
- Column layout, orientation, and the label position and width its entries
|
|
72
|
+
read.
|
|
73
|
+
|
|
74
|
+
**Does not own / non-goals**
|
|
75
|
+
|
|
76
|
+
- Each entry's label and value markup — owned by `component:MetadataListItem`.
|
|
77
|
+
- The facts shown and their formatting — owned by the caller.
|
|
78
|
+
- Editable fields — owned by form components.
|
|
79
|
+
|
|
80
|
+
## Public concepts
|
|
81
|
+
|
|
82
|
+
| Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
|
|
83
|
+
| -------------- | ---------------------------------- | --------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | -------------------------------------------------------- | ------------------------ | --------- | ------------------------------------------------------------------- |
|
|
84
|
+
| Columns | `single`; `multi`; positive number | One column, auto-filling columns, or exactly N columns. | Vertical only | `single` | `component:MetadataList` | Stable | 1 acts as `single`; a number below 1 falls to the `multi` template. |
|
|
85
|
+
| Orientation | `vertical`; `horizontal` | A grid of entries, or one wrapping row of stacked entries. | Always | `vertical` | `component:MetadataList` | Stable | Closed union; rejected by types. |
|
|
86
|
+
| Label position | `start`; `top` | Label beside its value, or stacked above it. | Vertical only | `top` for `multi` or a number above 1, otherwise `start` | `component:MetadataList` | Stable | Horizontal always stacks. |
|
|
87
|
+
| Label width | number (px); CSS length string | The label track's width; on `multi` it replaces the auto-fill grid with one label and value pair per row. | Vertical with start labels, at one column or `multi` | content width | `component:MetadataList` | Stable | — |
|
|
88
|
+
| Collapse | positive number; unset | Entries shown before a show more toggle. | Vertical only | unset | `component:MetadataList` | Stable | Ignored when horizontal. |
|
|
89
|
+
| Title | ReactNode; unset | Content shown above the list. | Always | unset | `component:MetadataList` | Stable | — |
|
|
90
|
+
|
|
91
|
+
## Behavioral and layout contract
|
|
92
|
+
|
|
93
|
+
| ID | Invariant | Basis |
|
|
94
|
+
| --- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
|
|
95
|
+
| FR1 | MetadataList renders a root `div` carrying the `metadata-list` target, which reflects `columns` and `orientation`, holding the optional title, a `dl` of the entries, and, when the list collapses, a toggle button. The title renders above the list with a `--spacing-3` gap as plain content; it is not a heading and does not name the list. | Current source and tests |
|
|
96
|
+
| FR2 | Vertical, one column with start labels is a two-track grid (label `auto`, value `minmax(0, 1fr)`) with `--spacing-2` row and `--spacing-4` column gaps and baseline alignment; a label `width` replaces the label track, and on `multi` with start labels a `width` replaces the auto-fill grid with the same two tracks. One column with top labels is a single track with a `--spacing-3` gap. `multi` auto-fills 280px-minimum columns with a `--spacing-4` gap. A number N above 1 makes exactly N columns, each `1fr` with top labels or a label `auto` and value `minmax(0, 1fr)` pair with start labels, ignoring a label `width`; a number below 1 falls to the `multi` template. | Current source and tests |
|
|
97
|
+
| FR3 | Label position defaults to `top` for `multi` or a number above 1 and to `start` otherwise (including a number below 1), and a caller `position` wins. Horizontal orientation lays entries in one wrapping row with a `--spacing-4` gap, stacks every label above its value, and ignores `columns` and `maxNumOfItems`. | Current source and tests |
|
|
98
|
+
| FR4 | When vertical and the entries exceed `maxNumOfItems`, only the first `maxNumOfItems` render, followed by a native button labelled with the localized "Show more", with `aria-expanded="false"` and `aria-controls` naming the `dl`. Activating it renders every entry and switches to "Show less" with `aria-expanded="true"`; activating it again collapses. Focus stays on the button. | Current source and tests; `architecture:public-component-api` |
|
|
99
|
+
| FR5 | `ref`, DOM, data, ARIA, and event props, `xstyle`, `className`, and `style` reach or compose on the root; the reflected `data-columns` and `data-orientation` replace a caller's values. | Current source and tests; `architecture:public-component-api` INV5–INV8 |
|
|
100
|
+
|
|
101
|
+
### Allowed variation
|
|
102
|
+
|
|
103
|
+
- **AV1 — Facts.** Any MetadataListItem content may fill the list.
|
|
104
|
+
- **AV2 — Title.** Any ReactNode, including a caller's heading, may be the
|
|
105
|
+
title.
|
|
106
|
+
|
|
107
|
+
### Representative states
|
|
108
|
+
|
|
109
|
+
| State | Required invariant | Allowed variation |
|
|
110
|
+
| ---------- | -------------------------------------------------------------------- | ----------------- |
|
|
111
|
+
| One column | Label and value tracks; labels at the start. | Label width. |
|
|
112
|
+
| N columns | Exactly N columns; labels on top by default. | N. |
|
|
113
|
+
| Horizontal | One wrapping row; labels stacked; no toggle. | — |
|
|
114
|
+
| Collapsed | First `maxNumOfItems` entries; "Show more"; `aria-expanded="false"`. | Locale. |
|
|
115
|
+
| Expanded | Every entry; "Show less"; `aria-expanded="true"`. | Locale. |
|
|
116
|
+
|
|
117
|
+
### Transformation and precedence order
|
|
118
|
+
|
|
119
|
+
- **ORD1 — Label position.** Horizontal → top; otherwise caller `position` →
|
|
120
|
+
`top` for `multi` or a number above 1 → `start`.
|
|
121
|
+
- **ORD2 — Columns.** Horizontal → no grid; N above 1 → exactly N columns (N tracks with top labels, N label and value pairs with start labels); a
|
|
122
|
+
start-label `width` → that label track; otherwise the static template.
|
|
123
|
+
|
|
124
|
+
### Performance and resources
|
|
125
|
+
|
|
126
|
+
- **PR1 — Local state only.** MetadataList holds one expanded flag and one
|
|
127
|
+
generated id, and adds no listener, observer, timer, or measurement.
|
|
128
|
+
|
|
129
|
+
## Accessibility contract
|
|
130
|
+
|
|
131
|
+
- **AR1 — Description list semantics.** Entries are `dt` and `dd` pairs inside
|
|
132
|
+
one `dl`, so assistive technology reads each label with its value
|
|
133
|
+
(WCAG 2.2 SC 1.3.1).
|
|
134
|
+
- **AR2 — Disclosure state.** The toggle is a native button exposing its
|
|
135
|
+
expanded state and the list it controls (WCAG 2.2 SC 4.1.2).
|
|
136
|
+
- **AR3 — Localized labels.** The toggle's text comes from the translation
|
|
137
|
+
catalog, never assembled in the component.
|
|
138
|
+
|
|
139
|
+
## Design relationships
|
|
140
|
+
|
|
141
|
+
| Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
|
|
142
|
+
| ---------------- | ------------------------------------------- | ---------------------------- | -------------- | ------------------ |
|
|
143
|
+
| Title | Optional content above the list. | Current source and docs | Supporting | FR1 |
|
|
144
|
+
| Label | The key of each entry. | `component:MetadataListItem` | Supporting | FR2, FR3 |
|
|
145
|
+
| Metadata | The value of each entry. | `component:MetadataListItem` | Prominent | FR2, FR3 |
|
|
146
|
+
| Disclosure | Show more or show less in the accent color. | Current source and docs | Supporting | FR4 |
|
|
147
|
+
|
|
148
|
+
Theming: the root carries the `metadata-list` target, which reflects `columns`
|
|
149
|
+
and `orientation`, and each entry carries the `metadata-list-item` target
|
|
150
|
+
(`component:MetadataListItem`). `MetadataList.doc.mjs` names no root anatomy
|
|
151
|
+
part for the `metadata-list` target, so no anatomy-theming block is declared
|
|
152
|
+
here; the Title, value cell, and Disclosure carry no target.
|
|
153
|
+
|
|
154
|
+
## Family and system relationships
|
|
155
|
+
|
|
156
|
+
- `component:MetadataListItem` owns entry markup and reads the label position
|
|
157
|
+
this record resolves.
|
|
158
|
+
- `architecture:component-theming-surface` owns target and anatomy mapping.
|
|
159
|
+
- `architecture:public-component-api` owns caller-input routing; FR5 applies
|
|
160
|
+
it.
|
|
161
|
+
- `spec:AST-009` owns accessibility-tree evidence; the verification map names
|
|
162
|
+
its gap.
|
|
163
|
+
|
|
164
|
+
## Verification map
|
|
165
|
+
|
|
166
|
+
| Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
|
|
167
|
+
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
|
|
168
|
+
| FR1, AR1 | `MetadataList.test.tsx` description-list, `dl`, and title tests; stable visual baselines `core-metadatalist--basic` (neutral and probe themes) | Items; title | A missing `dl`, `dt`, or `dd`, or a missing title, fails; a changed default layout comes back changed for review. Gap: no accessibility-tree check proves the term and definition pairing (`spec:AST-009` FR3). | `audit:MetadataList/a11y` |
|
|
169
|
+
| FR2, ORD2 | `MetadataList.test.tsx` numeric-column and label-width tests | N columns with top and start labels; `multi`; custom width | A wrong inline grid template for N columns or a label width, or a `repeat(` inline template for `multi`, fails. Gap: the static one-column and `multi` templates and the gaps have no unit check beyond the default baseline. No test covers a width beside N columns with start labels, a width on `multi`, or a number below 1. | `audit:MetadataList/layout` |
|
|
170
|
+
| FR3, ORD1 | `MetadataList.test.tsx` orientation and default-position tests | Horizontal; omitted position; `columns={2}` | A horizontal list without stacked labels or with a toggle, or a wrong default position, fails. No test covers `multi`'s top-label default or a number below 1's start-label default. | `audit:MetadataList/layout` |
|
|
171
|
+
| FR4, AR2, AR3 | `MetadataList.test.tsx` show more, toggle, and localization tests | Collapsed; expanded; French catalog | A missing toggle, hidden entries that render, a toggle that does not expand and collapse, or English text under a French catalog fails. Gap: no test asserts `aria-expanded`, `aria-controls`, or that focus stays on the button. | `audit:MetadataList/behavior` |
|
|
172
|
+
| FR5 | `MetadataList.test.tsx` root pass-through, event, and owned-metadata tests | `aria-label`, `id`, data; click; colliding reflection | A dropped attribute or handler, or a caller `data-columns` or `data-orientation` that wins, fails. Gap: no test covers `ref`, `className`, `style`, or the `xstyle` merge order. | `audit:MetadataList/api` |
|
|
173
|
+
| PR1 | Source review | Every state | Gap: no automated check fails if MetadataList adds a listener, timer, or measurement. | `audit:MetadataList/behavior` |
|
|
174
|
+
| Theming targets | `themingTargets.test.ts` | Root and item targets | A renamed or undocumented target fails. Gap: no check fails if the side-by-side `dt` loses the `metadata-list-item` target. | `audit:MetadataList/theming` |
|
|
175
|
+
|
|
176
|
+
## Decision log
|
|
177
|
+
|
|
178
|
+
None recorded. The record describes shipped behavior.
|
|
179
|
+
|
|
180
|
+
## Open questions
|
|
181
|
+
|
|
182
|
+
None.
|
|
183
|
+
|
|
184
|
+
## Content boundary
|
|
185
|
+
|
|
186
|
+
This file does not duplicate consumer prop tables/examples, current audit
|
|
187
|
+
results, implementation steps, or entry markup. It links to their owners.
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 3
|
|
3
|
+
template_version: 7
|
|
4
|
+
kind: component
|
|
5
|
+
id: component:MetadataListItem
|
|
6
|
+
authority: current
|
|
7
|
+
archive_reason: null
|
|
8
|
+
superseded_by: null
|
|
9
|
+
approved_by: cixzhang
|
|
10
|
+
approved_at: 2026-10-31
|
|
11
|
+
owners: [cixzhang]
|
|
12
|
+
review_triggers: [public-api, behavior, layout, theming, accessibility]
|
|
13
|
+
verified_by:
|
|
14
|
+
[
|
|
15
|
+
packages/core/src/MetadataList/MetadataList.test.tsx,
|
|
16
|
+
scripts/check-knowledge.mjs,
|
|
17
|
+
]
|
|
18
|
+
modules: []
|
|
19
|
+
families: []
|
|
20
|
+
design_specs: []
|
|
21
|
+
architecture:
|
|
22
|
+
[architecture:component-theming-surface, architecture:public-component-api]
|
|
23
|
+
contributing: []
|
|
24
|
+
system_specs: [spec:AST-009]
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# MetadataListItem component contract
|
|
28
|
+
|
|
29
|
+
## Contract at a glance
|
|
30
|
+
|
|
31
|
+
| Area | Contract |
|
|
32
|
+
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
33
|
+
| Public contract | `label` (a string), `children` (the value), optional `icon`, root `BaseProps`, and a `ref`. |
|
|
34
|
+
| Behavior | One label and value pair, rendered as a `dt` and `dd` either side by side in the list's grid or stacked inside a wrapper. |
|
|
35
|
+
| End-user impact | People read each fact's label next to or above its value, and assistive technology pairs them. |
|
|
36
|
+
| Builder impact | None; the record describes shipped behavior. |
|
|
37
|
+
| Compatibility/readiness | Released behavior recorded as current; no API, default, or output changes. |
|
|
38
|
+
| Review checks | Reject a pair that is not `dt` and `dd`, a wrapper in the side-by-side layout, or caller props that move off the element carrying the ref. |
|
|
39
|
+
| Governing rules | `architecture:public-component-api` INV5–INV8; `architecture:component-theming-surface`; WCAG 2.2 SC 1.3.1. |
|
|
40
|
+
|
|
41
|
+
This table is a review projection; the body below is authoritative.
|
|
42
|
+
|
|
43
|
+
## Intent
|
|
44
|
+
|
|
45
|
+
MetadataListItem is one key and value entry inside a MetadataList. It owns the
|
|
46
|
+
entry's term and definition markup and their type; the caller owns the label,
|
|
47
|
+
icon, and value.
|
|
48
|
+
|
|
49
|
+
Consumer syntax and examples belong in `MetadataListItem.doc.mjs`.
|
|
50
|
+
|
|
51
|
+
## Compatibility and migration
|
|
52
|
+
|
|
53
|
+
- Released default preserved: `yes` — side by side outside a stacked list.
|
|
54
|
+
- Compatibility class: records shipped behavior; no public prop, default, DOM,
|
|
55
|
+
target, or styling output changes.
|
|
56
|
+
- Controlled/uncontrolled behavior: not applicable
|
|
57
|
+
- Migration decision: none
|
|
58
|
+
|
|
59
|
+
Consumer migration instructions belong in consumer docs and release notes.
|
|
60
|
+
|
|
61
|
+
## Ownership boundary
|
|
62
|
+
|
|
63
|
+
**Owns**
|
|
64
|
+
|
|
65
|
+
- The entry's `dt` and `dd`, the stacked wrapper, and the `metadata-list-item`
|
|
66
|
+
target that `component:MetadataList` maps.
|
|
67
|
+
- Label and value type, the icon slot, and where caller inputs land.
|
|
68
|
+
|
|
69
|
+
**Does not own / non-goals**
|
|
70
|
+
|
|
71
|
+
- Label position, columns, and orientation — owned by
|
|
72
|
+
`component:MetadataList`.
|
|
73
|
+
- The label, icon, and value content — owned by the caller.
|
|
74
|
+
|
|
75
|
+
## Public concepts
|
|
76
|
+
|
|
77
|
+
| Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
|
|
78
|
+
| ------- | ----------------------- | ---------------------------------------- | ----------------------------------------- | ------------ | ------------------------ | --------- | ---------------------- |
|
|
79
|
+
| Label | string | The entry's key. | Always | — | caller | Stable | — |
|
|
80
|
+
| Value | ReactNode (`children`) | The entry's value. | Always | — | caller | Stable | — |
|
|
81
|
+
| Icon | ReactNode; unset | Content shown before the label. | Always | unset | caller | Stable | — |
|
|
82
|
+
| Layout | side by side; stacked | Set by the parent list, not by the item. | Always | side by side | `component:MetadataList` | Stable | — |
|
|
83
|
+
|
|
84
|
+
## Behavioral and layout contract
|
|
85
|
+
|
|
86
|
+
| ID | Invariant | Basis |
|
|
87
|
+
| --- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
|
|
88
|
+
| FR1 | Side by side (labels at the start, or outside a MetadataList), the item renders a `dt` holding the icon and label, then a `dd` holding the value, as direct children of the list's grid. The `dt` carries the `metadata-list-item` target, the `ref`, and the caller's props and styling inputs; a `data-testid` becomes `<id>-label` on the `dt` and `<id>-value` on the `dd`. Both cells are at least 24px tall and break long words. | Current source and tests |
|
|
89
|
+
| FR2 | Stacked (labels on top, or a horizontal list), the item renders a `div` wrapper carrying the `metadata-list-item` target, the `ref`, `data-testid`, and the caller's props and styling inputs, holding the `dt` above the `dd` with a `--spacing-0-5` gap. | Current source and tests |
|
|
90
|
+
| FR3 | The label uses medium-weight body type in secondary text color; the value uses body type in primary text color. An icon sits before the label with a `--spacing-2` gap. | Current source and docs |
|
|
91
|
+
| FR4 | `xstyle`, `className`, and `style` compose after component styles on the element carrying the target, and caller props reach that element after the component's own attributes. | Current source and tests; `architecture:public-component-api` INV5–INV8 |
|
|
92
|
+
|
|
93
|
+
### Allowed variation
|
|
94
|
+
|
|
95
|
+
- **AV1 — Content.** Any string may be the label; any ReactNode may be the
|
|
96
|
+
icon or value.
|
|
97
|
+
|
|
98
|
+
### Representative states
|
|
99
|
+
|
|
100
|
+
| State | Required invariant | Allowed variation |
|
|
101
|
+
| ------------ | -------------------------------------------------------------------- | ----------------- |
|
|
102
|
+
| Side by side | `dt` and `dd` as grid siblings; target, ref, and props on the `dt`. | Content. |
|
|
103
|
+
| Stacked | One wrapper with the target, ref, and props, holding `dt` over `dd`. | Content. |
|
|
104
|
+
| With icon | The icon precedes the label inside the `dt`. | Icon. |
|
|
105
|
+
|
|
106
|
+
### Transformation and precedence order
|
|
107
|
+
|
|
108
|
+
- **ORD1 — Layout.** The parent list's horizontal orientation or `top` label
|
|
109
|
+
position → stacked; otherwise side by side.
|
|
110
|
+
|
|
111
|
+
### Performance and resources
|
|
112
|
+
|
|
113
|
+
- **PR1 — No resources.** MetadataListItem reads its parent list's label
|
|
114
|
+
position and orientation and holds no state.
|
|
115
|
+
|
|
116
|
+
## Accessibility contract
|
|
117
|
+
|
|
118
|
+
- **AR1 — Term and definition.** The label is a `dt` and the value its `dd`,
|
|
119
|
+
so assistive technology pairs them (WCAG 2.2 SC 1.3.1). The icon adds no
|
|
120
|
+
semantics of its own.
|
|
121
|
+
|
|
122
|
+
## Design relationships
|
|
123
|
+
|
|
124
|
+
| Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
|
|
125
|
+
| ---------------- | --------------------------- | ------------------------ | -------------- | ------------------ |
|
|
126
|
+
| Label | Secondary-color medium key. | Current source and docs | Supporting | FR1–FR3 |
|
|
127
|
+
| Metadata | Primary-color value. | Current source and docs | Prominent | FR1–FR3 |
|
|
128
|
+
|
|
129
|
+
Theming: the `dt` (side by side) or the wrapper (stacked) carries the
|
|
130
|
+
`metadata-list-item` target, which `MetadataList.doc.mjs` declares and
|
|
131
|
+
`component:MetadataList` maps. `MetadataListItem.doc.mjs` declares no anatomy of
|
|
132
|
+
its own, so no anatomy-theming block is declared here.
|
|
133
|
+
|
|
134
|
+
## Family and system relationships
|
|
135
|
+
|
|
136
|
+
- `component:MetadataList` owns layout, label position, and the target
|
|
137
|
+
mapping.
|
|
138
|
+
- `architecture:public-component-api` owns caller-input routing; FR4 applies
|
|
139
|
+
it.
|
|
140
|
+
- `spec:AST-009` owns accessibility-tree evidence; the verification map names
|
|
141
|
+
its gap.
|
|
142
|
+
|
|
143
|
+
## Verification map
|
|
144
|
+
|
|
145
|
+
| Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
|
|
146
|
+
| -------- | ------------------------------------------------------------------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- |
|
|
147
|
+
| FR1 | `MetadataList.test.tsx` item, label-width, and pass-through-target tests | Side by side | A missing label or value, a `dt` or `dd` that is not a direct child of the `dl`, wrong `-label` and `-value` test ids, or props or click handling that leave the `dt`, fails. Gap: no test attaches a `ref`, and the 24px minimum height has no check. No check fails if the side-by-side `dt` loses the `metadata-list-item` target. | `audit:MetadataListItem/layout` |
|
|
148
|
+
| FR2 | `MetadataList.test.tsx` stacked and stacked pass-through tests | Stacked | A missing wrapper, `dt`, or `dd`, or props that leave the wrapper, fails. Gap: the stacked gap has no check. No test attaches a `ref` to the stacked wrapper. | `audit:MetadataListItem/layout` |
|
|
149
|
+
| FR3 | `MetadataList.test.tsx` icon test | With icon | A missing icon fails. Gap: label and value type and color and the icon gap have no automated check. | `audit:MetadataListItem/design` |
|
|
150
|
+
| FR4 | `MetadataList.test.tsx` pass-through tests | `aria-label`, `id`, data; click | A dropped attribute or handler fails. Gap: no test covers `className`, `style`, or the `xstyle` merge order. | `audit:MetadataListItem/api` |
|
|
151
|
+
| AR1 | `MetadataList.test.tsx` role queries | Term and definition | A missing `term` or `definition` role in the DOM fails. Gap: no accessibility-tree check proves the pairing (`spec:AST-009` FR3). | `audit:MetadataListItem/a11y` |
|
|
152
|
+
| PR1 | Source review | Every state | Gap: no automated check fails if MetadataListItem adds state. | `audit:MetadataListItem/behavior` |
|
|
153
|
+
|
|
154
|
+
## Decision log
|
|
155
|
+
|
|
156
|
+
None recorded. The record describes shipped behavior.
|
|
157
|
+
|
|
158
|
+
## Open questions
|
|
159
|
+
|
|
160
|
+
None.
|
|
161
|
+
|
|
162
|
+
## Content boundary
|
|
163
|
+
|
|
164
|
+
This file does not duplicate consumer prop tables/examples, current audit
|
|
165
|
+
results, implementation steps, or list layout rules. It links to their owners.
|
|
@@ -54,6 +54,21 @@ describe('MobileNav', () => {
|
|
|
54
54
|
expect(dialog).not.toHaveAttribute('open');
|
|
55
55
|
});
|
|
56
56
|
|
|
57
|
+
it('stays open when a file picker inside it is dismissed', () => {
|
|
58
|
+
const handleClose = vi.fn();
|
|
59
|
+
render(
|
|
60
|
+
<MobileNav isOpen={true} onOpenChange={handleClose}>
|
|
61
|
+
<input type="file" aria-label="Picture" />
|
|
62
|
+
</MobileNav>,
|
|
63
|
+
);
|
|
64
|
+
// A dismissed picker fires a bubbling `cancel` at the input; it is not a
|
|
65
|
+
// close request for the navigation.
|
|
66
|
+
const fromPicker = new Event('cancel', {bubbles: true, cancelable: true});
|
|
67
|
+
screen.getByLabelText('Picture').dispatchEvent(fromPicker);
|
|
68
|
+
expect(handleClose).not.toHaveBeenCalled();
|
|
69
|
+
expect(fromPicker.defaultPrevented).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
|
|
57
72
|
it('calls onOpenChange(false) on native cancel event (Escape)', () => {
|
|
58
73
|
const handleClose = vi.fn();
|
|
59
74
|
render(
|