@multiplatform.one/forms 7.66.0 → 7.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/dist/cjs/AdaptivePopup/index.native.js +1 -1
  2. package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
  3. package/dist/cjs/Button/index.native.js +2 -2
  4. package/dist/cjs/Button/index.native.js.map +1 -1
  5. package/dist/cjs/Chip/index.native.js.map +1 -1
  6. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
  7. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  8. package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  9. package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  10. package/dist/cjs/ContextualSaveBar/index.native.js +3 -3
  11. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  12. package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  13. package/dist/cjs/ControlGroup/index.native.js +1 -1
  14. package/dist/cjs/ControlGroup/index.native.js.map +1 -1
  15. package/dist/cjs/DescriptionList/index.native.js +2 -2
  16. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  17. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  18. package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
  19. package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
  20. package/dist/cjs/FieldDisplay/index.native.js +1 -1
  21. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  22. package/dist/cjs/FieldGroup.native.js.map +1 -1
  23. package/dist/cjs/FloatingPanel/RegularPanel.cjs +164 -0
  24. package/dist/cjs/FloatingPanel/RegularPanel.native.js +169 -0
  25. package/dist/cjs/FloatingPanel/RegularPanel.native.js.map +1 -0
  26. package/dist/cjs/FloatingPanel/compactFace.cjs +6 -0
  27. package/dist/cjs/FloatingPanel/compactFace.native.js +6 -0
  28. package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -1
  29. package/dist/cjs/FloatingPanel/containingBlock.cjs +46 -0
  30. package/dist/cjs/FloatingPanel/containingBlock.native.js +51 -0
  31. package/dist/cjs/FloatingPanel/containingBlock.native.js.map +1 -0
  32. package/dist/cjs/FloatingPanel/index.cjs +2 -20
  33. package/dist/cjs/FloatingPanel/index.native.js +79 -45
  34. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  35. package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -1
  36. package/dist/cjs/FloatingPanel/pointAnchor.cjs +25 -0
  37. package/dist/cjs/FloatingPanel/pointAnchor.native.js +26 -0
  38. package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
  39. package/dist/cjs/FloatingPanel/regularPlacement.cjs +61 -0
  40. package/dist/cjs/FloatingPanel/regularPlacement.native.js +65 -0
  41. package/dist/cjs/FloatingPanel/regularPlacement.native.js.map +1 -0
  42. package/dist/cjs/FloatingPanel/trailingAction.native.js +1 -1
  43. package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -1
  44. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  45. package/dist/cjs/Form/index.native.js +1 -1
  46. package/dist/cjs/Form/index.native.js.map +1 -1
  47. package/dist/cjs/Form/submissionController.native.js.map +1 -1
  48. package/dist/cjs/Form/validateOn.native.js.map +1 -1
  49. package/dist/cjs/FormGrid.native.js.map +1 -1
  50. package/dist/cjs/FormSection.native.js.map +1 -1
  51. package/dist/cjs/InputParts/PasswordReveal.native.js.map +1 -1
  52. package/dist/cjs/InputParts/index.native.js.map +1 -1
  53. package/dist/cjs/Label/index.native.js.map +1 -1
  54. package/dist/cjs/MediaPicker/base64.native.js.map +1 -1
  55. package/dist/cjs/MediaPicker/payload.native.js.map +1 -1
  56. package/dist/cjs/MediaPicker/types.native.js.map +1 -1
  57. package/dist/cjs/MediaPicker/useMediaPicker.native.js.map +1 -1
  58. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  59. package/dist/cjs/Spinner/SpinnerGlyph.native.js.map +1 -1
  60. package/dist/cjs/Spinner/spinnerSize.native.js.map +1 -1
  61. package/dist/cjs/Table/index.native.js.map +1 -1
  62. package/dist/cjs/Wheel/haptic.native.js.map +1 -1
  63. package/dist/cjs/Wheel/index.native.js.map +1 -1
  64. package/dist/cjs/Wheel/wheelShared.native.js.map +1 -1
  65. package/dist/cjs/actionLabel.native.js.map +1 -1
  66. package/dist/cjs/fieldDefaults.native.js.map +1 -1
  67. package/dist/cjs/fieldLayout.native.js +1 -1
  68. package/dist/cjs/fieldLayout.native.js.map +1 -1
  69. package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
  70. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +1 -1
  71. package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
  72. package/dist/cjs/fields/Barcode/index.native.js +2 -2
  73. package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
  74. package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
  75. package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
  76. package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -1
  77. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  78. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  79. package/dist/cjs/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  80. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  81. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +1 -1
  82. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  83. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  84. package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
  85. package/dist/cjs/fields/ColorPicker/SystemColorField.native.js.map +1 -1
  86. package/dist/cjs/fields/ColorPicker/index.native.js +2 -2
  87. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  88. package/dist/cjs/fields/ColorPicker/parts.native.js +2 -2
  89. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  90. package/dist/cjs/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
  91. package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
  92. package/dist/cjs/fields/Combobox/index.cjs +1 -1
  93. package/dist/cjs/fields/Combobox/index.native.js +8 -6
  94. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  95. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  96. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  97. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  98. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +3 -3
  99. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  100. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +2 -2
  101. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
  102. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  103. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  104. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  105. package/dist/cjs/fields/DatePicker/catalog.native.js +2 -2
  106. package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
  107. package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  108. package/dist/cjs/fields/DatePicker/index.native.js +2 -2
  109. package/dist/cjs/fields/DatePicker/parts.native.js +2 -2
  110. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  111. package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
  112. package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
  113. package/dist/cjs/fields/Duration/index.native.js +3 -3
  114. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  115. package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  116. package/dist/cjs/fields/FileUpload/index.native.js +2 -2
  117. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  118. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  119. package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  120. package/dist/cjs/fields/Geolocation/geoValue.native.js.map +1 -1
  121. package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -1
  122. package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -1
  123. package/dist/cjs/fields/Geolocation/index.native.js +5 -5
  124. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  125. package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
  126. package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
  127. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  128. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  129. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  130. package/dist/cjs/fields/Icon/index.native.js +3 -3
  131. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  132. package/dist/cjs/fields/ImageField/index.native.js +2 -2
  133. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  134. package/dist/cjs/fields/Input/index.cjs +5 -0
  135. package/dist/cjs/fields/Input/index.native.js +8 -3
  136. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  137. package/dist/cjs/fields/MentionInput/index.native.js +3 -3
  138. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  139. package/dist/cjs/fields/OTPInput/index.native.js +3 -3
  140. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  141. package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
  142. package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
  143. package/dist/cjs/fields/PhoneInput/index.native.js +3 -3
  144. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  145. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  146. package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -1
  147. package/dist/cjs/fields/Progress/index.native.js +1 -1
  148. package/dist/cjs/fields/Progress/index.native.js.map +1 -1
  149. package/dist/cjs/fields/RadioGroup/index.native.js +1 -1
  150. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  151. package/dist/cjs/fields/Rating/index.native.js +1 -1
  152. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  153. package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
  154. package/dist/cjs/fields/Rating/types.native.js.map +1 -1
  155. package/dist/cjs/fields/SearchInput/index.native.js +2 -2
  156. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  157. package/dist/cjs/fields/Select/InlineChoices.cjs +3 -2
  158. package/dist/cjs/fields/Select/InlineChoices.native.js +5 -2
  159. package/dist/cjs/fields/Select/InlineChoices.native.js.map +1 -1
  160. package/dist/cjs/fields/Select/SheetPickerRow.cjs +154 -0
  161. package/dist/cjs/fields/Select/SheetPickerRow.native.js +165 -0
  162. package/dist/cjs/fields/Select/SheetPickerRow.native.js.map +1 -0
  163. package/dist/cjs/fields/Select/index.cjs +63 -4
  164. package/dist/cjs/fields/Select/index.native.js +89 -30
  165. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  166. package/dist/cjs/fields/Select/shouldInlineChoices.cjs +14 -1
  167. package/dist/cjs/fields/Select/shouldInlineChoices.native.js +15 -1
  168. package/dist/cjs/fields/Select/shouldInlineChoices.native.js.map +1 -1
  169. package/dist/cjs/fields/Signature/index.native.js +2 -2
  170. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  171. package/dist/cjs/fields/Slider/index.cjs +96 -4
  172. package/dist/cjs/fields/Slider/index.native.js +104 -6
  173. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  174. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  175. package/dist/cjs/fields/Stepper/index.native.js +2 -2
  176. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  177. package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  178. package/dist/cjs/fields/Switch/footprint.native.js.map +1 -1
  179. package/dist/cjs/fields/Switch/index.cjs +71 -1
  180. package/dist/cjs/fields/Switch/index.native.js +74 -3
  181. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  182. package/dist/cjs/fields/TextArea/index.native.js +2 -2
  183. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  184. package/dist/cjs/fields/TimePicker/catalog.native.js +3 -3
  185. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
  186. package/dist/cjs/fields/TimePicker/index.native.js +2 -2
  187. package/dist/cjs/fields/TimePicker/parts.native.js +1 -1
  188. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  189. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  190. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +2 -2
  191. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  192. package/dist/cjs/fields/ToggleGroup/index.cjs +67 -1
  193. package/dist/cjs/fields/ToggleGroup/index.native.js +76 -2
  194. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  195. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.cjs +34 -19
  196. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +44 -21
  197. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  198. package/dist/cjs/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  199. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  200. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.cjs +54 -0
  201. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js +57 -0
  202. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -0
  203. package/dist/cjs/fields/nativeSelect.native.js.map +1 -1
  204. package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
  205. package/dist/cjs/formSpacing.native.js.map +1 -1
  206. package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
  207. package/dist/cjs/index.cjs +11 -0
  208. package/dist/cjs/index.native.js +56 -45
  209. package/dist/cjs/index.native.js.map +1 -1
  210. package/dist/cjs/keyboard/KeyboardDoneBar.native.js +1 -1
  211. package/dist/cjs/keyboard/chain.native.js.map +1 -1
  212. package/dist/cjs/keyboard/index.native.js.map +1 -1
  213. package/dist/cjs/keyboard/types.native.js.map +1 -1
  214. package/dist/cjs/requiredMarking.native.js.map +1 -1
  215. package/dist/cjs/shared/TimeColumn.native.js +1 -1
  216. package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
  217. package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
  218. package/dist/cjs/shared/choiceRowPress.native.js.map +1 -1
  219. package/dist/cjs/shared/colorRamps.native.js.map +1 -1
  220. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  221. package/dist/cjs/shared/floatingList.native.js +1 -1
  222. package/dist/cjs/shared/floatingList.native.js.map +1 -1
  223. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  224. package/dist/cjs/shared/groupContext.native.js.map +1 -1
  225. package/dist/cjs/shared/i18n.native.js.map +1 -1
  226. package/dist/cjs/shared/instantMotion.native.js.map +1 -1
  227. package/dist/cjs/shared/nativeA11y.native.js.map +1 -1
  228. package/dist/cjs/shared/nativeAutoFocus.native.js.map +1 -1
  229. package/dist/cjs/shared/overlaySizeClass.cjs +42 -0
  230. package/dist/cjs/shared/overlaySizeClass.native.js +45 -0
  231. package/dist/cjs/shared/overlaySizeClass.native.js.map +1 -0
  232. package/dist/cjs/shared/overlayStack.native.js.map +1 -1
  233. package/dist/cjs/shared/panelPortal.native.js.map +1 -1
  234. package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -1
  235. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
  236. package/dist/cjs/shared/restoreRetries.native.js.map +1 -1
  237. package/dist/cjs/shared/sheetNavigation.cjs +76 -0
  238. package/dist/cjs/shared/sheetNavigation.native.js +129 -0
  239. package/dist/cjs/shared/sheetNavigation.native.js.map +1 -0
  240. package/dist/cjs/shared/systemControlModules.cjs +34 -0
  241. package/dist/cjs/shared/systemControlModules.gnome.cjs +34 -0
  242. package/dist/cjs/shared/systemControlModules.gnome.native.js +37 -0
  243. package/dist/cjs/shared/systemControlModules.gnome.native.js.map +1 -0
  244. package/dist/cjs/shared/systemControlModules.native.js +77 -0
  245. package/dist/cjs/shared/systemControlModules.native.js.map +1 -0
  246. package/dist/cjs/shared/systemControls.cjs +47 -0
  247. package/dist/cjs/shared/systemControls.native.js +51 -0
  248. package/dist/cjs/shared/systemControls.native.js.map +1 -0
  249. package/dist/cjs/shared/t.native.js.map +1 -1
  250. package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
  251. package/dist/cjs/shared/touchWebPicker.native.js.map +1 -1
  252. package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
  253. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  254. package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
  255. package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
  256. package/dist/cjs/shared/utils.native.js +1 -1
  257. package/dist/cjs/shared/utils.native.js.map +1 -1
  258. package/dist/cjs/shared/zIndex.native.js.map +1 -1
  259. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  260. package/dist/cjs/types.native.js.map +1 -1
  261. package/dist/cjs/utils/LinkCell.native.js.map +1 -1
  262. package/dist/esm/FloatingPanel/RegularPanel.mjs +139 -0
  263. package/dist/esm/FloatingPanel/RegularPanel.mjs.map +1 -0
  264. package/dist/esm/FloatingPanel/RegularPanel.native.js +141 -0
  265. package/dist/esm/FloatingPanel/RegularPanel.native.js.map +1 -0
  266. package/dist/esm/FloatingPanel/compactFace.mjs +5 -1
  267. package/dist/esm/FloatingPanel/compactFace.mjs.map +1 -1
  268. package/dist/esm/FloatingPanel/compactFace.native.js +5 -1
  269. package/dist/esm/FloatingPanel/compactFace.native.js.map +1 -1
  270. package/dist/esm/FloatingPanel/containingBlock.mjs +21 -0
  271. package/dist/esm/FloatingPanel/containingBlock.mjs.map +1 -0
  272. package/dist/esm/FloatingPanel/containingBlock.native.js +23 -0
  273. package/dist/esm/FloatingPanel/containingBlock.native.js.map +1 -0
  274. package/dist/esm/FloatingPanel/index.mjs +1 -19
  275. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  276. package/dist/esm/FloatingPanel/index.native.js +83 -49
  277. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  278. package/dist/esm/FloatingPanel/pointAnchor.mjs +25 -1
  279. package/dist/esm/FloatingPanel/pointAnchor.mjs.map +1 -1
  280. package/dist/esm/FloatingPanel/pointAnchor.native.js +26 -1
  281. package/dist/esm/FloatingPanel/pointAnchor.native.js.map +1 -1
  282. package/dist/esm/FloatingPanel/regularPlacement.mjs +35 -0
  283. package/dist/esm/FloatingPanel/regularPlacement.mjs.map +1 -0
  284. package/dist/esm/FloatingPanel/regularPlacement.native.js +36 -0
  285. package/dist/esm/FloatingPanel/regularPlacement.native.js.map +1 -0
  286. package/dist/esm/fields/Combobox/index.mjs +1 -1
  287. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  288. package/dist/esm/fields/Combobox/index.native.js +3 -1
  289. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  290. package/dist/esm/fields/Input/index.mjs +6 -1
  291. package/dist/esm/fields/Input/index.mjs.map +1 -1
  292. package/dist/esm/fields/Input/index.native.js +6 -1
  293. package/dist/esm/fields/Input/index.native.js.map +1 -1
  294. package/dist/esm/fields/Select/InlineChoices.mjs +3 -2
  295. package/dist/esm/fields/Select/InlineChoices.mjs.map +1 -1
  296. package/dist/esm/fields/Select/InlineChoices.native.js +5 -2
  297. package/dist/esm/fields/Select/InlineChoices.native.js.map +1 -1
  298. package/dist/esm/fields/Select/SheetPickerRow.mjs +129 -0
  299. package/dist/esm/fields/Select/SheetPickerRow.mjs.map +1 -0
  300. package/dist/esm/fields/Select/SheetPickerRow.native.js +137 -0
  301. package/dist/esm/fields/Select/SheetPickerRow.native.js.map +1 -0
  302. package/dist/esm/fields/Select/index.mjs +64 -5
  303. package/dist/esm/fields/Select/index.mjs.map +1 -1
  304. package/dist/esm/fields/Select/index.native.js +86 -27
  305. package/dist/esm/fields/Select/index.native.js.map +1 -1
  306. package/dist/esm/fields/Select/shouldInlineChoices.mjs +12 -1
  307. package/dist/esm/fields/Select/shouldInlineChoices.mjs.map +1 -1
  308. package/dist/esm/fields/Select/shouldInlineChoices.native.js +13 -1
  309. package/dist/esm/fields/Select/shouldInlineChoices.native.js.map +1 -1
  310. package/dist/esm/fields/Slider/index.mjs +96 -4
  311. package/dist/esm/fields/Slider/index.mjs.map +1 -1
  312. package/dist/esm/fields/Slider/index.native.js +103 -5
  313. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  314. package/dist/esm/fields/Switch/index.mjs +71 -1
  315. package/dist/esm/fields/Switch/index.mjs.map +1 -1
  316. package/dist/esm/fields/Switch/index.native.js +72 -1
  317. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  318. package/dist/esm/fields/ToggleGroup/index.mjs +67 -1
  319. package/dist/esm/fields/ToggleGroup/index.mjs.map +1 -1
  320. package/dist/esm/fields/ToggleGroup/index.native.js +75 -1
  321. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  322. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs +36 -21
  323. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
  324. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js +46 -23
  325. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  326. package/dist/esm/fields/nativeDateTime/sheetKeyboard.mjs +21 -0
  327. package/dist/esm/fields/nativeDateTime/sheetKeyboard.mjs.map +1 -0
  328. package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js +21 -0
  329. package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -0
  330. package/dist/esm/index.mjs +3 -1
  331. package/dist/esm/index.mjs.map +1 -1
  332. package/dist/esm/index.native.js +3 -1
  333. package/dist/esm/index.native.js.map +1 -1
  334. package/dist/esm/shared/overlaySizeClass.mjs +14 -0
  335. package/dist/esm/shared/overlaySizeClass.mjs.map +1 -0
  336. package/dist/esm/shared/overlaySizeClass.native.js +14 -0
  337. package/dist/esm/shared/overlaySizeClass.native.js.map +1 -0
  338. package/dist/esm/shared/sheetNavigation.mjs +47 -0
  339. package/dist/esm/shared/sheetNavigation.mjs.map +1 -0
  340. package/dist/esm/shared/sheetNavigation.native.js +97 -0
  341. package/dist/esm/shared/sheetNavigation.native.js.map +1 -0
  342. package/dist/esm/shared/systemControlModules.gnome.mjs +8 -0
  343. package/dist/esm/shared/systemControlModules.gnome.mjs.map +1 -0
  344. package/dist/esm/shared/systemControlModules.gnome.native.js +8 -0
  345. package/dist/esm/shared/systemControlModules.gnome.native.js.map +1 -0
  346. package/dist/esm/shared/systemControlModules.mjs +8 -0
  347. package/dist/esm/shared/systemControlModules.mjs.map +1 -0
  348. package/dist/esm/shared/systemControlModules.native.js +47 -0
  349. package/dist/esm/shared/systemControlModules.native.js.map +1 -0
  350. package/dist/esm/shared/systemControls.mjs +19 -0
  351. package/dist/esm/shared/systemControls.mjs.map +1 -0
  352. package/dist/esm/shared/systemControls.native.js +20 -0
  353. package/dist/esm/shared/systemControls.native.js.map +1 -0
  354. package/dist/jsx/FloatingPanel/RegularPanel.mjs +139 -0
  355. package/dist/jsx/FloatingPanel/RegularPanel.mjs.map +1 -0
  356. package/dist/jsx/FloatingPanel/RegularPanel.native.js +169 -0
  357. package/dist/jsx/FloatingPanel/RegularPanel.native.js.map +1 -0
  358. package/dist/jsx/FloatingPanel/compactFace.mjs +5 -1
  359. package/dist/jsx/FloatingPanel/compactFace.mjs.map +1 -1
  360. package/dist/jsx/FloatingPanel/compactFace.native.js +6 -0
  361. package/dist/jsx/FloatingPanel/compactFace.native.js.map +1 -1
  362. package/dist/jsx/FloatingPanel/containingBlock.mjs +21 -0
  363. package/dist/jsx/FloatingPanel/containingBlock.mjs.map +1 -0
  364. package/dist/jsx/FloatingPanel/containingBlock.native.js +51 -0
  365. package/dist/jsx/FloatingPanel/containingBlock.native.js.map +1 -0
  366. package/dist/jsx/FloatingPanel/index.mjs +1 -19
  367. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  368. package/dist/jsx/FloatingPanel/index.native.js +79 -45
  369. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  370. package/dist/jsx/FloatingPanel/pointAnchor.mjs +25 -1
  371. package/dist/jsx/FloatingPanel/pointAnchor.mjs.map +1 -1
  372. package/dist/jsx/FloatingPanel/pointAnchor.native.js +26 -0
  373. package/dist/jsx/FloatingPanel/pointAnchor.native.js.map +1 -1
  374. package/dist/jsx/FloatingPanel/regularPlacement.mjs +35 -0
  375. package/dist/jsx/FloatingPanel/regularPlacement.mjs.map +1 -0
  376. package/dist/jsx/FloatingPanel/regularPlacement.native.js +65 -0
  377. package/dist/jsx/FloatingPanel/regularPlacement.native.js.map +1 -0
  378. package/dist/jsx/fields/Combobox/index.mjs +1 -1
  379. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  380. package/dist/jsx/fields/Combobox/index.native.js +3 -1
  381. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  382. package/dist/jsx/fields/Input/index.mjs +6 -1
  383. package/dist/jsx/fields/Input/index.mjs.map +1 -1
  384. package/dist/jsx/fields/Input/index.native.js +5 -0
  385. package/dist/jsx/fields/Input/index.native.js.map +1 -1
  386. package/dist/jsx/fields/Select/InlineChoices.mjs +3 -2
  387. package/dist/jsx/fields/Select/InlineChoices.mjs.map +1 -1
  388. package/dist/jsx/fields/Select/InlineChoices.native.js +5 -2
  389. package/dist/jsx/fields/Select/InlineChoices.native.js.map +1 -1
  390. package/dist/jsx/fields/Select/SheetPickerRow.mjs +129 -0
  391. package/dist/jsx/fields/Select/SheetPickerRow.mjs.map +1 -0
  392. package/dist/jsx/fields/Select/SheetPickerRow.native.js +165 -0
  393. package/dist/jsx/fields/Select/SheetPickerRow.native.js.map +1 -0
  394. package/dist/jsx/fields/Select/index.mjs +64 -5
  395. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  396. package/dist/jsx/fields/Select/index.native.js +85 -26
  397. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  398. package/dist/jsx/fields/Select/shouldInlineChoices.mjs +12 -1
  399. package/dist/jsx/fields/Select/shouldInlineChoices.mjs.map +1 -1
  400. package/dist/jsx/fields/Select/shouldInlineChoices.native.js +15 -1
  401. package/dist/jsx/fields/Select/shouldInlineChoices.native.js.map +1 -1
  402. package/dist/jsx/fields/Slider/index.mjs +96 -4
  403. package/dist/jsx/fields/Slider/index.mjs.map +1 -1
  404. package/dist/jsx/fields/Slider/index.native.js +103 -5
  405. package/dist/jsx/fields/Slider/index.native.js.map +1 -1
  406. package/dist/jsx/fields/Switch/index.mjs +71 -1
  407. package/dist/jsx/fields/Switch/index.mjs.map +1 -1
  408. package/dist/jsx/fields/Switch/index.native.js +72 -1
  409. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  410. package/dist/jsx/fields/ToggleGroup/index.mjs +67 -1
  411. package/dist/jsx/fields/ToggleGroup/index.mjs.map +1 -1
  412. package/dist/jsx/fields/ToggleGroup/index.native.js +75 -1
  413. package/dist/jsx/fields/ToggleGroup/index.native.js.map +1 -1
  414. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs +36 -21
  415. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
  416. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js +44 -21
  417. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  418. package/dist/jsx/fields/nativeDateTime/sheetKeyboard.mjs +21 -0
  419. package/dist/jsx/fields/nativeDateTime/sheetKeyboard.mjs.map +1 -0
  420. package/dist/jsx/fields/nativeDateTime/sheetKeyboard.native.js +57 -0
  421. package/dist/jsx/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -0
  422. package/dist/jsx/index.js +3 -1
  423. package/dist/jsx/index.js.map +1 -1
  424. package/dist/jsx/index.mjs +3 -1
  425. package/dist/jsx/index.mjs.map +1 -1
  426. package/dist/jsx/index.native.js +11 -0
  427. package/dist/jsx/index.native.js.map +1 -1
  428. package/dist/jsx/shared/overlaySizeClass.mjs +14 -0
  429. package/dist/jsx/shared/overlaySizeClass.mjs.map +1 -0
  430. package/dist/jsx/shared/overlaySizeClass.native.js +45 -0
  431. package/dist/jsx/shared/overlaySizeClass.native.js.map +1 -0
  432. package/dist/jsx/shared/sheetNavigation.mjs +47 -0
  433. package/dist/jsx/shared/sheetNavigation.mjs.map +1 -0
  434. package/dist/jsx/shared/sheetNavigation.native.js +129 -0
  435. package/dist/jsx/shared/sheetNavigation.native.js.map +1 -0
  436. package/dist/jsx/shared/systemControlModules.gnome.mjs +8 -0
  437. package/dist/jsx/shared/systemControlModules.gnome.mjs.map +1 -0
  438. package/dist/jsx/shared/systemControlModules.gnome.native.js +37 -0
  439. package/dist/jsx/shared/systemControlModules.gnome.native.js.map +1 -0
  440. package/dist/jsx/shared/systemControlModules.mjs +8 -0
  441. package/dist/jsx/shared/systemControlModules.mjs.map +1 -0
  442. package/dist/jsx/shared/systemControlModules.native.js +77 -0
  443. package/dist/jsx/shared/systemControlModules.native.js.map +1 -0
  444. package/dist/jsx/shared/systemControls.mjs +19 -0
  445. package/dist/jsx/shared/systemControls.mjs.map +1 -0
  446. package/dist/jsx/shared/systemControls.native.js +51 -0
  447. package/dist/jsx/shared/systemControls.native.js.map +1 -0
  448. package/package.json +16 -8
  449. package/src/FloatingPanel/FloatingPanel.menuFace.native.spec.tsx +73 -3
  450. package/src/FloatingPanel/FloatingPanel.regularWidth.native.spec.tsx +193 -0
  451. package/src/FloatingPanel/RegularPanel.tsx +159 -0
  452. package/src/FloatingPanel/compactFace.spec.ts +24 -1
  453. package/src/FloatingPanel/compactFace.ts +16 -0
  454. package/src/FloatingPanel/containingBlock.ts +32 -0
  455. package/src/FloatingPanel/index.native.tsx +80 -35
  456. package/src/FloatingPanel/index.tsx +1 -33
  457. package/src/FloatingPanel/pointAnchor.spec.ts +29 -0
  458. package/src/FloatingPanel/pointAnchor.ts +30 -0
  459. package/src/FloatingPanel/regularPlacement.spec.ts +65 -0
  460. package/src/FloatingPanel/regularPlacement.ts +40 -0
  461. package/src/fields/Combobox/Combobox.regularWidth.native.spec.tsx +94 -0
  462. package/src/fields/Combobox/index.tsx +3 -1
  463. package/src/fields/Input/Input.formName.spec.tsx +53 -0
  464. package/src/fields/Input/index.tsx +6 -1
  465. package/src/fields/Select/InlineChoices.tsx +6 -3
  466. package/src/fields/Select/SheetPickerRow.tsx +160 -0
  467. package/src/fields/Select/index.tsx +65 -4
  468. package/src/fields/Select/shouldInlineChoices.spec.ts +21 -1
  469. package/src/fields/Select/shouldInlineChoices.ts +26 -0
  470. package/src/fields/Slider/Slider.system.native.spec.tsx +168 -0
  471. package/src/fields/Slider/index.tsx +166 -30
  472. package/src/fields/Switch/Switch.system.native.spec.tsx +162 -0
  473. package/src/fields/Switch/index.tsx +98 -0
  474. package/src/fields/ToggleGroup/ToggleGroup.system.native.spec.tsx +192 -0
  475. package/src/fields/ToggleGroup/index.tsx +111 -0
  476. package/src/fields/nativeDateTime/OsDateTimeSheet.presentation.spec.tsx +167 -0
  477. package/src/fields/nativeDateTime/OsDateTimeSheet.tsx +36 -18
  478. package/src/fields/nativeDateTime/sheetKeyboard.spec.ts +60 -0
  479. package/src/fields/nativeDateTime/sheetKeyboard.ts +45 -0
  480. package/src/index.ts +15 -0
  481. package/src/shared/overlaySizeClass.spec.ts +27 -0
  482. package/src/shared/overlaySizeClass.ts +36 -0
  483. package/src/shared/sheetNavigation.ts +82 -0
  484. package/src/shared/systemControlModules.gnome.ts +10 -0
  485. package/src/shared/systemControlModules.native.spec.ts +52 -0
  486. package/src/shared/systemControlModules.native.ts +66 -0
  487. package/src/shared/systemControlModules.ts +10 -0
  488. package/src/shared/systemControls.ts +70 -0
  489. package/types/FloatingPanel/RegularPanel.d.ts +29 -0
  490. package/types/FloatingPanel/RegularPanel.d.ts.map +1 -0
  491. package/types/FloatingPanel/compactFace.d.ts +12 -0
  492. package/types/FloatingPanel/compactFace.d.ts.map +1 -1
  493. package/types/FloatingPanel/containingBlock.d.ts +14 -0
  494. package/types/FloatingPanel/containingBlock.d.ts.map +1 -0
  495. package/types/FloatingPanel/index.d.ts.map +1 -1
  496. package/types/FloatingPanel/index.native.d.ts +6 -1
  497. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  498. package/types/FloatingPanel/pointAnchor.d.ts +12 -0
  499. package/types/FloatingPanel/pointAnchor.d.ts.map +1 -1
  500. package/types/FloatingPanel/regularPlacement.d.ts +20 -0
  501. package/types/FloatingPanel/regularPlacement.d.ts.map +1 -0
  502. package/types/fields/Combobox/index.d.ts.map +1 -1
  503. package/types/fields/Input/index.d.ts.map +1 -1
  504. package/types/fields/Select/InlineChoices.d.ts.map +1 -1
  505. package/types/fields/Select/SheetPickerRow.d.ts +23 -0
  506. package/types/fields/Select/SheetPickerRow.d.ts.map +1 -0
  507. package/types/fields/Select/index.d.ts.map +1 -1
  508. package/types/fields/Select/shouldInlineChoices.d.ts +15 -0
  509. package/types/fields/Select/shouldInlineChoices.d.ts.map +1 -1
  510. package/types/fields/Slider/index.d.ts +7 -1
  511. package/types/fields/Slider/index.d.ts.map +1 -1
  512. package/types/fields/Switch/index.d.ts +7 -1
  513. package/types/fields/Switch/index.d.ts.map +1 -1
  514. package/types/fields/ToggleGroup/index.d.ts +8 -1
  515. package/types/fields/ToggleGroup/index.d.ts.map +1 -1
  516. package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts.map +1 -1
  517. package/types/fields/nativeDateTime/sheetKeyboard.d.ts +20 -0
  518. package/types/fields/nativeDateTime/sheetKeyboard.d.ts.map +1 -0
  519. package/types/index.d.ts +4 -0
  520. package/types/index.d.ts.map +1 -1
  521. package/types/shared/overlaySizeClass.d.ts +24 -0
  522. package/types/shared/overlaySizeClass.d.ts.map +1 -0
  523. package/types/shared/sheetNavigation.d.ts +31 -0
  524. package/types/shared/sheetNavigation.d.ts.map +1 -0
  525. package/types/shared/systemControlModules.d.ts +5 -0
  526. package/types/shared/systemControlModules.d.ts.map +1 -0
  527. package/types/shared/systemControlModules.gnome.d.ts +5 -0
  528. package/types/shared/systemControlModules.gnome.d.ts.map +1 -0
  529. package/types/shared/systemControlModules.native.d.ts +20 -0
  530. package/types/shared/systemControlModules.native.d.ts.map +1 -0
  531. package/types/shared/systemControls.d.ts +53 -0
  532. package/types/shared/systemControls.d.ts.map +1 -0
@@ -55,6 +55,11 @@
55
55
  * than OVERLAY_BREAKPOINT (a tablet) it opens at the long-press point, the
56
56
  * same free overlay the web draws at the pointer; a phone keeps the sheet,
57
57
  * as web does at ≤640.
58
+ *
59
+ * Regular width (FZ-8116, LC-266): on an iPad or any window wider than
60
+ * OVERLAY_BREAKPOINT the sheet is the wrong form. The panel opens over its
61
+ * field the way the web float does (LC-105, LC-112), sized by `widthMode`;
62
+ * compact windows (iPhone, Slide Over) keep the sheet. `sheet` forces it.
58
63
  */
59
64
 
60
65
  import { nativeAnimationConfig, type MotionStop } from "@multiplatform.one/theme";
@@ -83,27 +88,25 @@ import {
83
88
  type GestureResponderEvent,
84
89
  } from "react-native";
85
90
  import { SafeAreaInsetsContext, initialWindowMetrics } from "react-native-safe-area-context";
86
- import {
87
- OVERLAY_BREAKPOINT,
88
- Surface,
89
- useResolvedKnobs,
90
- motionDurationMs,
91
- } from "@multiplatform.one/theme";
91
+ import { Surface, useResolvedKnobs, motionDurationMs } from "@multiplatform.one/theme";
92
92
  import { View, YStack } from "tamagui";
93
93
  import { useInsideOverlay, useOverlayZIndex } from "../shared/overlayStack";
94
94
  import { OverlayWindow } from "../shared/OverlayWindow";
95
95
  import { t } from "../shared/t";
96
+ import { overlaySizeClass } from "../shared/overlaySizeClass";
96
97
  import { useKeyboardInset } from "../shared/useKeyboardInset";
97
98
  import type { FloatingPanelProps } from "./index";
98
- import { resolveCompactFace } from "./compactFace";
99
+ import { menuMinWidth, resolveCompactFace } from "./compactFace";
99
100
  import {
100
101
  placeAtPoint,
102
+ placeBesideTrigger,
101
103
  placeOverTrigger,
102
104
  type PanelBounds,
103
105
  type PanelPoint,
104
106
  type TriggerRect,
105
107
  } from "./pointAnchor";
106
- import { panelViewportPadding } from "./useFloatingPanel";
108
+ import { RegularPanel } from "./RegularPanel";
109
+ import { panelViewportPadding, resolvePanelWidthMode } from "./useFloatingPanel";
107
110
  import { TrailingActionOverlay, TriggerWithTrailingAction } from "./trailingAction";
108
111
 
109
112
  // Re-export the hook + constants so Select / Combobox / external consumers
@@ -160,6 +163,9 @@ export function FloatingPanel({
160
163
  triggerRow,
161
164
  triggerEcho = true,
162
165
  anchorMode,
166
+ sheet,
167
+ widthMode,
168
+ fitContent,
163
169
  }: FloatingPanelProps) {
164
170
  // The panel floats over the page: it never inherits a painted ancestor.
165
171
  const { knobProps } = useResolvedKnobs({ painted: false });
@@ -202,15 +208,18 @@ export function FloatingPanel({
202
208
  [disabled, onOpenChange],
203
209
  );
204
210
  const isContextMenu = openOn === "contextmenu";
205
- const atPoint = isContextMenu && pressPoint !== null && windowWidth > OVERLAY_BREAKPOINT;
211
+ const regular = overlaySizeClass(windowWidth) === "regular";
212
+ const atPoint = isContextMenu && pressPoint !== null && regular;
206
213
  const insideOverlay = useInsideOverlay();
207
214
  const asMenu = !isContextMenu && resolveCompactFace(compactFace, insideOverlay) === "menu";
215
+ const asRegular = regular && !asMenu && !isContextMenu && sheet !== true;
216
+ const anchored = asMenu || asRegular;
208
217
  const triggerRef = useRef<RNView | null>(null);
209
218
  const [anchor, setAnchor] = useState<TriggerRect | null>(null);
210
219
  // The trigger's window rect, read each time the menu opens: it may have
211
220
  // moved (a scrolled sheet) since the last open.
212
221
  useLayoutEffect(() => {
213
- if (!asMenu || !open) {
222
+ if (!anchored || !open) {
214
223
  setAnchor(null);
215
224
  return;
216
225
  }
@@ -230,7 +239,7 @@ export function FloatingPanel({
230
239
  return () => {
231
240
  live = false;
232
241
  };
233
- }, [asMenu, open]);
242
+ }, [anchored, open]);
234
243
 
235
244
  const handleBackdropPress = useCallback(() => {
236
245
  if (backdropArmed) close();
@@ -582,11 +591,8 @@ export function FloatingPanel({
582
591
  <TriggerMenuPanel
583
592
  // An attached menu (an icon trigger, no echo row) opens under its
584
593
  // trigger instead of over it, the UIMenu pull-down (LC-262).
585
- anchor={
586
- anchor && anchorMode === "attach"
587
- ? { ...anchor, y: anchor.y + anchor.height }
588
- : anchor
589
- }
594
+ anchor={anchor}
595
+ attach={anchorMode === "attach"}
590
596
  bounds={{
591
597
  top: topInset + panelViewportPadding,
592
598
  left: (safeArea?.left ?? 0) + panelViewportPadding,
@@ -627,6 +633,32 @@ export function FloatingPanel({
627
633
  {header}
628
634
  {children}
629
635
  </PointPanel>
636
+ ) : asRegular ? (
637
+ <RegularPanel
638
+ anchor={anchor}
639
+ bounds={{
640
+ top: topInset + panelViewportPadding,
641
+ left: (safeArea?.left ?? 0) + panelViewportPadding,
642
+ right: windowWidth - (safeArea?.right ?? 0) - panelViewportPadding,
643
+ bottom:
644
+ windowHeight -
645
+ Math.max(safeArea?.bottom ?? 0, keyboardInset) -
646
+ panelViewportPadding,
647
+ }}
648
+ widthMode={resolvePanelWidthMode(widthMode, fitContent)}
649
+ echo={triggerEcho ? (triggerRow ?? trigger) : null}
650
+ echoLabel={triggerA11y?.label}
651
+ header={header}
652
+ scrollable={!!scrollable}
653
+ fill={!!sheetFill}
654
+ scrollViewProps={scrollViewProps}
655
+ framePadding={framePadding}
656
+ frameGap={frameGap}
657
+ onBackdropPress={handleBackdropPress}
658
+ onClose={close}
659
+ >
660
+ {children}
661
+ </RegularPanel>
630
662
  ) : (
631
663
  /*
632
664
  A plain padded column, not KeyboardAvoidingView: inside a Modal the
@@ -732,6 +764,7 @@ export function FloatingPanel({
732
764
  */
733
765
  function TriggerMenuPanel({
734
766
  anchor,
767
+ attach = false,
735
768
  bounds,
736
769
  echo,
737
770
  echoLabel,
@@ -742,6 +775,7 @@ function TriggerMenuPanel({
742
775
  children,
743
776
  }: {
744
777
  anchor: TriggerRect | null;
778
+ attach?: boolean;
745
779
  bounds: PanelBounds;
746
780
  echo: ReactNode;
747
781
  echoLabel?: string;
@@ -755,7 +789,7 @@ function TriggerMenuPanel({
755
789
  const [size, setSize] = useState<{ width: number; height: number } | null>(null);
756
790
  const placement =
757
791
  anchor && size
758
- ? placeOverTrigger({
792
+ ? (attach ? placeBesideTrigger : placeOverTrigger)({
759
793
  trigger: anchor,
760
794
  width: size.width,
761
795
  height: size.height,
@@ -782,36 +816,47 @@ function TriggerMenuPanel({
782
816
  position: "absolute",
783
817
  left: placement?.left ?? bounds.left,
784
818
  top: placement?.top ?? bounds.top,
785
- minWidth: anchor?.width ?? 0,
819
+ minWidth: menuMinWidth(anchor?.width ?? 0, bounds.right - bounds.left),
786
820
  maxWidth: bounds.right - bounds.left,
787
821
  maxHeight: placement?.maxHeight ?? bounds.bottom - bounds.top,
788
822
  opacity: placement ? 1 : 0,
789
823
  }}
790
824
  >
791
825
  <YStack
826
+ testID="floating-panel-menu-surface"
792
827
  {...knobProps.elevatedSurface}
793
828
  flexShrink={1}
794
829
  minHeight={0}
795
- overflow="hidden"
796
830
  onAccessibilityEscape={onClose}
797
831
  >
798
- {echo != null && anchor && anchor.height > 0 ? (
799
- <Pressable
800
- testID="floating-panel-menu-echo"
801
- onPress={onClose}
802
- accessibilityRole="button"
803
- {...(echoLabel ? { accessibilityLabel: echoLabel } : undefined)}
804
- aria-expanded
805
- style={{ height: anchor.height, minWidth: anchor.width, justifyContent: "center" }}
832
+ <YStack
833
+ testID="floating-panel-menu-clip"
834
+ borderRadius={knobProps.elevatedSurface.borderRadius}
835
+ overflow="hidden"
836
+ flexShrink={1}
837
+ minHeight={0}
838
+ >
839
+ {echo != null && anchor && anchor.height > 0 ? (
840
+ <Pressable
841
+ testID="floating-panel-menu-echo"
842
+ onPress={onClose}
843
+ accessibilityRole="button"
844
+ {...(echoLabel ? { accessibilityLabel: echoLabel } : undefined)}
845
+ aria-expanded
846
+ style={{ height: anchor.height, minWidth: anchor.width, justifyContent: "center" }}
847
+ >
848
+ <RNView pointerEvents="none">{echo}</RNView>
849
+ </Pressable>
850
+ ) : null}
851
+ <RNScrollView
852
+ style={{ flexGrow: 0, flexShrink: 1 }}
853
+ keyboardShouldPersistTaps="handled"
806
854
  >
807
- <RNView pointerEvents="none">{echo}</RNView>
808
- </Pressable>
809
- ) : null}
810
- <RNScrollView style={{ flexGrow: 0, flexShrink: 1 }} keyboardShouldPersistTaps="handled">
811
- <YStack padding={framePadding} gap={frameGap}>
812
- {children}
813
- </YStack>
814
- </RNScrollView>
855
+ <YStack padding={framePadding} gap={frameGap}>
856
+ {children}
857
+ </YStack>
858
+ </RNScrollView>
859
+ </YStack>
815
860
  </YStack>
816
861
  </RNView>
817
862
  </RNView>
@@ -32,6 +32,7 @@ import { OverlayStackProvider, useInsideOverlay, useOverlayZIndex } from "../sha
32
32
  import { resolveCompactFace, type CompactFace } from "./compactFace";
33
33
  import { isNestedPanelAction, type PanelActionEvent } from "./nestedAction";
34
34
  import { PanelPortal } from "./PanelPortal";
35
+ import { fixedContainingBlockOrigin } from "./containingBlock";
35
36
  import {
36
37
  contextMenuPoint,
37
38
  placeOverTrigger,
@@ -246,39 +247,6 @@ function useKeyboardFocusIntoPanel(
246
247
  }, [open, frameRef, keyboardOpenRef]);
247
248
  }
248
249
 
249
- /**
250
- * Viewport origin of the box a `position: fixed` panel is laid out against.
251
- * The top/left math is in viewport coordinates, which is only right while that
252
- * box is the viewport. An ancestor with a transform, filter, perspective,
253
- * paint containment or container query becomes the containing block instead.
254
- * PanelPortal lifts the panel out of scroll views, but a panel hosted in a
255
- * transformed dialog still lays out against that dialog. A `display: contents`
256
- * node has no box, so its computed `contain` (Tamagui's theme span) is ignored.
257
- */
258
- function fixedContainingBlockOrigin(element: HTMLElement): { top: number; left: number } {
259
- for (let node = element.parentElement; node; node = node.parentElement) {
260
- const cs = getComputedStyle(node);
261
- if (cs.display === "contents") continue;
262
- const set = (value: string | undefined, initial: string) => !!value && value !== initial;
263
- const captures =
264
- set(cs.transform, "none") ||
265
- set(cs.perspective, "none") ||
266
- set(cs.filter, "none") ||
267
- set(cs.backdropFilter, "none") ||
268
- set(cs.containerType, "normal") ||
269
- /transform|perspective|filter/.test(cs.willChange) ||
270
- /paint|layout|strict|content/.test(cs.contain);
271
- if (captures) {
272
- const rect = node.getBoundingClientRect();
273
- return {
274
- top: rect.top + node.clientTop - node.scrollTop,
275
- left: rect.left + node.clientLeft - node.scrollLeft,
276
- };
277
- }
278
- }
279
- return { top: 0, left: 0 };
280
- }
281
-
282
250
  function isRtl(element?: HTMLElement | null): boolean {
283
251
  if (!isWeb || typeof document === "undefined") return false;
284
252
  const direction = element ? getComputedStyle(element).direction : "";
@@ -3,6 +3,7 @@ import { describe, expect, it } from "vitest";
3
3
  import {
4
4
  contextMenuPoint,
5
5
  placeAtPoint,
6
+ placeBesideTrigger,
6
7
  placeOverTrigger,
7
8
  pointOpensUp,
8
9
  pointPanelLeft,
@@ -219,3 +220,31 @@ describe("placeOverTrigger (FZ-7830, LC-112 where no sheet may take it)", () =>
219
220
  expect(placed.left).toBe(10);
220
221
  });
221
222
  });
223
+
224
+ describe("placeBesideTrigger (FZ-7830 round 3, LC-262: beside the trigger, never over it)", () => {
225
+ const phone: PanelBounds = { top: 57, left: 10, right: 380, bottom: 800 };
226
+ const field = { x: 16, y: 300, width: 358, height: 44 };
227
+
228
+ it("opens under the trigger when it fits", () => {
229
+ const placed = placeBesideTrigger({ trigger: field, width: 200, height: 180, bounds: phone });
230
+ expect(placed).toEqual({ left: 16, top: 344, width: 358, maxHeight: 180, shifted: false });
231
+ });
232
+
233
+ it("opens above the trigger when there is more room there, its bottom on the trigger's top", () => {
234
+ const low = { ...field, y: 700 };
235
+ const placed = placeBesideTrigger({ trigger: low, width: 200, height: 220, bounds: phone });
236
+ expect(placed.top + placed.maxHeight).toBe(700);
237
+ expect(placed.maxHeight).toBe(220);
238
+ });
239
+
240
+ it("never overlaps the trigger, scrolling what does not fit", () => {
241
+ for (const y of [60, 300, 500, 740]) {
242
+ const trigger = { ...field, y };
243
+ const placed = placeBesideTrigger({ trigger, width: 200, height: 2000, bounds: phone });
244
+ const overlaps = placed.top < y + field.height && placed.top + placed.maxHeight > y;
245
+ expect(overlaps, `trigger at ${y}`).toBe(false);
246
+ expect(placed.top).toBeGreaterThanOrEqual(phone.top);
247
+ expect(placed.top + placed.maxHeight).toBeLessThanOrEqual(phone.bottom);
248
+ }
249
+ });
250
+ });
@@ -172,3 +172,33 @@ export function placeOverTrigger({
172
172
  shifted: left !== wantLeft || top !== trigger.y,
173
173
  };
174
174
  }
175
+
176
+ /**
177
+ * A menu attached to its trigger (an icon trigger, or a short list inside a
178
+ * sheet, LC-262): under the trigger when it fits, above it when that side has
179
+ * more room, and never over it. What still does not fit scrolls.
180
+ */
181
+ export function placeBesideTrigger({
182
+ trigger,
183
+ width,
184
+ height,
185
+ bounds,
186
+ rtl = false,
187
+ }: {
188
+ trigger: TriggerRect;
189
+ width: number;
190
+ height: number;
191
+ bounds: PanelBounds;
192
+ rtl?: boolean;
193
+ }): TriggerPlacement {
194
+ const room = Math.max(0, bounds.right - bounds.left);
195
+ const w = Math.min(Math.max(width, trigger.width), room);
196
+ const wantLeft = rtl ? trigger.x + trigger.width - w : trigger.x;
197
+ const left = Math.max(bounds.left, Math.min(wantLeft, bounds.right - w));
198
+ const below = Math.max(0, bounds.bottom - (trigger.y + trigger.height));
199
+ const above = Math.max(0, trigger.y - bounds.top);
200
+ const opensUp = height > below && above > below;
201
+ const maxHeight = Math.min(height, opensUp ? above : below);
202
+ const top = opensUp ? trigger.y - maxHeight : trigger.y + trigger.height;
203
+ return { left, top, width: w, maxHeight, shifted: left !== wantLeft || opensUp };
204
+ }
@@ -0,0 +1,65 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { placeRegularPanel } from "./regularPlacement";
3
+
4
+ const bounds = { top: 20, left: 12, right: 808, bottom: 1160 };
5
+ const trigger = { x: 40, y: 300, width: 360, height: 44 };
6
+
7
+ describe("placeRegularPanel (FZ-8116)", () => {
8
+ it("covers the field from its top start corner (LC-105)", () => {
9
+ const p = placeRegularPanel({
10
+ trigger,
11
+ width: 200,
12
+ height: 240,
13
+ bounds,
14
+ widthMode: "at-least-trigger",
15
+ });
16
+ expect(p).toMatchObject({ left: 40, top: 300, width: 360, shifted: false });
17
+ });
18
+
19
+ it("is the field's width for match-trigger even when the content is wider", () => {
20
+ const p = placeRegularPanel({
21
+ trigger,
22
+ width: 500,
23
+ height: 240,
24
+ bounds,
25
+ widthMode: "match-trigger",
26
+ });
27
+ expect(p.width).toBe(360);
28
+ });
29
+
30
+ it("is the content's width for fit-content", () => {
31
+ const p = placeRegularPanel({
32
+ trigger,
33
+ width: 300,
34
+ height: 320,
35
+ bounds,
36
+ widthMode: "fit-content",
37
+ });
38
+ expect(p).toMatchObject({ left: 40, width: 300 });
39
+ });
40
+
41
+ it("hangs a fit-content panel from the field's end edge in RTL", () => {
42
+ const p = placeRegularPanel({
43
+ trigger,
44
+ width: 300,
45
+ height: 320,
46
+ bounds,
47
+ widthMode: "fit-content",
48
+ rtl: true,
49
+ });
50
+ expect(p.left).toBe(40 + 360 - 300);
51
+ });
52
+
53
+ it("slides up inside the bounds near the bottom of the window", () => {
54
+ const low = { ...trigger, y: 1080 };
55
+ const p = placeRegularPanel({
56
+ trigger: low,
57
+ width: 360,
58
+ height: 300,
59
+ bounds,
60
+ widthMode: "at-least-trigger",
61
+ });
62
+ expect(p.top + 300).toBeLessThanOrEqual(bounds.bottom);
63
+ expect(p.shifted).toBe(true);
64
+ });
65
+ });
@@ -0,0 +1,40 @@
1
+ import {
2
+ placeOverTrigger,
3
+ type PanelBounds,
4
+ type TriggerPlacement,
5
+ type TriggerRect,
6
+ } from "./pointAnchor";
7
+ import type { PanelWidthMode } from "./useFloatingPanel";
8
+
9
+ /** Height of a regular-width panel whose list fills it (`sheetFill`): a search list. */
10
+ export const regularFillHeight = 480;
11
+
12
+ /**
13
+ * Where a FloatingPanel opens at regular width (FZ-8116): over its field, the
14
+ * web float's cover-trigger placement (LC-105), at the width its `widthMode`
15
+ * declares. `at-least-trigger` is never narrower than the field,
16
+ * `match-trigger` is the field's width, `fit-content` is the content's own
17
+ * width from the field's start edge.
18
+ */
19
+ export function placeRegularPanel({
20
+ trigger,
21
+ width,
22
+ height,
23
+ bounds,
24
+ widthMode,
25
+ rtl = false,
26
+ }: {
27
+ trigger: TriggerRect;
28
+ width: number;
29
+ height: number;
30
+ bounds: PanelBounds;
31
+ widthMode: PanelWidthMode;
32
+ rtl?: boolean;
33
+ }): TriggerPlacement {
34
+ if (widthMode === "at-least-trigger") {
35
+ return placeOverTrigger({ trigger, width, height, bounds, rtl });
36
+ }
37
+ const w = widthMode === "match-trigger" ? trigger.width : width;
38
+ const box = { ...trigger, x: rtl ? trigger.x + trigger.width - w : trigger.x, width: w };
39
+ return placeOverTrigger({ trigger: box, width: w, height, bounds, rtl });
40
+ }
@@ -0,0 +1,94 @@
1
+ /**
2
+ * FZ-8116 (LC-266): on native the Link picker (Combobox) takes the window's
3
+ * size class like Select and ColorPicker do. At regular width (an iPad) it
4
+ * opens over its field with its search inside; at compact width (iPhone,
5
+ * Slide Over) it keeps the bottom sheet.
6
+ */
7
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
8
+ import { act } from "@testing-library/react";
9
+ import type { ReactNode } from "react";
10
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
11
+ import { authorOptions } from "./authorOptions";
12
+ import { Combobox } from "./index";
13
+
14
+ const screen = vi.hoisted(() => ({ width: 820, height: 1180 }));
15
+ const sheetProps = vi.hoisted(() => [] as unknown[]);
16
+
17
+ vi.mock("tamagui", async (importOriginal) => ({
18
+ ...(await importOriginal<typeof import("tamagui")>()),
19
+ isWeb: false,
20
+ }));
21
+ vi.mock("react-native-web", async (importOriginal) => ({
22
+ ...(await importOriginal<typeof import("react-native")>()),
23
+ ActionSheetIOS: undefined,
24
+ Modal: ({ children, visible }: { children: ReactNode; visible: boolean }) =>
25
+ visible ? children : null,
26
+ useWindowDimensions: () => ({ ...screen, scale: 2, fontScale: 1 }),
27
+ }));
28
+ vi.mock("../../FloatingPanel", async (importOriginal) => {
29
+ const actual = await importOriginal<typeof import("../../FloatingPanel")>();
30
+ const native = await import("../../FloatingPanel/index.native");
31
+ return {
32
+ ...actual,
33
+ FloatingPanel: (props: Parameters<typeof native.FloatingPanel>[0]) => {
34
+ sheetProps.push(props.sheet);
35
+ return <native.FloatingPanel {...props} />;
36
+ },
37
+ };
38
+ });
39
+
40
+ beforeEach(() => {
41
+ vi.useFakeTimers();
42
+ sheetProps.length = 0;
43
+ });
44
+ afterEach(() => {
45
+ vi.restoreAllMocks();
46
+ vi.useRealTimers();
47
+ screen.width = 820;
48
+ screen.height = 1180;
49
+ });
50
+
51
+ function tap(target: Element) {
52
+ act(() => {
53
+ target.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, button: 0 }));
54
+ target.dispatchEvent(new MouseEvent("mouseup", { bubbles: true, button: 0 }));
55
+ target.dispatchEvent(new MouseEvent("click", { bubbles: true, button: 0 }));
56
+ });
57
+ act(() => {
58
+ vi.advanceTimersByTime(1);
59
+ });
60
+ }
61
+
62
+ function open() {
63
+ const view = renderWithProviders(<Combobox options={authorOptions} aria-label="Author" />);
64
+ tap(view.getByRole("button", { name: "Author" }));
65
+ return view;
66
+ }
67
+
68
+ const regular = () => document.querySelector('[data-testid="floating-panel-regular"]');
69
+ const sheet = () => document.querySelector('[data-testid="floating-panel-sheet"]');
70
+
71
+ describe("Combobox native at regular width (FZ-8116)", () => {
72
+ it("leaves the overlay form to the size class instead of forcing the sheet", () => {
73
+ renderWithProviders(<Combobox options={authorOptions} aria-label="Author" />);
74
+ expect(sheetProps.length).toBeGreaterThan(0);
75
+ expect(sheetProps.every((value) => value !== true)).toBe(true);
76
+ });
77
+
78
+ it("opens over its field on an iPad-wide window", () => {
79
+ open();
80
+ expect(regular()).not.toBeNull();
81
+ expect(sheet()).toBeNull();
82
+ });
83
+
84
+ it.each([
85
+ ["an iPhone", 390, 844],
86
+ ["iPad Slide Over", 320, 1180],
87
+ ])("keeps the bottom sheet on %s", (_name, width, height) => {
88
+ screen.width = width;
89
+ screen.height = height;
90
+ open();
91
+ expect(regular()).toBeNull();
92
+ expect(sheet()).not.toBeNull();
93
+ });
94
+ });
@@ -2509,7 +2509,9 @@ function NativeComboboxCore({
2509
2509
  <FloatingPanel
2510
2510
  open={open}
2511
2511
  onOpenChange={handleOpenChange}
2512
- sheet
2512
+ // Native leaves the form to the window's size class (FZ-8116): a sheet
2513
+ // when compact, a panel over the field at regular width.
2514
+ sheet={isWeb}
2513
2515
  // Search-driven comboboxes open the sheet tall: results stream in as
2514
2516
  // the user types, so a content-fit sheet would open as a sliver.
2515
2517
  sheetFill={Boolean(onSearch)}
@@ -0,0 +1,53 @@
1
+ import userEvent from "@testing-library/user-event";
2
+ import { describe, expect, it } from "vitest";
3
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
4
+ import { Theme } from "tamagui";
5
+ import { Input } from "./index";
6
+
7
+ function SignIn({ scheme }: { scheme: "light" | "dark" }) {
8
+ return (
9
+ <Theme name={scheme}>
10
+ <form id="sign-in" action="/login" method="post">
11
+ <Input id="username" name="username" label="Username" labelHidden />
12
+ <Input id="password" name="password" label="Password" labelHidden secureTextEntry />
13
+ <input type="hidden" name="credentialId" value="" />
14
+ </form>
15
+ </Theme>
16
+ );
17
+ }
18
+
19
+ const field = (container: HTMLElement, id: string) =>
20
+ container.querySelector<HTMLInputElement>(`input#${id}`)!;
21
+
22
+ describe("Input posts under its name in a native form (FZ-8159)", () => {
23
+ it("keeps name through typing and a scheme change, so FormData carries both fields", async () => {
24
+ const user = userEvent.setup();
25
+ const view = renderWithProviders(<SignIn scheme="light" />);
26
+ const username = field(view.container, "username");
27
+ const password = field(view.container, "password");
28
+
29
+ await user.type(username, "ash");
30
+ await user.type(password, "pikachu");
31
+ expect(username.getAttribute("name")).toBe("username");
32
+ expect(password.getAttribute("name")).toBe("password");
33
+
34
+ view.rerender(<SignIn scheme="dark" />);
35
+ await user.type(field(view.container, "username"), "!");
36
+
37
+ const form = view.container.querySelector<HTMLFormElement>("form#sign-in")!;
38
+ const posted = new FormData(form);
39
+ expect(posted.get("username")).toBe("ash!");
40
+ expect(posted.get("password")).toBe("pikachu");
41
+ expect(posted.get("credentialId")).toBe("");
42
+ });
43
+
44
+ it("a read-only field still posts under its name", () => {
45
+ const view = renderWithProviders(
46
+ <form>
47
+ <Input id="realm" name="realm" label="Realm" readOnly value="pokemon" />
48
+ </form>,
49
+ );
50
+ const posted = new FormData(view.container.querySelector("form")!);
51
+ expect(posted.get("realm")).toBe("pokemon");
52
+ });
53
+ });
@@ -11,7 +11,7 @@ import type {
11
11
  SizeTokens,
12
12
  TamaguiElement,
13
13
  } from "tamagui";
14
- import { Text } from "tamagui";
14
+ import { Text, isWeb } from "tamagui";
15
15
  import { Skeleton } from "../../Skeleton";
16
16
  import { resolveFieldInputProps } from "../../fieldDefaults";
17
17
  import { Field, FieldLayout } from "../../fieldLayout";
@@ -241,6 +241,9 @@ export function Input({
241
241
 
242
242
  const areaName =
243
243
  visibleLabel || !resolvedAriaLabel ? undefined : { "aria-label": resolvedAriaLabel };
244
+ // A native <form> posts the field under its name, and React DOM drops a
245
+ // `name` it doesn't own on every update, so the Area carries it as a prop.
246
+ const domName = isWeb && name ? { name } : undefined;
244
247
 
245
248
  const handleCopy = useCallback(
246
249
  async (text: string) => {
@@ -332,6 +335,7 @@ export function Input({
332
335
  value={inputValue ?? ""}
333
336
  readOnly
334
337
  id={id}
338
+ {...domName}
335
339
  aria-readonly="true"
336
340
  aria-required={required || undefined}
337
341
  aria-invalid={hasError || undefined}
@@ -364,6 +368,7 @@ export function Input({
364
368
  {...(placeholder !== undefined ? { placeholder } : undefined)}
365
369
  disabled={disabled}
366
370
  id={id}
371
+ {...domName}
367
372
  {...(handleChange || value !== undefined
368
373
  ? { value: inputValue ?? "" }
369
374
  : { defaultValue: inputValue })}
@@ -55,6 +55,7 @@ export function InlineChoices({
55
55
  const textColor = knobProps.textAccentColor;
56
56
  const selectedIndex = options.findIndex((option) => option.value === value);
57
57
  const tabStop = selectedIndex >= 0 ? selectedIndex : 0;
58
+ const glyphed = options.some((option) => option.icon != null);
58
59
 
59
60
  const choose = (index: number) => {
60
61
  const option = options[index];
@@ -85,9 +86,11 @@ export function InlineChoices({
85
86
  borderColor={formCommonColors.divider}
86
87
  pointerEvents="none"
87
88
  >
88
- <View flexShrink={0} alignItems="center" justifyContent="center" minWidth={18}>
89
- <IconSlot icon={option.icon} color={textColor} />
90
- </View>
89
+ {glyphed ? (
90
+ <View flexShrink={0} alignItems="center" justifyContent="center" minWidth={18}>
91
+ <IconSlot icon={option.icon} color={textColor} />
92
+ </View>
93
+ ) : null}
91
94
  <Text
92
95
  fontFamily={knobProps.body.fontFamily}
93
96
  fontWeight={knobProps.body.fontWeight}