@multiplatform.one/forms 8.3.0 → 8.5.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 (520) 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/circleGlyph.native.js.map +1 -1
  5. package/dist/cjs/Button/iconButtonGroupContext.native.js.map +1 -1
  6. package/dist/cjs/Button/index.native.js +2 -2
  7. package/dist/cjs/Button/index.native.js.map +1 -1
  8. package/dist/cjs/Button/webGlass.native.js.map +1 -1
  9. package/dist/cjs/Chip/index.native.js.map +1 -1
  10. package/dist/cjs/Composer/index.cjs +10 -4
  11. package/dist/cjs/Composer/index.native.js +15 -9
  12. package/dist/cjs/Composer/index.native.js.map +1 -1
  13. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
  14. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  15. package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  16. package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  17. package/dist/cjs/ContextualSaveBar/index.native.js +3 -3
  18. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  19. package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  20. package/dist/cjs/ControlGroup/index.cjs +2 -1
  21. package/dist/cjs/ControlGroup/index.native.js +3 -2
  22. package/dist/cjs/ControlGroup/index.native.js.map +1 -1
  23. package/dist/cjs/DescriptionList/index.native.js +2 -2
  24. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  25. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  26. package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
  27. package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
  28. package/dist/cjs/FieldDisplay/index.native.js +1 -1
  29. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  30. package/dist/cjs/FieldGroup.native.js.map +1 -1
  31. package/dist/cjs/FloatingPanel/PanelHeader.native.js.map +1 -1
  32. package/dist/cjs/FloatingPanel/RegularPanel.native.js.map +1 -1
  33. package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -1
  34. package/dist/cjs/FloatingPanel/containingBlock.native.js.map +1 -1
  35. package/dist/cjs/FloatingPanel/coverRect.native.js.map +1 -1
  36. package/dist/cjs/FloatingPanel/echoContext.native.js.map +1 -1
  37. package/dist/cjs/FloatingPanel/index.cjs +11 -2
  38. package/dist/cjs/FloatingPanel/index.native.js +32 -17
  39. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  40. package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -1
  41. package/dist/cjs/FloatingPanel/paintedBox.native.js.map +1 -1
  42. package/dist/cjs/FloatingPanel/panelWidth.native.js.map +1 -1
  43. package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
  44. package/dist/cjs/FloatingPanel/regularPlacement.native.js.map +1 -1
  45. package/dist/cjs/FloatingPanel/trailingAction.native.js +1 -1
  46. package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -1
  47. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  48. package/dist/cjs/Form/index.native.js +1 -1
  49. package/dist/cjs/Form/index.native.js.map +1 -1
  50. package/dist/cjs/Form/submissionController.native.js.map +1 -1
  51. package/dist/cjs/Form/validateOn.native.js.map +1 -1
  52. package/dist/cjs/FormGrid.native.js.map +1 -1
  53. package/dist/cjs/FormSection.native.js.map +1 -1
  54. package/dist/cjs/InputParts/PasswordReveal.native.js.map +1 -1
  55. package/dist/cjs/InputParts/index.cjs +1 -0
  56. package/dist/cjs/InputParts/index.native.js +1 -0
  57. package/dist/cjs/InputParts/index.native.js.map +1 -1
  58. package/dist/cjs/InputParts/keyboardAppearance.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/haptic.native.js.map +1 -1
  69. package/dist/cjs/Wheel/index.cjs +22 -6
  70. package/dist/cjs/Wheel/index.native.js +26 -8
  71. package/dist/cjs/Wheel/index.native.js.map +1 -1
  72. package/dist/cjs/Wheel/wheelShared.native.js.map +1 -1
  73. package/dist/cjs/actionLabel.native.js.map +1 -1
  74. package/dist/cjs/fieldDefaults.native.js.map +1 -1
  75. package/dist/cjs/fieldLayout.native.js +1 -1
  76. package/dist/cjs/fieldLayout.native.js.map +1 -1
  77. package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
  78. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +1 -1
  79. package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
  80. package/dist/cjs/fields/Barcode/index.native.js +2 -2
  81. package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
  82. package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
  83. package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
  84. package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -1
  85. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  86. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  87. package/dist/cjs/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  88. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  89. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +1 -1
  90. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  91. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  92. package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
  93. package/dist/cjs/fields/ColorPicker/SystemColorField.native.js.map +1 -1
  94. package/dist/cjs/fields/ColorPicker/index.native.js +2 -2
  95. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  96. package/dist/cjs/fields/ColorPicker/parts.native.js +2 -2
  97. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  98. package/dist/cjs/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
  99. package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
  100. package/dist/cjs/fields/Combobox/index.native.js +5 -5
  101. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  102. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  103. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  104. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  105. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +3 -3
  106. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  107. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +2 -2
  108. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
  109. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  110. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  111. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  112. package/dist/cjs/fields/DatePicker/catalog.native.js +2 -2
  113. package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
  114. package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  115. package/dist/cjs/fields/DatePicker/index.native.js +2 -2
  116. package/dist/cjs/fields/DatePicker/parts.cjs +33 -30
  117. package/dist/cjs/fields/DatePicker/parts.native.js +36 -32
  118. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  119. package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
  120. package/dist/cjs/fields/Duration/DurationWheel.native.js +1 -1
  121. package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
  122. package/dist/cjs/fields/Duration/durationWheelTypes.native.js.map +1 -1
  123. package/dist/cjs/fields/Duration/index.native.js +3 -3
  124. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  125. package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  126. package/dist/cjs/fields/FileUpload/index.cjs +32 -15
  127. package/dist/cjs/fields/FileUpload/index.native.js +42 -21
  128. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  129. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  130. package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  131. package/dist/cjs/fields/Geolocation/geoValue.native.js.map +1 -1
  132. package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -1
  133. package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -1
  134. package/dist/cjs/fields/Geolocation/index.native.js +5 -5
  135. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  136. package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
  137. package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
  138. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  139. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  140. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  141. package/dist/cjs/fields/Icon/index.native.js +3 -3
  142. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  143. package/dist/cjs/fields/ImageField/index.cjs +35 -20
  144. package/dist/cjs/fields/ImageField/index.native.js +39 -22
  145. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  146. package/dist/cjs/fields/Input/index.native.js +3 -3
  147. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  148. package/dist/cjs/fields/MentionInput/index.native.js +3 -3
  149. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  150. package/dist/cjs/fields/OTPInput/index.native.js +3 -3
  151. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  152. package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
  153. package/dist/cjs/fields/OTPInput/otpCellEdge.native.js.map +1 -1
  154. package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
  155. package/dist/cjs/fields/PhoneInput/index.native.js +3 -3
  156. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  157. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  158. package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -1
  159. package/dist/cjs/fields/Progress/index.cjs +5 -0
  160. package/dist/cjs/fields/Progress/index.native.js +6 -1
  161. package/dist/cjs/fields/Progress/index.native.js.map +1 -1
  162. package/dist/cjs/fields/RadioGroup/index.native.js +1 -1
  163. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  164. package/dist/cjs/fields/Rating/index.native.js +1 -1
  165. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  166. package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
  167. package/dist/cjs/fields/Rating/types.native.js.map +1 -1
  168. package/dist/cjs/fields/SearchInput/index.native.js +2 -2
  169. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  170. package/dist/cjs/fields/Select/InlineChoices.native.js.map +1 -1
  171. package/dist/cjs/fields/Select/SheetPickerRow.native.js.map +1 -1
  172. package/dist/cjs/fields/Select/index.native.js +4 -4
  173. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  174. package/dist/cjs/fields/Select/shouldInlineChoices.native.js.map +1 -1
  175. package/dist/cjs/fields/Signature/index.native.js +2 -2
  176. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  177. package/dist/cjs/fields/Slider/index.cjs +38 -12
  178. package/dist/cjs/fields/Slider/index.native.js +40 -12
  179. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  180. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  181. package/dist/cjs/fields/Stepper/index.native.js +2 -2
  182. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  183. package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  184. package/dist/cjs/fields/Switch/footprint.native.js.map +1 -1
  185. package/dist/cjs/fields/Switch/index.cjs +10 -6
  186. package/dist/cjs/fields/Switch/index.native.js +12 -8
  187. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  188. package/dist/cjs/fields/TextArea/index.native.js +2 -2
  189. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  190. package/dist/cjs/fields/TimePicker/catalog.native.js +3 -3
  191. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
  192. package/dist/cjs/fields/TimePicker/index.native.js +2 -2
  193. package/dist/cjs/fields/TimePicker/parts.cjs +9 -10
  194. package/dist/cjs/fields/TimePicker/parts.native.js +10 -11
  195. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  196. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  197. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +2 -2
  198. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  199. package/dist/cjs/fields/ToggleGroup/index.cjs +1 -0
  200. package/dist/cjs/fields/ToggleGroup/index.native.js +2 -1
  201. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  202. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +1 -1
  203. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  204. package/dist/cjs/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  205. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  206. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
  207. package/dist/cjs/fields/nativeSelect.native.js.map +1 -1
  208. package/dist/cjs/fields/pickerHandle.cjs +18 -0
  209. package/dist/cjs/fields/pickerHandle.native.js +21 -0
  210. package/dist/cjs/fields/pickerHandle.native.js.map +1 -0
  211. package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
  212. package/dist/cjs/formSpacing.native.js.map +1 -1
  213. package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
  214. package/dist/cjs/hooks/useHoldCue.cjs +54 -0
  215. package/dist/cjs/hooks/useHoldCue.native.js +62 -0
  216. package/dist/cjs/hooks/useHoldCue.native.js.map +1 -0
  217. package/dist/cjs/index.cjs +15 -0
  218. package/dist/cjs/index.gnome.cjs +15 -0
  219. package/dist/cjs/index.gnome.native.js +52 -37
  220. package/dist/cjs/index.gnome.native.js.map +1 -1
  221. package/dist/cjs/index.native.js +61 -46
  222. package/dist/cjs/index.native.js.map +1 -1
  223. package/dist/cjs/keyboard/KeyboardDoneBar.native.js +1 -1
  224. package/dist/cjs/keyboard/chain.native.js.map +1 -1
  225. package/dist/cjs/keyboard/index.native.js.map +1 -1
  226. package/dist/cjs/keyboard/types.native.js.map +1 -1
  227. package/dist/cjs/nativeTwins.native.js.map +1 -1
  228. package/dist/cjs/requiredMarking.native.js.map +1 -1
  229. package/dist/cjs/shared/CheckGlyph.native.js.map +1 -1
  230. package/dist/cjs/shared/TimeColumn.native.js +1 -1
  231. package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
  232. package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
  233. package/dist/cjs/shared/checkedOnField.native.js.map +1 -1
  234. package/dist/cjs/shared/choiceRowPress.native.js.map +1 -1
  235. package/dist/cjs/shared/colorRamps.cjs +9 -7
  236. package/dist/cjs/shared/colorRamps.native.js +9 -7
  237. package/dist/cjs/shared/colorRamps.native.js.map +1 -1
  238. package/dist/cjs/shared/controlTrack.cjs +32 -0
  239. package/dist/cjs/shared/controlTrack.native.js +35 -0
  240. package/dist/cjs/shared/controlTrack.native.js.map +1 -0
  241. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  242. package/dist/cjs/shared/fieldRowContext.native.js.map +1 -1
  243. package/dist/cjs/shared/floatingList.native.js +1 -1
  244. package/dist/cjs/shared/floatingList.native.js.map +1 -1
  245. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  246. package/dist/cjs/shared/groupContext.native.js.map +1 -1
  247. package/dist/cjs/shared/i18n.native.js.map +1 -1
  248. package/dist/cjs/shared/instantMotion.native.js.map +1 -1
  249. package/dist/cjs/shared/nativeA11y.native.js.map +1 -1
  250. package/dist/cjs/shared/nativeAutoFocus.native.js.map +1 -1
  251. package/dist/cjs/shared/nativeOverlayWindow.native.js.map +1 -1
  252. package/dist/cjs/shared/overlaySizeClass.native.js.map +1 -1
  253. package/dist/cjs/shared/overlayStack.native.js.map +1 -1
  254. package/dist/cjs/shared/panelPortal.native.js.map +1 -1
  255. package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -1
  256. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
  257. package/dist/cjs/shared/restoreRetries.native.js.map +1 -1
  258. package/dist/cjs/shared/sheetDetents.cjs +109 -0
  259. package/dist/cjs/shared/sheetDetents.native.js +125 -0
  260. package/dist/cjs/shared/sheetDetents.native.js.map +1 -0
  261. package/dist/cjs/shared/sheetNavigation.native.js.map +1 -1
  262. package/dist/cjs/shared/systemControlModules.gnome.native.js.map +1 -1
  263. package/dist/cjs/shared/systemControls.native.js.map +1 -1
  264. package/dist/cjs/shared/t.native.js.map +1 -1
  265. package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
  266. package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
  267. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  268. package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
  269. package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
  270. package/dist/cjs/shared/utils.native.js +1 -1
  271. package/dist/cjs/shared/utils.native.js.map +1 -1
  272. package/dist/cjs/shared/zIndex.native.js.map +1 -1
  273. package/dist/cjs/standardActions.native.js.map +1 -1
  274. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  275. package/dist/cjs/types.native.js.map +1 -1
  276. package/dist/cjs/utils/LinkCell.native.js.map +1 -1
  277. package/dist/esm/Composer/index.mjs +10 -4
  278. package/dist/esm/Composer/index.mjs.map +1 -1
  279. package/dist/esm/Composer/index.native.js +14 -8
  280. package/dist/esm/Composer/index.native.js.map +1 -1
  281. package/dist/esm/ControlGroup/index.mjs +2 -1
  282. package/dist/esm/ControlGroup/index.mjs.map +1 -1
  283. package/dist/esm/ControlGroup/index.native.js +2 -1
  284. package/dist/esm/ControlGroup/index.native.js.map +1 -1
  285. package/dist/esm/FloatingPanel/index.mjs +12 -3
  286. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  287. package/dist/esm/FloatingPanel/index.native.js +31 -16
  288. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  289. package/dist/esm/InputParts/index.mjs +1 -0
  290. package/dist/esm/InputParts/index.mjs.map +1 -1
  291. package/dist/esm/InputParts/index.native.js +1 -0
  292. package/dist/esm/InputParts/index.native.js.map +1 -1
  293. package/dist/esm/Wheel/index.mjs +23 -7
  294. package/dist/esm/Wheel/index.mjs.map +1 -1
  295. package/dist/esm/Wheel/index.native.js +27 -9
  296. package/dist/esm/Wheel/index.native.js.map +1 -1
  297. package/dist/esm/fields/DatePicker/parts.mjs +35 -32
  298. package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
  299. package/dist/esm/fields/DatePicker/parts.native.js +36 -32
  300. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  301. package/dist/esm/fields/FileUpload/index.mjs +33 -16
  302. package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
  303. package/dist/esm/fields/FileUpload/index.native.js +41 -20
  304. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  305. package/dist/esm/fields/ImageField/index.mjs +36 -21
  306. package/dist/esm/fields/ImageField/index.mjs.map +1 -1
  307. package/dist/esm/fields/ImageField/index.native.js +38 -21
  308. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  309. package/dist/esm/fields/Progress/index.mjs +5 -0
  310. package/dist/esm/fields/Progress/index.mjs.map +1 -1
  311. package/dist/esm/fields/Progress/index.native.js +5 -0
  312. package/dist/esm/fields/Progress/index.native.js.map +1 -1
  313. package/dist/esm/fields/Slider/index.mjs +38 -12
  314. package/dist/esm/fields/Slider/index.mjs.map +1 -1
  315. package/dist/esm/fields/Slider/index.native.js +39 -11
  316. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  317. package/dist/esm/fields/Switch/index.mjs +10 -6
  318. package/dist/esm/fields/Switch/index.mjs.map +1 -1
  319. package/dist/esm/fields/Switch/index.native.js +10 -6
  320. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  321. package/dist/esm/fields/TimePicker/parts.mjs +9 -10
  322. package/dist/esm/fields/TimePicker/parts.mjs.map +1 -1
  323. package/dist/esm/fields/TimePicker/parts.native.js +9 -10
  324. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  325. package/dist/esm/fields/ToggleGroup/index.mjs +2 -1
  326. package/dist/esm/fields/ToggleGroup/index.mjs.map +1 -1
  327. package/dist/esm/fields/ToggleGroup/index.native.js +2 -1
  328. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  329. package/dist/esm/fields/pickerHandle.mjs +2 -0
  330. package/dist/esm/fields/pickerHandle.mjs.map +1 -0
  331. package/dist/esm/fields/pickerHandle.native.js +2 -0
  332. package/dist/esm/fields/pickerHandle.native.js.map +1 -0
  333. package/dist/esm/hooks/useHoldCue.mjs +27 -0
  334. package/dist/esm/hooks/useHoldCue.mjs.map +1 -0
  335. package/dist/esm/hooks/useHoldCue.native.js +32 -0
  336. package/dist/esm/hooks/useHoldCue.native.js.map +1 -0
  337. package/dist/esm/index.gnome.mjs +3 -1
  338. package/dist/esm/index.gnome.mjs.map +1 -1
  339. package/dist/esm/index.gnome.native.js +3 -1
  340. package/dist/esm/index.gnome.native.js.map +1 -1
  341. package/dist/esm/index.mjs +3 -1
  342. package/dist/esm/index.mjs.map +1 -1
  343. package/dist/esm/index.native.js +3 -1
  344. package/dist/esm/index.native.js.map +1 -1
  345. package/dist/esm/shared/colorRamps.mjs +9 -7
  346. package/dist/esm/shared/colorRamps.mjs.map +1 -1
  347. package/dist/esm/shared/colorRamps.native.js +9 -7
  348. package/dist/esm/shared/colorRamps.native.js.map +1 -1
  349. package/dist/esm/shared/controlTrack.mjs +7 -0
  350. package/dist/esm/shared/controlTrack.mjs.map +1 -0
  351. package/dist/esm/shared/controlTrack.native.js +7 -0
  352. package/dist/esm/shared/controlTrack.native.js.map +1 -0
  353. package/dist/esm/shared/nativeOverlayWindow.mjs.map +1 -1
  354. package/dist/esm/shared/sheetDetents.mjs +75 -0
  355. package/dist/esm/shared/sheetDetents.mjs.map +1 -0
  356. package/dist/esm/shared/sheetDetents.native.js +88 -0
  357. package/dist/esm/shared/sheetDetents.native.js.map +1 -0
  358. package/dist/esm/shared/systemControls.mjs.map +1 -1
  359. package/dist/esm/shared/systemControls.native.js.map +1 -1
  360. package/dist/jsx/Composer/index.mjs +10 -4
  361. package/dist/jsx/Composer/index.mjs.map +1 -1
  362. package/dist/jsx/Composer/index.native.js +14 -8
  363. package/dist/jsx/Composer/index.native.js.map +1 -1
  364. package/dist/jsx/ControlGroup/index.mjs +2 -1
  365. package/dist/jsx/ControlGroup/index.mjs.map +1 -1
  366. package/dist/jsx/ControlGroup/index.native.js +2 -1
  367. package/dist/jsx/ControlGroup/index.native.js.map +1 -1
  368. package/dist/jsx/FloatingPanel/index.mjs +12 -3
  369. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  370. package/dist/jsx/FloatingPanel/index.native.js +32 -17
  371. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  372. package/dist/jsx/InputParts/index.mjs +1 -0
  373. package/dist/jsx/InputParts/index.mjs.map +1 -1
  374. package/dist/jsx/InputParts/index.native.js +1 -0
  375. package/dist/jsx/InputParts/index.native.js.map +1 -1
  376. package/dist/jsx/Wheel/index.mjs +23 -7
  377. package/dist/jsx/Wheel/index.mjs.map +1 -1
  378. package/dist/jsx/Wheel/index.native.js +26 -8
  379. package/dist/jsx/Wheel/index.native.js.map +1 -1
  380. package/dist/jsx/fields/DatePicker/parts.mjs +35 -32
  381. package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
  382. package/dist/jsx/fields/DatePicker/parts.native.js +34 -30
  383. package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
  384. package/dist/jsx/fields/FileUpload/index.mjs +33 -16
  385. package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
  386. package/dist/jsx/fields/FileUpload/index.native.js +40 -19
  387. package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
  388. package/dist/jsx/fields/ImageField/index.mjs +36 -21
  389. package/dist/jsx/fields/ImageField/index.mjs.map +1 -1
  390. package/dist/jsx/fields/ImageField/index.native.js +37 -20
  391. package/dist/jsx/fields/ImageField/index.native.js.map +1 -1
  392. package/dist/jsx/fields/Progress/index.mjs +5 -0
  393. package/dist/jsx/fields/Progress/index.mjs.map +1 -1
  394. package/dist/jsx/fields/Progress/index.native.js +5 -0
  395. package/dist/jsx/fields/Progress/index.native.js.map +1 -1
  396. package/dist/jsx/fields/Slider/index.mjs +38 -12
  397. package/dist/jsx/fields/Slider/index.mjs.map +1 -1
  398. package/dist/jsx/fields/Slider/index.native.js +39 -11
  399. package/dist/jsx/fields/Slider/index.native.js.map +1 -1
  400. package/dist/jsx/fields/Switch/index.mjs +10 -6
  401. package/dist/jsx/fields/Switch/index.mjs.map +1 -1
  402. package/dist/jsx/fields/Switch/index.native.js +10 -6
  403. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  404. package/dist/jsx/fields/TimePicker/parts.mjs +9 -10
  405. package/dist/jsx/fields/TimePicker/parts.mjs.map +1 -1
  406. package/dist/jsx/fields/TimePicker/parts.native.js +9 -10
  407. package/dist/jsx/fields/TimePicker/parts.native.js.map +1 -1
  408. package/dist/jsx/fields/ToggleGroup/index.mjs +2 -1
  409. package/dist/jsx/fields/ToggleGroup/index.mjs.map +1 -1
  410. package/dist/jsx/fields/ToggleGroup/index.native.js +1 -0
  411. package/dist/jsx/fields/ToggleGroup/index.native.js.map +1 -1
  412. package/dist/jsx/fields/pickerHandle.mjs +2 -0
  413. package/dist/jsx/fields/pickerHandle.mjs.map +1 -0
  414. package/dist/jsx/fields/pickerHandle.native.js +21 -0
  415. package/dist/jsx/fields/pickerHandle.native.js.map +1 -0
  416. package/dist/jsx/hooks/useHoldCue.mjs +27 -0
  417. package/dist/jsx/hooks/useHoldCue.mjs.map +1 -0
  418. package/dist/jsx/hooks/useHoldCue.native.js +62 -0
  419. package/dist/jsx/hooks/useHoldCue.native.js.map +1 -0
  420. package/dist/jsx/index.gnome.mjs +3 -1
  421. package/dist/jsx/index.gnome.mjs.map +1 -1
  422. package/dist/jsx/index.gnome.native.js +15 -0
  423. package/dist/jsx/index.gnome.native.js.map +1 -1
  424. package/dist/jsx/index.js +3 -1
  425. package/dist/jsx/index.js.map +1 -1
  426. package/dist/jsx/index.mjs +3 -1
  427. package/dist/jsx/index.mjs.map +1 -1
  428. package/dist/jsx/index.native.js +15 -0
  429. package/dist/jsx/index.native.js.map +1 -1
  430. package/dist/jsx/shared/colorRamps.mjs +9 -7
  431. package/dist/jsx/shared/colorRamps.mjs.map +1 -1
  432. package/dist/jsx/shared/colorRamps.native.js +9 -7
  433. package/dist/jsx/shared/colorRamps.native.js.map +1 -1
  434. package/dist/jsx/shared/controlTrack.mjs +7 -0
  435. package/dist/jsx/shared/controlTrack.mjs.map +1 -0
  436. package/dist/jsx/shared/controlTrack.native.js +35 -0
  437. package/dist/jsx/shared/controlTrack.native.js.map +1 -0
  438. package/dist/jsx/shared/nativeOverlayWindow.mjs.map +1 -1
  439. package/dist/jsx/shared/nativeOverlayWindow.native.js.map +1 -1
  440. package/dist/jsx/shared/sheetDetents.mjs +75 -0
  441. package/dist/jsx/shared/sheetDetents.mjs.map +1 -0
  442. package/dist/jsx/shared/sheetDetents.native.js +125 -0
  443. package/dist/jsx/shared/sheetDetents.native.js.map +1 -0
  444. package/dist/jsx/shared/systemControls.mjs.map +1 -1
  445. package/package.json +11 -10
  446. package/src/Button/Button.controlTiers.spec.tsx +2 -2
  447. package/src/Composer/Composer.glass.spec.tsx +106 -0
  448. package/src/Composer/Composer.spec.tsx +11 -2
  449. package/src/Composer/index.tsx +11 -8
  450. package/src/ControlGroup/index.tsx +2 -1
  451. package/src/FloatingPanel/FloatingPanel.holdCue.native.spec.tsx +72 -0
  452. package/src/FloatingPanel/index.native.tsx +18 -19
  453. package/src/FloatingPanel/index.tsx +24 -2
  454. package/src/InputParts/index.tsx +1 -0
  455. package/src/Wheel/Wheel.edgeFade.spec.tsx +74 -0
  456. package/src/Wheel/index.tsx +25 -11
  457. package/src/fields/DatePicker/dateFieldMarks.spec.tsx +154 -0
  458. package/src/fields/DatePicker/parts.tsx +33 -30
  459. package/src/fields/FileUpload/index.tsx +45 -16
  460. package/src/fields/ImageField/index.tsx +42 -19
  461. package/src/fields/Progress/index.tsx +3 -0
  462. package/src/fields/Slider/Slider.system.native.spec.tsx +44 -0
  463. package/src/fields/Slider/index.tsx +40 -12
  464. package/src/fields/Stepper/Stepper.stories.tsx +42 -0
  465. package/src/fields/Switch/Switch.spec.tsx +14 -10
  466. package/src/fields/Switch/index.tsx +11 -7
  467. package/src/fields/TimePicker/parts.tsx +8 -8
  468. package/src/fields/ToggleGroup/index.tsx +7 -1
  469. package/src/fields/fieldTriggerSlot.spec.tsx +89 -0
  470. package/src/fields/pickerHandle.ts +13 -0
  471. package/src/hooks/useHoldCue.ts +26 -0
  472. package/src/index.gnome.ts +19 -0
  473. package/src/index.ts +20 -0
  474. package/src/overlayGround.spec.ts +5 -3
  475. package/src/shared/OverlayWindow.tsx +2 -2
  476. package/src/shared/colorRamps.ts +9 -6
  477. package/src/shared/controlTrack.ts +7 -0
  478. package/src/shared/nativeOverlayWindow.tsx +1 -1
  479. package/src/shared/sheetDetents.spec.ts +117 -0
  480. package/src/shared/sheetDetents.ts +183 -0
  481. package/src/shared/systemControls.ts +10 -2
  482. package/types/Composer/index.d.ts.map +1 -1
  483. package/types/ControlGroup/index.d.ts.map +1 -1
  484. package/types/FloatingPanel/index.d.ts +9 -0
  485. package/types/FloatingPanel/index.d.ts.map +1 -1
  486. package/types/FloatingPanel/index.native.d.ts +1 -1
  487. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  488. package/types/InputParts/index.d.ts +4 -4
  489. package/types/InputParts/index.d.ts.map +1 -1
  490. package/types/Wheel/index.d.ts.map +1 -1
  491. package/types/fields/DatePicker/parts.d.ts +4 -3
  492. package/types/fields/DatePicker/parts.d.ts.map +1 -1
  493. package/types/fields/FileUpload/index.d.ts +6 -1
  494. package/types/fields/FileUpload/index.d.ts.map +1 -1
  495. package/types/fields/ImageField/index.d.ts +7 -2
  496. package/types/fields/ImageField/index.d.ts.map +1 -1
  497. package/types/fields/Progress/index.d.ts.map +1 -1
  498. package/types/fields/Slider/index.d.ts.map +1 -1
  499. package/types/fields/Switch/index.d.ts.map +1 -1
  500. package/types/fields/ToggleGroup/index.d.ts.map +1 -1
  501. package/types/fields/pickerHandle.d.ts +12 -0
  502. package/types/fields/pickerHandle.d.ts.map +1 -0
  503. package/types/hooks/useHoldCue.d.ts +10 -0
  504. package/types/hooks/useHoldCue.d.ts.map +1 -0
  505. package/types/index.d.ts +4 -0
  506. package/types/index.d.ts.map +1 -1
  507. package/types/index.gnome.d.ts +3 -0
  508. package/types/index.gnome.d.ts.map +1 -1
  509. package/types/shared/OverlayWindow.d.ts +2 -2
  510. package/types/shared/OverlayWindow.d.ts.map +1 -1
  511. package/types/shared/colorRamps.d.ts +8 -6
  512. package/types/shared/colorRamps.d.ts.map +1 -1
  513. package/types/shared/controlTrack.d.ts +3 -0
  514. package/types/shared/controlTrack.d.ts.map +1 -0
  515. package/types/shared/nativeOverlayWindow.d.ts +1 -1
  516. package/types/shared/nativeOverlayWindow.d.ts.map +1 -1
  517. package/types/shared/sheetDetents.d.ts +122 -0
  518. package/types/shared/sheetDetents.d.ts.map +1 -0
  519. package/types/shared/systemControls.d.ts +2 -1
  520. package/types/shared/systemControls.d.ts.map +1 -1
@@ -124,10 +124,12 @@ import {
124
124
  scrollArrowBand,
125
125
  scrollArrowThreshold,
126
126
  } from "../shared/checkedOnField";
127
+ import { holdCueScale, useHoldCue } from "../hooks/useHoldCue";
127
128
  import { useInsideOverlay, useOverlayZIndex } from "../shared/overlayStack";
128
129
  import { OverlayWindow } from "../shared/OverlayWindow";
129
130
  import { t } from "../shared/t";
130
131
  import { overlaySizeClass } from "../shared/overlaySizeClass";
132
+ import { minSheetHeight, resolveSheetDetents, sheetDismissThreshold } from "../shared/sheetDetents";
131
133
  import { useKeyboardInset } from "../shared/useKeyboardInset";
132
134
  import type { FloatingPanelProps } from "./index";
133
135
  import { MENU_MIN_WIDTH, resolveCompactFace } from "./compactFace";
@@ -176,14 +178,6 @@ const bottomInset = Platform.OS === "ios" ? 24 : 16;
176
178
  // Backdrop left visible above the sheet: the scrim has to stay tappable, and a
177
179
  // sheet flush with the status bar reads as a page, not a sheet.
178
180
  const backdropStrip = 48;
179
- // Never collapse to nothing on a landscape phone with the keyboard up.
180
- const minSheetHeight = 180;
181
- // Half-open detent for a sheet that owns a scrollport, as a fraction of its
182
- // full height. The web path hands Tamagui's Sheet [92, 50, 25]; on a phone one
183
- // intermediate stop is the only one worth having.
184
- const mediumDetent = 0.55;
185
- // Released more than this far below the smallest detent, the sheet dismisses.
186
- const dismissThreshold = 56;
187
181
 
188
182
  export function FloatingPanel({
189
183
  open,
@@ -194,6 +188,7 @@ export function FloatingPanel({
194
188
  triggerSizing = "stretch",
195
189
  children: panelChildren,
196
190
  scrollable,
191
+ detents,
197
192
  disabled,
198
193
  contentPadding = "default",
199
194
  header,
@@ -244,8 +239,10 @@ export function FloatingPanel({
244
239
  const handleTriggerPress = useCallback(() => {
245
240
  if (!disabled) onOpenChange(!open);
246
241
  }, [disabled, onOpenChange, open]);
242
+ const hold = useHoldCue();
247
243
  const handleTriggerLongPress = useCallback(
248
244
  (event?: GestureResponderEvent) => {
245
+ hold.stop();
249
246
  if (disabled) return;
250
247
  const { pageX, pageY } = event?.nativeEvent ?? {};
251
248
  setPressPoint(
@@ -253,7 +250,7 @@ export function FloatingPanel({
253
250
  );
254
251
  onOpenChange(true);
255
252
  },
256
- [disabled, onOpenChange],
253
+ [disabled, onOpenChange, hold.stop],
257
254
  );
258
255
  const isContextMenu = openOn === "contextmenu";
259
256
  // A long-press menu never eats its trigger's tap: the web lets the primary
@@ -369,13 +366,10 @@ export function FloatingPanel({
369
366
  // A content-sized picker has exactly one useful resting height; only a sheet
370
367
  // that owns a scrollport can meaningfully sit half-open.
371
368
  const isSheet = !!scrollable || !!sheetFill;
372
- const detents = useMemo(() => {
373
- if (!isSheet) return [travel];
374
- const points = [travel, Math.round(travel * mediumDetent)].filter(
375
- (h) => h >= Math.min(minSheetHeight, travel),
376
- );
377
- return Array.from(new Set(points)).sort((a, b) => b - a);
378
- }, [isSheet, travel]);
369
+ const detentHeights = useMemo(
370
+ () => resolveSheetDetents({ travel, detents, scrollable: isSheet }),
371
+ [detents, isSheet, travel],
372
+ );
379
373
 
380
374
  // Start OFF-SCREEN. `0` is "fully expanded", so a 0 default paints the
381
375
  // sheet at rest for one frame, then onShow jumps it to `travel` and
@@ -385,9 +379,9 @@ export function FloatingPanel({
385
379
  // callbacks are created once and must not close over a stale value.
386
380
  const restRef = useRef(10000);
387
381
  const travelRef = useRef(travel);
388
- const detentsRef = useRef(detents);
382
+ const detentsRef = useRef(detentHeights);
389
383
  travelRef.current = travel;
390
- detentsRef.current = detents;
384
+ detentsRef.current = detentHeights;
391
385
 
392
386
  // Async callbacks belong to one committed presentation, never its successor.
393
387
  const presentationRef = useRef(0);
@@ -518,7 +512,7 @@ export function FloatingPanel({
518
512
  // so a fast short flick still changes detent.
519
513
  const projected = current + g.vy * 120;
520
514
  const smallestRest = t - points[points.length - 1];
521
- if (projected > smallestRest + dismissThreshold || g.vy > 1.1) {
515
+ if (projected > smallestRest + sheetDismissThreshold || g.vy > 1.1) {
522
516
  dismiss(g.vy);
523
517
  return;
524
518
  }
@@ -629,6 +623,10 @@ export function FloatingPanel({
629
623
  ? {
630
624
  onLongPress: handleTriggerLongPress,
631
625
  delayLongPress: 500,
626
+ ...(disabled
627
+ ? undefined
628
+ : { delayPressIn: 0, onPressIn: hold.start, onPressOut: hold.stop }),
629
+ ...(hold.holding ? { dataSet: { hold: "progress" } } : undefined),
632
630
  ...(triggerOwn?.onPress && !disabled ? { onPress: triggerOwn.onPress } : undefined),
633
631
  }
634
632
  : { onPress: handleTriggerPress })}
@@ -648,6 +646,7 @@ export function FloatingPanel({
648
646
  alignSelf: "stretch",
649
647
  width: triggerSizing === "content" ? undefined : "100%",
650
648
  opacity: disabled ? 0.5 : 1,
649
+ ...(hold.holding ? { transform: [{ scale: holdCueScale }] } : undefined),
651
650
  }}
652
651
  >
653
652
  {/* Own the hit target — see file header for why pointerEvents="none". */}
@@ -11,6 +11,7 @@ import {
11
11
  useCallback,
12
12
  useEffect,
13
13
  useLayoutEffect,
14
+ useMemo,
14
15
  useRef,
15
16
  useState,
16
17
  useSyncExternalStore,
@@ -31,6 +32,7 @@ import { ScrollArrow } from "../shared/floatingList";
31
32
  import { TrailingActionOverlay, TriggerWithTrailingAction } from "./trailingAction";
32
33
  import { useReturnFocusOnClose, useSheetModalFocus } from "../shared/focusManagement";
33
34
  import { useSheetEscapeDismiss } from "../shared/useSheetEscapeDismiss";
35
+ import { resolveDetentPercents } from "../shared/sheetDetents";
34
36
  import { useFloatingPanel, panelViewportPadding, paintedCornerBox } from "./useFloatingPanel";
35
37
  import { fixedContainingBlockOrigin } from "./containingBlock";
36
38
  import type { PanelWidthMode } from "./useFloatingPanel";
@@ -48,6 +50,12 @@ import { PanelPortal } from "./PanelPortal";
48
50
  import { PanelSheetContext } from "./echoContext";
49
51
  import { iconCoverRect } from "./coverRect";
50
52
  import { groupSurfaceOf, paintedTriggerBox } from "./paintedBox";
53
+
54
+ /**
55
+ * The scrollable sheet face's shipped stops. A caller's `detents` replaces
56
+ * them; nothing else does, so no existing sheet changes shape (FZ-455).
57
+ */
58
+ const defaultSheetSnapPoints = [92, 50, 25];
51
59
  import {
52
60
  contextMenuPoint,
53
61
  placeOverTrigger,
@@ -135,6 +143,15 @@ export interface FloatingPanelProps {
135
143
  * overflow/scroll is for non-interactive lists.
136
144
  */
137
145
  scrollable?: boolean;
146
+ /**
147
+ * The rest positions the sheet face may settle at, as percents of its full
148
+ * height (FZ-455), the way `UISheetPresentationController.detents` takes an
149
+ * array. A finger on the grabber drags between them and releases onto the
150
+ * nearest. Order does not matter and `sheetDetent.medium` / `.large` name
151
+ * the HIG rungs. Omitted, a scrollable sheet keeps its three default stops
152
+ * and a content-sized panel its single height, so no existing panel moves.
153
+ */
154
+ detents?: number[];
138
155
  disabled?: boolean;
139
156
  /**
140
157
  * Force Sheet mode (slide-up panel) even on desktop.
@@ -619,6 +636,7 @@ function FloatingPanelSheet({
619
636
  triggerSizing = "stretch",
620
637
  children,
621
638
  scrollable,
639
+ detents,
622
640
  disabled,
623
641
  contentPadding = "default",
624
642
  transition: transitionProp,
@@ -639,6 +657,10 @@ function FloatingPanelSheet({
639
657
  transition: transitionProp ?? knobProps.motion.scrim.transition,
640
658
  };
641
659
  const [position, setPosition] = useState(0);
660
+ const sheetSnapPoints = useMemo(() => {
661
+ if (detents?.length) return resolveDetentPercents({ detents });
662
+ return scrollable ? defaultSheetSnapPoints : undefined;
663
+ }, [detents, scrollable]);
642
664
 
643
665
  const handleOpenChange = (next: boolean) => {
644
666
  if (disabled) return;
@@ -719,8 +741,8 @@ function FloatingPanelSheet({
719
741
  modal
720
742
  open={open}
721
743
  onOpenChange={handleOpenChange}
722
- snapPoints={scrollable ? [92, 50, 25] : undefined}
723
- snapPointsMode={scrollable ? "percent" : "fit"}
744
+ snapPoints={sheetSnapPoints}
745
+ snapPointsMode={sheetSnapPoints ? "percent" : "fit"}
724
746
  dismissOnSnapToBottom
725
747
  position={position}
726
748
  onPositionChange={setPosition}
@@ -634,6 +634,7 @@ const InputGroupImpl = InputGroupFrame.styleable<{
634
634
  {...(knobProps.elevation == null ? { elevation: undefined } : knobProps.elevationChrome)}
635
635
  {...knobProps.borderRadius}
636
636
  borderWidth={knobProps.fieldEdge.borderWidth}
637
+ borderColor={formInputColors.border.base}
637
638
  {...hiddenEdge}
638
639
  {...sizeTableRadius}
639
640
  {...transitionProps(knobProps.motion.control)}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * The web wheel's edge fade (FZ-8080): a LinearGradient veil of the surface the
3
+ * wheel sits on, never a CSS mask on the drum.
4
+ */
5
+ import { SurfaceContext } from "@multiplatform.one/theme";
6
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
7
+ import { cleanup, screen } from "@testing-library/react";
8
+ import { createElement } from "react";
9
+ import { Theme, useTheme } from "tamagui";
10
+ import { afterEach, describe, expect, it, vi } from "vitest";
11
+ import { Wheel } from "./index";
12
+
13
+ vi.mock("tamagui/linear-gradient", () => ({
14
+ LinearGradient: (props: Record<string, unknown>) =>
15
+ createElement("span", {
16
+ "data-testid": props["data-testid"],
17
+ "data-colors": JSON.stringify(props.colors),
18
+ "data-locations": JSON.stringify(props.locations),
19
+ "data-opacity": props.opacity,
20
+ "data-pointer-events": props.pointerEvents,
21
+ }),
22
+ }));
23
+
24
+ afterEach(cleanup);
25
+
26
+ const items = Array.from({ length: 24 }, (_, i) => i);
27
+ const seen = { background: "" };
28
+
29
+ function Probe() {
30
+ seen.background = String(useTheme().background?.val);
31
+ return null;
32
+ }
33
+
34
+ describe("web Wheel edge fade (FZ-8080)", () => {
35
+ it("paints no CSS mask on the drum", () => {
36
+ renderWithProviders(<Wheel items={items} value={6} onChange={() => {}} />);
37
+ const drum = screen.getByTestId("wheel-wrapper");
38
+ expect(drum.style.maskImage).toBe("");
39
+ expect(drum.style.getPropertyValue("-webkit-mask-image")).toBe("");
40
+ });
41
+
42
+ it("veils both ends in the page surface and leaves the selection band clear", () => {
43
+ renderWithProviders(
44
+ <>
45
+ <Probe />
46
+ <Wheel items={items} value={6} onChange={() => {}} />
47
+ </>,
48
+ );
49
+ const fade = screen.getByTestId("wheel-fade");
50
+ expect(JSON.parse(fade.getAttribute("data-colors")!)).toEqual([
51
+ seen.background,
52
+ "transparent",
53
+ "transparent",
54
+ seen.background,
55
+ ]);
56
+ expect(JSON.parse(fade.getAttribute("data-locations")!)).toEqual([0, 0.32, 0.68, 1]);
57
+ expect(fade.getAttribute("data-opacity")).toBe("0.72");
58
+ expect(fade.getAttribute("data-pointer-events")).toBe("none");
59
+ });
60
+
61
+ it("veils in the elevated surface on a dark overlay", () => {
62
+ renderWithProviders(
63
+ <Theme name="dark">
64
+ <SurfaceContext.Provider elevated>
65
+ <Probe />
66
+ <Wheel items={items} value={6} onChange={() => {}} />
67
+ </SurfaceContext.Provider>
68
+ </Theme>,
69
+ );
70
+ const colors = JSON.parse(screen.getByTestId("wheel-fade").getAttribute("data-colors")!);
71
+ expect(colors[0]).not.toBe(seen.background);
72
+ expect(colors[0]).toBe(colors[3]);
73
+ });
74
+ });
@@ -1,7 +1,8 @@
1
- import type { CSSProperties } from "react";
1
+ import { useElevatedSurface } from "@multiplatform.one/theme";
2
2
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
3
  import type { GetProps } from "tamagui";
4
- import { View, isWeb, styled, Text } from "tamagui";
4
+ import { View, isWeb, styled, Text, useTheme } from "tamagui";
5
+ import { LinearGradient } from "tamagui/linear-gradient";
5
6
  import { t } from "../shared/t";
6
7
  import { fireSelectionHaptic } from "./haptic";
7
8
  import { NativeWheel } from "./NativeWheel";
@@ -49,14 +50,8 @@ function ensureWheelFocusStyles() {
49
50
  document.head.appendChild(style);
50
51
  }
51
52
 
52
- const wheelMaskStyle: CSSProperties | undefined = isWeb
53
- ? {
54
- WebkitMaskImage:
55
- "linear-gradient(to bottom, rgba(0,0,0,0.28) 0%, #000 32%, #000 68%, rgba(0,0,0,0.28) 100%)",
56
- maskImage:
57
- "linear-gradient(to bottom, rgba(0,0,0,0.28) 0%, #000 32%, #000 68%, rgba(0,0,0,0.28) 100%)",
58
- }
59
- : undefined;
53
+ const wheelFadeStops = [0, 0.32, 0.68, 1];
54
+ const wheelFadeOpacity = 0.72;
60
55
 
61
56
  // ── Styled components ─────────────────────────────────────────
62
57
 
@@ -164,6 +159,12 @@ function WebWheel<T = string | number>(props: WheelProps<T>) {
164
159
  highlightClassName,
165
160
  } = useWheelLayout(props);
166
161
  const columnWidth = widthProp ?? defaultColumnWidth;
162
+ const theme = useTheme();
163
+ const elevatedGround = useElevatedSurface();
164
+ const fadeKey = (
165
+ elevatedGround ? knobProps.elevatedSurface.backgroundColor : "$background"
166
+ ) as string;
167
+ const fadeSurface = String(theme[fadeKey.replace(/^\$/, "") as "background"]?.val ?? fadeKey);
167
168
  ensureWheelFocusStyles();
168
169
  const containerRef = useRef<HTMLDivElement>(null);
169
170
  const [scrollOffset, setScrollOffset] = useState(0);
@@ -714,7 +715,6 @@ function WebWheel<T = string | number>(props: WheelProps<T>) {
714
715
  userSelect: "none",
715
716
  touchAction: "none",
716
717
  cursor: disabled ? "not-allowed" : "grab",
717
- ...wheelMaskStyle,
718
718
  }}
719
719
  onPointerDown={handlePointerDown as any}
720
720
  onPointerMove={handlePointerMove as any}
@@ -757,6 +757,20 @@ function WebWheel<T = string | number>(props: WheelProps<T>) {
757
757
  );
758
758
  })}
759
759
  </div>
760
+ <LinearGradient
761
+ data-testid="wheel-fade"
762
+ pointerEvents="none"
763
+ position="absolute"
764
+ top={0}
765
+ right={0}
766
+ bottom={0}
767
+ left={0}
768
+ opacity={wheelFadeOpacity}
769
+ colors={[fadeSurface, "transparent", "transparent", fadeSurface]}
770
+ locations={wheelFadeStops}
771
+ start={[0, 0]}
772
+ end={[0, 1]}
773
+ />
760
774
  </WheelContainer>
761
775
  );
762
776
  }
@@ -0,0 +1,154 @@
1
+ import { CalendarBlankIcon, ClockIcon } from "@phosphor-icons/react";
2
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
3
+ import {
4
+ createThemesBuilder,
5
+ defaultAccentTheme,
6
+ defaultBaseTheme,
7
+ defaultBuilderOptions,
8
+ } from "@multiplatform.one/theme";
9
+ import { configWithoutAnimations } from "@tamagui/config";
10
+ import { animationsCSS } from "@tamagui/config/v5-css";
11
+ import { render } from "@testing-library/react";
12
+ import type { ReactElement } from "react";
13
+ import { renderToStaticMarkup } from "react-dom/server";
14
+ import { TamaguiProvider, createTamagui } from "tamagui";
15
+ import { describe, expect, it, vi } from "vitest";
16
+ import { Input } from "../Input";
17
+ import { TimePicker } from "../TimePicker";
18
+ import { DatePicker, DatetimePicker } from "./index";
19
+ import { CalendarDays, MonthGrid, YearGrid, isSameDay, useCalendarData } from "./parts";
20
+
21
+ vi.mock("@multiplatform.one/storybook", () => ({ action: () => () => {} }));
22
+ vi.mock("@multiplatform.one/table", () => ({ DataTable: () => null }));
23
+
24
+ const houseThemes = createThemesBuilder(
25
+ defaultBaseTheme,
26
+ defaultAccentTheme,
27
+ defaultBuilderOptions,
28
+ ).themes() as Record<string, Record<string, string>>;
29
+
30
+ const houseConfig = createTamagui({
31
+ ...configWithoutAnimations,
32
+ animations: animationsCSS,
33
+ themes: houseThemes as never,
34
+ });
35
+
36
+ function placeholderInk(node: ReactElement) {
37
+ const { container, unmount } = renderWithProviders(node);
38
+ const input = container.querySelector("input");
39
+ expect(input).toBeTruthy();
40
+ const ink = input!.style.getPropertyValue("--t_placeholderColor");
41
+ unmount();
42
+ return ink;
43
+ }
44
+
45
+ function pathOf(icon: ReactElement) {
46
+ return renderToStaticMarkup(icon).match(/ d="([^"]+)"/)![1];
47
+ }
48
+
49
+ function June() {
50
+ const calendarData = useCalendarData(new Date(2024, 5, 15));
51
+ return (
52
+ <CalendarDays
53
+ calendarData={calendarData}
54
+ isSelected={(day) => isSameDay(day, new Date(2024, 5, 15))}
55
+ onSelect={() => {}}
56
+ />
57
+ );
58
+ }
59
+
60
+ function selectedCell(node: ReactElement, scheme: "light" | "dark") {
61
+ const { container } = render(
62
+ <TamaguiProvider config={houseConfig} defaultTheme={scheme} disableInjectCSS>
63
+ {node}
64
+ </TamaguiProvider>,
65
+ );
66
+ const cell = container.querySelector<HTMLElement>("[aria-pressed='true']");
67
+ expect(cell).toBeTruthy();
68
+ return cell!;
69
+ }
70
+
71
+ describe("date and time fields read empty, name their kind and mark the pick (FZ-8433)", () => {
72
+ const stock = placeholderInk(<Input label="Name" placeholder="Your name" />);
73
+
74
+ it.each([
75
+ ["DatePicker", <DatePicker key="d" label="Date" placeholder="Pick a date" />],
76
+ ["DatetimePicker", <DatetimePicker key="dt" label="When" placeholder="Pick a time" />],
77
+ ["TimePicker", <TimePicker key="t" label="Time" placeholder="Select time" />],
78
+ ])("an empty %s draws its placeholder in the theme's placeholder ink", (_name, node) => {
79
+ const ink = placeholderInk(node);
80
+ expect(stock).not.toBe("");
81
+ expect(ink).toBe(stock);
82
+ expect(ink).not.toBe("var(--color11)");
83
+ });
84
+
85
+ it.each([
86
+ [
87
+ "DatetimePicker",
88
+ <DatetimePicker key="dt" label="When" />,
89
+ "date-picker-glyph",
90
+ CalendarBlankIcon,
91
+ ],
92
+ ["DatePicker", <DatePicker key="d" label="Date" />, "date-picker-glyph", CalendarBlankIcon],
93
+ ["TimePicker", <TimePicker key="t" label="Time" />, "time-picker-glyph", ClockIcon],
94
+ [
95
+ "a read-only DatetimePicker",
96
+ <DatetimePicker key="ro" label="When" value={new Date(2026, 9, 31, 9, 30)} readOnly />,
97
+ "date-picker-glyph",
98
+ CalendarBlankIcon,
99
+ ],
100
+ ] as const)("%s draws one glyph, on the input's right", (_name, node, testId, Icon) => {
101
+ const { container, unmount } = renderWithProviders(node);
102
+ const glyphs = container.querySelectorAll(`[data-testid='${testId}']`);
103
+ expect(glyphs).toHaveLength(1);
104
+ const paths = Array.from(glyphs[0]!.querySelectorAll("svg path")).map((p) =>
105
+ p.getAttribute("d"),
106
+ );
107
+ expect(paths).toEqual([pathOf(<Icon />)]);
108
+ const input = container.querySelector("input")!;
109
+ expect(
110
+ input.compareDocumentPosition(glyphs[0]!) & Node.DOCUMENT_POSITION_FOLLOWING,
111
+ ).toBeTruthy();
112
+ unmount();
113
+ });
114
+
115
+ it("a filled web field swaps its glyph for the clear action, so the right holds one icon", () => {
116
+ const { container } = renderWithProviders(
117
+ <DatetimePicker label="When" value={new Date(2026, 9, 31, 9, 30)} />,
118
+ );
119
+ expect(container.querySelector("[data-testid='date-picker-glyph']")).toBeNull();
120
+ expect(container.querySelector("[data-testid='date-picker-clear']")).toBeTruthy();
121
+ });
122
+
123
+ it.each(
124
+ (["light", "dark"] as const).flatMap((scheme) => [
125
+ ["day", scheme, <June key="d" />],
126
+ [
127
+ "month",
128
+ scheme,
129
+ <MonthGrid key="m" currentYear={2024} selectedMonth={5} onSelectMonth={() => {}} />,
130
+ ],
131
+ [
132
+ "year",
133
+ scheme,
134
+ <YearGrid
135
+ key="y"
136
+ yearPageStart={2020}
137
+ selectedYear={2024}
138
+ onSelectYear={() => {}}
139
+ onPrevPage={() => {}}
140
+ onNextPage={() => {}}
141
+ />,
142
+ ],
143
+ ]) as [string, "light" | "dark", ReactElement][],
144
+ )(
145
+ "the picked %s fills with the accent mark in %s, inked for that fill",
146
+ (_name, scheme, node) => {
147
+ const cell = selectedCell(node, scheme);
148
+ expect(cell.className).toMatch(/(?:^|\s)_bg-accentBackg/);
149
+ expect(cell.className).not.toMatch(/t_accent/);
150
+ const ink = cell.querySelector<HTMLElement>("span")!.className;
151
+ expect(ink).toMatch(/(?:^|\s)_col-(?:hsla?|rgba?)/);
152
+ },
153
+ );
154
+ });