@multiplatform.one/forms 7.6.2 → 7.7.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 (492) hide show
  1. package/dist/cjs/Button/index.cjs +7 -1
  2. package/dist/cjs/Button/index.native.js +7 -1
  3. package/dist/cjs/Button/index.native.js.map +1 -1
  4. package/dist/cjs/Chip/index.cjs +1 -3
  5. package/dist/cjs/Chip/index.native.js +5 -3
  6. package/dist/cjs/Chip/index.native.js.map +1 -1
  7. package/dist/cjs/ContextualSaveBar/index.cjs +19 -3
  8. package/dist/cjs/ContextualSaveBar/index.native.js +19 -3
  9. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  10. package/dist/cjs/DescriptionList/index.cjs +38 -12
  11. package/dist/cjs/DescriptionList/index.native.js +38 -12
  12. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  13. package/dist/cjs/ErrorSummary.cjs +4 -1
  14. package/dist/cjs/ErrorSummary.native.js +4 -1
  15. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  16. package/dist/cjs/FloatingPanel/useFloatingPanel.cjs +24 -2
  17. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js +43 -2
  18. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  19. package/dist/cjs/InputParts/index.cjs +42 -2
  20. package/dist/cjs/InputParts/index.native.js +42 -2
  21. package/dist/cjs/InputParts/index.native.js.map +1 -1
  22. package/dist/cjs/fields/Checkbox/Checkbox.cjs +5 -2
  23. package/dist/cjs/fields/Checkbox/Checkbox.native.js +6 -3
  24. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  25. package/dist/cjs/fields/Checkbox/CheckboxGroup.cjs +69 -59
  26. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +75 -65
  27. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  28. package/dist/cjs/fields/Checkbox/checkboxGroupContext.cjs +33 -0
  29. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js +36 -0
  30. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -0
  31. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.cjs +402 -0
  32. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +441 -0
  33. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -0
  34. package/dist/cjs/fields/DatePicker/DatetimePicker.cjs +2 -376
  35. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +69 -297
  36. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  37. package/dist/cjs/fields/DatePicker/catalog.cjs +306 -0
  38. package/dist/cjs/fields/DatePicker/catalog.native.js +350 -0
  39. package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -0
  40. package/dist/cjs/fields/DatePicker/index.cjs +7 -280
  41. package/dist/cjs/fields/DatePicker/index.native.js +66 -185
  42. package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
  43. package/dist/cjs/fields/DatePicker/parts.cjs +12 -9
  44. package/dist/cjs/fields/DatePicker/parts.native.js +12 -9
  45. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  46. package/dist/cjs/fields/Duration/index.cjs +29 -3
  47. package/dist/cjs/fields/Duration/index.native.js +29 -3
  48. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  49. package/dist/cjs/fields/PhoneInput/index.cjs +9 -4
  50. package/dist/cjs/fields/PhoneInput/index.native.js +13 -6
  51. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  52. package/dist/cjs/fields/Rating/index.cjs +1 -1
  53. package/dist/cjs/fields/Rating/index.native.js +4 -1
  54. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  55. package/dist/cjs/fields/SearchInput/index.cjs +6 -0
  56. package/dist/cjs/fields/SearchInput/index.native.js +6 -0
  57. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  58. package/dist/cjs/fields/Select/index.cjs +75 -2
  59. package/dist/cjs/fields/Select/index.native.js +77 -2
  60. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  61. package/dist/cjs/fields/Signature/index.cjs +9 -5
  62. package/dist/cjs/fields/Signature/index.native.js +9 -5
  63. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  64. package/dist/cjs/fields/Slider/index.cjs +3 -1
  65. package/dist/cjs/fields/Slider/index.native.js +3 -1
  66. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  67. package/dist/cjs/fields/Switch/index.cjs +5 -18
  68. package/dist/cjs/fields/Switch/index.native.js +5 -18
  69. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  70. package/dist/cjs/fields/TextArea/index.cjs +19 -5
  71. package/dist/cjs/fields/TextArea/index.native.js +23 -5
  72. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  73. package/dist/cjs/fields/TimePicker/catalog.cjs +203 -0
  74. package/dist/cjs/fields/TimePicker/catalog.native.js +227 -0
  75. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -0
  76. package/dist/cjs/fields/TimePicker/index.cjs +6 -177
  77. package/dist/cjs/fields/TimePicker/index.native.js +74 -85
  78. package/dist/cjs/fields/TimePicker/index.native.js.map +1 -1
  79. package/dist/cjs/fields/TimeRangeScrubber/geometry.cjs +6 -0
  80. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js +6 -0
  81. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  82. package/dist/cjs/fields/TimeRangeScrubber/index.cjs +34 -14
  83. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +38 -14
  84. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  85. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.cjs +202 -0
  86. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +211 -0
  87. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -0
  88. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.cjs +30 -0
  89. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js +33 -0
  90. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -0
  91. package/dist/cjs/fields/nativeSelect.cjs +30 -0
  92. package/dist/cjs/fields/nativeSelect.native.js +33 -0
  93. package/dist/cjs/fields/nativeSelect.native.js.map +1 -0
  94. package/dist/cjs/index.cjs +1 -0
  95. package/dist/cjs/index.native.js +1 -0
  96. package/dist/cjs/index.native.js.map +1 -1
  97. package/dist/cjs/themedPrimitives.cjs +5 -0
  98. package/dist/cjs/themedPrimitives.native.js +5 -0
  99. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  100. package/dist/esm/Button/index.mjs +8 -2
  101. package/dist/esm/Button/index.mjs.map +1 -1
  102. package/dist/esm/Button/index.native.js +8 -2
  103. package/dist/esm/Button/index.native.js.map +1 -1
  104. package/dist/esm/Chip/index.mjs +1 -3
  105. package/dist/esm/Chip/index.mjs.map +1 -1
  106. package/dist/esm/Chip/index.native.js +5 -3
  107. package/dist/esm/Chip/index.native.js.map +1 -1
  108. package/dist/esm/ContextualSaveBar/index.mjs +19 -3
  109. package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
  110. package/dist/esm/ContextualSaveBar/index.native.js +19 -3
  111. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  112. package/dist/esm/DescriptionList/index.mjs +38 -12
  113. package/dist/esm/DescriptionList/index.mjs.map +1 -1
  114. package/dist/esm/DescriptionList/index.native.js +38 -12
  115. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  116. package/dist/esm/ErrorSummary.mjs +5 -2
  117. package/dist/esm/ErrorSummary.mjs.map +1 -1
  118. package/dist/esm/ErrorSummary.native.js +5 -2
  119. package/dist/esm/ErrorSummary.native.js.map +1 -1
  120. package/dist/esm/FloatingPanel/useFloatingPanel.mjs +24 -3
  121. package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  122. package/dist/esm/FloatingPanel/useFloatingPanel.native.js +43 -3
  123. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  124. package/dist/esm/InputParts/index.mjs +43 -3
  125. package/dist/esm/InputParts/index.mjs.map +1 -1
  126. package/dist/esm/InputParts/index.native.js +43 -3
  127. package/dist/esm/InputParts/index.native.js.map +1 -1
  128. package/dist/esm/fields/Checkbox/Checkbox.mjs +5 -2
  129. package/dist/esm/fields/Checkbox/Checkbox.mjs.map +1 -1
  130. package/dist/esm/fields/Checkbox/Checkbox.native.js +6 -3
  131. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  132. package/dist/esm/fields/Checkbox/CheckboxGroup.mjs +69 -59
  133. package/dist/esm/fields/Checkbox/CheckboxGroup.mjs.map +1 -1
  134. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js +75 -65
  135. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  136. package/dist/esm/fields/Checkbox/checkboxGroupContext.mjs +7 -0
  137. package/dist/esm/fields/Checkbox/checkboxGroupContext.mjs.map +1 -0
  138. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js +7 -0
  139. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js.map +1 -0
  140. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs +377 -0
  141. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -0
  142. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js +413 -0
  143. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -0
  144. package/dist/esm/fields/DatePicker/DatetimePicker.mjs +1 -375
  145. package/dist/esm/fields/DatePicker/DatetimePicker.mjs.map +1 -1
  146. package/dist/esm/fields/DatePicker/DatetimePicker.native.js +65 -293
  147. package/dist/esm/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  148. package/dist/esm/fields/DatePicker/catalog.mjs +276 -0
  149. package/dist/esm/fields/DatePicker/catalog.mjs.map +1 -0
  150. package/dist/esm/fields/DatePicker/catalog.native.js +317 -0
  151. package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -0
  152. package/dist/esm/fields/DatePicker/index.mjs +1 -274
  153. package/dist/esm/fields/DatePicker/index.mjs.map +1 -1
  154. package/dist/esm/fields/DatePicker/index.native.js +60 -179
  155. package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
  156. package/dist/esm/fields/DatePicker/parts.mjs +13 -10
  157. package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
  158. package/dist/esm/fields/DatePicker/parts.native.js +13 -10
  159. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  160. package/dist/esm/fields/Duration/index.mjs +29 -4
  161. package/dist/esm/fields/Duration/index.mjs.map +1 -1
  162. package/dist/esm/fields/Duration/index.native.js +29 -4
  163. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  164. package/dist/esm/fields/PhoneInput/index.mjs +9 -4
  165. package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
  166. package/dist/esm/fields/PhoneInput/index.native.js +13 -6
  167. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  168. package/dist/esm/fields/Rating/index.mjs +2 -2
  169. package/dist/esm/fields/Rating/index.mjs.map +1 -1
  170. package/dist/esm/fields/Rating/index.native.js +5 -2
  171. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  172. package/dist/esm/fields/SearchInput/index.mjs +6 -0
  173. package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
  174. package/dist/esm/fields/SearchInput/index.native.js +6 -0
  175. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  176. package/dist/esm/fields/Select/index.mjs +76 -3
  177. package/dist/esm/fields/Select/index.mjs.map +1 -1
  178. package/dist/esm/fields/Select/index.native.js +78 -3
  179. package/dist/esm/fields/Select/index.native.js.map +1 -1
  180. package/dist/esm/fields/Signature/index.mjs +10 -6
  181. package/dist/esm/fields/Signature/index.mjs.map +1 -1
  182. package/dist/esm/fields/Signature/index.native.js +10 -6
  183. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  184. package/dist/esm/fields/Slider/index.mjs +4 -2
  185. package/dist/esm/fields/Slider/index.mjs.map +1 -1
  186. package/dist/esm/fields/Slider/index.native.js +4 -2
  187. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  188. package/dist/esm/fields/Switch/index.mjs +6 -19
  189. package/dist/esm/fields/Switch/index.mjs.map +1 -1
  190. package/dist/esm/fields/Switch/index.native.js +6 -19
  191. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  192. package/dist/esm/fields/TextArea/index.mjs +19 -5
  193. package/dist/esm/fields/TextArea/index.mjs.map +1 -1
  194. package/dist/esm/fields/TextArea/index.native.js +23 -5
  195. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  196. package/dist/esm/fields/TimePicker/catalog.mjs +174 -0
  197. package/dist/esm/fields/TimePicker/catalog.mjs.map +1 -0
  198. package/dist/esm/fields/TimePicker/catalog.native.js +195 -0
  199. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -0
  200. package/dist/esm/fields/TimePicker/index.mjs +2 -173
  201. package/dist/esm/fields/TimePicker/index.mjs.map +1 -1
  202. package/dist/esm/fields/TimePicker/index.native.js +76 -87
  203. package/dist/esm/fields/TimePicker/index.native.js.map +1 -1
  204. package/dist/esm/fields/TimeRangeScrubber/geometry.mjs +6 -1
  205. package/dist/esm/fields/TimeRangeScrubber/geometry.mjs.map +1 -1
  206. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js +6 -1
  207. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  208. package/dist/esm/fields/TimeRangeScrubber/index.mjs +37 -18
  209. package/dist/esm/fields/TimeRangeScrubber/index.mjs.map +1 -1
  210. package/dist/esm/fields/TimeRangeScrubber/index.native.js +41 -18
  211. package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
  212. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs +166 -0
  213. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -0
  214. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js +172 -0
  215. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -0
  216. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.mjs +5 -0
  217. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.mjs.map +1 -0
  218. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js +5 -0
  219. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -0
  220. package/dist/esm/fields/nativeSelect.mjs +5 -0
  221. package/dist/esm/fields/nativeSelect.mjs.map +1 -0
  222. package/dist/esm/fields/nativeSelect.native.js +5 -0
  223. package/dist/esm/fields/nativeSelect.native.js.map +1 -0
  224. package/dist/esm/index.mjs +2 -2
  225. package/dist/esm/index.mjs.map +1 -1
  226. package/dist/esm/index.native.js +2 -2
  227. package/dist/esm/index.native.js.map +1 -1
  228. package/dist/esm/themedPrimitives.mjs +5 -0
  229. package/dist/esm/themedPrimitives.mjs.map +1 -1
  230. package/dist/esm/themedPrimitives.native.js +5 -0
  231. package/dist/esm/themedPrimitives.native.js.map +1 -1
  232. package/dist/jsx/Button/index.mjs +8 -2
  233. package/dist/jsx/Button/index.mjs.map +1 -1
  234. package/dist/jsx/Button/index.native.js +7 -1
  235. package/dist/jsx/Button/index.native.js.map +1 -1
  236. package/dist/jsx/Chip/index.mjs +1 -3
  237. package/dist/jsx/Chip/index.mjs.map +1 -1
  238. package/dist/jsx/Chip/index.native.js +5 -3
  239. package/dist/jsx/Chip/index.native.js.map +1 -1
  240. package/dist/jsx/ContextualSaveBar/index.mjs +19 -3
  241. package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
  242. package/dist/jsx/ContextualSaveBar/index.native.js +19 -3
  243. package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
  244. package/dist/jsx/DescriptionList/index.mjs +38 -12
  245. package/dist/jsx/DescriptionList/index.mjs.map +1 -1
  246. package/dist/jsx/DescriptionList/index.native.js +38 -12
  247. package/dist/jsx/DescriptionList/index.native.js.map +1 -1
  248. package/dist/jsx/ErrorSummary.mjs +5 -2
  249. package/dist/jsx/ErrorSummary.mjs.map +1 -1
  250. package/dist/jsx/ErrorSummary.native.js +4 -1
  251. package/dist/jsx/ErrorSummary.native.js.map +1 -1
  252. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +24 -3
  253. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  254. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +43 -2
  255. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  256. package/dist/jsx/InputParts/index.mjs +43 -3
  257. package/dist/jsx/InputParts/index.mjs.map +1 -1
  258. package/dist/jsx/InputParts/index.native.js +42 -2
  259. package/dist/jsx/InputParts/index.native.js.map +1 -1
  260. package/dist/jsx/fields/Checkbox/Checkbox.mjs +5 -2
  261. package/dist/jsx/fields/Checkbox/Checkbox.mjs.map +1 -1
  262. package/dist/jsx/fields/Checkbox/Checkbox.native.js +6 -3
  263. package/dist/jsx/fields/Checkbox/Checkbox.native.js.map +1 -1
  264. package/dist/jsx/fields/Checkbox/CheckboxGroup.mjs +69 -59
  265. package/dist/jsx/fields/Checkbox/CheckboxGroup.mjs.map +1 -1
  266. package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js +75 -65
  267. package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  268. package/dist/jsx/fields/Checkbox/checkboxGroupContext.mjs +7 -0
  269. package/dist/jsx/fields/Checkbox/checkboxGroupContext.mjs.map +1 -0
  270. package/dist/jsx/fields/Checkbox/checkboxGroupContext.native.js +36 -0
  271. package/dist/jsx/fields/Checkbox/checkboxGroupContext.native.js.map +1 -0
  272. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs +377 -0
  273. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -0
  274. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js +441 -0
  275. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -0
  276. package/dist/jsx/fields/DatePicker/DatetimePicker.mjs +1 -375
  277. package/dist/jsx/fields/DatePicker/DatetimePicker.mjs.map +1 -1
  278. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js +69 -297
  279. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  280. package/dist/jsx/fields/DatePicker/catalog.mjs +276 -0
  281. package/dist/jsx/fields/DatePicker/catalog.mjs.map +1 -0
  282. package/dist/jsx/fields/DatePicker/catalog.native.js +350 -0
  283. package/dist/jsx/fields/DatePicker/catalog.native.js.map +1 -0
  284. package/dist/jsx/fields/DatePicker/index.mjs +1 -274
  285. package/dist/jsx/fields/DatePicker/index.mjs.map +1 -1
  286. package/dist/jsx/fields/DatePicker/index.native.js +66 -185
  287. package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
  288. package/dist/jsx/fields/DatePicker/parts.mjs +13 -10
  289. package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
  290. package/dist/jsx/fields/DatePicker/parts.native.js +12 -9
  291. package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
  292. package/dist/jsx/fields/Duration/index.mjs +29 -4
  293. package/dist/jsx/fields/Duration/index.mjs.map +1 -1
  294. package/dist/jsx/fields/Duration/index.native.js +29 -3
  295. package/dist/jsx/fields/Duration/index.native.js.map +1 -1
  296. package/dist/jsx/fields/PhoneInput/index.mjs +9 -4
  297. package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
  298. package/dist/jsx/fields/PhoneInput/index.native.js +13 -6
  299. package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
  300. package/dist/jsx/fields/Rating/index.mjs +2 -2
  301. package/dist/jsx/fields/Rating/index.mjs.map +1 -1
  302. package/dist/jsx/fields/Rating/index.native.js +4 -1
  303. package/dist/jsx/fields/Rating/index.native.js.map +1 -1
  304. package/dist/jsx/fields/SearchInput/index.mjs +6 -0
  305. package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
  306. package/dist/jsx/fields/SearchInput/index.native.js +6 -0
  307. package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
  308. package/dist/jsx/fields/Select/index.mjs +76 -3
  309. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  310. package/dist/jsx/fields/Select/index.native.js +77 -2
  311. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  312. package/dist/jsx/fields/Signature/index.mjs +10 -6
  313. package/dist/jsx/fields/Signature/index.mjs.map +1 -1
  314. package/dist/jsx/fields/Signature/index.native.js +9 -5
  315. package/dist/jsx/fields/Signature/index.native.js.map +1 -1
  316. package/dist/jsx/fields/Slider/index.mjs +4 -2
  317. package/dist/jsx/fields/Slider/index.mjs.map +1 -1
  318. package/dist/jsx/fields/Slider/index.native.js +3 -1
  319. package/dist/jsx/fields/Slider/index.native.js.map +1 -1
  320. package/dist/jsx/fields/Switch/index.mjs +6 -19
  321. package/dist/jsx/fields/Switch/index.mjs.map +1 -1
  322. package/dist/jsx/fields/Switch/index.native.js +5 -18
  323. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  324. package/dist/jsx/fields/TextArea/index.mjs +19 -5
  325. package/dist/jsx/fields/TextArea/index.mjs.map +1 -1
  326. package/dist/jsx/fields/TextArea/index.native.js +23 -5
  327. package/dist/jsx/fields/TextArea/index.native.js.map +1 -1
  328. package/dist/jsx/fields/TimePicker/catalog.mjs +174 -0
  329. package/dist/jsx/fields/TimePicker/catalog.mjs.map +1 -0
  330. package/dist/jsx/fields/TimePicker/catalog.native.js +227 -0
  331. package/dist/jsx/fields/TimePicker/catalog.native.js.map +1 -0
  332. package/dist/jsx/fields/TimePicker/index.mjs +2 -173
  333. package/dist/jsx/fields/TimePicker/index.mjs.map +1 -1
  334. package/dist/jsx/fields/TimePicker/index.native.js +74 -85
  335. package/dist/jsx/fields/TimePicker/index.native.js.map +1 -1
  336. package/dist/jsx/fields/TimeRangeScrubber/geometry.mjs +6 -1
  337. package/dist/jsx/fields/TimeRangeScrubber/geometry.mjs.map +1 -1
  338. package/dist/jsx/fields/TimeRangeScrubber/geometry.native.js +6 -0
  339. package/dist/jsx/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  340. package/dist/jsx/fields/TimeRangeScrubber/index.mjs +37 -18
  341. package/dist/jsx/fields/TimeRangeScrubber/index.mjs.map +1 -1
  342. package/dist/jsx/fields/TimeRangeScrubber/index.native.js +38 -14
  343. package/dist/jsx/fields/TimeRangeScrubber/index.native.js.map +1 -1
  344. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs +166 -0
  345. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -0
  346. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js +211 -0
  347. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -0
  348. package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.mjs +5 -0
  349. package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.mjs.map +1 -0
  350. package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.native.js +33 -0
  351. package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -0
  352. package/dist/jsx/fields/nativeSelect.mjs +5 -0
  353. package/dist/jsx/fields/nativeSelect.mjs.map +1 -0
  354. package/dist/jsx/fields/nativeSelect.native.js +33 -0
  355. package/dist/jsx/fields/nativeSelect.native.js.map +1 -0
  356. package/dist/jsx/index.js +2 -2
  357. package/dist/jsx/index.js.map +1 -1
  358. package/dist/jsx/index.mjs +2 -2
  359. package/dist/jsx/index.mjs.map +1 -1
  360. package/dist/jsx/index.native.js +1 -0
  361. package/dist/jsx/index.native.js.map +1 -1
  362. package/dist/jsx/themedPrimitives.mjs +5 -0
  363. package/dist/jsx/themedPrimitives.mjs.map +1 -1
  364. package/dist/jsx/themedPrimitives.native.js +5 -0
  365. package/dist/jsx/themedPrimitives.native.js.map +1 -1
  366. package/package.json +12 -9
  367. package/src/Button/Button.labelInk.spec.tsx +1 -1
  368. package/src/Button/Button.sizeLadder.spec.tsx +124 -0
  369. package/src/Button/Button.spec.tsx +7 -17
  370. package/src/Button/Button.stories.tsx +14 -0
  371. package/src/Button/index.tsx +18 -3
  372. package/src/Chip/Chip.spec.tsx +15 -0
  373. package/src/Chip/Chip.stories.tsx +251 -0
  374. package/src/Chip/index.tsx +5 -1
  375. package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +51 -0
  376. package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +42 -23
  377. package/src/ContextualSaveBar/UnsavedChangesDialog.spec.tsx +167 -0
  378. package/src/ContextualSaveBar/index.tsx +14 -5
  379. package/src/DescriptionList/DescriptionList.spec.tsx +19 -1
  380. package/src/DescriptionList/DescriptionList.stories.tsx +5 -1
  381. package/src/DescriptionList/index.tsx +57 -19
  382. package/src/ErrorSummary.tsx +5 -2
  383. package/src/FloatingPanel/panelWidthContract.spec.ts +2 -2
  384. package/src/FloatingPanel/useFloatingPanel.spec.tsx +199 -1
  385. package/src/FloatingPanel/useFloatingPanel.ts +45 -3
  386. package/src/InputParts/index.tsx +56 -2
  387. package/src/Spinner/SpinnerGlyph.spec.tsx +132 -0
  388. package/src/Wheel/WheelEdgeFade.spec.tsx +141 -0
  389. package/src/fields/Checkbox/Checkbox.spec.tsx +24 -0
  390. package/src/fields/Checkbox/Checkbox.tsx +8 -3
  391. package/src/fields/Checkbox/CheckboxBox.spec.tsx +395 -0
  392. package/src/fields/Checkbox/CheckboxCard.spec.tsx +197 -0
  393. package/src/fields/Checkbox/CheckboxFieldFrame.spec.tsx +116 -0
  394. package/src/fields/Checkbox/CheckboxGroup.stories.tsx +15 -0
  395. package/src/fields/Checkbox/CheckboxGroup.tsx +77 -70
  396. package/src/fields/Checkbox/checkboxGroupContext.ts +12 -0
  397. package/src/fields/DatePicker/Calendar.spec.tsx +6 -5
  398. package/src/fields/DatePicker/DatePicker.stories.tsx +13 -0
  399. package/src/fields/DatePicker/DatetimePicker.catalog.tsx +586 -0
  400. package/src/fields/DatePicker/DatetimePicker.native.tsx +243 -0
  401. package/src/fields/DatePicker/DatetimePicker.tsx +2 -584
  402. package/src/fields/DatePicker/catalog.tsx +450 -0
  403. package/src/fields/DatePicker/index.native.tsx +261 -0
  404. package/src/fields/DatePicker/index.tsx +20 -448
  405. package/src/fields/DatePicker/parts.tsx +11 -6
  406. package/src/fields/Duration/Duration.spec.tsx +50 -0
  407. package/src/fields/Duration/Duration.stories.tsx +21 -0
  408. package/src/fields/Duration/index.tsx +43 -5
  409. package/src/fields/PhoneInput/PhoneInput.spec.tsx +16 -63
  410. package/src/fields/PhoneInput/PhoneInput.tvalue-source.spec.ts +23 -0
  411. package/src/fields/PhoneInput/index.tsx +10 -3
  412. package/src/fields/Rating/index.tsx +9 -1
  413. package/src/fields/SearchInput/SearchInput.spec.tsx +20 -0
  414. package/src/fields/SearchInput/index.tsx +6 -0
  415. package/src/fields/Select/Select.stories.tsx +23 -1
  416. package/src/fields/Select/index.tsx +77 -1
  417. package/src/fields/Signature/Signature.spec.tsx +22 -3
  418. package/src/fields/Signature/index.tsx +16 -7
  419. package/src/fields/Slider/index.tsx +4 -1
  420. package/src/fields/Switch/index.tsx +14 -12
  421. package/src/fields/TextArea/TextArea.spec.tsx +68 -0
  422. package/src/fields/TextArea/index.tsx +23 -5
  423. package/src/fields/TimePicker/TimePicker.stories.tsx +13 -0
  424. package/src/fields/TimePicker/catalog.tsx +265 -0
  425. package/src/fields/TimePicker/index.native.tsx +229 -0
  426. package/src/fields/TimePicker/index.tsx +6 -261
  427. package/src/fields/TimeRangeScrubber/TimeRangeScrubber.spec.tsx +36 -0
  428. package/src/fields/TimeRangeScrubber/geometry.ts +13 -0
  429. package/src/fields/TimeRangeScrubber/index.tsx +49 -8
  430. package/src/fields/nativeDateTime/OsDateTimeSheet.spec.ts +12 -0
  431. package/src/fields/nativeDateTime/OsDateTimeSheet.tsx +197 -0
  432. package/src/fields/nativeDateTime/osDateTimeIosDisplay.ts +4 -0
  433. package/src/fields/nativeSelect.spec.ts +28 -0
  434. package/src/fields/nativeSelect.ts +13 -0
  435. package/src/index.ts +2 -2
  436. package/src/themedPrimitives.tsx +10 -6
  437. package/types/Button/index.d.ts +3 -2
  438. package/types/Button/index.d.ts.map +1 -1
  439. package/types/Chip/index.d.ts.map +1 -1
  440. package/types/ContextualSaveBar/index.d.ts.map +1 -1
  441. package/types/DescriptionList/index.d.ts.map +1 -1
  442. package/types/ErrorSummary.d.ts.map +1 -1
  443. package/types/FloatingPanel/useFloatingPanel.d.ts +13 -0
  444. package/types/FloatingPanel/useFloatingPanel.d.ts.map +1 -1
  445. package/types/InputParts/index.d.ts.map +1 -1
  446. package/types/fields/Checkbox/Checkbox.d.ts.map +1 -1
  447. package/types/fields/Checkbox/CheckboxGroup.d.ts.map +1 -1
  448. package/types/fields/Checkbox/checkboxGroupContext.d.ts +8 -0
  449. package/types/fields/Checkbox/checkboxGroupContext.d.ts.map +1 -0
  450. package/types/fields/DatePicker/DatetimePicker.catalog.d.ts +35 -0
  451. package/types/fields/DatePicker/DatetimePicker.catalog.d.ts.map +1 -0
  452. package/types/fields/DatePicker/DatetimePicker.d.ts +2 -32
  453. package/types/fields/DatePicker/DatetimePicker.d.ts.map +1 -1
  454. package/types/fields/DatePicker/DatetimePicker.native.d.ts +26 -0
  455. package/types/fields/DatePicker/DatetimePicker.native.d.ts.map +1 -0
  456. package/types/fields/DatePicker/catalog.d.ts +42 -0
  457. package/types/fields/DatePicker/catalog.d.ts.map +1 -0
  458. package/types/fields/DatePicker/index.d.ts +2 -39
  459. package/types/fields/DatePicker/index.d.ts.map +1 -1
  460. package/types/fields/DatePicker/index.native.d.ts +40 -0
  461. package/types/fields/DatePicker/index.native.d.ts.map +1 -0
  462. package/types/fields/DatePicker/parts.d.ts.map +1 -1
  463. package/types/fields/Duration/index.d.ts +2 -0
  464. package/types/fields/Duration/index.d.ts.map +1 -1
  465. package/types/fields/PhoneInput/index.d.ts.map +1 -1
  466. package/types/fields/Rating/index.d.ts.map +1 -1
  467. package/types/fields/SearchInput/index.d.ts.map +1 -1
  468. package/types/fields/Select/index.d.ts +6 -1
  469. package/types/fields/Select/index.d.ts.map +1 -1
  470. package/types/fields/Signature/index.d.ts.map +1 -1
  471. package/types/fields/Slider/index.d.ts.map +1 -1
  472. package/types/fields/Switch/index.d.ts.map +1 -1
  473. package/types/fields/TextArea/index.d.ts.map +1 -1
  474. package/types/fields/TimePicker/catalog.d.ts +41 -0
  475. package/types/fields/TimePicker/catalog.d.ts.map +1 -0
  476. package/types/fields/TimePicker/index.d.ts +2 -38
  477. package/types/fields/TimePicker/index.d.ts.map +1 -1
  478. package/types/fields/TimePicker/index.native.d.ts +31 -0
  479. package/types/fields/TimePicker/index.native.d.ts.map +1 -0
  480. package/types/fields/TimeRangeScrubber/geometry.d.ts +8 -0
  481. package/types/fields/TimeRangeScrubber/geometry.d.ts.map +1 -1
  482. package/types/fields/TimeRangeScrubber/index.d.ts +1 -1
  483. package/types/fields/TimeRangeScrubber/index.d.ts.map +1 -1
  484. package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts +12 -0
  485. package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts.map +1 -0
  486. package/types/fields/nativeDateTime/osDateTimeIosDisplay.d.ts +3 -0
  487. package/types/fields/nativeDateTime/osDateTimeIosDisplay.d.ts.map +1 -0
  488. package/types/fields/nativeSelect.d.ts +12 -0
  489. package/types/fields/nativeSelect.d.ts.map +1 -0
  490. package/types/index.d.ts +2 -2
  491. package/types/index.d.ts.map +1 -1
  492. package/types/themedPrimitives.d.ts.map +1 -1
@@ -1,4 +1,3 @@
1
- import { sizeRecipeForToken } from "@multiplatform.one/theme";
2
1
  import { useForm } from "@tanstack/react-form";
3
2
  import { act, fireEvent, waitFor } from "@testing-library/react";
4
3
  import { YStack } from "tamagui";
@@ -402,10 +401,10 @@ describe("PhoneInput", () => {
402
401
  });
403
402
  });
404
403
 
405
- describe("design-law (LC-71 / LC-75 / LC-76 / LC-20 / LC-40)", () => {
404
+ describe("design-law (LC-71 / T-VALUE)", () => {
406
405
  it("rings the Box that includes the flag (LC-71)", () => {
407
406
  const result = renderWithProviders(<PhoneInput label="Ring Phone" />);
408
- const box = result.container.querySelector("[data-ring-target='box']") as HTMLElement;
407
+ const box = result.container.querySelector("[data-testid='phone-box']") as HTMLElement;
409
408
  const flag = result.container.querySelector('[data-testid="combobox-trigger"]');
410
409
  const input = result.container.querySelector("input");
411
410
  expect(box).toBeTruthy();
@@ -414,72 +413,27 @@ describe("PhoneInput", () => {
414
413
  expect(box.contains(input)).toBe(true);
415
414
  });
416
415
 
417
- it("compact steps density without requiring a size token (LC-76)", () => {
418
- const result = renderWithProviders(<PhoneInput label="Phone" compact />);
419
- const box = result.container.querySelector("[data-ring-target='box']") as HTMLElement;
420
- expect(box.getAttribute("data-density")).toBe("compact");
421
- expect(box.getAttribute("data-size")).toBe("$4");
422
- });
423
-
424
- it("size ejects painted height and leaves density comfortable (LC-76)", () => {
425
- const result = renderWithProviders(<PhoneInput label="Phone" size="$5" />);
426
- const box = result.container.querySelector("[data-ring-target='box']") as HTMLElement;
427
- expect(box.getAttribute("data-density")).toBe("comfortable");
428
- expect(box.getAttribute("data-size")).toBe("$5");
429
- });
430
-
431
- it("compact + size stay orthogonal (LC-76)", () => {
432
- const result = renderWithProviders(<PhoneInput label="Phone" compact size="$5" />);
433
- const box = result.container.querySelector("[data-ring-target='box']") as HTMLElement;
434
- expect(box.getAttribute("data-density")).toBe("compact");
435
- expect(box.getAttribute("data-size")).toBe("$5");
436
- });
437
-
438
- it("default painted box meets the 44px floor", () => {
416
+ it("national digits and the dial are T-VALUE, not textAccent", () => {
439
417
  const result = renderWithProviders(<PhoneInput label="Phone" />);
440
- const box = result.container.querySelector("[data-ring-target='box']") as HTMLElement;
441
- expect(Number(box.getAttribute("data-visual-height"))).toBe(44);
442
- expect(box.getAttribute("data-press-floor")).toBe("box");
418
+ const input = result.container.querySelector("[data-testid='phone-input']");
419
+ const dial = result.container.querySelector("[data-testid='phone-dial']");
420
+ expect(input?.getAttribute("data-text-class")).toBe("T-VALUE");
421
+ expect(dial?.getAttribute("data-text-class")).toBe("T-VALUE");
422
+ expect(dial?.textContent).toMatch(/^\+\d+/);
443
423
  });
444
424
 
445
- it("sub-44 sizes restore press via slop, not giant chrome", () => {
446
- const result = renderWithProviders(<PhoneInput label="Phone" size="$2" />);
447
- const box = result.container.querySelector("[data-ring-target='box']") as HTMLElement;
448
- const visual = Number(box.getAttribute("data-visual-height"));
449
- expect(visual).toBeLessThan(44);
450
- expect(box.getAttribute("data-press-floor")).toBe("slop");
425
+ it("compact and size still mount without throwing (LC-76)", () => {
426
+ expect(() => renderWithProviders(<PhoneInput label="Phone" compact />)).not.toThrow();
427
+ expect(() => renderWithProviders(<PhoneInput label="Phone" size="$5" />)).not.toThrow();
428
+ expect(() =>
429
+ renderWithProviders(<PhoneInput label="Phone" compact size="$5" />),
430
+ ).not.toThrow();
451
431
  });
452
432
 
453
- it("flag and country pad/gap ride the size recipe (LC-75 / LC-79)", () => {
454
- const small = renderWithProviders(<PhoneInput label="S" size="$2" />);
455
- const large = renderWithProviders(<PhoneInput label="L" size="$6" />);
456
- const smallCountry = small.container.querySelector("[data-testid='phone-country']");
457
- const largeCountry = large.container.querySelector("[data-testid='phone-country']");
458
- const smallRecipe = sizeRecipeForToken("$2");
459
- const largeRecipe = sizeRecipeForToken("$6");
460
- expect(Number(smallCountry?.getAttribute("data-flag-size"))).toBe(smallRecipe.iconSize);
461
- expect(Number(largeCountry?.getAttribute("data-flag-size"))).toBe(largeRecipe.iconSize);
462
- expect(Number(smallCountry?.getAttribute("data-flag-size"))).toBeLessThan(
463
- Number(largeCountry?.getAttribute("data-flag-size")),
464
- );
465
- expect(Number(smallCountry?.getAttribute("data-country-pad"))).toBe(
466
- smallRecipe.paddingHorizontal,
467
- );
468
- expect(Number(largeCountry?.getAttribute("data-country-pad"))).toBe(
469
- largeRecipe.paddingHorizontal,
470
- );
471
- expect(Number(smallCountry?.getAttribute("data-country-gap"))).toBe(smallRecipe.gap);
472
- expect(Number(largeCountry?.getAttribute("data-country-gap"))).toBe(largeRecipe.gap);
473
- });
474
-
475
- it("skeleton mirrors flag+number anatomy at recipe height (LC-20)", () => {
433
+ it("skeleton keeps flag+number bones and hides the field (LC-20)", () => {
476
434
  const result = renderWithProviders(<PhoneInput label="Phone" skeleton size="$4" />);
477
- const box = result.container.querySelector("[data-testid='phone-skeleton']") as HTMLElement;
478
- expect(box).toBeTruthy();
479
- expect(Number(box.getAttribute("data-visual-height"))).toBe(sizeRecipeForToken("$4").height);
480
- expect(result.container.querySelector("[data-testid='phone-skeleton-flag']")).toBeTruthy();
481
- expect(result.container.querySelector("[data-testid='phone-skeleton-number']")).toBeTruthy();
482
435
  expect(result.container.querySelector("input")).toBeNull();
436
+ expect(result.container.querySelector("[data-testid='phone-input']")).toBeNull();
483
437
  });
484
438
 
485
439
  it("does not open the country picker when disabled (SB-M-213)", async () => {
@@ -500,7 +454,6 @@ describe("PhoneInput", () => {
500
454
  "[data-testid='phone-country']",
501
455
  ) as HTMLElement;
502
456
  expect(country).toBeTruthy();
503
- expect(result.container.querySelector('[data-testid="combobox-trigger"]')).toBeNull();
504
457
  await act(async () => {
505
458
  fireEvent.click(country);
506
459
  });
@@ -0,0 +1,23 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { describe, expect, it } from "vitest";
5
+
6
+ const src = readFileSync(join(dirname(fileURLToPath(import.meta.url)), "index.tsx"), "utf8");
7
+
8
+ describe("PhoneInput T-VALUE source contract", () => {
9
+ it("puts dial and Area on $color so textAccent cannot dim them", () => {
10
+ expect(src).toContain('data-testid="phone-dial"');
11
+ expect(src).toContain('data-testid="phone-input"');
12
+ expect(src).toContain('data-text-class="T-VALUE"');
13
+ expect((src.match(/color="\$color"/g) ?? []).length).toBeGreaterThanOrEqual(2);
14
+ expect(src).not.toContain("formCommonColors.muted");
15
+ });
16
+
17
+ it("letters the closed trigger 23px paint and 0/9/9/0 segment without retuning knobs", () => {
18
+ expect(src).toContain("23px");
19
+ expect(src).toContain("0/9/9/0");
20
+ expect(src).not.toMatch(/height=\{23\}/);
21
+ expect(src).not.toMatch(/borderTopRightRadius=\{9\}/);
22
+ });
23
+ });
@@ -322,6 +322,7 @@ export function PhoneInput<
322
322
  : undefined)}
323
323
  >
324
324
  <InputParts.Section>
325
+ {/* Letter (fuzz RULE): closed country trigger paints 23px; segment radius is 0/9/9/0. Box keeps the 44 press floor. Do not retune those onto size/radius knobs. */}
325
326
  <View
326
327
  data-focus-skip
327
328
  flexDirection="row"
@@ -338,13 +339,14 @@ export function PhoneInput<
338
339
  emptyMessage={t("No countries found.")}
339
340
  popoverWidth={320}
340
341
  tabIndex={disabled || readOnly ? -1 : 0}
341
- disabled={disabled}
342
+ disabled={disabled || readOnly}
342
343
  aria-label={t("Country code")}
343
344
  trigger={(selected) => {
344
345
  const opt = Array.isArray(selected) ? selected[0] : selected;
345
346
  const code = opt?.value ?? regionCode;
346
347
  return (
347
348
  <XStack
349
+ data-testid="phone-country"
348
350
  alignItems="center"
349
351
  gap="$1.5"
350
352
  // size-recipe-escape: zero-reset — the country trigger rides inside Input.Box, which owns the inset (LC-71)
@@ -365,9 +367,12 @@ export function PhoneInput<
365
367
  </InputParts.Icon>
366
368
  )}
367
369
  <Text
370
+ data-testid="phone-dial"
371
+ data-text-class="T-VALUE"
368
372
  fontFamily={knobProps.body.fontFamily}
369
373
  fontWeight={knobProps.body.fontWeight}
370
- color={formCommonColors.muted}
374
+ // T-VALUE: dial is the country-code value, never textAccent / muted
375
+ color="$color"
371
376
  userSelect="none"
372
377
  >
373
378
  +{dialOf(code)}
@@ -389,7 +394,6 @@ export function PhoneInput<
389
394
  <InputParts.Area
390
395
  ref={areaRef}
391
396
  id={id}
392
- data-testid="phone-input"
393
397
  keyboardType="phone-pad"
394
398
  autoComplete="tel"
395
399
  inputMode="tel"
@@ -402,6 +406,9 @@ export function PhoneInput<
402
406
  aria-invalid={hasError || undefined}
403
407
  aria-readonly={readOnly || undefined}
404
408
  {...(inputProps as ComponentProps<typeof InputParts.Area>)}
409
+ data-testid="phone-input"
410
+ data-text-class="T-VALUE"
411
+ color="$color"
405
412
  />
406
413
  </InputParts.Section>
407
414
  </InputParts.Box>
@@ -1,6 +1,7 @@
1
1
  import type { KnobProps } from "@multiplatform.one/theme";
2
2
  import {
3
3
  ensureKeyboardModalityTracking,
4
+ FOCUS_RING_HALO_OFFSET,
4
5
  keyboardFocusRingProps,
5
6
  MIN_PRESS_TARGET,
6
7
  pressTargetHitSlop,
@@ -398,8 +399,15 @@ function StarRow({
398
399
  >
399
400
  <View
400
401
  borderRadius={itemRadius}
402
+ // LC-71 §4 halo: circular thumb (star glyph). The inset the
403
+ // composite ring carries would paint over the star's own points;
404
+ // the halo clears it.
401
405
  {...(showRing
402
- ? { ...keyboardFocusRingProps, outlineOffset: 2, "data-rating-ring": "true" }
406
+ ? {
407
+ ...keyboardFocusRingProps,
408
+ outlineOffset: FOCUS_RING_HALO_OFFSET,
409
+ "data-rating-ring": "true",
410
+ }
403
411
  : {})}
404
412
  >
405
413
  {glyph(isFilled)}
@@ -1,3 +1,6 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
1
4
  import { fireEvent } from "@testing-library/react";
2
5
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
6
  import { SIZE_RECIPE_TOKENS, sizeRecipeForToken } from "@multiplatform.one/theme";
@@ -5,6 +8,11 @@ import { renderWithProviders } from "@multiplatform.one/test-utils";
5
8
  import { Form } from "../../Form";
6
9
  import { SearchInput } from "./index";
7
10
 
11
+ const SEARCH_INPUT_SRC = readFileSync(
12
+ join(dirname(fileURLToPath(import.meta.url)), "index.tsx"),
13
+ "utf8",
14
+ );
15
+
8
16
  describe("SearchInput", () => {
9
17
  beforeEach(() => {
10
18
  vi.useFakeTimers();
@@ -182,6 +190,18 @@ describe("SearchInput", () => {
182
190
  expect((input as HTMLInputElement).value).toBe("hello");
183
191
  });
184
192
 
193
+ it("entered value uses the full input ramp (T-VALUE ignore), not textAccent", () => {
194
+ // InputFrame drops unknown data-* on the raw <input>; the contract is the
195
+ // Area color override. T-VALUE = full ramp; textAccent must not dim it.
196
+ expect(SEARCH_INPUT_SRC).toContain('color: "$color"');
197
+ expect(SEARCH_INPUT_SRC).toContain('"data-mp-t-value": "full"');
198
+ expect(SEARCH_INPUT_SRC).toMatch(/textAccentColor/);
199
+ const result = renderWithProviders(<SearchInput defaultValue="pikachu" />);
200
+ const input = result.container.querySelector("input");
201
+ if (!input) throw new Error("input not found");
202
+ expect((input as HTMLInputElement).value).toBe("pikachu");
203
+ });
204
+
185
205
  it("clearable=false hides the clear button", () => {
186
206
  const result = renderWithProviders(<SearchInput defaultValue="abc" clearable={false} />);
187
207
  expect(result.container.querySelector("[aria-label='Clear search']")).toBeNull();
@@ -295,6 +295,12 @@ export function SearchInput({
295
295
  disabled,
296
296
  readOnly,
297
297
  placeholder,
298
+ // T-VALUE (knob-laws § textAccent › entered text): full ramp, never
299
+ // dimmed. InputParts.Area still defaults to textAccentColor — override
300
+ // here so SearchInput does not wait on that shared default. Consumer
301
+ // inputProps still eject last.
302
+ color: "$color",
303
+ "data-mp-t-value": "full",
298
304
  paddingInlineStart: 0,
299
305
  paddingInlineEnd: showClear ? 0 : undefined,
300
306
  className: isWeb ? "mp-input-area mp-search-input" : undefined,
@@ -11,6 +11,12 @@ import { useViewportGtSm } from "../../FloatingPanel";
11
11
  import { Form } from "../../Form";
12
12
  import { Select, type SelectOption } from "./index";
13
13
 
14
+ // tamagui v2 types Select.Content as children + scope + FocusScopeProps only,
15
+ // but it still forwards unknown props onto the popper frame — which is where
16
+ // this story needs the z-index to land so the menu clears the Sheet overlay.
17
+ // `as never` used to stand here and made the spread itself a TS2698 (MPO-109).
18
+ const raiseAbovePortal: Record<string, unknown> = { zIndex: 200000 };
19
+
14
20
  const meta: Meta<typeof Select> = {
15
21
  title: "Forms/Select",
16
22
  component: Select,
@@ -39,6 +45,11 @@ const meta: Meta<typeof Select> = {
39
45
  description:
40
46
  "Multi-select list order. selected-first pins chosen rows to the top; stable keeps options order.",
41
47
  },
48
+ native: {
49
+ control: "boolean",
50
+ description:
51
+ "iOS only. Opt into the OS ActionSheet. Ignored on web, Android, and when multiple is set.",
52
+ },
42
53
  },
43
54
  };
44
55
 
@@ -406,7 +417,7 @@ export const Comparison: StoryObj<typeof Select> = {
406
417
  />
407
418
  </Sheet>
408
419
  ) : (
409
- <TamaguiSelect.Content {...({ zIndex: 200000 } as never)}>
420
+ <TamaguiSelect.Content {...raiseAbovePortal}>
410
421
  <TamaguiSelect.ScrollUpButton
411
422
  alignItems="center"
412
423
  justifyContent="center"
@@ -473,3 +484,14 @@ export const InTable: Story = {
473
484
  );
474
485
  },
475
486
  };
487
+
488
+ export const NativeIos: Story = {
489
+ name: "Native iOS ActionSheet",
490
+ args: {
491
+ label: "Country",
492
+ options: countryOptions,
493
+ placeholder: "Choose a country",
494
+ helperText: "native — iOS ActionSheet; catalog sheet everywhere else",
495
+ native: true,
496
+ },
497
+ };
@@ -22,7 +22,7 @@ import {
22
22
  wasKeyboardFocus,
23
23
  } from "@multiplatform.one/theme";
24
24
  import type { LabelProps, SizeTokens } from "tamagui";
25
- import { Pressable as RNPressable } from "react-native";
25
+ import { ActionSheetIOS, Platform, Pressable as RNPressable } from "react-native";
26
26
  import { Paragraph, Text, View, YStack, isWeb, styled, useTheme } from "tamagui";
27
27
  import { Chip, type ChipProps } from "../../Chip";
28
28
  import { Skeleton } from "../../Skeleton";
@@ -50,6 +50,7 @@ import { useDragScroll } from "../../shared/useDragScroll";
50
50
  import { useIsInTableCell } from "../../shared/tableCellContext";
51
51
  import { t } from "../../shared/t";
52
52
  import { orderOptionsBySelected, type SelectedOrder } from "../selectedOrder";
53
+ import { shouldUseIosNativeSelect } from "../nativeSelect";
53
54
 
54
55
  // ── Types ─────────────────────────────────────────────────────
55
56
 
@@ -99,6 +100,11 @@ export interface SelectProps {
99
100
  "aria-label"?: string;
100
101
  /** When true, uses compact sizing */
101
102
  compact?: boolean;
103
+ /**
104
+ * Opt into the OS picker on iOS (ActionSheet). Ignored on web, when
105
+ * `multiple` is set, and on Android (the catalog sheet stays). Default false.
106
+ */
107
+ native?: boolean;
102
108
  }
103
109
 
104
110
  // ── Lightweight item row (replaces heavy ListItem-based DropdownItem) ──
@@ -464,6 +470,7 @@ interface FloatingSelectCoreProps {
464
470
  multiple?: boolean;
465
471
  selectedOrder?: SelectedOrder;
466
472
  dismissible?: boolean;
473
+ native?: boolean;
467
474
  }
468
475
  function FloatingSelectCore({
469
476
  options,
@@ -1198,6 +1205,7 @@ function NativeSelectCore({
1198
1205
  multiple,
1199
1206
  selectedOrder,
1200
1207
  dismissible,
1208
+ native,
1201
1209
  }: FloatingSelectCoreProps) {
1202
1210
  const describedBy = useFieldDescribedBy();
1203
1211
  const fieldA11y = useFieldA11y();
@@ -1418,6 +1426,72 @@ function NativeSelectCore({
1418
1426
  : placeholder
1419
1427
  : (selectedOption?.label ?? placeholder);
1420
1428
 
1429
+ if (shouldUseIosNativeSelect({ native, multiple, isWeb, os: Platform.OS })) {
1430
+ const openNative = () => {
1431
+ if (disabled) return;
1432
+ const labels = options.map((o) => o.label);
1433
+ ActionSheetIOS.showActionSheetWithOptions(
1434
+ {
1435
+ options: [...labels, t("Cancel")],
1436
+ cancelButtonIndex: labels.length,
1437
+ },
1438
+ (index) => {
1439
+ if (index == null || index === labels.length) {
1440
+ onBlur?.();
1441
+ return;
1442
+ }
1443
+ handleSelect(options[index].value);
1444
+ },
1445
+ );
1446
+ };
1447
+ return (
1448
+ <RNPressable
1449
+ onPress={openNative}
1450
+ disabled={disabled}
1451
+ accessibilityRole="button"
1452
+ accessibilityState={{ disabled: !!disabled, expanded: false }}
1453
+ accessibilityLabel={ariaLabel ?? fieldA11y?.label}
1454
+ accessibilityValue={{ text: triggerValueText }}
1455
+ style={{ width: "100%" }}
1456
+ >
1457
+ <InputParts.Box
1458
+ disabled={disabled}
1459
+ size={knobProps.sizeToken}
1460
+ minHeight={MIN_PRESS_TARGET}
1461
+ pointerEvents="none"
1462
+ {...(inTableCell
1463
+ ? {}
1464
+ : {
1465
+ borderRadius: knobProps.borderRadius.borderRadius,
1466
+ borderWidth: knobProps.borderRadius.borderWidth,
1467
+ })}
1468
+ data-testid="select-trigger"
1469
+ id={id}
1470
+ >
1471
+ <View
1472
+ flex={1}
1473
+ paddingHorizontal={knobProps.panelPadding.padding}
1474
+ paddingVertical="$2"
1475
+ justifyContent="flex-start"
1476
+ alignItems="flex-start"
1477
+ >
1478
+ <Text
1479
+ fontFamily={knobProps.body.fontFamily}
1480
+ fontWeight={knobProps.body.fontWeight}
1481
+ color={selectedOption ? formCommonColors.text : formCommonColors.muted}
1482
+ numberOfLines={1}
1483
+ >
1484
+ {triggerValueText}
1485
+ </Text>
1486
+ </View>
1487
+ <View paddingInlineEnd="$2" alignSelf="center">
1488
+ <CaretDownIcon size={16} />
1489
+ </View>
1490
+ </InputParts.Box>
1491
+ </RNPressable>
1492
+ );
1493
+ }
1494
+
1421
1495
  return (
1422
1496
  <FloatingPanel
1423
1497
  open={open}
@@ -1574,6 +1648,7 @@ export function Select({
1574
1648
  dismissible,
1575
1649
  skeleton,
1576
1650
  compact,
1651
+ native,
1577
1652
  "aria-label": ariaLabel,
1578
1653
  ...rest
1579
1654
  }: SelectProps) {
@@ -1690,6 +1765,7 @@ export function Select({
1690
1765
  multiple={multiple}
1691
1766
  selectedOrder={selectedOrder}
1692
1767
  dismissible={dismissible}
1768
+ native={native}
1693
1769
  />
1694
1770
  );
1695
1771
  };
@@ -1,6 +1,7 @@
1
- import { fireEvent } from "@testing-library/react";
2
- import { beforeAll, describe, expect, it, vi } from "vitest";
1
+ import { cleanup, fireEvent } from "@testing-library/react";
2
+ import { afterEach, beforeAll, describe, expect, it, vi } from "vitest";
3
3
  import { renderWithProviders } from "@multiplatform.one/test-utils";
4
+ import { Preset } from "@multiplatform.one/theme";
4
5
  import { Form } from "../../Form";
5
6
  import { Signature, signatureValueToSvg } from "./index";
6
7
 
@@ -39,6 +40,8 @@ beforeAll(() => {
39
40
  })) as any;
40
41
  });
41
42
 
43
+ afterEach(cleanup);
44
+
42
45
  describe("Signature", () => {
43
46
  describe("without form context", () => {
44
47
  it("renders with label", () => {
@@ -192,7 +195,23 @@ describe("design-law", () => {
192
195
  expect(bg).not.toBe("white");
193
196
  expect(bg.replace(/\s/g, "")).not.toMatch(/^rgb\(255,255,255\)$/);
194
197
  expect(bg.replace(/\s/g, "")).not.toMatch(/^#fff(fff)?$/i);
195
- expect(pad.getAttribute("data-elevation")).not.toBeTruthy();
198
+ });
199
+
200
+ it("elevation knob reaches the pad frame (large-canvas honour, FileUpload sibling)", () => {
201
+ const none = renderWithProviders(
202
+ <Preset overrides={{ elevation: "none" }}>
203
+ <Signature label="Signature" name="sig" clearIcon={clearIcon} />
204
+ </Preset>,
205
+ );
206
+ expect(getPad(none.container).className).not.toMatch(/_bxsh-/);
207
+ cleanup();
208
+
209
+ const large = renderWithProviders(
210
+ <Preset overrides={{ elevation: "large" }}>
211
+ <Signature label="Signature" name="sig" clearIcon={clearIcon} />
212
+ </Preset>,
213
+ );
214
+ expect(getPad(large.container).className).toMatch(/_bxsh-/);
196
215
  });
197
216
 
198
217
  it("derives pad minHeight from the size token, not a 200px canvas", () => {
@@ -8,7 +8,7 @@ import type { PointerEvent, ReactNode } from "react";
8
8
  import { useCallback, useEffect, useRef, useState } from "react";
9
9
  import type { GestureResponderEvent, LayoutChangeEvent } from "react-native";
10
10
  import type { LabelProps, SizeTokens } from "tamagui";
11
- import { isWeb, Text, XStack, YStack, useTheme as useTamaguiTheme } from "tamagui";
11
+ import { isWeb, Text, XStack, YStack, styled, useTheme as useTamaguiTheme } from "tamagui";
12
12
  import { EraserIcon } from "@phosphor-icons/react";
13
13
  import { getStroke } from "perfect-freehand";
14
14
  // Named import (not default): under tamagui 2.7.6 the vitest/vite pipeline
@@ -245,6 +245,18 @@ const signatureHeightRows = 3;
245
245
  const signatureAspect = 2.5;
246
246
  const defaultClearIcon = <EraserIcon size={16} />;
247
247
 
248
+ // Large-canvas family (knob-laws § Family rules): honour elevation on the
249
+ // pad FRAME the same way FileUpload's dropzone does — a styled surface that
250
+ // accepts the resolver token. Ink stays clipped; web box-shadow paints
251
+ // outside overflow:hidden (LC-85).
252
+ const SignaturePadFrame = styled(YStack, {
253
+ name: "SignaturePad",
254
+ position: "relative",
255
+ overflow: "hidden",
256
+ userSelect: "none",
257
+ outlineWidth: 0,
258
+ });
259
+
248
260
  interface SignatureCanvasProps {
249
261
  id?: string;
250
262
  hasLabel?: boolean;
@@ -498,22 +510,19 @@ function SignatureCanvasImpl({
498
510
  const frameRing = kbFocus ? ensureFocusVisibleRing({ outlineOffset: -2 }) : undefined;
499
511
 
500
512
  return (
501
- <YStack
513
+ <SignaturePadFrame
502
514
  id={id}
503
- position="relative"
504
515
  onLayout={handleLayout}
505
516
  {...knobProps.inputSurface}
506
517
  backgroundColor={backgroundColor ?? knobProps.inputBackground}
507
518
  {...(disabled ? disabledSurface : undefined)}
508
519
  borderRadius={cappedRadius}
509
520
  borderWidth={knobProps.borderRadius.borderWidth}
521
+ elevation={knobProps.elevation}
510
522
  borderColor={error ? formCommonColors.error : formInputColors.border.base}
511
- overflow="hidden"
512
523
  aspectRatio={aspectRatio}
513
524
  minHeight={minHeightPx}
514
- userSelect="none"
515
525
  cursor={cursor}
516
- outlineWidth={0}
517
526
  hoverStyle={
518
527
  disabled
519
528
  ? undefined
@@ -600,7 +609,7 @@ function SignatureCanvasImpl({
600
609
  </Button>
601
610
  </XStack>
602
611
  )}
603
- </YStack>
612
+ </SignaturePadFrame>
604
613
  );
605
614
  }
606
615
 
@@ -16,6 +16,7 @@ import {
16
16
  borderRadiusMap,
17
17
  ensureFocusVisibleRing,
18
18
  ensureKeyboardModalityTracking,
19
+ FOCUS_RING_HALO_OFFSET,
19
20
  resolveRadiusClass,
20
21
  useReadableTextOn,
21
22
  useResolvedKnobs,
@@ -240,7 +241,9 @@ function SliderControl({
240
241
  const fieldTheme = useTheme();
241
242
  const thumbFocusRing = ensureFocusVisibleRing({
242
243
  outlineColor: (fieldTheme.outlineColor?.val as string | undefined) ?? "$outlineColor",
243
- outlineOffset: 2,
244
+ // LC-71 §4 halo: circular thumb. At offset 0 the band is concentric with
245
+ // the thumb's edge and reads as a fatter thumb rather than a focus ring.
246
+ outlineOffset: FOCUS_RING_HALO_OFFSET,
244
247
  });
245
248
  // Apple/Material/Spectrum: the filled rail is the value (accent). Pin the
246
249
  // literal so Tamagui's SliderActive sub-theme cannot remap `$accentBackground`
@@ -40,6 +40,7 @@ import { Skeleton } from "../../Skeleton";
40
40
  import { Field, FieldLayout } from "../../fieldLayout";
41
41
  import { formCommonColors, formControlColors, formSwitchColors } from "../../shared/colorRamps";
42
42
  import {
43
+ clampRadiusInStateProps,
43
44
  getElevationWrapperProps,
44
45
  getFieldError,
45
46
  mergeFieldHandler,
@@ -143,23 +144,24 @@ function resolveSwitchRadiusStop(pointy: boolean | undefined, radiusToken: strin
143
144
  return stop;
144
145
  }
145
146
 
146
- function binaryRadiusFromStateToken(token: unknown, heightPx: number): number | undefined {
147
- if (typeof token !== "string") return undefined;
148
- const stop = radiusStopFromToken(token);
149
- if (!stop) return undefined;
150
- return resolveRadiusClass("BINARY", stop, { heightPx });
151
- }
152
-
153
- /** Rewrite a state bag's DEFAULT radius token to BINARY at that bag's stop. */
147
+ /**
148
+ * Rewrite a state bag's radius to the BINARY row (0 or h/2).
149
+ *
150
+ * Delegates to the shared `clampRadiusInStateProps`, which reads the
151
+ * doctrine-GENERATED table through `resolveRadiusClass` (LC-16
152
+ * ONE-IMPLEMENTATION). Switch used to carry its own copy of this walk; a
153
+ * second copy is how a DG-RAD edit reaches the base radius and silently
154
+ * misses every hover/press/focus bag. The only thing left here is the
155
+ * empty-bag convention the JSX below needs: `hoverStyle={undefined}` rather
156
+ * than `hoverStyle={{}}`.
157
+ */
154
158
  function withBinaryStateRadius(
155
159
  stateProps: Record<string, any> | undefined,
156
160
  heightPx: number,
157
161
  ): Record<string, any> | undefined {
158
162
  if (!stateProps) return undefined;
159
- const { borderRadius: token, ...rest } = stateProps;
160
- const resolved = binaryRadiusFromStateToken(token, heightPx);
161
- const next = resolved === undefined ? rest : { ...rest, borderRadius: resolved };
162
- return Object.keys(next).length > 0 ? next : undefined;
163
+ const next = clampRadiusInStateProps(stateProps, { radiusClass: "BINARY", heightPx });
164
+ return next && Object.keys(next).length > 0 ? next : undefined;
163
165
  }
164
166
 
165
167
  const SwitchThumbStyled = styled(View, {