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.
Files changed (353) hide show
  1. package/lib/module/core/MODULE.md +2 -1
  2. package/lib/module/core/gradient/AccentGradientFill.js +80 -0
  3. package/lib/module/core/gradient/darkenHex.js +13 -0
  4. package/lib/module/core/gradient/gradientStops.js +27 -0
  5. package/lib/module/core/gradient/index.js +7 -0
  6. package/lib/module/core/gradient/withAlpha.js +19 -0
  7. package/lib/module/core/haptics/MODULE.md +4 -0
  8. package/lib/module/core/haptics/context.js +7 -0
  9. package/lib/module/core/haptics/haptics.js +17 -0
  10. package/lib/module/core/haptics/index.js +6 -0
  11. package/lib/module/core/haptics/useHaptics.js +73 -0
  12. package/lib/module/core/icon/MODULE.md +16 -9
  13. package/lib/module/core/icon/icons/trending-up.js +10 -0
  14. package/lib/module/core/icon/resolve.js +2 -0
  15. package/lib/module/core/media/expoImage.js +6 -0
  16. package/lib/module/core/motion/MODULE.md +12 -12
  17. package/lib/module/core/motion/config.js +4 -1
  18. package/lib/module/core/motion/index.js +2 -1
  19. package/lib/module/core/motion/usePressState.js +145 -0
  20. package/lib/module/core/style/index.js +1 -0
  21. package/lib/module/core/style/radius.js +4 -0
  22. package/lib/module/index.js +1 -0
  23. package/lib/module/modules/accordion/Accordion.js +69 -49
  24. package/lib/module/modules/accordion/Accordion.variants.js +4 -3
  25. package/lib/module/modules/accordion/MODULE.md +2 -1
  26. package/lib/module/modules/alert-dialog/AlertDialog.js +6 -5
  27. package/lib/module/modules/alert-dialog/AlertDialog.variants.js +4 -0
  28. package/lib/module/modules/app-bar/AppBar.js +6 -4
  29. package/lib/module/modules/app-bar/AppBar.variants.js +1 -2
  30. package/lib/module/modules/avatar/Avatar.js +7 -1
  31. package/lib/module/modules/avatar/Avatar.variants.js +1 -1
  32. package/lib/module/modules/avatar/MODULE.md +2 -2
  33. package/lib/module/modules/avatar-group/AvatarGroup.js +10 -6
  34. package/lib/module/modules/avatar-group/AvatarGroup.variants.js +23 -0
  35. package/lib/module/modules/avatar-group/MODULE.md +16 -0
  36. package/lib/module/modules/badge/Badge.js +11 -5
  37. package/lib/module/modules/badge/Badge.variants.js +2 -1
  38. package/lib/module/modules/badge/MODULE.md +5 -5
  39. package/lib/module/modules/banner/Banner.js +106 -60
  40. package/lib/module/modules/banner/Banner.variants.js +2 -2
  41. package/lib/module/modules/banner/MODULE.md +7 -2
  42. package/lib/module/modules/bottom-nav/BottomNav.js +6 -3
  43. package/lib/module/modules/bottom-nav/BottomNav.variants.js +9 -10
  44. package/lib/module/modules/bottom-nav/BottomNavOverflowSheet.js +28 -4
  45. package/lib/module/modules/bottom-nav/BottomNavTab.js +28 -4
  46. package/lib/module/modules/bottom-nav/MODULE.md +10 -1
  47. package/lib/module/modules/bottom-sheet/BottomSheet.js +20 -7
  48. package/lib/module/modules/bottom-sheet/BottomSheet.variants.js +15 -5
  49. package/lib/module/modules/bottom-sheet/MODULE.md +13 -2
  50. package/lib/module/modules/button/Button.js +87 -101
  51. package/lib/module/modules/button/Button.variants.js +8 -7
  52. package/lib/module/modules/button/MODULE.md +6 -0
  53. package/lib/module/modules/button-group/ButtonGroup.js +36 -37
  54. package/lib/module/modules/button-group/ButtonGroup.variants.js +21 -46
  55. package/lib/module/modules/button-group/MODULE.md +25 -30
  56. package/lib/module/modules/card/Card.js +117 -19
  57. package/lib/module/modules/card/Card.variants.js +1 -0
  58. package/lib/module/modules/card/MODULE.md +13 -10
  59. package/lib/module/modules/charts/BarChart.js +29 -14
  60. package/lib/module/modules/charts/BarList.js +31 -18
  61. package/lib/module/modules/charts/Charts.variants.js +66 -2
  62. package/lib/module/modules/charts/DonutChart.js +9 -4
  63. package/lib/module/modules/charts/LineChart.js +5 -3
  64. package/lib/module/modules/charts/MODULE.md +24 -11
  65. package/lib/module/modules/charts/PieChart.js +13 -4
  66. package/lib/module/modules/charts/Sparkline.js +4 -2
  67. package/lib/module/modules/checkbox/Checkbox.js +10 -2
  68. package/lib/module/modules/checkbox/MODULE.md +5 -0
  69. package/lib/module/modules/chip/Chip.js +83 -38
  70. package/lib/module/modules/chip/Chip.variants.js +15 -3
  71. package/lib/module/modules/chip/MODULE.md +6 -4
  72. package/lib/module/modules/combobox/Combobox.js +93 -57
  73. package/lib/module/modules/combobox/Combobox.variants.js +22 -7
  74. package/lib/module/modules/combobox/MODULE.md +14 -4
  75. package/lib/module/modules/composer/Composer.js +9 -2
  76. package/lib/module/modules/composer/Composer.variants.js +2 -0
  77. package/lib/module/modules/composer/MODULE.md +5 -0
  78. package/lib/module/modules/copy-button/CopyButton.js +22 -4
  79. package/lib/module/modules/copy-button/CopyButton.variants.js +4 -2
  80. package/lib/module/modules/copy-button/MODULE.md +5 -0
  81. package/lib/module/modules/data-table/DataTable.js +28 -9
  82. package/lib/module/modules/data-table/DataTable.variants.js +3 -2
  83. package/lib/module/modules/data-table/MODULE.md +1 -0
  84. package/lib/module/modules/date-picker/Calendar.js +75 -29
  85. package/lib/module/modules/date-picker/DatePicker.variants.js +24 -9
  86. package/lib/module/modules/date-picker/MODULE.md +25 -4
  87. package/lib/module/modules/date-picker/PickerField.js +13 -4
  88. package/lib/module/modules/date-picker/PickerShell.js +2 -0
  89. package/lib/module/modules/date-picker/TimePicker.js +13 -18
  90. package/lib/module/modules/divider/Divider.variants.js +6 -5
  91. package/lib/module/modules/divider/MODULE.md +2 -0
  92. package/lib/module/modules/drawer/Drawer.js +20 -8
  93. package/lib/module/modules/drawer/Drawer.variants.js +4 -4
  94. package/lib/module/modules/drawer/MODULE.md +3 -0
  95. package/lib/module/modules/empty-state/EmptyState.js +18 -29
  96. package/lib/module/modules/empty-state/EmptyState.variants.js +7 -0
  97. package/lib/module/modules/empty-state/MODULE.md +1 -0
  98. package/lib/module/modules/fab/Fab.js +41 -61
  99. package/lib/module/modules/fab/Fab.variants.js +15 -1
  100. package/lib/module/modules/fab/FabGroup.js +84 -57
  101. package/lib/module/modules/fab/MODULE.md +19 -6
  102. package/lib/module/modules/file-grid/FileGrid.js +30 -16
  103. package/lib/module/modules/file-grid/FileGrid.variants.js +2 -2
  104. package/lib/module/modules/file-grid/MODULE.md +3 -1
  105. package/lib/module/modules/file-upload/FileUpload.variants.js +3 -1
  106. package/lib/module/modules/file-upload/MODULE.md +2 -0
  107. package/lib/module/modules/filter-sheet/FilterChip.js +11 -3
  108. package/lib/module/modules/filter-sheet/FilterSheetBody.js +15 -3
  109. package/lib/module/modules/filter-sheet/MODULE.md +9 -0
  110. package/lib/module/modules/folder-row/FolderRow.js +29 -17
  111. package/lib/module/modules/folder-row/FolderRow.variants.js +4 -2
  112. package/lib/module/modules/folder-row/MODULE.md +2 -1
  113. package/lib/module/modules/gantt/Gantt.js +30 -9
  114. package/lib/module/modules/gantt/Gantt.variants.js +36 -0
  115. package/lib/module/modules/gantt/MODULE.md +11 -1
  116. package/lib/module/modules/image-viewer/ImageViewer.js +35 -5
  117. package/lib/module/modules/image-viewer/MODULE.md +6 -0
  118. package/lib/module/modules/input/Input.js +20 -7
  119. package/lib/module/modules/input/Input.variants.js +8 -7
  120. package/lib/module/modules/input/MODULE.md +2 -0
  121. package/lib/module/modules/list-item/ListItem.js +48 -26
  122. package/lib/module/modules/list-item/ListItem.variants.js +11 -2
  123. package/lib/module/modules/list-item/MODULE.md +2 -3
  124. package/lib/module/modules/markdown/MODULE.md +8 -1
  125. package/lib/module/modules/markdown/Markdown.js +57 -22
  126. package/lib/module/modules/markdown/Markdown.variants.js +2 -1
  127. package/lib/module/modules/menu/MODULE.md +11 -0
  128. package/lib/module/modules/menu/Menu.js +99 -40
  129. package/lib/module/modules/menu/Menu.variants.js +3 -3
  130. package/lib/module/modules/message-bubble/MODULE.md +4 -1
  131. package/lib/module/modules/message-bubble/MessageBubble.js +4 -5
  132. package/lib/module/modules/message-bubble/MessageBubble.variants.js +5 -5
  133. package/lib/module/modules/modal/MODULE.md +11 -0
  134. package/lib/module/modules/modal/Modal.js +87 -35
  135. package/lib/module/modules/modal/Modal.variants.js +2 -2
  136. package/lib/module/modules/more-items/MODULE.md +5 -0
  137. package/lib/module/modules/more-items/MoreItems.js +7 -1
  138. package/lib/module/modules/more-items/MoreItems.variants.js +4 -1
  139. package/lib/module/modules/multi-select/MODULE.md +5 -0
  140. package/lib/module/modules/multi-select/MultiSelect.js +23 -1
  141. package/lib/module/modules/multi-select/MultiSelect.variants.js +4 -2
  142. package/lib/module/modules/number-input/MODULE.md +2 -1
  143. package/lib/module/modules/number-input/NumberInput.js +97 -84
  144. package/lib/module/modules/number-input/NumberInput.variants.js +9 -6
  145. package/lib/module/modules/org-switcher/MODULE.md +13 -1
  146. package/lib/module/modules/org-switcher/OrgSwitcher.js +13 -2
  147. package/lib/module/modules/org-switcher/OrgSwitcher.variants.js +4 -2
  148. package/lib/module/modules/pagination/MODULE.md +2 -2
  149. package/lib/module/modules/pagination/Pagination.js +76 -37
  150. package/lib/module/modules/pagination/Pagination.variants.js +4 -2
  151. package/lib/module/modules/pagination/PaginationControls.js +55 -35
  152. package/lib/module/modules/pin-input/MODULE.md +5 -1
  153. package/lib/module/modules/pin-input/PinInput.js +9 -2
  154. package/lib/module/modules/pin-input/PinInput.variants.js +2 -1
  155. package/lib/module/modules/radio-group/MODULE.md +2 -2
  156. package/lib/module/modules/radio-group/RadioGroup.js +122 -63
  157. package/lib/module/modules/radio-group/RadioGroup.variants.js +2 -1
  158. package/lib/module/modules/reorder/MODULE.md +2 -0
  159. package/lib/module/modules/reorder/Reorder.js +4 -3
  160. package/lib/module/modules/reorder/Reorder.variants.js +4 -2
  161. package/lib/module/modules/rich-text/MODULE.md +3 -1
  162. package/lib/module/modules/rich-text/RichText.js +42 -22
  163. package/lib/module/modules/rich-text-editor/MODULE.md +4 -1
  164. package/lib/module/modules/rich-text-editor/RichTextEditor.js +8 -1
  165. package/lib/module/modules/rich-text-editor/RichTextEditor.variants.js +9 -6
  166. package/lib/module/modules/screen/MODULE.md +7 -0
  167. package/lib/module/modules/screen/Screen.js +50 -17
  168. package/lib/module/modules/screen/Screen.variants.js +18 -0
  169. package/lib/module/modules/search-bar/MODULE.md +1 -0
  170. package/lib/module/modules/search-bar/SearchBar.js +46 -26
  171. package/lib/module/modules/search-bar/SearchBar.variants.js +11 -8
  172. package/lib/module/modules/section/MODULE.md +2 -0
  173. package/lib/module/modules/section/Section.js +8 -15
  174. package/lib/module/modules/section/Section.variants.js +1 -6
  175. package/lib/module/modules/segmented-control/MODULE.md +3 -1
  176. package/lib/module/modules/segmented-control/SegmentedControl.js +110 -46
  177. package/lib/module/modules/segmented-control/SegmentedControl.variants.js +3 -2
  178. package/lib/module/modules/select/MODULE.md +26 -5
  179. package/lib/module/modules/select/Select.js +39 -12
  180. package/lib/module/modules/select/Select.variants.js +36 -12
  181. package/lib/module/modules/skeleton/MODULE.md +23 -27
  182. package/lib/module/modules/skeleton/Skeleton.js +46 -51
  183. package/lib/module/modules/skeleton/Skeleton.variants.js +17 -75
  184. package/lib/module/modules/slider/MODULE.md +2 -0
  185. package/lib/module/modules/slider/Slider.js +2 -1
  186. package/lib/module/modules/stage-progress/MODULE.md +12 -8
  187. package/lib/module/modules/stage-progress/StageProgress.js +94 -47
  188. package/lib/module/modules/stage-progress/StageProgress.variants.js +17 -12
  189. package/lib/module/modules/stat-tile/MODULE.md +2 -0
  190. package/lib/module/modules/stat-tile/StatTile.js +15 -10
  191. package/lib/module/modules/stat-tile/StatTile.variants.js +2 -0
  192. package/lib/module/modules/state-block/MODULE.md +3 -0
  193. package/lib/module/modules/state-block/StateBlock.js +11 -6
  194. package/lib/module/modules/state-block/StateBlock.variants.js +7 -0
  195. package/lib/module/modules/surface/MODULE.md +59 -0
  196. package/lib/module/modules/surface/Surface.js +42 -0
  197. package/lib/module/modules/surface/Surface.variants.js +33 -0
  198. package/lib/module/modules/surface/index.js +4 -0
  199. package/lib/module/modules/swipeable-row/MODULE.md +9 -0
  200. package/lib/module/modules/swipeable-row/SwipeableRow.js +28 -7
  201. package/lib/module/modules/switch/MODULE.md +2 -0
  202. package/lib/module/modules/switch/Switch.js +8 -2
  203. package/lib/module/modules/tabs/MODULE.md +2 -1
  204. package/lib/module/modules/tabs/Tabs.js +37 -18
  205. package/lib/module/modules/tabs/Tabs.variants.js +4 -2
  206. package/lib/module/modules/text/MODULE.md +5 -2
  207. package/lib/module/modules/text/Text.js +18 -6
  208. package/lib/module/modules/text/Text.variants.js +108 -44
  209. package/lib/module/modules/textarea/MODULE.md +2 -0
  210. package/lib/module/modules/textarea/Textarea.js +3 -2
  211. package/lib/module/modules/textarea/Textarea.variants.js +2 -1
  212. package/lib/module/modules/toast/MODULE.md +8 -4
  213. package/lib/module/modules/toast/Toast.js +31 -13
  214. package/lib/module/modules/toast/Toast.variants.js +5 -0
  215. package/lib/module/modules/tooltip/MODULE.md +15 -11
  216. package/lib/module/modules/tooltip/Tooltip.js +41 -9
  217. package/lib/module/modules/tooltip/Tooltip.variants.js +8 -1
  218. package/lib/module/theme/MODULE.md +3 -1
  219. package/lib/module/theme/platform/MODULE.md +14 -2
  220. package/lib/module/theme/platform/elevation.native.js +0 -44
  221. package/lib/module/theme/platform/floatingSurface.native.js +75 -0
  222. package/lib/module/theme/platform/highlight.native.js +59 -0
  223. package/lib/module/theme/platform/index.js +5 -0
  224. package/lib/module/theme/platform/motion.native.js +31 -11
  225. package/lib/module/theme/platform/stateLayer.native.js +14 -0
  226. package/lib/module/theme/platform/surfaces.native.js +11 -0
  227. package/lib/module/theme/provider/PixelizeProvider.js +12 -5
  228. package/lib/module/theme/tokens/MODULE.md +32 -28
  229. package/lib/module/theme/tokens/THEME-CONTRACT.md +137 -0
  230. package/lib/module/theme/tokens/assertPalette.js +29 -0
  231. package/lib/module/theme/tokens/brands/emerald/palette.light.js +7 -6
  232. package/lib/module/theme/tokens/brands/lavender/palette.light.js +3 -2
  233. package/lib/module/theme/tokens/brands/meadow/palette.light.js +7 -6
  234. package/lib/module/theme/tokens/brands/radiant/palette.light.js +7 -6
  235. package/lib/module/theme/tokens/brands/rosewood/palette.light.js +7 -6
  236. package/lib/module/theme/tokens/brands/skyline/palette.light.js +7 -6
  237. package/lib/module/theme/tokens/brands/slate/palette.light.js +8 -10
  238. package/lib/module/theme/tokens/brands/storefront/palette.light.js +7 -6
  239. package/lib/module/theme/tokens/brands/zinc/palette.dark.js +3 -2
  240. package/lib/module/theme/tokens/brands/zinc/palette.light.js +3 -2
  241. package/lib/module/theme/tokens/builders/buildDarkPalette.js +3 -2
  242. package/lib/module/theme/tokens/builders/finalizePalette.js +34 -0
  243. package/lib/module/theme/tokens/builders/liftToContrast.js +44 -0
  244. package/lib/module/theme/tokens/builders/placeholderInk.js +22 -0
  245. package/lib/module/theme/tokens/builders/semanticText.js +14 -0
  246. package/lib/module/theme/tokens/builders/surfaceRungs.js +44 -0
  247. package/lib/module/theme/tokens/index.js +5 -0
  248. package/lib/module/theme/tokens/roles/index.js +5 -0
  249. package/lib/typescript/core/gradient/AccentGradientFill.d.ts +7 -0
  250. package/lib/typescript/core/gradient/darkenHex.d.ts +2 -0
  251. package/lib/typescript/core/gradient/gradientStops.d.ts +10 -0
  252. package/lib/typescript/core/gradient/index.d.ts +5 -0
  253. package/lib/typescript/core/gradient/withAlpha.d.ts +2 -0
  254. package/lib/typescript/core/haptics/context.d.ts +3 -0
  255. package/lib/typescript/core/haptics/haptics.d.ts +33 -0
  256. package/lib/typescript/core/haptics/index.d.ts +6 -0
  257. package/lib/typescript/core/haptics/useHaptics.d.ts +12 -0
  258. package/lib/typescript/core/icon/icons/trending-up.d.ts +3 -0
  259. package/lib/typescript/core/icon/names.d.ts +1 -1
  260. package/lib/typescript/core/media/expoImage.d.ts +15 -6
  261. package/lib/typescript/core/media/pickers.d.ts +5 -5
  262. package/lib/typescript/core/motion/config.d.ts +2 -1
  263. package/lib/typescript/core/motion/index.d.ts +3 -1
  264. package/lib/typescript/core/motion/usePressState.d.ts +21 -0
  265. package/lib/typescript/core/style/index.d.ts +1 -0
  266. package/lib/typescript/core/style/radius.d.ts +2 -0
  267. package/lib/typescript/index.d.ts +4 -2
  268. package/lib/typescript/modules/accordion/Accordion.variants.d.ts +2 -2
  269. package/lib/typescript/modules/alert-dialog/AlertDialog.variants.d.ts +1 -0
  270. package/lib/typescript/modules/avatar/Avatar.variants.d.ts +1 -1
  271. package/lib/typescript/modules/avatar-group/AvatarGroup.d.ts +4 -2
  272. package/lib/typescript/modules/avatar-group/AvatarGroup.variants.d.ts +19 -0
  273. package/lib/typescript/modules/banner/Banner.d.ts +2 -0
  274. package/lib/typescript/modules/bottom-nav/BottomNav.variants.d.ts +1 -3
  275. package/lib/typescript/modules/bottom-sheet/BottomSheet.variants.d.ts +3 -1
  276. package/lib/typescript/modules/button/Button.d.ts +0 -25
  277. package/lib/typescript/modules/button/Button.variants.d.ts +6 -6
  278. package/lib/typescript/modules/button-group/ButtonGroup.d.ts +0 -19
  279. package/lib/typescript/modules/button-group/ButtonGroup.variants.d.ts +22 -56
  280. package/lib/typescript/modules/card/Card.d.ts +7 -5
  281. package/lib/typescript/modules/charts/Charts.variants.d.ts +29 -1
  282. package/lib/typescript/modules/chip/Chip.d.ts +3 -1
  283. package/lib/typescript/modules/chip/Chip.variants.d.ts +6 -2
  284. package/lib/typescript/modules/chip/index.d.ts +1 -1
  285. package/lib/typescript/modules/combobox/Combobox.variants.d.ts +17 -4
  286. package/lib/typescript/modules/data-table/DataTable.variants.d.ts +1 -1
  287. package/lib/typescript/modules/date-picker/DatePicker.variants.d.ts +15 -3
  288. package/lib/typescript/modules/date-picker/TimePicker.d.ts +1 -7
  289. package/lib/typescript/modules/divider/Divider.variants.d.ts +4 -4
  290. package/lib/typescript/modules/empty-state/EmptyState.d.ts +2 -0
  291. package/lib/typescript/modules/empty-state/EmptyState.variants.d.ts +1 -0
  292. package/lib/typescript/modules/fab/Fab.variants.d.ts +2 -0
  293. package/lib/typescript/modules/folder-row/FolderRow.d.ts +0 -8
  294. package/lib/typescript/modules/gantt/Gantt.variants.d.ts +21 -0
  295. package/lib/typescript/modules/input/Input.variants.d.ts +6 -6
  296. package/lib/typescript/modules/list-item/ListItem.d.ts +1 -5
  297. package/lib/typescript/modules/list-item/ListItem.variants.d.ts +137 -1
  298. package/lib/typescript/modules/markdown/Markdown.d.ts +7 -0
  299. package/lib/typescript/modules/message-bubble/MessageBubble.d.ts +2 -2
  300. package/lib/typescript/modules/message-bubble/MessageBubble.variants.d.ts +1 -2
  301. package/lib/typescript/modules/number-input/NumberInput.variants.d.ts +7 -5
  302. package/lib/typescript/modules/pagination/PaginationControls.d.ts +1 -4
  303. package/lib/typescript/modules/reorder/Reorder.d.ts +1 -1
  304. package/lib/typescript/modules/screen/Screen.d.ts +3 -9
  305. package/lib/typescript/modules/screen/Screen.variants.d.ts +4 -0
  306. package/lib/typescript/modules/search-bar/SearchBar.variants.d.ts +6 -6
  307. package/lib/typescript/modules/section/Section.variants.d.ts +0 -3
  308. package/lib/typescript/modules/segmented-control/SegmentedControl.variants.d.ts +1 -1
  309. package/lib/typescript/modules/select/Select.d.ts +4 -1
  310. package/lib/typescript/modules/select/Select.variants.d.ts +22 -8
  311. package/lib/typescript/modules/select/index.d.ts +1 -1
  312. package/lib/typescript/modules/skeleton/Skeleton.d.ts +3 -18
  313. package/lib/typescript/modules/skeleton/Skeleton.variants.d.ts +12 -68
  314. package/lib/typescript/modules/stage-progress/StageProgress.variants.d.ts +15 -6
  315. package/lib/typescript/modules/state-block/StateBlock.d.ts +4 -0
  316. package/lib/typescript/modules/state-block/StateBlock.variants.d.ts +1 -0
  317. package/lib/typescript/modules/surface/Surface.d.ts +19 -0
  318. package/lib/typescript/modules/surface/Surface.variants.d.ts +15 -0
  319. package/lib/typescript/modules/surface/index.d.ts +4 -0
  320. package/lib/typescript/modules/text/Text.d.ts +8 -4
  321. package/lib/typescript/modules/text/Text.variants.d.ts +14 -11
  322. package/lib/typescript/modules/toast/Toast.variants.d.ts +2 -0
  323. package/lib/typescript/modules/tooltip/Tooltip.variants.d.ts +7 -0
  324. package/lib/typescript/theme/index.d.ts +1 -1
  325. package/lib/typescript/theme/platform/elevation.native.d.ts +0 -30
  326. package/lib/typescript/theme/platform/floatingSurface.native.d.ts +10 -0
  327. package/lib/typescript/theme/platform/highlight.native.d.ts +17 -0
  328. package/lib/typescript/theme/platform/index.d.ts +9 -0
  329. package/lib/typescript/theme/platform/motion.native.d.ts +33 -13
  330. package/lib/typescript/theme/platform/stateLayer.native.d.ts +11 -0
  331. package/lib/typescript/theme/platform/surfaces.native.d.ts +8 -0
  332. package/lib/typescript/theme/provider/PixelizeProvider.d.ts +1 -1
  333. package/lib/typescript/theme/provider/types.d.ts +8 -0
  334. package/lib/typescript/theme/tokens/assertPalette.d.ts +10 -0
  335. package/lib/typescript/theme/tokens/brands/emerald/palette.light.d.ts +4 -3
  336. package/lib/typescript/theme/tokens/brands/lavender/palette.light.d.ts +4 -3
  337. package/lib/typescript/theme/tokens/brands/meadow/palette.light.d.ts +4 -3
  338. package/lib/typescript/theme/tokens/brands/radiant/palette.light.d.ts +4 -3
  339. package/lib/typescript/theme/tokens/brands/rosewood/palette.light.d.ts +4 -3
  340. package/lib/typescript/theme/tokens/brands/skyline/palette.light.d.ts +4 -3
  341. package/lib/typescript/theme/tokens/brands/slate/palette.light.d.ts +4 -3
  342. package/lib/typescript/theme/tokens/brands/storefront/palette.light.d.ts +4 -3
  343. package/lib/typescript/theme/tokens/brands/zinc/palette.light.d.ts +4 -3
  344. package/lib/typescript/theme/tokens/builders/finalizePalette.d.ts +4 -0
  345. package/lib/typescript/theme/tokens/builders/liftToContrast.d.ts +9 -0
  346. package/lib/typescript/theme/tokens/builders/placeholderInk.d.ts +13 -0
  347. package/lib/typescript/theme/tokens/builders/semanticText.d.ts +4 -0
  348. package/lib/typescript/theme/tokens/builders/surfaceRungs.d.ts +12 -0
  349. package/lib/typescript/theme/tokens/index.d.ts +5 -0
  350. package/lib/typescript/theme/tokens/roles/index.d.ts +1 -0
  351. package/lib/typescript/theme/tokens/types.d.ts +8 -7
  352. package/package.json +10 -2
  353. 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 cellStyle = useCallback(({
78
- pressed
79
- }) => [cellStructure, {
80
- backgroundColor: pressed ? pressedBackground : resting.background,
81
- borderColor: resting.ring
82
- }], [cellStructure, pressedBackground, resting.background, resting.ring]);
83
- return /*#__PURE__*/_jsx(Pressable, {
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-selected": a11y["aria-selected"],
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(Text, {
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 cellStyle = useCallback(({
133
- pressed
134
- }) => [cellStructure, {
135
- backgroundColor: pressed ? pressedBackground : resting.background
136
- }], [cellStructure, pressedBackground, resting.background]);
137
- return /*#__PURE__*/_jsx(Pressable, {
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-selected": selected,
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(Text, {
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 = useCallback(({
229
- pressed
230
- }) => [headerButtonBase, pressed && {
231
- backgroundColor: chrome.headerPressed
232
- }], [headerButtonBase, chrome.headerPressed]);
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(Pressable, {
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
- style: headerButtonStyle,
300
- children: [/*#__PURE__*/_jsx(Text, {
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-selected": input.selected,
509
- "aria-disabled": input.disabled
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.base,
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.base
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.base,
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.base
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.base
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.base,
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.base,
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-selected"`, `"aria-expanded"`, `"aria-disabled"`) and the JSX spells each one out.
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-selected` /
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-selected` marks only the two range ENDPOINTS, so without the
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()` (`usePressMotion` likewise for a time option's press). `DatePicker.motion.test.tsx`
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 as independent scrollable columns, never an analog
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 { applyMeridiem, buildHourOptions, buildMinuteOptions, DEFAULT_TIME_HOUR, fromDisplayHour, resolveTimeOptionColors, TIME_OPTION_HEIGHT, timeColumnStructure, timeColumnsStructure, timeOptionStructure, toDisplayHour, toMeridiem, withTime } from "./DatePicker.variants.js";
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-selected": selected,
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 hairline's thickness on the cross axis) lives in the themed `dividerStructure`
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 hairline's thickness on the theme's `borderWidths` scale, spanning
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(theme => ({
35
+ export const dividerStructure = createThemedVariants(_theme => ({
35
36
  variants: {
36
37
  orientation: {
37
38
  horizontal: {
38
- height: theme.borderWidths.thin,
39
+ height: StyleSheet.hairlineWidth,
39
40
  width: "100%"
40
41
  },
41
42
  vertical: {
42
- width: theme.borderWidths.thin,
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 behind the panel — a design constant, not a role token: it is neither
49
- // text nor an interactive boundary, so WCAG's contrast minimums don't apply to it. Same
50
- // justification as Modal's MODAL_BACKDROP / Select's BACKDROP_SCRIM.
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 panelStyle = useMemo(() => [drawerPanelStructure(theme), {
171
- backgroundColor: panelColors.background,
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, panelColors.background, progress, windowHeight]);
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.lg,
79
- borderTopRightRadius: theme.radii.lg,
80
- paddingHorizontal: theme.space[5],
81
- ...theme.elevation.lg
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`.