pixelize-native-library 1.2.0 → 1.2.1
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/lib/module/core/MODULE.md +2 -1
- package/lib/module/core/gradient/AccentGradientFill.js +80 -0
- package/lib/module/core/gradient/darkenHex.js +13 -0
- package/lib/module/core/gradient/gradientStops.js +27 -0
- package/lib/module/core/gradient/index.js +7 -0
- package/lib/module/core/gradient/withAlpha.js +19 -0
- package/lib/module/core/haptics/MODULE.md +4 -0
- package/lib/module/core/haptics/context.js +7 -0
- package/lib/module/core/haptics/haptics.js +17 -0
- package/lib/module/core/haptics/index.js +6 -0
- package/lib/module/core/haptics/useHaptics.js +73 -0
- package/lib/module/core/icon/MODULE.md +16 -9
- package/lib/module/core/icon/icons/trending-up.js +10 -0
- package/lib/module/core/icon/resolve.js +2 -0
- package/lib/module/core/media/expoImage.js +6 -0
- package/lib/module/core/motion/MODULE.md +12 -12
- package/lib/module/core/motion/config.js +4 -1
- package/lib/module/core/motion/index.js +2 -1
- package/lib/module/core/motion/usePressState.js +145 -0
- package/lib/module/core/style/index.js +1 -0
- package/lib/module/core/style/radius.js +4 -0
- package/lib/module/index.js +1 -0
- package/lib/module/modules/accordion/Accordion.js +69 -49
- package/lib/module/modules/accordion/Accordion.variants.js +4 -3
- package/lib/module/modules/accordion/MODULE.md +2 -1
- package/lib/module/modules/alert-dialog/AlertDialog.js +6 -5
- package/lib/module/modules/alert-dialog/AlertDialog.variants.js +4 -0
- package/lib/module/modules/app-bar/AppBar.js +6 -4
- package/lib/module/modules/app-bar/AppBar.variants.js +1 -2
- package/lib/module/modules/avatar/Avatar.js +7 -1
- package/lib/module/modules/avatar/Avatar.variants.js +1 -1
- package/lib/module/modules/avatar/MODULE.md +2 -2
- package/lib/module/modules/avatar-group/AvatarGroup.js +10 -6
- package/lib/module/modules/avatar-group/AvatarGroup.variants.js +23 -0
- package/lib/module/modules/avatar-group/MODULE.md +16 -0
- package/lib/module/modules/badge/Badge.js +11 -5
- package/lib/module/modules/badge/Badge.variants.js +2 -1
- package/lib/module/modules/badge/MODULE.md +5 -5
- package/lib/module/modules/banner/Banner.js +106 -60
- package/lib/module/modules/banner/Banner.variants.js +2 -2
- package/lib/module/modules/banner/MODULE.md +7 -2
- package/lib/module/modules/bottom-nav/BottomNav.js +6 -3
- package/lib/module/modules/bottom-nav/BottomNav.variants.js +9 -10
- package/lib/module/modules/bottom-nav/BottomNavOverflowSheet.js +28 -4
- package/lib/module/modules/bottom-nav/BottomNavTab.js +28 -4
- package/lib/module/modules/bottom-nav/MODULE.md +10 -1
- package/lib/module/modules/bottom-sheet/BottomSheet.js +20 -7
- package/lib/module/modules/bottom-sheet/BottomSheet.variants.js +15 -5
- package/lib/module/modules/bottom-sheet/MODULE.md +13 -2
- package/lib/module/modules/button/Button.js +87 -101
- package/lib/module/modules/button/Button.variants.js +8 -7
- package/lib/module/modules/button/MODULE.md +6 -0
- package/lib/module/modules/button-group/ButtonGroup.js +36 -37
- package/lib/module/modules/button-group/ButtonGroup.variants.js +21 -46
- package/lib/module/modules/button-group/MODULE.md +25 -30
- package/lib/module/modules/card/Card.js +117 -19
- package/lib/module/modules/card/Card.variants.js +1 -0
- package/lib/module/modules/card/MODULE.md +13 -10
- package/lib/module/modules/charts/BarChart.js +29 -14
- package/lib/module/modules/charts/BarList.js +31 -18
- package/lib/module/modules/charts/Charts.variants.js +66 -2
- package/lib/module/modules/charts/DonutChart.js +9 -4
- package/lib/module/modules/charts/LineChart.js +5 -3
- package/lib/module/modules/charts/MODULE.md +24 -11
- package/lib/module/modules/charts/PieChart.js +13 -4
- package/lib/module/modules/charts/Sparkline.js +4 -2
- package/lib/module/modules/checkbox/Checkbox.js +10 -2
- package/lib/module/modules/checkbox/MODULE.md +5 -0
- package/lib/module/modules/chip/Chip.js +83 -38
- package/lib/module/modules/chip/Chip.variants.js +15 -3
- package/lib/module/modules/chip/MODULE.md +6 -4
- package/lib/module/modules/combobox/Combobox.js +93 -57
- package/lib/module/modules/combobox/Combobox.variants.js +22 -7
- package/lib/module/modules/combobox/MODULE.md +14 -4
- package/lib/module/modules/composer/Composer.js +9 -2
- package/lib/module/modules/composer/Composer.variants.js +2 -0
- package/lib/module/modules/composer/MODULE.md +5 -0
- package/lib/module/modules/copy-button/CopyButton.js +22 -4
- package/lib/module/modules/copy-button/CopyButton.variants.js +4 -2
- package/lib/module/modules/copy-button/MODULE.md +5 -0
- package/lib/module/modules/data-table/DataTable.js +28 -9
- package/lib/module/modules/data-table/DataTable.variants.js +3 -2
- package/lib/module/modules/data-table/MODULE.md +1 -0
- package/lib/module/modules/date-picker/Calendar.js +75 -29
- package/lib/module/modules/date-picker/DatePicker.variants.js +24 -9
- package/lib/module/modules/date-picker/MODULE.md +25 -4
- package/lib/module/modules/date-picker/PickerField.js +13 -4
- package/lib/module/modules/date-picker/PickerShell.js +2 -0
- package/lib/module/modules/date-picker/TimePicker.js +13 -18
- package/lib/module/modules/divider/Divider.variants.js +6 -5
- package/lib/module/modules/divider/MODULE.md +2 -0
- package/lib/module/modules/drawer/Drawer.js +20 -8
- package/lib/module/modules/drawer/Drawer.variants.js +4 -4
- package/lib/module/modules/drawer/MODULE.md +3 -0
- package/lib/module/modules/empty-state/EmptyState.js +18 -29
- package/lib/module/modules/empty-state/EmptyState.variants.js +7 -0
- package/lib/module/modules/empty-state/MODULE.md +1 -0
- package/lib/module/modules/fab/Fab.js +41 -61
- package/lib/module/modules/fab/Fab.variants.js +15 -1
- package/lib/module/modules/fab/FabGroup.js +84 -57
- package/lib/module/modules/fab/MODULE.md +19 -6
- package/lib/module/modules/file-grid/FileGrid.js +30 -16
- package/lib/module/modules/file-grid/FileGrid.variants.js +2 -2
- package/lib/module/modules/file-grid/MODULE.md +3 -1
- package/lib/module/modules/file-upload/FileUpload.variants.js +3 -1
- package/lib/module/modules/file-upload/MODULE.md +2 -0
- package/lib/module/modules/filter-sheet/FilterChip.js +11 -3
- package/lib/module/modules/filter-sheet/FilterSheetBody.js +15 -3
- package/lib/module/modules/filter-sheet/MODULE.md +9 -0
- package/lib/module/modules/folder-row/FolderRow.js +29 -17
- package/lib/module/modules/folder-row/FolderRow.variants.js +4 -2
- package/lib/module/modules/folder-row/MODULE.md +2 -1
- package/lib/module/modules/gantt/Gantt.js +30 -9
- package/lib/module/modules/gantt/Gantt.variants.js +36 -0
- package/lib/module/modules/gantt/MODULE.md +11 -1
- package/lib/module/modules/image-viewer/ImageViewer.js +35 -5
- package/lib/module/modules/image-viewer/MODULE.md +6 -0
- package/lib/module/modules/input/Input.js +20 -7
- package/lib/module/modules/input/Input.variants.js +8 -7
- package/lib/module/modules/input/MODULE.md +2 -0
- package/lib/module/modules/list-item/ListItem.js +48 -26
- package/lib/module/modules/list-item/ListItem.variants.js +11 -2
- package/lib/module/modules/list-item/MODULE.md +2 -3
- package/lib/module/modules/markdown/MODULE.md +8 -1
- package/lib/module/modules/markdown/Markdown.js +57 -22
- package/lib/module/modules/markdown/Markdown.variants.js +2 -1
- package/lib/module/modules/menu/MODULE.md +11 -0
- package/lib/module/modules/menu/Menu.js +99 -40
- package/lib/module/modules/menu/Menu.variants.js +3 -3
- package/lib/module/modules/message-bubble/MODULE.md +4 -1
- package/lib/module/modules/message-bubble/MessageBubble.js +4 -5
- package/lib/module/modules/message-bubble/MessageBubble.variants.js +5 -5
- package/lib/module/modules/modal/MODULE.md +11 -0
- package/lib/module/modules/modal/Modal.js +87 -35
- package/lib/module/modules/modal/Modal.variants.js +2 -2
- package/lib/module/modules/more-items/MODULE.md +5 -0
- package/lib/module/modules/more-items/MoreItems.js +7 -1
- package/lib/module/modules/more-items/MoreItems.variants.js +4 -1
- package/lib/module/modules/multi-select/MODULE.md +5 -0
- package/lib/module/modules/multi-select/MultiSelect.js +23 -1
- package/lib/module/modules/multi-select/MultiSelect.variants.js +4 -2
- package/lib/module/modules/number-input/MODULE.md +2 -1
- package/lib/module/modules/number-input/NumberInput.js +97 -84
- package/lib/module/modules/number-input/NumberInput.variants.js +9 -6
- package/lib/module/modules/org-switcher/MODULE.md +13 -1
- package/lib/module/modules/org-switcher/OrgSwitcher.js +13 -2
- package/lib/module/modules/org-switcher/OrgSwitcher.variants.js +4 -2
- package/lib/module/modules/pagination/MODULE.md +2 -2
- package/lib/module/modules/pagination/Pagination.js +76 -37
- package/lib/module/modules/pagination/Pagination.variants.js +4 -2
- package/lib/module/modules/pagination/PaginationControls.js +55 -35
- package/lib/module/modules/pin-input/MODULE.md +5 -1
- package/lib/module/modules/pin-input/PinInput.js +9 -2
- package/lib/module/modules/pin-input/PinInput.variants.js +2 -1
- package/lib/module/modules/radio-group/MODULE.md +2 -2
- package/lib/module/modules/radio-group/RadioGroup.js +122 -63
- package/lib/module/modules/radio-group/RadioGroup.variants.js +2 -1
- package/lib/module/modules/reorder/MODULE.md +2 -0
- package/lib/module/modules/reorder/Reorder.js +4 -3
- package/lib/module/modules/reorder/Reorder.variants.js +4 -2
- package/lib/module/modules/rich-text/MODULE.md +3 -1
- package/lib/module/modules/rich-text/RichText.js +42 -22
- package/lib/module/modules/rich-text-editor/MODULE.md +4 -1
- package/lib/module/modules/rich-text-editor/RichTextEditor.js +8 -1
- package/lib/module/modules/rich-text-editor/RichTextEditor.variants.js +9 -6
- package/lib/module/modules/screen/MODULE.md +7 -0
- package/lib/module/modules/screen/Screen.js +50 -17
- package/lib/module/modules/screen/Screen.variants.js +18 -0
- package/lib/module/modules/search-bar/MODULE.md +1 -0
- package/lib/module/modules/search-bar/SearchBar.js +46 -26
- package/lib/module/modules/search-bar/SearchBar.variants.js +11 -8
- package/lib/module/modules/section/MODULE.md +2 -0
- package/lib/module/modules/section/Section.js +8 -15
- package/lib/module/modules/section/Section.variants.js +1 -6
- package/lib/module/modules/segmented-control/MODULE.md +3 -1
- package/lib/module/modules/segmented-control/SegmentedControl.js +110 -46
- package/lib/module/modules/segmented-control/SegmentedControl.variants.js +3 -2
- package/lib/module/modules/select/MODULE.md +26 -5
- package/lib/module/modules/select/Select.js +39 -12
- package/lib/module/modules/select/Select.variants.js +36 -12
- package/lib/module/modules/skeleton/MODULE.md +23 -27
- package/lib/module/modules/skeleton/Skeleton.js +46 -51
- package/lib/module/modules/skeleton/Skeleton.variants.js +17 -75
- package/lib/module/modules/slider/MODULE.md +2 -0
- package/lib/module/modules/slider/Slider.js +2 -1
- package/lib/module/modules/stage-progress/MODULE.md +12 -8
- package/lib/module/modules/stage-progress/StageProgress.js +94 -47
- package/lib/module/modules/stage-progress/StageProgress.variants.js +17 -12
- package/lib/module/modules/stat-tile/MODULE.md +2 -0
- package/lib/module/modules/stat-tile/StatTile.js +15 -10
- package/lib/module/modules/stat-tile/StatTile.variants.js +2 -0
- package/lib/module/modules/state-block/MODULE.md +3 -0
- package/lib/module/modules/state-block/StateBlock.js +11 -6
- package/lib/module/modules/state-block/StateBlock.variants.js +7 -0
- package/lib/module/modules/surface/MODULE.md +59 -0
- package/lib/module/modules/surface/Surface.js +42 -0
- package/lib/module/modules/surface/Surface.variants.js +33 -0
- package/lib/module/modules/surface/index.js +4 -0
- package/lib/module/modules/swipeable-row/MODULE.md +9 -0
- package/lib/module/modules/swipeable-row/SwipeableRow.js +28 -7
- package/lib/module/modules/switch/MODULE.md +2 -0
- package/lib/module/modules/switch/Switch.js +8 -2
- package/lib/module/modules/tabs/MODULE.md +2 -1
- package/lib/module/modules/tabs/Tabs.js +37 -18
- package/lib/module/modules/tabs/Tabs.variants.js +4 -2
- package/lib/module/modules/text/MODULE.md +5 -2
- package/lib/module/modules/text/Text.js +18 -6
- package/lib/module/modules/text/Text.variants.js +108 -44
- package/lib/module/modules/textarea/MODULE.md +2 -0
- package/lib/module/modules/textarea/Textarea.js +3 -2
- package/lib/module/modules/textarea/Textarea.variants.js +2 -1
- package/lib/module/modules/toast/MODULE.md +8 -4
- package/lib/module/modules/toast/Toast.js +31 -13
- package/lib/module/modules/toast/Toast.variants.js +5 -0
- package/lib/module/modules/tooltip/MODULE.md +15 -11
- package/lib/module/modules/tooltip/Tooltip.js +41 -9
- package/lib/module/modules/tooltip/Tooltip.variants.js +8 -1
- package/lib/module/theme/MODULE.md +3 -1
- package/lib/module/theme/platform/MODULE.md +14 -2
- package/lib/module/theme/platform/elevation.native.js +0 -44
- package/lib/module/theme/platform/floatingSurface.native.js +75 -0
- package/lib/module/theme/platform/highlight.native.js +59 -0
- package/lib/module/theme/platform/index.js +5 -0
- package/lib/module/theme/platform/motion.native.js +31 -11
- package/lib/module/theme/platform/stateLayer.native.js +14 -0
- package/lib/module/theme/platform/surfaces.native.js +11 -0
- package/lib/module/theme/provider/PixelizeProvider.js +12 -5
- package/lib/module/theme/tokens/MODULE.md +32 -28
- package/lib/module/theme/tokens/THEME-CONTRACT.md +137 -0
- package/lib/module/theme/tokens/assertPalette.js +29 -0
- package/lib/module/theme/tokens/brands/emerald/palette.light.js +7 -6
- package/lib/module/theme/tokens/brands/lavender/palette.light.js +3 -2
- package/lib/module/theme/tokens/brands/meadow/palette.light.js +7 -6
- package/lib/module/theme/tokens/brands/radiant/palette.light.js +7 -6
- package/lib/module/theme/tokens/brands/rosewood/palette.light.js +7 -6
- package/lib/module/theme/tokens/brands/skyline/palette.light.js +7 -6
- package/lib/module/theme/tokens/brands/slate/palette.light.js +8 -10
- package/lib/module/theme/tokens/brands/storefront/palette.light.js +7 -6
- package/lib/module/theme/tokens/brands/zinc/palette.dark.js +3 -2
- package/lib/module/theme/tokens/brands/zinc/palette.light.js +3 -2
- package/lib/module/theme/tokens/builders/buildDarkPalette.js +3 -2
- package/lib/module/theme/tokens/builders/finalizePalette.js +34 -0
- package/lib/module/theme/tokens/builders/liftToContrast.js +44 -0
- package/lib/module/theme/tokens/builders/placeholderInk.js +22 -0
- package/lib/module/theme/tokens/builders/semanticText.js +14 -0
- package/lib/module/theme/tokens/builders/surfaceRungs.js +44 -0
- package/lib/module/theme/tokens/index.js +5 -0
- package/lib/module/theme/tokens/roles/index.js +5 -0
- package/lib/typescript/core/gradient/AccentGradientFill.d.ts +7 -0
- package/lib/typescript/core/gradient/darkenHex.d.ts +2 -0
- package/lib/typescript/core/gradient/gradientStops.d.ts +10 -0
- package/lib/typescript/core/gradient/index.d.ts +5 -0
- package/lib/typescript/core/gradient/withAlpha.d.ts +2 -0
- package/lib/typescript/core/haptics/context.d.ts +3 -0
- package/lib/typescript/core/haptics/haptics.d.ts +33 -0
- package/lib/typescript/core/haptics/index.d.ts +6 -0
- package/lib/typescript/core/haptics/useHaptics.d.ts +12 -0
- package/lib/typescript/core/icon/icons/trending-up.d.ts +3 -0
- package/lib/typescript/core/icon/names.d.ts +1 -1
- package/lib/typescript/core/media/expoImage.d.ts +15 -6
- package/lib/typescript/core/media/pickers.d.ts +5 -5
- package/lib/typescript/core/motion/config.d.ts +2 -1
- package/lib/typescript/core/motion/index.d.ts +3 -1
- package/lib/typescript/core/motion/usePressState.d.ts +21 -0
- package/lib/typescript/core/style/index.d.ts +1 -0
- package/lib/typescript/core/style/radius.d.ts +2 -0
- package/lib/typescript/index.d.ts +4 -2
- package/lib/typescript/modules/accordion/Accordion.variants.d.ts +2 -2
- package/lib/typescript/modules/alert-dialog/AlertDialog.variants.d.ts +1 -0
- package/lib/typescript/modules/avatar/Avatar.variants.d.ts +1 -1
- package/lib/typescript/modules/avatar-group/AvatarGroup.d.ts +4 -2
- package/lib/typescript/modules/avatar-group/AvatarGroup.variants.d.ts +19 -0
- package/lib/typescript/modules/banner/Banner.d.ts +2 -0
- package/lib/typescript/modules/bottom-nav/BottomNav.variants.d.ts +1 -3
- package/lib/typescript/modules/bottom-sheet/BottomSheet.variants.d.ts +3 -1
- package/lib/typescript/modules/button/Button.d.ts +0 -25
- package/lib/typescript/modules/button/Button.variants.d.ts +6 -6
- package/lib/typescript/modules/button-group/ButtonGroup.d.ts +0 -19
- package/lib/typescript/modules/button-group/ButtonGroup.variants.d.ts +22 -56
- package/lib/typescript/modules/card/Card.d.ts +7 -5
- package/lib/typescript/modules/charts/Charts.variants.d.ts +29 -1
- package/lib/typescript/modules/chip/Chip.d.ts +3 -1
- package/lib/typescript/modules/chip/Chip.variants.d.ts +6 -2
- package/lib/typescript/modules/chip/index.d.ts +1 -1
- package/lib/typescript/modules/combobox/Combobox.variants.d.ts +17 -4
- package/lib/typescript/modules/data-table/DataTable.variants.d.ts +1 -1
- package/lib/typescript/modules/date-picker/DatePicker.variants.d.ts +15 -3
- package/lib/typescript/modules/date-picker/TimePicker.d.ts +1 -7
- package/lib/typescript/modules/divider/Divider.variants.d.ts +4 -4
- package/lib/typescript/modules/empty-state/EmptyState.d.ts +2 -0
- package/lib/typescript/modules/empty-state/EmptyState.variants.d.ts +1 -0
- package/lib/typescript/modules/fab/Fab.variants.d.ts +2 -0
- package/lib/typescript/modules/folder-row/FolderRow.d.ts +0 -8
- package/lib/typescript/modules/gantt/Gantt.variants.d.ts +21 -0
- package/lib/typescript/modules/input/Input.variants.d.ts +6 -6
- package/lib/typescript/modules/list-item/ListItem.d.ts +1 -5
- package/lib/typescript/modules/list-item/ListItem.variants.d.ts +137 -1
- package/lib/typescript/modules/markdown/Markdown.d.ts +7 -0
- package/lib/typescript/modules/message-bubble/MessageBubble.d.ts +2 -2
- package/lib/typescript/modules/message-bubble/MessageBubble.variants.d.ts +1 -2
- package/lib/typescript/modules/number-input/NumberInput.variants.d.ts +7 -5
- package/lib/typescript/modules/pagination/PaginationControls.d.ts +1 -4
- package/lib/typescript/modules/reorder/Reorder.d.ts +1 -1
- package/lib/typescript/modules/screen/Screen.d.ts +3 -9
- package/lib/typescript/modules/screen/Screen.variants.d.ts +4 -0
- package/lib/typescript/modules/search-bar/SearchBar.variants.d.ts +6 -6
- package/lib/typescript/modules/section/Section.variants.d.ts +0 -3
- package/lib/typescript/modules/segmented-control/SegmentedControl.variants.d.ts +1 -1
- package/lib/typescript/modules/select/Select.d.ts +4 -1
- package/lib/typescript/modules/select/Select.variants.d.ts +22 -8
- package/lib/typescript/modules/select/index.d.ts +1 -1
- package/lib/typescript/modules/skeleton/Skeleton.d.ts +3 -18
- package/lib/typescript/modules/skeleton/Skeleton.variants.d.ts +12 -68
- package/lib/typescript/modules/stage-progress/StageProgress.variants.d.ts +15 -6
- package/lib/typescript/modules/state-block/StateBlock.d.ts +4 -0
- package/lib/typescript/modules/state-block/StateBlock.variants.d.ts +1 -0
- package/lib/typescript/modules/surface/Surface.d.ts +19 -0
- package/lib/typescript/modules/surface/Surface.variants.d.ts +15 -0
- package/lib/typescript/modules/surface/index.d.ts +4 -0
- package/lib/typescript/modules/text/Text.d.ts +8 -4
- package/lib/typescript/modules/text/Text.variants.d.ts +14 -11
- package/lib/typescript/modules/toast/Toast.variants.d.ts +2 -0
- package/lib/typescript/modules/tooltip/Tooltip.variants.d.ts +7 -0
- package/lib/typescript/theme/index.d.ts +1 -1
- package/lib/typescript/theme/platform/elevation.native.d.ts +0 -30
- package/lib/typescript/theme/platform/floatingSurface.native.d.ts +10 -0
- package/lib/typescript/theme/platform/highlight.native.d.ts +17 -0
- package/lib/typescript/theme/platform/index.d.ts +9 -0
- package/lib/typescript/theme/platform/motion.native.d.ts +33 -13
- package/lib/typescript/theme/platform/stateLayer.native.d.ts +11 -0
- package/lib/typescript/theme/platform/surfaces.native.d.ts +8 -0
- package/lib/typescript/theme/provider/PixelizeProvider.d.ts +1 -1
- package/lib/typescript/theme/provider/types.d.ts +8 -0
- package/lib/typescript/theme/tokens/assertPalette.d.ts +10 -0
- package/lib/typescript/theme/tokens/brands/emerald/palette.light.d.ts +4 -3
- package/lib/typescript/theme/tokens/brands/lavender/palette.light.d.ts +4 -3
- package/lib/typescript/theme/tokens/brands/meadow/palette.light.d.ts +4 -3
- package/lib/typescript/theme/tokens/brands/radiant/palette.light.d.ts +4 -3
- package/lib/typescript/theme/tokens/brands/rosewood/palette.light.d.ts +4 -3
- package/lib/typescript/theme/tokens/brands/skyline/palette.light.d.ts +4 -3
- package/lib/typescript/theme/tokens/brands/slate/palette.light.d.ts +4 -3
- package/lib/typescript/theme/tokens/brands/storefront/palette.light.d.ts +4 -3
- package/lib/typescript/theme/tokens/brands/zinc/palette.light.d.ts +4 -3
- package/lib/typescript/theme/tokens/builders/finalizePalette.d.ts +4 -0
- package/lib/typescript/theme/tokens/builders/liftToContrast.d.ts +9 -0
- package/lib/typescript/theme/tokens/builders/placeholderInk.d.ts +13 -0
- package/lib/typescript/theme/tokens/builders/semanticText.d.ts +4 -0
- package/lib/typescript/theme/tokens/builders/surfaceRungs.d.ts +12 -0
- package/lib/typescript/theme/tokens/index.d.ts +5 -0
- package/lib/typescript/theme/tokens/roles/index.d.ts +1 -0
- package/lib/typescript/theme/tokens/types.d.ts +8 -7
- package/package.json +10 -2
- package/registry.json +5 -0
|
@@ -10,6 +10,7 @@ import { focusItemProps, useDismissOnEscape, useFocusTrap, useRovingKeys, useSpa
|
|
|
10
10
|
import { Icon } from "../../core/icon/index.js";
|
|
11
11
|
import { VirtualList } from "../../core/list/index.js";
|
|
12
12
|
import { useMotion, usePressMotion, useReveal } from "../../core/motion/index.js";
|
|
13
|
+
import { rippleColor } from "../../theme/platform/stateLayer.native.js";
|
|
13
14
|
import { useTheme } from "../../theme/hooks.js";
|
|
14
15
|
import { ModalPortalContext } from "../modal/ModalPortalContext.js";
|
|
15
16
|
import { renderWebPortal } from "../modal/renderWebPortal";
|
|
@@ -71,6 +72,10 @@ const MultiSelectOptionRow = /*#__PURE__*/memo(function MultiSelectOptionRow({
|
|
|
71
72
|
}) => ({
|
|
72
73
|
backgroundColor: pressed ? rowColors.pressedRow : rowColors.background
|
|
73
74
|
}), [rowColors]);
|
|
75
|
+
const androidRipple = useMemo(() => Platform.OS === "android" ? {
|
|
76
|
+
color: rippleColor(theme.mode),
|
|
77
|
+
borderless: false
|
|
78
|
+
} : undefined, [theme.mode]);
|
|
74
79
|
const indicatorStyle = useMemo(() => [indicatorStructure, {
|
|
75
80
|
borderColor: checked ? rowColors.indicatorFill : rowColors.indicatorBorder,
|
|
76
81
|
backgroundColor: checked ? rowColors.indicatorFill : "transparent"
|
|
@@ -89,6 +94,7 @@ const MultiSelectOptionRow = /*#__PURE__*/memo(function MultiSelectOptionRow({
|
|
|
89
94
|
onPress: handlePress,
|
|
90
95
|
onPressIn: press.onPressIn,
|
|
91
96
|
onPressOut: press.onPressOut,
|
|
97
|
+
android_ripple: androidRipple,
|
|
92
98
|
style: rowStyle,
|
|
93
99
|
children: /*#__PURE__*/_jsxs(Animated.View, {
|
|
94
100
|
testID: testID ? `${testID}-option-${option.value}-content` : undefined,
|
|
@@ -204,10 +210,22 @@ export const MultiSelect = /*#__PURE__*/memo(function MultiSelect({
|
|
|
204
210
|
}), {
|
|
205
211
|
backgroundColor: triggerColors.background,
|
|
206
212
|
borderColor: triggerColors.border
|
|
213
|
+
}, {
|
|
214
|
+
overflow: "hidden"
|
|
207
215
|
}, disabled && styles.dimmed], [theme, size, triggerColors, disabled]);
|
|
216
|
+
const triggerRipple = useMemo(() => Platform.OS === "android" && !disabled ? {
|
|
217
|
+
color: rippleColor(theme.mode),
|
|
218
|
+
borderless: false
|
|
219
|
+
} : undefined, [disabled, theme.mode]);
|
|
208
220
|
const overlayStructure = useMemo(() => multiSelectOverlayStructure(theme), [theme]);
|
|
209
221
|
const headerStructure = useMemo(() => multiSelectHeaderStructure(theme), [theme]);
|
|
210
|
-
const closeButtonStructure = useMemo(() => multiSelectCloseButtonStructure(theme),
|
|
222
|
+
const closeButtonStructure = useMemo(() => [multiSelectCloseButtonStructure(theme), {
|
|
223
|
+
overflow: "hidden"
|
|
224
|
+
}], [theme]);
|
|
225
|
+
const closeButtonRipple = useMemo(() => Platform.OS === "android" ? {
|
|
226
|
+
color: rippleColor(theme.mode),
|
|
227
|
+
borderless: false
|
|
228
|
+
} : undefined, [theme.mode]);
|
|
211
229
|
const sheetStyle = useMemo(() => [multiSelectSheetStructure(theme), {
|
|
212
230
|
backgroundColor: theme.colors.bg.surface
|
|
213
231
|
}], [theme]);
|
|
@@ -242,6 +260,7 @@ export const MultiSelect = /*#__PURE__*/memo(function MultiSelect({
|
|
|
242
260
|
accessibilityLabel: "Close",
|
|
243
261
|
onPress: closeMenu,
|
|
244
262
|
hitSlop: MULTI_SELECT_CLOSE_BUTTON_HIT_SLOP,
|
|
263
|
+
android_ripple: closeButtonRipple,
|
|
245
264
|
style: closeButtonStructure,
|
|
246
265
|
children: /*#__PURE__*/_jsx(Icon, {
|
|
247
266
|
name: "x",
|
|
@@ -267,6 +286,8 @@ export const MultiSelect = /*#__PURE__*/memo(function MultiSelect({
|
|
|
267
286
|
}), portalContainer) : null : /*#__PURE__*/_jsx(Modal, {
|
|
268
287
|
visible: open,
|
|
269
288
|
transparent: true,
|
|
289
|
+
statusBarTranslucent: true,
|
|
290
|
+
navigationBarTranslucent: true,
|
|
270
291
|
animationType: "none",
|
|
271
292
|
onRequestClose: closeMenu,
|
|
272
293
|
children: sheet
|
|
@@ -287,6 +308,7 @@ export const MultiSelect = /*#__PURE__*/memo(function MultiSelect({
|
|
|
287
308
|
onFocus: handleFocus,
|
|
288
309
|
onBlur: handleBlur,
|
|
289
310
|
hitSlop: spec.hitSlop,
|
|
311
|
+
android_ripple: triggerRipple,
|
|
290
312
|
style: triggerStyle,
|
|
291
313
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
292
314
|
numberOfLines: 1,
|
|
@@ -115,7 +115,8 @@ export const multiSelectTriggerStructure = createThemedVariants(theme => ({
|
|
|
115
115
|
alignItems: "center",
|
|
116
116
|
justifyContent: "space-between",
|
|
117
117
|
columnGap: theme.space[2],
|
|
118
|
-
borderRadius: theme.radii.
|
|
118
|
+
borderRadius: theme.radii.md,
|
|
119
|
+
borderCurve: "continuous",
|
|
119
120
|
borderWidth: theme.borderWidths.thin
|
|
120
121
|
},
|
|
121
122
|
variants: {
|
|
@@ -150,7 +151,8 @@ export const multiSelectOverlayStructure = createThemedVariants(theme => ({
|
|
|
150
151
|
}));
|
|
151
152
|
export const multiSelectSheetStructure = createThemedVariants(theme => ({
|
|
152
153
|
base: {
|
|
153
|
-
borderRadius: theme.radii.
|
|
154
|
+
borderRadius: theme.radii.md,
|
|
155
|
+
borderCurve: "continuous",
|
|
154
156
|
paddingBottom: theme.space[2],
|
|
155
157
|
maxHeight: 360,
|
|
156
158
|
...theme.elevation.lg
|
|
@@ -89,7 +89,8 @@ typed values are clamped to range but never snapped to a `step` grid.
|
|
|
89
89
|
`fg.default` is already proven ≥ 4.5:1 against `bg.canvas` by the 1.4.3 test above, and contrast is
|
|
90
90
|
symmetric, so the fill clears the 3:1 non-text minimum AND the inverted glyph clears 4.5:1 text
|
|
91
91
|
contrast on it, for free, on every brand × mode — measured directly by its own `it.each` in
|
|
92
|
-
`NumberInput.test.ts` (not assumed safe by borrowing another component's test).
|
|
92
|
+
`NumberInput.test.ts` (not assumed safe by borrowing another component's test). Press choreography
|
|
93
|
+
is `usePressState` scale on the stepper `Pressable`s (background swap still keys off `press.pressed`).
|
|
93
94
|
- **2.4.7 / 2.4.11 focus** — a visible focus ring (`border.focus`, offset a small gap outside the
|
|
94
95
|
control, same geometry/token as Button/Input/Checkbox) appears independently on: the `TextInput`
|
|
95
96
|
(whole-row ring), the decrement `Pressable`, and the increment `Pressable` (each stepper gets its
|
|
@@ -15,13 +15,17 @@
|
|
|
15
15
|
|
|
16
16
|
import { memo, useEffect, useState } from "react";
|
|
17
17
|
import { Platform, Pressable, StyleSheet, Text, TextInput, View } from "react-native";
|
|
18
|
+
import Animated from "react-native-reanimated";
|
|
18
19
|
import { Icon } from "../../core/icon/index.js";
|
|
20
|
+
import { usePressState } from "../../core/motion/usePressState.js";
|
|
21
|
+
import { rippleColor } from "../../theme/platform/stateLayer.native.js";
|
|
19
22
|
import { useTheme } from "../../theme/hooks.js";
|
|
20
23
|
import { canDecrementNumberInput, canIncrementNumberInput, clampNumberInputValue, NUMBER_INPUT_SIZES, numberInputStepperStructure, numberInputStructure, parseNumberInputDraft, resolveNumberInputAccessibility, resolveNumberInputStatus, resolveNumberInputStepperPressColors } from "./NumberInput.variants.js";
|
|
21
|
-
import { jsx as _jsx,
|
|
24
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
22
25
|
const ICON_STROKE = 2;
|
|
23
26
|
const FOCUS_RING_WIDTH = 2;
|
|
24
27
|
const FOCUS_RING_GAP = 2;
|
|
28
|
+
const AnimatedPressable = Animated.createAnimatedComponent(Pressable);
|
|
25
29
|
|
|
26
30
|
/**
|
|
27
31
|
* Same offset-ring geometry/token as the field's own ring (and Button/Input/Checkbox), but rounded
|
|
@@ -29,7 +33,7 @@ const FOCUS_RING_GAP = 2;
|
|
|
29
33
|
* radius split — so the ring doesn't square off past the row's rounded corner.
|
|
30
34
|
*/
|
|
31
35
|
function stepperFocusRingStyle(theme, position) {
|
|
32
|
-
const radius = theme.radii.
|
|
36
|
+
const radius = theme.radii.md + FOCUS_RING_GAP + FOCUS_RING_WIDTH;
|
|
33
37
|
return {
|
|
34
38
|
position: "absolute",
|
|
35
39
|
top: -(FOCUS_RING_GAP + FOCUS_RING_WIDTH),
|
|
@@ -77,6 +81,18 @@ export const NumberInput = /*#__PURE__*/memo(function NumberInput(props) {
|
|
|
77
81
|
const spec = NUMBER_INPUT_SIZES[size];
|
|
78
82
|
const statusColors = resolveNumberInputStatus(theme.colors, status);
|
|
79
83
|
const pressColors = resolveNumberInputStepperPressColors(theme.colors);
|
|
84
|
+
const decrementEnabled = canDecrementNumberInput({
|
|
85
|
+
value,
|
|
86
|
+
min,
|
|
87
|
+
disabled
|
|
88
|
+
});
|
|
89
|
+
const incrementEnabled = canIncrementNumberInput({
|
|
90
|
+
value,
|
|
91
|
+
max,
|
|
92
|
+
disabled
|
|
93
|
+
});
|
|
94
|
+
const decrementPress = usePressState(!decrementEnabled);
|
|
95
|
+
const incrementPress = usePressState(!incrementEnabled);
|
|
80
96
|
const a11y = resolveNumberInputAccessibility({
|
|
81
97
|
value,
|
|
82
98
|
min,
|
|
@@ -88,16 +104,6 @@ export const NumberInput = /*#__PURE__*/memo(function NumberInput(props) {
|
|
|
88
104
|
status,
|
|
89
105
|
errorText
|
|
90
106
|
});
|
|
91
|
-
const decrementEnabled = canDecrementNumberInput({
|
|
92
|
-
value,
|
|
93
|
-
min,
|
|
94
|
-
disabled
|
|
95
|
-
});
|
|
96
|
-
const incrementEnabled = canIncrementNumberInput({
|
|
97
|
-
value,
|
|
98
|
-
max,
|
|
99
|
-
disabled
|
|
100
|
-
});
|
|
101
107
|
const handleChangeText = raw => {
|
|
102
108
|
setDraft(raw);
|
|
103
109
|
const parsed = parseNumberInputDraft(raw);
|
|
@@ -152,46 +158,49 @@ export const NumberInput = /*#__PURE__*/memo(function NumberInput(props) {
|
|
|
152
158
|
bottom: -(FOCUS_RING_GAP + FOCUS_RING_WIDTH),
|
|
153
159
|
borderWidth: FOCUS_RING_WIDTH,
|
|
154
160
|
borderColor: theme.colors.border.focus,
|
|
155
|
-
borderRadius: theme.radii.
|
|
161
|
+
borderRadius: theme.radii.md + FOCUS_RING_GAP + FOCUS_RING_WIDTH,
|
|
162
|
+
borderCurve: "continuous"
|
|
156
163
|
}
|
|
157
|
-
}), /*#__PURE__*/
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
164
|
+
}), /*#__PURE__*/_jsxs(View, {
|
|
165
|
+
style: styles.stepperHost,
|
|
166
|
+
children: [decrementFocused && decrementEnabled && /*#__PURE__*/_jsx(View, {
|
|
167
|
+
pointerEvents: "none",
|
|
168
|
+
testID: "number-input-decrement-focus-ring",
|
|
169
|
+
style: stepperFocusRingStyle(theme, "leading")
|
|
170
|
+
}), /*#__PURE__*/_jsx(AnimatedPressable, {
|
|
171
|
+
testID: testID ? `${testID}-decrement` : undefined,
|
|
172
|
+
accessibilityRole: "button",
|
|
173
|
+
accessibilityLabel: "Decrease",
|
|
174
|
+
"aria-disabled": !decrementEnabled,
|
|
175
|
+
disabled: !decrementEnabled,
|
|
176
|
+
focusable: decrementEnabled,
|
|
177
|
+
onPress: handleDecrement,
|
|
178
|
+
onPressIn: decrementPress.handlers.onPressIn,
|
|
179
|
+
onPressOut: decrementPress.handlers.onPressOut,
|
|
180
|
+
onLayout: decrementPress.onLayout,
|
|
181
|
+
onFocus: () => setDecrementFocused(true),
|
|
182
|
+
onBlur: () => setDecrementFocused(false),
|
|
183
|
+
hitSlop: spec.hitSlop,
|
|
184
|
+
android_ripple: decrementEnabled && Platform.OS === "android" ? {
|
|
185
|
+
color: rippleColor(theme.mode),
|
|
186
|
+
borderless: false
|
|
187
|
+
} : undefined,
|
|
188
|
+
style: [numberInputStepperStructure(theme, {
|
|
189
|
+
size,
|
|
190
|
+
position: "leading"
|
|
191
|
+
}), {
|
|
192
|
+
borderColor: statusColors.border,
|
|
193
|
+
overflow: "hidden"
|
|
194
|
+
}, decrementPress.pressed && decrementEnabled && {
|
|
195
|
+
backgroundColor: pressColors.fill
|
|
196
|
+
}, decrementPress.animatedStyle, !disabled && !decrementEnabled && styles.dimmed],
|
|
197
|
+
children: /*#__PURE__*/_jsx(Icon, {
|
|
189
198
|
name: "minus",
|
|
190
199
|
size: spec.iconSize,
|
|
191
|
-
color:
|
|
200
|
+
color: decrementEnabled && decrementPress.pressed ? pressColors.icon : theme.colors.fg.default,
|
|
192
201
|
strokeWidth: ICON_STROKE
|
|
193
|
-
})
|
|
194
|
-
})
|
|
202
|
+
})
|
|
203
|
+
})]
|
|
195
204
|
}), /*#__PURE__*/_jsx(TextInput, {
|
|
196
205
|
testID: testID,
|
|
197
206
|
value: draft,
|
|
@@ -219,41 +228,46 @@ export const NumberInput = /*#__PURE__*/memo(function NumberInput(props) {
|
|
|
219
228
|
fontSize: spec.fontSize,
|
|
220
229
|
color: theme.colors.fg.default
|
|
221
230
|
}, theme.fontStyleForWeight(theme.fontWeights.regular), Platform.OS === "web" && styles.webOutlineReset]
|
|
222
|
-
}), /*#__PURE__*/
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
231
|
+
}), /*#__PURE__*/_jsxs(View, {
|
|
232
|
+
style: styles.stepperHost,
|
|
233
|
+
children: [incrementFocused && incrementEnabled && /*#__PURE__*/_jsx(View, {
|
|
234
|
+
pointerEvents: "none",
|
|
235
|
+
testID: "number-input-increment-focus-ring",
|
|
236
|
+
style: stepperFocusRingStyle(theme, "trailing")
|
|
237
|
+
}), /*#__PURE__*/_jsx(AnimatedPressable, {
|
|
238
|
+
testID: testID ? `${testID}-increment` : undefined,
|
|
239
|
+
accessibilityRole: "button",
|
|
240
|
+
accessibilityLabel: "Increase",
|
|
241
|
+
"aria-disabled": !incrementEnabled,
|
|
242
|
+
disabled: !incrementEnabled,
|
|
243
|
+
focusable: incrementEnabled,
|
|
244
|
+
onPress: handleIncrement,
|
|
245
|
+
onPressIn: incrementPress.handlers.onPressIn,
|
|
246
|
+
onPressOut: incrementPress.handlers.onPressOut,
|
|
247
|
+
onLayout: incrementPress.onLayout,
|
|
248
|
+
onFocus: () => setIncrementFocused(true),
|
|
249
|
+
onBlur: () => setIncrementFocused(false),
|
|
250
|
+
hitSlop: spec.hitSlop,
|
|
251
|
+
android_ripple: incrementEnabled && Platform.OS === "android" ? {
|
|
252
|
+
color: rippleColor(theme.mode),
|
|
253
|
+
borderless: false
|
|
254
|
+
} : undefined,
|
|
255
|
+
style: [numberInputStepperStructure(theme, {
|
|
256
|
+
size,
|
|
257
|
+
position: "trailing"
|
|
258
|
+
}), {
|
|
259
|
+
borderColor: statusColors.border,
|
|
260
|
+
overflow: "hidden"
|
|
261
|
+
}, incrementPress.pressed && incrementEnabled && {
|
|
262
|
+
backgroundColor: pressColors.fill
|
|
263
|
+
}, incrementPress.animatedStyle, !disabled && !incrementEnabled && styles.dimmed],
|
|
264
|
+
children: /*#__PURE__*/_jsx(Icon, {
|
|
251
265
|
name: "plus",
|
|
252
266
|
size: spec.iconSize,
|
|
253
|
-
color:
|
|
267
|
+
color: incrementEnabled && incrementPress.pressed ? pressColors.icon : theme.colors.fg.default,
|
|
254
268
|
strokeWidth: ICON_STROKE
|
|
255
|
-
})
|
|
256
|
-
})
|
|
269
|
+
})
|
|
270
|
+
})]
|
|
257
271
|
})]
|
|
258
272
|
}), a11y.message !== undefined && /*#__PURE__*/_jsx(Text, {
|
|
259
273
|
testID: testID ? `${testID}-error` : undefined,
|
|
@@ -267,13 +281,12 @@ export const NumberInput = /*#__PURE__*/memo(function NumberInput(props) {
|
|
|
267
281
|
});
|
|
268
282
|
});
|
|
269
283
|
const styles = StyleSheet.create({
|
|
270
|
-
// A disabled control is exempt from the contrast minimum (WCAG 1.4.3), so a uniform dim is correct.
|
|
271
284
|
dimmed: {
|
|
272
285
|
opacity: 0.5
|
|
273
286
|
},
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
287
|
+
stepperHost: {
|
|
288
|
+
position: "relative"
|
|
289
|
+
},
|
|
277
290
|
webOutlineReset: {
|
|
278
291
|
outlineStyle: "solid",
|
|
279
292
|
outlineWidth: 0,
|
|
@@ -168,7 +168,8 @@ export const numberInputStructure = createThemedVariants(theme => ({
|
|
|
168
168
|
flexDirection: "row",
|
|
169
169
|
alignItems: "center",
|
|
170
170
|
borderWidth: theme.borderWidths.thin,
|
|
171
|
-
borderRadius: theme.radii.
|
|
171
|
+
borderRadius: theme.radii.md,
|
|
172
|
+
borderCurve: "continuous"
|
|
172
173
|
},
|
|
173
174
|
variants: {
|
|
174
175
|
size: {
|
|
@@ -193,7 +194,7 @@ export const numberInputStructure = createThemedVariants(theme => ({
|
|
|
193
194
|
* `TextInput` carries: without it, the row's `alignItems: "center"` shrinks the button to its
|
|
194
195
|
* intrinsic content height instead of the row's full `spec.height`, silently voiding the `hitSlop`
|
|
195
196
|
* touch-target math (a real Wave-1 bug on Input — not one to repeat here). The corner radii on the
|
|
196
|
-
* outer edge match the row's own `radii.
|
|
197
|
+
* outer edge match the row's own `radii.md` so a pressed/focused fill doesn't square off past the
|
|
197
198
|
* row's rounded corner.
|
|
198
199
|
*/
|
|
199
200
|
export const numberInputStepperStructure = createThemedVariants(theme => ({
|
|
@@ -217,13 +218,15 @@ export const numberInputStepperStructure = createThemedVariants(theme => ({
|
|
|
217
218
|
position: {
|
|
218
219
|
leading: {
|
|
219
220
|
borderRightWidth: theme.borderWidths.thin,
|
|
220
|
-
borderTopLeftRadius: theme.radii.
|
|
221
|
-
borderBottomLeftRadius: theme.radii.
|
|
221
|
+
borderTopLeftRadius: theme.radii.md,
|
|
222
|
+
borderBottomLeftRadius: theme.radii.md,
|
|
223
|
+
borderCurve: "continuous"
|
|
222
224
|
},
|
|
223
225
|
trailing: {
|
|
224
226
|
borderLeftWidth: theme.borderWidths.thin,
|
|
225
|
-
borderTopRightRadius: theme.radii.
|
|
226
|
-
borderBottomRightRadius: theme.radii.
|
|
227
|
+
borderTopRightRadius: theme.radii.md,
|
|
228
|
+
borderBottomRightRadius: theme.radii.md,
|
|
229
|
+
borderCurve: "continuous"
|
|
227
230
|
}
|
|
228
231
|
}
|
|
229
232
|
},
|
|
@@ -69,7 +69,10 @@ mode — `bg.selected` is not, which is exactly why `Select` refuses to tint.
|
|
|
69
69
|
- The trigger is a `button` named **"Switch organization, <org>"** — the org name alone would
|
|
70
70
|
not tell a screen-reader user what the control does — with `aria-expanded` tracking the sheet
|
|
71
71
|
(WCAG 4.1.2).
|
|
72
|
-
- Rows are `
|
|
72
|
+
- Rows are `role="radio"` with `aria-checked` — picking an org is choosing exactly one from a
|
|
73
|
+
mutually exclusive set, and `aria-selected` is invalid ARIA on `role="menuitem"` (2026-08 sweep;
|
|
74
|
+
React Native's typed `accessibilityRole` has no `menuitemradio`, so `radio` is the closest valid
|
|
75
|
+
role). The tint is never the *only* selection cue.
|
|
73
76
|
- Rows and trigger both clear the 44dp touch target (trigger via `hitSlop`).
|
|
74
77
|
- **2.1.1 keyboard (web only)** — on the `ModalPortalProvider` branch there is no RN `<Modal>`, so
|
|
75
78
|
`react-native-web`'s own Escape / focus trap / focus restore never run. The sheet wires
|
|
@@ -89,6 +92,10 @@ The host app owns fetching the org list and the active org id, passing `role` as
|
|
|
89
92
|
- **No roving tabindex / arrow keys on the row list** — each row is still its own tab stop, which is
|
|
90
93
|
acceptable at real org counts (the same reason there is no search box) but would want
|
|
91
94
|
`useRovingKeys` if that list ever grows.
|
|
95
|
+
- **No `role="radiogroup"` on the sheet's row list.** Each row is individually a valid `radio`, but
|
|
96
|
+
nothing groups them, so a screen reader doesn't announce "N options" up front. Not added alongside
|
|
97
|
+
the `menuitem` → `radio` fix because `radiogroup` semantics conventionally pair with arrow-key
|
|
98
|
+
roving, which the gap above says this list doesn't have — revisit both together.
|
|
92
99
|
|
|
93
100
|
## Performance contract
|
|
94
101
|
|
|
@@ -119,3 +126,8 @@ The host app owns fetching the org list and the active org id, passing `role` as
|
|
|
119
126
|
## Modernization (v1.0.7)
|
|
120
127
|
|
|
121
128
|
- Theme imports decoupled to `theme/hooks`; optional peers (reanimated, gesture-handler, flash-list) load at runtime.
|
|
129
|
+
|
|
130
|
+
- **Round 2 visual** — radii retarget (`radii.md`/`lg`/`xl`/`full`), `borderCurve: continuous` on md+ corners; floating surfaces wire platform elevation/highlight where applicable.
|
|
131
|
+
- **Round 5 tonal** — the trigger's `border.interactive` hairline is KEPT: it's a form-control
|
|
132
|
+
affordance (opens a picker), the identical role `Select`'s own trigger border plays, not decorative
|
|
133
|
+
container chrome. Trigger and rows both gained `android_ripple` for Android parity.
|
|
@@ -26,6 +26,7 @@ import { Icon } from "../../core/icon/index.js";
|
|
|
26
26
|
import { VirtualList } from "../../core/list/index.js";
|
|
27
27
|
import { useAnimatedValue, useEnterExit, useMotion, usePressMotion } from "../../core/motion/index.js";
|
|
28
28
|
import { useTheme } from "../../theme/hooks.js";
|
|
29
|
+
import { rippleColor } from "../../theme/platform/stateLayer.native.js";
|
|
29
30
|
import { Avatar } from "../avatar/index.js";
|
|
30
31
|
import { ModalPortalContext } from "../modal/ModalPortalContext.js";
|
|
31
32
|
import { renderWebPortal } from "../modal/renderWebPortal";
|
|
@@ -51,6 +52,9 @@ const OrgSwitcherRow = /*#__PURE__*/memo(function OrgSwitcherRow({
|
|
|
51
52
|
const rowStructure = useMemo(() => orgSwitcherRowStructure(theme), [theme]);
|
|
52
53
|
const contentStructure = useMemo(() => orgSwitcherRowContentStructure(theme), [theme]);
|
|
53
54
|
const bodyStructure = useMemo(() => orgSwitcherRowBodyStructure(theme), [theme]);
|
|
55
|
+
const androidRipple = useMemo(() => Platform.OS === "android" ? {
|
|
56
|
+
color: rippleColor(theme.mode)
|
|
57
|
+
} : undefined, [theme.mode]);
|
|
54
58
|
const rowStyle = useCallback(({
|
|
55
59
|
pressed
|
|
56
60
|
}) => [rowStructure, {
|
|
@@ -91,11 +95,12 @@ const OrgSwitcherRow = /*#__PURE__*/memo(function OrgSwitcherRow({
|
|
|
91
95
|
useEffect(() => () => running.current?.stop(), []);
|
|
92
96
|
return /*#__PURE__*/_jsx(Pressable, {
|
|
93
97
|
testID: testID ? `${testID}-option-${option.value}` : undefined,
|
|
94
|
-
accessibilityRole: "
|
|
95
|
-
"aria-
|
|
98
|
+
accessibilityRole: "radio",
|
|
99
|
+
"aria-checked": selected,
|
|
96
100
|
onPress: handlePress,
|
|
97
101
|
onPressIn: press.onPressIn,
|
|
98
102
|
onPressOut: press.onPressOut,
|
|
103
|
+
android_ripple: androidRipple,
|
|
99
104
|
style: rowStyle,
|
|
100
105
|
children: /*#__PURE__*/_jsxs(Animated.View, {
|
|
101
106
|
style: [contentStructure, press.style],
|
|
@@ -155,6 +160,9 @@ export const OrgSwitcher = /*#__PURE__*/memo(function OrgSwitcher({
|
|
|
155
160
|
const triggerStructure = useMemo(() => orgSwitcherTriggerStructure(theme, {
|
|
156
161
|
size
|
|
157
162
|
}), [theme, size]);
|
|
163
|
+
const androidRipple = useMemo(() => Platform.OS === "android" ? {
|
|
164
|
+
color: rippleColor(theme.mode)
|
|
165
|
+
} : undefined, [theme.mode]);
|
|
158
166
|
const triggerStyle = useCallback(({
|
|
159
167
|
pressed
|
|
160
168
|
}) => [triggerStructure, {
|
|
@@ -226,6 +234,8 @@ export const OrgSwitcher = /*#__PURE__*/memo(function OrgSwitcher({
|
|
|
226
234
|
}), portalContainer) : null : /*#__PURE__*/_jsx(Modal, {
|
|
227
235
|
visible: open,
|
|
228
236
|
transparent: true,
|
|
237
|
+
statusBarTranslucent: true,
|
|
238
|
+
navigationBarTranslucent: true,
|
|
229
239
|
animationType: "none",
|
|
230
240
|
onRequestClose: closeMenu,
|
|
231
241
|
children: sheet
|
|
@@ -241,6 +251,7 @@ export const OrgSwitcher = /*#__PURE__*/memo(function OrgSwitcher({
|
|
|
241
251
|
onPressIn: triggerPress.onPressIn,
|
|
242
252
|
onPressOut: triggerPress.onPressOut,
|
|
243
253
|
hitSlop: spec.hitSlop,
|
|
254
|
+
android_ripple: androidRipple,
|
|
244
255
|
style: triggerStyle,
|
|
245
256
|
children: /*#__PURE__*/_jsxs(Animated.View, {
|
|
246
257
|
style: [triggerContentStructure, triggerPress.style],
|
|
@@ -100,7 +100,8 @@ export function orgInitials(label) {
|
|
|
100
100
|
export const orgSwitcherTriggerStructure = createThemedVariants(theme => ({
|
|
101
101
|
base: {
|
|
102
102
|
justifyContent: "center",
|
|
103
|
-
borderRadius: theme.radii.
|
|
103
|
+
borderRadius: theme.radii.md,
|
|
104
|
+
borderCurve: "continuous",
|
|
104
105
|
borderWidth: theme.borderWidths.thin
|
|
105
106
|
},
|
|
106
107
|
variants: {
|
|
@@ -152,7 +153,8 @@ export const orgSwitcherOverlayStructure = createThemedVariants(theme => ({
|
|
|
152
153
|
}));
|
|
153
154
|
export const orgSwitcherSheetStructure = createThemedVariants(theme => ({
|
|
154
155
|
base: {
|
|
155
|
-
borderRadius: theme.radii.
|
|
156
|
+
borderRadius: theme.radii.md,
|
|
157
|
+
borderCurve: "continuous",
|
|
156
158
|
paddingVertical: theme.space[2],
|
|
157
159
|
maxHeight: 320,
|
|
158
160
|
...theme.elevation.lg
|
|
@@ -89,8 +89,8 @@ for a closed union to resolve.
|
|
|
89
89
|
also set on the rendered summary text: `useAnnounce` already announces on both platforms, so
|
|
90
90
|
keeping both would double-announce on Android (same rule `Input`/`FormField`/`FileUpload` follow).
|
|
91
91
|
- **2.3.3** — the compact summary's fade is skipped and its opacity `setValue`'d whenever
|
|
92
|
-
`useMotion().enabled` is false (reduced motion or the global kill switch).
|
|
93
|
-
|
|
92
|
+
`useMotion().enabled` is false (reduced motion or the global kill switch). Page controls and the
|
|
93
|
+
load-more button use `usePressState` (scale + state-layer overlay), which snaps under reduce motion.
|
|
94
94
|
|
|
95
95
|
## Page-change motion
|
|
96
96
|
|