@multiplatform.one/forms 7.71.0 → 7.72.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 (667) hide show
  1. package/dist/cjs/AdaptivePopup/index.native.js +2 -2
  2. package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
  3. package/dist/cjs/Button/IconButtonGroup.native.js.map +1 -1
  4. package/dist/cjs/Button/iconButtonGroupContext.native.js.map +1 -1
  5. package/dist/cjs/Button/index.cjs +16 -0
  6. package/dist/cjs/Button/index.native.js +18 -2
  7. package/dist/cjs/Button/index.native.js.map +1 -1
  8. package/dist/cjs/Button/mediaPlate.native.js.map +1 -1
  9. package/dist/cjs/Chip/index.native.js.map +1 -1
  10. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
  11. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  12. package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  13. package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  14. package/dist/cjs/ContextualSaveBar/index.native.js +3 -3
  15. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  16. package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  17. package/dist/cjs/ControlGroup/index.native.js +1 -1
  18. package/dist/cjs/ControlGroup/index.native.js.map +1 -1
  19. package/dist/cjs/DescriptionList/index.native.js +2 -2
  20. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  21. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  22. package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
  23. package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
  24. package/dist/cjs/FieldDisplay/index.native.js +1 -1
  25. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  26. package/dist/cjs/FieldGroup.native.js.map +1 -1
  27. package/dist/cjs/FloatingPanel/RegularPanel.native.js.map +1 -1
  28. package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -1
  29. package/dist/cjs/FloatingPanel/containingBlock.native.js.map +1 -1
  30. package/dist/cjs/FloatingPanel/echoContext.cjs +39 -0
  31. package/dist/cjs/FloatingPanel/echoContext.native.js +42 -0
  32. package/dist/cjs/FloatingPanel/echoContext.native.js.map +1 -0
  33. package/dist/cjs/FloatingPanel/index.cjs +212 -80
  34. package/dist/cjs/FloatingPanel/index.native.js +92 -17
  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/panelWidth.cjs +92 -0
  38. package/dist/cjs/FloatingPanel/panelWidth.native.js +99 -0
  39. package/dist/cjs/FloatingPanel/panelWidth.native.js.map +1 -0
  40. package/dist/cjs/FloatingPanel/pointAnchor.cjs +15 -5
  41. package/dist/cjs/FloatingPanel/pointAnchor.native.js +15 -5
  42. package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
  43. package/dist/cjs/FloatingPanel/regularPlacement.native.js.map +1 -1
  44. package/dist/cjs/FloatingPanel/trailingAction.native.js +1 -1
  45. package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -1
  46. package/dist/cjs/FloatingPanel/useFloatingPanel.cjs +58 -4
  47. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js +69 -4
  48. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  49. package/dist/cjs/Form/index.native.js +1 -1
  50. package/dist/cjs/Form/index.native.js.map +1 -1
  51. package/dist/cjs/Form/submissionController.native.js.map +1 -1
  52. package/dist/cjs/Form/validateOn.native.js.map +1 -1
  53. package/dist/cjs/FormGrid.native.js.map +1 -1
  54. package/dist/cjs/FormSection.native.js.map +1 -1
  55. package/dist/cjs/InputParts/PasswordReveal.native.js.map +1 -1
  56. package/dist/cjs/InputParts/index.cjs +18 -0
  57. package/dist/cjs/InputParts/index.native.js +19 -1
  58. package/dist/cjs/InputParts/index.native.js.map +1 -1
  59. package/dist/cjs/Label/index.native.js.map +1 -1
  60. package/dist/cjs/MediaPicker/base64.native.js.map +1 -1
  61. package/dist/cjs/MediaPicker/payload.native.js.map +1 -1
  62. package/dist/cjs/MediaPicker/types.native.js.map +1 -1
  63. package/dist/cjs/MediaPicker/useMediaPicker.native.js.map +1 -1
  64. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  65. package/dist/cjs/Spinner/SpinnerGlyph.native.js.map +1 -1
  66. package/dist/cjs/Spinner/spinnerSize.native.js.map +1 -1
  67. package/dist/cjs/Table/index.native.js.map +1 -1
  68. package/dist/cjs/Wheel/NativeWheel.native.js +1 -1
  69. package/dist/cjs/Wheel/NativeWheel.native.js.map +1 -1
  70. package/dist/cjs/Wheel/haptic.native.js.map +1 -1
  71. package/dist/cjs/Wheel/index.cjs +2 -1
  72. package/dist/cjs/Wheel/index.native.js +4 -1
  73. package/dist/cjs/Wheel/index.native.js.map +1 -1
  74. package/dist/cjs/Wheel/wheelShared.cjs +6 -1
  75. package/dist/cjs/Wheel/wheelShared.native.js +7 -1
  76. package/dist/cjs/Wheel/wheelShared.native.js.map +1 -1
  77. package/dist/cjs/actionLabel.native.js.map +1 -1
  78. package/dist/cjs/fieldDefaults.native.js.map +1 -1
  79. package/dist/cjs/fieldLayout.native.js +1 -1
  80. package/dist/cjs/fieldLayout.native.js.map +1 -1
  81. package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
  82. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +1 -1
  83. package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
  84. package/dist/cjs/fields/Barcode/index.native.js +2 -2
  85. package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
  86. package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
  87. package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
  88. package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -1
  89. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  90. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  91. package/dist/cjs/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  92. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  93. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +1 -1
  94. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  95. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  96. package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
  97. package/dist/cjs/fields/ColorPicker/SystemColorField.native.js.map +1 -1
  98. package/dist/cjs/fields/ColorPicker/index.native.js +2 -2
  99. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  100. package/dist/cjs/fields/ColorPicker/parts.native.js +2 -2
  101. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  102. package/dist/cjs/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
  103. package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
  104. package/dist/cjs/fields/Combobox/index.cjs +1 -0
  105. package/dist/cjs/fields/Combobox/index.native.js +6 -5
  106. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  107. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  108. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  109. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  110. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.cjs +6 -30
  111. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +14 -37
  112. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  113. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +2 -2
  114. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  115. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
  116. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  117. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  118. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  119. package/dist/cjs/fields/DatePicker/catalog.cjs +2 -28
  120. package/dist/cjs/fields/DatePicker/catalog.native.js +4 -32
  121. package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
  122. package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  123. package/dist/cjs/fields/DatePicker/index.native.js +2 -2
  124. package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
  125. package/dist/cjs/fields/DatePicker/parts.cjs +11 -20
  126. package/dist/cjs/fields/DatePicker/parts.native.js +15 -24
  127. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  128. package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
  129. package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
  130. package/dist/cjs/fields/Duration/index.native.js +3 -3
  131. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  132. package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  133. package/dist/cjs/fields/FileUpload/index.native.js +2 -2
  134. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  135. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  136. package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  137. package/dist/cjs/fields/Geolocation/geoValue.native.js.map +1 -1
  138. package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -1
  139. package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -1
  140. package/dist/cjs/fields/Geolocation/index.native.js +5 -5
  141. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  142. package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
  143. package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
  144. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  145. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  146. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  147. package/dist/cjs/fields/Icon/index.native.js +3 -3
  148. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  149. package/dist/cjs/fields/ImageField/index.native.js +2 -2
  150. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  151. package/dist/cjs/fields/Input/index.native.js +3 -3
  152. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  153. package/dist/cjs/fields/MentionInput/index.native.js +3 -3
  154. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  155. package/dist/cjs/fields/OTPInput/index.native.js +3 -3
  156. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  157. package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
  158. package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
  159. package/dist/cjs/fields/PhoneInput/index.native.js +3 -3
  160. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  161. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  162. package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -1
  163. package/dist/cjs/fields/Progress/index.native.js +1 -1
  164. package/dist/cjs/fields/Progress/index.native.js.map +1 -1
  165. package/dist/cjs/fields/RadioGroup/index.native.js +1 -1
  166. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  167. package/dist/cjs/fields/Rating/index.native.js +1 -1
  168. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  169. package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
  170. package/dist/cjs/fields/Rating/types.native.js.map +1 -1
  171. package/dist/cjs/fields/SearchInput/index.native.js +2 -2
  172. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  173. package/dist/cjs/fields/Select/InlineChoices.native.js.map +1 -1
  174. package/dist/cjs/fields/Select/SheetPickerRow.native.js.map +1 -1
  175. package/dist/cjs/fields/Select/index.cjs +65 -44
  176. package/dist/cjs/fields/Select/index.native.js +73 -51
  177. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  178. package/dist/cjs/fields/Select/shouldInlineChoices.cjs +3 -1
  179. package/dist/cjs/fields/Select/shouldInlineChoices.native.js +3 -1
  180. package/dist/cjs/fields/Select/shouldInlineChoices.native.js.map +1 -1
  181. package/dist/cjs/fields/Signature/index.native.js +2 -2
  182. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  183. package/dist/cjs/fields/Slider/index.native.js +1 -1
  184. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  185. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  186. package/dist/cjs/fields/Stepper/index.native.js +2 -2
  187. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  188. package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  189. package/dist/cjs/fields/Switch/footprint.native.js.map +1 -1
  190. package/dist/cjs/fields/Switch/index.native.js +2 -2
  191. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  192. package/dist/cjs/fields/TextArea/index.native.js +2 -2
  193. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  194. package/dist/cjs/fields/TimePicker/catalog.cjs +4 -25
  195. package/dist/cjs/fields/TimePicker/catalog.native.js +10 -32
  196. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
  197. package/dist/cjs/fields/TimePicker/index.native.js +2 -2
  198. package/dist/cjs/fields/TimePicker/index.native.js.map +1 -1
  199. package/dist/cjs/fields/TimePicker/parts.cjs +8 -21
  200. package/dist/cjs/fields/TimePicker/parts.native.js +9 -22
  201. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  202. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  203. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +2 -2
  204. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  205. package/dist/cjs/fields/ToggleGroup/index.native.js +1 -1
  206. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  207. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +1 -1
  208. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  209. package/dist/cjs/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  210. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  211. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
  212. package/dist/cjs/fields/nativeSelect.native.js.map +1 -1
  213. package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
  214. package/dist/cjs/formSpacing.native.js.map +1 -1
  215. package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
  216. package/dist/cjs/index.native.js +45 -45
  217. package/dist/cjs/index.native.js.map +1 -1
  218. package/dist/cjs/keyboard/KeyboardDoneBar.native.js +1 -1
  219. package/dist/cjs/keyboard/chain.native.js.map +1 -1
  220. package/dist/cjs/keyboard/index.native.js.map +1 -1
  221. package/dist/cjs/keyboard/types.native.js.map +1 -1
  222. package/dist/cjs/requiredMarking.native.js.map +1 -1
  223. package/dist/cjs/shared/TimeColumn.native.js +1 -1
  224. package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
  225. package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
  226. package/dist/cjs/shared/choiceRowPress.native.js.map +1 -1
  227. package/dist/cjs/shared/colorRamps.native.js.map +1 -1
  228. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  229. package/dist/cjs/shared/floatingList.cjs +13 -4
  230. package/dist/cjs/shared/floatingList.native.js +16 -5
  231. package/dist/cjs/shared/floatingList.native.js.map +1 -1
  232. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  233. package/dist/cjs/shared/groupContext.native.js.map +1 -1
  234. package/dist/cjs/shared/i18n.native.js.map +1 -1
  235. package/dist/cjs/shared/instantMotion.native.js.map +1 -1
  236. package/dist/cjs/shared/nativeA11y.native.js.map +1 -1
  237. package/dist/cjs/shared/nativeAutoFocus.native.js.map +1 -1
  238. package/dist/cjs/shared/overlaySizeClass.native.js.map +1 -1
  239. package/dist/cjs/shared/overlayStack.native.js.map +1 -1
  240. package/dist/cjs/shared/panelPortal.native.js.map +1 -1
  241. package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -1
  242. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
  243. package/dist/cjs/shared/restoreRetries.native.js.map +1 -1
  244. package/dist/cjs/shared/sheetNavigation.native.js.map +1 -1
  245. package/dist/cjs/shared/systemControlModules.gnome.native.js.map +1 -1
  246. package/dist/cjs/shared/systemControls.native.js.map +1 -1
  247. package/dist/cjs/shared/t.native.js.map +1 -1
  248. package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
  249. package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
  250. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  251. package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
  252. package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
  253. package/dist/cjs/shared/utils.native.js +1 -1
  254. package/dist/cjs/shared/utils.native.js.map +1 -1
  255. package/dist/cjs/shared/zIndex.native.js.map +1 -1
  256. package/dist/cjs/standardActions.native.js.map +1 -1
  257. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  258. package/dist/cjs/types.native.js.map +1 -1
  259. package/dist/cjs/utils/LinkCell.native.js.map +1 -1
  260. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  261. package/dist/esm/Button/IconButtonGroup.native.js.map +1 -1
  262. package/dist/esm/Button/iconButtonGroupContext.native.js.map +1 -1
  263. package/dist/esm/Button/index.mjs +17 -1
  264. package/dist/esm/Button/index.mjs.map +1 -1
  265. package/dist/esm/Button/index.native.js +17 -1
  266. package/dist/esm/Button/index.native.js.map +1 -1
  267. package/dist/esm/Button/mediaPlate.native.js.map +1 -1
  268. package/dist/esm/Chip/index.native.js.map +1 -1
  269. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  270. package/dist/esm/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  271. package/dist/esm/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  272. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  273. package/dist/esm/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  274. package/dist/esm/ControlGroup/index.native.js.map +1 -1
  275. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  276. package/dist/esm/ErrorSummary.native.js.map +1 -1
  277. package/dist/esm/FieldDisplay/editMode.native.js.map +1 -1
  278. package/dist/esm/FieldDisplay/formatters.native.js.map +1 -1
  279. package/dist/esm/FieldDisplay/index.native.js.map +1 -1
  280. package/dist/esm/FieldGroup.native.js.map +1 -1
  281. package/dist/esm/FloatingPanel/RegularPanel.native.js.map +1 -1
  282. package/dist/esm/FloatingPanel/compactFace.native.js.map +1 -1
  283. package/dist/esm/FloatingPanel/containingBlock.native.js.map +1 -1
  284. package/dist/esm/FloatingPanel/echoContext.mjs +11 -0
  285. package/dist/esm/FloatingPanel/echoContext.mjs.map +1 -0
  286. package/dist/esm/FloatingPanel/echoContext.native.js +11 -0
  287. package/dist/esm/FloatingPanel/echoContext.native.js.map +1 -0
  288. package/dist/esm/FloatingPanel/index.mjs +213 -83
  289. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  290. package/dist/esm/FloatingPanel/index.native.js +92 -19
  291. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  292. package/dist/esm/FloatingPanel/nestedAction.native.js.map +1 -1
  293. package/dist/esm/FloatingPanel/panelWidth.mjs +63 -0
  294. package/dist/esm/FloatingPanel/panelWidth.mjs.map +1 -0
  295. package/dist/esm/FloatingPanel/panelWidth.native.js +67 -0
  296. package/dist/esm/FloatingPanel/panelWidth.native.js.map +1 -0
  297. package/dist/esm/FloatingPanel/pointAnchor.mjs +15 -5
  298. package/dist/esm/FloatingPanel/pointAnchor.mjs.map +1 -1
  299. package/dist/esm/FloatingPanel/pointAnchor.native.js +15 -5
  300. package/dist/esm/FloatingPanel/pointAnchor.native.js.map +1 -1
  301. package/dist/esm/FloatingPanel/regularPlacement.native.js.map +1 -1
  302. package/dist/esm/FloatingPanel/trailingAction.native.js.map +1 -1
  303. package/dist/esm/FloatingPanel/useFloatingPanel.mjs +58 -5
  304. package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  305. package/dist/esm/FloatingPanel/useFloatingPanel.native.js +69 -5
  306. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  307. package/dist/esm/Form/index.native.js.map +1 -1
  308. package/dist/esm/Form/submissionController.native.js.map +1 -1
  309. package/dist/esm/Form/validateOn.native.js.map +1 -1
  310. package/dist/esm/FormGrid.native.js.map +1 -1
  311. package/dist/esm/FormSection.native.js.map +1 -1
  312. package/dist/esm/InputParts/PasswordReveal.native.js.map +1 -1
  313. package/dist/esm/InputParts/index.mjs +19 -1
  314. package/dist/esm/InputParts/index.mjs.map +1 -1
  315. package/dist/esm/InputParts/index.native.js +20 -2
  316. package/dist/esm/InputParts/index.native.js.map +1 -1
  317. package/dist/esm/Label/index.native.js.map +1 -1
  318. package/dist/esm/MediaPicker/base64.native.js.map +1 -1
  319. package/dist/esm/MediaPicker/payload.native.js.map +1 -1
  320. package/dist/esm/MediaPicker/types.native.js.map +1 -1
  321. package/dist/esm/MediaPicker/useMediaPicker.native.js.map +1 -1
  322. package/dist/esm/Skeleton/index.native.js.map +1 -1
  323. package/dist/esm/Spinner/SpinnerGlyph.native.js.map +1 -1
  324. package/dist/esm/Spinner/spinnerSize.native.js.map +1 -1
  325. package/dist/esm/Table/index.native.js.map +1 -1
  326. package/dist/esm/Wheel/NativeWheel.native.js +1 -1
  327. package/dist/esm/Wheel/NativeWheel.native.js.map +1 -1
  328. package/dist/esm/Wheel/haptic.native.js.map +1 -1
  329. package/dist/esm/Wheel/index.mjs +2 -1
  330. package/dist/esm/Wheel/index.mjs.map +1 -1
  331. package/dist/esm/Wheel/index.native.js +4 -1
  332. package/dist/esm/Wheel/index.native.js.map +1 -1
  333. package/dist/esm/Wheel/wheelShared.mjs +6 -1
  334. package/dist/esm/Wheel/wheelShared.mjs.map +1 -1
  335. package/dist/esm/Wheel/wheelShared.native.js +7 -1
  336. package/dist/esm/Wheel/wheelShared.native.js.map +1 -1
  337. package/dist/esm/actionLabel.native.js.map +1 -1
  338. package/dist/esm/fieldDefaults.native.js.map +1 -1
  339. package/dist/esm/fieldLayout.native.js.map +1 -1
  340. package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
  341. package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
  342. package/dist/esm/fields/Barcode/index.native.js.map +1 -1
  343. package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
  344. package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
  345. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  346. package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  347. package/dist/esm/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  348. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  349. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  350. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  351. package/dist/esm/fields/Checkbox/index.native.js.map +1 -1
  352. package/dist/esm/fields/ColorPicker/SystemColorField.native.js.map +1 -1
  353. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  354. package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
  355. package/dist/esm/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
  356. package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
  357. package/dist/esm/fields/Combobox/index.mjs +1 -0
  358. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  359. package/dist/esm/fields/Combobox/index.native.js +1 -0
  360. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  361. package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
  362. package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  363. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs +6 -30
  364. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
  365. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js +11 -34
  366. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  367. package/dist/esm/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  368. package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
  369. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  370. package/dist/esm/fields/DatePicker/catalog.mjs +2 -28
  371. package/dist/esm/fields/DatePicker/catalog.mjs.map +1 -1
  372. package/dist/esm/fields/DatePicker/catalog.native.js +2 -30
  373. package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -1
  374. package/dist/esm/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  375. package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
  376. package/dist/esm/fields/DatePicker/parts.mjs +11 -20
  377. package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
  378. package/dist/esm/fields/DatePicker/parts.native.js +13 -22
  379. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  380. package/dist/esm/fields/DatePicker/utils.native.js.map +1 -1
  381. package/dist/esm/fields/Duration/durationMath.native.js.map +1 -1
  382. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  383. package/dist/esm/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  384. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  385. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  386. package/dist/esm/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  387. package/dist/esm/fields/Geolocation/geoValue.native.js.map +1 -1
  388. package/dist/esm/fields/Geolocation/geocoder.native.js.map +1 -1
  389. package/dist/esm/fields/Geolocation/geocoderContext.native.js.map +1 -1
  390. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  391. package/dist/esm/fields/Geolocation/mapMath.native.js.map +1 -1
  392. package/dist/esm/fields/Geolocation/mapTypes.native.js.map +1 -1
  393. package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  394. package/dist/esm/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  395. package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
  396. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  397. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  398. package/dist/esm/fields/Input/index.native.js.map +1 -1
  399. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  400. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  401. package/dist/esm/fields/OTPInput/otpCellCss.native.js.map +1 -1
  402. package/dist/esm/fields/PhoneInput/dialCodes.native.js.map +1 -1
  403. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  404. package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
  405. package/dist/esm/fields/PhoneInput/regionNames.native.js.map +1 -1
  406. package/dist/esm/fields/Progress/index.native.js.map +1 -1
  407. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  408. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  409. package/dist/esm/fields/Rating/ratingMath.native.js.map +1 -1
  410. package/dist/esm/fields/Rating/types.native.js.map +1 -1
  411. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  412. package/dist/esm/fields/Select/InlineChoices.native.js.map +1 -1
  413. package/dist/esm/fields/Select/SheetPickerRow.native.js.map +1 -1
  414. package/dist/esm/fields/Select/index.mjs +66 -45
  415. package/dist/esm/fields/Select/index.mjs.map +1 -1
  416. package/dist/esm/fields/Select/index.native.js +70 -48
  417. package/dist/esm/fields/Select/index.native.js.map +1 -1
  418. package/dist/esm/fields/Select/shouldInlineChoices.mjs +3 -1
  419. package/dist/esm/fields/Select/shouldInlineChoices.mjs.map +1 -1
  420. package/dist/esm/fields/Select/shouldInlineChoices.native.js +3 -1
  421. package/dist/esm/fields/Select/shouldInlineChoices.native.js.map +1 -1
  422. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  423. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  424. package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
  425. package/dist/esm/fields/Stepper/index.native.js.map +1 -1
  426. package/dist/esm/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  427. package/dist/esm/fields/Switch/footprint.native.js.map +1 -1
  428. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  429. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  430. package/dist/esm/fields/TimePicker/catalog.mjs +4 -25
  431. package/dist/esm/fields/TimePicker/catalog.mjs.map +1 -1
  432. package/dist/esm/fields/TimePicker/catalog.native.js +7 -29
  433. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
  434. package/dist/esm/fields/TimePicker/index.native.js.map +1 -1
  435. package/dist/esm/fields/TimePicker/parts.mjs +8 -21
  436. package/dist/esm/fields/TimePicker/parts.mjs.map +1 -1
  437. package/dist/esm/fields/TimePicker/parts.native.js +8 -21
  438. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  439. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  440. package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
  441. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  442. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  443. package/dist/esm/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  444. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  445. package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
  446. package/dist/esm/fields/nativeSelect.native.js.map +1 -1
  447. package/dist/esm/fields/selectedOrder.native.js.map +1 -1
  448. package/dist/esm/formSpacing.native.js.map +1 -1
  449. package/dist/esm/hooks/useFocusManagement.native.js.map +1 -1
  450. package/dist/esm/index.mjs.map +1 -1
  451. package/dist/esm/index.native.js.map +1 -1
  452. package/dist/esm/keyboard/chain.native.js.map +1 -1
  453. package/dist/esm/keyboard/index.native.js.map +1 -1
  454. package/dist/esm/keyboard/types.native.js.map +1 -1
  455. package/dist/esm/requiredMarking.native.js.map +1 -1
  456. package/dist/esm/shared/TimeColumn.native.js.map +1 -1
  457. package/dist/esm/shared/capabilityPreflight.native.js.map +1 -1
  458. package/dist/esm/shared/choiceRowPress.native.js.map +1 -1
  459. package/dist/esm/shared/colorRamps.native.js.map +1 -1
  460. package/dist/esm/shared/devWarn.native.js.map +1 -1
  461. package/dist/esm/shared/floatingList.mjs +14 -5
  462. package/dist/esm/shared/floatingList.mjs.map +1 -1
  463. package/dist/esm/shared/floatingList.native.js +16 -5
  464. package/dist/esm/shared/floatingList.native.js.map +1 -1
  465. package/dist/esm/shared/focusManagement.native.js.map +1 -1
  466. package/dist/esm/shared/groupContext.native.js.map +1 -1
  467. package/dist/esm/shared/i18n.native.js.map +1 -1
  468. package/dist/esm/shared/instantMotion.native.js.map +1 -1
  469. package/dist/esm/shared/nativeA11y.native.js.map +1 -1
  470. package/dist/esm/shared/nativeAutoFocus.native.js.map +1 -1
  471. package/dist/esm/shared/overlaySizeClass.native.js.map +1 -1
  472. package/dist/esm/shared/overlayStack.native.js.map +1 -1
  473. package/dist/esm/shared/panelPortal.native.js.map +1 -1
  474. package/dist/esm/shared/pickerTriggerContract.native.js.map +1 -1
  475. package/dist/esm/shared/pressSlopProps.native.js.map +1 -1
  476. package/dist/esm/shared/restoreRetries.native.js.map +1 -1
  477. package/dist/esm/shared/sheetNavigation.native.js.map +1 -1
  478. package/dist/esm/shared/systemControlModules.gnome.native.js.map +1 -1
  479. package/dist/esm/shared/systemControls.native.js.map +1 -1
  480. package/dist/esm/shared/t.native.js.map +1 -1
  481. package/dist/esm/shared/tableCellContext.native.js.map +1 -1
  482. package/dist/esm/shared/useDragScroll.native.js.map +1 -1
  483. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  484. package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
  485. package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
  486. package/dist/esm/shared/utils.native.js.map +1 -1
  487. package/dist/esm/shared/zIndex.native.js.map +1 -1
  488. package/dist/esm/standardActions.native.js.map +1 -1
  489. package/dist/esm/themedPrimitives.native.js.map +1 -1
  490. package/dist/esm/types.native.js.map +1 -1
  491. package/dist/esm/utils/LinkCell.native.js.map +1 -1
  492. package/dist/jsx/Button/index.mjs +17 -1
  493. package/dist/jsx/Button/index.mjs.map +1 -1
  494. package/dist/jsx/Button/index.native.js +16 -0
  495. package/dist/jsx/Button/index.native.js.map +1 -1
  496. package/dist/jsx/FloatingPanel/echoContext.mjs +11 -0
  497. package/dist/jsx/FloatingPanel/echoContext.mjs.map +1 -0
  498. package/dist/jsx/FloatingPanel/echoContext.native.js +42 -0
  499. package/dist/jsx/FloatingPanel/echoContext.native.js.map +1 -0
  500. package/dist/jsx/FloatingPanel/index.mjs +213 -83
  501. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  502. package/dist/jsx/FloatingPanel/index.native.js +92 -17
  503. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  504. package/dist/jsx/FloatingPanel/panelWidth.mjs +63 -0
  505. package/dist/jsx/FloatingPanel/panelWidth.mjs.map +1 -0
  506. package/dist/jsx/FloatingPanel/panelWidth.native.js +99 -0
  507. package/dist/jsx/FloatingPanel/panelWidth.native.js.map +1 -0
  508. package/dist/jsx/FloatingPanel/pointAnchor.mjs +15 -5
  509. package/dist/jsx/FloatingPanel/pointAnchor.mjs.map +1 -1
  510. package/dist/jsx/FloatingPanel/pointAnchor.native.js +15 -5
  511. package/dist/jsx/FloatingPanel/pointAnchor.native.js.map +1 -1
  512. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +58 -5
  513. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  514. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +69 -4
  515. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  516. package/dist/jsx/InputParts/index.mjs +19 -1
  517. package/dist/jsx/InputParts/index.mjs.map +1 -1
  518. package/dist/jsx/InputParts/index.native.js +19 -1
  519. package/dist/jsx/InputParts/index.native.js.map +1 -1
  520. package/dist/jsx/Wheel/NativeWheel.native.js +1 -1
  521. package/dist/jsx/Wheel/NativeWheel.native.js.map +1 -1
  522. package/dist/jsx/Wheel/index.mjs +2 -1
  523. package/dist/jsx/Wheel/index.mjs.map +1 -1
  524. package/dist/jsx/Wheel/index.native.js +4 -1
  525. package/dist/jsx/Wheel/index.native.js.map +1 -1
  526. package/dist/jsx/Wheel/wheelShared.mjs +6 -1
  527. package/dist/jsx/Wheel/wheelShared.mjs.map +1 -1
  528. package/dist/jsx/Wheel/wheelShared.native.js +7 -1
  529. package/dist/jsx/Wheel/wheelShared.native.js.map +1 -1
  530. package/dist/jsx/fields/Combobox/index.mjs +1 -0
  531. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  532. package/dist/jsx/fields/Combobox/index.native.js +1 -0
  533. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  534. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs +6 -30
  535. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
  536. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js +11 -34
  537. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  538. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  539. package/dist/jsx/fields/DatePicker/catalog.mjs +2 -28
  540. package/dist/jsx/fields/DatePicker/catalog.mjs.map +1 -1
  541. package/dist/jsx/fields/DatePicker/catalog.native.js +2 -30
  542. package/dist/jsx/fields/DatePicker/catalog.native.js.map +1 -1
  543. package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
  544. package/dist/jsx/fields/DatePicker/parts.mjs +11 -20
  545. package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
  546. package/dist/jsx/fields/DatePicker/parts.native.js +13 -22
  547. package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
  548. package/dist/jsx/fields/Select/index.mjs +66 -45
  549. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  550. package/dist/jsx/fields/Select/index.native.js +69 -47
  551. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  552. package/dist/jsx/fields/Select/shouldInlineChoices.mjs +3 -1
  553. package/dist/jsx/fields/Select/shouldInlineChoices.mjs.map +1 -1
  554. package/dist/jsx/fields/Select/shouldInlineChoices.native.js +3 -1
  555. package/dist/jsx/fields/Select/shouldInlineChoices.native.js.map +1 -1
  556. package/dist/jsx/fields/TimePicker/catalog.mjs +4 -25
  557. package/dist/jsx/fields/TimePicker/catalog.mjs.map +1 -1
  558. package/dist/jsx/fields/TimePicker/catalog.native.js +7 -29
  559. package/dist/jsx/fields/TimePicker/catalog.native.js.map +1 -1
  560. package/dist/jsx/fields/TimePicker/index.native.js.map +1 -1
  561. package/dist/jsx/fields/TimePicker/parts.mjs +8 -21
  562. package/dist/jsx/fields/TimePicker/parts.mjs.map +1 -1
  563. package/dist/jsx/fields/TimePicker/parts.native.js +8 -21
  564. package/dist/jsx/fields/TimePicker/parts.native.js.map +1 -1
  565. package/dist/jsx/index.js.map +1 -1
  566. package/dist/jsx/index.mjs.map +1 -1
  567. package/dist/jsx/index.native.js.map +1 -1
  568. package/dist/jsx/shared/floatingList.mjs +14 -5
  569. package/dist/jsx/shared/floatingList.mjs.map +1 -1
  570. package/dist/jsx/shared/floatingList.native.js +15 -4
  571. package/dist/jsx/shared/floatingList.native.js.map +1 -1
  572. package/package.json +8 -8
  573. package/src/Button/index.tsx +22 -0
  574. package/src/FloatingPanel/FloatingPanel.echoStretch.spec.tsx +67 -0
  575. package/src/FloatingPanel/FloatingPanel.menuFace.native.spec.tsx +193 -2
  576. package/src/FloatingPanel/FloatingPanel.seamlessCover.spec.tsx +237 -0
  577. package/src/FloatingPanel/echoContext.ts +22 -0
  578. package/src/FloatingPanel/index.native.tsx +106 -9
  579. package/src/FloatingPanel/index.tsx +310 -102
  580. package/src/FloatingPanel/panelWidth.spec.ts +158 -0
  581. package/src/FloatingPanel/panelWidth.ts +122 -0
  582. package/src/FloatingPanel/panelWidthContract.spec.ts +10 -10
  583. package/src/FloatingPanel/pointAnchor.spec.ts +64 -2
  584. package/src/FloatingPanel/pointAnchor.ts +28 -3
  585. package/src/FloatingPanel/useFloatingPanel.spec.tsx +124 -4
  586. package/src/FloatingPanel/useFloatingPanel.ts +106 -33
  587. package/src/InputParts/index.tsx +26 -0
  588. package/src/Wheel/NativeWheel.native.tsx +1 -1
  589. package/src/Wheel/Wheel.spec.tsx +9 -0
  590. package/src/Wheel/index.tsx +12 -3
  591. package/src/Wheel/wheelShared.ts +6 -2
  592. package/src/fields/Combobox/index.tsx +1 -0
  593. package/src/fields/DatePicker/DatePicker.stories.tsx +3 -3
  594. package/src/fields/DatePicker/DatetimePicker.catalog.tsx +17 -45
  595. package/src/fields/DatePicker/DatetimePicker.native.tsx +3 -0
  596. package/src/fields/DatePicker/catalog.tsx +8 -39
  597. package/src/fields/DatePicker/index.native.tsx +3 -0
  598. package/src/fields/DatePicker/parts.tsx +13 -23
  599. package/src/fields/DatePicker/seamlessCover.spec.tsx +180 -0
  600. package/src/fields/DatePicker/touchWeb.spec.tsx +109 -167
  601. package/src/fields/Select/Select.containingBlock.spec.tsx +191 -0
  602. package/src/fields/Select/Select.stories.tsx +43 -0
  603. package/src/fields/Select/index.tsx +109 -45
  604. package/src/fields/Select/shouldInlineChoices.spec.ts +13 -0
  605. package/src/fields/Select/shouldInlineChoices.ts +6 -0
  606. package/src/fields/TimePicker/catalog.tsx +12 -33
  607. package/src/fields/TimePicker/index.native.tsx +2 -0
  608. package/src/fields/TimePicker/parts.tsx +6 -20
  609. package/src/index.ts +1 -0
  610. package/src/shared/floatingList.tsx +21 -5
  611. package/types/Button/index.d.ts.map +1 -1
  612. package/types/FloatingPanel/echoContext.d.ts +14 -0
  613. package/types/FloatingPanel/echoContext.d.ts.map +1 -0
  614. package/types/FloatingPanel/index.d.ts +59 -0
  615. package/types/FloatingPanel/index.d.ts.map +1 -1
  616. package/types/FloatingPanel/index.native.d.ts +9 -1
  617. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  618. package/types/FloatingPanel/panelWidth.d.ts +71 -0
  619. package/types/FloatingPanel/panelWidth.d.ts.map +1 -0
  620. package/types/FloatingPanel/pointAnchor.d.ts +8 -1
  621. package/types/FloatingPanel/pointAnchor.d.ts.map +1 -1
  622. package/types/FloatingPanel/useFloatingPanel.d.ts +33 -2
  623. package/types/FloatingPanel/useFloatingPanel.d.ts.map +1 -1
  624. package/types/InputParts/index.d.ts.map +1 -1
  625. package/types/Wheel/index.d.ts.map +1 -1
  626. package/types/Wheel/wheelShared.d.ts +2 -1
  627. package/types/Wheel/wheelShared.d.ts.map +1 -1
  628. package/types/fields/Combobox/index.d.ts.map +1 -1
  629. package/types/fields/DatePicker/DatetimePicker.catalog.d.ts +6 -0
  630. package/types/fields/DatePicker/DatetimePicker.catalog.d.ts.map +1 -1
  631. package/types/fields/DatePicker/DatetimePicker.native.d.ts +3 -0
  632. package/types/fields/DatePicker/DatetimePicker.native.d.ts.map +1 -1
  633. package/types/fields/DatePicker/catalog.d.ts +6 -0
  634. package/types/fields/DatePicker/catalog.d.ts.map +1 -1
  635. package/types/fields/DatePicker/index.native.d.ts +3 -0
  636. package/types/fields/DatePicker/index.native.d.ts.map +1 -1
  637. package/types/fields/DatePicker/parts.d.ts +5 -7
  638. package/types/fields/DatePicker/parts.d.ts.map +1 -1
  639. package/types/fields/Select/index.d.ts +8 -1
  640. package/types/fields/Select/index.d.ts.map +1 -1
  641. package/types/fields/Select/shouldInlineChoices.d.ts +5 -1
  642. package/types/fields/Select/shouldInlineChoices.d.ts.map +1 -1
  643. package/types/fields/TimePicker/catalog.d.ts +7 -1
  644. package/types/fields/TimePicker/catalog.d.ts.map +1 -1
  645. package/types/fields/TimePicker/index.native.d.ts +2 -0
  646. package/types/fields/TimePicker/index.native.d.ts.map +1 -1
  647. package/types/fields/TimePicker/parts.d.ts +1 -3
  648. package/types/fields/TimePicker/parts.d.ts.map +1 -1
  649. package/types/index.d.ts +1 -0
  650. package/types/index.d.ts.map +1 -1
  651. package/types/shared/floatingList.d.ts +5 -1
  652. package/types/shared/floatingList.d.ts.map +1 -1
  653. package/dist/cjs/shared/touchWebPicker.cjs +0 -136
  654. package/dist/cjs/shared/touchWebPicker.native.js +0 -154
  655. package/dist/cjs/shared/touchWebPicker.native.js.map +0 -1
  656. package/dist/esm/shared/touchWebPicker.mjs +0 -105
  657. package/dist/esm/shared/touchWebPicker.mjs.map +0 -1
  658. package/dist/esm/shared/touchWebPicker.native.js +0 -120
  659. package/dist/esm/shared/touchWebPicker.native.js.map +0 -1
  660. package/dist/jsx/shared/touchWebPicker.mjs +0 -105
  661. package/dist/jsx/shared/touchWebPicker.mjs.map +0 -1
  662. package/dist/jsx/shared/touchWebPicker.native.js +0 -154
  663. package/dist/jsx/shared/touchWebPicker.native.js.map +0 -1
  664. package/src/shared/touchWebPicker.spec.ts +0 -98
  665. package/src/shared/touchWebPicker.tsx +0 -158
  666. package/types/shared/touchWebPicker.d.ts +0 -40
  667. package/types/shared/touchWebPicker.d.ts.map +0 -1
@@ -0,0 +1,191 @@
1
+ /**
2
+ * FZ-8438 (Clay's rv_0ea65e640a0ef261, an iPad Select inside a sheet): the
3
+ * listbox is `position: fixed`, and inside a transformed sheet it lays out
4
+ * against that sheet, not the viewport. Its top is offset by the sheet's
5
+ * origin so the panel still lands on its field.
6
+ */
7
+ import { fireEvent, waitFor } from "@testing-library/react";
8
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
9
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
10
+ import { OverlayStackProvider } from "../../shared/overlayStack";
11
+ import { Select, type SelectOption } from "./index";
12
+
13
+ const options: SelectOption[] = [
14
+ { value: "hel", label: "Helsinki" },
15
+ { value: "fsn", label: "Falkenstein" },
16
+ { value: "nbg", label: "Nuremberg" },
17
+ ];
18
+
19
+ async function openTop(result: ReturnType<typeof renderWithProviders>) {
20
+ fireEvent.keyDown(result.getByTestId("select-trigger"), { key: "Enter" });
21
+ const dropdown = await result.findByTestId("select-dropdown");
22
+ await waitFor(() => expect(dropdown.style.top).not.toBe(""));
23
+ return { dropdown, top: parseFloat(dropdown.style.top) };
24
+ }
25
+
26
+ describe("Select inside a transformed sheet (FZ-8438)", () => {
27
+ beforeEach(() => {
28
+ Object.defineProperty(window, "innerWidth", {
29
+ configurable: true,
30
+ writable: true,
31
+ value: 1200,
32
+ });
33
+ });
34
+
35
+ it("offsets its top by the sheet it lays out against", async () => {
36
+ const plain = renderWithProviders(<Select options={options} value="hel" />);
37
+ const { top: viewportTop } = await openTop(plain);
38
+ plain.unmount();
39
+
40
+ const result = renderWithProviders(
41
+ <div
42
+ role="dialog"
43
+ data-testid="sheet"
44
+ style={{ transform: "translateY(0px)", overflowY: "auto", height: 100 }}
45
+ >
46
+ <Select options={options} value="hel" />
47
+ </div>,
48
+ );
49
+ const sheet = result.getByTestId("sheet");
50
+ sheet.scrollTop = 40;
51
+ const { dropdown, top } = await openTop(result);
52
+ expect(sheet.contains(dropdown)).toBe(true);
53
+ expect(top).toBe(viewportTop + 40);
54
+ });
55
+ });
56
+
57
+ describe("Select seamless cover (LC-112, FZ-8438)", () => {
58
+ beforeEach(() => {
59
+ Object.defineProperty(window, "innerWidth", {
60
+ configurable: true,
61
+ writable: true,
62
+ value: 1200,
63
+ });
64
+ });
65
+ afterEach(() => {
66
+ vi.restoreAllMocks();
67
+ });
68
+
69
+ it("opens on the field's top edge with the field echoed as a hidden first row", async () => {
70
+ const original = HTMLElement.prototype.getBoundingClientRect;
71
+ vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockImplementation(
72
+ function (this: HTMLElement) {
73
+ const field = this.querySelector('[data-testid="select-trigger"]');
74
+ if (this.dataset.testid === "select-trigger" || field) {
75
+ return {
76
+ x: 16,
77
+ y: 200,
78
+ top: 200,
79
+ left: 16,
80
+ right: 416,
81
+ bottom: 240,
82
+ width: 400,
83
+ height: 40,
84
+ toJSON: () => ({}),
85
+ } as DOMRect;
86
+ }
87
+ return original.call(this);
88
+ },
89
+ );
90
+ const result = renderWithProviders(<Select options={options} value="nbg" />);
91
+ const { dropdown, top } = await openTop(result);
92
+ expect(top).toBe(200);
93
+ const echo = dropdown.querySelector<HTMLElement>("[data-fp-trigger-row]");
94
+ expect(echo).not.toBeNull();
95
+ expect(dropdown.firstElementChild).toBe(echo);
96
+ expect(echo?.getAttribute("aria-hidden")).toBe("true");
97
+ expect(echo?.getAttribute("role")).toBeNull();
98
+ });
99
+ });
100
+
101
+ describe("Select drop-up (LC-112, FZ-8438 r3)", () => {
102
+ const field = (top: number) => ({
103
+ x: 16,
104
+ y: top,
105
+ top,
106
+ left: 16,
107
+ right: 416,
108
+ bottom: top + 40,
109
+ width: 400,
110
+ height: 40,
111
+ toJSON: () => ({}),
112
+ });
113
+ let fieldTop = 700;
114
+ beforeEach(() => {
115
+ Object.defineProperty(window, "innerWidth", {
116
+ configurable: true,
117
+ writable: true,
118
+ value: 1024,
119
+ });
120
+ Object.defineProperty(window, "innerHeight", {
121
+ configurable: true,
122
+ writable: true,
123
+ value: 768,
124
+ });
125
+ const original = HTMLElement.prototype.getBoundingClientRect;
126
+ vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockImplementation(
127
+ function (this: HTMLElement) {
128
+ if (
129
+ this.dataset.testid === "select-trigger" ||
130
+ this.querySelector('[data-testid="select-trigger"]')
131
+ ) {
132
+ return field(fieldTop) as DOMRect;
133
+ }
134
+ return original.call(this);
135
+ },
136
+ );
137
+ vi.spyOn(HTMLElement.prototype, "scrollHeight", "get").mockImplementation(
138
+ function (this: HTMLElement) {
139
+ return this.dataset.testid === "select-dropdown" ? 300 : 0;
140
+ },
141
+ );
142
+ });
143
+ afterEach(() => {
144
+ vi.restoreAllMocks();
145
+ });
146
+
147
+ it("a field too low for its list opens upward, its bottom edge on the field's", async () => {
148
+ fieldTop = 700;
149
+ const result = renderWithProviders(<Select options={options} value="hel" />);
150
+ const { dropdown } = await openTop(result);
151
+ // The panel's bottom edge is the field's (740): the 300 list plus the
152
+ // frame's borders, above it.
153
+ await waitFor(() => expect(parseFloat(dropdown.style.top)).toBeLessThan(700));
154
+ expect(parseFloat(dropdown.style.top) + parseFloat(dropdown.style.maxHeight)).toBe(740);
155
+ expect(parseFloat(dropdown.style.maxHeight)).toBeGreaterThanOrEqual(300);
156
+ const echo = dropdown.querySelector<HTMLElement>("[data-fp-trigger-row]");
157
+ await waitFor(() => expect(echo?.style.order).toBe("1"));
158
+ expect(echo?.style.top).toBe("");
159
+ expect(echo?.style.bottom).not.toBe("");
160
+ });
161
+
162
+ it("a field with room below keeps the echo on top, opening down", async () => {
163
+ fieldTop = 120;
164
+ const result = renderWithProviders(<Select options={options} value="hel" />);
165
+ const { dropdown, top } = await openTop(result);
166
+ expect(top).toBe(120);
167
+ const echo = dropdown.querySelector<HTMLElement>("[data-fp-trigger-row]");
168
+ expect(echo?.style.order).toBe("");
169
+ });
170
+ });
171
+
172
+ describe("Select beside its field in a sheet (LC-262, FZ-8438)", () => {
173
+ beforeEach(() => {
174
+ Object.defineProperty(window, "innerWidth", {
175
+ configurable: true,
176
+ writable: true,
177
+ value: 1200,
178
+ });
179
+ });
180
+
181
+ it("draws no trigger echo row when it opens beside the field", async () => {
182
+ const result = renderWithProviders(
183
+ <OverlayStackProvider zIndex={100000}>
184
+ <Select options={options} value="hel" />
185
+ </OverlayStackProvider>,
186
+ );
187
+ const { dropdown } = await openTop(result);
188
+ expect(dropdown.querySelector("[data-fp-trigger-row]")).toBeNull();
189
+ expect(dropdown.textContent?.match(/Helsinki/g)?.length ?? 0).toBe(1);
190
+ });
191
+ });
@@ -496,3 +496,46 @@ export const NativeIos: Story = {
496
496
  native: true,
497
497
  },
498
498
  };
499
+
500
+ const zoneOptions: SelectOption[] = [
501
+ { value: "hst", label: "Hawaii" },
502
+ { value: "akst", label: "Alaska" },
503
+ { value: "pt", label: "Pacific Time (US and Canada)" },
504
+ { value: "mt", label: "Mountain Time (US and Canada)" },
505
+ { value: "ct", label: "Central Time (US and Canada)" },
506
+ { value: "et", label: "Eastern Time (US and Canada)" },
507
+ { value: "gmt", label: "London" },
508
+ { value: "cet", label: "Berlin" },
509
+ { value: "eet", label: "Helsinki" },
510
+ { value: "ist", label: "Kolkata" },
511
+ { value: "jst", label: "Tokyo" },
512
+ { value: "aest", label: "Sydney" },
513
+ ];
514
+
515
+ /**
516
+ * LC-112 width setting (FZ-8438 r3): the same field opened four ways. Each
517
+ * panel's top edge sits on its field; only the width changes.
518
+ */
519
+ export const PanelWidths: Story = {
520
+ render: () => (
521
+ <YStack gap="$4" width={260}>
522
+ <Select label="Content" options={zoneOptions} defaultValue="pt" panelWidth="content" />
523
+ <Select label="Trigger" options={zoneOptions} defaultValue="pt" panelWidth="trigger" />
524
+ <Select label="Screen" options={zoneOptions} defaultValue="pt" panelWidth="screen" />
525
+ <Select label="Fixed 360" options={zoneOptions} defaultValue="pt" panelWidth={360} />
526
+ </YStack>
527
+ ),
528
+ };
529
+
530
+ /**
531
+ * Phone width (LC-112, FZ-7830): a long list opens its sheet at page level and
532
+ * a short one (seven or fewer options) opens as a menu over its field.
533
+ */
534
+ export const PhoneLists: Story = {
535
+ render: () => (
536
+ <YStack gap="$4">
537
+ <Select label="Time zone" options={zoneOptions} defaultValue="pt" />
538
+ <Select label="Country" options={countryOptions} defaultValue="us" />
539
+ </YStack>
540
+ ),
541
+ };
@@ -52,6 +52,8 @@ import {
52
52
  import { ScrollArrow } from "../../shared/floatingList";
53
53
  import {
54
54
  FloatingPanel,
55
+ TriggerEchoRow,
56
+ placeEchoOverTrigger,
55
57
  useFloatingPanel,
56
58
  panelViewportPadding,
57
59
  useViewportGtSm,
@@ -59,6 +61,7 @@ import {
59
61
  import { pickerCompactFace, resolveCompactFace } from "../../FloatingPanel/compactFace";
60
62
  import { PanelPortal } from "../../FloatingPanel/PanelPortal";
61
63
  import { fixedContainingBlockOrigin } from "../../FloatingPanel/containingBlock";
64
+ import type { PanelWidth } from "../../FloatingPanel/panelWidth";
62
65
  import { useInsideOverlay, useOverlayZIndex } from "../../shared/overlayStack";
63
66
  import { useDragScroll } from "../../shared/useDragScroll";
64
67
  import { useIsInTableCell } from "../../shared/tableCellContext";
@@ -131,6 +134,12 @@ export interface SelectProps {
131
134
  * `multiple` is set, and on Android (the catalog sheet stays). Default false.
132
135
  */
133
136
  native?: boolean;
137
+ /**
138
+ * How wide the open list is (LC-112, FZ-8438 r3): `"content"`, `"trigger"`,
139
+ * `"screen"` or a fixed width. Unset keeps the default: at least the field's
140
+ * width on the web, the native pull-down's floor on a phone menu.
141
+ */
142
+ panelWidth?: PanelWidth;
134
143
  }
135
144
 
136
145
  // ── Lightweight item row (replaces heavy ListItem-based DropdownItem) ──
@@ -511,6 +520,7 @@ interface FloatingSelectCoreProps {
511
520
  selectedOrder?: SelectedOrder;
512
521
  dismissible?: boolean;
513
522
  native?: boolean;
523
+ panelWidth?: PanelWidth;
514
524
  }
515
525
  function FloatingSelectCore({
516
526
  options,
@@ -527,6 +537,7 @@ function FloatingSelectCore({
527
537
  multiple,
528
538
  selectedOrder,
529
539
  dismissible,
540
+ panelWidth,
530
541
  }: FloatingSelectCoreProps) {
531
542
  const overlayZIndex = useOverlayZIndex("dropdown");
532
543
  const { style: elevatedSurfaceStyle, ...elevatedSurfaceProps } = knobProps.elevatedSurface;
@@ -608,6 +619,10 @@ function FloatingSelectCore({
608
619
  const growUpOnlyRef = useRef(false);
609
620
  const growDownOnlyRef = useRef(false);
610
621
  const lastScrollTopRef = useRef(0);
622
+ // LC-112 drop-up (FZ-8438 r3): a field too low for its list opens upward,
623
+ // the panel's bottom edge on the field's, the echo its last row.
624
+ const dropUpRef = useRef(false);
625
+ const [dropUp, setDropUp] = useState(false);
611
626
 
612
627
  const repositionRef = useRef<(() => void) | null>(null);
613
628
 
@@ -627,7 +642,9 @@ function FloatingSelectCore({
627
642
  growDownOnlyRef.current = false;
628
643
  lastScrollTopRef.current = 0;
629
644
  programmaticScrollRef.current = 0;
645
+ dropUpRef.current = false;
630
646
  },
647
+ panelWidth,
631
648
  });
632
649
 
633
650
  const { scrollRef: dragScrollRef, dragProps } = useDragScroll({
@@ -700,6 +717,10 @@ function FloatingSelectCore({
700
717
 
701
718
  const triggerBounds = trigger.getBoundingClientRect();
702
719
  const viewportHeight = window.innerHeight;
720
+ // The math runs in viewport coordinates; a panel hosted in a transformed
721
+ // sheet lays out against that sheet, so the written top is offset by it
722
+ // (FZ-8438: an iPad Select inside a SheetModal opened far below its field).
723
+ const originTop = fixedContainingBlockOrigin(dropdownElement).top;
703
724
  const computedStyle = getComputedStyle(dropdownElement);
704
725
  const borderTopWidth = parseFloat(computedStyle.borderTopWidth) || 0;
705
726
  const borderBottomWidth = parseFloat(computedStyle.borderBottomWidth) || 0;
@@ -707,26 +728,27 @@ function FloatingSelectCore({
707
728
  const scrollContentHeight = dropdownElement.scrollHeight;
708
729
  const totalContentHeight = scrollContentHeight + totalBorderWidth;
709
730
 
710
- // Cover-alignment (OVERLAY_ANCHOR_GAP rule): the panel's border-box top
711
- // coincides with the trigger's border-box top EXACTLY, so frame, corner
712
- // arc and row text all line up (panel border draws over trigger border;
713
- // row content = panel.top + border + offsetTop lands on the trigger's
714
- // content edge). Subtracting the border here shifted the whole panel 1px
715
- // up and made the corner arcs visibly diverge from the trigger's.
716
- let idealTop: number;
717
- if (selectedIndex >= 0) {
718
- idealTop = triggerBounds.top - selectedItem.offsetTop;
719
- } else if (panel.placement.startsWith("top")) {
720
- idealTop = triggerBounds.bottom - totalContentHeight;
721
- } else {
722
- idealTop = triggerBounds.top - (selectedItem.offsetTop ?? 0);
731
+ // LC-112 seamless cover (FZ-8438): the panel's top edge is the trigger's,
732
+ // the trigger echoed as its first row, the list below it. A field too low
733
+ // for its list, with more room above it, opens upward instead: the
734
+ // panel's bottom edge on the field's bottom edge and the echo its last
735
+ // row, so the echo still sits on the field (FZ-8438 r3).
736
+ const firstPlacement = pinnedTopRef.current === 0 && pinnedHeightRef.current === 0;
737
+ const roomBelow = viewportHeight - panelViewportPadding - triggerBounds.top;
738
+ const roomAbove = triggerBounds.bottom - panelViewportPadding;
739
+ if (firstPlacement) {
740
+ dropUpRef.current = totalContentHeight > roomBelow && roomAbove > roomBelow;
741
+ setDropUp(dropUpRef.current);
723
742
  }
724
- const idealBottom = idealTop + totalContentHeight;
743
+ const idealTop = dropUpRef.current
744
+ ? triggerBounds.bottom - totalContentHeight
745
+ : triggerBounds.top;
746
+ const idealBottom = dropUpRef.current ? triggerBounds.bottom : idealTop + totalContentHeight;
725
747
  const pinnedTop = Math.max(panelViewportPadding, idealTop);
726
748
  const pinnedBottom = Math.min(viewportHeight - panelViewportPadding, idealBottom);
727
749
  const pinnedHeight = Math.max(120, pinnedBottom - pinnedTop);
728
750
 
729
- if (pinnedTopRef.current === 0 && pinnedHeightRef.current === 0) {
751
+ if (firstPlacement) {
730
752
  pinnedTopRef.current = pinnedTop;
731
753
  pinnedHeightRef.current = pinnedHeight;
732
754
  }
@@ -735,7 +757,10 @@ function FloatingSelectCore({
735
757
  let height = pinnedHeightRef.current;
736
758
 
737
759
  if (grownRef.current) {
738
- const canGrowDown = Math.max(0, viewportHeight - panelViewportPadding - (top + height));
760
+ // A drop-up keeps its echo on the field: it grows upward only.
761
+ const canGrowDown = dropUpRef.current
762
+ ? 0
763
+ : Math.max(0, viewportHeight - panelViewportPadding - (top + height));
739
764
  height += canGrowDown;
740
765
  const canGrowUp = Math.max(0, top - panelViewportPadding);
741
766
  top -= canGrowUp;
@@ -747,7 +772,7 @@ function FloatingSelectCore({
747
772
  top -= canGrowUp;
748
773
  height += canGrowUp;
749
774
  }
750
- if (growDownOnlyRef.current) {
775
+ if (growDownOnlyRef.current && !dropUpRef.current) {
751
776
  const canGrowDown = Math.max(0, viewportHeight - panelViewportPadding - (top + height));
752
777
  height += canGrowDown;
753
778
  }
@@ -773,43 +798,59 @@ function FloatingSelectCore({
773
798
 
774
799
  if (
775
800
  !cachedOverlayStyle ||
776
- cachedOverlayStyle.top !== top ||
801
+ cachedOverlayStyle.top !== top - originTop ||
777
802
  cachedOverlayStyle.maxHeight !== height
778
803
  ) {
779
- dropdownElement.style.top = `${top}px`;
804
+ dropdownElement.style.top = `${top - originTop}px`;
780
805
  dropdownElement.style.maxHeight = `${height}px`;
781
806
  dropdownElement.style.height = "";
782
- overlayStyle.current = { top, maxHeight: height };
807
+ overlayStyle.current = { top: top - originTop, maxHeight: height };
783
808
  void dropdownElement.offsetHeight;
784
809
  }
785
810
 
786
- if (!grownRef.current && !growUpOnlyRef.current && !growDownOnlyRef.current) {
787
- const maxScrollTop = dropdownElement.scrollHeight - dropdownElement.clientHeight;
788
- if (selectedIndex >= 0) {
789
- // Row-over-trigger: row y (top + border + offsetTop − scroll) must
790
- // land on the trigger's content edge (trigger.top + border).
791
- const neededScroll = top + selectedItem.offsetTop - triggerBounds.top;
792
- const clampedScrollTop = Math.max(0, Math.min(neededScroll, maxScrollTop));
793
- if (Math.abs(dropdownElement.scrollTop - clampedScrollTop) > 0.5) {
811
+ if (
812
+ isInitial &&
813
+ selectedIndex >= 0 &&
814
+ !grownRef.current &&
815
+ !growUpOnlyRef.current &&
816
+ !growDownOnlyRef.current
817
+ ) {
818
+ // The selected row starts in view, just under the sticky echo row (or
819
+ // just above it in a drop-up, where the echo is the last row).
820
+ const echoHeight = triggerBounds.height;
821
+ const rowBottom = selectedItem.offsetTop + selectedItem.offsetHeight;
822
+ if (dropUpRef.current) {
823
+ const maxScrollTop = dropdownElement.scrollHeight - dropdownElement.clientHeight;
824
+ const wanted = rowBottom - (dropdownElement.clientHeight - echoHeight);
825
+ if (wanted > 0) {
794
826
  programmaticScrollRef.current++;
795
- dropdownElement.scrollTop = clampedScrollTop;
796
- }
797
- if (Math.abs(neededScroll - clampedScrollTop) > 0.5) {
798
- const scrollDeficit = neededScroll - clampedScrollTop;
799
- top -= scrollDeficit;
800
- top = Math.max(panelViewportPadding, top);
801
- const remainingContentHeight = totalContentHeight - clampedScrollTop;
802
- const adjustedMaxHeight = Math.min(
803
- remainingContentHeight,
804
- viewportHeight - top - panelViewportPadding,
805
- );
806
- dropdownElement.style.top = `${top}px`;
807
- dropdownElement.style.maxHeight = `${adjustedMaxHeight}px`;
808
- overlayStyle.current = { top, maxHeight: adjustedMaxHeight };
827
+ dropdownElement.scrollTop = Math.min(wanted, maxScrollTop);
809
828
  }
829
+ } else if (rowBottom > dropdownElement.clientHeight) {
830
+ const maxScrollTop = dropdownElement.scrollHeight - dropdownElement.clientHeight;
831
+ programmaticScrollRef.current++;
832
+ dropdownElement.scrollTop = Math.max(
833
+ 0,
834
+ Math.min(selectedItem.offsetTop - echoHeight, maxScrollTop),
835
+ );
810
836
  }
811
837
  }
812
838
 
839
+ // A screen-wide or fixed-width list slides inside the margins; its echo
840
+ // stays on the field (LC-112 r3). The scale origin is the left edge, so
841
+ // the client rect's left is the layout left.
842
+ placeEchoOverTrigger(
843
+ dropdownElement,
844
+ {
845
+ triggerLeft: triggerBounds.left,
846
+ triggerRight: triggerBounds.right,
847
+ panelLeft: dropdownElement.getBoundingClientRect().left,
848
+ panelWidth: dropdownElement.offsetWidth,
849
+ rtl: getComputedStyle(trigger).direction === "rtl",
850
+ },
851
+ { stretch: panelWidth !== undefined },
852
+ );
853
+
813
854
  panel.initializingRef.current = false;
814
855
 
815
856
  void dropdownElement.offsetHeight;
@@ -837,7 +878,7 @@ function FloatingSelectCore({
837
878
  useLayoutEffect(() => {
838
879
  if (!open || !panel.mounted) return;
839
880
  repositionOverlay();
840
- }, [open, panel.mounted, selectedIndex, repositionOverlay, panel.y]);
881
+ }, [open, panel.mounted, selectedIndex, repositionOverlay, panel.x, panel.y]);
841
882
 
842
883
  const onMatch = useCallback(
843
884
  (index: number) => {
@@ -1163,7 +1204,8 @@ function FloatingSelectCore({
1163
1204
  opacity: panel.visible ? 1 : 0,
1164
1205
  transform: panel.visible ? "scale(1)" : "scale(0.96)",
1165
1206
  transition: panel.panelTransition,
1166
- transformOrigin: panel.placement.startsWith("top") ? "bottom left" : "top left",
1207
+ transformOrigin:
1208
+ dropUp || panel.placement.startsWith("top") ? "bottom left" : "top left",
1167
1209
  ...dragProps.style,
1168
1210
  },
1169
1211
  onPointerDown: dragProps.onPointerDown,
@@ -1204,12 +1246,27 @@ function FloatingSelectCore({
1204
1246
  borderRadius={panel.dropdownRadius}
1205
1247
  data-testid="select-dropdown"
1206
1248
  paddingVertical={0}
1249
+ paddingBottom={panel.coverCornerInset || 0}
1207
1250
  >
1251
+ {!beside && (
1252
+ <TriggerEchoRow
1253
+ sourceRef={panel.triggerRef}
1254
+ source={selectedOption?.label ?? placeholder}
1255
+ onPress={() => setOpen(false)}
1256
+ presentational
1257
+ edge={dropUp ? "bottom" : "top"}
1258
+ />
1259
+ )}
1208
1260
  <ScrollArrow
1209
1261
  direction="up"
1210
1262
  scrollRef={panel.refs.floating}
1211
1263
  visible={panel.arrowUp}
1212
1264
  arrowScrollDirRef={panel.arrowScrollDirRef}
1265
+ topOffset={
1266
+ dropUp || beside
1267
+ ? 0
1268
+ : (panel.triggerRef.current?.getBoundingClientRect().height ?? 0)
1269
+ }
1213
1270
  />
1214
1271
  {groupLabel && (
1215
1272
  <GroupHeader color={textColor} paddingHorizontal={knobProps.panelPadding.padding}>
@@ -1260,6 +1317,9 @@ function FloatingSelectCore({
1260
1317
  scrollRef={panel.refs.floating}
1261
1318
  visible={panel.arrowDown}
1262
1319
  arrowScrollDirRef={panel.arrowScrollDirRef}
1320
+ bottomOffset={
1321
+ dropUp ? (panel.triggerRef.current?.getBoundingClientRect().height ?? 0) : 0
1322
+ }
1263
1323
  />
1264
1324
  </YStack>
1265
1325
  </FloatingFocusManager>
@@ -1287,6 +1347,7 @@ function NativeSelectCore({
1287
1347
  selectedOrder,
1288
1348
  dismissible,
1289
1349
  native,
1350
+ panelWidth,
1290
1351
  }: FloatingSelectCoreProps) {
1291
1352
  const insideOverlay = useInsideOverlay();
1292
1353
  const compactFace = pickerCompactFace(options.length);
@@ -1591,6 +1652,7 @@ function NativeSelectCore({
1591
1652
  // A short list opens as a menu over its trigger; a long one keeps its
1592
1653
  // sheet at page level and opens as a menu inside another overlay (FZ-7830).
1593
1654
  compactFace={compactFace}
1655
+ panelWidth={panelWidth}
1594
1656
  {...(asMenu && insideOverlay && opensBesideTrigger(options.length)
1595
1657
  ? { anchorMode: "attach" as const, triggerEcho: false }
1596
1658
  : null)}
@@ -1740,6 +1802,7 @@ export function Select({
1740
1802
  dismissible,
1741
1803
  skeleton,
1742
1804
  native,
1805
+ panelWidth,
1743
1806
  "aria-label": ariaLabel,
1744
1807
  ...rest
1745
1808
  }: SelectProps) {
@@ -1781,7 +1844,7 @@ export function Select({
1781
1844
  !inline &&
1782
1845
  !inTableCell &&
1783
1846
  Boolean(rowLabel) &&
1784
- shouldPushChoices({ inSheet: Boolean(sheetNavigation), multiple, options });
1847
+ shouldPushChoices({ inSheet: Boolean(sheetNavigation), multiple, options, panelWidth });
1785
1848
  // DG-CTRL-01 / DG-CTRL-05 — short single-select lists prefer RadioGroup,
1786
1849
  // which the inline face already is.
1787
1850
  if (!inline) {
@@ -1920,6 +1983,7 @@ export function Select({
1920
1983
  selectedOrder={selectedOrder}
1921
1984
  dismissible={dismissible}
1922
1985
  native={native}
1986
+ panelWidth={panelWidth}
1923
1987
  />
1924
1988
  );
1925
1989
  };
@@ -37,6 +37,19 @@ describe("shouldPushChoices and opensBesideTrigger (LC-262, FZ-7830 round 3)", (
37
37
  expect(shouldPushChoices({ inSheet: true, multiple: true, options: withIcons(8) })).toBe(false);
38
38
  });
39
39
 
40
+ it("never pushes a list whose panel width is trigger or screen: it covers its trigger (FZ-8438)", () => {
41
+ expect(shouldPushChoices({ inSheet: true, options: withIcons(8), panelWidth: "trigger" })).toBe(
42
+ false,
43
+ );
44
+ expect(shouldPushChoices({ inSheet: true, options: withIcons(8), panelWidth: "screen" })).toBe(
45
+ false,
46
+ );
47
+ expect(shouldPushChoices({ inSheet: true, options: withIcons(8), panelWidth: "content" })).toBe(
48
+ true,
49
+ );
50
+ expect(shouldPushChoices({ inSheet: true, options: withIcons(8), panelWidth: 300 })).toBe(true);
51
+ });
52
+
40
53
  it("opens a list of five or fewer beside its field", () => {
41
54
  expect(opensBesideTrigger(5)).toBe(true);
42
55
  expect(opensBesideTrigger(6)).toBe(false);
@@ -1,4 +1,5 @@
1
1
  import type { ReactNode } from "react";
2
+ import type { PanelWidth } from "../../FloatingPanel/panelWidth";
2
3
 
3
4
  /** The most options a Select inside a sheet lays out inline (LC-262). */
4
5
  export const INLINE_CHOICES_MAX = 5;
@@ -25,17 +26,22 @@ export function shouldInlineChoices({
25
26
  * A single-choice Select inside a sheet with more options than the inline
26
27
  * list holds pushes its checkmark list onto the sheet's navigation stack from
27
28
  * a Settings row (LC-262, FZ-7830 round 3), instead of a menu over the field.
29
+ * An explicit `"trigger"` or `"screen"` panel width asks for a cover over the
30
+ * trigger (LC-112, FZ-8438 r3), so that Select is never pushed.
28
31
  */
29
32
  export function shouldPushChoices({
30
33
  inSheet,
31
34
  multiple,
32
35
  options,
36
+ panelWidth,
33
37
  }: {
34
38
  inSheet: boolean;
35
39
  multiple?: boolean;
36
40
  options: ReadonlyArray<unknown> | undefined;
41
+ panelWidth?: PanelWidth;
37
42
  }): boolean {
38
43
  if (!inSheet || multiple || !options?.length) return false;
44
+ if (panelWidth === "trigger" || panelWidth === "screen") return false;
39
45
  return options.length > INLINE_CHOICES_MAX;
40
46
  }
41
47