@multiplatform.one/forms 7.81.0 → 7.81.2

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 (477) hide show
  1. package/dist/cjs/AdaptivePopup/index.cjs +1 -0
  2. package/dist/cjs/AdaptivePopup/index.native.js +3 -2
  3. package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
  4. package/dist/cjs/Button/IconButtonGroup.native.js.map +1 -1
  5. package/dist/cjs/Button/circleGlyph.native.js.map +1 -1
  6. package/dist/cjs/Button/iconButtonGroupContext.native.js.map +1 -1
  7. package/dist/cjs/Button/index.native.js +2 -2
  8. package/dist/cjs/Button/index.native.js.map +1 -1
  9. package/dist/cjs/Button/webGlass.native.js.map +1 -1
  10. package/dist/cjs/Chip/index.native.js.map +1 -1
  11. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
  12. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  13. package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  14. package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  15. package/dist/cjs/ContextualSaveBar/index.native.js +3 -3
  16. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  17. package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  18. package/dist/cjs/ControlGroup/index.native.js +1 -1
  19. package/dist/cjs/ControlGroup/index.native.js.map +1 -1
  20. package/dist/cjs/DescriptionList/index.native.js +2 -2
  21. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  22. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  23. package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
  24. package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
  25. package/dist/cjs/FieldDisplay/index.native.js +1 -1
  26. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  27. package/dist/cjs/FieldGroup.native.js.map +1 -1
  28. package/dist/cjs/FloatingPanel/PanelHeader.native.js.map +1 -1
  29. package/dist/cjs/FloatingPanel/RegularPanel.native.js.map +1 -1
  30. package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -1
  31. package/dist/cjs/FloatingPanel/containingBlock.native.js.map +1 -1
  32. package/dist/cjs/FloatingPanel/coverRect.native.js.map +1 -1
  33. package/dist/cjs/FloatingPanel/echoContext.native.js.map +1 -1
  34. package/dist/cjs/FloatingPanel/index.native.js +212 -66
  35. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  36. package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -1
  37. package/dist/cjs/FloatingPanel/paintedBox.native.js.map +1 -1
  38. package/dist/cjs/FloatingPanel/panelWidth.native.js.map +1 -1
  39. package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
  40. package/dist/cjs/FloatingPanel/regularPlacement.native.js.map +1 -1
  41. package/dist/cjs/FloatingPanel/trailingAction.native.js +1 -1
  42. package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -1
  43. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  44. package/dist/cjs/Form/index.native.js +1 -1
  45. package/dist/cjs/Form/index.native.js.map +1 -1
  46. package/dist/cjs/Form/submissionController.native.js.map +1 -1
  47. package/dist/cjs/Form/validateOn.native.js.map +1 -1
  48. package/dist/cjs/FormGrid.native.js.map +1 -1
  49. package/dist/cjs/FormSection.native.js.map +1 -1
  50. package/dist/cjs/InputParts/PasswordReveal.native.js.map +1 -1
  51. package/dist/cjs/InputParts/index.native.js.map +1 -1
  52. package/dist/cjs/InputParts/keyboardAppearance.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.native.js +5 -5
  93. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  94. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  95. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  96. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  97. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +3 -3
  98. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  99. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +2 -2
  100. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
  101. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  102. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  103. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  104. package/dist/cjs/fields/DatePicker/catalog.native.js +2 -2
  105. package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
  106. package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  107. package/dist/cjs/fields/DatePicker/index.native.js +2 -2
  108. package/dist/cjs/fields/DatePicker/parts.native.js +2 -2
  109. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  110. package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
  111. package/dist/cjs/fields/Duration/DurationWheel.native.js +1 -1
  112. package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
  113. package/dist/cjs/fields/Duration/durationWheelTypes.native.js.map +1 -1
  114. package/dist/cjs/fields/Duration/index.native.js +3 -3
  115. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  116. package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  117. package/dist/cjs/fields/FileUpload/index.native.js +2 -2
  118. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  119. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  120. package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  121. package/dist/cjs/fields/Geolocation/geoValue.native.js.map +1 -1
  122. package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -1
  123. package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -1
  124. package/dist/cjs/fields/Geolocation/index.native.js +5 -5
  125. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  126. package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
  127. package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
  128. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  129. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  130. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  131. package/dist/cjs/fields/Icon/index.native.js +3 -3
  132. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  133. package/dist/cjs/fields/ImageField/index.native.js +2 -2
  134. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  135. package/dist/cjs/fields/Input/index.native.js +3 -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.native.js.map +1 -1
  158. package/dist/cjs/fields/Select/SheetPickerRow.native.js.map +1 -1
  159. package/dist/cjs/fields/Select/index.cjs +19 -2
  160. package/dist/cjs/fields/Select/index.native.js +26 -6
  161. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  162. package/dist/cjs/fields/Select/shouldInlineChoices.native.js.map +1 -1
  163. package/dist/cjs/fields/Signature/index.native.js +2 -2
  164. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  165. package/dist/cjs/fields/Slider/index.native.js +1 -1
  166. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  167. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  168. package/dist/cjs/fields/Stepper/index.native.js +2 -2
  169. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  170. package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  171. package/dist/cjs/fields/Switch/footprint.native.js.map +1 -1
  172. package/dist/cjs/fields/Switch/index.native.js +2 -2
  173. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  174. package/dist/cjs/fields/TextArea/index.native.js +2 -2
  175. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  176. package/dist/cjs/fields/TimePicker/catalog.native.js +3 -3
  177. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
  178. package/dist/cjs/fields/TimePicker/index.native.js +2 -2
  179. package/dist/cjs/fields/TimePicker/parts.native.js +1 -1
  180. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  181. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  182. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +2 -2
  183. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  184. package/dist/cjs/fields/ToggleGroup/index.native.js +1 -1
  185. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  186. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +1 -1
  187. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  188. package/dist/cjs/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  189. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  190. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
  191. package/dist/cjs/fields/nativeSelect.native.js.map +1 -1
  192. package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
  193. package/dist/cjs/formSpacing.native.js.map +1 -1
  194. package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
  195. package/dist/cjs/index.native.js +45 -45
  196. package/dist/cjs/index.native.js.map +1 -1
  197. package/dist/cjs/keyboard/KeyboardDoneBar.native.js +1 -1
  198. package/dist/cjs/keyboard/chain.native.js.map +1 -1
  199. package/dist/cjs/keyboard/index.native.js.map +1 -1
  200. package/dist/cjs/keyboard/types.native.js.map +1 -1
  201. package/dist/cjs/requiredMarking.native.js.map +1 -1
  202. package/dist/cjs/shared/CheckGlyph.native.js.map +1 -1
  203. package/dist/cjs/shared/TimeColumn.native.js +1 -1
  204. package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
  205. package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
  206. package/dist/cjs/shared/checkedOnField.cjs +104 -0
  207. package/dist/cjs/shared/checkedOnField.native.js +117 -0
  208. package/dist/cjs/shared/checkedOnField.native.js.map +1 -0
  209. package/dist/cjs/shared/choiceRowPress.native.js.map +1 -1
  210. package/dist/cjs/shared/colorRamps.native.js.map +1 -1
  211. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  212. package/dist/cjs/shared/fieldRowContext.native.js.map +1 -1
  213. package/dist/cjs/shared/floatingList.cjs +7 -79
  214. package/dist/cjs/shared/floatingList.native.js +8 -90
  215. package/dist/cjs/shared/floatingList.native.js.map +1 -1
  216. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  217. package/dist/cjs/shared/groupContext.native.js.map +1 -1
  218. package/dist/cjs/shared/i18n.native.js.map +1 -1
  219. package/dist/cjs/shared/instantMotion.native.js.map +1 -1
  220. package/dist/cjs/shared/nativeA11y.native.js.map +1 -1
  221. package/dist/cjs/shared/nativeAutoFocus.native.js.map +1 -1
  222. package/dist/cjs/shared/overlaySizeClass.native.js.map +1 -1
  223. package/dist/cjs/shared/overlayStack.native.js.map +1 -1
  224. package/dist/cjs/shared/panelPortal.native.js.map +1 -1
  225. package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -1
  226. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
  227. package/dist/cjs/shared/restoreRetries.native.js.map +1 -1
  228. package/dist/cjs/shared/sheetNavigation.native.js.map +1 -1
  229. package/dist/cjs/shared/systemControlModules.gnome.native.js.map +1 -1
  230. package/dist/cjs/shared/systemControls.native.js.map +1 -1
  231. package/dist/cjs/shared/t.native.js.map +1 -1
  232. package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
  233. package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
  234. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  235. package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
  236. package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
  237. package/dist/cjs/shared/utils.native.js +1 -1
  238. package/dist/cjs/shared/utils.native.js.map +1 -1
  239. package/dist/cjs/shared/zIndex.native.js.map +1 -1
  240. package/dist/cjs/standardActions.native.js.map +1 -1
  241. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  242. package/dist/cjs/types.native.js.map +1 -1
  243. package/dist/cjs/utils/LinkCell.native.js.map +1 -1
  244. package/dist/esm/AdaptivePopup/index.mjs +2 -1
  245. package/dist/esm/AdaptivePopup/index.mjs.map +1 -1
  246. package/dist/esm/AdaptivePopup/index.native.js +2 -1
  247. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  248. package/dist/esm/Button/IconButtonGroup.native.js.map +1 -1
  249. package/dist/esm/Button/circleGlyph.native.js.map +1 -1
  250. package/dist/esm/Button/iconButtonGroupContext.native.js.map +1 -1
  251. package/dist/esm/Button/index.native.js.map +1 -1
  252. package/dist/esm/Button/webGlass.native.js.map +1 -1
  253. package/dist/esm/Chip/index.native.js.map +1 -1
  254. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  255. package/dist/esm/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  256. package/dist/esm/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  257. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  258. package/dist/esm/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  259. package/dist/esm/ControlGroup/index.native.js.map +1 -1
  260. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  261. package/dist/esm/ErrorSummary.native.js.map +1 -1
  262. package/dist/esm/FieldDisplay/editMode.native.js.map +1 -1
  263. package/dist/esm/FieldDisplay/formatters.native.js.map +1 -1
  264. package/dist/esm/FieldDisplay/index.native.js.map +1 -1
  265. package/dist/esm/FieldGroup.native.js.map +1 -1
  266. package/dist/esm/FloatingPanel/PanelHeader.native.js.map +1 -1
  267. package/dist/esm/FloatingPanel/RegularPanel.native.js.map +1 -1
  268. package/dist/esm/FloatingPanel/compactFace.native.js.map +1 -1
  269. package/dist/esm/FloatingPanel/containingBlock.native.js.map +1 -1
  270. package/dist/esm/FloatingPanel/coverRect.native.js.map +1 -1
  271. package/dist/esm/FloatingPanel/echoContext.native.js.map +1 -1
  272. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  273. package/dist/esm/FloatingPanel/index.native.js +174 -28
  274. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  275. package/dist/esm/FloatingPanel/nestedAction.native.js.map +1 -1
  276. package/dist/esm/FloatingPanel/paintedBox.native.js.map +1 -1
  277. package/dist/esm/FloatingPanel/panelWidth.native.js.map +1 -1
  278. package/dist/esm/FloatingPanel/pointAnchor.native.js.map +1 -1
  279. package/dist/esm/FloatingPanel/regularPlacement.native.js.map +1 -1
  280. package/dist/esm/FloatingPanel/trailingAction.native.js.map +1 -1
  281. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  282. package/dist/esm/Form/index.native.js.map +1 -1
  283. package/dist/esm/Form/submissionController.native.js.map +1 -1
  284. package/dist/esm/Form/validateOn.native.js.map +1 -1
  285. package/dist/esm/FormGrid.native.js.map +1 -1
  286. package/dist/esm/FormSection.native.js.map +1 -1
  287. package/dist/esm/InputParts/PasswordReveal.native.js.map +1 -1
  288. package/dist/esm/InputParts/index.native.js.map +1 -1
  289. package/dist/esm/InputParts/keyboardAppearance.native.js.map +1 -1
  290. package/dist/esm/Label/index.native.js.map +1 -1
  291. package/dist/esm/MediaPicker/base64.native.js.map +1 -1
  292. package/dist/esm/MediaPicker/payload.native.js.map +1 -1
  293. package/dist/esm/MediaPicker/types.native.js.map +1 -1
  294. package/dist/esm/MediaPicker/useMediaPicker.native.js.map +1 -1
  295. package/dist/esm/Skeleton/index.native.js.map +1 -1
  296. package/dist/esm/Spinner/SpinnerGlyph.native.js.map +1 -1
  297. package/dist/esm/Spinner/spinnerSize.native.js.map +1 -1
  298. package/dist/esm/Table/index.native.js.map +1 -1
  299. package/dist/esm/Wheel/haptic.native.js.map +1 -1
  300. package/dist/esm/Wheel/index.native.js.map +1 -1
  301. package/dist/esm/Wheel/wheelShared.native.js.map +1 -1
  302. package/dist/esm/actionLabel.native.js.map +1 -1
  303. package/dist/esm/fieldDefaults.native.js.map +1 -1
  304. package/dist/esm/fieldLayout.native.js.map +1 -1
  305. package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
  306. package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
  307. package/dist/esm/fields/Barcode/index.native.js.map +1 -1
  308. package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
  309. package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
  310. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  311. package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  312. package/dist/esm/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  313. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  314. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  315. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  316. package/dist/esm/fields/Checkbox/index.native.js.map +1 -1
  317. package/dist/esm/fields/ColorPicker/SystemColorField.native.js.map +1 -1
  318. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  319. package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
  320. package/dist/esm/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
  321. package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
  322. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  323. package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
  324. package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  325. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  326. package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
  327. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  328. package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -1
  329. package/dist/esm/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  330. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  331. package/dist/esm/fields/DatePicker/utils.native.js.map +1 -1
  332. package/dist/esm/fields/Duration/durationMath.native.js.map +1 -1
  333. package/dist/esm/fields/Duration/durationWheelTypes.native.js.map +1 -1
  334. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  335. package/dist/esm/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  336. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  337. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  338. package/dist/esm/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  339. package/dist/esm/fields/Geolocation/geoValue.native.js.map +1 -1
  340. package/dist/esm/fields/Geolocation/geocoder.native.js.map +1 -1
  341. package/dist/esm/fields/Geolocation/geocoderContext.native.js.map +1 -1
  342. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  343. package/dist/esm/fields/Geolocation/mapMath.native.js.map +1 -1
  344. package/dist/esm/fields/Geolocation/mapTypes.native.js.map +1 -1
  345. package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  346. package/dist/esm/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  347. package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
  348. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  349. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  350. package/dist/esm/fields/Input/index.native.js.map +1 -1
  351. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  352. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  353. package/dist/esm/fields/OTPInput/otpCellCss.native.js.map +1 -1
  354. package/dist/esm/fields/PhoneInput/dialCodes.native.js.map +1 -1
  355. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  356. package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
  357. package/dist/esm/fields/PhoneInput/regionNames.native.js.map +1 -1
  358. package/dist/esm/fields/Progress/index.native.js.map +1 -1
  359. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  360. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  361. package/dist/esm/fields/Rating/ratingMath.native.js.map +1 -1
  362. package/dist/esm/fields/Rating/types.native.js.map +1 -1
  363. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  364. package/dist/esm/fields/Select/InlineChoices.native.js.map +1 -1
  365. package/dist/esm/fields/Select/SheetPickerRow.native.js.map +1 -1
  366. package/dist/esm/fields/Select/index.mjs +19 -2
  367. package/dist/esm/fields/Select/index.mjs.map +1 -1
  368. package/dist/esm/fields/Select/index.native.js +22 -2
  369. package/dist/esm/fields/Select/index.native.js.map +1 -1
  370. package/dist/esm/fields/Select/shouldInlineChoices.native.js.map +1 -1
  371. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  372. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  373. package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
  374. package/dist/esm/fields/Stepper/index.native.js.map +1 -1
  375. package/dist/esm/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  376. package/dist/esm/fields/Switch/footprint.native.js.map +1 -1
  377. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  378. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  379. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
  380. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  381. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  382. package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
  383. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  384. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  385. package/dist/esm/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  386. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  387. package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
  388. package/dist/esm/fields/nativeSelect.native.js.map +1 -1
  389. package/dist/esm/fields/selectedOrder.native.js.map +1 -1
  390. package/dist/esm/formSpacing.native.js.map +1 -1
  391. package/dist/esm/hooks/useFocusManagement.native.js.map +1 -1
  392. package/dist/esm/index.native.js.map +1 -1
  393. package/dist/esm/keyboard/chain.native.js.map +1 -1
  394. package/dist/esm/keyboard/index.native.js.map +1 -1
  395. package/dist/esm/keyboard/types.native.js.map +1 -1
  396. package/dist/esm/requiredMarking.native.js.map +1 -1
  397. package/dist/esm/shared/CheckGlyph.native.js.map +1 -1
  398. package/dist/esm/shared/TimeColumn.native.js.map +1 -1
  399. package/dist/esm/shared/capabilityPreflight.native.js.map +1 -1
  400. package/dist/esm/shared/checkedOnField.mjs +76 -0
  401. package/dist/esm/shared/checkedOnField.mjs.map +1 -0
  402. package/dist/esm/shared/checkedOnField.native.js +86 -0
  403. package/dist/esm/shared/checkedOnField.native.js.map +1 -0
  404. package/dist/esm/shared/choiceRowPress.native.js.map +1 -1
  405. package/dist/esm/shared/colorRamps.native.js.map +1 -1
  406. package/dist/esm/shared/devWarn.native.js.map +1 -1
  407. package/dist/esm/shared/fieldRowContext.native.js.map +1 -1
  408. package/dist/esm/shared/floatingList.mjs +3 -75
  409. package/dist/esm/shared/floatingList.mjs.map +1 -1
  410. package/dist/esm/shared/floatingList.native.js +3 -85
  411. package/dist/esm/shared/floatingList.native.js.map +1 -1
  412. package/dist/esm/shared/focusManagement.native.js.map +1 -1
  413. package/dist/esm/shared/groupContext.native.js.map +1 -1
  414. package/dist/esm/shared/i18n.native.js.map +1 -1
  415. package/dist/esm/shared/instantMotion.native.js.map +1 -1
  416. package/dist/esm/shared/nativeA11y.native.js.map +1 -1
  417. package/dist/esm/shared/nativeAutoFocus.native.js.map +1 -1
  418. package/dist/esm/shared/overlaySizeClass.native.js.map +1 -1
  419. package/dist/esm/shared/overlayStack.native.js.map +1 -1
  420. package/dist/esm/shared/panelPortal.native.js.map +1 -1
  421. package/dist/esm/shared/pickerTriggerContract.native.js.map +1 -1
  422. package/dist/esm/shared/pressSlopProps.native.js.map +1 -1
  423. package/dist/esm/shared/restoreRetries.native.js.map +1 -1
  424. package/dist/esm/shared/sheetNavigation.native.js.map +1 -1
  425. package/dist/esm/shared/systemControlModules.gnome.native.js.map +1 -1
  426. package/dist/esm/shared/systemControls.native.js.map +1 -1
  427. package/dist/esm/shared/t.native.js.map +1 -1
  428. package/dist/esm/shared/tableCellContext.native.js.map +1 -1
  429. package/dist/esm/shared/useDragScroll.native.js.map +1 -1
  430. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  431. package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
  432. package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
  433. package/dist/esm/shared/utils.native.js.map +1 -1
  434. package/dist/esm/shared/zIndex.native.js.map +1 -1
  435. package/dist/esm/standardActions.native.js.map +1 -1
  436. package/dist/esm/themedPrimitives.native.js.map +1 -1
  437. package/dist/esm/types.native.js.map +1 -1
  438. package/dist/esm/utils/LinkCell.native.js.map +1 -1
  439. package/dist/jsx/AdaptivePopup/index.mjs +2 -1
  440. package/dist/jsx/AdaptivePopup/index.mjs.map +1 -1
  441. package/dist/jsx/AdaptivePopup/index.native.js +1 -0
  442. package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
  443. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  444. package/dist/jsx/FloatingPanel/index.native.js +212 -66
  445. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  446. package/dist/jsx/fields/Select/index.mjs +19 -2
  447. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  448. package/dist/jsx/fields/Select/index.native.js +22 -2
  449. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  450. package/dist/jsx/shared/checkedOnField.mjs +76 -0
  451. package/dist/jsx/shared/checkedOnField.mjs.map +1 -0
  452. package/dist/jsx/shared/checkedOnField.native.js +117 -0
  453. package/dist/jsx/shared/checkedOnField.native.js.map +1 -0
  454. package/dist/jsx/shared/floatingList.mjs +3 -75
  455. package/dist/jsx/shared/floatingList.mjs.map +1 -1
  456. package/dist/jsx/shared/floatingList.native.js +7 -89
  457. package/dist/jsx/shared/floatingList.native.js.map +1 -1
  458. package/package.json +8 -8
  459. package/src/AdaptivePopup/index.tsx +5 -2
  460. package/src/FloatingPanel/index.native.tsx +194 -20
  461. package/src/FloatingPanel/index.tsx +10 -0
  462. package/src/FloatingPanel/sheetGrabber.spec.tsx +53 -0
  463. package/src/fields/Select/Select.popUp.native.spec.tsx +276 -0
  464. package/src/fields/Select/Select.stories.tsx +16 -0
  465. package/src/fields/Select/index.tsx +18 -2
  466. package/src/shared/checkedOnField.ts +116 -0
  467. package/src/shared/floatingList.tsx +8 -116
  468. package/types/AdaptivePopup/index.d.ts.map +1 -1
  469. package/types/FloatingPanel/index.d.ts +15 -0
  470. package/types/FloatingPanel/index.d.ts.map +1 -1
  471. package/types/FloatingPanel/index.native.d.ts +8 -1
  472. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  473. package/types/fields/Select/index.d.ts.map +1 -1
  474. package/types/shared/checkedOnField.d.ts +54 -0
  475. package/types/shared/checkedOnField.d.ts.map +1 -0
  476. package/types/shared/floatingList.d.ts +2 -53
  477. package/types/shared/floatingList.d.ts.map +1 -1
@@ -0,0 +1,276 @@
1
+ /**
2
+ * FZ-8655 (LC-112, Round 40 parity): a native Select opens the way the web's
3
+ * covering Select does, a macOS pop-up. The rows are measured in the native
4
+ * FloatingPanel and placed by the placement code the web shares
5
+ * (`placeCheckedOnField`): the checked row on the field, or the first row with
6
+ * no value, and never a field echo. A list that fits shows whole, a taller one
7
+ * scrolls with its clipped edges on the safe edges. On a phone a long list
8
+ * keeps its sheet at page level.
9
+ */
10
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
11
+ import { useResolvedKnobs } from "@multiplatform.one/theme";
12
+ import { act } from "@testing-library/react";
13
+ import type { ReactNode } from "react";
14
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
15
+ import { panelViewportPadding } from "../../FloatingPanel/useFloatingPanel";
16
+ import { OverlayStackProvider } from "../../shared/overlayStack";
17
+ import { placeCheckedOnField, scrollArrowBand } from "../../shared/checkedOnField";
18
+ import { Select } from "./index";
19
+
20
+ const screen = vi.hoisted(() => ({ width: 1024, height: 1366 }));
21
+
22
+ vi.mock("tamagui", async (importOriginal) => ({
23
+ ...(await importOriginal<typeof import("tamagui")>()),
24
+ isWeb: false,
25
+ }));
26
+ vi.mock("react-native-web", async (importOriginal) => ({
27
+ ...(await importOriginal<typeof import("react-native")>()),
28
+ ActionSheetIOS: undefined,
29
+ Modal: ({ children, visible }: { children: ReactNode; visible: boolean }) =>
30
+ visible ? children : null,
31
+ useWindowDimensions: () => ({ ...screen, scale: 2, fontScale: 1 }),
32
+ }));
33
+ vi.mock("../../FloatingPanel", async (importOriginal) => {
34
+ const actual = await importOriginal<typeof import("../../FloatingPanel")>();
35
+ const native = await import("../../FloatingPanel/index.native");
36
+ return { ...actual, FloatingPanel: native.FloatingPanel };
37
+ });
38
+
39
+ const rowHeight = 44;
40
+ let band = 0;
41
+ let field = { x: 40, y: 400, width: 320, height: 44 };
42
+
43
+ beforeEach(() => {
44
+ vi.useFakeTimers();
45
+ field = { x: 40, y: 400, width: 320, height: 44 };
46
+ screen.width = 1024;
47
+ screen.height = 1366;
48
+ vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockImplementation(() => ({
49
+ ...field,
50
+ left: field.x,
51
+ top: field.y,
52
+ right: field.x + field.width,
53
+ bottom: field.y + field.height,
54
+ toJSON: () => ({}),
55
+ }));
56
+ });
57
+ afterEach(() => {
58
+ vi.restoreAllMocks();
59
+ vi.useRealTimers();
60
+ });
61
+
62
+ /** The band the panel lays out for: half this preset's menu row. */
63
+ function BandProbe() {
64
+ const { knobProps } = useResolvedKnobs({ painted: false });
65
+ band = scrollArrowBand(knobProps.menuRow.minHeight);
66
+ return null;
67
+ }
68
+
69
+ const cities = (count: number) =>
70
+ Array.from({ length: count }, (_, i) => ({ value: `c${i}`, label: `City ${i}` }));
71
+
72
+ function tap(target: Element) {
73
+ act(() => {
74
+ target.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, button: 0 }));
75
+ target.dispatchEvent(new MouseEvent("mouseup", { bubbles: true, button: 0 }));
76
+ target.dispatchEvent(new MouseEvent("click", { bubbles: true, button: 0 }));
77
+ });
78
+ act(() => {
79
+ vi.advanceTimersByTime(1);
80
+ });
81
+ }
82
+
83
+ /** RN-web parks onLayout on the node for a ResizeObserver happy-dom never fires. */
84
+ function layout(node: Element, box: { y?: number; width: number; height: number }) {
85
+ const onLayout = (node as unknown as { __reactLayoutHandler?: (event: unknown) => void })
86
+ .__reactLayoutHandler;
87
+ expect(onLayout).toBeTypeOf("function");
88
+ act(() => {
89
+ onLayout?.({ nativeEvent: { layout: { x: 0, y: 0, ...box } } });
90
+ });
91
+ }
92
+
93
+ const byTestId = (id: string) => document.querySelector<HTMLElement>(`[data-testid="${id}"]`);
94
+ const menu = () => byTestId("floating-panel-menu");
95
+ const px = (value: string | undefined) => Number.parseFloat(value ?? "");
96
+
97
+ function open({
98
+ count,
99
+ checked,
100
+ inOverlay = false,
101
+ }: {
102
+ count: number;
103
+ checked?: number;
104
+ inOverlay?: boolean;
105
+ }) {
106
+ const options = cities(count);
107
+ const select = (
108
+ <Select
109
+ aria-label="City"
110
+ options={options}
111
+ value={checked === undefined ? undefined : `c${checked}`}
112
+ />
113
+ );
114
+ const view = renderWithProviders(
115
+ <>
116
+ <BandProbe />
117
+ {inOverlay ? <OverlayStackProvider zIndex={100_000}>{select}</OverlayStackProvider> : select}
118
+ </>,
119
+ );
120
+ tap(view.getByRole("button", { name: "City" }));
121
+ return { view, options, contentHeight: count * rowHeight };
122
+ }
123
+
124
+ function measureRows(
125
+ view: ReturnType<typeof renderWithProviders>,
126
+ index: number,
127
+ contentHeight: number,
128
+ ) {
129
+ const frame = menu();
130
+ expect(frame).not.toBeNull();
131
+ layout(frame as HTMLElement, { width: 320, height: Math.min(contentHeight + 2, 900) });
132
+ layout(view.getByRole("button", { name: `City ${index}` }), {
133
+ y: index * rowHeight,
134
+ width: 320,
135
+ height: rowHeight,
136
+ });
137
+ layout(byTestId("floating-panel-menu-content") as HTMLElement, {
138
+ width: 320,
139
+ height: contentHeight,
140
+ });
141
+ }
142
+
143
+ /** The padding box the shared helper asks for, from the screen under test. */
144
+ function expected(index: number, contentHeight: number, border: number) {
145
+ return placeCheckedOnField({
146
+ fieldTop: field.y,
147
+ fieldBottom: field.y + field.height,
148
+ rowTop: index * rowHeight,
149
+ rowHeight,
150
+ contentHeight,
151
+ boundsTop: panelViewportPadding + border,
152
+ boundsBottom: screen.height - panelViewportPadding - border,
153
+ band,
154
+ });
155
+ }
156
+
157
+ function border() {
158
+ const surface = byTestId("floating-panel-menu-surface") as HTMLElement;
159
+ return Math.round(px(getComputedStyle(surface).borderTopWidth)) || 0;
160
+ }
161
+
162
+ describe("Select native pop-up (FZ-8655)", () => {
163
+ it("never echoes the field, and paints nothing until its rows are measured", () => {
164
+ const { view, contentHeight } = open({ count: 5, checked: 2 });
165
+ expect(menu()?.style.opacity).toBe("0");
166
+ measureRows(view, 2, contentHeight);
167
+ expect(menu()?.style.opacity).toBe("1");
168
+ expect(byTestId("floating-panel-menu-echo")).toBeNull();
169
+ });
170
+
171
+ it("centres the checked row on the field, the rows before it running up", () => {
172
+ const { view, contentHeight } = open({ count: 5, checked: 2 });
173
+ measureRows(view, 2, contentHeight);
174
+ const b = border();
175
+ const fit = expected(2, contentHeight, b);
176
+ expect(px(menu()?.style.top)).toBe(fit.top - b);
177
+ expect(fit.top + 2 * rowHeight).toBe(field.y);
178
+ });
179
+
180
+ it("puts the first row on the field with no value", () => {
181
+ const { view, contentHeight } = open({ count: 5 });
182
+ measureRows(view, 0, contentHeight);
183
+ const b = border();
184
+ expect(px(menu()?.style.top) + b).toBe(field.y);
185
+ });
186
+
187
+ it("shows a short list by the bottom edge whole, slid inside the safe edge", () => {
188
+ field = { ...field, y: 1300 };
189
+ const { view, contentHeight } = open({ count: 7, checked: 3 });
190
+ measureRows(view, 3, contentHeight);
191
+ const b = border();
192
+ const top = px(menu()?.style.top);
193
+ expect(top + b + contentHeight).toBe(screen.height - panelViewportPadding - b);
194
+ expect(px(menu()?.style.maxHeight)).toBe(contentHeight + 2 * b);
195
+ expect(byTestId("floating-panel-scroll-up")).toBeNull();
196
+ expect(byTestId("floating-panel-scroll-down")).toBeNull();
197
+ });
198
+
199
+ it("opens at every list length at regular width, not a sheet or a regular panel", () => {
200
+ const { view, contentHeight } = open({ count: 20, checked: 10 });
201
+ measureRows(view, 10, contentHeight);
202
+ expect(byTestId("floating-panel-sheet")).toBeNull();
203
+ expect(byTestId("floating-panel-regular")).toBeNull();
204
+ expect(byTestId("floating-panel-menu-echo")).toBeNull();
205
+ });
206
+
207
+ it("scrolls a list taller than the safe viewport, its clipped edges on the safe edges", () => {
208
+ const { view, contentHeight } = open({ count: 60, checked: 30 });
209
+ measureRows(view, 30, contentHeight);
210
+ const b = border();
211
+ const fit = expected(30, contentHeight, b);
212
+ expect(fit.scrollTop).toBeGreaterThan(0);
213
+ expect(px(menu()?.style.top)).toBe(panelViewportPadding);
214
+ expect(px(menu()?.style.maxHeight)).toBe(screen.height - 2 * panelViewportPadding);
215
+ expect(byTestId("floating-panel-scroll-up")).not.toBeNull();
216
+ expect(byTestId("floating-panel-scroll-down")).not.toBeNull();
217
+ const checkedTop = fit.top - fit.scrollTop + 30 * rowHeight;
218
+ expect(checkedTop + rowHeight / 2).toBe(field.y + field.height / 2);
219
+ });
220
+
221
+ it("keeps an arrow only on the side that's clipped", () => {
222
+ const { view, contentHeight } = open({ count: 60, checked: 1 });
223
+ measureRows(view, 1, contentHeight);
224
+ expect(byTestId("floating-panel-scroll-up")).toBeNull();
225
+ expect(byTestId("floating-panel-scroll-down")).not.toBeNull();
226
+ });
227
+
228
+ it.each([
229
+ ["top", 20],
230
+ ["middle", 640],
231
+ ["bottom", 1290],
232
+ ])("keeps the checked row inside the panel, clear of its bands, at the %s", (_name, y) => {
233
+ field = { ...field, y };
234
+ for (const checked of [0, 1, 29, 58, 59]) {
235
+ const { view, contentHeight } = open({ count: 60, checked });
236
+ measureRows(view, checked, contentHeight);
237
+ const b = border();
238
+ const fit = expected(checked, contentHeight, b);
239
+ const rowTop = fit.top - fit.scrollTop + checked * rowHeight;
240
+ expect(px(menu()?.style.top)).toBe(fit.top - b);
241
+ expect(rowTop).toBeGreaterThanOrEqual(fit.top);
242
+ expect(rowTop + rowHeight).toBeLessThanOrEqual(fit.top + fit.height);
243
+ view.unmount();
244
+ }
245
+ });
246
+
247
+ it("keeps the sheet for a long list on a phone at page level", () => {
248
+ screen.width = 390;
249
+ screen.height = 844;
250
+ open({ count: 20, checked: 10 });
251
+ expect(byTestId("floating-panel-sheet")).not.toBeNull();
252
+ expect(menu()).toBeNull();
253
+ });
254
+
255
+ it("opens a long list as a pop-up on a phone inside an overlay", () => {
256
+ screen.width = 390;
257
+ screen.height = 844;
258
+ field = { ...field, y: 300 };
259
+ const { view, contentHeight } = open({ count: 20, checked: 10, inOverlay: true });
260
+ measureRows(view, 10, contentHeight);
261
+ expect(byTestId("floating-panel-sheet")).toBeNull();
262
+ expect(byTestId("floating-panel-menu-echo")).toBeNull();
263
+ const b = border();
264
+ expect(px(menu()?.style.top)).toBe(expected(10, contentHeight, b).top - b);
265
+ });
266
+
267
+ it("keeps a short list inside an overlay attached beside its field (LC-262)", () => {
268
+ screen.width = 390;
269
+ screen.height = 844;
270
+ open({ count: 4, checked: 1, inOverlay: true });
271
+ const frame = menu() as HTMLElement;
272
+ layout(frame, { width: 320, height: 178 });
273
+ expect(frame.style.opacity).toBe("1");
274
+ expect(px(frame.style.top)).toBe(field.y + field.height);
275
+ });
276
+ });
@@ -623,3 +623,19 @@ export const LowOnPage: StoryObj<{ spaceAbove: number; count: number }> = {
623
623
  );
624
624
  },
625
625
  };
626
+
627
+ /**
628
+ * LC-112 (FZ-8655): a field mid-screen. A list taller than the safe viewport
629
+ * reaches both safe edges and scrolls under its bands, the checked row on the
630
+ * field.
631
+ */
632
+ export const MidOnPage: StoryObj<{ spaceAbove: number; count: number }> = {
633
+ ...LowOnPage,
634
+ args: { ...LowOnPage.args, spaceAbove: 440 },
635
+ };
636
+
637
+ /** LC-112 (FZ-8655): a short list by the bottom edge shows whole, slid inside the safe edge. */
638
+ export const ShortLowOnPage: StoryObj<{ spaceAbove: number; count: number }> = {
639
+ ...LowOnPage,
640
+ args: { ...LowOnPage.args, count: 7 },
641
+ };
@@ -1247,6 +1247,7 @@ function NativeSelectCore({
1247
1247
  const insideOverlay = useInsideOverlay();
1248
1248
  const compactFace = pickerCompactFace(options.length);
1249
1249
  const asMenu = resolveCompactFace(compactFace, insideOverlay) === "menu";
1250
+ const beside = asMenu && insideOverlay && opensBesideTrigger(options.length);
1250
1251
  const hydrationTouch = useTouchSurface();
1251
1252
  const describedBy = useFieldDescribedBy();
1252
1253
  const fieldA11y = useFieldA11y();
@@ -1310,6 +1311,13 @@ function NativeSelectCore({
1310
1311
  }
1311
1312
  }, [open, selectedIndex]);
1312
1313
 
1314
+ // LC-112 (FZ-8655): the native pop-up puts this row on the field, measured
1315
+ // fresh each open.
1316
+ const [onFieldRow, setOnFieldRow] = useState<{ top: number; height: number } | null>(null);
1317
+ useEffect(() => {
1318
+ if (!open) setOnFieldRow(null);
1319
+ }, [open]);
1320
+
1313
1321
  const handleSelect = useCallback(
1314
1322
  (optionValue: string) => {
1315
1323
  if (multiple) {
@@ -1454,6 +1462,12 @@ function NativeSelectCore({
1454
1462
  accessibilityRole="button"
1455
1463
  accessibilityLabel={option.label}
1456
1464
  accessibilityState={{ selected }}
1465
+ onLayout={
1466
+ i === Math.max(selectedIndex, 0)
1467
+ ? ({ nativeEvent: { layout } }) =>
1468
+ setOnFieldRow({ top: layout.y, height: layout.height })
1469
+ : undefined
1470
+ }
1457
1471
  >
1458
1472
  {row}
1459
1473
  </RNPressable>
@@ -1555,9 +1569,11 @@ function NativeSelectCore({
1555
1569
  // sheet at page level and opens as a menu inside another overlay (FZ-7830).
1556
1570
  compactFace={compactFace}
1557
1571
  panelWidth={panelWidth}
1558
- {...(asMenu && insideOverlay && opensBesideTrigger(options.length)
1572
+ {...(beside
1559
1573
  ? { anchorMode: "attach" as const, triggerEcho: false }
1560
- : null)}
1574
+ : isWeb || displayOptions.length === 0
1575
+ ? null
1576
+ : { popUp: { row: onFieldRow } })}
1561
1577
  triggerA11y={{
1562
1578
  label: ariaLabel ?? fieldA11y?.label,
1563
1579
  value: triggerValueText,
@@ -0,0 +1,116 @@
1
+ export const scrollArrowThreshold = 8;
2
+
3
+ /**
4
+ * A scroll arrow's band: half a menu row, opaque in the panel's own fill.
5
+ * Rows scroll under it, and a row cut at a clipped edge hides under it
6
+ * (FZ-8557, LC-112).
7
+ */
8
+ export function scrollArrowBand(rowHeight: number): number {
9
+ return Math.round(rowHeight / 2);
10
+ }
11
+
12
+ export interface ArrowBandFit {
13
+ /** The padding box's top edge, in viewport pixels. */
14
+ top: number;
15
+ /** The padding box's visible height. */
16
+ height: number;
17
+ scrollTop: number;
18
+ }
19
+
20
+ export interface CheckedOnFieldInput {
21
+ /** The field's edges, in viewport pixels: the checked row centres on them. */
22
+ fieldTop: number;
23
+ fieldBottom: number;
24
+ /** The checked row's offset in the scroll content, and its height. */
25
+ rowTop: number;
26
+ rowHeight: number;
27
+ /** The scroll content's full height. */
28
+ contentHeight: number;
29
+ /** The safe edges the panel's padding box may reach. */
30
+ boundsTop: number;
31
+ boundsBottom: number;
32
+ band: number;
33
+ threshold?: number;
34
+ }
35
+
36
+ const clamp = (value: number, low: number, high: number) => Math.max(low, Math.min(high, value));
37
+
38
+ /**
39
+ * A Select covering its field opens the way a macOS pop-up does: its checked
40
+ * row sits on the field, centred on it, so the value stays where the closed
41
+ * field drew it (FZ-8557, LC-112).
42
+ *
43
+ * A list that fits between the safe edges shows every row with no scrolling,
44
+ * slid the least distance that keeps it on screen. A taller list keeps the
45
+ * checked row on the field and clips at the safe edges: a clipped edge sits on
46
+ * the safe edge, and the rows past it scroll under the opaque arrow band there.
47
+ * The checked row is never under a band; where one would cover it, the panel
48
+ * or the list shifts by that much. Returns the padding box.
49
+ */
50
+ export function placeCheckedOnField(input: CheckedOnFieldInput): ArrowBandFit {
51
+ const { fieldTop, fieldBottom, rowTop, rowHeight, contentHeight, boundsTop, boundsBottom, band } =
52
+ input;
53
+ const threshold = input.threshold ?? scrollArrowThreshold;
54
+ const target = clamp(
55
+ (fieldTop + fieldBottom) / 2 - rowHeight / 2,
56
+ boundsTop,
57
+ boundsBottom - rowHeight,
58
+ );
59
+ if (contentHeight <= boundsBottom - boundsTop) {
60
+ const top = clamp(target - rowTop, boundsTop, boundsBottom - contentHeight);
61
+ return { top, height: contentHeight, scrollTop: 0 };
62
+ }
63
+ let top = target - rowTop;
64
+ let scrollTop = 0;
65
+ if (top < boundsTop) {
66
+ scrollTop = boundsTop - top;
67
+ top = boundsTop;
68
+ }
69
+ const end = () => top - scrollTop + contentHeight;
70
+ const bottom = () => Math.min(boundsBottom, end());
71
+ const checkedTop = () => top - scrollTop + rowTop;
72
+ // Clear of the down band: the panel's top lifts first, then the list scrolls.
73
+ if (end() - bottom() > threshold) {
74
+ const short = checkedTop() + rowHeight - (bottom() - band);
75
+ if (short > 0) {
76
+ const lift = scrollTop > 0 ? 0 : Math.min(short, top - boundsTop);
77
+ top -= lift;
78
+ scrollTop += short - lift;
79
+ }
80
+ }
81
+ // Clear of the up band: the list drops, never past its start.
82
+ if (scrollTop > threshold) {
83
+ const short = top + band - checkedTop();
84
+ if (short > 0) scrollTop = Math.max(0, scrollTop - short);
85
+ }
86
+ // A scroll too small to show an arrow is the panel's own offset instead.
87
+ if (scrollTop > 0 && scrollTop <= threshold) {
88
+ top += scrollTop;
89
+ scrollTop = 0;
90
+ }
91
+ return { top, height: bottom() - top, scrollTop };
92
+ }
93
+
94
+ /**
95
+ * A scrolled list whose panel stops short of a safe edge grows toward it, the
96
+ * way a macOS menu does: the edge follows the rows until it meets the safe
97
+ * edge, and the rows stay where the scroll put them (FZ-8463, FZ-8557). The
98
+ * panel never shrinks. Takes and returns the padding box.
99
+ */
100
+ export function growOnScroll({
101
+ top,
102
+ height,
103
+ scrollTop,
104
+ contentHeight,
105
+ boundsTop,
106
+ boundsBottom,
107
+ }: ArrowBandFit & {
108
+ contentHeight: number;
109
+ boundsTop: number;
110
+ boundsBottom: number;
111
+ }): ArrowBandFit {
112
+ const origin = top - scrollTop;
113
+ const nextTop = Math.min(top, Math.max(boundsTop, origin));
114
+ const nextBottom = Math.max(top + height, Math.min(boundsBottom, origin + contentHeight));
115
+ return { top: nextTop, height: nextBottom - nextTop, scrollTop: nextTop - origin };
116
+ }
@@ -4,6 +4,7 @@ import { CaretDownIcon, CaretUpIcon } from "@phosphor-icons/react";
4
4
  import { useResolvedKnobs } from "@multiplatform.one/theme";
5
5
  import { View } from "tamagui";
6
6
  import { FocusContext } from "../InputParts";
7
+ import { scrollArrowBand } from "./checkedOnField";
7
8
 
8
9
  const dropdownMaxRadiusTokenNum = 8;
9
10
 
@@ -24,122 +25,13 @@ export function SyncFocusToOpen({ open }: { open: boolean }) {
24
25
  return null;
25
26
  }
26
27
 
27
- export const scrollArrowThreshold = 8;
28
-
29
- /**
30
- * A scroll arrow's band: half a menu row, opaque in the panel's own fill.
31
- * Rows scroll under it, and a row cut at a clipped edge hides under it
32
- * (FZ-8557, LC-112).
33
- */
34
- export function scrollArrowBand(rowHeight: number): number {
35
- return Math.round(rowHeight / 2);
36
- }
37
-
38
- export interface ArrowBandFit {
39
- /** The padding box's top edge, in viewport pixels. */
40
- top: number;
41
- /** The padding box's visible height. */
42
- height: number;
43
- scrollTop: number;
44
- }
45
-
46
- export interface CheckedOnFieldInput {
47
- /** The field's edges, in viewport pixels: the checked row centres on them. */
48
- fieldTop: number;
49
- fieldBottom: number;
50
- /** The checked row's offset in the scroll content, and its height. */
51
- rowTop: number;
52
- rowHeight: number;
53
- /** The scroll content's full height. */
54
- contentHeight: number;
55
- /** The safe edges the panel's padding box may reach. */
56
- boundsTop: number;
57
- boundsBottom: number;
58
- band: number;
59
- threshold?: number;
60
- }
61
-
62
- const clamp = (value: number, low: number, high: number) => Math.max(low, Math.min(high, value));
63
-
64
- /**
65
- * A Select covering its field opens the way a macOS pop-up does: its checked
66
- * row sits on the field, centred on it, so the value stays where the closed
67
- * field drew it (FZ-8557, LC-112).
68
- *
69
- * A list that fits between the safe edges shows every row with no scrolling,
70
- * slid the least distance that keeps it on screen. A taller list keeps the
71
- * checked row on the field and clips at the safe edges: a clipped edge sits on
72
- * the safe edge, and the rows past it scroll under the opaque arrow band there.
73
- * The checked row is never under a band; where one would cover it, the panel
74
- * or the list shifts by that much. Returns the padding box.
75
- */
76
- export function placeCheckedOnField(input: CheckedOnFieldInput): ArrowBandFit {
77
- const { fieldTop, fieldBottom, rowTop, rowHeight, contentHeight, boundsTop, boundsBottom, band } =
78
- input;
79
- const threshold = input.threshold ?? scrollArrowThreshold;
80
- const target = clamp(
81
- (fieldTop + fieldBottom) / 2 - rowHeight / 2,
82
- boundsTop,
83
- boundsBottom - rowHeight,
84
- );
85
- if (contentHeight <= boundsBottom - boundsTop) {
86
- const top = clamp(target - rowTop, boundsTop, boundsBottom - contentHeight);
87
- return { top, height: contentHeight, scrollTop: 0 };
88
- }
89
- let top = target - rowTop;
90
- let scrollTop = 0;
91
- if (top < boundsTop) {
92
- scrollTop = boundsTop - top;
93
- top = boundsTop;
94
- }
95
- const end = () => top - scrollTop + contentHeight;
96
- const bottom = () => Math.min(boundsBottom, end());
97
- const checkedTop = () => top - scrollTop + rowTop;
98
- // Clear of the down band: the panel's top lifts first, then the list scrolls.
99
- if (end() - bottom() > threshold) {
100
- const short = checkedTop() + rowHeight - (bottom() - band);
101
- if (short > 0) {
102
- const lift = scrollTop > 0 ? 0 : Math.min(short, top - boundsTop);
103
- top -= lift;
104
- scrollTop += short - lift;
105
- }
106
- }
107
- // Clear of the up band: the list drops, never past its start.
108
- if (scrollTop > threshold) {
109
- const short = top + band - checkedTop();
110
- if (short > 0) scrollTop = Math.max(0, scrollTop - short);
111
- }
112
- // A scroll too small to show an arrow is the panel's own offset instead.
113
- if (scrollTop > 0 && scrollTop <= threshold) {
114
- top += scrollTop;
115
- scrollTop = 0;
116
- }
117
- return { top, height: bottom() - top, scrollTop };
118
- }
119
-
120
- /**
121
- * A scrolled list whose panel stops short of a safe edge grows toward it, the
122
- * way a macOS menu does: the edge follows the rows until it meets the safe
123
- * edge, and the rows stay where the scroll put them (FZ-8463, FZ-8557). The
124
- * panel never shrinks. Takes and returns the padding box.
125
- */
126
- export function growOnScroll({
127
- top,
128
- height,
129
- scrollTop,
130
- contentHeight,
131
- boundsTop,
132
- boundsBottom,
133
- }: ArrowBandFit & {
134
- contentHeight: number;
135
- boundsTop: number;
136
- boundsBottom: number;
137
- }): ArrowBandFit {
138
- const origin = top - scrollTop;
139
- const nextTop = Math.min(top, Math.max(boundsTop, origin));
140
- const nextBottom = Math.max(top + height, Math.min(boundsBottom, origin + contentHeight));
141
- return { top: nextTop, height: nextBottom - nextTop, scrollTop: nextTop - origin };
142
- }
28
+ export {
29
+ growOnScroll,
30
+ placeCheckedOnField,
31
+ scrollArrowBand,
32
+ scrollArrowThreshold,
33
+ } from "./checkedOnField";
34
+ export type { ArrowBandFit, CheckedOnFieldInput } from "./checkedOnField";
143
35
 
144
36
  // ── Scroll Arrow (sticky inside scrollable panels) ────────────
145
37
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AdaptivePopup/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AA6Bf,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,uCAAuC;IACvC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC;;;;OAIG;IACH,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;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrD,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,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;AAyFD,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,EACR,SAAS,EACT,WAAoB,EACpB,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,cAAc,GACf,EAAE,kBAAkB,2CAkUpB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AdaptivePopup/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AA6Bf,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,uCAAuC;IACvC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC;;;;OAIG;IACH,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;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrD,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,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;AAyFD,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,EACR,SAAS,EACT,WAAoB,EACpB,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,cAAc,GACf,EAAE,kBAAkB,2CAqUpB"}
@@ -38,6 +38,21 @@ export interface FloatingPanelProps {
38
38
  * it opens down from the button's top edge, or up from its bottom edge.
39
39
  */
40
40
  iconCover?: boolean;
41
+ /**
42
+ * Native only: the panel opens the way a macOS pop-up does (LC-112, FZ-8655).
43
+ * `row` is the row that sits on the trigger, its offset and height in the
44
+ * panel's content, `null` until the caller has measured it. There's no
45
+ * trigger echo, a list that fits the safe edges shows whole, and a taller one
46
+ * scrolls under opaque arrow bands (`placeCheckedOnField`). At regular width
47
+ * this is the panel's face at every list length, so a Select never takes
48
+ * RegularPanel's echo or a sheet there.
49
+ */
50
+ popUp?: {
51
+ row: {
52
+ top: number;
53
+ height: number;
54
+ } | null;
55
+ };
41
56
  /**
42
57
  * Optional control rendered beside the trigger but OUTSIDE the native press
43
58
  * capture (e.g. DatePicker/ColorPicker clear). On native the trigger subtree
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/FloatingPanel/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/FloatingPanel/index.tsx"],"names":[],"mappings":"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"}
@@ -61,6 +61,13 @@
61
61
  * OVERLAY_BREAKPOINT the sheet is the wrong form. The panel opens over its
62
62
  * field the way the web float does (LC-105, LC-112), sized by `widthMode`;
63
63
  * compact windows (iPhone, Slide Over) keep the sheet. `sheet` forces it.
64
+ *
65
+ * Pop-up (`popUp`, FZ-8655): a Select's menu face opens the way a macOS pop-up
66
+ * does, as the web's covering Select does. The rows are measured here, the
67
+ * caller reports the row that goes on the field, and `placeCheckedOnField`
68
+ * (shared with the web) places the panel. It's a touch list, so a panel keeps
69
+ * its box as it scrolls, as a UIMenu does, where a pointer's grows
70
+ * (`growOnScroll`).
64
71
  */
65
72
  import type { FloatingPanelProps } from "./index";
66
73
  export { useFloatingPanel, panelAnimationDuration, panelGrowDuration, panelTransition, panelViewportPadding, } from "./useFloatingPanel";
@@ -69,7 +76,7 @@ export type { FloatingPanelProps } from "./index";
69
76
  export { floatingPanelActionProps, isNestedPanelAction } from "./nestedAction";
70
77
  /** Native never has a >sm web viewport; AdaptivePopup uses this to pick Sheet mode. */
71
78
  export declare function useViewportGtSm(): boolean;
72
- export declare function FloatingPanel({ open, onOpenChange, onNativeShow, trigger, triggerEnd, triggerSizing, children: panelChildren, scrollable, disabled, contentPadding, header, scrollViewProps, triggerA11y, sheetFill, openOn, compactFace, triggerRow, triggerEcho, coverAlign, iconCover, anchorMode, panelWidth, sheet, widthMode, fitContent, }: FloatingPanelProps): import("react/jsx-runtime").JSX.Element;
79
+ export declare function FloatingPanel({ open, onOpenChange, onNativeShow, trigger, triggerEnd, triggerSizing, children: panelChildren, scrollable, disabled, contentPadding, header, scrollViewProps, triggerA11y, sheetFill, openOn, compactFace, triggerRow, triggerEcho, coverAlign, iconCover, popUp, anchorMode, panelWidth, sheet, widthMode, fitContent, }: FloatingPanelProps): import("react/jsx-runtime").JSX.Element;
73
80
  /** Web only: native echoes the trigger inside its own menu face. */
74
81
  export declare function TriggerEchoRow(_props: {
75
82
  [key: string]: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../src/FloatingPanel/index.native.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAoCH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAyBlD,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,uFAAuF;AACvF,wBAAgB,eAAe,YAE9B;AAiBD,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,UAAU,EACV,aAAyB,EACzB,QAAQ,EAAE,aAAa,EACvB,UAAU,EACV,QAAQ,EACR,cAA0B,EAC1B,MAAM,EACN,eAAe,EACf,WAAW,EACX,SAAS,EACT,MAAgB,EAChB,WAAW,EACX,UAAU,EACV,WAAkB,EAClB,UAAoB,EACpB,SAAiB,EACjB,UAAU,EACV,UAAsB,EACtB,KAAK,EACL,SAAS,EACT,UAAU,GACX,EAAE,kBAAkB,2CA6nBpB;AAkRD,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,IAAI,CAEvE;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,OAAO,EACtB,SAAS,EAAE,OAAO,EAClB,QAAQ,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B,IAAI,CAAG"}
1
+ {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../src/FloatingPanel/index.native.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AAwDH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAyBlD,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,uFAAuF;AACvF,wBAAgB,eAAe,YAE9B;AAiBD,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,UAAU,EACV,aAAyB,EACzB,QAAQ,EAAE,aAAa,EACvB,UAAU,EACV,QAAQ,EACR,cAA0B,EAC1B,MAAM,EACN,eAAe,EACf,WAAW,EACX,SAAS,EACT,MAAgB,EAChB,WAAW,EACX,UAAU,EACV,WAAkB,EAClB,UAAoB,EACpB,SAAiB,EACjB,KAAK,EACL,UAAU,EACV,UAAsB,EACtB,KAAK,EACL,SAAS,EACT,UAAU,GACX,EAAE,kBAAkB,2CA8nBpB;AAmaD,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,IAAI,CAEvE;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,OAAO,EACtB,SAAS,EAAE,OAAO,EAClB,QAAQ,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B,IAAI,CAAG"}