@multiplatform.one/forms 7.5.0 → 7.6.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 (586) 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 +6 -10
  4. package/dist/cjs/Button/index.native.js +7 -11
  5. package/dist/cjs/Button/index.native.js.map +1 -1
  6. package/dist/cjs/Chip/index.native.js.map +1 -1
  7. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.cjs +0 -1
  8. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -2
  9. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  10. package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  11. package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  12. package/dist/cjs/ContextualSaveBar/index.native.js +3 -3
  13. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  14. package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  15. package/dist/cjs/ControlGroup/index.native.js +1 -1
  16. package/dist/cjs/ControlGroup/index.native.js.map +1 -1
  17. package/dist/cjs/DescriptionList/index.native.js +2 -2
  18. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  19. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  20. package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
  21. package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
  22. package/dist/cjs/FieldDisplay/index.cjs +2 -1
  23. package/dist/cjs/FieldDisplay/index.native.js +10 -3
  24. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  25. package/dist/cjs/FieldGroup.native.js.map +1 -1
  26. package/dist/cjs/FloatingPanel/index.cjs +8 -1
  27. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  28. package/dist/cjs/Form/index.native.js +1 -1
  29. package/dist/cjs/Form/index.native.js.map +1 -1
  30. package/dist/cjs/Form/validateOn.native.js.map +1 -1
  31. package/dist/cjs/FormGrid.native.js.map +1 -1
  32. package/dist/cjs/FormSection.native.js.map +1 -1
  33. package/dist/cjs/InputParts/index.cjs +64 -2
  34. package/dist/cjs/InputParts/index.native.js +70 -4
  35. package/dist/cjs/InputParts/index.native.js.map +1 -1
  36. package/dist/cjs/Label/index.native.js.map +1 -1
  37. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  38. package/dist/cjs/Spinner/SpinnerGlyph.native.js.map +1 -1
  39. package/dist/cjs/Spinner/spinnerSize.native.js.map +1 -1
  40. package/dist/cjs/Table/index.native.js.map +1 -1
  41. package/dist/cjs/Wheel/haptic.native.js.map +1 -1
  42. package/dist/cjs/Wheel/index.native.js.map +1 -1
  43. package/dist/cjs/actionLabel.native.js.map +1 -1
  44. package/dist/cjs/fieldDefaults.native.js.map +1 -1
  45. package/dist/cjs/fieldLayout.native.js +1 -1
  46. package/dist/cjs/fieldLayout.native.js.map +1 -1
  47. package/dist/cjs/fields/Barcode/BarcodePreview.cjs +15 -9
  48. package/dist/cjs/fields/Barcode/BarcodePreview.native.js +15 -9
  49. package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
  50. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +1 -1
  51. package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
  52. package/dist/cjs/fields/Barcode/index.native.js +2 -2
  53. package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
  54. package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
  55. package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
  56. package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -1
  57. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  58. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  59. package/dist/cjs/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  60. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  61. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +1 -1
  62. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  63. package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
  64. package/dist/cjs/fields/ColorPicker/index.native.js +3 -3
  65. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  66. package/dist/cjs/fields/ColorPicker/parts.native.js +2 -2
  67. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  68. package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
  69. package/dist/cjs/fields/Combobox/index.cjs +14 -11
  70. package/dist/cjs/fields/Combobox/index.native.js +21 -16
  71. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  72. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  73. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  74. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  75. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +3 -3
  76. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  77. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
  78. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  79. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  80. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  81. package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  82. package/dist/cjs/fields/DatePicker/index.native.js +2 -2
  83. package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
  84. package/dist/cjs/fields/DatePicker/parts.native.js +2 -2
  85. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  86. package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
  87. package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
  88. package/dist/cjs/fields/Duration/index.native.js +3 -3
  89. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  90. package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  91. package/dist/cjs/fields/FileUpload/index.cjs +11 -3
  92. package/dist/cjs/fields/FileUpload/index.native.js +22 -5
  93. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  94. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  95. package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  96. package/dist/cjs/fields/Geolocation/index.native.js +5 -5
  97. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  98. package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
  99. package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
  100. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  101. package/dist/cjs/fields/Icon/index.cjs +1 -0
  102. package/dist/cjs/fields/Icon/index.native.js +4 -3
  103. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  104. package/dist/cjs/fields/ImageField/index.native.js +2 -2
  105. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  106. package/dist/cjs/fields/Input/index.cjs +175 -95
  107. package/dist/cjs/fields/Input/index.native.js +85 -6
  108. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  109. package/dist/cjs/fields/MentionInput/index.cjs +6 -1
  110. package/dist/cjs/fields/MentionInput/index.native.js +9 -4
  111. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  112. package/dist/cjs/fields/OTPInput/index.cjs +7 -2
  113. package/dist/cjs/fields/OTPInput/index.native.js +10 -5
  114. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  115. package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
  116. package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
  117. package/dist/cjs/fields/PhoneInput/index.native.js +4 -3
  118. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  119. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  120. package/dist/cjs/fields/Progress/index.native.js +1 -1
  121. package/dist/cjs/fields/Progress/index.native.js.map +1 -1
  122. package/dist/cjs/fields/RadioGroup/index.native.js +1 -1
  123. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  124. package/dist/cjs/fields/Rating/index.native.js +1 -1
  125. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  126. package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
  127. package/dist/cjs/fields/Rating/types.native.js.map +1 -1
  128. package/dist/cjs/fields/SearchInput/index.native.js +2 -2
  129. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  130. package/dist/cjs/fields/Select/index.native.js +4 -4
  131. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  132. package/dist/cjs/fields/Signature/index.native.js +2 -2
  133. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  134. package/dist/cjs/fields/Slider/index.native.js +1 -1
  135. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  136. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  137. package/dist/cjs/fields/Stepper/index.native.js +2 -2
  138. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  139. package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  140. package/dist/cjs/fields/Switch/index.native.js +2 -2
  141. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  142. package/dist/cjs/fields/TextArea/index.native.js +2 -2
  143. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  144. package/dist/cjs/fields/TimePicker/index.native.js +3 -3
  145. package/dist/cjs/fields/TimePicker/index.native.js.map +1 -1
  146. package/dist/cjs/fields/TimePicker/parts.native.js +1 -1
  147. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  148. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  149. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +2 -2
  150. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  151. package/dist/cjs/fields/ToggleGroup/index.native.js +1 -1
  152. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  153. package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
  154. package/dist/cjs/formSpacing.native.js.map +1 -1
  155. package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
  156. package/dist/cjs/index.native.js +43 -43
  157. package/dist/cjs/index.native.js.map +1 -1
  158. package/dist/cjs/requiredMarking.native.js.map +1 -1
  159. package/dist/cjs/shared/TimeColumn.native.js +1 -1
  160. package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
  161. package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
  162. package/dist/cjs/shared/colorRamps.native.js.map +1 -1
  163. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  164. package/dist/cjs/shared/floatingList.native.js +1 -1
  165. package/dist/cjs/shared/floatingList.native.js.map +1 -1
  166. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  167. package/dist/cjs/shared/groupContext.native.js.map +1 -1
  168. package/dist/cjs/shared/i18n.native.js.map +1 -1
  169. package/dist/cjs/shared/t.native.js.map +1 -1
  170. package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
  171. package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
  172. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  173. package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
  174. package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
  175. package/dist/cjs/shared/utils.cjs +4 -14
  176. package/dist/cjs/shared/utils.native.js +7 -15
  177. package/dist/cjs/shared/utils.native.js.map +1 -1
  178. package/dist/cjs/shared/zIndex.native.js.map +1 -1
  179. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  180. package/dist/cjs/types.native.js.map +1 -1
  181. package/dist/cjs/utils/LinkCell.native.js.map +1 -1
  182. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  183. package/dist/esm/Button/index.mjs +6 -9
  184. package/dist/esm/Button/index.mjs.map +1 -1
  185. package/dist/esm/Button/index.native.js +6 -9
  186. package/dist/esm/Button/index.native.js.map +1 -1
  187. package/dist/esm/Chip/index.native.js.map +1 -1
  188. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.mjs +0 -1
  189. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.mjs.map +1 -1
  190. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js +0 -1
  191. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  192. package/dist/esm/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  193. package/dist/esm/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  194. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  195. package/dist/esm/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  196. package/dist/esm/ControlGroup/index.native.js.map +1 -1
  197. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  198. package/dist/esm/ErrorSummary.native.js.map +1 -1
  199. package/dist/esm/FieldDisplay/editMode.native.js.map +1 -1
  200. package/dist/esm/FieldDisplay/formatters.native.js.map +1 -1
  201. package/dist/esm/FieldDisplay/index.mjs +2 -1
  202. package/dist/esm/FieldDisplay/index.mjs.map +1 -1
  203. package/dist/esm/FieldDisplay/index.native.js +9 -2
  204. package/dist/esm/FieldDisplay/index.native.js.map +1 -1
  205. package/dist/esm/FieldGroup.native.js.map +1 -1
  206. package/dist/esm/FloatingPanel/index.mjs +8 -1
  207. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  208. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  209. package/dist/esm/Form/index.native.js.map +1 -1
  210. package/dist/esm/Form/validateOn.native.js.map +1 -1
  211. package/dist/esm/FormGrid.native.js.map +1 -1
  212. package/dist/esm/FormSection.native.js.map +1 -1
  213. package/dist/esm/InputParts/index.mjs +64 -2
  214. package/dist/esm/InputParts/index.mjs.map +1 -1
  215. package/dist/esm/InputParts/index.native.js +70 -4
  216. package/dist/esm/InputParts/index.native.js.map +1 -1
  217. package/dist/esm/Label/index.native.js.map +1 -1
  218. package/dist/esm/Skeleton/index.native.js.map +1 -1
  219. package/dist/esm/Spinner/SpinnerGlyph.native.js.map +1 -1
  220. package/dist/esm/Spinner/spinnerSize.native.js.map +1 -1
  221. package/dist/esm/Table/index.native.js.map +1 -1
  222. package/dist/esm/Wheel/haptic.native.js.map +1 -1
  223. package/dist/esm/Wheel/index.native.js.map +1 -1
  224. package/dist/esm/actionLabel.native.js.map +1 -1
  225. package/dist/esm/fieldDefaults.native.js.map +1 -1
  226. package/dist/esm/fieldLayout.native.js.map +1 -1
  227. package/dist/esm/fields/Barcode/BarcodePreview.mjs +15 -9
  228. package/dist/esm/fields/Barcode/BarcodePreview.mjs.map +1 -1
  229. package/dist/esm/fields/Barcode/BarcodePreview.native.js +15 -9
  230. package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
  231. package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
  232. package/dist/esm/fields/Barcode/index.native.js.map +1 -1
  233. package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
  234. package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
  235. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  236. package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  237. package/dist/esm/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  238. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  239. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  240. package/dist/esm/fields/Checkbox/index.native.js.map +1 -1
  241. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  242. package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
  243. package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
  244. package/dist/esm/fields/Combobox/index.mjs +14 -11
  245. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  246. package/dist/esm/fields/Combobox/index.native.js +16 -11
  247. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  248. package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
  249. package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  250. package/dist/esm/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  251. package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
  252. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  253. package/dist/esm/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  254. package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
  255. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  256. package/dist/esm/fields/DatePicker/utils.native.js.map +1 -1
  257. package/dist/esm/fields/Duration/durationMath.native.js.map +1 -1
  258. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  259. package/dist/esm/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  260. package/dist/esm/fields/FileUpload/index.mjs +11 -3
  261. package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
  262. package/dist/esm/fields/FileUpload/index.native.js +20 -3
  263. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  264. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  265. package/dist/esm/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  266. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  267. package/dist/esm/fields/Geolocation/mapMath.native.js.map +1 -1
  268. package/dist/esm/fields/Geolocation/mapTypes.native.js.map +1 -1
  269. package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
  270. package/dist/esm/fields/Icon/index.mjs +1 -0
  271. package/dist/esm/fields/Icon/index.mjs.map +1 -1
  272. package/dist/esm/fields/Icon/index.native.js +1 -0
  273. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  274. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  275. package/dist/esm/fields/Input/index.mjs +177 -98
  276. package/dist/esm/fields/Input/index.mjs.map +1 -1
  277. package/dist/esm/fields/Input/index.native.js +85 -7
  278. package/dist/esm/fields/Input/index.native.js.map +1 -1
  279. package/dist/esm/fields/MentionInput/index.mjs +6 -1
  280. package/dist/esm/fields/MentionInput/index.mjs.map +1 -1
  281. package/dist/esm/fields/MentionInput/index.native.js +6 -1
  282. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  283. package/dist/esm/fields/OTPInput/index.mjs +7 -3
  284. package/dist/esm/fields/OTPInput/index.mjs.map +1 -1
  285. package/dist/esm/fields/OTPInput/index.native.js +7 -3
  286. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  287. package/dist/esm/fields/OTPInput/otpCellCss.native.js.map +1 -1
  288. package/dist/esm/fields/PhoneInput/dialCodes.native.js.map +1 -1
  289. package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
  290. package/dist/esm/fields/PhoneInput/index.native.js +1 -0
  291. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  292. package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
  293. package/dist/esm/fields/Progress/index.native.js.map +1 -1
  294. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  295. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  296. package/dist/esm/fields/Rating/ratingMath.native.js.map +1 -1
  297. package/dist/esm/fields/Rating/types.native.js.map +1 -1
  298. package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
  299. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  300. package/dist/esm/fields/Select/index.native.js.map +1 -1
  301. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  302. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  303. package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
  304. package/dist/esm/fields/Stepper/index.native.js.map +1 -1
  305. package/dist/esm/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  306. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  307. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  308. package/dist/esm/fields/TimePicker/index.native.js.map +1 -1
  309. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  310. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  311. package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
  312. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  313. package/dist/esm/fields/selectedOrder.native.js.map +1 -1
  314. package/dist/esm/formSpacing.native.js.map +1 -1
  315. package/dist/esm/hooks/useFocusManagement.native.js.map +1 -1
  316. package/dist/esm/index.native.js.map +1 -1
  317. package/dist/esm/requiredMarking.native.js.map +1 -1
  318. package/dist/esm/shared/TimeColumn.native.js.map +1 -1
  319. package/dist/esm/shared/capabilityPreflight.native.js.map +1 -1
  320. package/dist/esm/shared/colorRamps.native.js.map +1 -1
  321. package/dist/esm/shared/devWarn.native.js.map +1 -1
  322. package/dist/esm/shared/floatingList.native.js.map +1 -1
  323. package/dist/esm/shared/focusManagement.native.js.map +1 -1
  324. package/dist/esm/shared/groupContext.native.js.map +1 -1
  325. package/dist/esm/shared/i18n.native.js.map +1 -1
  326. package/dist/esm/shared/t.native.js.map +1 -1
  327. package/dist/esm/shared/tableCellContext.native.js.map +1 -1
  328. package/dist/esm/shared/useDragScroll.native.js.map +1 -1
  329. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  330. package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
  331. package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
  332. package/dist/esm/shared/utils.mjs +4 -14
  333. package/dist/esm/shared/utils.mjs.map +1 -1
  334. package/dist/esm/shared/utils.native.js +6 -14
  335. package/dist/esm/shared/utils.native.js.map +1 -1
  336. package/dist/esm/shared/zIndex.native.js.map +1 -1
  337. package/dist/esm/themedPrimitives.native.js.map +1 -1
  338. package/dist/esm/types.native.js.map +1 -1
  339. package/dist/esm/utils/LinkCell.native.js.map +1 -1
  340. package/dist/jsx/AdaptivePopup/index.native.js +1 -1
  341. package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
  342. package/dist/jsx/Button/index.mjs +6 -9
  343. package/dist/jsx/Button/index.mjs.map +1 -1
  344. package/dist/jsx/Button/index.native.js +7 -11
  345. package/dist/jsx/Button/index.native.js.map +1 -1
  346. package/dist/jsx/Chip/index.native.js.map +1 -1
  347. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.mjs +0 -1
  348. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.mjs.map +1 -1
  349. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -2
  350. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  351. package/dist/jsx/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  352. package/dist/jsx/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  353. package/dist/jsx/ContextualSaveBar/index.native.js +3 -3
  354. package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
  355. package/dist/jsx/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  356. package/dist/jsx/ControlGroup/index.native.js +1 -1
  357. package/dist/jsx/ControlGroup/index.native.js.map +1 -1
  358. package/dist/jsx/DescriptionList/index.native.js +2 -2
  359. package/dist/jsx/DescriptionList/index.native.js.map +1 -1
  360. package/dist/jsx/ErrorSummary.native.js.map +1 -1
  361. package/dist/jsx/FieldDisplay/editMode.native.js.map +1 -1
  362. package/dist/jsx/FieldDisplay/formatters.native.js.map +1 -1
  363. package/dist/jsx/FieldDisplay/index.mjs +2 -1
  364. package/dist/jsx/FieldDisplay/index.mjs.map +1 -1
  365. package/dist/jsx/FieldDisplay/index.native.js +10 -3
  366. package/dist/jsx/FieldDisplay/index.native.js.map +1 -1
  367. package/dist/jsx/FieldGroup.native.js.map +1 -1
  368. package/dist/jsx/FloatingPanel/index.mjs +8 -1
  369. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  370. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  371. package/dist/jsx/Form/index.native.js +1 -1
  372. package/dist/jsx/Form/index.native.js.map +1 -1
  373. package/dist/jsx/Form/validateOn.native.js.map +1 -1
  374. package/dist/jsx/FormGrid.native.js.map +1 -1
  375. package/dist/jsx/FormSection.native.js.map +1 -1
  376. package/dist/jsx/InputParts/index.mjs +64 -2
  377. package/dist/jsx/InputParts/index.mjs.map +1 -1
  378. package/dist/jsx/InputParts/index.native.js +70 -4
  379. package/dist/jsx/InputParts/index.native.js.map +1 -1
  380. package/dist/jsx/Label/index.native.js.map +1 -1
  381. package/dist/jsx/Skeleton/index.native.js.map +1 -1
  382. package/dist/jsx/Spinner/SpinnerGlyph.native.js.map +1 -1
  383. package/dist/jsx/Spinner/spinnerSize.native.js.map +1 -1
  384. package/dist/jsx/Table/index.native.js.map +1 -1
  385. package/dist/jsx/Wheel/haptic.native.js.map +1 -1
  386. package/dist/jsx/Wheel/index.native.js.map +1 -1
  387. package/dist/jsx/actionLabel.native.js.map +1 -1
  388. package/dist/jsx/fieldDefaults.native.js.map +1 -1
  389. package/dist/jsx/fieldLayout.native.js +1 -1
  390. package/dist/jsx/fieldLayout.native.js.map +1 -1
  391. package/dist/jsx/fields/Barcode/BarcodePreview.mjs +15 -9
  392. package/dist/jsx/fields/Barcode/BarcodePreview.mjs.map +1 -1
  393. package/dist/jsx/fields/Barcode/BarcodePreview.native.js +15 -9
  394. package/dist/jsx/fields/Barcode/BarcodePreview.native.js.map +1 -1
  395. package/dist/jsx/fields/Barcode/BarcodeScanner.native.js +1 -1
  396. package/dist/jsx/fields/Barcode/code128.native.js.map +1 -1
  397. package/dist/jsx/fields/Barcode/index.native.js +2 -2
  398. package/dist/jsx/fields/Barcode/index.native.js.map +1 -1
  399. package/dist/jsx/fields/Barcode/qr.native.js.map +1 -1
  400. package/dist/jsx/fields/Barcode/scannerTypes.native.js.map +1 -1
  401. package/dist/jsx/fields/Checkbox/Checkbox.native.js +1 -1
  402. package/dist/jsx/fields/Checkbox/Checkbox.native.js.map +1 -1
  403. package/dist/jsx/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  404. package/dist/jsx/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  405. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  406. package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js +1 -1
  407. package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  408. package/dist/jsx/fields/Checkbox/index.native.js.map +1 -1
  409. package/dist/jsx/fields/ColorPicker/index.native.js +3 -3
  410. package/dist/jsx/fields/ColorPicker/index.native.js.map +1 -1
  411. package/dist/jsx/fields/ColorPicker/parts.native.js +2 -2
  412. package/dist/jsx/fields/ColorPicker/parts.native.js.map +1 -1
  413. package/dist/jsx/fields/Combobox/authorOptions.native.js.map +1 -1
  414. package/dist/jsx/fields/Combobox/index.mjs +14 -11
  415. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  416. package/dist/jsx/fields/Combobox/index.native.js +21 -16
  417. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  418. package/dist/jsx/fields/DatePicker/Calendar.native.js.map +1 -1
  419. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js +2 -2
  420. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  421. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js +3 -3
  422. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  423. package/dist/jsx/fields/DatePicker/MonthPicker.native.js +2 -2
  424. package/dist/jsx/fields/DatePicker/MonthPicker.native.js.map +1 -1
  425. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js +2 -2
  426. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  427. package/dist/jsx/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  428. package/dist/jsx/fields/DatePicker/index.native.js +2 -2
  429. package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
  430. package/dist/jsx/fields/DatePicker/parts.native.js +2 -2
  431. package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
  432. package/dist/jsx/fields/DatePicker/utils.native.js.map +1 -1
  433. package/dist/jsx/fields/Duration/durationMath.native.js.map +1 -1
  434. package/dist/jsx/fields/Duration/index.native.js +3 -3
  435. package/dist/jsx/fields/Duration/index.native.js.map +1 -1
  436. package/dist/jsx/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  437. package/dist/jsx/fields/FileUpload/index.mjs +11 -3
  438. package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
  439. package/dist/jsx/fields/FileUpload/index.native.js +22 -5
  440. package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
  441. package/dist/jsx/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  442. package/dist/jsx/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  443. package/dist/jsx/fields/Geolocation/index.native.js +5 -5
  444. package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
  445. package/dist/jsx/fields/Geolocation/mapMath.native.js.map +1 -1
  446. package/dist/jsx/fields/Geolocation/mapTypes.native.js.map +1 -1
  447. package/dist/jsx/fields/Icon/drawnSet.native.js.map +1 -1
  448. package/dist/jsx/fields/Icon/index.mjs +1 -0
  449. package/dist/jsx/fields/Icon/index.mjs.map +1 -1
  450. package/dist/jsx/fields/Icon/index.native.js +4 -3
  451. package/dist/jsx/fields/Icon/index.native.js.map +1 -1
  452. package/dist/jsx/fields/ImageField/index.native.js +2 -2
  453. package/dist/jsx/fields/ImageField/index.native.js.map +1 -1
  454. package/dist/jsx/fields/Input/index.mjs +177 -98
  455. package/dist/jsx/fields/Input/index.mjs.map +1 -1
  456. package/dist/jsx/fields/Input/index.native.js +85 -6
  457. package/dist/jsx/fields/Input/index.native.js.map +1 -1
  458. package/dist/jsx/fields/MentionInput/index.mjs +6 -1
  459. package/dist/jsx/fields/MentionInput/index.mjs.map +1 -1
  460. package/dist/jsx/fields/MentionInput/index.native.js +9 -4
  461. package/dist/jsx/fields/MentionInput/index.native.js.map +1 -1
  462. package/dist/jsx/fields/OTPInput/index.mjs +7 -3
  463. package/dist/jsx/fields/OTPInput/index.mjs.map +1 -1
  464. package/dist/jsx/fields/OTPInput/index.native.js +10 -5
  465. package/dist/jsx/fields/OTPInput/index.native.js.map +1 -1
  466. package/dist/jsx/fields/OTPInput/otpCellCss.native.js.map +1 -1
  467. package/dist/jsx/fields/PhoneInput/dialCodes.native.js.map +1 -1
  468. package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
  469. package/dist/jsx/fields/PhoneInput/index.native.js +4 -3
  470. package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
  471. package/dist/jsx/fields/PhoneInput/phone.native.js.map +1 -1
  472. package/dist/jsx/fields/Progress/index.native.js +1 -1
  473. package/dist/jsx/fields/Progress/index.native.js.map +1 -1
  474. package/dist/jsx/fields/RadioGroup/index.native.js +1 -1
  475. package/dist/jsx/fields/RadioGroup/index.native.js.map +1 -1
  476. package/dist/jsx/fields/Rating/index.native.js +1 -1
  477. package/dist/jsx/fields/Rating/index.native.js.map +1 -1
  478. package/dist/jsx/fields/Rating/ratingMath.native.js.map +1 -1
  479. package/dist/jsx/fields/Rating/types.native.js.map +1 -1
  480. package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
  481. package/dist/jsx/fields/SearchInput/index.native.js +2 -2
  482. package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
  483. package/dist/jsx/fields/Select/index.native.js +4 -4
  484. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  485. package/dist/jsx/fields/Signature/index.native.js +2 -2
  486. package/dist/jsx/fields/Signature/index.native.js.map +1 -1
  487. package/dist/jsx/fields/Slider/index.native.js +1 -1
  488. package/dist/jsx/fields/Slider/index.native.js.map +1 -1
  489. package/dist/jsx/fields/Slider/jumpMotion.native.js.map +1 -1
  490. package/dist/jsx/fields/Stepper/index.native.js +2 -2
  491. package/dist/jsx/fields/Stepper/index.native.js.map +1 -1
  492. package/dist/jsx/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  493. package/dist/jsx/fields/Switch/index.native.js +2 -2
  494. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  495. package/dist/jsx/fields/TextArea/index.native.js +2 -2
  496. package/dist/jsx/fields/TextArea/index.native.js.map +1 -1
  497. package/dist/jsx/fields/TimePicker/index.native.js +3 -3
  498. package/dist/jsx/fields/TimePicker/index.native.js.map +1 -1
  499. package/dist/jsx/fields/TimePicker/parts.native.js +1 -1
  500. package/dist/jsx/fields/TimePicker/parts.native.js.map +1 -1
  501. package/dist/jsx/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  502. package/dist/jsx/fields/TimeRangeScrubber/index.native.js +2 -2
  503. package/dist/jsx/fields/TimeRangeScrubber/index.native.js.map +1 -1
  504. package/dist/jsx/fields/ToggleGroup/index.native.js +1 -1
  505. package/dist/jsx/fields/ToggleGroup/index.native.js.map +1 -1
  506. package/dist/jsx/fields/selectedOrder.native.js.map +1 -1
  507. package/dist/jsx/formSpacing.native.js.map +1 -1
  508. package/dist/jsx/hooks/useFocusManagement.native.js.map +1 -1
  509. package/dist/jsx/index.native.js +43 -43
  510. package/dist/jsx/index.native.js.map +1 -1
  511. package/dist/jsx/requiredMarking.native.js.map +1 -1
  512. package/dist/jsx/shared/TimeColumn.native.js +1 -1
  513. package/dist/jsx/shared/TimeColumn.native.js.map +1 -1
  514. package/dist/jsx/shared/capabilityPreflight.native.js.map +1 -1
  515. package/dist/jsx/shared/colorRamps.native.js.map +1 -1
  516. package/dist/jsx/shared/devWarn.native.js.map +1 -1
  517. package/dist/jsx/shared/floatingList.native.js +1 -1
  518. package/dist/jsx/shared/floatingList.native.js.map +1 -1
  519. package/dist/jsx/shared/focusManagement.native.js.map +1 -1
  520. package/dist/jsx/shared/groupContext.native.js.map +1 -1
  521. package/dist/jsx/shared/i18n.native.js.map +1 -1
  522. package/dist/jsx/shared/t.native.js.map +1 -1
  523. package/dist/jsx/shared/tableCellContext.native.js.map +1 -1
  524. package/dist/jsx/shared/useDragScroll.native.js.map +1 -1
  525. package/dist/jsx/shared/useKeyboardInset.native.js.map +1 -1
  526. package/dist/jsx/shared/useSheetEscapeDismiss.native.js.map +1 -1
  527. package/dist/jsx/shared/useWheelIncrement.native.js.map +1 -1
  528. package/dist/jsx/shared/utils.mjs +4 -14
  529. package/dist/jsx/shared/utils.mjs.map +1 -1
  530. package/dist/jsx/shared/utils.native.js +7 -15
  531. package/dist/jsx/shared/utils.native.js.map +1 -1
  532. package/dist/jsx/shared/zIndex.native.js.map +1 -1
  533. package/dist/jsx/themedPrimitives.native.js.map +1 -1
  534. package/dist/jsx/types.native.js.map +1 -1
  535. package/dist/jsx/utils/LinkCell.native.js.map +1 -1
  536. package/package.json +7 -7
  537. package/src/Button/Button.density.spec.tsx +118 -32
  538. package/src/Button/Button.labelInk.spec.tsx +72 -19
  539. package/src/Button/Button.lc71.spec.tsx +10 -3
  540. package/src/Button/Button.stories.tsx +7 -6
  541. package/src/Button/index.tsx +22 -12
  542. package/src/ContextualSaveBar/UnsavedChangesDialog.tsx +0 -1
  543. package/src/FieldDisplay/FieldDisplay.spec.tsx +11 -2
  544. package/src/FieldDisplay/index.tsx +5 -0
  545. package/src/FloatingPanel/index.tsx +22 -1
  546. package/src/FloatingPanel/panelWidthContract.spec.ts +1 -0
  547. package/src/InputParts/index.tsx +100 -3
  548. package/src/fields/Barcode/BarcodePreview.spec.tsx +139 -5
  549. package/src/fields/Barcode/BarcodePreview.tsx +47 -15
  550. package/src/fields/Combobox/Combobox.spec.tsx +64 -1
  551. package/src/fields/Combobox/index.tsx +22 -11
  552. package/src/fields/FileUpload/FileUpload.spec.tsx +28 -0
  553. package/src/fields/FileUpload/index.tsx +26 -1
  554. package/src/fields/Icon/Icon.stories.tsx +1 -1
  555. package/src/fields/Icon/index.tsx +1 -0
  556. package/src/fields/Input/index.tsx +180 -81
  557. package/src/fields/MentionInput/index.tsx +9 -1
  558. package/src/fields/OTPInput/OtpInput.spec.tsx +36 -4
  559. package/src/fields/OTPInput/index.tsx +18 -3
  560. package/src/fields/OTPInput/otpCellHeightTouch.spec.ts +44 -0
  561. package/src/fields/PhoneInput/index.tsx +1 -0
  562. package/src/fields/SearchInput/index.tsx +5 -3
  563. package/src/shared/utils.spec.ts +46 -0
  564. package/src/shared/utils.ts +31 -16
  565. package/types/Button/index.d.ts +8 -3
  566. package/types/Button/index.d.ts.map +1 -1
  567. package/types/ContextualSaveBar/UnsavedChangesDialog.d.ts.map +1 -1
  568. package/types/FieldDisplay/index.d.ts.map +1 -1
  569. package/types/InputParts/index.d.ts +9 -5
  570. package/types/InputParts/index.d.ts.map +1 -1
  571. package/types/fields/Barcode/BarcodePreview.d.ts +20 -9
  572. package/types/fields/Barcode/BarcodePreview.d.ts.map +1 -1
  573. package/types/fields/Checkbox/index.d.ts +3 -3
  574. package/types/fields/Combobox/index.d.ts.map +1 -1
  575. package/types/fields/FileUpload/index.d.ts.map +1 -1
  576. package/types/fields/Icon/index.d.ts.map +1 -1
  577. package/types/fields/Input/index.d.ts +18 -6
  578. package/types/fields/Input/index.d.ts.map +1 -1
  579. package/types/fields/MentionInput/index.d.ts.map +1 -1
  580. package/types/fields/OTPInput/index.d.ts +12 -0
  581. package/types/fields/OTPInput/index.d.ts.map +1 -1
  582. package/types/fields/PhoneInput/index.d.ts.map +1 -1
  583. package/types/fields/RadioGroup/index.d.ts +2 -2
  584. package/types/fields/SearchInput/index.d.ts.map +1 -1
  585. package/types/fields/ToggleGroup/index.d.ts +1 -1
  586. package/types/shared/utils.d.ts.map +1 -1
@@ -2,17 +2,25 @@
2
2
  * @vitest-environment jsdom
3
3
  *
4
4
  * MPO-42 / LC-76: the density knob and the `compact` PROP must land the
5
- * SAME padX. Height stays 44 at both stops — density moves pad/gap only.
5
+ * SAME padX. Height stays 44 at both stops — density moves space, not size.
6
+ *
7
+ * LC-79 / LC-80: the internals come from the size recipe, so density picks
8
+ * the recipe FAMILY (`control` -> `controlCompact`) and never subtracts a
9
+ * hand-set delta. The delta drifted from the generated table at every token
10
+ * but `$4`, and at `$2` it INVERTED — `max(8, 7 - 2)` painted a compact
11
+ * Button 8px wider than the comfortable 7px one.
6
12
  */
7
13
 
8
14
  import { renderWithProviders } from "@multiplatform.one/test-utils";
9
- import { Preset } from "@multiplatform.one/theme";
15
+ import { Preset, recipeFamilies } from "@multiplatform.one/theme";
10
16
  import { cleanup, screen } from "@testing-library/react";
11
17
  import { afterEach, describe, expect, it } from "vitest";
12
- import { Button } from "./index";
18
+ import { Button, buttonDensityFamily, resolveButtonSizeRecipe } from "./index";
13
19
 
14
20
  afterEach(cleanup);
15
21
 
22
+ const sizes = ["$2", "$3", "$4"] as const;
23
+
16
24
  /** Last `_pl-Npx` / `_pr-Npx` class wins (paddingHorizontal expands to both). */
17
25
  function paddingPxFromClass(el: HTMLElement): number | null {
18
26
  let found: number | null = null;
@@ -23,56 +31,134 @@ function paddingPxFromClass(el: HTMLElement): number | null {
23
31
  return found;
24
32
  }
25
33
 
34
+ function gapPxFromClass(el: HTMLElement): number | null {
35
+ for (const c of String(el.className || "").split(/\s+/)) {
36
+ const m = c.match(/^_gap-(\d+)px$/);
37
+ if (m) return Number(m[1]);
38
+ }
39
+ return null;
40
+ }
41
+
42
+ function renderProp(size: (typeof sizes)[number]) {
43
+ renderWithProviders(
44
+ <Button compact size={size} icon={<span>i</span>}>
45
+ Save
46
+ </Button>,
47
+ );
48
+ return screen.getByRole("button");
49
+ }
50
+
51
+ function renderKnob(size: (typeof sizes)[number]) {
52
+ renderWithProviders(
53
+ <Preset overrides={{ density: "compact" }}>
54
+ <Button size={size} icon={<span>i</span>}>
55
+ Save
56
+ </Button>
57
+ </Preset>,
58
+ );
59
+ return screen.getByRole("button");
60
+ }
61
+
62
+ function renderComfortable(size: (typeof sizes)[number]) {
63
+ renderWithProviders(
64
+ <Button size={size} icon={<span>i</span>}>
65
+ Save
66
+ </Button>,
67
+ );
68
+ return screen.getByRole("button");
69
+ }
70
+
26
71
  describe("Button density knob = compact PROP (MPO-42)", () => {
27
72
  it("compact PROP and density:compact knob land the SAME padX", () => {
28
- renderWithProviders(
29
- <Button compact size="$4">
30
- Save
31
- </Button>,
32
- );
33
- const viaProp = screen.getByRole("button");
73
+ const viaProp = renderProp("$4");
34
74
  const propPad = paddingPxFromClass(viaProp);
35
75
  expect(viaProp.getAttribute("data-mp-density")).toBe("compact");
36
76
  expect(propPad).toBe(16);
37
77
  cleanup();
38
78
 
39
- renderWithProviders(
40
- <Preset overrides={{ density: "compact" }}>
41
- <Button size="$4">Save</Button>
42
- </Preset>,
43
- );
44
- const viaKnob = screen.getByRole("button");
45
- const knobPad = paddingPxFromClass(viaKnob);
79
+ const viaKnob = renderKnob("$4");
46
80
  expect(viaKnob.getAttribute("data-mp-density")).toBe("compact");
47
- expect(knobPad).toBe(propPad);
48
- expect(knobPad).toBe(16);
81
+ expect(paddingPxFromClass(viaKnob)).toBe(propPad);
82
+ expect(paddingPxFromClass(viaKnob)).toBe(16);
83
+ });
84
+
85
+ it("both channels land the SAME padX at every size step, not just $4", () => {
86
+ for (const size of sizes) {
87
+ const viaProp = paddingPxFromClass(renderProp(size));
88
+ cleanup();
89
+ const viaKnob = paddingPxFromClass(renderKnob(size));
90
+ cleanup();
91
+ expect(viaKnob, `padX at ${size}`).toBe(viaProp);
92
+ }
49
93
  });
50
94
 
51
95
  it("height stays 44 at comfortable and compact density stops", () => {
52
- renderWithProviders(<Button size="$4">Save</Button>);
53
- const comfortable = screen.getByRole("button");
96
+ const comfortable = renderComfortable("$4");
54
97
  expect(comfortable.getAttribute("data-mp-button-height")).toBe("44");
55
98
  expect(comfortable.className).toMatch(/_h-44px/);
56
99
  expect(paddingPxFromClass(comfortable)).toBe(18);
57
100
  cleanup();
58
101
 
59
- renderWithProviders(
60
- <Preset overrides={{ density: "compact" }}>
61
- <Button size="$4">Save</Button>
62
- </Preset>,
63
- );
64
- const viaKnob = screen.getByRole("button");
102
+ const viaKnob = renderKnob("$4");
65
103
  expect(viaKnob.getAttribute("data-mp-button-height")).toBe("44");
66
104
  expect(viaKnob.className).toMatch(/_h-44px/);
67
105
  cleanup();
68
106
 
69
- renderWithProviders(
70
- <Button compact size="$4">
71
- Save
72
- </Button>,
73
- );
74
- const viaProp = screen.getByRole("button");
107
+ const viaProp = renderProp("$4");
75
108
  expect(viaProp.getAttribute("data-mp-button-height")).toBe("44");
76
109
  expect(viaProp.className).toMatch(/_h-44px/);
77
110
  });
111
+
112
+ it("density never changes the painted height at any size step (LC-76)", () => {
113
+ for (const size of sizes) {
114
+ const relaxed = renderComfortable(size).getAttribute("data-mp-button-height");
115
+ cleanup();
116
+ const tight = renderKnob(size).getAttribute("data-mp-button-height");
117
+ cleanup();
118
+ expect(tight, `height at ${size}`).toBe(relaxed);
119
+ }
120
+ });
121
+ });
122
+
123
+ describe("Button density comes from the recipe family (LC-79 / LC-80)", () => {
124
+ it("density picks the family, it does not subtract from the recipe", () => {
125
+ expect(buttonDensityFamily("control", true)).toBe("controlCompact");
126
+ expect(buttonDensityFamily("control", false)).toBe("control");
127
+ // An explicit controlCompact consumer (Chip) does not tighten twice.
128
+ expect(buttonDensityFamily("controlCompact", true)).toBe("controlCompact");
129
+ });
130
+
131
+ it("compact padX is the generated controlCompact table, at every size", () => {
132
+ for (const size of sizes) {
133
+ const expected = resolveButtonSizeRecipe(size, "controlCompact").paddingHorizontal;
134
+ const viaKnob = paddingPxFromClass(renderKnob(size));
135
+ cleanup();
136
+ expect(viaKnob, `padX at ${size}`).toBe(expected);
137
+ }
138
+ });
139
+
140
+ it("compact is never WIDER than comfortable — the $2 inversion stays fixed", () => {
141
+ for (const size of sizes) {
142
+ const relaxed = paddingPxFromClass(renderComfortable(size)) ?? 0;
143
+ cleanup();
144
+ const tight = paddingPxFromClass(renderKnob(size)) ?? 0;
145
+ cleanup();
146
+ expect(tight, `padX at ${size}`).toBeLessThan(relaxed);
147
+ }
148
+ });
149
+
150
+ it("the inner gap stays the recipe gap — gap == radius at both stops", () => {
151
+ for (const size of sizes) {
152
+ const radius = recipeFamilies.controlCompact.radii[size];
153
+ const relaxed = gapPxFromClass(renderComfortable(size));
154
+ cleanup();
155
+ const tight = gapPxFromClass(renderKnob(size));
156
+ cleanup();
157
+ expect(tight, `gap at ${size}`).toBe(resolveButtonSizeRecipe(size, "controlCompact").gap);
158
+ expect(tight, `gap == radius at ${size}`).toBe(radius);
159
+ expect(relaxed, `comfortable gap at ${size}`).toBe(
160
+ resolveButtonSizeRecipe(size, "control").gap,
161
+ );
162
+ }
163
+ });
78
164
  });
@@ -9,21 +9,20 @@
9
9
  *
10
10
  * jsdom cannot cascade Tamagui CSS, so the DOM arm reads the atomic
11
11
  * classes the text node emits (`_col-color11`, `_fow-400`). Contrast is
12
- * the theme-table arm: intent `$color11` vs the page `$background` in
13
- * both schemes.
12
+ * the theme-table arm: intent `$color11` against EVERY page surface the
13
+ * house theme paints, in both schemes — `$background`/`$color1` (white)
14
+ * and `$color2` (#f9f9fa, what the gallery boards are shot on).
14
15
  */
15
16
 
16
17
  import { render, cleanup, screen } from "@testing-library/react";
17
18
  import {
18
19
  aaTextContrastRatio,
19
- contrastRatio,
20
20
  createDefaultThemeConfig,
21
21
  createThemesBuilder,
22
22
  defaultAccentTheme,
23
23
  defaultBaseTheme,
24
24
  defaultBuilderOptions,
25
- normalizeToHex,
26
- relativeLuminance,
25
+ measureContrast,
27
26
  } from "@multiplatform.one/theme";
28
27
  import { afterEach, describe, expect, it } from "vitest";
29
28
  import { TamaguiProvider, YStack } from "tamagui";
@@ -40,6 +39,15 @@ const houseThemes = createThemesBuilder(
40
39
 
41
40
  const INTENTS = ["error", "warning", "success"] as const;
42
41
  const SCHEMES = ["light", "dark"] as const;
42
+ /**
43
+ * The house theme has THREE page surfaces and they are not interchangeable:
44
+ * `$background` and `$color1` are pure white, `$color2` is #f9f9fa. Every
45
+ * gallery board paints `$color2` (actionFeedbackMain.tsx board root), so a
46
+ * contrast arm that only reads `$background` certifies on a surface the
47
+ * boards never shoot — the same shape of hole as measuring the FRAME
48
+ * instead of the text node. All three are measured here.
49
+ */
50
+ const WHITE_PAGE_SURFACES = ["background", "color1"] as const;
43
51
 
44
52
  function houseRender(ui: React.ReactElement, theme: "light" | "dark" = "light") {
45
53
  return render(
@@ -53,12 +61,13 @@ function labelNode(text: string): HTMLElement {
53
61
  return screen.getByText(text);
54
62
  }
55
63
 
56
- function contrastAgainstPage(ink: string, ground: string): number {
57
- const inkHex = normalizeToHex(ink);
58
- const groundHex = normalizeToHex(ground);
59
- expect(inkHex, `ink ${ink}`).toBeTruthy();
60
- expect(groundHex, `ground ${ground}`).toBeTruthy();
61
- return contrastRatio(relativeLuminance(inkHex!), relativeLuminance(groundHex!));
64
+ /**
65
+ * One implementation of the arithmetic (the point of exporting
66
+ * `measureContrast`), and the REPORTED 2-decimal ratio, so the number a
67
+ * failure prints is the number the verdict used.
68
+ */
69
+ function pageRatio(ink: string, ground: string, label: string): number {
70
+ return measureContrast({ foreground: ink, background: ground, label }).ratio;
62
71
  }
63
72
 
64
73
  describe("Button MPO-40 outlined intent label ink", () => {
@@ -121,23 +130,67 @@ describe("Button MPO-40 outlined intent label ink", () => {
121
130
  }
122
131
  });
123
132
 
124
- it("intent $color11 vs page ground is >= 4.5:1 in both schemes; on-fill $color is not", () => {
133
+ it("intent $color11 clears 4.5:1 on the white page surfaces in both schemes; on-fill $color never does", () => {
125
134
  for (const scheme of SCHEMES) {
126
- const ground = houseThemes[scheme].background;
127
135
  for (const intent of INTENTS) {
128
136
  const ink = houseThemes[`${scheme}_${intent}`].color11;
129
- const ratio = contrastAgainstPage(ink, ground);
130
- expect(
131
- ratio,
132
- `${scheme}_${intent}.color11 ${ink} vs ${ground}`,
133
- ).toBeGreaterThanOrEqual(aaTextContrastRatio);
137
+ for (const surface of WHITE_PAGE_SURFACES) {
138
+ const ground = houseThemes[scheme][surface];
139
+ const label = `${scheme}_${intent}.color11 ${ink} on ${scheme}.${surface} ${ground}`;
140
+ expect(pageRatio(ink, ground, label), label).toBeGreaterThanOrEqual(aaTextContrastRatio);
141
+ }
134
142
 
135
143
  const onFill = houseThemes[`${scheme}_${intent}_Button`].color;
144
+ const ground = houseThemes[scheme].background;
136
145
  expect(
137
- contrastAgainstPage(onFill, ground),
146
+ pageRatio(onFill, ground, `${scheme}_${intent}_Button.color`),
138
147
  `${scheme}_${intent}_Button.color is the on-fill foreground`,
139
148
  ).toBeLessThan(2);
140
149
  }
141
150
  }
142
151
  });
152
+
153
+ it("dark intent $color11 clears 4.5:1 on the $color2 page surface too", () => {
154
+ for (const intent of INTENTS) {
155
+ const ink = houseThemes[`dark_${intent}`].color11;
156
+ const ground = houseThemes.dark.color2;
157
+ const label = `dark_${intent}.color11 ${ink} on dark.color2 ${ground}`;
158
+ expect(pageRatio(ink, ground, label), label).toBeGreaterThanOrEqual(aaTextContrastRatio);
159
+ }
160
+ });
161
+
162
+ // PINNED MISS — MPO-40's own secondary finding, still OPEN.
163
+ //
164
+ // Fixing the plumbing (the arm above) was necessary, not sufficient. On
165
+ // $color2 — the surface every gallery board is shot on — light warning
166
+ // and success $color11 are under mpo's own floor, and those are exactly
167
+ // the numbers button-anatomy already prints for its CONTRACT row. The
168
+ // step that would close them is a PALETTE change (Radix yellow-11
169
+ // #9e6c00 / green-11 #218358), owned by the contrast-floor lane, not by
170
+ // the Button. colorRules.ts pins the same warning miss on the intent's
171
+ // own color1 (#fcfcf7, 4.44:1); this pins it on the page ground.
172
+ //
173
+ // These numbers are asserted EXACTLY on purpose. Step the palette and
174
+ // this test fails, which is the reminder to re-measure the board and
175
+ // tick MPO-40's contrast criterion — never a regression to re-baseline.
176
+ it("light warning/success $color11 are STILL under 4.5:1 on the $color2 page surface", () => {
177
+ const ground = houseThemes.light.color2;
178
+ const measured = Object.fromEntries(
179
+ INTENTS.map((intent): [string, number] => [
180
+ intent,
181
+ pageRatio(
182
+ houseThemes[`light_${intent}`].color11,
183
+ ground,
184
+ `light_${intent}.color11 on light.color2`,
185
+ ),
186
+ ]),
187
+ );
188
+ expect(measured, `light.color2 is ${ground}`).toEqual({
189
+ error: 4.95,
190
+ warning: 4.34,
191
+ success: 4.48,
192
+ });
193
+ expect(measured.warning).toBeLessThan(aaTextContrastRatio);
194
+ expect(measured.success).toBeLessThan(aaTextContrastRatio);
195
+ });
143
196
  });
@@ -6,7 +6,7 @@ import { cleanup, fireEvent, screen } from "@testing-library/react";
6
6
  import { renderWithProviders } from "@multiplatform.one/test-utils";
7
7
  import { Preset } from "@multiplatform.one/theme";
8
8
  import { afterEach, describe, expect, it, vi } from "vitest";
9
- import { Button, buttonDensityPad, buttonSizeRecipes, resolveButtonSizeRecipe } from "./index";
9
+ import { Button, buttonDensityFamily, buttonSizeRecipes, resolveButtonSizeRecipe } from "./index";
10
10
 
11
11
  afterEach(cleanup);
12
12
 
@@ -52,8 +52,15 @@ describe("Button size recipes", () => {
52
52
 
53
53
  describe("Button density ≠ size", () => {
54
54
  it("compact tightens pad without shrinking recipe height", () => {
55
- expect(buttonDensityPad(12, true)).toBe(10);
56
- expect(buttonDensityPad(12, false)).toBe(12);
55
+ // Density picks the FAMILY; it never subtracts from the recipe (LC-79).
56
+ expect(buttonDensityFamily("control", true)).toBe("controlCompact");
57
+ expect(buttonDensityFamily("control", false)).toBe("control");
58
+ expect(resolveButtonSizeRecipe("$4", "controlCompact").paddingHorizontal).toBeLessThan(
59
+ resolveButtonSizeRecipe("$4", "control").paddingHorizontal,
60
+ );
61
+ expect(resolveButtonSizeRecipe("$4", "controlCompact").height).toBe(
62
+ resolveButtonSizeRecipe("$4", "control").height,
63
+ );
57
64
  renderWithProviders(
58
65
  <Button compact size="$4">
59
66
  Save
@@ -57,11 +57,12 @@ export const Basic: Story = {
57
57
  options: ["$2", "$3", "$4", "$5", "$6"],
58
58
  description: "Tamagui size token",
59
59
  },
60
- variant: {
61
- control: "select",
62
- options: [undefined, "outlined"],
63
- description: "Structural variant",
64
- },
60
+ // The house fill channel is the `outlined` boolean. `variant="outlined"`
61
+ // is raw-tamagui API this component does not read (only the
62
+ // `@multiplatform.one/components` shim maps it), so a `variant` control
63
+ // here drove nothing — MPO-19 X3 measured the board's own "Outlined"
64
+ // specimen rendering as a filled button with a transparent edge.
65
+ outlined: { control: "boolean", description: "Outlined fill style" },
65
66
  chromeless: { control: "boolean", description: "Transparent, text-only style" },
66
67
  disabled: { control: "boolean", description: "Disable the button" },
67
68
  skeleton: { control: "boolean", description: "Show skeleton placeholder" },
@@ -210,7 +211,7 @@ export const Comparison: Story = {
210
211
  <Button icon={Activity} onPress={pressed("custom.icon")}>
211
212
  With Icon
212
213
  </Button>
213
- <Button variant="outlined" onPress={pressed("custom.outlined")}>
214
+ <Button outlined onPress={pressed("custom.outlined")}>
214
215
  Outlined
215
216
  </Button>
216
217
  <Button disabled disabledReason="Needs a completed draft">
@@ -76,13 +76,18 @@ export function resolveButtonSizeRecipe(
76
76
  return sizeRecipeForToken(size == null ? "$true" : String(size), { family });
77
77
  }
78
78
 
79
- /** Density tightens pad/gap only — never height, type, or icon (density ≠ size). */
80
- export function buttonDensityPad(padX: number, densityTight: boolean): number {
81
- return densityTight ? Math.max(8, padX - 2) : padX;
82
- }
83
-
84
- export function buttonDensityGap(gap: number, densityTight: boolean): number {
85
- return densityTight ? Math.max(4, gap - 1) : gap;
79
+ /**
80
+ * Density selects the recipe FAMILY, it does not subtract from the recipe
81
+ * (LC-79 / LC-80): control -> controlCompact, same heights, tighter ratios.
82
+ * A hand-set delta is a second density writer and it drifts from the
83
+ * generated table at every token but `$4` — it inverted at `$2`, where
84
+ * `max(8, 7 - 2)` painted a compact Button WIDER than a comfortable one.
85
+ */
86
+ export function buttonDensityFamily(
87
+ family: RecipeFamilyName,
88
+ densityTight: boolean,
89
+ ): RecipeFamilyName {
90
+ return densityTight ? "controlCompact" : family;
86
91
  }
87
92
 
88
93
  /**
@@ -416,9 +421,11 @@ export function Button({
416
421
  (warning && "warning") ||
417
422
  (success && "success") ||
418
423
  undefined;
419
- // compact is density (pad/gap), not a size step — do not pass it through
424
+ // compact is density, not a size step — do not pass it through
420
425
  // useResolvedKnobs (size stays on the size axis; LC-76). The PROP and the
421
- // density knob must share this channel so both land the same padX/gap.
426
+ // density knob share one channel: both pick the recipe FAMILY, the same
427
+ // way resolveKnobs picks it for every other control, so both land the
428
+ // same padX and the internals stay recipe-generated (LC-75 / LC-79).
422
429
  const { knobProps, control, text, disabledState } = useResolvedKnobs({
423
430
  intent,
424
431
  component: "Button",
@@ -430,10 +437,13 @@ export function Button({
430
437
  const grouped = useControlGrouped();
431
438
  const sizeProp = (props as { size?: SizeTokens | number }).size;
432
439
  const resolvedSize = sizeProp ?? knobProps.sizeToken;
433
- const recipe = resolveButtonSizeRecipe(resolvedSize, recipeFamily);
434
440
  const densityTight = compact !== undefined ? compact === true : knobProps.density === "compact";
435
- const padX = buttonDensityPad(recipe.paddingHorizontal, densityTight);
436
- const innerGap = buttonDensityGap(recipe.gap, densityTight);
441
+ const recipe = resolveButtonSizeRecipe(
442
+ resolvedSize,
443
+ buttonDensityFamily(recipeFamily, densityTight),
444
+ );
445
+ const padX = recipe.paddingHorizontal;
446
+ const innerGap = recipe.gap;
437
447
  if (skeleton) {
438
448
  return (
439
449
  <View
@@ -102,7 +102,6 @@ export function UnsavedChangesDialog({
102
102
  </Button>
103
103
  <Button
104
104
  error
105
- theme="red"
106
105
  actionRole="primary"
107
106
  data-mp-savebar-discard-confirm=""
108
107
  onPress={() => {
@@ -119,11 +119,20 @@ describe("FieldDisplay", () => {
119
119
  expect(root?.getAttribute("data-field")).toBe("datepicker");
120
120
  });
121
121
 
122
- it("draws a QR matrix when barcode fieldProps.formats starts with qr", () => {
122
+ /**
123
+ * The qr format reaches BarcodePreview (the round trip is asserted there),
124
+ * but a display cell's bound is the glyph size — around 20px — and a QR
125
+ * needs one WHOLE pixel per module, 29 minimum. So the cell draws no matrix
126
+ * and, because it already prints the value beside the symbol, contributes
127
+ * nothing rather than a second copy of the string (textFallback={false}).
128
+ * Growing the row to fit a scannable square is the thing LC-06 forbids.
129
+ */
130
+ it("prints the barcode value once and draws no unreadable QR at a display bound", () => {
123
131
  const result = renderWithProviders(
124
132
  <FieldDisplay field="barcode" value="SKU-001234" fieldProps={{ formats: ["qr"] }} />,
125
133
  );
126
- expect(result.container.querySelector('[data-testid="barcode-preview-qr"]')).not.toBeNull();
134
+ expect(result.container.querySelector('[data-testid="barcode-preview-qr"]')).toBeNull();
127
135
  expect(result.container.querySelector("canvas")).toBeNull();
136
+ expect(result.container.textContent?.split("SKU-001234").length).toBe(2); // exactly once
128
137
  });
129
138
  });
@@ -563,11 +563,16 @@ function BarcodeDisplay({ value, fieldProps }: { value: any; fieldProps?: Record
563
563
  return (
564
564
  <XStack alignItems="center" minWidth={0} flexShrink={1} {...knobProps.gap}>
565
565
  <ValueText mono>{text}</ValueText>
566
+ {/* The value is already printed beside the symbol, so an undrawable one
567
+ contributes NOTHING rather than a second copy of the string. At this
568
+ bound that is every QR past a short value at a large size — a display
569
+ cell cannot hold 33 whole-pixel modules without growing the row. */}
566
570
  <BarcodePreview
567
571
  value={text}
568
572
  height={Math.max(12, glyphSize)}
569
573
  moduleWidth={1}
570
574
  format={typeof format === "string" ? format : undefined}
575
+ textFallback={false}
571
576
  />
572
577
  </XStack>
573
578
  );
@@ -607,6 +607,18 @@ function FloatingPanelWeb({
607
607
  // animation=none → no CSS tween (same contract as knobProps.transition === undefined)
608
608
  const webTransition = panel.knobProps.transition ? panelTransition : "none";
609
609
 
610
+ // `elevatedSurface` carries a web-only `style: { boxShadow }` (MPO-69,
611
+ // d326cc0c2). Two `style` props on one element do NOT merge — the later
612
+ // spread replaces the earlier — so spreading the complete fragment after the
613
+ // positioning style silently dropped `position: fixed`, `top`, `left`,
614
+ // `zIndex` and `overflow`, and every web FloatingPanel rendered in normal
615
+ // flow, pushing the page down instead of floating over it. Measured on
616
+ // origin/main 048289071: DatePicker's panel sat at trigger.bottom + 5.39 (the
617
+ // field container's flex gap), not the contract's 0.
618
+ // The complete fragment still goes on the element (AGENTS.md) — its style is
619
+ // folded into the positioning style rather than competing with it.
620
+ const { style: elevatedSurfaceStyle, ...elevatedSurfaceProps } = panel.knobProps.elevatedSurface;
621
+
610
622
  // Same slot problem as the sheet branch, but only half of it lands here. The
611
623
  // POINTER path survives, because `useClick(..., { event: "mousedown" })`
612
624
  // listens on mousedown and Tamagui only stops the click. The KEYBOARD path
@@ -650,6 +662,13 @@ function FloatingPanelWeb({
650
662
  })}
651
663
  cursor={disabled ? "not-allowed" : "pointer"}
652
664
  opacity={disabled ? 0.5 : 1}
665
+ // The cover contract is stated as a relation between the panel's top
666
+ // edge and THIS element's bottom edge — the box floating-ui anchors
667
+ // to, which is the whole trigger, not whatever glyph inside it was
668
+ // clicked. Marking it keeps the measurement unambiguous (a ColorPicker
669
+ // read from its swatch measures the swatch's inset, not the gap).
670
+ // Same idiom TreeSelect already uses for `data-fp-panel`.
671
+ data-fp-reference=""
653
672
  >
654
673
  {trigger}
655
674
  </View>
@@ -659,6 +678,7 @@ function FloatingPanelWeb({
659
678
  {...getFloatingProps({
660
679
  ref: panel.refs.setFloating,
661
680
  style: {
681
+ ...elevatedSurfaceStyle,
662
682
  position: panel.strategy,
663
683
  top: overlayStyleRef.current?.top ?? panel.y ?? 0,
664
684
  left: panel.x ?? 0,
@@ -675,9 +695,10 @@ function FloatingPanelWeb({
675
695
  onScroll: handleScroll,
676
696
  })}
677
697
  data-testid="floating-panel-viewport"
698
+ data-fp-panel=""
678
699
  {...panelChromeFocus}
679
700
  pointerEvents={panel.visible ? "auto" : "none"}
680
- {...panel.knobProps.elevatedSurface}
701
+ {...elevatedSurfaceProps}
681
702
  // Complete elevatedSurface fragment above is the ONLY surface source
682
703
  // (SF-OVERLAY "including border and elevation", Round 2 docket).
683
704
  // The one layered exception is anatomy, not surface: the dropdown
@@ -27,6 +27,7 @@ const fieldShapedPickers = [
27
27
  "DatePicker/DatetimePicker.tsx",
28
28
  "TimePicker/index.tsx",
29
29
  "ColorPicker/parts.tsx",
30
+ "Icon/index.tsx",
30
31
  ];
31
32
 
32
33
  /** Panels opened from an icon/button trigger, where fit-content is correct. */