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
@@ -10,6 +10,7 @@ import { focusItemProps, useDismissOnEscape, useFocusTrap, useRovingKeys, useSpa
10
10
  import { Icon } from "../../core/icon/index.js";
11
11
  import { VirtualList } from "../../core/list/index.js";
12
12
  import { useMotion, usePressMotion, useReveal } from "../../core/motion/index.js";
13
+ import { rippleColor } from "../../theme/platform/stateLayer.native.js";
13
14
  import { useTheme } from "../../theme/hooks.js";
14
15
  import { ModalPortalContext } from "../modal/ModalPortalContext.js";
15
16
  import { renderWebPortal } from "../modal/renderWebPortal";
@@ -71,6 +72,10 @@ const MultiSelectOptionRow = /*#__PURE__*/memo(function MultiSelectOptionRow({
71
72
  }) => ({
72
73
  backgroundColor: pressed ? rowColors.pressedRow : rowColors.background
73
74
  }), [rowColors]);
75
+ const androidRipple = useMemo(() => Platform.OS === "android" ? {
76
+ color: rippleColor(theme.mode),
77
+ borderless: false
78
+ } : undefined, [theme.mode]);
74
79
  const indicatorStyle = useMemo(() => [indicatorStructure, {
75
80
  borderColor: checked ? rowColors.indicatorFill : rowColors.indicatorBorder,
76
81
  backgroundColor: checked ? rowColors.indicatorFill : "transparent"
@@ -89,6 +94,7 @@ const MultiSelectOptionRow = /*#__PURE__*/memo(function MultiSelectOptionRow({
89
94
  onPress: handlePress,
90
95
  onPressIn: press.onPressIn,
91
96
  onPressOut: press.onPressOut,
97
+ android_ripple: androidRipple,
92
98
  style: rowStyle,
93
99
  children: /*#__PURE__*/_jsxs(Animated.View, {
94
100
  testID: testID ? `${testID}-option-${option.value}-content` : undefined,
@@ -204,10 +210,22 @@ export const MultiSelect = /*#__PURE__*/memo(function MultiSelect({
204
210
  }), {
205
211
  backgroundColor: triggerColors.background,
206
212
  borderColor: triggerColors.border
213
+ }, {
214
+ overflow: "hidden"
207
215
  }, disabled && styles.dimmed], [theme, size, triggerColors, disabled]);
216
+ const triggerRipple = useMemo(() => Platform.OS === "android" && !disabled ? {
217
+ color: rippleColor(theme.mode),
218
+ borderless: false
219
+ } : undefined, [disabled, theme.mode]);
208
220
  const overlayStructure = useMemo(() => multiSelectOverlayStructure(theme), [theme]);
209
221
  const headerStructure = useMemo(() => multiSelectHeaderStructure(theme), [theme]);
210
- const closeButtonStructure = useMemo(() => multiSelectCloseButtonStructure(theme), [theme]);
222
+ const closeButtonStructure = useMemo(() => [multiSelectCloseButtonStructure(theme), {
223
+ overflow: "hidden"
224
+ }], [theme]);
225
+ const closeButtonRipple = useMemo(() => Platform.OS === "android" ? {
226
+ color: rippleColor(theme.mode),
227
+ borderless: false
228
+ } : undefined, [theme.mode]);
211
229
  const sheetStyle = useMemo(() => [multiSelectSheetStructure(theme), {
212
230
  backgroundColor: theme.colors.bg.surface
213
231
  }], [theme]);
@@ -242,6 +260,7 @@ export const MultiSelect = /*#__PURE__*/memo(function MultiSelect({
242
260
  accessibilityLabel: "Close",
243
261
  onPress: closeMenu,
244
262
  hitSlop: MULTI_SELECT_CLOSE_BUTTON_HIT_SLOP,
263
+ android_ripple: closeButtonRipple,
245
264
  style: closeButtonStructure,
246
265
  children: /*#__PURE__*/_jsx(Icon, {
247
266
  name: "x",
@@ -267,6 +286,8 @@ export const MultiSelect = /*#__PURE__*/memo(function MultiSelect({
267
286
  }), portalContainer) : null : /*#__PURE__*/_jsx(Modal, {
268
287
  visible: open,
269
288
  transparent: true,
289
+ statusBarTranslucent: true,
290
+ navigationBarTranslucent: true,
270
291
  animationType: "none",
271
292
  onRequestClose: closeMenu,
272
293
  children: sheet
@@ -287,6 +308,7 @@ export const MultiSelect = /*#__PURE__*/memo(function MultiSelect({
287
308
  onFocus: handleFocus,
288
309
  onBlur: handleBlur,
289
310
  hitSlop: spec.hitSlop,
311
+ android_ripple: triggerRipple,
290
312
  style: triggerStyle,
291
313
  children: [/*#__PURE__*/_jsx(Text, {
292
314
  numberOfLines: 1,
@@ -115,7 +115,8 @@ export const multiSelectTriggerStructure = createThemedVariants(theme => ({
115
115
  alignItems: "center",
116
116
  justifyContent: "space-between",
117
117
  columnGap: theme.space[2],
118
- borderRadius: theme.radii.base,
118
+ borderRadius: theme.radii.md,
119
+ borderCurve: "continuous",
119
120
  borderWidth: theme.borderWidths.thin
120
121
  },
121
122
  variants: {
@@ -150,7 +151,8 @@ export const multiSelectOverlayStructure = createThemedVariants(theme => ({
150
151
  }));
151
152
  export const multiSelectSheetStructure = createThemedVariants(theme => ({
152
153
  base: {
153
- borderRadius: theme.radii.base,
154
+ borderRadius: theme.radii.md,
155
+ borderCurve: "continuous",
154
156
  paddingBottom: theme.space[2],
155
157
  maxHeight: 360,
156
158
  ...theme.elevation.lg
@@ -89,7 +89,8 @@ typed values are clamped to range but never snapped to a `step` grid.
89
89
  `fg.default` is already proven ≥ 4.5:1 against `bg.canvas` by the 1.4.3 test above, and contrast is
90
90
  symmetric, so the fill clears the 3:1 non-text minimum AND the inverted glyph clears 4.5:1 text
91
91
  contrast on it, for free, on every brand × mode — measured directly by its own `it.each` in
92
- `NumberInput.test.ts` (not assumed safe by borrowing another component's test).
92
+ `NumberInput.test.ts` (not assumed safe by borrowing another component's test). Press choreography
93
+ is `usePressState` scale on the stepper `Pressable`s (background swap still keys off `press.pressed`).
93
94
  - **2.4.7 / 2.4.11 focus** — a visible focus ring (`border.focus`, offset a small gap outside the
94
95
  control, same geometry/token as Button/Input/Checkbox) appears independently on: the `TextInput`
95
96
  (whole-row ring), the decrement `Pressable`, and the increment `Pressable` (each stepper gets its
@@ -15,13 +15,17 @@
15
15
 
16
16
  import { memo, useEffect, useState } from "react";
17
17
  import { Platform, Pressable, StyleSheet, Text, TextInput, View } from "react-native";
18
+ import Animated from "react-native-reanimated";
18
19
  import { Icon } from "../../core/icon/index.js";
20
+ import { usePressState } from "../../core/motion/usePressState.js";
21
+ import { rippleColor } from "../../theme/platform/stateLayer.native.js";
19
22
  import { useTheme } from "../../theme/hooks.js";
20
23
  import { canDecrementNumberInput, canIncrementNumberInput, clampNumberInputValue, NUMBER_INPUT_SIZES, numberInputStepperStructure, numberInputStructure, parseNumberInputDraft, resolveNumberInputAccessibility, resolveNumberInputStatus, resolveNumberInputStepperPressColors } from "./NumberInput.variants.js";
21
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
24
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
22
25
  const ICON_STROKE = 2;
23
26
  const FOCUS_RING_WIDTH = 2;
24
27
  const FOCUS_RING_GAP = 2;
28
+ const AnimatedPressable = Animated.createAnimatedComponent(Pressable);
25
29
 
26
30
  /**
27
31
  * Same offset-ring geometry/token as the field's own ring (and Button/Input/Checkbox), but rounded
@@ -29,7 +33,7 @@ const FOCUS_RING_GAP = 2;
29
33
  * radius split — so the ring doesn't square off past the row's rounded corner.
30
34
  */
31
35
  function stepperFocusRingStyle(theme, position) {
32
- const radius = theme.radii.base + FOCUS_RING_GAP + FOCUS_RING_WIDTH;
36
+ const radius = theme.radii.md + FOCUS_RING_GAP + FOCUS_RING_WIDTH;
33
37
  return {
34
38
  position: "absolute",
35
39
  top: -(FOCUS_RING_GAP + FOCUS_RING_WIDTH),
@@ -77,6 +81,18 @@ export const NumberInput = /*#__PURE__*/memo(function NumberInput(props) {
77
81
  const spec = NUMBER_INPUT_SIZES[size];
78
82
  const statusColors = resolveNumberInputStatus(theme.colors, status);
79
83
  const pressColors = resolveNumberInputStepperPressColors(theme.colors);
84
+ const decrementEnabled = canDecrementNumberInput({
85
+ value,
86
+ min,
87
+ disabled
88
+ });
89
+ const incrementEnabled = canIncrementNumberInput({
90
+ value,
91
+ max,
92
+ disabled
93
+ });
94
+ const decrementPress = usePressState(!decrementEnabled);
95
+ const incrementPress = usePressState(!incrementEnabled);
80
96
  const a11y = resolveNumberInputAccessibility({
81
97
  value,
82
98
  min,
@@ -88,16 +104,6 @@ export const NumberInput = /*#__PURE__*/memo(function NumberInput(props) {
88
104
  status,
89
105
  errorText
90
106
  });
91
- const decrementEnabled = canDecrementNumberInput({
92
- value,
93
- min,
94
- disabled
95
- });
96
- const incrementEnabled = canIncrementNumberInput({
97
- value,
98
- max,
99
- disabled
100
- });
101
107
  const handleChangeText = raw => {
102
108
  setDraft(raw);
103
109
  const parsed = parseNumberInputDraft(raw);
@@ -152,46 +158,49 @@ export const NumberInput = /*#__PURE__*/memo(function NumberInput(props) {
152
158
  bottom: -(FOCUS_RING_GAP + FOCUS_RING_WIDTH),
153
159
  borderWidth: FOCUS_RING_WIDTH,
154
160
  borderColor: theme.colors.border.focus,
155
- borderRadius: theme.radii.base + FOCUS_RING_GAP + FOCUS_RING_WIDTH
161
+ borderRadius: theme.radii.md + FOCUS_RING_GAP + FOCUS_RING_WIDTH,
162
+ borderCurve: "continuous"
156
163
  }
157
- }), /*#__PURE__*/_jsx(Pressable, {
158
- testID: testID ? `${testID}-decrement` : undefined,
159
- accessibilityRole: "button",
160
- accessibilityLabel: "Decrease",
161
- "aria-disabled": !decrementEnabled,
162
- disabled: !decrementEnabled
163
- // RN's Pressable stays `focusable` when disabled, so a TV remote could otherwise land on an
164
- // at-limit stepper, which renders no ring (WCAG 2.4.7). RNW already excludes it (tabIndex -1).
165
- ,
166
- focusable: decrementEnabled,
167
- onPress: handleDecrement,
168
- onFocus: () => setDecrementFocused(true),
169
- onBlur: () => setDecrementFocused(false),
170
- hitSlop: spec.hitSlop,
171
- style: ({
172
- pressed
173
- }) => [numberInputStepperStructure(theme, {
174
- size,
175
- position: "leading"
176
- }), {
177
- borderColor: statusColors.border
178
- }, pressed && decrementEnabled && {
179
- backgroundColor: pressColors.fill
180
- }, !disabled && !decrementEnabled && styles.dimmed],
181
- children: ({
182
- pressed
183
- }) => /*#__PURE__*/_jsxs(_Fragment, {
184
- children: [decrementFocused && decrementEnabled && /*#__PURE__*/_jsx(View, {
185
- pointerEvents: "none",
186
- testID: "number-input-decrement-focus-ring",
187
- style: stepperFocusRingStyle(theme, "leading")
188
- }), /*#__PURE__*/_jsx(Icon, {
164
+ }), /*#__PURE__*/_jsxs(View, {
165
+ style: styles.stepperHost,
166
+ children: [decrementFocused && decrementEnabled && /*#__PURE__*/_jsx(View, {
167
+ pointerEvents: "none",
168
+ testID: "number-input-decrement-focus-ring",
169
+ style: stepperFocusRingStyle(theme, "leading")
170
+ }), /*#__PURE__*/_jsx(AnimatedPressable, {
171
+ testID: testID ? `${testID}-decrement` : undefined,
172
+ accessibilityRole: "button",
173
+ accessibilityLabel: "Decrease",
174
+ "aria-disabled": !decrementEnabled,
175
+ disabled: !decrementEnabled,
176
+ focusable: decrementEnabled,
177
+ onPress: handleDecrement,
178
+ onPressIn: decrementPress.handlers.onPressIn,
179
+ onPressOut: decrementPress.handlers.onPressOut,
180
+ onLayout: decrementPress.onLayout,
181
+ onFocus: () => setDecrementFocused(true),
182
+ onBlur: () => setDecrementFocused(false),
183
+ hitSlop: spec.hitSlop,
184
+ android_ripple: decrementEnabled && Platform.OS === "android" ? {
185
+ color: rippleColor(theme.mode),
186
+ borderless: false
187
+ } : undefined,
188
+ style: [numberInputStepperStructure(theme, {
189
+ size,
190
+ position: "leading"
191
+ }), {
192
+ borderColor: statusColors.border,
193
+ overflow: "hidden"
194
+ }, decrementPress.pressed && decrementEnabled && {
195
+ backgroundColor: pressColors.fill
196
+ }, decrementPress.animatedStyle, !disabled && !decrementEnabled && styles.dimmed],
197
+ children: /*#__PURE__*/_jsx(Icon, {
189
198
  name: "minus",
190
199
  size: spec.iconSize,
191
- color: pressed && decrementEnabled ? pressColors.icon : theme.colors.fg.default,
200
+ color: decrementEnabled && decrementPress.pressed ? pressColors.icon : theme.colors.fg.default,
192
201
  strokeWidth: ICON_STROKE
193
- })]
194
- })
202
+ })
203
+ })]
195
204
  }), /*#__PURE__*/_jsx(TextInput, {
196
205
  testID: testID,
197
206
  value: draft,
@@ -219,41 +228,46 @@ export const NumberInput = /*#__PURE__*/memo(function NumberInput(props) {
219
228
  fontSize: spec.fontSize,
220
229
  color: theme.colors.fg.default
221
230
  }, theme.fontStyleForWeight(theme.fontWeights.regular), Platform.OS === "web" && styles.webOutlineReset]
222
- }), /*#__PURE__*/_jsx(Pressable, {
223
- testID: testID ? `${testID}-increment` : undefined,
224
- accessibilityRole: "button",
225
- accessibilityLabel: "Increase",
226
- "aria-disabled": !incrementEnabled,
227
- disabled: !incrementEnabled,
228
- focusable: incrementEnabled,
229
- onPress: handleIncrement,
230
- onFocus: () => setIncrementFocused(true),
231
- onBlur: () => setIncrementFocused(false),
232
- hitSlop: spec.hitSlop,
233
- style: ({
234
- pressed
235
- }) => [numberInputStepperStructure(theme, {
236
- size,
237
- position: "trailing"
238
- }), {
239
- borderColor: statusColors.border
240
- }, pressed && incrementEnabled && {
241
- backgroundColor: pressColors.fill
242
- }, !disabled && !incrementEnabled && styles.dimmed],
243
- children: ({
244
- pressed
245
- }) => /*#__PURE__*/_jsxs(_Fragment, {
246
- children: [incrementFocused && incrementEnabled && /*#__PURE__*/_jsx(View, {
247
- pointerEvents: "none",
248
- testID: "number-input-increment-focus-ring",
249
- style: stepperFocusRingStyle(theme, "trailing")
250
- }), /*#__PURE__*/_jsx(Icon, {
231
+ }), /*#__PURE__*/_jsxs(View, {
232
+ style: styles.stepperHost,
233
+ children: [incrementFocused && incrementEnabled && /*#__PURE__*/_jsx(View, {
234
+ pointerEvents: "none",
235
+ testID: "number-input-increment-focus-ring",
236
+ style: stepperFocusRingStyle(theme, "trailing")
237
+ }), /*#__PURE__*/_jsx(AnimatedPressable, {
238
+ testID: testID ? `${testID}-increment` : undefined,
239
+ accessibilityRole: "button",
240
+ accessibilityLabel: "Increase",
241
+ "aria-disabled": !incrementEnabled,
242
+ disabled: !incrementEnabled,
243
+ focusable: incrementEnabled,
244
+ onPress: handleIncrement,
245
+ onPressIn: incrementPress.handlers.onPressIn,
246
+ onPressOut: incrementPress.handlers.onPressOut,
247
+ onLayout: incrementPress.onLayout,
248
+ onFocus: () => setIncrementFocused(true),
249
+ onBlur: () => setIncrementFocused(false),
250
+ hitSlop: spec.hitSlop,
251
+ android_ripple: incrementEnabled && Platform.OS === "android" ? {
252
+ color: rippleColor(theme.mode),
253
+ borderless: false
254
+ } : undefined,
255
+ style: [numberInputStepperStructure(theme, {
256
+ size,
257
+ position: "trailing"
258
+ }), {
259
+ borderColor: statusColors.border,
260
+ overflow: "hidden"
261
+ }, incrementPress.pressed && incrementEnabled && {
262
+ backgroundColor: pressColors.fill
263
+ }, incrementPress.animatedStyle, !disabled && !incrementEnabled && styles.dimmed],
264
+ children: /*#__PURE__*/_jsx(Icon, {
251
265
  name: "plus",
252
266
  size: spec.iconSize,
253
- color: pressed && incrementEnabled ? pressColors.icon : theme.colors.fg.default,
267
+ color: incrementEnabled && incrementPress.pressed ? pressColors.icon : theme.colors.fg.default,
254
268
  strokeWidth: ICON_STROKE
255
- })]
256
- })
269
+ })
270
+ })]
257
271
  })]
258
272
  }), a11y.message !== undefined && /*#__PURE__*/_jsx(Text, {
259
273
  testID: testID ? `${testID}-error` : undefined,
@@ -267,13 +281,12 @@ export const NumberInput = /*#__PURE__*/memo(function NumberInput(props) {
267
281
  });
268
282
  });
269
283
  const styles = StyleSheet.create({
270
- // A disabled control is exempt from the contrast minimum (WCAG 1.4.3), so a uniform dim is correct.
271
284
  dimmed: {
272
285
  opacity: 0.5
273
286
  },
274
- // RNW renders `TextInput` as a real `<input>`, which paints the browser's own default focus
275
- // outline on top of the themed ring above it — a visible double border. Web-only: `outlineWidth`
276
- // also drives native TV remote-control focus, so zeroing it globally would break that.
287
+ stepperHost: {
288
+ position: "relative"
289
+ },
277
290
  webOutlineReset: {
278
291
  outlineStyle: "solid",
279
292
  outlineWidth: 0,
@@ -168,7 +168,8 @@ export const numberInputStructure = createThemedVariants(theme => ({
168
168
  flexDirection: "row",
169
169
  alignItems: "center",
170
170
  borderWidth: theme.borderWidths.thin,
171
- borderRadius: theme.radii.base
171
+ borderRadius: theme.radii.md,
172
+ borderCurve: "continuous"
172
173
  },
173
174
  variants: {
174
175
  size: {
@@ -193,7 +194,7 @@ export const numberInputStructure = createThemedVariants(theme => ({
193
194
  * `TextInput` carries: without it, the row's `alignItems: "center"` shrinks the button to its
194
195
  * intrinsic content height instead of the row's full `spec.height`, silently voiding the `hitSlop`
195
196
  * touch-target math (a real Wave-1 bug on Input — not one to repeat here). The corner radii on the
196
- * outer edge match the row's own `radii.base` so a pressed/focused fill doesn't square off past the
197
+ * outer edge match the row's own `radii.md` so a pressed/focused fill doesn't square off past the
197
198
  * row's rounded corner.
198
199
  */
199
200
  export const numberInputStepperStructure = createThemedVariants(theme => ({
@@ -217,13 +218,15 @@ export const numberInputStepperStructure = createThemedVariants(theme => ({
217
218
  position: {
218
219
  leading: {
219
220
  borderRightWidth: theme.borderWidths.thin,
220
- borderTopLeftRadius: theme.radii.base,
221
- borderBottomLeftRadius: theme.radii.base
221
+ borderTopLeftRadius: theme.radii.md,
222
+ borderBottomLeftRadius: theme.radii.md,
223
+ borderCurve: "continuous"
222
224
  },
223
225
  trailing: {
224
226
  borderLeftWidth: theme.borderWidths.thin,
225
- borderTopRightRadius: theme.radii.base,
226
- borderBottomRightRadius: theme.radii.base
227
+ borderTopRightRadius: theme.radii.md,
228
+ borderBottomRightRadius: theme.radii.md,
229
+ borderCurve: "continuous"
227
230
  }
228
231
  }
229
232
  },
@@ -69,7 +69,10 @@ mode — `bg.selected` is not, which is exactly why `Select` refuses to tint.
69
69
  - The trigger is a `button` named **"Switch organization, &lt;org&gt;"** — the org name alone would
70
70
  not tell a screen-reader user what the control does — with `aria-expanded` tracking the sheet
71
71
  (WCAG 4.1.2).
72
- - Rows are `menuitem` with `aria-selected`; the tint is never the *only* selection cue.
72
+ - Rows are `role="radio"` with `aria-checked` picking an org is choosing exactly one from a
73
+ mutually exclusive set, and `aria-selected` is invalid ARIA on `role="menuitem"` (2026-08 sweep;
74
+ React Native's typed `accessibilityRole` has no `menuitemradio`, so `radio` is the closest valid
75
+ role). The tint is never the *only* selection cue.
73
76
  - Rows and trigger both clear the 44dp touch target (trigger via `hitSlop`).
74
77
  - **2.1.1 keyboard (web only)** — on the `ModalPortalProvider` branch there is no RN `<Modal>`, so
75
78
  `react-native-web`'s own Escape / focus trap / focus restore never run. The sheet wires
@@ -89,6 +92,10 @@ The host app owns fetching the org list and the active org id, passing `role` as
89
92
  - **No roving tabindex / arrow keys on the row list** — each row is still its own tab stop, which is
90
93
  acceptable at real org counts (the same reason there is no search box) but would want
91
94
  `useRovingKeys` if that list ever grows.
95
+ - **No `role="radiogroup"` on the sheet's row list.** Each row is individually a valid `radio`, but
96
+ nothing groups them, so a screen reader doesn't announce "N options" up front. Not added alongside
97
+ the `menuitem` → `radio` fix because `radiogroup` semantics conventionally pair with arrow-key
98
+ roving, which the gap above says this list doesn't have — revisit both together.
92
99
 
93
100
  ## Performance contract
94
101
 
@@ -119,3 +126,8 @@ The host app owns fetching the org list and the active org id, passing `role` as
119
126
  ## Modernization (v1.0.7)
120
127
 
121
128
  - Theme imports decoupled to `theme/hooks`; optional peers (reanimated, gesture-handler, flash-list) load at runtime.
129
+
130
+ - **Round 2 visual** — radii retarget (`radii.md`/`lg`/`xl`/`full`), `borderCurve: continuous` on md+ corners; floating surfaces wire platform elevation/highlight where applicable.
131
+ - **Round 5 tonal** — the trigger's `border.interactive` hairline is KEPT: it's a form-control
132
+ affordance (opens a picker), the identical role `Select`'s own trigger border plays, not decorative
133
+ container chrome. Trigger and rows both gained `android_ripple` for Android parity.
@@ -26,6 +26,7 @@ import { Icon } from "../../core/icon/index.js";
26
26
  import { VirtualList } from "../../core/list/index.js";
27
27
  import { useAnimatedValue, useEnterExit, useMotion, usePressMotion } from "../../core/motion/index.js";
28
28
  import { useTheme } from "../../theme/hooks.js";
29
+ import { rippleColor } from "../../theme/platform/stateLayer.native.js";
29
30
  import { Avatar } from "../avatar/index.js";
30
31
  import { ModalPortalContext } from "../modal/ModalPortalContext.js";
31
32
  import { renderWebPortal } from "../modal/renderWebPortal";
@@ -51,6 +52,9 @@ const OrgSwitcherRow = /*#__PURE__*/memo(function OrgSwitcherRow({
51
52
  const rowStructure = useMemo(() => orgSwitcherRowStructure(theme), [theme]);
52
53
  const contentStructure = useMemo(() => orgSwitcherRowContentStructure(theme), [theme]);
53
54
  const bodyStructure = useMemo(() => orgSwitcherRowBodyStructure(theme), [theme]);
55
+ const androidRipple = useMemo(() => Platform.OS === "android" ? {
56
+ color: rippleColor(theme.mode)
57
+ } : undefined, [theme.mode]);
54
58
  const rowStyle = useCallback(({
55
59
  pressed
56
60
  }) => [rowStructure, {
@@ -91,11 +95,12 @@ const OrgSwitcherRow = /*#__PURE__*/memo(function OrgSwitcherRow({
91
95
  useEffect(() => () => running.current?.stop(), []);
92
96
  return /*#__PURE__*/_jsx(Pressable, {
93
97
  testID: testID ? `${testID}-option-${option.value}` : undefined,
94
- accessibilityRole: "menuitem",
95
- "aria-selected": selected,
98
+ accessibilityRole: "radio",
99
+ "aria-checked": selected,
96
100
  onPress: handlePress,
97
101
  onPressIn: press.onPressIn,
98
102
  onPressOut: press.onPressOut,
103
+ android_ripple: androidRipple,
99
104
  style: rowStyle,
100
105
  children: /*#__PURE__*/_jsxs(Animated.View, {
101
106
  style: [contentStructure, press.style],
@@ -155,6 +160,9 @@ export const OrgSwitcher = /*#__PURE__*/memo(function OrgSwitcher({
155
160
  const triggerStructure = useMemo(() => orgSwitcherTriggerStructure(theme, {
156
161
  size
157
162
  }), [theme, size]);
163
+ const androidRipple = useMemo(() => Platform.OS === "android" ? {
164
+ color: rippleColor(theme.mode)
165
+ } : undefined, [theme.mode]);
158
166
  const triggerStyle = useCallback(({
159
167
  pressed
160
168
  }) => [triggerStructure, {
@@ -226,6 +234,8 @@ export const OrgSwitcher = /*#__PURE__*/memo(function OrgSwitcher({
226
234
  }), portalContainer) : null : /*#__PURE__*/_jsx(Modal, {
227
235
  visible: open,
228
236
  transparent: true,
237
+ statusBarTranslucent: true,
238
+ navigationBarTranslucent: true,
229
239
  animationType: "none",
230
240
  onRequestClose: closeMenu,
231
241
  children: sheet
@@ -241,6 +251,7 @@ export const OrgSwitcher = /*#__PURE__*/memo(function OrgSwitcher({
241
251
  onPressIn: triggerPress.onPressIn,
242
252
  onPressOut: triggerPress.onPressOut,
243
253
  hitSlop: spec.hitSlop,
254
+ android_ripple: androidRipple,
244
255
  style: triggerStyle,
245
256
  children: /*#__PURE__*/_jsxs(Animated.View, {
246
257
  style: [triggerContentStructure, triggerPress.style],
@@ -100,7 +100,8 @@ export function orgInitials(label) {
100
100
  export const orgSwitcherTriggerStructure = createThemedVariants(theme => ({
101
101
  base: {
102
102
  justifyContent: "center",
103
- borderRadius: theme.radii.base,
103
+ borderRadius: theme.radii.md,
104
+ borderCurve: "continuous",
104
105
  borderWidth: theme.borderWidths.thin
105
106
  },
106
107
  variants: {
@@ -152,7 +153,8 @@ export const orgSwitcherOverlayStructure = createThemedVariants(theme => ({
152
153
  }));
153
154
  export const orgSwitcherSheetStructure = createThemedVariants(theme => ({
154
155
  base: {
155
- borderRadius: theme.radii.base,
156
+ borderRadius: theme.radii.md,
157
+ borderCurve: "continuous",
156
158
  paddingVertical: theme.space[2],
157
159
  maxHeight: 320,
158
160
  ...theme.elevation.lg
@@ -89,8 +89,8 @@ for a closed union to resolve.
89
89
  also set on the rendered summary text: `useAnnounce` already announces on both platforms, so
90
90
  keeping both would double-announce on Android (same rule `Input`/`FormField`/`FileUpload` follow).
91
91
  - **2.3.3** — the compact summary's fade is skipped and its opacity `setValue`'d whenever
92
- `useMotion().enabled` is false (reduced motion or the global kill switch). Press feedback is a
93
- conditional background, not a transition, so it needs no gating.
92
+ `useMotion().enabled` is false (reduced motion or the global kill switch). Page controls and the
93
+ load-more button use `usePressState` (scale + state-layer overlay), which snaps under reduce motion.
94
94
 
95
95
  ## Page-change motion
96
96