@multiplatform.one/forms 7.65.2 → 7.67.0

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 (367) hide show
  1. package/dist/cjs/FloatingPanel/RegularPanel.cjs +164 -0
  2. package/dist/cjs/FloatingPanel/RegularPanel.native.js +169 -0
  3. package/dist/cjs/FloatingPanel/RegularPanel.native.js.map +1 -0
  4. package/dist/cjs/FloatingPanel/compactFace.cjs +6 -0
  5. package/dist/cjs/FloatingPanel/compactFace.native.js +6 -0
  6. package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -1
  7. package/dist/cjs/FloatingPanel/containingBlock.cjs +46 -0
  8. package/dist/cjs/FloatingPanel/containingBlock.native.js +51 -0
  9. package/dist/cjs/FloatingPanel/containingBlock.native.js.map +1 -0
  10. package/dist/cjs/FloatingPanel/index.cjs +2 -20
  11. package/dist/cjs/FloatingPanel/index.native.js +79 -45
  12. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  13. package/dist/cjs/FloatingPanel/pointAnchor.cjs +25 -0
  14. package/dist/cjs/FloatingPanel/pointAnchor.native.js +26 -0
  15. package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
  16. package/dist/cjs/FloatingPanel/regularPlacement.cjs +61 -0
  17. package/dist/cjs/FloatingPanel/regularPlacement.native.js +65 -0
  18. package/dist/cjs/FloatingPanel/regularPlacement.native.js.map +1 -0
  19. package/dist/cjs/fields/Combobox/index.cjs +8 -10
  20. package/dist/cjs/fields/Combobox/index.native.js +10 -10
  21. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  22. package/dist/cjs/fields/DatePicker/parts.cjs +1 -0
  23. package/dist/cjs/fields/DatePicker/parts.native.js +3 -0
  24. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  25. package/dist/cjs/fields/Input/index.cjs +5 -0
  26. package/dist/cjs/fields/Input/index.native.js +5 -0
  27. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  28. package/dist/cjs/fields/Select/InlineChoices.cjs +3 -2
  29. package/dist/cjs/fields/Select/InlineChoices.native.js +5 -2
  30. package/dist/cjs/fields/Select/InlineChoices.native.js.map +1 -1
  31. package/dist/cjs/fields/Select/SheetPickerRow.cjs +154 -0
  32. package/dist/cjs/fields/Select/SheetPickerRow.native.js +165 -0
  33. package/dist/cjs/fields/Select/SheetPickerRow.native.js.map +1 -0
  34. package/dist/cjs/fields/Select/index.cjs +64 -5
  35. package/dist/cjs/fields/Select/index.native.js +86 -27
  36. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  37. package/dist/cjs/fields/Select/shouldInlineChoices.cjs +14 -1
  38. package/dist/cjs/fields/Select/shouldInlineChoices.native.js +15 -1
  39. package/dist/cjs/fields/Select/shouldInlineChoices.native.js.map +1 -1
  40. package/dist/cjs/fields/Slider/index.cjs +96 -4
  41. package/dist/cjs/fields/Slider/index.native.js +103 -5
  42. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  43. package/dist/cjs/fields/Switch/index.cjs +71 -1
  44. package/dist/cjs/fields/Switch/index.native.js +72 -1
  45. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  46. package/dist/cjs/fields/TimePicker/parts.cjs +1 -0
  47. package/dist/cjs/fields/TimePicker/parts.native.js +1 -0
  48. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  49. package/dist/cjs/fields/ToggleGroup/index.cjs +67 -1
  50. package/dist/cjs/fields/ToggleGroup/index.native.js +75 -1
  51. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  52. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.cjs +34 -19
  53. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +44 -21
  54. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  55. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.cjs +54 -0
  56. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js +57 -0
  57. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -0
  58. package/dist/cjs/index.cjs +11 -0
  59. package/dist/cjs/index.native.js +11 -0
  60. package/dist/cjs/index.native.js.map +1 -1
  61. package/dist/cjs/shared/overlaySizeClass.cjs +42 -0
  62. package/dist/cjs/shared/overlaySizeClass.native.js +45 -0
  63. package/dist/cjs/shared/overlaySizeClass.native.js.map +1 -0
  64. package/dist/cjs/shared/sheetNavigation.cjs +76 -0
  65. package/dist/cjs/shared/sheetNavigation.native.js +129 -0
  66. package/dist/cjs/shared/sheetNavigation.native.js.map +1 -0
  67. package/dist/cjs/shared/systemControlModules.cjs +34 -0
  68. package/dist/cjs/shared/systemControlModules.gnome.cjs +34 -0
  69. package/dist/cjs/shared/systemControlModules.gnome.native.js +37 -0
  70. package/dist/cjs/shared/systemControlModules.gnome.native.js.map +1 -0
  71. package/dist/cjs/shared/systemControlModules.native.js +77 -0
  72. package/dist/cjs/shared/systemControlModules.native.js.map +1 -0
  73. package/dist/cjs/shared/systemControls.cjs +47 -0
  74. package/dist/cjs/shared/systemControls.native.js +51 -0
  75. package/dist/cjs/shared/systemControls.native.js.map +1 -0
  76. package/dist/esm/FloatingPanel/RegularPanel.mjs +139 -0
  77. package/dist/esm/FloatingPanel/RegularPanel.mjs.map +1 -0
  78. package/dist/esm/FloatingPanel/RegularPanel.native.js +141 -0
  79. package/dist/esm/FloatingPanel/RegularPanel.native.js.map +1 -0
  80. package/dist/esm/FloatingPanel/compactFace.mjs +5 -1
  81. package/dist/esm/FloatingPanel/compactFace.mjs.map +1 -1
  82. package/dist/esm/FloatingPanel/compactFace.native.js +5 -1
  83. package/dist/esm/FloatingPanel/compactFace.native.js.map +1 -1
  84. package/dist/esm/FloatingPanel/containingBlock.mjs +21 -0
  85. package/dist/esm/FloatingPanel/containingBlock.mjs.map +1 -0
  86. package/dist/esm/FloatingPanel/containingBlock.native.js +23 -0
  87. package/dist/esm/FloatingPanel/containingBlock.native.js.map +1 -0
  88. package/dist/esm/FloatingPanel/index.mjs +1 -19
  89. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  90. package/dist/esm/FloatingPanel/index.native.js +83 -49
  91. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  92. package/dist/esm/FloatingPanel/pointAnchor.mjs +25 -1
  93. package/dist/esm/FloatingPanel/pointAnchor.mjs.map +1 -1
  94. package/dist/esm/FloatingPanel/pointAnchor.native.js +26 -1
  95. package/dist/esm/FloatingPanel/pointAnchor.native.js.map +1 -1
  96. package/dist/esm/FloatingPanel/regularPlacement.mjs +35 -0
  97. package/dist/esm/FloatingPanel/regularPlacement.mjs.map +1 -0
  98. package/dist/esm/FloatingPanel/regularPlacement.native.js +36 -0
  99. package/dist/esm/FloatingPanel/regularPlacement.native.js.map +1 -0
  100. package/dist/esm/fields/Combobox/index.mjs +9 -11
  101. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  102. package/dist/esm/fields/Combobox/index.native.js +11 -11
  103. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  104. package/dist/esm/fields/DatePicker/parts.mjs +1 -0
  105. package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
  106. package/dist/esm/fields/DatePicker/parts.native.js +3 -0
  107. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  108. package/dist/esm/fields/Input/index.mjs +6 -1
  109. package/dist/esm/fields/Input/index.mjs.map +1 -1
  110. package/dist/esm/fields/Input/index.native.js +6 -1
  111. package/dist/esm/fields/Input/index.native.js.map +1 -1
  112. package/dist/esm/fields/Select/InlineChoices.mjs +3 -2
  113. package/dist/esm/fields/Select/InlineChoices.mjs.map +1 -1
  114. package/dist/esm/fields/Select/InlineChoices.native.js +5 -2
  115. package/dist/esm/fields/Select/InlineChoices.native.js.map +1 -1
  116. package/dist/esm/fields/Select/SheetPickerRow.mjs +129 -0
  117. package/dist/esm/fields/Select/SheetPickerRow.mjs.map +1 -0
  118. package/dist/esm/fields/Select/SheetPickerRow.native.js +137 -0
  119. package/dist/esm/fields/Select/SheetPickerRow.native.js.map +1 -0
  120. package/dist/esm/fields/Select/index.mjs +66 -7
  121. package/dist/esm/fields/Select/index.mjs.map +1 -1
  122. package/dist/esm/fields/Select/index.native.js +88 -29
  123. package/dist/esm/fields/Select/index.native.js.map +1 -1
  124. package/dist/esm/fields/Select/shouldInlineChoices.mjs +12 -1
  125. package/dist/esm/fields/Select/shouldInlineChoices.mjs.map +1 -1
  126. package/dist/esm/fields/Select/shouldInlineChoices.native.js +13 -1
  127. package/dist/esm/fields/Select/shouldInlineChoices.native.js.map +1 -1
  128. package/dist/esm/fields/Slider/index.mjs +96 -4
  129. package/dist/esm/fields/Slider/index.mjs.map +1 -1
  130. package/dist/esm/fields/Slider/index.native.js +103 -5
  131. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  132. package/dist/esm/fields/Switch/index.mjs +71 -1
  133. package/dist/esm/fields/Switch/index.mjs.map +1 -1
  134. package/dist/esm/fields/Switch/index.native.js +72 -1
  135. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  136. package/dist/esm/fields/TimePicker/parts.mjs +1 -0
  137. package/dist/esm/fields/TimePicker/parts.mjs.map +1 -1
  138. package/dist/esm/fields/TimePicker/parts.native.js +1 -0
  139. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  140. package/dist/esm/fields/ToggleGroup/index.mjs +67 -1
  141. package/dist/esm/fields/ToggleGroup/index.mjs.map +1 -1
  142. package/dist/esm/fields/ToggleGroup/index.native.js +75 -1
  143. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  144. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs +36 -21
  145. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
  146. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js +46 -23
  147. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  148. package/dist/esm/fields/nativeDateTime/sheetKeyboard.mjs +21 -0
  149. package/dist/esm/fields/nativeDateTime/sheetKeyboard.mjs.map +1 -0
  150. package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js +21 -0
  151. package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -0
  152. package/dist/esm/index.mjs +3 -1
  153. package/dist/esm/index.mjs.map +1 -1
  154. package/dist/esm/index.native.js +3 -1
  155. package/dist/esm/index.native.js.map +1 -1
  156. package/dist/esm/shared/overlaySizeClass.mjs +14 -0
  157. package/dist/esm/shared/overlaySizeClass.mjs.map +1 -0
  158. package/dist/esm/shared/overlaySizeClass.native.js +14 -0
  159. package/dist/esm/shared/overlaySizeClass.native.js.map +1 -0
  160. package/dist/esm/shared/sheetNavigation.mjs +47 -0
  161. package/dist/esm/shared/sheetNavigation.mjs.map +1 -0
  162. package/dist/esm/shared/sheetNavigation.native.js +97 -0
  163. package/dist/esm/shared/sheetNavigation.native.js.map +1 -0
  164. package/dist/esm/shared/systemControlModules.gnome.mjs +8 -0
  165. package/dist/esm/shared/systemControlModules.gnome.mjs.map +1 -0
  166. package/dist/esm/shared/systemControlModules.gnome.native.js +8 -0
  167. package/dist/esm/shared/systemControlModules.gnome.native.js.map +1 -0
  168. package/dist/esm/shared/systemControlModules.mjs +8 -0
  169. package/dist/esm/shared/systemControlModules.mjs.map +1 -0
  170. package/dist/esm/shared/systemControlModules.native.js +47 -0
  171. package/dist/esm/shared/systemControlModules.native.js.map +1 -0
  172. package/dist/esm/shared/systemControls.mjs +19 -0
  173. package/dist/esm/shared/systemControls.mjs.map +1 -0
  174. package/dist/esm/shared/systemControls.native.js +20 -0
  175. package/dist/esm/shared/systemControls.native.js.map +1 -0
  176. package/dist/jsx/FloatingPanel/RegularPanel.mjs +139 -0
  177. package/dist/jsx/FloatingPanel/RegularPanel.mjs.map +1 -0
  178. package/dist/jsx/FloatingPanel/RegularPanel.native.js +169 -0
  179. package/dist/jsx/FloatingPanel/RegularPanel.native.js.map +1 -0
  180. package/dist/jsx/FloatingPanel/compactFace.mjs +5 -1
  181. package/dist/jsx/FloatingPanel/compactFace.mjs.map +1 -1
  182. package/dist/jsx/FloatingPanel/compactFace.native.js +6 -0
  183. package/dist/jsx/FloatingPanel/compactFace.native.js.map +1 -1
  184. package/dist/jsx/FloatingPanel/containingBlock.mjs +21 -0
  185. package/dist/jsx/FloatingPanel/containingBlock.mjs.map +1 -0
  186. package/dist/jsx/FloatingPanel/containingBlock.native.js +51 -0
  187. package/dist/jsx/FloatingPanel/containingBlock.native.js.map +1 -0
  188. package/dist/jsx/FloatingPanel/index.mjs +1 -19
  189. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  190. package/dist/jsx/FloatingPanel/index.native.js +79 -45
  191. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  192. package/dist/jsx/FloatingPanel/pointAnchor.mjs +25 -1
  193. package/dist/jsx/FloatingPanel/pointAnchor.mjs.map +1 -1
  194. package/dist/jsx/FloatingPanel/pointAnchor.native.js +26 -0
  195. package/dist/jsx/FloatingPanel/pointAnchor.native.js.map +1 -1
  196. package/dist/jsx/FloatingPanel/regularPlacement.mjs +35 -0
  197. package/dist/jsx/FloatingPanel/regularPlacement.mjs.map +1 -0
  198. package/dist/jsx/FloatingPanel/regularPlacement.native.js +65 -0
  199. package/dist/jsx/FloatingPanel/regularPlacement.native.js.map +1 -0
  200. package/dist/jsx/fields/Combobox/index.mjs +9 -11
  201. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  202. package/dist/jsx/fields/Combobox/index.native.js +10 -10
  203. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  204. package/dist/jsx/fields/DatePicker/parts.mjs +1 -0
  205. package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
  206. package/dist/jsx/fields/DatePicker/parts.native.js +3 -0
  207. package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
  208. package/dist/jsx/fields/Input/index.mjs +6 -1
  209. package/dist/jsx/fields/Input/index.mjs.map +1 -1
  210. package/dist/jsx/fields/Input/index.native.js +5 -0
  211. package/dist/jsx/fields/Input/index.native.js.map +1 -1
  212. package/dist/jsx/fields/Select/InlineChoices.mjs +3 -2
  213. package/dist/jsx/fields/Select/InlineChoices.mjs.map +1 -1
  214. package/dist/jsx/fields/Select/InlineChoices.native.js +5 -2
  215. package/dist/jsx/fields/Select/InlineChoices.native.js.map +1 -1
  216. package/dist/jsx/fields/Select/SheetPickerRow.mjs +129 -0
  217. package/dist/jsx/fields/Select/SheetPickerRow.mjs.map +1 -0
  218. package/dist/jsx/fields/Select/SheetPickerRow.native.js +165 -0
  219. package/dist/jsx/fields/Select/SheetPickerRow.native.js.map +1 -0
  220. package/dist/jsx/fields/Select/index.mjs +66 -7
  221. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  222. package/dist/jsx/fields/Select/index.native.js +86 -27
  223. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  224. package/dist/jsx/fields/Select/shouldInlineChoices.mjs +12 -1
  225. package/dist/jsx/fields/Select/shouldInlineChoices.mjs.map +1 -1
  226. package/dist/jsx/fields/Select/shouldInlineChoices.native.js +15 -1
  227. package/dist/jsx/fields/Select/shouldInlineChoices.native.js.map +1 -1
  228. package/dist/jsx/fields/Slider/index.mjs +96 -4
  229. package/dist/jsx/fields/Slider/index.mjs.map +1 -1
  230. package/dist/jsx/fields/Slider/index.native.js +103 -5
  231. package/dist/jsx/fields/Slider/index.native.js.map +1 -1
  232. package/dist/jsx/fields/Switch/index.mjs +71 -1
  233. package/dist/jsx/fields/Switch/index.mjs.map +1 -1
  234. package/dist/jsx/fields/Switch/index.native.js +72 -1
  235. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  236. package/dist/jsx/fields/TimePicker/parts.mjs +1 -0
  237. package/dist/jsx/fields/TimePicker/parts.mjs.map +1 -1
  238. package/dist/jsx/fields/TimePicker/parts.native.js +1 -0
  239. package/dist/jsx/fields/TimePicker/parts.native.js.map +1 -1
  240. package/dist/jsx/fields/ToggleGroup/index.mjs +67 -1
  241. package/dist/jsx/fields/ToggleGroup/index.mjs.map +1 -1
  242. package/dist/jsx/fields/ToggleGroup/index.native.js +75 -1
  243. package/dist/jsx/fields/ToggleGroup/index.native.js.map +1 -1
  244. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs +36 -21
  245. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
  246. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js +44 -21
  247. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  248. package/dist/jsx/fields/nativeDateTime/sheetKeyboard.mjs +21 -0
  249. package/dist/jsx/fields/nativeDateTime/sheetKeyboard.mjs.map +1 -0
  250. package/dist/jsx/fields/nativeDateTime/sheetKeyboard.native.js +57 -0
  251. package/dist/jsx/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -0
  252. package/dist/jsx/index.js +3 -1
  253. package/dist/jsx/index.js.map +1 -1
  254. package/dist/jsx/index.mjs +3 -1
  255. package/dist/jsx/index.mjs.map +1 -1
  256. package/dist/jsx/index.native.js +11 -0
  257. package/dist/jsx/index.native.js.map +1 -1
  258. package/dist/jsx/shared/overlaySizeClass.mjs +14 -0
  259. package/dist/jsx/shared/overlaySizeClass.mjs.map +1 -0
  260. package/dist/jsx/shared/overlaySizeClass.native.js +45 -0
  261. package/dist/jsx/shared/overlaySizeClass.native.js.map +1 -0
  262. package/dist/jsx/shared/sheetNavigation.mjs +47 -0
  263. package/dist/jsx/shared/sheetNavigation.mjs.map +1 -0
  264. package/dist/jsx/shared/sheetNavigation.native.js +129 -0
  265. package/dist/jsx/shared/sheetNavigation.native.js.map +1 -0
  266. package/dist/jsx/shared/systemControlModules.gnome.mjs +8 -0
  267. package/dist/jsx/shared/systemControlModules.gnome.mjs.map +1 -0
  268. package/dist/jsx/shared/systemControlModules.gnome.native.js +37 -0
  269. package/dist/jsx/shared/systemControlModules.gnome.native.js.map +1 -0
  270. package/dist/jsx/shared/systemControlModules.mjs +8 -0
  271. package/dist/jsx/shared/systemControlModules.mjs.map +1 -0
  272. package/dist/jsx/shared/systemControlModules.native.js +77 -0
  273. package/dist/jsx/shared/systemControlModules.native.js.map +1 -0
  274. package/dist/jsx/shared/systemControls.mjs +19 -0
  275. package/dist/jsx/shared/systemControls.mjs.map +1 -0
  276. package/dist/jsx/shared/systemControls.native.js +51 -0
  277. package/dist/jsx/shared/systemControls.native.js.map +1 -0
  278. package/package.json +16 -8
  279. package/src/FloatingPanel/FloatingPanel.menuFace.native.spec.tsx +73 -3
  280. package/src/FloatingPanel/FloatingPanel.regularWidth.native.spec.tsx +193 -0
  281. package/src/FloatingPanel/RegularPanel.tsx +159 -0
  282. package/src/FloatingPanel/compactFace.spec.ts +24 -1
  283. package/src/FloatingPanel/compactFace.ts +16 -0
  284. package/src/FloatingPanel/containingBlock.ts +32 -0
  285. package/src/FloatingPanel/index.native.tsx +80 -35
  286. package/src/FloatingPanel/index.tsx +1 -33
  287. package/src/FloatingPanel/pointAnchor.spec.ts +29 -0
  288. package/src/FloatingPanel/pointAnchor.ts +30 -0
  289. package/src/FloatingPanel/regularPlacement.spec.ts +65 -0
  290. package/src/FloatingPanel/regularPlacement.ts +40 -0
  291. package/src/fields/Combobox/Combobox.regularWidth.native.spec.tsx +94 -0
  292. package/src/fields/Combobox/index.tsx +11 -34
  293. package/src/fields/DatePicker/parts.tsx +3 -0
  294. package/src/fields/DatePicker/touchWeb.spec.tsx +13 -0
  295. package/src/fields/Input/Input.formName.spec.tsx +53 -0
  296. package/src/fields/Input/index.tsx +6 -1
  297. package/src/fields/Select/InlineChoices.tsx +6 -3
  298. package/src/fields/Select/SheetPickerRow.tsx +160 -0
  299. package/src/fields/Select/index.tsx +67 -5
  300. package/src/fields/Select/shouldInlineChoices.spec.ts +21 -1
  301. package/src/fields/Select/shouldInlineChoices.ts +26 -0
  302. package/src/fields/Slider/Slider.system.native.spec.tsx +168 -0
  303. package/src/fields/Slider/index.tsx +166 -30
  304. package/src/fields/Switch/Switch.system.native.spec.tsx +162 -0
  305. package/src/fields/Switch/index.tsx +98 -0
  306. package/src/fields/TimePicker/parts.tsx +1 -0
  307. package/src/fields/ToggleGroup/ToggleGroup.system.native.spec.tsx +192 -0
  308. package/src/fields/ToggleGroup/index.tsx +111 -0
  309. package/src/fields/nativeDateTime/OsDateTimeSheet.presentation.spec.tsx +167 -0
  310. package/src/fields/nativeDateTime/OsDateTimeSheet.tsx +36 -18
  311. package/src/fields/nativeDateTime/sheetKeyboard.spec.ts +60 -0
  312. package/src/fields/nativeDateTime/sheetKeyboard.ts +45 -0
  313. package/src/index.ts +15 -0
  314. package/src/shared/overlaySizeClass.spec.ts +27 -0
  315. package/src/shared/overlaySizeClass.ts +36 -0
  316. package/src/shared/sheetNavigation.ts +82 -0
  317. package/src/shared/systemControlModules.gnome.ts +10 -0
  318. package/src/shared/systemControlModules.native.spec.ts +52 -0
  319. package/src/shared/systemControlModules.native.ts +66 -0
  320. package/src/shared/systemControlModules.ts +10 -0
  321. package/src/shared/systemControls.ts +70 -0
  322. package/types/FloatingPanel/RegularPanel.d.ts +29 -0
  323. package/types/FloatingPanel/RegularPanel.d.ts.map +1 -0
  324. package/types/FloatingPanel/compactFace.d.ts +12 -0
  325. package/types/FloatingPanel/compactFace.d.ts.map +1 -1
  326. package/types/FloatingPanel/containingBlock.d.ts +14 -0
  327. package/types/FloatingPanel/containingBlock.d.ts.map +1 -0
  328. package/types/FloatingPanel/index.d.ts.map +1 -1
  329. package/types/FloatingPanel/index.native.d.ts +6 -1
  330. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  331. package/types/FloatingPanel/pointAnchor.d.ts +12 -0
  332. package/types/FloatingPanel/pointAnchor.d.ts.map +1 -1
  333. package/types/FloatingPanel/regularPlacement.d.ts +20 -0
  334. package/types/FloatingPanel/regularPlacement.d.ts.map +1 -0
  335. package/types/fields/Combobox/index.d.ts.map +1 -1
  336. package/types/fields/DatePicker/parts.d.ts.map +1 -1
  337. package/types/fields/Input/index.d.ts.map +1 -1
  338. package/types/fields/Select/InlineChoices.d.ts.map +1 -1
  339. package/types/fields/Select/SheetPickerRow.d.ts +23 -0
  340. package/types/fields/Select/SheetPickerRow.d.ts.map +1 -0
  341. package/types/fields/Select/index.d.ts.map +1 -1
  342. package/types/fields/Select/shouldInlineChoices.d.ts +15 -0
  343. package/types/fields/Select/shouldInlineChoices.d.ts.map +1 -1
  344. package/types/fields/Slider/index.d.ts +7 -1
  345. package/types/fields/Slider/index.d.ts.map +1 -1
  346. package/types/fields/Switch/index.d.ts +7 -1
  347. package/types/fields/Switch/index.d.ts.map +1 -1
  348. package/types/fields/TimePicker/parts.d.ts.map +1 -1
  349. package/types/fields/ToggleGroup/index.d.ts +8 -1
  350. package/types/fields/ToggleGroup/index.d.ts.map +1 -1
  351. package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts.map +1 -1
  352. package/types/fields/nativeDateTime/sheetKeyboard.d.ts +20 -0
  353. package/types/fields/nativeDateTime/sheetKeyboard.d.ts.map +1 -0
  354. package/types/index.d.ts +4 -0
  355. package/types/index.d.ts.map +1 -1
  356. package/types/shared/overlaySizeClass.d.ts +24 -0
  357. package/types/shared/overlaySizeClass.d.ts.map +1 -0
  358. package/types/shared/sheetNavigation.d.ts +31 -0
  359. package/types/shared/sheetNavigation.d.ts.map +1 -0
  360. package/types/shared/systemControlModules.d.ts +5 -0
  361. package/types/shared/systemControlModules.d.ts.map +1 -0
  362. package/types/shared/systemControlModules.gnome.d.ts +5 -0
  363. package/types/shared/systemControlModules.gnome.d.ts.map +1 -0
  364. package/types/shared/systemControlModules.native.d.ts +20 -0
  365. package/types/shared/systemControlModules.native.d.ts.map +1 -0
  366. package/types/shared/systemControls.d.ts +53 -0
  367. package/types/shared/systemControls.d.ts.map +1 -0
@@ -33,6 +33,13 @@ import {
33
33
  import { Skeleton } from "../../Skeleton";
34
34
  import { Field, FieldLayout, useFieldA11y, useFieldDescribedBy } from "../../fieldLayout";
35
35
  import { formCommonColors, formControlColors, formSelectedColors } from "../../shared/colorRamps";
36
+ import { loadSystemSlider } from "../../shared/systemControlModules";
37
+ import {
38
+ type SystemPlatform,
39
+ type SystemSliderComponent,
40
+ systemControlPlatform,
41
+ useThemeLiteral,
42
+ } from "../../shared/systemControls";
36
43
  import { t } from "../../shared/t";
37
44
  import {
38
45
  getElevationWrapperProps,
@@ -180,6 +187,12 @@ export interface SliderProps {
180
187
  /** When true, renders a skeleton placeholder instead of the slider */
181
188
  skeleton?: boolean;
182
189
  "aria-label"?: string;
190
+ /**
191
+ * LC-266: on iOS and Android a single-thumb horizontal slider renders the
192
+ * system slider when the binary carries `@react-native-community/slider`.
193
+ * `false` keeps the MPO slider there.
194
+ */
195
+ native?: boolean;
183
196
  }
184
197
 
185
198
  type SliderControlProps = {
@@ -219,6 +232,91 @@ type SliderControlProps = {
219
232
  * (track click, keyboard, controlled value change). Drag and first paint stay
220
233
  * transition-off so the handle never lags the pointer or wiggles on mount.
221
234
  */
235
+ /**
236
+ * LC-266: the system slider (UISlider, Android SeekBar). The theme paints the
237
+ * fill and the rail, and the Android thumb; iOS keeps its system thumb. The
238
+ * value readout stays beside it, as on the MPO slider.
239
+ */
240
+ function SystemSliderControl({
241
+ Component,
242
+ platform,
243
+ id,
244
+ value,
245
+ min,
246
+ max,
247
+ step,
248
+ disabled,
249
+ readOnly,
250
+ hasError,
251
+ accessibilityLabel,
252
+ accessibilityHint,
253
+ height,
254
+ onChangeValue,
255
+ onBlur,
256
+ }: {
257
+ Component: SystemSliderComponent;
258
+ platform: SystemPlatform;
259
+ id: string;
260
+ value: number;
261
+ min: number;
262
+ max: number;
263
+ step: number;
264
+ disabled?: boolean;
265
+ readOnly?: boolean;
266
+ hasError?: boolean;
267
+ accessibilityLabel?: string;
268
+ accessibilityHint?: string;
269
+ height: SizeTokens;
270
+ onChangeValue: (value: number) => void;
271
+ onBlur?: (...args: any[]) => void;
272
+ }) {
273
+ const literal = useThemeLiteral();
274
+ const [displayValue, setDisplayValue] = useState(value);
275
+ useEffect(() => setDisplayValue(value), [value]);
276
+ const fill = literal(hasError ? formCommonColors.error : formSelectedColors.mark);
277
+ return (
278
+ <XStack height={height} alignItems="center" width="100%" gap="$3">
279
+ <View
280
+ flex={1}
281
+ minWidth={0}
282
+ justifyContent="center"
283
+ {...(readOnly ? { pointerEvents: "none" as const } : undefined)}
284
+ data-mp-system-control="slider"
285
+ >
286
+ <Component
287
+ id={id}
288
+ style={{ width: "100%" }}
289
+ value={value}
290
+ minimumValue={min}
291
+ maximumValue={max}
292
+ step={step}
293
+ disabled={disabled}
294
+ minimumTrackTintColor={fill}
295
+ maximumTrackTintColor={literal(formControlColors.background)}
296
+ {...(platform === "android" && { thumbTintColor: fill })}
297
+ accessibilityLabel={accessibilityLabel}
298
+ accessibilityHint={accessibilityHint}
299
+ onValueChange={(next) => {
300
+ setDisplayValue(next);
301
+ if (disabled || readOnly) return;
302
+ onChangeValue(next);
303
+ }}
304
+ onSlidingComplete={() => onBlur?.()}
305
+ />
306
+ </View>
307
+ <Paragraph
308
+ size="$2"
309
+ color={formCommonColors.text}
310
+ minWidth={32}
311
+ textAlign="right"
312
+ aria-hidden
313
+ >
314
+ {formatSliderOutput([displayValue], step)}
315
+ </Paragraph>
316
+ </XStack>
317
+ );
318
+ }
319
+
222
320
  function SliderControl({
223
321
  id,
224
322
  sliderValue,
@@ -712,6 +810,7 @@ export function Slider({
712
810
  sliderProps,
713
811
  skeleton,
714
812
  "aria-label": ariaLabel,
813
+ native = true,
715
814
  }: SliderProps) {
716
815
  // Canonical `onChange` and the alias `onValueChange` both fire from the
717
816
  // single emit site below (same reconciliation as Switch).
@@ -740,41 +839,70 @@ export function Slider({
740
839
  );
741
840
  }
742
841
 
842
+ const systemPlatform = native ? systemControlPlatform() : null;
843
+ const SystemSlider =
844
+ systemPlatform && sliderProps?.orientation !== "vertical" && sliderProps?.dir !== "rtl"
845
+ ? loadSystemSlider()
846
+ : null;
847
+
743
848
  const control = (
744
849
  sliderValue: number[],
745
850
  isControlled: boolean,
746
851
  handleChange?: (values: number[]) => void,
747
852
  handleBlur?: (...args: any[]) => void,
748
853
  hasError?: boolean,
749
- ) => (
750
- <SliderControl
751
- id={id}
752
- sliderValue={sliderValue}
753
- controlled={isControlled}
754
- min={min}
755
- max={max}
756
- step={step}
757
- disabled={disabled}
758
- readOnly={readOnly}
759
- required={required}
760
- hasError={hasError}
761
- hasLabel={hasLabel}
762
- labelText={typeof label === "string" ? label : undefined}
763
- aria-label={ariaLabel}
764
- size={size}
765
- sizeToken={knobProps.sizeToken}
766
- outlined={knobProps.outlined}
767
- borderRadius={knobProps.borderRadius.borderRadius}
768
- transitionToken={transitionToken}
769
- elevationWrapperProps={elevationWrapperProps}
770
- sliderProps={sliderProps}
771
- onChangeValues={(values) => {
772
- handleChange?.(values);
773
- handleValueChange(values);
774
- }}
775
- onBlur={handleBlur}
776
- />
777
- );
854
+ errorMessage?: string,
855
+ ) =>
856
+ SystemSlider && systemPlatform && sliderValue.length === 1 ? (
857
+ <SystemSliderControl
858
+ Component={SystemSlider}
859
+ platform={systemPlatform}
860
+ id={id}
861
+ value={sliderValue[0] ?? min}
862
+ min={min}
863
+ max={max}
864
+ step={step}
865
+ disabled={disabled}
866
+ readOnly={readOnly}
867
+ hasError={hasError}
868
+ accessibilityLabel={ariaLabel ?? (typeof label === "string" ? label : undefined)}
869
+ accessibilityHint={errorMessage ?? helperText}
870
+ height={size || knobProps.sizeToken}
871
+ onChangeValue={(next) => {
872
+ handleChange?.([next]);
873
+ handleValueChange([next]);
874
+ }}
875
+ onBlur={handleBlur}
876
+ />
877
+ ) : (
878
+ <SliderControl
879
+ id={id}
880
+ sliderValue={sliderValue}
881
+ controlled={isControlled}
882
+ min={min}
883
+ max={max}
884
+ step={step}
885
+ disabled={disabled}
886
+ readOnly={readOnly}
887
+ required={required}
888
+ hasError={hasError}
889
+ hasLabel={hasLabel}
890
+ labelText={typeof label === "string" ? label : undefined}
891
+ aria-label={ariaLabel}
892
+ size={size}
893
+ sizeToken={knobProps.sizeToken}
894
+ outlined={knobProps.outlined}
895
+ borderRadius={knobProps.borderRadius.borderRadius}
896
+ transitionToken={transitionToken}
897
+ elevationWrapperProps={elevationWrapperProps}
898
+ sliderProps={sliderProps}
899
+ onChangeValues={(values) => {
900
+ handleChange?.(values);
901
+ handleValueChange(values);
902
+ }}
903
+ onBlur={handleBlur}
904
+ />
905
+ );
778
906
 
779
907
  if (!resolvedForm || !name) {
780
908
  return (
@@ -789,7 +917,14 @@ export function Slider({
789
917
  knobProps={knobProps}
790
918
  disabled={disabled}
791
919
  >
792
- {control(value ?? defaultValue ?? [min], value !== undefined, undefined, onBlur, !!error)}
920
+ {control(
921
+ value ?? defaultValue ?? [min],
922
+ value !== undefined,
923
+ undefined,
924
+ onBlur,
925
+ !!error,
926
+ typeof error === "string" && error ? error : undefined,
927
+ )}
793
928
  </FieldLayout>
794
929
  );
795
930
  }
@@ -832,6 +967,7 @@ export function Slider({
832
967
  },
833
968
  mergeFieldHandler(field, "handleBlur", onBlur),
834
969
  !!resolvedError,
970
+ typeof resolvedError === "string" && resolvedError ? resolvedError : undefined,
835
971
  )}
836
972
  </FieldLayout>
837
973
  );
@@ -0,0 +1,162 @@
1
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { createDefaultThemeConfig } from "@multiplatform.one/theme";
3
+ import { useForm } from "@tanstack/react-form";
4
+ import { cleanup, fireEvent, render } from "@testing-library/react";
5
+ import type { ReactElement } from "react";
6
+ import { TamaguiProvider } from "tamagui";
7
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
8
+ import { Form } from "../../Form";
9
+ import { Switch } from "./index";
10
+
11
+ const platform = vi.hoisted(() => ({ os: "ios" as "ios" | "android" | null }));
12
+
13
+ // The system Switch as a probe: it shows the props React Native's Switch got
14
+ // and flips through onValueChange the way a tap on UISwitch does.
15
+ const SystemSwitchProbe = vi.hoisted(
16
+ () =>
17
+ function SystemSwitchProbe(props: Record<string, any>) {
18
+ return (
19
+ <button
20
+ type="button"
21
+ data-testid="system-switch"
22
+ data-value={String(props.value)}
23
+ data-disabled={String(Boolean(props.disabled))}
24
+ data-track-on={props.trackColor?.true}
25
+ data-track-off={props.trackColor?.false}
26
+ data-ios-off={props.ios_backgroundColor}
27
+ data-thumb={props.thumbColor ?? ""}
28
+ data-label={props.accessibilityLabel ?? ""}
29
+ onClick={() => props.disabled || props.onValueChange?.(!props.value)}
30
+ />
31
+ );
32
+ },
33
+ );
34
+
35
+ vi.mock("../../shared/systemControls", async (importOriginal) => ({
36
+ ...(await importOriginal<typeof import("../../shared/systemControls")>()),
37
+ systemControlPlatform: () => platform.os,
38
+ SystemSwitchView: SystemSwitchProbe,
39
+ }));
40
+
41
+ const mpoTheme = createDefaultThemeConfig();
42
+ const renderInScheme = (ui: ReactElement, scheme: "light" | "dark") =>
43
+ render(
44
+ <TamaguiProvider config={mpoTheme.tamagui} defaultTheme={scheme} disableInjectCSS>
45
+ {ui}
46
+ </TamaguiProvider>,
47
+ );
48
+
49
+ afterEach(cleanup);
50
+ beforeEach(() => {
51
+ platform.os = "ios";
52
+ });
53
+
54
+ const literal = (value: string | null) => Boolean(value) && !value!.startsWith("$");
55
+
56
+ function FormSwitch({ onSubmit }: { onSubmit: (value: { alerts: boolean }) => void }) {
57
+ const form = useForm({
58
+ defaultValues: { alerts: false },
59
+ onSubmit: ({ value }) => onSubmit(value),
60
+ });
61
+ return (
62
+ <Form form={form}>
63
+ <Switch name="alerts" label="Alerts" />
64
+ <button type="button" onClick={() => form.handleSubmit()}>
65
+ Save
66
+ </button>
67
+ </Form>
68
+ );
69
+ }
70
+
71
+ // LC-266 PLATFORM-ERGONOMICS (FZ-8117). iOS and Android render React Native's
72
+ // own Switch, tinted from the theme; web and GNOME keep the MPO switch.
73
+ describe("Switch on iOS and Android", () => {
74
+ it.each(["light", "dark"] as const)(
75
+ "renders the system switch with the %s theme's accent and off track as literals",
76
+ (scheme) => {
77
+ const result = renderInScheme(<Switch label="Alerts" defaultValue />, scheme);
78
+ const view = result.getByTestId("system-switch");
79
+ expect(view.dataset.value).toBe("true");
80
+ expect(literal(view.getAttribute("data-track-on"))).toBe(true);
81
+ expect(literal(view.getAttribute("data-track-off"))).toBe(true);
82
+ expect(view.getAttribute("data-ios-off")).toBe(view.getAttribute("data-track-off"));
83
+ expect(view.dataset.thumb).toBe("");
84
+ expect(view.dataset.label).toBe("Alerts");
85
+ expect(result.container.querySelector('[role="switch"]')).toBeNull();
86
+ },
87
+ );
88
+
89
+ it.each(["light", "dark"] as const)(
90
+ "paints the %s theme's off track and thumb on Android",
91
+ (scheme) => {
92
+ platform.os = "android";
93
+ const view = renderInScheme(<Switch label="Alerts" />, scheme).getByTestId("system-switch");
94
+ expect(literal(view.getAttribute("data-track-off"))).toBe(true);
95
+ expect(literal(view.getAttribute("data-thumb"))).toBe(true);
96
+ },
97
+ );
98
+
99
+ it("toggles standalone and reports through onChange and onCheckedChange", () => {
100
+ const onChange = vi.fn();
101
+ const onCheckedChange = vi.fn();
102
+ const result = renderWithProviders(
103
+ <Switch label="Alerts" onChange={onChange} onCheckedChange={onCheckedChange} />,
104
+ );
105
+ const view = result.getByTestId("system-switch");
106
+ fireEvent.click(view);
107
+ expect(onChange).toHaveBeenCalledExactlyOnceWith(true);
108
+ expect(onCheckedChange).toHaveBeenCalledExactlyOnceWith(true);
109
+ expect(view.dataset.value).toBe("true");
110
+ });
111
+
112
+ it("follows a controlled value", () => {
113
+ const result = renderWithProviders(<Switch label="Alerts" checked={false} />);
114
+ fireEvent.click(result.getByTestId("system-switch"));
115
+ expect(result.getByTestId("system-switch").dataset.value).toBe("false");
116
+ result.rerender(<Switch label="Alerts" checked />);
117
+ expect(result.getByTestId("system-switch").dataset.value).toBe("true");
118
+ });
119
+
120
+ it("passes disabled to the system switch and never changes a disabled or read-only value", () => {
121
+ const onChange = vi.fn();
122
+ const result = renderWithProviders(
123
+ <>
124
+ <Switch label="Off limits" onChange={onChange} disabled />
125
+ <Switch label="Look only" onChange={onChange} readOnly />
126
+ </>,
127
+ );
128
+ const [disabledView, readOnlyView] = result.getAllByTestId("system-switch");
129
+ expect(disabledView!.dataset.disabled).toBe("true");
130
+ expect(readOnlyView!.dataset.disabled).toBe("false");
131
+ fireEvent.click(disabledView!);
132
+ fireEvent.click(readOnlyView!);
133
+ expect(onChange).not.toHaveBeenCalled();
134
+ });
135
+
136
+ it("writes the form field it is bound to", async () => {
137
+ const onSubmit = vi.fn();
138
+ const result = renderWithProviders(<FormSwitch onSubmit={onSubmit} />);
139
+ fireEvent.click(result.getByTestId("system-switch"));
140
+ fireEvent.click(result.getByText("Save"));
141
+ await vi.waitFor(() => expect(onSubmit).toHaveBeenCalledWith({ alerts: true }));
142
+ });
143
+
144
+ it("keeps the MPO switch for native={false}, track icons and switchProps", () => {
145
+ const result = renderWithProviders(
146
+ <>
147
+ <Switch label="Opted out" native={false} />
148
+ <Switch label="Iconed" leftIcon={<span>i</span>} />
149
+ <Switch label="Styled" switchProps={{ opacity: 1 }} />
150
+ </>,
151
+ );
152
+ expect(result.queryByTestId("system-switch")).toBeNull();
153
+ expect(result.container.querySelectorAll('[role="switch"]')).toHaveLength(3);
154
+ });
155
+
156
+ it("keeps the MPO switch on web and GNOME", () => {
157
+ platform.os = null;
158
+ const result = renderWithProviders(<Switch label="Alerts" />);
159
+ expect(result.queryByTestId("system-switch")).toBeNull();
160
+ expect(result.container.querySelector('[role="switch"]')).not.toBeNull();
161
+ });
162
+ });
@@ -51,6 +51,12 @@ import {
51
51
  } from "../../shared/utils";
52
52
  import { choiceLabelPressProps, choiceRowPressProps } from "../../shared/choiceRowPress";
53
53
  import { pressSlopProps } from "../../shared/pressSlopProps";
54
+ import {
55
+ type SystemPlatform,
56
+ SystemSwitchView,
57
+ systemControlPlatform,
58
+ useThemeLiteral,
59
+ } from "../../shared/systemControls";
54
60
  import { useIsInTableCell } from "../../shared/tableCellContext";
55
61
  import { switchFootprint, type SwitchFootprint } from "./footprint";
56
62
 
@@ -687,6 +693,65 @@ function SwitchControl({
687
693
  );
688
694
  }
689
695
 
696
+ /**
697
+ * LC-266: React Native's own Switch, so iOS and Android get the system toggle's
698
+ * feel, haptics and VoiceOver/TalkBack behaviour. The theme paints it: the
699
+ * accent on track and the theme's off track in both schemes, and on Android
700
+ * the theme thumb. iOS keeps its system white thumb.
701
+ */
702
+ function SystemSwitch({
703
+ platform,
704
+ checked,
705
+ onCheckedChange,
706
+ onBlur,
707
+ disabled,
708
+ readOnly,
709
+ id,
710
+ minHeight,
711
+ accessibilityLabel,
712
+ accessibilityHint,
713
+ }: {
714
+ platform: SystemPlatform;
715
+ checked: boolean;
716
+ onCheckedChange: (checked: boolean) => void;
717
+ onBlur?: (...args: any[]) => void;
718
+ disabled?: boolean;
719
+ readOnly?: boolean;
720
+ id: string;
721
+ minHeight?: number;
722
+ accessibilityLabel?: string;
723
+ accessibilityHint?: string;
724
+ }) {
725
+ const literal = useThemeLiteral();
726
+ const on = literal(formSwitchColors.track.on);
727
+ const off = literal(formSwitchColors.track.off);
728
+ return (
729
+ <View
730
+ justifyContent="center"
731
+ {...(minHeight !== undefined && { minHeight })}
732
+ {...(readOnly ? { pointerEvents: "none" as const } : undefined)}
733
+ data-mp-system-control="switch"
734
+ >
735
+ <SystemSwitchView
736
+ id={id}
737
+ value={checked}
738
+ disabled={disabled}
739
+ onValueChange={(next) => {
740
+ if (disabled || readOnly) return;
741
+ onCheckedChange(next);
742
+ onBlur?.();
743
+ }}
744
+ trackColor={{ false: off, true: on }}
745
+ ios_backgroundColor={off}
746
+ {...(platform === "android" && { thumbColor: literal(formSwitchColors.thumb) })}
747
+ accessibilityLabel={accessibilityLabel}
748
+ accessibilityHint={accessibilityHint}
749
+ accessibilityState={{ disabled: !!disabled, checked }}
750
+ />
751
+ </View>
752
+ );
753
+ }
754
+
690
755
  // ─── Form-aware Switch ────────────────────────────────────────────────────────
691
756
 
692
757
  export interface SwitchProps {
@@ -743,6 +808,12 @@ export interface SwitchProps {
743
808
  * Dense toggle lists pass 44 so every toggle is individually hittable.
744
809
  */
745
810
  minTargetHeight?: number;
811
+ /**
812
+ * LC-266: on iOS and Android the field renders the system switch. `false`
813
+ * keeps the MPO switch there. Track icons, `switchProps` and `pointy` draw
814
+ * on the MPO switch only, so passing any of them keeps it too.
815
+ */
816
+ native?: boolean;
746
817
  }
747
818
 
748
819
  export function Switch({
@@ -772,6 +843,7 @@ export function Switch({
772
843
  pointy,
773
844
  skeleton,
774
845
  minTargetHeight,
846
+ native = true,
775
847
  }: SwitchProps) {
776
848
  // The switch stays first in the DOM (focus and reading order); the row
777
849
  // reverses so the label leads and the switch sits at the trailing edge.
@@ -841,6 +913,11 @@ export function Switch({
841
913
  handleValueChange(!current);
842
914
  };
843
915
 
916
+ const systemPlatform =
917
+ native && !leftIcon && !rightIcon && !switchProps && pointy === undefined
918
+ ? systemControlPlatform()
919
+ : null;
920
+
844
921
  const renderSwitch = (
845
922
  switchChecked: boolean,
846
923
  handleChange?: (val: boolean) => void,
@@ -848,6 +925,27 @@ export function Switch({
848
925
  hasError?: boolean,
849
926
  errorMessage?: string,
850
927
  ) => {
928
+ if (systemPlatform) {
929
+ return (
930
+ <SystemSwitch
931
+ platform={systemPlatform}
932
+ checked={switchChecked}
933
+ onCheckedChange={(val) => {
934
+ handleChange?.(val);
935
+ handleValueChange(val);
936
+ }}
937
+ onBlur={handleBlur}
938
+ disabled={disabled}
939
+ readOnly={readOnly}
940
+ id={id}
941
+ minHeight={targetHeight}
942
+ accessibilityLabel={
943
+ typeof label === "string" ? `${label}${required ? " *" : ""}` : ariaLabel
944
+ }
945
+ accessibilityHint={errorMessage ?? helperText}
946
+ />
947
+ );
948
+ }
851
949
  const overrideRadius = (switchProps as any)?.borderRadius;
852
950
  const radiusStop = resolveSwitchRadiusStop(pointy, knobProps.borderRadius.borderRadius);
853
951
  const thumbPaintedHeight = footprint.thumbSize;
@@ -160,6 +160,7 @@ export function TimePickerInputTrigger({
160
160
  flex={1}
161
161
  minWidth={0}
162
162
  elevation={undefined}
163
+ position={touchInput ? "relative" : undefined}
163
164
  onPress={isWeb && interactive ? onOpen : undefined}
164
165
  {...(disabled ? { opacity: 0.5, pointerEvents: "none" as const } : undefined)}
165
166
  >