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
|
@@ -19,15 +19,20 @@
|
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
import { memo, useCallback, useMemo, useRef, useState } from "react";
|
|
22
|
-
import { Pressable, Text, View } from "react-native";
|
|
22
|
+
import { Pressable, StyleSheet, Text, View } from "react-native";
|
|
23
|
+
import Animated from "react-native-reanimated";
|
|
23
24
|
import { Icon } from "../../core/icon/index.js";
|
|
25
|
+
import { usePressState } from "../../core/motion/usePressState.js";
|
|
26
|
+
import { concentric } from "../../core/style/index.js";
|
|
27
|
+
import { stateLayerScrim } from "../../theme/platform/stateLayer.native.js";
|
|
24
28
|
import { useTheme } from "../../theme/hooks.js";
|
|
25
29
|
import { Button } from "../button/index.js";
|
|
26
30
|
import { useCalendarGridFocus, useCalendarGridKeys } from "./Calendar.keys";
|
|
27
|
-
import { addMonths, atNoon, buildMonthGrid, calendarDayCellStructure, calendarGridStructure, calendarHeaderButtonStructure, calendarHeaderStructure, calendarStructure, calendarWeekRowStructure, calendarWeekdayCellStructure, canShowMonth, canShowYear, chunkIntoWeeks, clampToRange, DEFAULT_FIRST_DAY_OF_WEEK, DEFAULT_LOCALE, EMPTY_RANGE, dayOrdinal, formatMonthYear, formatYear, isDateDisabled, isSameDay, isWithinRange, monthCursorOf, monthShortNames, nextRangeSelection, quickJumpCellStructure, quickJumpGridStructure, resolveCalendarChromeColors, resolveCalendarDayAccessibility, resolveCalendarDayColors, resolveCalendarFocusMove, toDayKey, weekdayLabels } from "./DatePicker.variants.js";
|
|
31
|
+
import { addMonths, atNoon, buildMonthGrid, calendarDayCellStructure, calendarGridStructure, calendarHeaderButtonStructure, calendarHeaderStructure, calendarStructure, calendarWeekRowStructure, calendarWeekdayCellStructure, canShowMonth, canShowYear, chunkIntoWeeks, clampToRange, DEFAULT_FIRST_DAY_OF_WEEK, DEFAULT_LOCALE, EMPTY_RANGE, dayOrdinal, formatMonthYear, formatYear, isDateDisabled, isSameDay, isWithinRange, monthCursorOf, monthShortNames, nextRangeSelection, quickJumpCellStructure, quickJumpGridStructure, resolveCalendarChromeColors, resolveCalendarDayAccessibility, resolveCalendarDayColors, resolveCalendarFocusMove, resolvePressedAccessibilityState, toDayKey, weekdayLabels } from "./DatePicker.variants.js";
|
|
28
32
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
29
33
|
const ICON_STROKE = 2;
|
|
30
34
|
const HEADER_ICON_SIZE = 18;
|
|
35
|
+
const AnimatedPressable = Animated.createAnimatedComponent(Pressable);
|
|
31
36
|
const CalendarDayCell = /*#__PURE__*/memo(function CalendarDayCell({
|
|
32
37
|
date,
|
|
33
38
|
dayOfMonth,
|
|
@@ -42,6 +47,7 @@ const CalendarDayCell = /*#__PURE__*/memo(function CalendarDayCell({
|
|
|
42
47
|
onPress,
|
|
43
48
|
testID
|
|
44
49
|
}) {
|
|
50
|
+
const press = usePressState(disabled);
|
|
45
51
|
const a11y = useMemo(() => resolveCalendarDayAccessibility({
|
|
46
52
|
date,
|
|
47
53
|
selected,
|
|
@@ -74,26 +80,39 @@ const CalendarDayCell = /*#__PURE__*/memo(function CalendarDayCell({
|
|
|
74
80
|
const handlePress = useCallback(() => {
|
|
75
81
|
if (!disabled) onPress(date);
|
|
76
82
|
}, [disabled, onPress, date]);
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
const overlayStaticStyle = useMemo(() => ({
|
|
84
|
+
backgroundColor: stateLayerScrim(theme.mode),
|
|
85
|
+
borderRadius: concentric(theme.radii.md, theme.space[1]),
|
|
86
|
+
borderCurve: "continuous"
|
|
87
|
+
}), [theme.mode, theme.radii.md]);
|
|
88
|
+
const cellStyle = useMemo(() => [cellStructure, {
|
|
89
|
+
backgroundColor: resting.background,
|
|
90
|
+
borderColor: resting.ring,
|
|
91
|
+
overflow: "hidden"
|
|
92
|
+
}, press.pressed && !disabled && {
|
|
93
|
+
backgroundColor: pressedBackground
|
|
94
|
+
}, press.animatedStyle], [cellStructure, resting, pressedBackground, press.pressed, press.animatedStyle, disabled]);
|
|
95
|
+
return /*#__PURE__*/_jsxs(AnimatedPressable, {
|
|
84
96
|
testID: testID,
|
|
85
97
|
accessibilityRole: a11y.accessibilityRole,
|
|
86
98
|
accessibilityLabel: a11y.accessibilityLabel,
|
|
87
|
-
"aria-
|
|
99
|
+
"aria-pressed": a11y["aria-pressed"],
|
|
100
|
+
accessibilityState: a11y.accessibilityState,
|
|
88
101
|
"aria-disabled": a11y["aria-disabled"],
|
|
89
102
|
disabled: disabled,
|
|
90
103
|
tabIndex: tabIndex,
|
|
91
104
|
onPress: handlePress,
|
|
105
|
+
onPressIn: press.handlers.onPressIn,
|
|
106
|
+
onPressOut: press.handlers.onPressOut,
|
|
107
|
+
onLayout: press.onLayout,
|
|
92
108
|
style: cellStyle,
|
|
93
|
-
children: /*#__PURE__*/_jsx(
|
|
109
|
+
children: [/*#__PURE__*/_jsx(Animated.View, {
|
|
110
|
+
pointerEvents: "none",
|
|
111
|
+
style: [StyleSheet.absoluteFill, overlayStaticStyle, press.overlayStyle]
|
|
112
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
94
113
|
style: labelStyle,
|
|
95
114
|
children: dayOfMonth
|
|
96
|
-
})
|
|
115
|
+
})]
|
|
97
116
|
});
|
|
98
117
|
});
|
|
99
118
|
const QuickJumpCell = /*#__PURE__*/memo(function QuickJumpCell({
|
|
@@ -105,6 +124,7 @@ const QuickJumpCell = /*#__PURE__*/memo(function QuickJumpCell({
|
|
|
105
124
|
onPress,
|
|
106
125
|
testID
|
|
107
126
|
}) {
|
|
127
|
+
const press = usePressState(disabled);
|
|
108
128
|
const resting = useMemo(() => resolveCalendarDayColors(theme.colors, {
|
|
109
129
|
selected,
|
|
110
130
|
inRange: false,
|
|
@@ -129,24 +149,38 @@ const QuickJumpCell = /*#__PURE__*/memo(function QuickJumpCell({
|
|
|
129
149
|
const handlePress = useCallback(() => {
|
|
130
150
|
if (!disabled) onPress(month);
|
|
131
151
|
}, [disabled, onPress, month]);
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
152
|
+
const pressedState = useMemo(() => resolvePressedAccessibilityState(selected), [selected]);
|
|
153
|
+
const overlayStaticStyle = useMemo(() => ({
|
|
154
|
+
backgroundColor: stateLayerScrim(theme.mode),
|
|
155
|
+
borderRadius: concentric(theme.radii.md, theme.space[1]),
|
|
156
|
+
borderCurve: "continuous"
|
|
157
|
+
}), [theme.mode, theme.radii.md]);
|
|
158
|
+
const cellStyle = useMemo(() => [cellStructure, {
|
|
159
|
+
backgroundColor: resting.background,
|
|
160
|
+
overflow: "hidden"
|
|
161
|
+
}, press.pressed && !disabled && {
|
|
162
|
+
backgroundColor: pressedBackground
|
|
163
|
+
}, press.animatedStyle], [cellStructure, resting.background, pressedBackground, press.pressed, press.animatedStyle, disabled]);
|
|
164
|
+
return /*#__PURE__*/_jsxs(AnimatedPressable, {
|
|
138
165
|
testID: testID,
|
|
139
166
|
accessibilityRole: "button",
|
|
140
167
|
accessibilityLabel: name,
|
|
141
|
-
"aria-
|
|
168
|
+
"aria-pressed": pressedState["aria-pressed"],
|
|
169
|
+
accessibilityState: pressedState.accessibilityState,
|
|
142
170
|
"aria-disabled": disabled,
|
|
143
171
|
disabled: disabled,
|
|
144
172
|
onPress: handlePress,
|
|
173
|
+
onPressIn: press.handlers.onPressIn,
|
|
174
|
+
onPressOut: press.handlers.onPressOut,
|
|
175
|
+
onLayout: press.onLayout,
|
|
145
176
|
style: cellStyle,
|
|
146
|
-
children: /*#__PURE__*/_jsx(
|
|
177
|
+
children: [/*#__PURE__*/_jsx(Animated.View, {
|
|
178
|
+
pointerEvents: "none",
|
|
179
|
+
style: [StyleSheet.absoluteFill, overlayStaticStyle, press.overlayStyle]
|
|
180
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
147
181
|
style: labelStyle,
|
|
148
182
|
children: name
|
|
149
|
-
})
|
|
183
|
+
})]
|
|
150
184
|
});
|
|
151
185
|
});
|
|
152
186
|
export const Calendar = /*#__PURE__*/memo(function Calendar({
|
|
@@ -165,6 +199,7 @@ export const Calendar = /*#__PURE__*/memo(function Calendar({
|
|
|
165
199
|
testID
|
|
166
200
|
}) {
|
|
167
201
|
const theme = useTheme();
|
|
202
|
+
const headerPress = usePressState(false);
|
|
168
203
|
const chrome = useMemo(() => resolveCalendarChromeColors(theme.colors), [theme.colors]);
|
|
169
204
|
const range = rangeValue ?? EMPTY_RANGE;
|
|
170
205
|
const anchor = mode === "range" ? range.start : value ?? null;
|
|
@@ -225,11 +260,14 @@ export const Calendar = /*#__PURE__*/memo(function Calendar({
|
|
|
225
260
|
color: chrome.headerLabel
|
|
226
261
|
}], [theme, chrome.headerLabel]);
|
|
227
262
|
const headerButtonBase = useMemo(() => calendarHeaderButtonStructure(theme), [theme]);
|
|
228
|
-
const headerButtonStyle =
|
|
229
|
-
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
|
|
263
|
+
const headerButtonStyle = useMemo(() => [headerButtonBase, {
|
|
264
|
+
overflow: "hidden"
|
|
265
|
+
}, headerPress.animatedStyle], [headerButtonBase, headerPress.animatedStyle]);
|
|
266
|
+
const headerOverlayStyle = useMemo(() => ({
|
|
267
|
+
backgroundColor: stateLayerScrim(theme.mode),
|
|
268
|
+
borderRadius: theme.radii.md,
|
|
269
|
+
borderCurve: "continuous"
|
|
270
|
+
}), [theme.mode, theme.radii.md]);
|
|
233
271
|
const weekDescriptors = useMemo(() => weeks.map(week => week.map(day => {
|
|
234
272
|
const disabled = isDateDisabled(day.date, {
|
|
235
273
|
minDate,
|
|
@@ -290,14 +328,22 @@ export const Calendar = /*#__PURE__*/memo(function Calendar({
|
|
|
290
328
|
disabled: !canGoBack,
|
|
291
329
|
onPress: goBack,
|
|
292
330
|
testID: testID ? `${testID}-previous` : undefined
|
|
293
|
-
}), /*#__PURE__*/_jsxs(
|
|
331
|
+
}), /*#__PURE__*/_jsxs(AnimatedPressable, {
|
|
294
332
|
testID: testID ? `${testID}-header` : undefined,
|
|
295
333
|
accessibilityRole: "button",
|
|
296
334
|
accessibilityLabel: quickJumpOpen ? formatYear(cursor.year, locale) : formatMonthYear(cursor, locale),
|
|
297
335
|
"aria-expanded": quickJumpOpen,
|
|
298
336
|
onPress: toggleQuickJump,
|
|
299
|
-
|
|
300
|
-
|
|
337
|
+
onPressIn: headerPress.handlers.onPressIn,
|
|
338
|
+
onPressOut: headerPress.handlers.onPressOut,
|
|
339
|
+
onLayout: headerPress.onLayout,
|
|
340
|
+
style: [headerButtonStyle, headerPress.pressed && {
|
|
341
|
+
backgroundColor: chrome.headerPressed
|
|
342
|
+
}],
|
|
343
|
+
children: [/*#__PURE__*/_jsx(Animated.View, {
|
|
344
|
+
pointerEvents: "none",
|
|
345
|
+
style: [StyleSheet.absoluteFill, headerOverlayStyle, headerPress.overlayStyle]
|
|
346
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
301
347
|
numberOfLines: 1,
|
|
302
348
|
style: headerLabelStyle,
|
|
303
349
|
children: quickJumpOpen ? formatYear(cursor.year, locale) : formatMonthYear(cursor, locale)
|
|
@@ -494,6 +494,14 @@ export function resolveDateFieldAccessibility(input) {
|
|
|
494
494
|
disabled
|
|
495
495
|
};
|
|
496
496
|
}
|
|
497
|
+
export function resolvePressedAccessibilityState(selected) {
|
|
498
|
+
return {
|
|
499
|
+
"aria-pressed": selected,
|
|
500
|
+
accessibilityState: {
|
|
501
|
+
selected
|
|
502
|
+
}
|
|
503
|
+
};
|
|
504
|
+
}
|
|
497
505
|
/** Appended to a day's label when the grid conveys the state with colour only (WCAG 1.4.1). */
|
|
498
506
|
export const TODAY_SUFFIX = "today";
|
|
499
507
|
export const IN_RANGE_SUFFIX = "in selected range";
|
|
@@ -505,14 +513,15 @@ export function resolveCalendarDayAccessibility(input) {
|
|
|
505
513
|
return {
|
|
506
514
|
accessibilityRole: "button",
|
|
507
515
|
accessibilityLabel: parts.join(", "),
|
|
508
|
-
"aria-
|
|
509
|
-
|
|
516
|
+
"aria-disabled": input.disabled,
|
|
517
|
+
...resolvePressedAccessibilityState(input.selected)
|
|
510
518
|
};
|
|
511
519
|
}
|
|
512
520
|
export const calendarStructure = createThemedVariants(theme => ({
|
|
513
521
|
base: {
|
|
514
522
|
alignSelf: "stretch",
|
|
515
|
-
borderRadius: theme.radii.
|
|
523
|
+
borderRadius: theme.radii.md,
|
|
524
|
+
borderCurve: "continuous",
|
|
516
525
|
paddingHorizontal: theme.space[2],
|
|
517
526
|
paddingVertical: theme.space[2],
|
|
518
527
|
rowGap: theme.space[1]
|
|
@@ -538,7 +547,8 @@ export const calendarHeaderButtonStructure = createThemedVariants(theme => ({
|
|
|
538
547
|
flexShrink: 1,
|
|
539
548
|
minHeight: MIN_TOUCH_TARGET,
|
|
540
549
|
paddingHorizontal: theme.space[2],
|
|
541
|
-
borderRadius: theme.radii.
|
|
550
|
+
borderRadius: theme.radii.md,
|
|
551
|
+
borderCurve: "continuous"
|
|
542
552
|
}
|
|
543
553
|
}));
|
|
544
554
|
|
|
@@ -578,7 +588,8 @@ export const calendarDayCellStructure = createThemedVariants(theme => ({
|
|
|
578
588
|
alignItems: "center",
|
|
579
589
|
justifyContent: "center",
|
|
580
590
|
minHeight: DAY_CELL_MIN_HEIGHT,
|
|
581
|
-
borderRadius: theme.radii.
|
|
591
|
+
borderRadius: theme.radii.md,
|
|
592
|
+
borderCurve: "continuous",
|
|
582
593
|
// Every cell reserves the today-ring's width so a month's rows don't shift when today scrolls
|
|
583
594
|
// into view; only today's cell paints a colour over it.
|
|
584
595
|
borderWidth: theme.borderWidths.thick,
|
|
@@ -602,7 +613,8 @@ export const quickJumpCellStructure = createThemedVariants(theme => ({
|
|
|
602
613
|
alignItems: "center",
|
|
603
614
|
justifyContent: "center",
|
|
604
615
|
minHeight: QUICK_JUMP_CELL_MIN_HEIGHT,
|
|
605
|
-
borderRadius: theme.radii.
|
|
616
|
+
borderRadius: theme.radii.md,
|
|
617
|
+
borderCurve: "continuous"
|
|
606
618
|
}
|
|
607
619
|
}));
|
|
608
620
|
|
|
@@ -630,7 +642,8 @@ export const timeOptionStructure = createThemedVariants(theme => ({
|
|
|
630
642
|
height: TIME_OPTION_HEIGHT,
|
|
631
643
|
alignItems: "center",
|
|
632
644
|
justifyContent: "center",
|
|
633
|
-
borderRadius: theme.radii.
|
|
645
|
+
borderRadius: theme.radii.md,
|
|
646
|
+
borderCurve: "continuous"
|
|
634
647
|
}
|
|
635
648
|
}));
|
|
636
649
|
|
|
@@ -642,7 +655,8 @@ export const dateFieldStructure = createThemedVariants(theme => ({
|
|
|
642
655
|
height: DATE_FIELD_HEIGHT,
|
|
643
656
|
paddingHorizontal: theme.space[4],
|
|
644
657
|
borderWidth: theme.borderWidths.thin,
|
|
645
|
-
borderRadius: theme.radii.
|
|
658
|
+
borderRadius: theme.radii.md,
|
|
659
|
+
borderCurve: "continuous",
|
|
646
660
|
columnGap: theme.space[2]
|
|
647
661
|
}
|
|
648
662
|
}));
|
|
@@ -666,7 +680,8 @@ export const pickerOverlayStructure = createThemedVariants(theme => ({
|
|
|
666
680
|
}));
|
|
667
681
|
export const pickerSheetStructure = createThemedVariants(theme => ({
|
|
668
682
|
base: {
|
|
669
|
-
borderRadius: theme.radii.
|
|
683
|
+
borderRadius: theme.radii.md,
|
|
684
|
+
borderCurve: "continuous",
|
|
670
685
|
padding: theme.space[2],
|
|
671
686
|
rowGap: theme.space[2],
|
|
672
687
|
...theme.elevation.lg
|
|
@@ -54,14 +54,27 @@ No `mode`/`use24Hour` — a range has no time-of-day dimension in this module.
|
|
|
54
54
|
with a role and no state. RN's own `View`/`Text`/`Pressable` merge the flat props back into
|
|
55
55
|
`accessibilityState` (`View.js`), so native loses nothing — which is why the render tests can still
|
|
56
56
|
read `props.accessibilityState.*` truthfully. The resolvers therefore return literal quoted keys
|
|
57
|
-
(`"aria-
|
|
57
|
+
(`"aria-expanded"`, `"aria-disabled"`) and the JSX spells each one out. `aria-pressed` is the one
|
|
58
|
+
exception: React Native doesn't recognize it, so it isn't merged/stripped — it reaches the rendered
|
|
59
|
+
node as-is on both platforms, and `resolvePressedAccessibilityState` supplies the native
|
|
60
|
+
`accessibilityState.selected` fallback explicitly alongside it (`core/a11y/MODULE.md`).
|
|
58
61
|
- **1.3.1 / 4.1.2** — every day cell's `accessibilityLabel` is the FULL readable date
|
|
59
|
-
(`formatFullDate`, e.g. "Friday, March 15, 2024"), never the bare number; `aria-
|
|
62
|
+
(`formatFullDate`, e.g. "Friday, March 15, 2024"), never the bare number; `aria-pressed` /
|
|
60
63
|
`aria-disabled` carry its state. The field is `accessibilityRole="button"` with `aria-expanded`
|
|
61
64
|
tracking the sheet, matching Select's trigger contract.
|
|
65
|
+
- **A day cell, a quick-jump month cell and an hour/minute/meridiem option are all `role="button"`,
|
|
66
|
+
so their chosen state is `aria-pressed`, never `aria-selected`** (invalid ARIA on `role="button"`,
|
|
67
|
+
browsers ignore it — 2026-08 sweep, same fix `chip`'s filter toggle uses). Kept `role="button"`
|
|
68
|
+
rather than switching to `option`/`gridcell`: those roles aren't in React Native's typed
|
|
69
|
+
`accessibilityRole`, and RNW only treats a literal `role="button"` as buttonish for Space-key
|
|
70
|
+
activation — changing the role would have silently broken keyboard operability
|
|
71
|
+
(`core/a11y/MODULE.md`'s "do not fix Space by changing the role"). The shared
|
|
72
|
+
`resolvePressedAccessibilityState(selected)` returns the flat `aria-pressed` (WEB) +
|
|
73
|
+
`accessibilityState={{ selected }}` (NATIVE fallback — RN has no "pressed" state) pair all three
|
|
74
|
+
use; `resolveCalendarDayAccessibility` composes it in.
|
|
62
75
|
- **1.4.1 — colour is never the only channel.** "today" and range membership are colour in the grid,
|
|
63
76
|
so `resolveCalendarDayAccessibility` folds them into the label too (`", today"`,
|
|
64
|
-
`", in selected range"`). `aria-
|
|
77
|
+
`", in selected range"`). `aria-pressed` marks only the two range ENDPOINTS, so without the
|
|
65
78
|
suffix the days between them read as unselected.
|
|
66
79
|
- **4.1.2 — the sheet is a real modal**: `accessibilityViewIsModal` **and** `aria-modal` (a genuine
|
|
67
80
|
both-props case — RN's `View` reads only the first, `react-native-web` only the second), plus
|
|
@@ -103,8 +116,14 @@ No `mode`/`use24Hour` — a range has no time-of-day dimension in this module.
|
|
|
103
116
|
and the field border are measured ≥ 3:1 against their surface.
|
|
104
117
|
- **2.3.3** — the sheet's RN `<Modal>` is `animationType="none"` unconditionally; the fade/slide is
|
|
105
118
|
`core/motion`'s `useReveal`, which `setValue`s opacity/translateY straight to their end state under
|
|
106
|
-
`useReducedMotion()` (`
|
|
119
|
+
`useReducedMotion()` (`usePressState` likewise for calendar cells, quick-jump cells, and time
|
|
120
|
+
options). `DatePicker.motion.test.tsx`
|
|
107
121
|
covers it — the old `animationType={reducedMotion ? "none" : "fade"}` prop it replaced is gone.
|
|
122
|
+
- **Android touch feedback** — `TimeOption`, the field `Pressable`, and the clear button all carry
|
|
123
|
+
`android_ripple` (`rippleColor(theme.mode)`, `borderless: false`), gated on
|
|
124
|
+
`Platform.OS === "android"`. The field box and the clear button each gained `overflow: "hidden"`
|
|
125
|
+
so the ripple clips to their rounded bounds instead of escaping them. The backdrop stays
|
|
126
|
+
ripple-free, consistent with its `accessible={false}` decoy status above.
|
|
108
127
|
|
|
109
128
|
## Patterns copied from the reference modules
|
|
110
129
|
|
|
@@ -167,3 +186,5 @@ accessible day labels, and constructing a fresh formatter per cell measurably do
|
|
|
167
186
|
- Theme imports decoupled to `theme/hooks`; optional peers (reanimated, gesture-handler, flash-list) load at runtime.
|
|
168
187
|
- List-heavy surfaces use `VirtualList` with device-tier window sizing where applicable.
|
|
169
188
|
- `React.memo` + stable callbacks retained; render-item/key-extractor hoisted per ESLint perf rules.
|
|
189
|
+
|
|
190
|
+
- **Round 2 visual** — radii retarget (`radii.md`/`lg`/`xl`/`full`), `borderCurve: continuous` on md+ corners; floating surfaces wire platform elevation/highlight where applicable.
|
|
@@ -8,10 +8,11 @@
|
|
|
8
8
|
* a11y wiring and focus/error treatment are otherwise identical.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { memo, useState } from "react";
|
|
12
|
-
import { Pressable, StyleSheet, Text, View } from "react-native";
|
|
11
|
+
import { memo, useMemo, useState } from "react";
|
|
12
|
+
import { Platform, Pressable, StyleSheet, Text, View } from "react-native";
|
|
13
13
|
import { Icon } from "../../core/icon/index.js";
|
|
14
14
|
import { useTheme } from "../../theme/hooks.js";
|
|
15
|
+
import { rippleColor } from "../../theme/platform/stateLayer.native.js";
|
|
15
16
|
import { CLEAR_BUTTON_HIT_SLOP, DATE_FIELD_FONT_SIZE, DATE_FIELD_HIT_SLOP, DATE_FIELD_ICON_SIZE, clearButtonStructure, dateFieldStructure, resolveDateFieldAccessibility, resolveDateFieldColors } from "./DatePicker.variants.js";
|
|
16
17
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
17
18
|
const ICON_STROKE = 2;
|
|
@@ -43,6 +44,10 @@ export const PickerField = /*#__PURE__*/memo(function PickerField({
|
|
|
43
44
|
open
|
|
44
45
|
});
|
|
45
46
|
const showClear = clearable && !disabled && displayText !== "";
|
|
47
|
+
const androidRipple = useMemo(() => Platform.OS === "android" ? {
|
|
48
|
+
color: rippleColor(theme.mode),
|
|
49
|
+
borderless: false
|
|
50
|
+
} : undefined, [theme.mode]);
|
|
46
51
|
return /*#__PURE__*/_jsxs(View, {
|
|
47
52
|
style: styles.container,
|
|
48
53
|
children: [label !== undefined &&
|
|
@@ -63,7 +68,8 @@ export const PickerField = /*#__PURE__*/memo(function PickerField({
|
|
|
63
68
|
// picker — the padding stayed here and killed 16dp of target on each side (WCAG 2.5.5).
|
|
64
69
|
{
|
|
65
70
|
borderColor: fieldColors.border,
|
|
66
|
-
paddingHorizontal: 0
|
|
71
|
+
paddingHorizontal: 0,
|
|
72
|
+
overflow: "hidden"
|
|
67
73
|
}, disabled && styles.dimmed],
|
|
68
74
|
children: [/*#__PURE__*/_jsxs(Pressable, {
|
|
69
75
|
testID: testID,
|
|
@@ -76,6 +82,7 @@ export const PickerField = /*#__PURE__*/memo(function PickerField({
|
|
|
76
82
|
onFocus: () => setFocused(true),
|
|
77
83
|
onBlur: () => setFocused(false),
|
|
78
84
|
hitSlop: DATE_FIELD_HIT_SLOP,
|
|
85
|
+
android_ripple: androidRipple,
|
|
79
86
|
style: [styles.fieldPressable, {
|
|
80
87
|
paddingLeft: theme.space[4],
|
|
81
88
|
paddingRight: showClear ? 0 : theme.space[4]
|
|
@@ -100,8 +107,10 @@ export const PickerField = /*#__PURE__*/memo(function PickerField({
|
|
|
100
107
|
accessibilityLabel: clearAccessibilityLabel,
|
|
101
108
|
hitSlop: CLEAR_BUTTON_HIT_SLOP,
|
|
102
109
|
onPress: onClear,
|
|
110
|
+
android_ripple: androidRipple,
|
|
103
111
|
style: [clearButtonStructure(theme), {
|
|
104
|
-
marginRight: theme.space[4]
|
|
112
|
+
marginRight: theme.space[4],
|
|
113
|
+
overflow: "hidden"
|
|
105
114
|
}],
|
|
106
115
|
children: /*#__PURE__*/_jsx(Icon, {
|
|
107
116
|
name: "x",
|
|
@@ -118,6 +118,8 @@ export const PickerShell = /*#__PURE__*/memo(function PickerShell({
|
|
|
118
118
|
return /*#__PURE__*/_jsx(Modal, {
|
|
119
119
|
visible: open,
|
|
120
120
|
transparent: true,
|
|
121
|
+
statusBarTranslucent: true,
|
|
122
|
+
navigationBarTranslucent: true,
|
|
121
123
|
animationType: "none",
|
|
122
124
|
onRequestClose: onCancel,
|
|
123
125
|
children: sheet
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* TimePicker — hour / minute (/ AM-PM) selection
|
|
5
|
-
* clock face. Hour and minute are virtualized `FlatList`s (Select's precedent — a minute column can
|
|
6
|
-
* hold up to 60 rows); the two-item AM/PM column is a plain view, matching Tabs' own choice not to
|
|
7
|
-
* virtualize a handful of items.
|
|
8
|
-
*
|
|
9
|
-
* All arithmetic (12/24-hour conversion, AM/PM flip, option lists) lives in `DatePicker.variants.ts`.
|
|
4
|
+
* TimePicker — hour / minute (/ AM-PM) selection columns.
|
|
10
5
|
*/
|
|
11
6
|
|
|
12
7
|
import { memo, useCallback, useMemo } from "react";
|
|
13
|
-
import { Animated, FlatList, Pressable, Text, View } from "react-native";
|
|
8
|
+
import { Animated, FlatList, Platform, Pressable, Text, View } from "react-native";
|
|
14
9
|
import { usePressMotion } from "../../core/motion/index.js";
|
|
15
10
|
import { useTheme } from "../../theme/hooks.js";
|
|
16
|
-
import {
|
|
11
|
+
import { rippleColor } from "../../theme/platform/stateLayer.native.js";
|
|
12
|
+
import { applyMeridiem, buildHourOptions, buildMinuteOptions, DEFAULT_TIME_HOUR, fromDisplayHour, resolvePressedAccessibilityState, resolveTimeOptionColors, TIME_OPTION_HEIGHT, timeColumnStructure, timeColumnsStructure, timeOptionStructure, toDisplayHour, toMeridiem, withTime } from "./DatePicker.variants.js";
|
|
17
13
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
18
14
|
const MERIDIEMS = ["AM", "PM"];
|
|
19
15
|
const TimeOption = /*#__PURE__*/memo(function TimeOption({
|
|
@@ -40,19 +36,27 @@ const TimeOption = /*#__PURE__*/memo(function TimeOption({
|
|
|
40
36
|
color: resting.label
|
|
41
37
|
}], [theme, selected, resting.label]);
|
|
42
38
|
const handlePress = useCallback(() => onPress(value), [onPress, value]);
|
|
39
|
+
const pressedState = useMemo(() => resolvePressedAccessibilityState(selected), [selected]);
|
|
40
|
+
const androidRipple = useMemo(() => Platform.OS === "android" ? {
|
|
41
|
+
color: rippleColor(theme.mode),
|
|
42
|
+
borderless: false
|
|
43
|
+
} : undefined, [theme.mode]);
|
|
43
44
|
const optionStyle = useCallback(({
|
|
44
45
|
pressed
|
|
45
46
|
}) => [optionStructure, {
|
|
47
|
+
overflow: "hidden",
|
|
46
48
|
backgroundColor: pressed ? pressedBackground : resting.background
|
|
47
49
|
}], [optionStructure, pressedBackground, resting.background]);
|
|
48
50
|
return /*#__PURE__*/_jsx(Pressable, {
|
|
49
51
|
testID: testID,
|
|
50
52
|
accessibilityRole: "button",
|
|
51
53
|
accessibilityLabel: accessibilityLabel,
|
|
52
|
-
"aria-
|
|
54
|
+
"aria-pressed": pressedState["aria-pressed"],
|
|
55
|
+
accessibilityState: pressedState.accessibilityState,
|
|
53
56
|
onPress: handlePress,
|
|
54
57
|
onPressIn: press.onPressIn,
|
|
55
58
|
onPressOut: press.onPressOut,
|
|
59
|
+
android_ripple: androidRipple,
|
|
56
60
|
style: optionStyle,
|
|
57
61
|
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
58
62
|
testID: testID ? `${testID}-motion` : undefined,
|
|
@@ -64,9 +68,6 @@ const TimeOption = /*#__PURE__*/memo(function TimeOption({
|
|
|
64
68
|
})
|
|
65
69
|
});
|
|
66
70
|
});
|
|
67
|
-
|
|
68
|
-
/** The index of `options`' closest value to `target`. Pure and option-list-agnostic, so it works
|
|
69
|
-
* for any `minuteStep` (a `:37` value with a 5-minute step has no exact match in `options`). */
|
|
70
71
|
function nearestIndex(options, target) {
|
|
71
72
|
let bestIndex = 0;
|
|
72
73
|
let bestDiff = Infinity;
|
|
@@ -95,12 +96,6 @@ export const TimePicker = /*#__PURE__*/memo(function TimePicker({
|
|
|
95
96
|
const meridiem = toMeridiem(hour24);
|
|
96
97
|
const hours = useMemo(() => buildHourOptions(use24Hour), [use24Hour]);
|
|
97
98
|
const minutes = useMemo(() => buildMinuteOptions(minuteStep), [minuteStep]);
|
|
98
|
-
|
|
99
|
-
// Opens each column scrolled to the current value (or the noon/00 default) instead of the top —
|
|
100
|
-
// `getItemLayout` below already gives `FlatList` a fixed row height, so `initialScrollIndex` needs
|
|
101
|
-
// no measurement pass. `minute` may fall between two `minuteStep` rungs (e.g. a `:37` value with a
|
|
102
|
-
// 5-minute step), so the minute column opens on the CLOSEST option rather than requiring an exact
|
|
103
|
-
// match.
|
|
104
99
|
const initialHourIndex = Math.max(0, hours.indexOf(displayHour));
|
|
105
100
|
const initialMinuteIndex = nearestIndex(minutes, minute);
|
|
106
101
|
const commitHour = useCallback(nextDisplayHour => {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { StyleSheet } from "react-native";
|
|
3
4
|
/**
|
|
4
5
|
* Divider's style resolution — same split as `Card.variants` / `Button.variants`:
|
|
5
|
-
* - STRUCTURE (the
|
|
6
|
+
* - STRUCTURE (the StyleSheet.hairlineWidth's thickness on the cross axis) lives in the themed `dividerStructure`
|
|
6
7
|
* resolver, static per (brand, mode), registered once via `StyleSheet.create`.
|
|
7
8
|
* - COLOUR is resolved from the theme's ROLE colours by `resolveDividerColor`, never a raw ramp
|
|
8
9
|
* and never a hardcoded hex.
|
|
@@ -27,19 +28,19 @@ export function resolveDividerColor(colors) {
|
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
/**
|
|
30
|
-
* Structural styles only — the
|
|
31
|
+
* Structural styles only — the StyleSheet.hairlineWidth's thickness on the theme's `borderWidths` scale, spanning
|
|
31
32
|
* the full cross axis. No colour (resolved separately, applied inline over this), so this compiles
|
|
32
33
|
* once per theme identity via the `WeakMap`-cached themed resolver and never rebuilds per render.
|
|
33
34
|
*/
|
|
34
|
-
export const dividerStructure = createThemedVariants(
|
|
35
|
+
export const dividerStructure = createThemedVariants(_theme => ({
|
|
35
36
|
variants: {
|
|
36
37
|
orientation: {
|
|
37
38
|
horizontal: {
|
|
38
|
-
height:
|
|
39
|
+
height: StyleSheet.hairlineWidth,
|
|
39
40
|
width: "100%"
|
|
40
41
|
},
|
|
41
42
|
vertical: {
|
|
42
|
-
width:
|
|
43
|
+
width: StyleSheet.hairlineWidth,
|
|
43
44
|
alignSelf: "stretch"
|
|
44
45
|
}
|
|
45
46
|
}
|
|
@@ -65,3 +65,5 @@ Wrapped in `React.memo` (repo-wide re-render audit, 2026-07-17 — see root `CLA
|
|
|
65
65
|
- Theme imports decoupled to `theme/hooks`; optional peers (reanimated, gesture-handler, flash-list) load at runtime.
|
|
66
66
|
- List-heavy surfaces use `VirtualList` with device-tier window sizing where applicable.
|
|
67
67
|
- `React.memo` + stable callbacks retained; render-item/key-extractor hoisted per ESLint perf rules.
|
|
68
|
+
|
|
69
|
+
- **Round 2 visual** — radii retarget (`radii.md`/`lg`/`xl`/`full`), `borderCurve: continuous` on md+ corners; floating surfaces wire platform elevation/highlight where applicable.
|
|
@@ -39,16 +39,18 @@
|
|
|
39
39
|
|
|
40
40
|
import { memo, useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
41
41
|
import { Animated, Keyboard, Modal as RNModal, Platform, Pressable, StyleSheet, useWindowDimensions, View } from "react-native";
|
|
42
|
-
import { useAnimatedValue, useMotion } from "../../core/motion/index.js";
|
|
42
|
+
import { MOTION_TRANSFORM, useAnimatedValue, useMotion } from "../../core/motion/index.js";
|
|
43
|
+
import { withAlpha } from "../../core/gradient/index.js";
|
|
44
|
+
import { elevation, floatingBackground, floatingSurfaceStyle, highlight } from "../../theme/platform/index.js";
|
|
45
|
+
import { elevation as elevationTokens } from "../../theme/tokens/primitives/index.js";
|
|
43
46
|
import { useTheme } from "../../theme/hooks.js";
|
|
44
47
|
import { ModalPortalContext } from "../modal/ModalPortalContext.js";
|
|
45
48
|
import { renderWebPortal } from "../modal/renderWebPortal";
|
|
46
49
|
import { drawerGrabberStructure, drawerHandleStructure, drawerOverlayStructure, drawerPanelStructure, resolveDrawerBottomInset, resolveDrawerPanelColors } from "./Drawer.variants.js";
|
|
47
50
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
48
|
-
// Decorative dismiss scrim
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
const DRAWER_BACKDROP = "#00000080";
|
|
51
|
+
// Decorative dismiss scrim, not a role token — same reasoning Modal's MODAL_BACKDROP records.
|
|
52
|
+
// Opacity is the shared `scrimOpacity` knob, not a locally-guessed hex.
|
|
53
|
+
const DRAWER_BACKDROP = withAlpha("#000000", MOTION_TRANSFORM.scrimOpacity);
|
|
52
54
|
export const Drawer = /*#__PURE__*/memo(function Drawer({
|
|
53
55
|
visible,
|
|
54
56
|
onRequestClose,
|
|
@@ -167,15 +169,23 @@ export const Drawer = /*#__PURE__*/memo(function Drawer({
|
|
|
167
169
|
|
|
168
170
|
// Slides from fully off-screen (the window's own height, always ≥ the panel's own, since the
|
|
169
171
|
// panel is capped to 90% of it) to resting at the bottom edge.
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
+
const floatingStyle = useMemo(() => {
|
|
173
|
+
highlight("subtle", theme.mode);
|
|
174
|
+
elevation(elevationTokens.lg);
|
|
175
|
+
void theme.elevatedSurfaces;
|
|
176
|
+
return {
|
|
177
|
+
backgroundColor: floatingBackground(theme, "lg"),
|
|
178
|
+
...floatingSurfaceStyle(theme, "lg")
|
|
179
|
+
};
|
|
180
|
+
}, [theme]);
|
|
181
|
+
const panelStyle = useMemo(() => [drawerPanelStructure(theme), floatingStyle, {
|
|
172
182
|
transform: [{
|
|
173
183
|
translateY: progress.interpolate({
|
|
174
184
|
inputRange: [0, 1],
|
|
175
185
|
outputRange: [windowHeight, 0]
|
|
176
186
|
})
|
|
177
187
|
}]
|
|
178
|
-
}], [theme,
|
|
188
|
+
}], [theme, floatingStyle, progress, windowHeight]);
|
|
179
189
|
const backdropStyle = useMemo(() => [styles.backdrop, {
|
|
180
190
|
opacity: progress
|
|
181
191
|
}], [progress]);
|
|
@@ -239,6 +249,8 @@ export const Drawer = /*#__PURE__*/memo(function Drawer({
|
|
|
239
249
|
return /*#__PURE__*/_jsx(RNModal, {
|
|
240
250
|
visible: mounted,
|
|
241
251
|
transparent: true,
|
|
252
|
+
statusBarTranslucent: true,
|
|
253
|
+
navigationBarTranslucent: true,
|
|
242
254
|
animationType: "none",
|
|
243
255
|
onRequestClose: onRequestClose,
|
|
244
256
|
children: content
|
|
@@ -75,10 +75,10 @@ export const drawerPanelStructure = createThemedVariants(theme => ({
|
|
|
75
75
|
base: {
|
|
76
76
|
width: "100%",
|
|
77
77
|
maxHeight: "90%",
|
|
78
|
-
borderTopLeftRadius: theme.radii.
|
|
79
|
-
borderTopRightRadius: theme.radii.
|
|
80
|
-
|
|
81
|
-
|
|
78
|
+
borderTopLeftRadius: theme.radii.xl,
|
|
79
|
+
borderTopRightRadius: theme.radii.xl,
|
|
80
|
+
borderCurve: "continuous",
|
|
81
|
+
paddingHorizontal: theme.space[5]
|
|
82
82
|
}
|
|
83
83
|
}));
|
|
84
84
|
|
|
@@ -131,3 +131,6 @@ Wrapped in `React.memo` (repo-wide re-render audit, 2026-07-17 — see root `CLA
|
|
|
131
131
|
- Theme imports decoupled to `theme/hooks`; optional peers (reanimated, gesture-handler, flash-list) load at runtime.
|
|
132
132
|
- List-heavy surfaces use `VirtualList` with device-tier window sizing where applicable.
|
|
133
133
|
- `React.memo` + stable callbacks retained; render-item/key-extractor hoisted per ESLint perf rules.
|
|
134
|
+
|
|
135
|
+
- **Round 2 visual** — radii retarget (`radii.md`/`lg`/`xl`/`full`), `borderCurve: continuous` on md+ corners; floating surfaces wire platform elevation/highlight where applicable.
|
|
136
|
+
- **Round 5 motion** — dropped the ad hoc reanimated `FadeInDown` wrapper around the handle/children (entrance-only, no exit — purely redundant with `progress`, which already drives panel+backdrop together). `DRAWER_BACKDROP`'s opacity now comes from the shared `MOTION_TRANSFORM.scrimOpacity`.
|