@multiplatform.one/forms 7.6.3 → 7.7.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 (705) hide show
  1. package/dist/cjs/AdaptivePopup/index.native.js +1 -1
  2. package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
  3. package/dist/cjs/Button/index.cjs +7 -1
  4. package/dist/cjs/Button/index.native.js +8 -2
  5. package/dist/cjs/Button/index.native.js.map +1 -1
  6. package/dist/cjs/Chip/index.cjs +1 -3
  7. package/dist/cjs/Chip/index.native.js +5 -3
  8. package/dist/cjs/Chip/index.native.js.map +1 -1
  9. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
  10. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  11. package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  12. package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  13. package/dist/cjs/ContextualSaveBar/index.cjs +19 -3
  14. package/dist/cjs/ContextualSaveBar/index.native.js +22 -6
  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.cjs +38 -12
  20. package/dist/cjs/DescriptionList/index.native.js +40 -14
  21. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  22. package/dist/cjs/ErrorSummary.cjs +4 -1
  23. package/dist/cjs/ErrorSummary.native.js +4 -1
  24. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  25. package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
  26. package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
  27. package/dist/cjs/FieldDisplay/index.native.js +1 -1
  28. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  29. package/dist/cjs/FieldGroup.native.js.map +1 -1
  30. package/dist/cjs/FloatingPanel/useFloatingPanel.cjs +24 -2
  31. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js +43 -2
  32. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  33. package/dist/cjs/Form/index.native.js +1 -1
  34. package/dist/cjs/Form/index.native.js.map +1 -1
  35. package/dist/cjs/Form/validateOn.native.js.map +1 -1
  36. package/dist/cjs/FormGrid.native.js.map +1 -1
  37. package/dist/cjs/FormSection.native.js.map +1 -1
  38. package/dist/cjs/InputParts/index.cjs +42 -2
  39. package/dist/cjs/InputParts/index.native.js +42 -2
  40. package/dist/cjs/InputParts/index.native.js.map +1 -1
  41. package/dist/cjs/Label/index.native.js.map +1 -1
  42. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  43. package/dist/cjs/Spinner/SpinnerGlyph.native.js.map +1 -1
  44. package/dist/cjs/Spinner/spinnerSize.native.js.map +1 -1
  45. package/dist/cjs/Table/index.native.js.map +1 -1
  46. package/dist/cjs/Wheel/haptic.native.js.map +1 -1
  47. package/dist/cjs/Wheel/index.native.js.map +1 -1
  48. package/dist/cjs/actionLabel.native.js.map +1 -1
  49. package/dist/cjs/fieldDefaults.native.js.map +1 -1
  50. package/dist/cjs/fieldLayout.native.js +1 -1
  51. package/dist/cjs/fieldLayout.native.js.map +1 -1
  52. package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
  53. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +1 -1
  54. package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
  55. package/dist/cjs/fields/Barcode/index.native.js +2 -2
  56. package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
  57. package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
  58. package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
  59. package/dist/cjs/fields/Checkbox/Checkbox.cjs +5 -2
  60. package/dist/cjs/fields/Checkbox/Checkbox.native.js +7 -4
  61. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  62. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  63. package/dist/cjs/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  64. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  65. package/dist/cjs/fields/Checkbox/CheckboxGroup.cjs +69 -59
  66. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +76 -66
  67. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  68. package/dist/cjs/fields/Checkbox/checkboxGroupContext.cjs +33 -0
  69. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js +36 -0
  70. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -0
  71. package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
  72. package/dist/cjs/fields/ColorPicker/index.native.js +3 -3
  73. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  74. package/dist/cjs/fields/ColorPicker/parts.native.js +2 -2
  75. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  76. package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
  77. package/dist/cjs/fields/Combobox/index.native.js +5 -5
  78. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  79. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  80. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  81. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  82. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.cjs +402 -0
  83. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +441 -0
  84. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -0
  85. package/dist/cjs/fields/DatePicker/DatetimePicker.cjs +2 -376
  86. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +70 -298
  87. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  88. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
  89. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  90. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  91. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  92. package/dist/cjs/fields/DatePicker/catalog.cjs +306 -0
  93. package/dist/cjs/fields/DatePicker/catalog.native.js +350 -0
  94. package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -0
  95. package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  96. package/dist/cjs/fields/DatePicker/index.cjs +7 -280
  97. package/dist/cjs/fields/DatePicker/index.native.js +67 -186
  98. package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
  99. package/dist/cjs/fields/DatePicker/parts.cjs +12 -9
  100. package/dist/cjs/fields/DatePicker/parts.native.js +14 -11
  101. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  102. package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
  103. package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
  104. package/dist/cjs/fields/Duration/index.cjs +29 -3
  105. package/dist/cjs/fields/Duration/index.native.js +32 -6
  106. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  107. package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  108. package/dist/cjs/fields/FileUpload/index.native.js +2 -2
  109. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  110. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  111. package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  112. package/dist/cjs/fields/Geolocation/geoValue.native.js.map +1 -1
  113. package/dist/cjs/fields/Geolocation/index.native.js +5 -5
  114. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  115. package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
  116. package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
  117. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  118. package/dist/cjs/fields/Icon/index.native.js +3 -3
  119. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  120. package/dist/cjs/fields/ImageField/index.native.js +2 -2
  121. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  122. package/dist/cjs/fields/Input/index.native.js +2 -2
  123. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  124. package/dist/cjs/fields/MentionInput/index.native.js +3 -3
  125. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  126. package/dist/cjs/fields/OTPInput/index.native.js +3 -3
  127. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  128. package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
  129. package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
  130. package/dist/cjs/fields/PhoneInput/index.cjs +9 -4
  131. package/dist/cjs/fields/PhoneInput/index.native.js +16 -9
  132. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  133. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  134. package/dist/cjs/fields/Progress/index.native.js +1 -1
  135. package/dist/cjs/fields/Progress/index.native.js.map +1 -1
  136. package/dist/cjs/fields/RadioGroup/index.native.js +1 -1
  137. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  138. package/dist/cjs/fields/Rating/index.cjs +1 -1
  139. package/dist/cjs/fields/Rating/index.native.js +5 -2
  140. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  141. package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
  142. package/dist/cjs/fields/Rating/types.native.js.map +1 -1
  143. package/dist/cjs/fields/SearchInput/index.cjs +6 -0
  144. package/dist/cjs/fields/SearchInput/index.native.js +8 -2
  145. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  146. package/dist/cjs/fields/Select/index.cjs +75 -2
  147. package/dist/cjs/fields/Select/index.native.js +81 -6
  148. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  149. package/dist/cjs/fields/Signature/index.cjs +9 -5
  150. package/dist/cjs/fields/Signature/index.native.js +11 -7
  151. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  152. package/dist/cjs/fields/Slider/index.cjs +3 -1
  153. package/dist/cjs/fields/Slider/index.native.js +4 -2
  154. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  155. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  156. package/dist/cjs/fields/Stepper/index.native.js +2 -2
  157. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  158. package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  159. package/dist/cjs/fields/Switch/index.cjs +5 -18
  160. package/dist/cjs/fields/Switch/index.native.js +7 -20
  161. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  162. package/dist/cjs/fields/TextArea/index.cjs +19 -5
  163. package/dist/cjs/fields/TextArea/index.native.js +25 -7
  164. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  165. package/dist/cjs/fields/TimePicker/catalog.cjs +203 -0
  166. package/dist/cjs/fields/TimePicker/catalog.native.js +227 -0
  167. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -0
  168. package/dist/cjs/fields/TimePicker/index.cjs +6 -177
  169. package/dist/cjs/fields/TimePicker/index.native.js +75 -86
  170. package/dist/cjs/fields/TimePicker/index.native.js.map +1 -1
  171. package/dist/cjs/fields/TimePicker/parts.native.js +1 -1
  172. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  173. package/dist/cjs/fields/TimeRangeScrubber/geometry.cjs +6 -0
  174. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js +6 -0
  175. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  176. package/dist/cjs/fields/TimeRangeScrubber/index.cjs +34 -14
  177. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +40 -16
  178. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  179. package/dist/cjs/fields/ToggleGroup/index.native.js +1 -1
  180. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  181. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.cjs +202 -0
  182. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +211 -0
  183. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -0
  184. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.cjs +30 -0
  185. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js +33 -0
  186. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -0
  187. package/dist/cjs/fields/nativeSelect.cjs +30 -0
  188. package/dist/cjs/fields/nativeSelect.native.js +33 -0
  189. package/dist/cjs/fields/nativeSelect.native.js.map +1 -0
  190. package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
  191. package/dist/cjs/formSpacing.native.js.map +1 -1
  192. package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
  193. package/dist/cjs/index.cjs +1 -0
  194. package/dist/cjs/index.native.js +44 -43
  195. package/dist/cjs/index.native.js.map +1 -1
  196. package/dist/cjs/requiredMarking.native.js.map +1 -1
  197. package/dist/cjs/shared/TimeColumn.native.js +1 -1
  198. package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
  199. package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
  200. package/dist/cjs/shared/colorRamps.native.js.map +1 -1
  201. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  202. package/dist/cjs/shared/floatingList.native.js +1 -1
  203. package/dist/cjs/shared/floatingList.native.js.map +1 -1
  204. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  205. package/dist/cjs/shared/groupContext.native.js.map +1 -1
  206. package/dist/cjs/shared/i18n.native.js.map +1 -1
  207. package/dist/cjs/shared/t.native.js.map +1 -1
  208. package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
  209. package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
  210. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  211. package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
  212. package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
  213. package/dist/cjs/shared/utils.native.js +1 -1
  214. package/dist/cjs/shared/utils.native.js.map +1 -1
  215. package/dist/cjs/shared/zIndex.native.js.map +1 -1
  216. package/dist/cjs/themedPrimitives.cjs +5 -0
  217. package/dist/cjs/themedPrimitives.native.js +5 -0
  218. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  219. package/dist/cjs/types.native.js.map +1 -1
  220. package/dist/cjs/utils/LinkCell.native.js.map +1 -1
  221. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  222. package/dist/esm/Button/index.mjs +8 -2
  223. package/dist/esm/Button/index.mjs.map +1 -1
  224. package/dist/esm/Button/index.native.js +8 -2
  225. package/dist/esm/Button/index.native.js.map +1 -1
  226. package/dist/esm/Chip/index.mjs +1 -3
  227. package/dist/esm/Chip/index.mjs.map +1 -1
  228. package/dist/esm/Chip/index.native.js +5 -3
  229. package/dist/esm/Chip/index.native.js.map +1 -1
  230. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  231. package/dist/esm/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  232. package/dist/esm/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  233. package/dist/esm/ContextualSaveBar/index.mjs +19 -3
  234. package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
  235. package/dist/esm/ContextualSaveBar/index.native.js +19 -3
  236. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  237. package/dist/esm/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  238. package/dist/esm/ControlGroup/index.native.js.map +1 -1
  239. package/dist/esm/DescriptionList/index.mjs +38 -12
  240. package/dist/esm/DescriptionList/index.mjs.map +1 -1
  241. package/dist/esm/DescriptionList/index.native.js +38 -12
  242. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  243. package/dist/esm/ErrorSummary.mjs +5 -2
  244. package/dist/esm/ErrorSummary.mjs.map +1 -1
  245. package/dist/esm/ErrorSummary.native.js +5 -2
  246. package/dist/esm/ErrorSummary.native.js.map +1 -1
  247. package/dist/esm/FieldDisplay/editMode.native.js.map +1 -1
  248. package/dist/esm/FieldDisplay/formatters.native.js.map +1 -1
  249. package/dist/esm/FieldDisplay/index.native.js.map +1 -1
  250. package/dist/esm/FieldGroup.native.js.map +1 -1
  251. package/dist/esm/FloatingPanel/useFloatingPanel.mjs +24 -3
  252. package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  253. package/dist/esm/FloatingPanel/useFloatingPanel.native.js +43 -3
  254. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  255. package/dist/esm/Form/index.native.js.map +1 -1
  256. package/dist/esm/Form/validateOn.native.js.map +1 -1
  257. package/dist/esm/FormGrid.native.js.map +1 -1
  258. package/dist/esm/FormSection.native.js.map +1 -1
  259. package/dist/esm/InputParts/index.mjs +43 -3
  260. package/dist/esm/InputParts/index.mjs.map +1 -1
  261. package/dist/esm/InputParts/index.native.js +43 -3
  262. package/dist/esm/InputParts/index.native.js.map +1 -1
  263. package/dist/esm/Label/index.native.js.map +1 -1
  264. package/dist/esm/Skeleton/index.native.js.map +1 -1
  265. package/dist/esm/Spinner/SpinnerGlyph.native.js.map +1 -1
  266. package/dist/esm/Spinner/spinnerSize.native.js.map +1 -1
  267. package/dist/esm/Table/index.native.js.map +1 -1
  268. package/dist/esm/Wheel/haptic.native.js.map +1 -1
  269. package/dist/esm/Wheel/index.native.js.map +1 -1
  270. package/dist/esm/actionLabel.native.js.map +1 -1
  271. package/dist/esm/fieldDefaults.native.js.map +1 -1
  272. package/dist/esm/fieldLayout.native.js.map +1 -1
  273. package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
  274. package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
  275. package/dist/esm/fields/Barcode/index.native.js.map +1 -1
  276. package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
  277. package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
  278. package/dist/esm/fields/Checkbox/Checkbox.mjs +5 -2
  279. package/dist/esm/fields/Checkbox/Checkbox.mjs.map +1 -1
  280. package/dist/esm/fields/Checkbox/Checkbox.native.js +6 -3
  281. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  282. package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  283. package/dist/esm/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  284. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  285. package/dist/esm/fields/Checkbox/CheckboxGroup.mjs +69 -59
  286. package/dist/esm/fields/Checkbox/CheckboxGroup.mjs.map +1 -1
  287. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js +75 -65
  288. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  289. package/dist/esm/fields/Checkbox/checkboxGroupContext.mjs +7 -0
  290. package/dist/esm/fields/Checkbox/checkboxGroupContext.mjs.map +1 -0
  291. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js +7 -0
  292. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js.map +1 -0
  293. package/dist/esm/fields/Checkbox/index.native.js.map +1 -1
  294. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  295. package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
  296. package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
  297. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  298. package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
  299. package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  300. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs +377 -0
  301. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -0
  302. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js +413 -0
  303. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -0
  304. package/dist/esm/fields/DatePicker/DatetimePicker.mjs +1 -375
  305. package/dist/esm/fields/DatePicker/DatetimePicker.mjs.map +1 -1
  306. package/dist/esm/fields/DatePicker/DatetimePicker.native.js +65 -293
  307. package/dist/esm/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  308. package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
  309. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  310. package/dist/esm/fields/DatePicker/catalog.mjs +276 -0
  311. package/dist/esm/fields/DatePicker/catalog.mjs.map +1 -0
  312. package/dist/esm/fields/DatePicker/catalog.native.js +317 -0
  313. package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -0
  314. package/dist/esm/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  315. package/dist/esm/fields/DatePicker/index.mjs +1 -274
  316. package/dist/esm/fields/DatePicker/index.mjs.map +1 -1
  317. package/dist/esm/fields/DatePicker/index.native.js +60 -179
  318. package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
  319. package/dist/esm/fields/DatePicker/parts.mjs +13 -10
  320. package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
  321. package/dist/esm/fields/DatePicker/parts.native.js +13 -10
  322. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  323. package/dist/esm/fields/DatePicker/utils.native.js.map +1 -1
  324. package/dist/esm/fields/Duration/durationMath.native.js.map +1 -1
  325. package/dist/esm/fields/Duration/index.mjs +29 -4
  326. package/dist/esm/fields/Duration/index.mjs.map +1 -1
  327. package/dist/esm/fields/Duration/index.native.js +29 -4
  328. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  329. package/dist/esm/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  330. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  331. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  332. package/dist/esm/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  333. package/dist/esm/fields/Geolocation/geoValue.native.js.map +1 -1
  334. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  335. package/dist/esm/fields/Geolocation/mapMath.native.js.map +1 -1
  336. package/dist/esm/fields/Geolocation/mapTypes.native.js.map +1 -1
  337. package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
  338. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  339. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  340. package/dist/esm/fields/Input/index.native.js.map +1 -1
  341. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  342. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  343. package/dist/esm/fields/OTPInput/otpCellCss.native.js.map +1 -1
  344. package/dist/esm/fields/PhoneInput/dialCodes.native.js.map +1 -1
  345. package/dist/esm/fields/PhoneInput/index.mjs +9 -4
  346. package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
  347. package/dist/esm/fields/PhoneInput/index.native.js +13 -6
  348. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  349. package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
  350. package/dist/esm/fields/Progress/index.native.js.map +1 -1
  351. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  352. package/dist/esm/fields/Rating/index.mjs +2 -2
  353. package/dist/esm/fields/Rating/index.mjs.map +1 -1
  354. package/dist/esm/fields/Rating/index.native.js +5 -2
  355. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  356. package/dist/esm/fields/Rating/ratingMath.native.js.map +1 -1
  357. package/dist/esm/fields/Rating/types.native.js.map +1 -1
  358. package/dist/esm/fields/SearchInput/index.mjs +6 -0
  359. package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
  360. package/dist/esm/fields/SearchInput/index.native.js +6 -0
  361. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  362. package/dist/esm/fields/Select/index.mjs +76 -3
  363. package/dist/esm/fields/Select/index.mjs.map +1 -1
  364. package/dist/esm/fields/Select/index.native.js +78 -3
  365. package/dist/esm/fields/Select/index.native.js.map +1 -1
  366. package/dist/esm/fields/Signature/index.mjs +10 -6
  367. package/dist/esm/fields/Signature/index.mjs.map +1 -1
  368. package/dist/esm/fields/Signature/index.native.js +10 -6
  369. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  370. package/dist/esm/fields/Slider/index.mjs +4 -2
  371. package/dist/esm/fields/Slider/index.mjs.map +1 -1
  372. package/dist/esm/fields/Slider/index.native.js +4 -2
  373. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  374. package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
  375. package/dist/esm/fields/Stepper/index.native.js.map +1 -1
  376. package/dist/esm/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  377. package/dist/esm/fields/Switch/index.mjs +6 -19
  378. package/dist/esm/fields/Switch/index.mjs.map +1 -1
  379. package/dist/esm/fields/Switch/index.native.js +6 -19
  380. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  381. package/dist/esm/fields/TextArea/index.mjs +19 -5
  382. package/dist/esm/fields/TextArea/index.mjs.map +1 -1
  383. package/dist/esm/fields/TextArea/index.native.js +23 -5
  384. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  385. package/dist/esm/fields/TimePicker/catalog.mjs +174 -0
  386. package/dist/esm/fields/TimePicker/catalog.mjs.map +1 -0
  387. package/dist/esm/fields/TimePicker/catalog.native.js +195 -0
  388. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -0
  389. package/dist/esm/fields/TimePicker/index.mjs +2 -173
  390. package/dist/esm/fields/TimePicker/index.mjs.map +1 -1
  391. package/dist/esm/fields/TimePicker/index.native.js +76 -87
  392. package/dist/esm/fields/TimePicker/index.native.js.map +1 -1
  393. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  394. package/dist/esm/fields/TimeRangeScrubber/geometry.mjs +6 -1
  395. package/dist/esm/fields/TimeRangeScrubber/geometry.mjs.map +1 -1
  396. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js +6 -1
  397. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  398. package/dist/esm/fields/TimeRangeScrubber/index.mjs +37 -18
  399. package/dist/esm/fields/TimeRangeScrubber/index.mjs.map +1 -1
  400. package/dist/esm/fields/TimeRangeScrubber/index.native.js +41 -18
  401. package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
  402. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  403. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs +166 -0
  404. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -0
  405. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js +172 -0
  406. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -0
  407. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.mjs +5 -0
  408. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.mjs.map +1 -0
  409. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js +5 -0
  410. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -0
  411. package/dist/esm/fields/nativeSelect.mjs +5 -0
  412. package/dist/esm/fields/nativeSelect.mjs.map +1 -0
  413. package/dist/esm/fields/nativeSelect.native.js +5 -0
  414. package/dist/esm/fields/nativeSelect.native.js.map +1 -0
  415. package/dist/esm/fields/selectedOrder.native.js.map +1 -1
  416. package/dist/esm/formSpacing.native.js.map +1 -1
  417. package/dist/esm/hooks/useFocusManagement.native.js.map +1 -1
  418. package/dist/esm/index.mjs +2 -2
  419. package/dist/esm/index.mjs.map +1 -1
  420. package/dist/esm/index.native.js +2 -2
  421. package/dist/esm/index.native.js.map +1 -1
  422. package/dist/esm/requiredMarking.native.js.map +1 -1
  423. package/dist/esm/shared/TimeColumn.native.js.map +1 -1
  424. package/dist/esm/shared/capabilityPreflight.native.js.map +1 -1
  425. package/dist/esm/shared/colorRamps.native.js.map +1 -1
  426. package/dist/esm/shared/devWarn.native.js.map +1 -1
  427. package/dist/esm/shared/floatingList.native.js.map +1 -1
  428. package/dist/esm/shared/focusManagement.native.js.map +1 -1
  429. package/dist/esm/shared/groupContext.native.js.map +1 -1
  430. package/dist/esm/shared/i18n.native.js.map +1 -1
  431. package/dist/esm/shared/t.native.js.map +1 -1
  432. package/dist/esm/shared/tableCellContext.native.js.map +1 -1
  433. package/dist/esm/shared/useDragScroll.native.js.map +1 -1
  434. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  435. package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
  436. package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
  437. package/dist/esm/shared/utils.native.js.map +1 -1
  438. package/dist/esm/shared/zIndex.native.js.map +1 -1
  439. package/dist/esm/themedPrimitives.mjs +5 -0
  440. package/dist/esm/themedPrimitives.mjs.map +1 -1
  441. package/dist/esm/themedPrimitives.native.js +5 -0
  442. package/dist/esm/themedPrimitives.native.js.map +1 -1
  443. package/dist/esm/types.native.js.map +1 -1
  444. package/dist/esm/utils/LinkCell.native.js.map +1 -1
  445. package/dist/jsx/Button/index.mjs +8 -2
  446. package/dist/jsx/Button/index.mjs.map +1 -1
  447. package/dist/jsx/Button/index.native.js +7 -1
  448. package/dist/jsx/Button/index.native.js.map +1 -1
  449. package/dist/jsx/Chip/index.mjs +1 -3
  450. package/dist/jsx/Chip/index.mjs.map +1 -1
  451. package/dist/jsx/Chip/index.native.js +5 -3
  452. package/dist/jsx/Chip/index.native.js.map +1 -1
  453. package/dist/jsx/ContextualSaveBar/index.mjs +19 -3
  454. package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
  455. package/dist/jsx/ContextualSaveBar/index.native.js +19 -3
  456. package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
  457. package/dist/jsx/DescriptionList/index.mjs +38 -12
  458. package/dist/jsx/DescriptionList/index.mjs.map +1 -1
  459. package/dist/jsx/DescriptionList/index.native.js +38 -12
  460. package/dist/jsx/DescriptionList/index.native.js.map +1 -1
  461. package/dist/jsx/ErrorSummary.mjs +5 -2
  462. package/dist/jsx/ErrorSummary.mjs.map +1 -1
  463. package/dist/jsx/ErrorSummary.native.js +4 -1
  464. package/dist/jsx/ErrorSummary.native.js.map +1 -1
  465. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +24 -3
  466. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  467. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +43 -2
  468. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  469. package/dist/jsx/InputParts/index.mjs +43 -3
  470. package/dist/jsx/InputParts/index.mjs.map +1 -1
  471. package/dist/jsx/InputParts/index.native.js +42 -2
  472. package/dist/jsx/InputParts/index.native.js.map +1 -1
  473. package/dist/jsx/fields/Checkbox/Checkbox.mjs +5 -2
  474. package/dist/jsx/fields/Checkbox/Checkbox.mjs.map +1 -1
  475. package/dist/jsx/fields/Checkbox/Checkbox.native.js +6 -3
  476. package/dist/jsx/fields/Checkbox/Checkbox.native.js.map +1 -1
  477. package/dist/jsx/fields/Checkbox/CheckboxGroup.mjs +69 -59
  478. package/dist/jsx/fields/Checkbox/CheckboxGroup.mjs.map +1 -1
  479. package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js +75 -65
  480. package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  481. package/dist/jsx/fields/Checkbox/checkboxGroupContext.mjs +7 -0
  482. package/dist/jsx/fields/Checkbox/checkboxGroupContext.mjs.map +1 -0
  483. package/dist/jsx/fields/Checkbox/checkboxGroupContext.native.js +36 -0
  484. package/dist/jsx/fields/Checkbox/checkboxGroupContext.native.js.map +1 -0
  485. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs +377 -0
  486. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -0
  487. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js +441 -0
  488. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -0
  489. package/dist/jsx/fields/DatePicker/DatetimePicker.mjs +1 -375
  490. package/dist/jsx/fields/DatePicker/DatetimePicker.mjs.map +1 -1
  491. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js +69 -297
  492. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  493. package/dist/jsx/fields/DatePicker/catalog.mjs +276 -0
  494. package/dist/jsx/fields/DatePicker/catalog.mjs.map +1 -0
  495. package/dist/jsx/fields/DatePicker/catalog.native.js +350 -0
  496. package/dist/jsx/fields/DatePicker/catalog.native.js.map +1 -0
  497. package/dist/jsx/fields/DatePicker/index.mjs +1 -274
  498. package/dist/jsx/fields/DatePicker/index.mjs.map +1 -1
  499. package/dist/jsx/fields/DatePicker/index.native.js +66 -185
  500. package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
  501. package/dist/jsx/fields/DatePicker/parts.mjs +13 -10
  502. package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
  503. package/dist/jsx/fields/DatePicker/parts.native.js +12 -9
  504. package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
  505. package/dist/jsx/fields/Duration/index.mjs +29 -4
  506. package/dist/jsx/fields/Duration/index.mjs.map +1 -1
  507. package/dist/jsx/fields/Duration/index.native.js +29 -3
  508. package/dist/jsx/fields/Duration/index.native.js.map +1 -1
  509. package/dist/jsx/fields/PhoneInput/index.mjs +9 -4
  510. package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
  511. package/dist/jsx/fields/PhoneInput/index.native.js +13 -6
  512. package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
  513. package/dist/jsx/fields/Rating/index.mjs +2 -2
  514. package/dist/jsx/fields/Rating/index.mjs.map +1 -1
  515. package/dist/jsx/fields/Rating/index.native.js +4 -1
  516. package/dist/jsx/fields/Rating/index.native.js.map +1 -1
  517. package/dist/jsx/fields/SearchInput/index.mjs +6 -0
  518. package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
  519. package/dist/jsx/fields/SearchInput/index.native.js +6 -0
  520. package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
  521. package/dist/jsx/fields/Select/index.mjs +76 -3
  522. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  523. package/dist/jsx/fields/Select/index.native.js +77 -2
  524. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  525. package/dist/jsx/fields/Signature/index.mjs +10 -6
  526. package/dist/jsx/fields/Signature/index.mjs.map +1 -1
  527. package/dist/jsx/fields/Signature/index.native.js +9 -5
  528. package/dist/jsx/fields/Signature/index.native.js.map +1 -1
  529. package/dist/jsx/fields/Slider/index.mjs +4 -2
  530. package/dist/jsx/fields/Slider/index.mjs.map +1 -1
  531. package/dist/jsx/fields/Slider/index.native.js +3 -1
  532. package/dist/jsx/fields/Slider/index.native.js.map +1 -1
  533. package/dist/jsx/fields/Switch/index.mjs +6 -19
  534. package/dist/jsx/fields/Switch/index.mjs.map +1 -1
  535. package/dist/jsx/fields/Switch/index.native.js +5 -18
  536. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  537. package/dist/jsx/fields/TextArea/index.mjs +19 -5
  538. package/dist/jsx/fields/TextArea/index.mjs.map +1 -1
  539. package/dist/jsx/fields/TextArea/index.native.js +23 -5
  540. package/dist/jsx/fields/TextArea/index.native.js.map +1 -1
  541. package/dist/jsx/fields/TimePicker/catalog.mjs +174 -0
  542. package/dist/jsx/fields/TimePicker/catalog.mjs.map +1 -0
  543. package/dist/jsx/fields/TimePicker/catalog.native.js +227 -0
  544. package/dist/jsx/fields/TimePicker/catalog.native.js.map +1 -0
  545. package/dist/jsx/fields/TimePicker/index.mjs +2 -173
  546. package/dist/jsx/fields/TimePicker/index.mjs.map +1 -1
  547. package/dist/jsx/fields/TimePicker/index.native.js +74 -85
  548. package/dist/jsx/fields/TimePicker/index.native.js.map +1 -1
  549. package/dist/jsx/fields/TimeRangeScrubber/geometry.mjs +6 -1
  550. package/dist/jsx/fields/TimeRangeScrubber/geometry.mjs.map +1 -1
  551. package/dist/jsx/fields/TimeRangeScrubber/geometry.native.js +6 -0
  552. package/dist/jsx/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  553. package/dist/jsx/fields/TimeRangeScrubber/index.mjs +37 -18
  554. package/dist/jsx/fields/TimeRangeScrubber/index.mjs.map +1 -1
  555. package/dist/jsx/fields/TimeRangeScrubber/index.native.js +38 -14
  556. package/dist/jsx/fields/TimeRangeScrubber/index.native.js.map +1 -1
  557. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs +166 -0
  558. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -0
  559. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js +211 -0
  560. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -0
  561. package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.mjs +5 -0
  562. package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.mjs.map +1 -0
  563. package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.native.js +33 -0
  564. package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -0
  565. package/dist/jsx/fields/nativeSelect.mjs +5 -0
  566. package/dist/jsx/fields/nativeSelect.mjs.map +1 -0
  567. package/dist/jsx/fields/nativeSelect.native.js +33 -0
  568. package/dist/jsx/fields/nativeSelect.native.js.map +1 -0
  569. package/dist/jsx/index.js +2 -2
  570. package/dist/jsx/index.js.map +1 -1
  571. package/dist/jsx/index.mjs +2 -2
  572. package/dist/jsx/index.mjs.map +1 -1
  573. package/dist/jsx/index.native.js +1 -0
  574. package/dist/jsx/index.native.js.map +1 -1
  575. package/dist/jsx/themedPrimitives.mjs +5 -0
  576. package/dist/jsx/themedPrimitives.mjs.map +1 -1
  577. package/dist/jsx/themedPrimitives.native.js +5 -0
  578. package/dist/jsx/themedPrimitives.native.js.map +1 -1
  579. package/package.json +12 -9
  580. package/src/Button/Button.labelInk.spec.tsx +1 -1
  581. package/src/Button/Button.sizeLadder.spec.tsx +124 -0
  582. package/src/Button/Button.spec.tsx +7 -17
  583. package/src/Button/Button.stories.tsx +14 -0
  584. package/src/Button/index.tsx +18 -3
  585. package/src/Chip/Chip.spec.tsx +15 -0
  586. package/src/Chip/Chip.stories.tsx +251 -0
  587. package/src/Chip/index.tsx +5 -1
  588. package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +51 -0
  589. package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +42 -23
  590. package/src/ContextualSaveBar/UnsavedChangesDialog.spec.tsx +167 -0
  591. package/src/ContextualSaveBar/index.tsx +14 -5
  592. package/src/DescriptionList/DescriptionList.spec.tsx +19 -1
  593. package/src/DescriptionList/DescriptionList.stories.tsx +5 -1
  594. package/src/DescriptionList/index.tsx +57 -19
  595. package/src/ErrorSummary.tsx +5 -2
  596. package/src/FloatingPanel/panelWidthContract.spec.ts +2 -2
  597. package/src/FloatingPanel/useFloatingPanel.spec.tsx +199 -1
  598. package/src/FloatingPanel/useFloatingPanel.ts +45 -3
  599. package/src/InputParts/index.tsx +56 -2
  600. package/src/Spinner/SpinnerGlyph.spec.tsx +132 -0
  601. package/src/Wheel/WheelEdgeFade.spec.tsx +141 -0
  602. package/src/fields/Checkbox/Checkbox.spec.tsx +24 -0
  603. package/src/fields/Checkbox/Checkbox.tsx +8 -3
  604. package/src/fields/Checkbox/CheckboxBox.spec.tsx +395 -0
  605. package/src/fields/Checkbox/CheckboxCard.spec.tsx +197 -0
  606. package/src/fields/Checkbox/CheckboxFieldFrame.spec.tsx +116 -0
  607. package/src/fields/Checkbox/CheckboxGroup.stories.tsx +15 -0
  608. package/src/fields/Checkbox/CheckboxGroup.tsx +77 -70
  609. package/src/fields/Checkbox/checkboxGroupContext.ts +12 -0
  610. package/src/fields/DatePicker/Calendar.spec.tsx +6 -5
  611. package/src/fields/DatePicker/DatePicker.stories.tsx +13 -0
  612. package/src/fields/DatePicker/DatetimePicker.catalog.tsx +586 -0
  613. package/src/fields/DatePicker/DatetimePicker.native.tsx +243 -0
  614. package/src/fields/DatePicker/DatetimePicker.tsx +2 -584
  615. package/src/fields/DatePicker/catalog.tsx +450 -0
  616. package/src/fields/DatePicker/index.native.tsx +261 -0
  617. package/src/fields/DatePicker/index.tsx +20 -448
  618. package/src/fields/DatePicker/parts.tsx +11 -6
  619. package/src/fields/Duration/Duration.spec.tsx +50 -0
  620. package/src/fields/Duration/Duration.stories.tsx +21 -0
  621. package/src/fields/Duration/index.tsx +43 -5
  622. package/src/fields/PhoneInput/PhoneInput.spec.tsx +16 -63
  623. package/src/fields/PhoneInput/PhoneInput.tvalue-source.spec.ts +23 -0
  624. package/src/fields/PhoneInput/index.tsx +10 -3
  625. package/src/fields/Rating/index.tsx +9 -1
  626. package/src/fields/SearchInput/SearchInput.spec.tsx +20 -0
  627. package/src/fields/SearchInput/index.tsx +6 -0
  628. package/src/fields/Select/Select.stories.tsx +23 -1
  629. package/src/fields/Select/index.tsx +77 -1
  630. package/src/fields/Signature/Signature.spec.tsx +22 -3
  631. package/src/fields/Signature/index.tsx +16 -7
  632. package/src/fields/Slider/index.tsx +4 -1
  633. package/src/fields/Switch/index.tsx +14 -12
  634. package/src/fields/TextArea/TextArea.spec.tsx +68 -0
  635. package/src/fields/TextArea/index.tsx +23 -5
  636. package/src/fields/TimePicker/TimePicker.stories.tsx +13 -0
  637. package/src/fields/TimePicker/catalog.tsx +265 -0
  638. package/src/fields/TimePicker/index.native.tsx +229 -0
  639. package/src/fields/TimePicker/index.tsx +6 -261
  640. package/src/fields/TimeRangeScrubber/TimeRangeScrubber.spec.tsx +36 -0
  641. package/src/fields/TimeRangeScrubber/geometry.ts +13 -0
  642. package/src/fields/TimeRangeScrubber/index.tsx +49 -8
  643. package/src/fields/nativeDateTime/OsDateTimeSheet.spec.ts +12 -0
  644. package/src/fields/nativeDateTime/OsDateTimeSheet.tsx +197 -0
  645. package/src/fields/nativeDateTime/osDateTimeIosDisplay.ts +4 -0
  646. package/src/fields/nativeSelect.spec.ts +28 -0
  647. package/src/fields/nativeSelect.ts +13 -0
  648. package/src/index.ts +2 -2
  649. package/src/themedPrimitives.tsx +10 -6
  650. package/types/Button/index.d.ts +3 -2
  651. package/types/Button/index.d.ts.map +1 -1
  652. package/types/Chip/index.d.ts.map +1 -1
  653. package/types/ContextualSaveBar/index.d.ts.map +1 -1
  654. package/types/DescriptionList/index.d.ts.map +1 -1
  655. package/types/ErrorSummary.d.ts.map +1 -1
  656. package/types/FloatingPanel/useFloatingPanel.d.ts +13 -0
  657. package/types/FloatingPanel/useFloatingPanel.d.ts.map +1 -1
  658. package/types/InputParts/index.d.ts.map +1 -1
  659. package/types/fields/Checkbox/Checkbox.d.ts.map +1 -1
  660. package/types/fields/Checkbox/CheckboxGroup.d.ts.map +1 -1
  661. package/types/fields/Checkbox/checkboxGroupContext.d.ts +8 -0
  662. package/types/fields/Checkbox/checkboxGroupContext.d.ts.map +1 -0
  663. package/types/fields/DatePicker/DatetimePicker.catalog.d.ts +35 -0
  664. package/types/fields/DatePicker/DatetimePicker.catalog.d.ts.map +1 -0
  665. package/types/fields/DatePicker/DatetimePicker.d.ts +2 -32
  666. package/types/fields/DatePicker/DatetimePicker.d.ts.map +1 -1
  667. package/types/fields/DatePicker/DatetimePicker.native.d.ts +26 -0
  668. package/types/fields/DatePicker/DatetimePicker.native.d.ts.map +1 -0
  669. package/types/fields/DatePicker/catalog.d.ts +42 -0
  670. package/types/fields/DatePicker/catalog.d.ts.map +1 -0
  671. package/types/fields/DatePicker/index.d.ts +2 -39
  672. package/types/fields/DatePicker/index.d.ts.map +1 -1
  673. package/types/fields/DatePicker/index.native.d.ts +40 -0
  674. package/types/fields/DatePicker/index.native.d.ts.map +1 -0
  675. package/types/fields/DatePicker/parts.d.ts.map +1 -1
  676. package/types/fields/Duration/index.d.ts +2 -0
  677. package/types/fields/Duration/index.d.ts.map +1 -1
  678. package/types/fields/PhoneInput/index.d.ts.map +1 -1
  679. package/types/fields/Rating/index.d.ts.map +1 -1
  680. package/types/fields/SearchInput/index.d.ts.map +1 -1
  681. package/types/fields/Select/index.d.ts +6 -1
  682. package/types/fields/Select/index.d.ts.map +1 -1
  683. package/types/fields/Signature/index.d.ts.map +1 -1
  684. package/types/fields/Slider/index.d.ts.map +1 -1
  685. package/types/fields/Switch/index.d.ts.map +1 -1
  686. package/types/fields/TextArea/index.d.ts.map +1 -1
  687. package/types/fields/TimePicker/catalog.d.ts +41 -0
  688. package/types/fields/TimePicker/catalog.d.ts.map +1 -0
  689. package/types/fields/TimePicker/index.d.ts +2 -38
  690. package/types/fields/TimePicker/index.d.ts.map +1 -1
  691. package/types/fields/TimePicker/index.native.d.ts +31 -0
  692. package/types/fields/TimePicker/index.native.d.ts.map +1 -0
  693. package/types/fields/TimeRangeScrubber/geometry.d.ts +8 -0
  694. package/types/fields/TimeRangeScrubber/geometry.d.ts.map +1 -1
  695. package/types/fields/TimeRangeScrubber/index.d.ts +1 -1
  696. package/types/fields/TimeRangeScrubber/index.d.ts.map +1 -1
  697. package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts +12 -0
  698. package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts.map +1 -0
  699. package/types/fields/nativeDateTime/osDateTimeIosDisplay.d.ts +3 -0
  700. package/types/fields/nativeDateTime/osDateTimeIosDisplay.d.ts.map +1 -0
  701. package/types/fields/nativeSelect.d.ts +12 -0
  702. package/types/fields/nativeSelect.d.ts.map +1 -0
  703. package/types/index.d.ts +2 -2
  704. package/types/index.d.ts.map +1 -1
  705. package/types/themedPrimitives.d.ts.map +1 -1
@@ -15,9 +15,10 @@
15
15
  */
16
16
  import { waitFor } from "@testing-library/react";
17
17
  import { renderWithProviders } from "@multiplatform.one/test-utils";
18
- import { describe, expect, it } from "vitest";
18
+ import { afterEach, describe, expect, it } from "vitest";
19
19
  import {
20
20
  type PanelWidthMode,
21
+ measureDrawnRadius,
21
22
  panelAnchorOffset,
22
23
  resolvePanelWidthMode,
23
24
  useFloatingPanel,
@@ -166,3 +167,200 @@ describe("FloatingPanel width modes (MPO-38)", () => {
166
167
  expect(result.getByTestId("anchor-floating").style.minWidth).toBe("");
167
168
  });
168
169
  });
170
+
171
+ /**
172
+ * Drawn-radius equality (MPO-129).
173
+ *
174
+ * The panel wears the arc the TRIGGER actually draws, and the box the panel
175
+ * anchors to is not always the box that paints. `FloatingPanelWeb` hands
176
+ * `setReferenceRef` to a layout-only `<View>` around the caller's `trigger`
177
+ * slot, so reading the anchor's own computed radius returned 0px and
178
+ * `min(0, h/2, w/2)` pinned every consumer's panel to a square corner at
179
+ * EVERY stop — measured on origin/main 3bb889f32: trigger 5/9/16/50px,
180
+ * panel 0px, in light and dark.
181
+ *
182
+ * These cases lock the three behaviours that fix depends on, so the zero
183
+ * cannot come back: the anchor's own paint wins when it has one (the
184
+ * Select/Combobox path, which was never broken), an unpainted anchor
185
+ * descends to the box sharing its corner, and an anchor with nothing painted
186
+ * anywhere returns null so the caller falls back to the CLAMPED TOKEN rather
187
+ * than to zero.
188
+ *
189
+ * FIXTURE FIDELITY, and it is load-bearing. jsdom reports an UNSET
190
+ * `borderTopLeftRadius` as the empty string; a browser reports "0px". The old
191
+ * implementation ran `parseFloat` on that value, so on an unstyled jsdom node
192
+ * it saw NaN and returned null — accidentally the right answer — while in a
193
+ * browser it saw 0 and returned a measured 0 that beat the token fallback.
194
+ * That is the bug. So every layout-only wrapper below sets
195
+ * `borderTopLeftRadius: "0px"` explicitly: without it these cases pass against
196
+ * the broken implementation and lock nothing.
197
+ */
198
+ function boxed(
199
+ el: HTMLElement,
200
+ rect: { x: number; y: number; width: number; height: number },
201
+ style: Partial<CSSStyleDeclaration>,
202
+ ) {
203
+ mockRect(el, rect);
204
+ Object.assign(el.style, style);
205
+ return el;
206
+ }
207
+
208
+ /** jsdom resolves computed style only for ATTACHED nodes, and the fix reads
209
+ * computed style — so the fixture has to live in the document. */
210
+ function mounted(el: HTMLElement) {
211
+ document.body.appendChild(el);
212
+ return el;
213
+ }
214
+
215
+ describe("FloatingPanel drawn radius (MPO-129)", () => {
216
+ afterEach(() => {
217
+ document.body.innerHTML = "";
218
+ });
219
+
220
+ it("reads the anchor itself when the anchor is the painted control", () => {
221
+ // Select and Combobox spread the reference onto InputParts.Box. That path
222
+ // was correct before this fix and must stay byte-for-byte correct after.
223
+ const anchor = mounted(
224
+ boxed(
225
+ document.createElement("div"),
226
+ { x: 0, y: 0, width: 240, height: 44 },
227
+ {
228
+ borderTopLeftRadius: "9px",
229
+ backgroundColor: "rgb(255, 255, 255)",
230
+ },
231
+ ),
232
+ );
233
+ expect(measureDrawnRadius(anchor)).toBe(9);
234
+ });
235
+
236
+ it("descends to the painted trigger when the anchor is a layout-only wrapper", () => {
237
+ // The regression itself: wrapper draws nothing, Button draws 16px.
238
+ const wrapper = mounted(
239
+ boxed(
240
+ document.createElement("div"),
241
+ { x: 0, y: 0, width: 240, height: 44 },
242
+ {
243
+ // A browser reports "0px" here; jsdom leaves it "". Without this the
244
+ // fixture is not the box the bug happens on — see the note above.
245
+ borderTopLeftRadius: "0px",
246
+ cursor: "pointer",
247
+ opacity: "1",
248
+ },
249
+ ),
250
+ );
251
+ const button = boxed(
252
+ document.createElement("div"),
253
+ { x: 0, y: 0, width: 240, height: 44 },
254
+ {
255
+ borderTopLeftRadius: "16px",
256
+ backgroundColor: "rgb(240, 240, 240)",
257
+ },
258
+ );
259
+ wrapper.appendChild(button);
260
+ expect(measureDrawnRadius(wrapper)).toBe(16);
261
+ });
262
+
263
+ it("clamps the descended radius to the painted trigger's own half-height", () => {
264
+ // `full` asks for 50px on a 44px control; CSS draws 22px, so the panel
265
+ // must draw 22px too — matching a 50px arc would not coincide.
266
+ const wrapper = mounted(
267
+ boxed(
268
+ document.createElement("div"),
269
+ { x: 0, y: 0, width: 240, height: 44 },
270
+ {
271
+ // A browser reports "0px" here; jsdom leaves it "". Without this the
272
+ // fixture is not the box the bug happens on — see the note above.
273
+ borderTopLeftRadius: "0px",
274
+ cursor: "pointer",
275
+ },
276
+ ),
277
+ );
278
+ const button = boxed(
279
+ document.createElement("div"),
280
+ { x: 0, y: 0, width: 240, height: 44 },
281
+ {
282
+ borderTopLeftRadius: "50px",
283
+ backgroundColor: "rgb(240, 240, 240)",
284
+ },
285
+ );
286
+ wrapper.appendChild(button);
287
+ expect(measureDrawnRadius(wrapper)).toBe(22);
288
+ });
289
+
290
+ it("keeps a square corner square rather than inventing one", () => {
291
+ const wrapper = mounted(
292
+ boxed(
293
+ document.createElement("div"),
294
+ { x: 0, y: 0, width: 240, height: 44 },
295
+ {
296
+ // A browser reports "0px" here; jsdom leaves it "". Without this the
297
+ // fixture is not the box the bug happens on — see the note above.
298
+ borderTopLeftRadius: "0px",
299
+ cursor: "pointer",
300
+ },
301
+ ),
302
+ );
303
+ const button = boxed(
304
+ document.createElement("div"),
305
+ { x: 0, y: 0, width: 240, height: 44 },
306
+ {
307
+ borderTopLeftRadius: "0px",
308
+ backgroundColor: "rgb(240, 240, 240)",
309
+ },
310
+ );
311
+ wrapper.appendChild(button);
312
+ expect(measureDrawnRadius(wrapper)).toBe(0);
313
+ });
314
+
315
+ it("ignores a painted descendant that does not share the anchor's corner", () => {
316
+ // An inset swatch is not the corner the panel meets. Nothing else paints,
317
+ // so this resolves to the token fallback, not to the swatch's radius.
318
+ const wrapper = mounted(
319
+ boxed(
320
+ document.createElement("div"),
321
+ { x: 0, y: 0, width: 240, height: 44 },
322
+ {
323
+ // A browser reports "0px" here; jsdom leaves it "". Without this the
324
+ // fixture is not the box the bug happens on — see the note above.
325
+ borderTopLeftRadius: "0px",
326
+ cursor: "pointer",
327
+ },
328
+ ),
329
+ );
330
+ const swatch = boxed(
331
+ document.createElement("div"),
332
+ { x: 12, y: 12, width: 20, height: 20 },
333
+ {
334
+ borderTopLeftRadius: "10px",
335
+ backgroundColor: "rgb(255, 0, 0)",
336
+ },
337
+ );
338
+ wrapper.appendChild(swatch);
339
+ expect(measureDrawnRadius(wrapper)).toBeNull();
340
+ });
341
+
342
+ it("returns null — never 0 — when nothing under the anchor paints a corner", () => {
343
+ // This is the whole bug in one assertion. A measured 0 wins over the
344
+ // token fallback because `measuredRadius ?? clampDropdownRadius(token)`
345
+ // only falls back on null, so returning 0 here squares every panel.
346
+ const wrapper = mounted(
347
+ boxed(
348
+ document.createElement("div"),
349
+ { x: 0, y: 0, width: 240, height: 44 },
350
+ {
351
+ // A browser reports "0px" here; jsdom leaves it "". Without this the
352
+ // fixture is not the box the bug happens on — see the note above.
353
+ borderTopLeftRadius: "0px",
354
+ cursor: "pointer",
355
+ },
356
+ ),
357
+ );
358
+ wrapper.appendChild(
359
+ boxed(document.createElement("span"), { x: 0, y: 0, width: 60, height: 20 }, {}),
360
+ );
361
+ // Guard the premise: if this ever reads "" again the case below goes green
362
+ // against a broken implementation, exactly as it did before MPO-129.
363
+ expect(getComputedStyle(wrapper).borderTopLeftRadius).toBe("0px");
364
+ expect(measureDrawnRadius(wrapper)).toBeNull();
365
+ });
366
+ });
@@ -141,6 +141,42 @@ export interface UseFloatingPanelReturn {
141
141
 
142
142
  // ── Hook ──────────────────────────────────────────────────────
143
143
 
144
+ /** A box paints a corner if it draws a radius, a border or a background. */
145
+ function paintsACorner(el: HTMLElement): boolean {
146
+ const cs = getComputedStyle(el);
147
+ if (Number.parseFloat(cs.borderTopLeftRadius) > 0) return true;
148
+ if (Number.parseFloat(cs.borderTopWidth) > 0 && cs.borderTopStyle !== "none") return true;
149
+ const bg = cs.backgroundColor;
150
+ return !!bg && bg !== "transparent" && bg !== "rgba(0, 0, 0, 0)";
151
+ }
152
+
153
+ /**
154
+ * The element the panel ANCHORS to is not always the element that PAINTS
155
+ * (MPO-129). `FloatingPanelWeb` hands `setReferenceRef` to a layout-only
156
+ * `<View>` wrapping the caller's `trigger` slot — it carries cursor and
157
+ * opacity and draws nothing — so reading its computed radius returns 0px and
158
+ * `min(0, h/2, w/2)` pins the panel to a square corner at EVERY stop, not
159
+ * just at `full`. Select and Combobox escape it only because they spread the
160
+ * reference onto `InputParts.Box`, which is the painted control itself.
161
+ *
162
+ * Positioning still measures the wrapper (that is the cover contract's box —
163
+ * a ColorPicker read from its swatch would measure the swatch's inset).
164
+ * Only the ARC descends: to the outermost box that shares the anchor's own
165
+ * top-left corner and actually paints one. Nothing painted → null, so the
166
+ * caller falls back to the clamped token rather than to zero.
167
+ */
168
+ function paintedCornerBox(root: HTMLElement): HTMLElement | null {
169
+ if (paintsACorner(root)) return root;
170
+ const rootRect = root.getBoundingClientRect();
171
+ for (const el of Array.from(root.querySelectorAll<HTMLElement>("*"))) {
172
+ const rect = el.getBoundingClientRect();
173
+ if (rect.width <= 0 || rect.height <= 0) continue;
174
+ if (Math.abs(rect.left - rootRect.left) > 1 || Math.abs(rect.top - rootRect.top) > 1) continue;
175
+ if (paintsACorner(el)) return el;
176
+ }
177
+ return null;
178
+ }
179
+
144
180
  /**
145
181
  * OVERLAY_ANCHOR_GAP rule — radius equality: a panel that aligns to (or
146
182
  * covers) its trigger must draw the SAME corner arc as the trigger at the
@@ -149,11 +185,17 @@ export interface UseFloatingPanelReturn {
149
185
  * ~22px arcs on a 44px-high field while a token-styled panel would draw its
150
186
  * own, different arc. Measure the trigger's effective (drawn) radius
151
187
  * instead and hand that px value to the panel.
188
+ *
189
+ * Exported for `useFloatingPanel.spec.tsx`: the arc is measured, not
190
+ * declared, so the only way to lock it is to feed it real boxes.
152
191
  */
153
- function measureDrawnRadius(el: HTMLElement): number | null {
154
- const raw = parseFloat(getComputedStyle(el).borderTopLeftRadius);
192
+ export function measureDrawnRadius(el: HTMLElement): number | null {
193
+ const box = paintedCornerBox(el);
194
+ if (!box) return null;
195
+ const raw = parseFloat(getComputedStyle(box).borderTopLeftRadius);
155
196
  if (!Number.isFinite(raw)) return null;
156
- const rect = el.getBoundingClientRect();
197
+ const rect = box.getBoundingClientRect();
198
+ if (rect.width <= 0 || rect.height <= 0) return null;
157
199
  return Math.min(raw, rect.height / 2, rect.width / 2);
158
200
  }
159
201
 
@@ -27,6 +27,8 @@ import {
27
27
  import {
28
28
  ensureCompositeFocusRing,
29
29
  ensureFocusVisibleRing,
30
+ FOCUS_RING_CLIPPED_OFFSET,
31
+ FOCUS_RING_HALO_OFFSET,
30
32
  isTouchSurface,
31
33
  recipeFamilies,
32
34
  resolveGlyphPaint,
@@ -219,7 +221,9 @@ export function boxRingMode(
219
221
  }
220
222
 
221
223
  export function boxRingOffset(mode: "inset" | "outset" | undefined): number {
222
- return mode === "outset" ? 2 : -2;
224
+ // Both branches are LC-71 §4 sanctioned offsets: the clipping inset when the
225
+ // Box clips its adornments, the shape halo when it does not (MPO-92).
226
+ return mode === "outset" ? FOCUS_RING_HALO_OFFSET : FOCUS_RING_CLIPPED_OFFSET;
223
227
  }
224
228
 
225
229
  export const inputPartsRingCss = `/* LC-71: ring on Box (adornments inside); Area never outlines.
@@ -781,6 +785,13 @@ const InputAreaImpl = InputFrame.styleable<{
781
785
  focusVisibleStyle: focusVisibleStyleProp,
782
786
  className: classNameProp,
783
787
  inputMode: inputModeProp,
788
+ flex: flexProp,
789
+ width: widthProp,
790
+ minWidth: minWidthProp,
791
+ maxWidth: maxWidthProp,
792
+ height: heightProp,
793
+ minHeight: minHeightProp,
794
+ maxHeight: maxHeightProp,
784
795
  ...props
785
796
  } = areaProps as typeof areaProps & {
786
797
  focusStyle?: Record<string, unknown>;
@@ -788,6 +799,13 @@ const InputAreaImpl = InputFrame.styleable<{
788
799
  className?: string;
789
800
  inputMode?: InputModeValue;
790
801
  type?: string;
802
+ flex?: number | string;
803
+ width?: number | string;
804
+ minWidth?: number | string;
805
+ maxWidth?: number | string;
806
+ height?: number | string;
807
+ minHeight?: number | string;
808
+ maxHeight?: number | string;
791
809
  };
792
810
  const { knobProps } = useResolvedKnobs();
793
811
  const theme = useTheme();
@@ -799,6 +817,11 @@ const InputAreaImpl = InputFrame.styleable<{
799
817
  // number-pad↔numeric, decimal-pad↔decimal, email-address↔email.
800
818
  const resolvedInputMode = inputModeProp ?? mapKeyboardTypeToInputMode(keyboardType);
801
819
  const resolvedKeyboardType = keyboardType ?? mapInputModeToKeyboardType(resolvedInputMode);
820
+ // Duration (and any Area with a numeric width / flex 0) must not sit inside
821
+ // a flex:1 wrapper — that wrapper grows with the Box, then Section's
822
+ // justifyContent:center floats the cluster in the leftover space. OTP still
823
+ // pins width on Box, not Area, so it keeps the grow wrapper.
824
+ const hugWidth = flexProp === 0 || typeof widthProp === "number";
802
825
 
803
826
  return (
804
827
  // LC-06/LC-10 (UX-P12): in a table cell the flex wrapper and the raw
@@ -806,7 +829,20 @@ const InputAreaImpl = InputFrame.styleable<{
806
829
  // (min-width:auto floors flex items at it); width 100% makes the input
807
830
  // adopt the flexed width instead of its size-attribute default. Explicit
808
831
  // consumer widths (OTP digit boxes) still win via the later spread.
809
- <View flex={1} {...(inTableCell ? { minWidth: 0 } : undefined)}>
832
+ <View
833
+ flex={hugWidth ? 0 : 1}
834
+ {...(hugWidth && typeof widthProp === "number"
835
+ ? {
836
+ width: widthProp,
837
+ minWidth: minWidthProp ?? widthProp,
838
+ maxWidth: maxWidthProp ?? widthProp,
839
+ }
840
+ : undefined)}
841
+ {...(heightProp != null
842
+ ? { height: heightProp, minHeight: minHeightProp ?? 0, maxHeight: maxHeightProp }
843
+ : undefined)}
844
+ {...(inTableCell ? { minWidth: 0 } : undefined)}
845
+ >
810
846
  <InputFrame
811
847
  aria-describedby={fieldDescribedBy}
812
848
  {...nativeA11yProps}
@@ -837,7 +873,25 @@ const InputAreaImpl = InputFrame.styleable<{
837
873
  : undefined
838
874
  }
839
875
  {...props}
876
+ {...(flexProp != null ? { flex: flexProp } : undefined)}
877
+ {...(widthProp != null
878
+ ? { width: widthProp, minWidth: minWidthProp, maxWidth: maxWidthProp }
879
+ : undefined)}
880
+ {...(heightProp != null
881
+ ? { height: heightProp, minHeight: minHeightProp, maxHeight: maxHeightProp }
882
+ : undefined)}
840
883
  {...webAreaAttrs(classNameProp)}
884
+ {...(isWeb && typeof heightProp === "number"
885
+ ? {
886
+ // Beat the UA / `$true` 44px min on <input> when a recipe height is set
887
+ // (Duration size:$3 is 36; a 44 input overflows the box).
888
+ style: {
889
+ height: heightProp,
890
+ minHeight: typeof minHeightProp === "number" ? minHeightProp : 0,
891
+ maxHeight: typeof maxHeightProp === "number" ? maxHeightProp : heightProp,
892
+ },
893
+ }
894
+ : undefined)}
841
895
  {...AREA_NO_OUTLINE}
842
896
  focusStyle={{ ...focusStyleProp, ...AREA_NO_OUTLINE }}
843
897
  focusVisibleStyle={{ ...focusVisibleStyleProp, ...AREA_NO_OUTLINE }}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * SpinnerGlyph and useSpinnerStroke (MPO-143).
3
+ *
4
+ * Spinner.spec.tsx covers the status region, the size ladder and the animation
5
+ * knob; the glyph inside it — the two-circle arc that IS the spinner — had no
6
+ * coverage. Two contracts live here: the arc is exactly 270 degrees of the
7
+ * circumference on a faint full track, and `useSpinnerStroke` resolves a `$`
8
+ * token through the theme while passing a literal colour straight through.
9
+ */
10
+ import { cleanup } from "@testing-library/react";
11
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
12
+ import { afterEach, describe, expect, it } from "vitest";
13
+ import { SpinnerGlyph, useSpinnerStroke } from "./SpinnerGlyph";
14
+
15
+ afterEach(cleanup);
16
+
17
+ const R = 9;
18
+ const CIRCUMFERENCE = 2 * Math.PI * R;
19
+
20
+ function svg(container: HTMLElement): SVGElement {
21
+ const node = container.querySelector("svg");
22
+ if (!node) throw new Error("SpinnerGlyph rendered no svg");
23
+ return node as unknown as SVGElement;
24
+ }
25
+
26
+ function circles(container: HTMLElement): SVGElement[] {
27
+ return Array.from(container.querySelectorAll("circle")) as unknown as SVGElement[];
28
+ }
29
+
30
+ function Probe({ color }: { color?: string }) {
31
+ const stroke = useSpinnerStroke(color);
32
+ return <span data-stroke={stroke} />;
33
+ }
34
+
35
+ function stroke(container: HTMLElement): string | null {
36
+ return container.querySelector("[data-stroke]")?.getAttribute("data-stroke") ?? null;
37
+ }
38
+
39
+ describe("SpinnerGlyph — the arc", () => {
40
+ it("draws a track and a head, never one circle", () => {
41
+ const { container } = renderWithProviders(<SpinnerGlyph color="#123456" size={24} />);
42
+ expect(circles(container)).toHaveLength(2);
43
+ });
44
+
45
+ it("keeps the viewBox fixed and scales through width/height, so it stays crisp", () => {
46
+ const { container } = renderWithProviders(<SpinnerGlyph color="#123456" size={48} />);
47
+ const node = svg(container);
48
+ expect(node.getAttribute("viewBox")).toBe("0 0 24 24");
49
+ expect(node.getAttribute("width")).toBe("48");
50
+ expect(node.getAttribute("height")).toBe("48");
51
+ });
52
+
53
+ it("takes the box size it is handed rather than a fixed one", () => {
54
+ const small = renderWithProviders(<SpinnerGlyph color="#123456" size={16} />);
55
+ expect(svg(small.container).getAttribute("width")).toBe("16");
56
+ cleanup();
57
+ const large = renderWithProviders(<SpinnerGlyph color="#123456" size={64} />);
58
+ expect(svg(large.container).getAttribute("width")).toBe("64");
59
+ });
60
+
61
+ it("makes the track faint and the head solid, both in the requested colour", () => {
62
+ const { container } = renderWithProviders(<SpinnerGlyph color="#abcdef" size={24} />);
63
+ const [track, head] = circles(container);
64
+ expect(track.getAttribute("stroke")).toBe("#abcdef");
65
+ expect(head.getAttribute("stroke")).toBe("#abcdef");
66
+ expect(Number(track.getAttribute("opacity"))).toBeCloseTo(0.2, 5);
67
+ expect(head.getAttribute("opacity")).toBeNull();
68
+ });
69
+
70
+ it("paints 270 degrees of arc and leaves the remaining quarter open", () => {
71
+ const { container } = renderWithProviders(<SpinnerGlyph color="#123456" size={24} />);
72
+ const [, head] = circles(container);
73
+ const [drawn, gap] = String(
74
+ head.getAttribute("stroke-dasharray") ?? head.getAttribute("strokeDasharray"),
75
+ )
76
+ .split(" ")
77
+ .map(Number);
78
+ expect(drawn).toBeCloseTo(CIRCUMFERENCE * 0.75, 5);
79
+ expect(gap).toBeCloseTo(CIRCUMFERENCE * 0.25, 5);
80
+ expect(drawn + gap).toBeCloseTo(CIRCUMFERENCE, 5);
81
+ });
82
+
83
+ it("starts the head at twelve o'clock, not at three", () => {
84
+ const { container } = renderWithProviders(<SpinnerGlyph color="#123456" size={24} />);
85
+ const [, head] = circles(container);
86
+ expect(head.getAttribute("transform")).toBe("rotate(-90 12 12)");
87
+ });
88
+
89
+ it("rounds the head's cap, which is what makes it read as Linear/Polaris rather than a pie slice", () => {
90
+ const { container } = renderWithProviders(<SpinnerGlyph color="#123456" size={24} />);
91
+ const [track, head] = circles(container);
92
+ expect(head.getAttribute("stroke-linecap") ?? head.getAttribute("strokeLinecap")).toBe("round");
93
+ expect(track.getAttribute("stroke-linecap") ?? track.getAttribute("strokeLinecap")).toBeNull();
94
+ });
95
+
96
+ it("fills neither circle, so the spinner is a ring and not a disc", () => {
97
+ const { container } = renderWithProviders(<SpinnerGlyph color="#123456" size={24} />);
98
+ for (const circle of circles(container)) {
99
+ expect(circle.getAttribute("fill")).toBe("none");
100
+ }
101
+ });
102
+ });
103
+
104
+ describe("useSpinnerStroke", () => {
105
+ it("passes a literal colour through untouched", () => {
106
+ const { container } = renderWithProviders(<Probe color="#ff0000" />);
107
+ expect(stroke(container)).toBe("#ff0000");
108
+ cleanup();
109
+ const named = renderWithProviders(<Probe color="rebeccapurple" />);
110
+ expect(stroke(named.container)).toBe("rebeccapurple");
111
+ });
112
+
113
+ it("resolves a $ token to a concrete colour instead of leaking the token", () => {
114
+ const { container } = renderWithProviders(<Probe color="$color" />);
115
+ const value = stroke(container);
116
+ expect(value).toBeTruthy();
117
+ expect(value?.startsWith("$")).toBe(false);
118
+ });
119
+
120
+ it("defaults to $color when no colour is given, and still resolves it", () => {
121
+ const explicit = renderWithProviders(<Probe color="$color" />);
122
+ const explicitValue = stroke(explicit.container);
123
+ cleanup();
124
+ const implicit = renderWithProviders(<Probe />);
125
+ expect(stroke(implicit.container)).toBe(explicitValue);
126
+ });
127
+
128
+ it("hands back the token itself when the theme has no such key, rather than throwing", () => {
129
+ const { container } = renderWithProviders(<Probe color="$definitelyNotAThemeKey" />);
130
+ expect(stroke(container)).toBe("$definitelyNotAThemeKey");
131
+ });
132
+ });
@@ -0,0 +1,141 @@
1
+ /**
2
+ * WheelEdgeFade — LC-25's two halves (MPO-143).
3
+ *
4
+ * The contract is a platform split with a contrast reason behind it. On web the
5
+ * wheel viewport carries a CSS mask, so this component must render NOTHING; on
6
+ * native it paints two absolutely-positioned gradient bands as an OVERLAY. The
7
+ * overlay is the whole point: fading the rows themselves would drop their
8
+ * opacity below 1 and take the inactive `$color11` numerals under the AA floor,
9
+ * which is the regression Wheel.spec.tsx guards from the other side.
10
+ *
11
+ * Both halves are exercised. A spec that covered only the file the web build
12
+ * resolves would be asserting `null` and calling it a test.
13
+ *
14
+ * `expo-linear-gradient` ships untranspiled JSX in its published build, which
15
+ * the web transform cannot parse, so it is mocked into a probe element. The
16
+ * mock is the gradient, not the component under test: colours, start and end
17
+ * come straight from WheelEdgeFade.
18
+ */
19
+ import { cleanup } from "@testing-library/react";
20
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
21
+ import { afterEach, describe, expect, it, vi } from "vitest";
22
+ import { WheelEdgeFade } from "./WheelEdgeFade";
23
+ import { WheelEdgeFade as NativeWheelEdgeFade } from "./WheelEdgeFade.native";
24
+
25
+ vi.mock("expo-linear-gradient", () => ({
26
+ LinearGradient: (props: { colors?: string[]; start?: unknown; end?: unknown }) => (
27
+ <div
28
+ data-gradient="true"
29
+ data-colors={(props.colors ?? []).join("|")}
30
+ data-start={JSON.stringify(props.start)}
31
+ data-end={JSON.stringify(props.end)}
32
+ />
33
+ ),
34
+ }));
35
+
36
+ afterEach(cleanup);
37
+
38
+ function bands(container: HTMLElement): HTMLElement[] {
39
+ return Array.from(container.querySelectorAll("[style*='height']")) as HTMLElement[];
40
+ }
41
+
42
+ function gradients(container: HTMLElement): HTMLElement[] {
43
+ return Array.from(container.querySelectorAll("[data-gradient]")) as HTMLElement[];
44
+ }
45
+
46
+ function colorsOf(node: HTMLElement): string[] {
47
+ return String(node.getAttribute("data-colors") ?? "").split("|");
48
+ }
49
+
50
+ describe("WheelEdgeFade — web", () => {
51
+ it("renders nothing, because the viewport's CSS mask already does the fade", () => {
52
+ const { container } = renderWithProviders(<WheelEdgeFade height={24} />);
53
+ expect(container.querySelector("[data-gradient]")).toBeNull();
54
+ expect(container.textContent).toBe("");
55
+ });
56
+
57
+ it("renders nothing at every height, so it can never dim a row", () => {
58
+ for (const height of [0, 1, 24, 400]) {
59
+ const { container } = renderWithProviders(<WheelEdgeFade height={height} />);
60
+ expect(container.querySelector("[data-gradient]"), String(height)).toBeNull();
61
+ cleanup();
62
+ }
63
+ });
64
+ });
65
+
66
+ describe("WheelEdgeFade — native", () => {
67
+ it("paints one band per edge, never a single one", () => {
68
+ const { container } = renderWithProviders(<NativeWheelEdgeFade height={24} />);
69
+ expect(gradients(container)).toHaveLength(2);
70
+ });
71
+
72
+ it("draws nothing at all when the band height is zero or negative", () => {
73
+ const zero = renderWithProviders(<NativeWheelEdgeFade height={0} />);
74
+ expect(gradients(zero.container)).toHaveLength(0);
75
+ cleanup();
76
+ const negative = renderWithProviders(<NativeWheelEdgeFade height={-8} />);
77
+ expect(gradients(negative.container)).toHaveLength(0);
78
+ });
79
+
80
+ it("pins one band to the top and one to the bottom", () => {
81
+ const { container } = renderWithProviders(<NativeWheelEdgeFade height={30} />);
82
+ const edges = bands(container).map((node) => node.getAttribute("style") ?? "");
83
+ expect(edges.some((style) => /top:\s*0px/.test(style))).toBe(true);
84
+ expect(edges.some((style) => /bottom:\s*0px/.test(style))).toBe(true);
85
+ });
86
+
87
+ it("gives each band the height it was handed, so the caller sets the fade depth", () => {
88
+ const { container } = renderWithProviders(<NativeWheelEdgeFade height={30} />);
89
+ const heights = bands(container).map(
90
+ (node) => /height:\s*(\d+)px/.exec(node.getAttribute("style") ?? "")?.[1],
91
+ );
92
+ expect(heights.filter(Boolean)).toEqual(["30", "30"]);
93
+ cleanup();
94
+ const taller = renderWithProviders(<NativeWheelEdgeFade height={64} />);
95
+ expect(
96
+ bands(taller.container).map(
97
+ (node) => /height:\s*(\d+)px/.exec(node.getAttribute("style") ?? "")?.[1],
98
+ ),
99
+ ).toEqual(["64", "64"]);
100
+ });
101
+
102
+ it("keeps the bands out of the way of a drag, so the wheel still scrolls", () => {
103
+ const { container } = renderWithProviders(<NativeWheelEdgeFade height={24} />);
104
+ for (const band of bands(container)) {
105
+ expect(band.className).toContain("r-pointerEvents");
106
+ expect(band.className).toContain("r-position");
107
+ }
108
+ });
109
+
110
+ it("runs the top band opaque-to-clear and the bottom band clear-to-opaque", () => {
111
+ const { container } = renderWithProviders(<NativeWheelEdgeFade height={24} />);
112
+ const [top, bottom] = gradients(container).map(colorsOf);
113
+ expect(top).toHaveLength(2);
114
+ expect(bottom).toHaveLength(2);
115
+ // The two bands are mirror images: the top starts on the page background
116
+ // and ends transparent, the bottom does the reverse.
117
+ expect(top[0]).toBe(bottom[1]);
118
+ expect(top[1]).toBe(bottom[0]);
119
+ expect(top[1]).toMatch(/,\s*0\)$/);
120
+ expect(top[0]).not.toMatch(/,\s*0\)$/);
121
+ });
122
+
123
+ it("derives the fade colour from the theme background rather than a hardcoded white", () => {
124
+ const { container } = renderWithProviders(<NativeWheelEdgeFade height={24} />);
125
+ const [opaque, clear] = colorsOf(gradients(container)[0]);
126
+ expect(opaque).toBeTruthy();
127
+ expect(opaque).not.toBe("transparent");
128
+ // The clear stop is the SAME colour at zero alpha, so the band never
129
+ // shifts hue across its length.
130
+ const channels = /rgba\(([^)]+),\s*0\)$/.exec(clear)?.[1];
131
+ expect(channels, `clear stop ${clear} must be the opaque stop at alpha 0`).toBeTruthy();
132
+ });
133
+
134
+ it("runs both gradients vertically down the centre line", () => {
135
+ const { container } = renderWithProviders(<NativeWheelEdgeFade height={24} />);
136
+ for (const gradient of gradients(container)) {
137
+ expect(gradient.getAttribute("data-start")).toBe(JSON.stringify({ x: 0.5, y: 0 }));
138
+ expect(gradient.getAttribute("data-end")).toBe(JSON.stringify({ x: 0.5, y: 1 }));
139
+ }
140
+ });
141
+ });