@multiplatform.one/forms 7.56.0 → 7.58.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/AdaptivePopup/index.cjs +5 -1
  2. package/dist/cjs/AdaptivePopup/index.native.js +6 -2
  3. package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
  4. package/dist/cjs/Button/index.cjs +2 -1
  5. package/dist/cjs/Button/index.native.js +4 -3
  6. package/dist/cjs/Button/index.native.js.map +1 -1
  7. package/dist/cjs/Chip/index.native.js.map +1 -1
  8. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
  9. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  10. package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  11. package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  12. package/dist/cjs/ContextualSaveBar/index.native.js +3 -3
  13. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  14. package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  15. package/dist/cjs/ControlGroup/index.native.js +1 -1
  16. package/dist/cjs/ControlGroup/index.native.js.map +1 -1
  17. package/dist/cjs/DescriptionList/index.native.js +2 -2
  18. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  19. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  20. package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
  21. package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
  22. package/dist/cjs/FieldDisplay/index.native.js +1 -1
  23. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  24. package/dist/cjs/FieldGroup.native.js.map +1 -1
  25. package/dist/cjs/FloatingPanel/compactFace.cjs +38 -0
  26. package/dist/cjs/FloatingPanel/compactFace.native.js +42 -0
  27. package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -0
  28. package/dist/cjs/FloatingPanel/index.cjs +38 -9
  29. package/dist/cjs/FloatingPanel/index.native.js +154 -6
  30. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  31. package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -1
  32. package/dist/cjs/FloatingPanel/pointAnchor.cjs +22 -0
  33. package/dist/cjs/FloatingPanel/pointAnchor.native.js +23 -0
  34. package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
  35. package/dist/cjs/FloatingPanel/trailingAction.native.js +1 -1
  36. package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -1
  37. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  38. package/dist/cjs/Form/index.native.js +1 -1
  39. package/dist/cjs/Form/index.native.js.map +1 -1
  40. package/dist/cjs/Form/submissionController.native.js.map +1 -1
  41. package/dist/cjs/Form/validateOn.native.js.map +1 -1
  42. package/dist/cjs/FormGrid.native.js.map +1 -1
  43. package/dist/cjs/FormSection.native.js.map +1 -1
  44. package/dist/cjs/InputParts/PasswordReveal.native.js.map +1 -1
  45. package/dist/cjs/InputParts/index.cjs +13 -7
  46. package/dist/cjs/InputParts/index.native.js +13 -7
  47. package/dist/cjs/InputParts/index.native.js.map +1 -1
  48. package/dist/cjs/Label/index.native.js.map +1 -1
  49. package/dist/cjs/MediaPicker/base64.native.js.map +1 -1
  50. package/dist/cjs/MediaPicker/payload.native.js.map +1 -1
  51. package/dist/cjs/MediaPicker/types.native.js.map +1 -1
  52. package/dist/cjs/MediaPicker/useMediaPicker.native.js.map +1 -1
  53. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  54. package/dist/cjs/Spinner/SpinnerGlyph.native.js.map +1 -1
  55. package/dist/cjs/Spinner/spinnerSize.native.js.map +1 -1
  56. package/dist/cjs/Table/index.native.js.map +1 -1
  57. package/dist/cjs/Wheel/haptic.native.js.map +1 -1
  58. package/dist/cjs/Wheel/index.native.js.map +1 -1
  59. package/dist/cjs/Wheel/wheelShared.native.js.map +1 -1
  60. package/dist/cjs/actionLabel.native.js.map +1 -1
  61. package/dist/cjs/fieldDefaults.native.js.map +1 -1
  62. package/dist/cjs/fieldLayout.native.js +1 -1
  63. package/dist/cjs/fieldLayout.native.js.map +1 -1
  64. package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
  65. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +1 -1
  66. package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
  67. package/dist/cjs/fields/Barcode/index.native.js +2 -2
  68. package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
  69. package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
  70. package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
  71. package/dist/cjs/fields/Checkbox/Checkbox.cjs +24 -14
  72. package/dist/cjs/fields/Checkbox/Checkbox.native.js +39 -23
  73. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  74. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  75. package/dist/cjs/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  76. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  77. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +1 -1
  78. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  79. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  80. package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
  81. package/dist/cjs/fields/ColorPicker/index.native.js +2 -2
  82. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  83. package/dist/cjs/fields/ColorPicker/parts.native.js +2 -2
  84. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  85. package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
  86. package/dist/cjs/fields/Combobox/index.native.js +5 -5
  87. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  88. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  89. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  90. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  91. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +3 -3
  92. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  93. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +2 -2
  94. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
  95. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  96. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  97. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  98. package/dist/cjs/fields/DatePicker/catalog.native.js +2 -2
  99. package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
  100. package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  101. package/dist/cjs/fields/DatePicker/index.native.js +2 -2
  102. package/dist/cjs/fields/DatePicker/parts.native.js +2 -2
  103. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  104. package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
  105. package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
  106. package/dist/cjs/fields/Duration/index.native.js +3 -3
  107. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  108. package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  109. package/dist/cjs/fields/FileUpload/index.native.js +2 -2
  110. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  111. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  112. package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  113. package/dist/cjs/fields/Geolocation/geoValue.native.js.map +1 -1
  114. package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -1
  115. package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -1
  116. package/dist/cjs/fields/Geolocation/index.native.js +5 -5
  117. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  118. package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
  119. package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
  120. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  121. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  122. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  123. package/dist/cjs/fields/Icon/index.native.js +3 -3
  124. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  125. package/dist/cjs/fields/ImageField/index.native.js +2 -2
  126. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  127. package/dist/cjs/fields/Input/index.native.js +3 -3
  128. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  129. package/dist/cjs/fields/MentionInput/index.native.js +3 -3
  130. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  131. package/dist/cjs/fields/OTPInput/index.native.js +3 -3
  132. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  133. package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
  134. package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
  135. package/dist/cjs/fields/PhoneInput/index.native.js +3 -3
  136. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  137. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  138. package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -1
  139. package/dist/cjs/fields/Progress/index.native.js +1 -1
  140. package/dist/cjs/fields/Progress/index.native.js.map +1 -1
  141. package/dist/cjs/fields/RadioGroup/index.cjs +6 -1
  142. package/dist/cjs/fields/RadioGroup/index.native.js +7 -2
  143. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  144. package/dist/cjs/fields/Rating/index.native.js +1 -1
  145. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  146. package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
  147. package/dist/cjs/fields/Rating/types.native.js.map +1 -1
  148. package/dist/cjs/fields/SearchInput/index.native.js +2 -2
  149. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  150. package/dist/cjs/fields/Select/index.cjs +13 -2
  151. package/dist/cjs/fields/Select/index.native.js +26 -7
  152. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  153. package/dist/cjs/fields/Signature/index.native.js +2 -2
  154. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  155. package/dist/cjs/fields/Slider/index.native.js +1 -1
  156. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  157. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  158. package/dist/cjs/fields/Stepper/index.native.js +2 -2
  159. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  160. package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  161. package/dist/cjs/fields/Switch/footprint.native.js.map +1 -1
  162. package/dist/cjs/fields/Switch/index.cjs +22 -10
  163. package/dist/cjs/fields/Switch/index.native.js +30 -16
  164. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  165. package/dist/cjs/fields/TextArea/index.native.js +2 -2
  166. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  167. package/dist/cjs/fields/TimePicker/catalog.native.js +3 -3
  168. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
  169. package/dist/cjs/fields/TimePicker/index.native.js +2 -2
  170. package/dist/cjs/fields/TimePicker/parts.native.js +1 -1
  171. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  172. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  173. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +2 -2
  174. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  175. package/dist/cjs/fields/ToggleGroup/index.native.js +1 -1
  176. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  177. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  178. package/dist/cjs/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  179. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  180. package/dist/cjs/fields/nativeSelect.native.js.map +1 -1
  181. package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
  182. package/dist/cjs/formSpacing.native.js.map +1 -1
  183. package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
  184. package/dist/cjs/index.native.js +45 -45
  185. package/dist/cjs/index.native.js.map +1 -1
  186. package/dist/cjs/keyboard/KeyboardDoneBar.native.js +1 -1
  187. package/dist/cjs/keyboard/chain.native.js.map +1 -1
  188. package/dist/cjs/keyboard/index.native.js.map +1 -1
  189. package/dist/cjs/keyboard/types.native.js.map +1 -1
  190. package/dist/cjs/requiredMarking.native.js.map +1 -1
  191. package/dist/cjs/shared/TimeColumn.native.js +1 -1
  192. package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
  193. package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
  194. package/dist/cjs/shared/choiceRowPress.cjs +46 -0
  195. package/dist/cjs/shared/choiceRowPress.native.js +50 -0
  196. package/dist/cjs/shared/choiceRowPress.native.js.map +1 -0
  197. package/dist/cjs/shared/colorRamps.native.js.map +1 -1
  198. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  199. package/dist/cjs/shared/floatingList.native.js +1 -1
  200. package/dist/cjs/shared/floatingList.native.js.map +1 -1
  201. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  202. package/dist/cjs/shared/groupContext.native.js.map +1 -1
  203. package/dist/cjs/shared/i18n.native.js.map +1 -1
  204. package/dist/cjs/shared/instantMotion.native.js.map +1 -1
  205. package/dist/cjs/shared/nativeA11y.native.js.map +1 -1
  206. package/dist/cjs/shared/nativeAutoFocus.native.js.map +1 -1
  207. package/dist/cjs/shared/overlayStack.cjs +4 -0
  208. package/dist/cjs/shared/overlayStack.native.js +4 -0
  209. package/dist/cjs/shared/overlayStack.native.js.map +1 -1
  210. package/dist/cjs/shared/panelPortal.native.js.map +1 -1
  211. package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -1
  212. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
  213. package/dist/cjs/shared/restoreRetries.native.js.map +1 -1
  214. package/dist/cjs/shared/t.native.js.map +1 -1
  215. package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
  216. package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
  217. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  218. package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
  219. package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
  220. package/dist/cjs/shared/utils.native.js +1 -1
  221. package/dist/cjs/shared/utils.native.js.map +1 -1
  222. package/dist/cjs/shared/zIndex.native.js.map +1 -1
  223. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  224. package/dist/cjs/types.native.js.map +1 -1
  225. package/dist/cjs/utils/LinkCell.native.js.map +1 -1
  226. package/dist/esm/AdaptivePopup/index.mjs +6 -2
  227. package/dist/esm/AdaptivePopup/index.mjs.map +1 -1
  228. package/dist/esm/AdaptivePopup/index.native.js +6 -2
  229. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  230. package/dist/esm/Button/index.mjs +3 -2
  231. package/dist/esm/Button/index.mjs.map +1 -1
  232. package/dist/esm/Button/index.native.js +3 -2
  233. package/dist/esm/Button/index.native.js.map +1 -1
  234. package/dist/esm/FloatingPanel/compactFace.mjs +11 -0
  235. package/dist/esm/FloatingPanel/compactFace.mjs.map +1 -0
  236. package/dist/esm/FloatingPanel/compactFace.native.js +12 -0
  237. package/dist/esm/FloatingPanel/compactFace.native.js.map +1 -0
  238. package/dist/esm/FloatingPanel/index.mjs +40 -11
  239. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  240. package/dist/esm/FloatingPanel/index.native.js +156 -8
  241. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  242. package/dist/esm/FloatingPanel/pointAnchor.mjs +22 -1
  243. package/dist/esm/FloatingPanel/pointAnchor.mjs.map +1 -1
  244. package/dist/esm/FloatingPanel/pointAnchor.native.js +23 -1
  245. package/dist/esm/FloatingPanel/pointAnchor.native.js.map +1 -1
  246. package/dist/esm/InputParts/index.mjs +13 -7
  247. package/dist/esm/InputParts/index.mjs.map +1 -1
  248. package/dist/esm/InputParts/index.native.js +13 -7
  249. package/dist/esm/InputParts/index.native.js.map +1 -1
  250. package/dist/esm/fields/Checkbox/Checkbox.mjs +24 -14
  251. package/dist/esm/fields/Checkbox/Checkbox.mjs.map +1 -1
  252. package/dist/esm/fields/Checkbox/Checkbox.native.js +38 -22
  253. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  254. package/dist/esm/fields/RadioGroup/index.mjs +6 -1
  255. package/dist/esm/fields/RadioGroup/index.mjs.map +1 -1
  256. package/dist/esm/fields/RadioGroup/index.native.js +6 -1
  257. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  258. package/dist/esm/fields/Select/index.mjs +15 -4
  259. package/dist/esm/fields/Select/index.mjs.map +1 -1
  260. package/dist/esm/fields/Select/index.native.js +24 -5
  261. package/dist/esm/fields/Select/index.native.js.map +1 -1
  262. package/dist/esm/fields/Switch/index.mjs +22 -10
  263. package/dist/esm/fields/Switch/index.mjs.map +1 -1
  264. package/dist/esm/fields/Switch/index.native.js +28 -14
  265. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  266. package/dist/esm/shared/choiceRowPress.mjs +20 -0
  267. package/dist/esm/shared/choiceRowPress.mjs.map +1 -0
  268. package/dist/esm/shared/choiceRowPress.native.js +21 -0
  269. package/dist/esm/shared/choiceRowPress.native.js.map +1 -0
  270. package/dist/esm/shared/overlayStack.mjs +4 -1
  271. package/dist/esm/shared/overlayStack.mjs.map +1 -1
  272. package/dist/esm/shared/overlayStack.native.js +4 -1
  273. package/dist/esm/shared/overlayStack.native.js.map +1 -1
  274. package/dist/jsx/AdaptivePopup/index.mjs +6 -2
  275. package/dist/jsx/AdaptivePopup/index.mjs.map +1 -1
  276. package/dist/jsx/AdaptivePopup/index.native.js +5 -1
  277. package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
  278. package/dist/jsx/Button/index.mjs +3 -2
  279. package/dist/jsx/Button/index.mjs.map +1 -1
  280. package/dist/jsx/Button/index.native.js +2 -1
  281. package/dist/jsx/Button/index.native.js.map +1 -1
  282. package/dist/jsx/FloatingPanel/compactFace.mjs +11 -0
  283. package/dist/jsx/FloatingPanel/compactFace.mjs.map +1 -0
  284. package/dist/jsx/FloatingPanel/compactFace.native.js +42 -0
  285. package/dist/jsx/FloatingPanel/compactFace.native.js.map +1 -0
  286. package/dist/jsx/FloatingPanel/index.mjs +40 -11
  287. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  288. package/dist/jsx/FloatingPanel/index.native.js +154 -6
  289. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  290. package/dist/jsx/FloatingPanel/pointAnchor.mjs +22 -1
  291. package/dist/jsx/FloatingPanel/pointAnchor.mjs.map +1 -1
  292. package/dist/jsx/FloatingPanel/pointAnchor.native.js +23 -0
  293. package/dist/jsx/FloatingPanel/pointAnchor.native.js.map +1 -1
  294. package/dist/jsx/InputParts/index.mjs +13 -7
  295. package/dist/jsx/InputParts/index.mjs.map +1 -1
  296. package/dist/jsx/InputParts/index.native.js +13 -7
  297. package/dist/jsx/InputParts/index.native.js.map +1 -1
  298. package/dist/jsx/fields/Checkbox/Checkbox.mjs +24 -14
  299. package/dist/jsx/fields/Checkbox/Checkbox.mjs.map +1 -1
  300. package/dist/jsx/fields/Checkbox/Checkbox.native.js +38 -22
  301. package/dist/jsx/fields/Checkbox/Checkbox.native.js.map +1 -1
  302. package/dist/jsx/fields/RadioGroup/index.mjs +6 -1
  303. package/dist/jsx/fields/RadioGroup/index.mjs.map +1 -1
  304. package/dist/jsx/fields/RadioGroup/index.native.js +6 -1
  305. package/dist/jsx/fields/RadioGroup/index.native.js.map +1 -1
  306. package/dist/jsx/fields/Select/index.mjs +15 -4
  307. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  308. package/dist/jsx/fields/Select/index.native.js +22 -3
  309. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  310. package/dist/jsx/fields/Switch/index.mjs +22 -10
  311. package/dist/jsx/fields/Switch/index.mjs.map +1 -1
  312. package/dist/jsx/fields/Switch/index.native.js +28 -14
  313. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  314. package/dist/jsx/index.native.js.map +1 -1
  315. package/dist/jsx/shared/choiceRowPress.mjs +20 -0
  316. package/dist/jsx/shared/choiceRowPress.mjs.map +1 -0
  317. package/dist/jsx/shared/choiceRowPress.native.js +50 -0
  318. package/dist/jsx/shared/choiceRowPress.native.js.map +1 -0
  319. package/dist/jsx/shared/overlayStack.mjs +4 -1
  320. package/dist/jsx/shared/overlayStack.mjs.map +1 -1
  321. package/dist/jsx/shared/overlayStack.native.js +4 -0
  322. package/dist/jsx/shared/overlayStack.native.js.map +1 -1
  323. package/package.json +8 -8
  324. package/src/AdaptivePopup/index.tsx +6 -1
  325. package/src/Button/Button.controlTiers.spec.tsx +29 -0
  326. package/src/Button/index.tsx +3 -1
  327. package/src/FloatingPanel/FloatingPanel.compactFace.spec.tsx +187 -0
  328. package/src/FloatingPanel/FloatingPanel.menuFace.native.spec.tsx +183 -0
  329. package/src/FloatingPanel/compactFace.spec.ts +40 -0
  330. package/src/FloatingPanel/compactFace.ts +32 -0
  331. package/src/FloatingPanel/index.native.tsx +171 -4
  332. package/src/FloatingPanel/index.tsx +55 -11
  333. package/src/FloatingPanel/pointAnchor.spec.ts +80 -0
  334. package/src/FloatingPanel/pointAnchor.ts +52 -0
  335. package/src/InputParts/index.tsx +18 -7
  336. package/src/fields/Checkbox/Checkbox.native.spec.tsx +44 -0
  337. package/src/fields/Checkbox/Checkbox.tsx +31 -18
  338. package/src/fields/DatePicker/columnFit.spec.tsx +85 -0
  339. package/src/fields/RadioGroup/RadioGroup.native.spec.tsx +65 -0
  340. package/src/fields/RadioGroup/RadioGroup.stories.tsx +49 -0
  341. package/src/fields/RadioGroup/index.tsx +14 -2
  342. package/src/fields/Select/index.tsx +36 -6
  343. package/src/fields/Switch/Switch.rowPress.native.spec.tsx +69 -0
  344. package/src/fields/Switch/index.tsx +29 -11
  345. package/src/fields/pickerRows.spec.tsx +2 -0
  346. package/src/overlayGround.spec.ts +181 -0
  347. package/src/shared/choiceRowPress.ts +40 -0
  348. package/src/shared/overlayStack.tsx +5 -0
  349. package/types/AdaptivePopup/index.d.ts.map +1 -1
  350. package/types/Button/index.d.ts.map +1 -1
  351. package/types/FloatingPanel/compactFace.d.ts +21 -0
  352. package/types/FloatingPanel/compactFace.d.ts.map +1 -0
  353. package/types/FloatingPanel/index.d.ts +10 -0
  354. package/types/FloatingPanel/index.d.ts.map +1 -1
  355. package/types/FloatingPanel/index.native.d.ts +8 -1
  356. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  357. package/types/FloatingPanel/pointAnchor.d.ts +29 -0
  358. package/types/FloatingPanel/pointAnchor.d.ts.map +1 -1
  359. package/types/InputParts/index.d.ts.map +1 -1
  360. package/types/fields/Checkbox/Checkbox.d.ts.map +1 -1
  361. package/types/fields/RadioGroup/index.d.ts.map +1 -1
  362. package/types/fields/Select/index.d.ts.map +1 -1
  363. package/types/fields/Switch/index.d.ts.map +1 -1
  364. package/types/shared/choiceRowPress.d.ts +40 -0
  365. package/types/shared/choiceRowPress.d.ts.map +1 -0
  366. package/types/shared/overlayStack.d.ts +2 -0
  367. package/types/shared/overlayStack.d.ts.map +1 -1
@@ -6,8 +6,11 @@ import { useState } from "react";
6
6
  import { RadioGroup as TamaguiRadioGroup, XStack, YStack } from "tamagui";
7
7
  import { Label } from "../../Label";
8
8
  import { Preset, Text, Paragraph } from "@multiplatform.one/theme";
9
+ import { AdaptivePopup } from "../../AdaptivePopup";
9
10
  import { Button } from "../../Button";
10
11
  import { Form } from "../../Form";
12
+ import { Checkbox } from "../Checkbox";
13
+ import { Switch } from "../Switch";
11
14
  import { RadioGroup } from "./index";
12
15
 
13
16
  const meta: Meta<typeof RadioGroup> = {
@@ -374,3 +377,49 @@ export const InTable: Story = {
374
377
  );
375
378
  },
376
379
  };
380
+
381
+ /**
382
+ * FZ-7849: on a phone the whole row of every labelled choice selects, the label
383
+ * included, inside a sheet as on the page. The SHC console's Catalog filters
384
+ * found the label dead in a sheet.
385
+ */
386
+ export const RowPressInSheet: Story = {
387
+ name: "Row press in a sheet",
388
+ render: () => {
389
+ const RowPressExample = () => {
390
+ const [open, setOpen] = useState(false);
391
+ const [kind, setKind] = useState("app");
392
+ const [installed, setInstalled] = useState(false);
393
+ const [updates, setUpdates] = useState(false);
394
+ const summary = `Kind: ${kind} · Installed: ${installed ? "yes" : "no"} · Updates: ${updates ? "on" : "off"}`;
395
+ return (
396
+ <YStack gap="$3">
397
+ <Text>{summary}</Text>
398
+ <Button onPress={() => setOpen(true)}>Filter</Button>
399
+ <AdaptivePopup open={open} onOpenChange={setOpen} title="Filter">
400
+ <YStack gap="$4">
401
+ <RadioGroup
402
+ label="Kind"
403
+ options={[
404
+ { value: "app", label: "app" },
405
+ { value: "vapp", label: "vapp" },
406
+ { value: "addon", label: "addon" },
407
+ ]}
408
+ value={kind}
409
+ onChange={setKind}
410
+ />
411
+ <Checkbox
412
+ label="Installed only"
413
+ checked={installed}
414
+ onChange={(next) => setInstalled(next === true)}
415
+ />
416
+ <Switch label="Auto updates" checked={updates} onChange={setUpdates} />
417
+ <Text>{summary}</Text>
418
+ </YStack>
419
+ </AdaptivePopup>
420
+ </YStack>
421
+ );
422
+ };
423
+ return <RowPressExample />;
424
+ },
425
+ };
@@ -31,6 +31,7 @@ import { Skeleton } from "../../Skeleton";
31
31
  import { Field, FieldLayout } from "../../fieldLayout";
32
32
  import { formControlColors, formSelectedColors } from "../../shared/colorRamps";
33
33
  import { choiceItemA11y, composeA11yName } from "../../shared/nativeA11y";
34
+ import { choiceLabelPressProps, choiceRowPressProps } from "../../shared/choiceRowPress";
34
35
  import {
35
36
  getElevationWrapperProps,
36
37
  getFieldError,
@@ -582,8 +583,19 @@ export function RadioGroup({
582
583
  <Container gap="$2">
583
584
  {options.map((option, index) => {
584
585
  const itemId = `${id}-${index}-${option.value}`;
586
+ const select =
587
+ disabled || option.disabled || readOnly
588
+ ? undefined
589
+ : () => {
590
+ if (currentValue !== option.value) emit(option.value);
591
+ };
585
592
  return (
586
- <XStack key={`${index}-${option.value}`} gap="$2" alignItems="center">
593
+ <XStack
594
+ key={`${index}-${option.value}`}
595
+ gap="$2"
596
+ alignItems="center"
597
+ {...choiceRowPressProps(select)}
598
+ >
587
599
  {renderRadioItem(
588
600
  option,
589
601
  itemId,
@@ -592,7 +604,7 @@ export function RadioGroup({
592
604
  index === tabStopIndex,
593
605
  )}
594
606
  <Label
595
- htmlFor={itemId}
607
+ {...choiceLabelPressProps(itemId, select)}
596
608
  // MPO-283: on native the radio itself now carries this text as
597
609
  // its accessible name, so leaving the Label in the tree reads
598
610
  // every option twice. Web keeps the label/control association.
@@ -1,6 +1,15 @@
1
1
  import { useTouchSurface } from "@multiplatform.one/theme";
2
2
  import type { KeyboardEvent, MouseEvent, ReactNode, RefObject, UIEvent } from "react";
3
- import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, memo } from "react";
3
+ import {
4
+ useCallback,
5
+ useEffect,
6
+ useLayoutEffect,
7
+ useMemo,
8
+ useRef,
9
+ useState,
10
+ useSyncExternalStore,
11
+ memo,
12
+ } from "react";
4
13
  import { CaretDownIcon, CheckIcon } from "@phosphor-icons/react";
5
14
  import {
6
15
  useClick,
@@ -54,8 +63,9 @@ import {
54
63
  panelViewportPadding,
55
64
  useViewportGtSm,
56
65
  } from "../../FloatingPanel";
66
+ import { pickerCompactFace, resolveCompactFace } from "../../FloatingPanel/compactFace";
57
67
  import { PanelPortal } from "../../FloatingPanel/PanelPortal";
58
- import { useOverlayZIndex } from "../../shared/overlayStack";
68
+ import { useInsideOverlay, useOverlayZIndex } from "../../shared/overlayStack";
59
69
  import { useDragScroll } from "../../shared/useDragScroll";
60
70
  import { useIsInTableCell } from "../../shared/tableCellContext";
61
71
  import { t } from "../../shared/t";
@@ -1247,6 +1257,9 @@ function NativeSelectCore({
1247
1257
  dismissible,
1248
1258
  native,
1249
1259
  }: FloatingSelectCoreProps) {
1260
+ const insideOverlay = useInsideOverlay();
1261
+ const compactFace = pickerCompactFace(options.length);
1262
+ const asMenu = resolveCompactFace(compactFace, insideOverlay) === "menu";
1250
1263
  const hydrationTouch = useTouchSurface();
1251
1264
  const describedBy = useFieldDescribedBy();
1252
1265
  const fieldA11y = useFieldA11y();
@@ -1481,7 +1494,9 @@ function NativeSelectCore({
1481
1494
  : placeholder
1482
1495
  : (selectedOption?.label ?? placeholder);
1483
1496
 
1484
- if (shouldUseIosNativeSelect({ native, multiple, isWeb, os: Platform.OS })) {
1497
+ // The iOS action sheet is a sheet too: a short list, or any list inside an
1498
+ // overlay, opens as a menu over the trigger instead (FZ-7830).
1499
+ if (!asMenu && shouldUseIosNativeSelect({ native, multiple, isWeb, os: Platform.OS })) {
1485
1500
  const openNative = () => {
1486
1501
  if (disabled) return;
1487
1502
  const labels = options.map((o) => o.label);
@@ -1556,6 +1571,9 @@ function NativeSelectCore({
1556
1571
  if (!val) onBlur?.();
1557
1572
  }}
1558
1573
  sheet
1574
+ // A short list opens as a menu over its trigger; a long one keeps its
1575
+ // sheet at page level and opens as a menu inside another overlay (FZ-7830).
1576
+ compactFace={compactFace}
1559
1577
  triggerA11y={{
1560
1578
  label: ariaLabel ?? fieldA11y?.label,
1561
1579
  value: triggerValueText,
@@ -1676,6 +1694,10 @@ function NativeSelectCore({
1676
1694
 
1677
1695
  // ── Select (public API) ──────────────────────────────────────
1678
1696
 
1697
+ const subscribeNothing = () => () => {};
1698
+ const clientSnapshot = () => true;
1699
+ const serverSnapshot = () => false;
1700
+
1679
1701
  export function Select({
1680
1702
  name,
1681
1703
  form: formProp,
@@ -1733,10 +1755,18 @@ export function Select({
1733
1755
  id,
1734
1756
  });
1735
1757
  const viewportGtSm = useViewportGtSm();
1736
- // Sheet on native and below `$sm` (viewport < 640, OVERLAY_BREAKPOINT).
1737
- // Floating from `$sm` up.
1758
+ const insideOverlay = useInsideOverlay();
1759
+ // Sheet core on native and below `$sm` (viewport < 640, OVERLAY_BREAKPOINT).
1760
+ // Floating from `$sm` up, and on a phone-width web for a short list or
1761
+ // inside another overlay, where a sheet would stack on a sheet (FZ-7830).
1762
+ // Native keeps the sheet core, whose FloatingPanel opens the same menu.
1763
+ // SSR and the hydration render keep the sheet core, as the viewport does.
1738
1764
  const effectiveGtSm = typeof window !== "undefined" ? viewportGtSm : false;
1739
- const shouldUseSheet = !isWeb || !effectiveGtSm;
1765
+ const hydrated = useSyncExternalStore(subscribeNothing, clientSnapshot, serverSnapshot);
1766
+ const compactMenu =
1767
+ hydrated &&
1768
+ resolveCompactFace(pickerCompactFace(options?.length ?? 0), insideOverlay) === "menu";
1769
+ const shouldUseSheet = !isWeb || (!effectiveGtSm && !compactMenu);
1740
1770
 
1741
1771
  // Render skeleton placeholder
1742
1772
  if (skeleton) {
@@ -0,0 +1,69 @@
1
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { useForm } from "@tanstack/react-form";
3
+ import { cleanup, fireEvent } from "@testing-library/react";
4
+ import { afterEach, describe, expect, it, vi } from "vitest";
5
+ import { Form } from "../../Form";
6
+ import { Switch } from "./index";
7
+ import { muteBubbleInputs } from "../../../tests/muteBubbleInputs";
8
+
9
+ vi.mock("tamagui", async (importOriginal) => ({
10
+ ...(await importOriginal<typeof import("tamagui")>()),
11
+ isWeb: false,
12
+ }));
13
+
14
+ afterEach(cleanup);
15
+
16
+ function FormSwitch({ onChange }: { onChange: (checked: boolean) => void }) {
17
+ const form = useForm({ defaultValues: { alerts: false } });
18
+ return (
19
+ <Form form={form}>
20
+ <Switch name="alerts" label="Alerts" onChange={onChange} />
21
+ </Form>
22
+ );
23
+ }
24
+
25
+ // FZ-7849. Same contract as RadioGroup's row press: the row and the label flip
26
+ // the switch directly on native instead of through tamagui's focusable
27
+ // registry, and each press flips it exactly once.
28
+ describe("native Switch row press", () => {
29
+ muteBubbleInputs();
30
+
31
+ const rowOf = (label: HTMLElement) => label.parentElement as HTMLElement;
32
+
33
+ it("flips once from the row and once from the label, standalone", () => {
34
+ const onChange = vi.fn();
35
+ const result = renderWithProviders(<Switch label="Dark mode" onChange={onChange} />);
36
+ const label = result.getByText("Dark mode");
37
+ expect(label.hasAttribute("for")).toBe(false);
38
+ fireEvent.click(rowOf(label));
39
+ expect(onChange).toHaveBeenCalledExactlyOnceWith(true);
40
+ fireEvent.click(label);
41
+ expect(onChange).toHaveBeenCalledTimes(2);
42
+ expect(onChange).toHaveBeenLastCalledWith(false);
43
+ });
44
+
45
+ it("flips a form field once from its label", () => {
46
+ const onChange = vi.fn();
47
+ const result = renderWithProviders(<FormSwitch onChange={onChange} />);
48
+ fireEvent.click(result.getByText("Alerts"));
49
+ expect(onChange).toHaveBeenCalledExactlyOnceWith(true);
50
+ fireEvent.click(rowOf(result.getByText("Alerts")));
51
+ expect(onChange).toHaveBeenLastCalledWith(false);
52
+ });
53
+
54
+ it("leaves a disabled or read-only switch's row and label dead", () => {
55
+ const onChange = vi.fn();
56
+ const result = renderWithProviders(
57
+ <>
58
+ <Switch label="Off limits" onChange={onChange} disabled />
59
+ <Switch label="Look only" onChange={onChange} readOnly />
60
+ </>,
61
+ );
62
+ for (const text of ["Off limits", "Look only"]) {
63
+ const label = result.getByText(text);
64
+ fireEvent.click(rowOf(label));
65
+ fireEvent.click(label);
66
+ }
67
+ expect(onChange).not.toHaveBeenCalled();
68
+ });
69
+ });
@@ -49,6 +49,7 @@ import {
49
49
  useFormField,
50
50
  useResolvedValidators,
51
51
  } from "../../shared/utils";
52
+ import { choiceLabelPressProps, choiceRowPressProps } from "../../shared/choiceRowPress";
52
53
  import { pressSlopProps } from "../../shared/pressSlopProps";
53
54
  import { useIsInTableCell } from "../../shared/tableCellContext";
54
55
  import { switchFootprint, type SwitchFootprint } from "./footprint";
@@ -830,6 +831,15 @@ export function Switch({
830
831
  : undefined;
831
832
  const grownTarget = targetHeight !== undefined;
832
833
  const rowMinHeight = !inTableCell && grownTarget ? targetHeight : undefined;
834
+ // FZ-7849: the row and label flip the switch on native, through the same
835
+ // path as a press on the track.
836
+ const rowToggle = (current: boolean, handleChange?: (val: boolean) => void) =>
837
+ disabled || readOnly
838
+ ? undefined
839
+ : () => {
840
+ handleChange?.(!current);
841
+ handleValueChange(!current);
842
+ };
833
843
 
834
844
  const renderSwitch = (
835
845
  switchChecked: boolean,
@@ -1037,6 +1047,9 @@ export function Switch({
1037
1047
 
1038
1048
  if (!resolvedForm || !name) {
1039
1049
  const resolvedChecked = checked !== undefined ? checked : internalChecked;
1050
+ const handleChange =
1051
+ checked === undefined ? (val: boolean) => setInternalChecked(val) : undefined;
1052
+ const toggle = rowToggle(resolvedChecked, handleChange);
1040
1053
  return (
1041
1054
  <FieldLayout
1042
1055
  id={id}
@@ -1054,17 +1067,18 @@ export function Switch({
1054
1067
  height={sizeToken}
1055
1068
  {...(rowMinHeight !== undefined && { minHeight: rowMinHeight })}
1056
1069
  {...labelLeadingRow}
1070
+ {...(label ? choiceRowPressProps(toggle) : undefined)}
1057
1071
  >
1058
1072
  {renderSwitch(
1059
1073
  resolvedChecked,
1060
- checked === undefined ? (val) => setInternalChecked(val) : undefined,
1074
+ handleChange,
1061
1075
  onBlur,
1062
1076
  !!error,
1063
1077
  typeof error === "string" && error ? error : undefined,
1064
1078
  )}
1065
1079
  {label && (
1066
1080
  <Label
1067
- htmlFor={id}
1081
+ {...choiceLabelPressProps(id, toggle)}
1068
1082
  size={(size || "$true") as FontSizeTokens}
1069
1083
  {...knobProps.textWeight}
1070
1084
  color={error ? formCommonColors.error : knobProps.textAccentColor}
@@ -1098,6 +1112,15 @@ export function Switch({
1098
1112
  {(field) => {
1099
1113
  const resolvedError = getFieldError(field, error);
1100
1114
  const formLabelColor = resolvedError ? formCommonColors.error : knobProps.textAccentColor;
1115
+ const formChecked = checked !== undefined ? checked : Boolean(field.state.value);
1116
+ const handleChange = (val: boolean) => {
1117
+ field.handleChange(val as any);
1118
+ if (saveMode === "declarative") {
1119
+ commitImmediateField(resolvedForm, name, val);
1120
+ onAutoCommit?.(name, val);
1121
+ }
1122
+ };
1123
+ const toggle = rowToggle(formChecked, handleChange);
1101
1124
  return (
1102
1125
  <FieldLayout
1103
1126
  id={id}
@@ -1114,23 +1137,18 @@ export function Switch({
1114
1137
  height={sizeToken}
1115
1138
  {...(rowMinHeight !== undefined && { minHeight: rowMinHeight })}
1116
1139
  {...labelLeadingRow}
1140
+ {...(label ? choiceRowPressProps(toggle) : undefined)}
1117
1141
  >
1118
1142
  {renderSwitch(
1119
- checked !== undefined ? checked : Boolean(field.state.value),
1120
- (val) => {
1121
- field.handleChange(val as any);
1122
- if (saveMode === "declarative") {
1123
- commitImmediateField(resolvedForm, name, val);
1124
- onAutoCommit?.(name, val);
1125
- }
1126
- },
1143
+ formChecked,
1144
+ handleChange,
1127
1145
  mergeFieldHandler(field, "handleBlur", onBlur),
1128
1146
  !!resolvedError,
1129
1147
  typeof resolvedError === "string" && resolvedError ? resolvedError : undefined,
1130
1148
  )}
1131
1149
  {label && (
1132
1150
  <Label
1133
- htmlFor={id}
1151
+ {...choiceLabelPressProps(id, toggle)}
1134
1152
  size={(size || "$true") as FontSizeTokens}
1135
1153
  {...knobProps.textWeight}
1136
1154
  color={formLabelColor}
@@ -48,9 +48,11 @@ describe("picker sheet rows consume resolved control height", () => {
48
48
  <Picker
49
49
  value="one"
50
50
  onValueChange={onValueChange}
51
+ // Eight options: a shorter Select opens as a menu, not its sheet (FZ-7830).
51
52
  options={[
52
53
  { value: "one", label: "First choice" },
53
54
  { value: "two", label: "Second choice" },
55
+ ...[3, 4, 5, 6, 7, 8].map((n) => ({ value: `c${n}`, label: `Choice ${n}` })),
54
56
  ]}
55
57
  />,
56
58
  );
@@ -0,0 +1,181 @@
1
+ /**
2
+ * FZ-7944, LC-153 on an elevated ground. Dark `elevatedSurface` paints
3
+ * `$color4`, the tinted wash's own step, so a plain Button on a dark sheet,
4
+ * dialog, popover or floating panel had no plate (1.00:1). Over every preset
5
+ * the package exports and every colour scope a preset or Tint can name, the
6
+ * controls an overlay hosts must separate from the ground the overlay paints.
7
+ * Apple HIG: a control's fill sits above the elevated background it is on.
8
+ */
9
+
10
+ import * as themePackage from "@multiplatform.one/theme";
11
+ import {
12
+ controlTierPaint,
13
+ createDefaultThemeConfig,
14
+ holdInkFloor,
15
+ measureContrast,
16
+ pickReadableForeground,
17
+ resolveKnobs,
18
+ type PresetDefinition as Preset,
19
+ } from "@multiplatform.one/theme";
20
+ import { readFileSync } from "node:fs";
21
+ import { dirname, join } from "node:path";
22
+ import { fileURLToPath } from "node:url";
23
+ import { describe, expect, it } from "vitest";
24
+ import { formControlColors, formSelectedColors, formSwitchColors } from "./shared/colorRamps";
25
+
26
+ /** The card's floor: the console's "a plain Button on an overlay's ground" asks the same. */
27
+ const plateFloor = 1.1;
28
+
29
+ type RawThemes = Record<string, Record<string, { val: string } | string>>;
30
+ const themes = createDefaultThemeConfig().tamagui.themes as unknown as RawThemes;
31
+ const schemes = ["light", "dark"] as const;
32
+
33
+ function isPreset(value: unknown): value is Preset {
34
+ return (
35
+ typeof value === "object" &&
36
+ value !== null &&
37
+ "knobs" in value &&
38
+ "intents" in value &&
39
+ typeof (value as Preset).knobs === "object"
40
+ );
41
+ }
42
+
43
+ const presets = Object.entries(themePackage).filter(
44
+ (entry): entry is [string, Preset] => isPreset(entry[1]) && entry[0].endsWith("Preset"),
45
+ );
46
+
47
+ /** A token the way Tamagui resolves it in a component sub-theme: its own key, then the scope's. */
48
+ function resolve(scope: string, token: string, component?: string): string {
49
+ if (!token.startsWith("$")) return token;
50
+ const key = token.slice(1);
51
+ const own = component ? themes[`${scope}_${component}`]?.[key] : undefined;
52
+ const entry = own ?? themes[scope]?.[key];
53
+ const value = typeof entry === "object" ? entry.val : entry;
54
+ if (!value)
55
+ throw new Error(`${token} does not resolve in ${scope}${component ? `_${component}` : ""}`);
56
+ return value;
57
+ }
58
+
59
+ function ratio(foreground: string, background: string): number {
60
+ return measureContrast({ foreground, background }).ratio;
61
+ }
62
+
63
+ interface Case {
64
+ label: string;
65
+ scope: string;
66
+ scheme: (typeof schemes)[number];
67
+ knobs: Preset["knobs"];
68
+ }
69
+
70
+ const presetCases: Case[] = presets.flatMap(([name, preset]) =>
71
+ schemes.map((scheme) => ({
72
+ label: `${name} ${scheme}`,
73
+ scope: preset.theme ? `${scheme}_${preset.theme}` : scheme,
74
+ scheme,
75
+ knobs: preset.knobs,
76
+ })),
77
+ );
78
+
79
+ // Every hue scope with house component themes: a preset's `theme` or a Tint.
80
+ const hueCases: Case[] = Object.keys(themes)
81
+ .filter((name) => /^(light|dark)_[a-z]+$/.test(name) && themes[`${name}_Button`])
82
+ .map((scope) => ({
83
+ label: scope,
84
+ scope,
85
+ scheme: scope.startsWith("dark") ? "dark" : "light",
86
+ knobs: themePackage.defaultPreset.knobs,
87
+ }));
88
+
89
+ function groundOf({ scope, scheme, knobs }: Case): string {
90
+ const { elevatedSurface } = resolveKnobs(knobs, undefined, scheme).knobProps;
91
+ return resolve(scope, elevatedSurface.backgroundColor as string);
92
+ }
93
+
94
+ describe("FZ-7944: a control on an overlay has a plate distinct from the overlay's ground", () => {
95
+ it("covers the exported presets and the hue scopes", () => {
96
+ expect(presets.map(([name]) => name)).toEqual(
97
+ expect.arrayContaining(["defaultPreset", "boldPreset"]),
98
+ );
99
+ expect(hueCases.length).toBeGreaterThanOrEqual(16);
100
+ });
101
+
102
+ // The floor is the dark ask; light keeps its own wash, asserted below.
103
+ const darkCases = [...presetCases, ...hueCases].filter((c) => c.scheme === "dark");
104
+
105
+ describe.each(darkCases)("$label", (c) => {
106
+ const ground = groundOf(c);
107
+
108
+ it("a tinted Button's rest, hover and press each clear the plate floor on the ground", () => {
109
+ if (c.knobs.fillStyle === "outlined") return;
110
+ const paint = controlTierPaint("tinted", true, true);
111
+ for (const [state, token] of Object.entries(paint)) {
112
+ const plate = resolve(c.scope, token, "Button");
113
+ expect(
114
+ ratio(plate, ground),
115
+ `${state} ${token} ${plate} on ${ground}`,
116
+ ).toBeGreaterThanOrEqual(plateFloor);
117
+ }
118
+ });
119
+
120
+ it("a plain Button's hover and press wash clear the plate floor on the ground", () => {
121
+ const paint = controlTierPaint("plain", true, true);
122
+ for (const token of [paint.hover, paint.press]) {
123
+ const plate = resolve(c.scope, token, "Button");
124
+ expect(ratio(plate, ground), `${token} ${plate} on ${ground}`).toBeGreaterThanOrEqual(
125
+ plateFloor,
126
+ );
127
+ }
128
+ });
129
+
130
+ it("Slider and Progress tracks read on the ground", () => {
131
+ for (const component of ["Slider", "Progress"]) {
132
+ const track = resolve(c.scope, formControlColors.background, component);
133
+ expect(
134
+ ratio(track, ground),
135
+ `${component} track ${track} on ${ground}`,
136
+ ).toBeGreaterThanOrEqual(plateFloor);
137
+ }
138
+ });
139
+
140
+ it("the Switch off track and the Slider thumb read on the ground", () => {
141
+ const track = resolve(c.scope, formSwitchColors.track.off, "Switch");
142
+ expect(ratio(track, ground), `Switch off ${track} on ${ground}`).toBeGreaterThanOrEqual(
143
+ plateFloor,
144
+ );
145
+ // Slider.tsx: the thumb is the readable anchor on the accent fill, read at field scope.
146
+ const mark = resolve(c.scope, formSelectedColors.mark);
147
+ const thumb = holdInkFloor(
148
+ mark,
149
+ pickReadableForeground(mark, resolve(c.scope, "$color1"), resolve(c.scope, "$color12")),
150
+ );
151
+ expect(ratio(thumb, ground), `SliderThumb ${thumb} on ${ground}`).toBeGreaterThanOrEqual(
152
+ plateFloor,
153
+ );
154
+ });
155
+ });
156
+
157
+ it("dark keeps the MPO-69 elevation tint and light keeps the page ground", () => {
158
+ const knobs = themePackage.defaultPreset.knobs;
159
+ const ground = (scheme: "light" | "dark") =>
160
+ resolveKnobs(knobs, undefined, scheme).knobProps.elevatedSurface.backgroundColor;
161
+ expect(ground("dark")).toBe("$color4");
162
+ expect(ground("light")).toBe("$background");
163
+ expect(controlTierPaint("tinted", false, true)).toEqual(controlTierPaint("tinted", false));
164
+ });
165
+ });
166
+
167
+ describe("FZ-7944: every frame that paints the elevated ground marks its subtree elevated", () => {
168
+ const here = dirname(fileURLToPath(import.meta.url));
169
+ const frames = [
170
+ "../../theme/src/theme/overlaySurfaces.tsx",
171
+ "./FloatingPanel/index.tsx",
172
+ "./FloatingPanel/index.native.tsx",
173
+ "./AdaptivePopup/index.tsx",
174
+ ];
175
+ it.each(frames)("%s", (file) => {
176
+ const src = readFileSync(join(here, file), "utf8");
177
+ const resets = src.match(/<Surface\b[^>]*\bpainted=\{false\}[^>]*>/g) ?? [];
178
+ expect(resets.length, "the frame wraps its content in a Surface").toBeGreaterThan(0);
179
+ for (const tag of resets) expect(tag).toMatch(/\belevated\b/);
180
+ });
181
+ });
@@ -0,0 +1,40 @@
1
+ import { isWeb } from "tamagui";
2
+
3
+ /**
4
+ * FZ-7849: on native the whole row of a labelled choice control (RadioGroup
5
+ * option, Checkbox, Switch) is one press target, as `<label for>` makes it on
6
+ * web.
7
+ *
8
+ * tamagui's Label emulates `for` on native through `focusFocusable(htmlFor)`, a
9
+ * process-global registry keyed by element id. A second copy of
10
+ * `@tamagui/focusable` in a consumer's tree, or a duplicate id whose unmount
11
+ * deletes the live entry, leaves the label dead while the control still works,
12
+ * as the SHC console's Catalog filters did in a sheet on MPO 7.37.0. The gap between control
13
+ * and label and the row past the label text were never targets at all.
14
+ *
15
+ * So the component that owns the value wires the press: row and label both
16
+ * call `select`, and the label drops `htmlFor` so the registry cannot fire a
17
+ * second toggle that undoes the first. RN gives a tap to the innermost
18
+ * handler, so a tap on the control still fires only the control. Web keeps
19
+ * `htmlFor`: a row handler there would also get the click bubbling up from the
20
+ * control.
21
+ */
22
+ export function choiceRowPressProps(select: (() => void) | undefined) {
23
+ return !isWeb && select ? { onPress: select } : undefined;
24
+ }
25
+
26
+ /**
27
+ * A disabled or read-only row passes no `select`, so its label takes no press.
28
+ * The label consumes its press so a renderer that bubbles it (the web renderer
29
+ * the native specs run on) cannot hand the row a second toggle.
30
+ */
31
+ export function choiceLabelPressProps(htmlFor: string, select: (() => void) | undefined) {
32
+ if (isWeb) return { htmlFor };
33
+ if (!select) return {};
34
+ return {
35
+ onPress: (event?: { stopPropagation?: () => void }) => {
36
+ event?.stopPropagation?.();
37
+ select();
38
+ },
39
+ };
40
+ }
@@ -100,3 +100,8 @@ export function withOverlayStack<P extends ComponentType<any>>(
100
100
  Stacked.displayName = displayName;
101
101
  return Stacked as unknown as P;
102
102
  }
103
+
104
+ /** True inside a house overlay (a sheet, dialog, popover or floating panel). */
105
+ export function useInsideOverlay(): boolean {
106
+ return useContext(OverlayStackContext) !== undefined;
107
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AdaptivePopup/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAyB5D,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,uCAAuC;IACvC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,gFAAgF;IAChF,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,gCAAgC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,wCAAwC;IACxC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,mBAAmB;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,YAAY,CAAC;IAChD;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,sDAAsD;IACtD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kDAAkD;IAClD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAoBD,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,yBAAyB,CAK5B;AA6ED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,KAAK,EACL,WAAW,EACX,QAAQ,EACR,IAAW,EACX,IAAe,EACf,eAAsB,EACtB,MAAM,EACN,QAAQ,GACT,EAAE,kBAAkB,2CAqRpB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AdaptivePopup/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA0B5D,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,uCAAuC;IACvC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,gFAAgF;IAChF,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,gCAAgC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,wCAAwC;IACxC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,mBAAmB;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,YAAY,CAAC;IAChD;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,sDAAsD;IACtD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kDAAkD;IAClD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAoBD,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,yBAAyB,CAK5B;AA6ED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,KAAK,EACL,WAAW,EACX,QAAQ,EACR,IAAW,EACX,IAAe,EACf,eAAsB,EACtB,MAAM,EACN,QAAQ,GACT,EAAE,kBAAkB,2CAyRpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Button/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Button/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * What a FloatingPanel becomes where it would otherwise be a bottom sheet:
3
+ * on native, and on the web at or below OVERLAY_BREAKPOINT.
4
+ *
5
+ * - `"sheet"`: the bottom sheet, wherever it opens.
6
+ * - `"menu"`: a menu over its trigger (LC-112) wherever it opens.
7
+ * - `"auto"`: the sheet at page level, the menu inside another overlay. A
8
+ * sheet over a sheet is the one thing a phone must never show (FZ-7830).
9
+ */
10
+ export type CompactFace = "sheet" | "menu" | "auto";
11
+ export declare function resolveCompactFace(face: CompactFace | undefined, insideOverlay: boolean): "sheet" | "menu";
12
+ /** The longest list a picker opens as a menu over its trigger (FZ-7830). */
13
+ export declare const SHORT_LIST_MAX = 7;
14
+ /**
15
+ * A picker's face (FZ-7830, LC-112): a short list with no search opens as a
16
+ * menu over its trigger at every level, the iOS 14+ pull-down picker. A long or
17
+ * searchable list keeps the sheet at page level and opens as a scrolling menu
18
+ * inside another overlay.
19
+ */
20
+ export declare function pickerCompactFace(optionCount: number, searchable?: boolean): CompactFace;
21
+ //# sourceMappingURL=compactFace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compactFace.d.ts","sourceRoot":"","sources":["../../src/FloatingPanel/compactFace.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,aAAa,EAAE,OAAO,GACrB,OAAO,GAAG,MAAM,CAIlB;AAED,4EAA4E;AAC5E,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,WAAW,CAEtF"}