@multiplatform.one/forms 7.73.0 → 7.74.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 (472) hide show
  1. package/dist/cjs/AdaptivePopup/index.native.js +2 -2
  2. package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
  3. package/dist/cjs/Button/IconButtonGroup.cjs +32 -0
  4. package/dist/cjs/Button/IconButtonGroup.native.js +32 -0
  5. package/dist/cjs/Button/IconButtonGroup.native.js.map +1 -1
  6. package/dist/cjs/Button/circleGlyph.native.js.map +1 -1
  7. package/dist/cjs/Button/glass.cjs +4 -1
  8. package/dist/cjs/Button/iconButtonGroupContext.native.js.map +1 -1
  9. package/dist/cjs/Button/index.cjs +42 -13
  10. package/dist/cjs/Button/index.native.js +52 -17
  11. package/dist/cjs/Button/index.native.js.map +1 -1
  12. package/dist/cjs/Button/mediaPlate.native.js.map +1 -1
  13. package/dist/cjs/Button/webGlass.cjs +62 -0
  14. package/dist/cjs/Button/webGlass.native.js +68 -0
  15. package/dist/cjs/Button/webGlass.native.js.map +1 -0
  16. package/dist/cjs/Chip/index.native.js.map +1 -1
  17. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
  18. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  19. package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  20. package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  21. package/dist/cjs/ContextualSaveBar/index.native.js +3 -3
  22. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  23. package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  24. package/dist/cjs/ControlGroup/index.native.js +1 -1
  25. package/dist/cjs/ControlGroup/index.native.js.map +1 -1
  26. package/dist/cjs/DescriptionList/index.native.js +2 -2
  27. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  28. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  29. package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
  30. package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
  31. package/dist/cjs/FieldDisplay/index.native.js +1 -1
  32. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  33. package/dist/cjs/FieldGroup.native.js.map +1 -1
  34. package/dist/cjs/FloatingPanel/PanelHeader.native.js.map +1 -1
  35. package/dist/cjs/FloatingPanel/RegularPanel.native.js.map +1 -1
  36. package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -1
  37. package/dist/cjs/FloatingPanel/containingBlock.native.js.map +1 -1
  38. package/dist/cjs/FloatingPanel/echoContext.native.js.map +1 -1
  39. package/dist/cjs/FloatingPanel/iconEcho.native.js.map +1 -1
  40. package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -1
  41. package/dist/cjs/FloatingPanel/paintedBox.native.js.map +1 -1
  42. package/dist/cjs/FloatingPanel/panelWidth.native.js.map +1 -1
  43. package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
  44. package/dist/cjs/FloatingPanel/regularPlacement.native.js.map +1 -1
  45. package/dist/cjs/FloatingPanel/trailingAction.native.js +1 -1
  46. package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -1
  47. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  48. package/dist/cjs/Form/index.native.js +1 -1
  49. package/dist/cjs/Form/index.native.js.map +1 -1
  50. package/dist/cjs/Form/submissionController.native.js.map +1 -1
  51. package/dist/cjs/Form/validateOn.native.js.map +1 -1
  52. package/dist/cjs/FormGrid.native.js.map +1 -1
  53. package/dist/cjs/FormSection.native.js.map +1 -1
  54. package/dist/cjs/InputParts/PasswordReveal.native.js.map +1 -1
  55. package/dist/cjs/InputParts/index.native.js.map +1 -1
  56. package/dist/cjs/Label/index.native.js.map +1 -1
  57. package/dist/cjs/MediaPicker/base64.native.js.map +1 -1
  58. package/dist/cjs/MediaPicker/payload.native.js.map +1 -1
  59. package/dist/cjs/MediaPicker/types.native.js.map +1 -1
  60. package/dist/cjs/MediaPicker/useMediaPicker.native.js.map +1 -1
  61. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  62. package/dist/cjs/Spinner/SpinnerGlyph.native.js.map +1 -1
  63. package/dist/cjs/Spinner/spinnerSize.native.js.map +1 -1
  64. package/dist/cjs/Table/index.native.js.map +1 -1
  65. package/dist/cjs/Wheel/haptic.native.js.map +1 -1
  66. package/dist/cjs/Wheel/index.native.js.map +1 -1
  67. package/dist/cjs/Wheel/wheelShared.native.js.map +1 -1
  68. package/dist/cjs/actionLabel.native.js.map +1 -1
  69. package/dist/cjs/fieldDefaults.native.js.map +1 -1
  70. package/dist/cjs/fieldLayout.native.js +1 -1
  71. package/dist/cjs/fieldLayout.native.js.map +1 -1
  72. package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
  73. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +1 -1
  74. package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
  75. package/dist/cjs/fields/Barcode/index.native.js +2 -2
  76. package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
  77. package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
  78. package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
  79. package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -1
  80. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  81. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  82. package/dist/cjs/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  83. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  84. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +1 -1
  85. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  86. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  87. package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
  88. package/dist/cjs/fields/ColorPicker/SystemColorField.native.js.map +1 -1
  89. package/dist/cjs/fields/ColorPicker/index.native.js +2 -2
  90. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  91. package/dist/cjs/fields/ColorPicker/parts.native.js +2 -2
  92. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  93. package/dist/cjs/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
  94. package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
  95. package/dist/cjs/fields/Combobox/index.native.js +5 -5
  96. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  97. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  98. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  99. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  100. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +3 -3
  101. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  102. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +2 -2
  103. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
  104. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  105. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  106. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  107. package/dist/cjs/fields/DatePicker/catalog.native.js +2 -2
  108. package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
  109. package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  110. package/dist/cjs/fields/DatePicker/index.native.js +2 -2
  111. package/dist/cjs/fields/DatePicker/parts.native.js +2 -2
  112. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  113. package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
  114. package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
  115. package/dist/cjs/fields/Duration/index.native.js +3 -3
  116. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  117. package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  118. package/dist/cjs/fields/FileUpload/index.cjs +8 -3
  119. package/dist/cjs/fields/FileUpload/index.native.js +10 -5
  120. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  121. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  122. package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  123. package/dist/cjs/fields/Geolocation/geoValue.native.js.map +1 -1
  124. package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -1
  125. package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -1
  126. package/dist/cjs/fields/Geolocation/index.native.js +5 -5
  127. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  128. package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
  129. package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
  130. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  131. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  132. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  133. package/dist/cjs/fields/Icon/index.native.js +3 -3
  134. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  135. package/dist/cjs/fields/ImageField/index.native.js +2 -2
  136. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  137. package/dist/cjs/fields/Input/index.native.js +3 -3
  138. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  139. package/dist/cjs/fields/MentionInput/index.native.js +3 -3
  140. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  141. package/dist/cjs/fields/OTPInput/index.native.js +3 -3
  142. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  143. package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
  144. package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
  145. package/dist/cjs/fields/PhoneInput/index.native.js +3 -3
  146. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  147. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  148. package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -1
  149. package/dist/cjs/fields/Progress/index.native.js +1 -1
  150. package/dist/cjs/fields/Progress/index.native.js.map +1 -1
  151. package/dist/cjs/fields/RadioGroup/index.native.js +1 -1
  152. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  153. package/dist/cjs/fields/Rating/index.native.js +1 -1
  154. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  155. package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
  156. package/dist/cjs/fields/Rating/types.native.js.map +1 -1
  157. package/dist/cjs/fields/SearchInput/index.native.js +2 -2
  158. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  159. package/dist/cjs/fields/Select/InlineChoices.native.js.map +1 -1
  160. package/dist/cjs/fields/Select/SheetPickerRow.native.js.map +1 -1
  161. package/dist/cjs/fields/Select/index.native.js +4 -4
  162. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  163. package/dist/cjs/fields/Select/shouldInlineChoices.native.js.map +1 -1
  164. package/dist/cjs/fields/Signature/index.native.js +2 -2
  165. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  166. package/dist/cjs/fields/Slider/index.native.js +1 -1
  167. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  168. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  169. package/dist/cjs/fields/Stepper/index.native.js +2 -2
  170. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  171. package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  172. package/dist/cjs/fields/Switch/footprint.native.js.map +1 -1
  173. package/dist/cjs/fields/Switch/index.native.js +2 -2
  174. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  175. package/dist/cjs/fields/TextArea/index.native.js +2 -2
  176. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  177. package/dist/cjs/fields/TimePicker/catalog.native.js +3 -3
  178. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
  179. package/dist/cjs/fields/TimePicker/index.native.js +2 -2
  180. package/dist/cjs/fields/TimePicker/parts.native.js +1 -1
  181. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  182. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  183. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +2 -2
  184. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  185. package/dist/cjs/fields/ToggleGroup/index.native.js +1 -1
  186. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  187. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +1 -1
  188. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  189. package/dist/cjs/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  190. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  191. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
  192. package/dist/cjs/fields/nativeSelect.native.js.map +1 -1
  193. package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
  194. package/dist/cjs/formSpacing.native.js.map +1 -1
  195. package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
  196. package/dist/cjs/index.native.js +45 -45
  197. package/dist/cjs/index.native.js.map +1 -1
  198. package/dist/cjs/keyboard/KeyboardDoneBar.native.js +1 -1
  199. package/dist/cjs/keyboard/chain.native.js.map +1 -1
  200. package/dist/cjs/keyboard/index.native.js.map +1 -1
  201. package/dist/cjs/keyboard/types.native.js.map +1 -1
  202. package/dist/cjs/requiredMarking.native.js.map +1 -1
  203. package/dist/cjs/shared/TimeColumn.native.js +1 -1
  204. package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
  205. package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
  206. package/dist/cjs/shared/choiceRowPress.native.js.map +1 -1
  207. package/dist/cjs/shared/colorRamps.native.js.map +1 -1
  208. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  209. package/dist/cjs/shared/floatingList.native.js +1 -1
  210. package/dist/cjs/shared/floatingList.native.js.map +1 -1
  211. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  212. package/dist/cjs/shared/groupContext.native.js.map +1 -1
  213. package/dist/cjs/shared/i18n.native.js.map +1 -1
  214. package/dist/cjs/shared/instantMotion.native.js.map +1 -1
  215. package/dist/cjs/shared/nativeA11y.native.js.map +1 -1
  216. package/dist/cjs/shared/nativeAutoFocus.native.js.map +1 -1
  217. package/dist/cjs/shared/overlaySizeClass.native.js.map +1 -1
  218. package/dist/cjs/shared/overlayStack.native.js.map +1 -1
  219. package/dist/cjs/shared/panelPortal.native.js.map +1 -1
  220. package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -1
  221. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
  222. package/dist/cjs/shared/restoreRetries.native.js.map +1 -1
  223. package/dist/cjs/shared/sheetNavigation.native.js.map +1 -1
  224. package/dist/cjs/shared/systemControlModules.gnome.native.js.map +1 -1
  225. package/dist/cjs/shared/systemControls.native.js.map +1 -1
  226. package/dist/cjs/shared/t.native.js.map +1 -1
  227. package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
  228. package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
  229. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  230. package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
  231. package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
  232. package/dist/cjs/shared/utils.native.js +1 -1
  233. package/dist/cjs/shared/utils.native.js.map +1 -1
  234. package/dist/cjs/shared/zIndex.native.js.map +1 -1
  235. package/dist/cjs/standardActions.native.js.map +1 -1
  236. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  237. package/dist/cjs/types.native.js.map +1 -1
  238. package/dist/cjs/utils/LinkCell.native.js.map +1 -1
  239. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  240. package/dist/esm/Button/IconButtonGroup.mjs +32 -0
  241. package/dist/esm/Button/IconButtonGroup.mjs.map +1 -1
  242. package/dist/esm/Button/IconButtonGroup.native.js +32 -0
  243. package/dist/esm/Button/IconButtonGroup.native.js.map +1 -1
  244. package/dist/esm/Button/circleGlyph.native.js.map +1 -1
  245. package/dist/esm/Button/glass.mjs +4 -2
  246. package/dist/esm/Button/glass.mjs.map +1 -1
  247. package/dist/esm/Button/iconButtonGroupContext.mjs.map +1 -1
  248. package/dist/esm/Button/iconButtonGroupContext.native.js.map +1 -1
  249. package/dist/esm/Button/index.mjs +43 -15
  250. package/dist/esm/Button/index.mjs.map +1 -1
  251. package/dist/esm/Button/index.native.js +51 -17
  252. package/dist/esm/Button/index.native.js.map +1 -1
  253. package/dist/esm/Button/mediaPlate.native.js.map +1 -1
  254. package/dist/esm/Button/webGlass.mjs +36 -0
  255. package/dist/esm/Button/webGlass.mjs.map +1 -0
  256. package/dist/esm/Button/webGlass.native.js +39 -0
  257. package/dist/esm/Button/webGlass.native.js.map +1 -0
  258. package/dist/esm/Chip/index.native.js.map +1 -1
  259. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  260. package/dist/esm/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  261. package/dist/esm/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  262. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  263. package/dist/esm/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  264. package/dist/esm/ControlGroup/index.native.js.map +1 -1
  265. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  266. package/dist/esm/ErrorSummary.native.js.map +1 -1
  267. package/dist/esm/FieldDisplay/editMode.native.js.map +1 -1
  268. package/dist/esm/FieldDisplay/formatters.native.js.map +1 -1
  269. package/dist/esm/FieldDisplay/index.native.js.map +1 -1
  270. package/dist/esm/FieldGroup.native.js.map +1 -1
  271. package/dist/esm/FloatingPanel/PanelHeader.native.js.map +1 -1
  272. package/dist/esm/FloatingPanel/RegularPanel.native.js.map +1 -1
  273. package/dist/esm/FloatingPanel/compactFace.native.js.map +1 -1
  274. package/dist/esm/FloatingPanel/containingBlock.native.js.map +1 -1
  275. package/dist/esm/FloatingPanel/echoContext.native.js.map +1 -1
  276. package/dist/esm/FloatingPanel/iconEcho.native.js.map +1 -1
  277. package/dist/esm/FloatingPanel/nestedAction.native.js.map +1 -1
  278. package/dist/esm/FloatingPanel/paintedBox.native.js.map +1 -1
  279. package/dist/esm/FloatingPanel/panelWidth.native.js.map +1 -1
  280. package/dist/esm/FloatingPanel/pointAnchor.native.js.map +1 -1
  281. package/dist/esm/FloatingPanel/regularPlacement.native.js.map +1 -1
  282. package/dist/esm/FloatingPanel/trailingAction.native.js.map +1 -1
  283. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  284. package/dist/esm/Form/index.native.js.map +1 -1
  285. package/dist/esm/Form/submissionController.native.js.map +1 -1
  286. package/dist/esm/Form/validateOn.native.js.map +1 -1
  287. package/dist/esm/FormGrid.native.js.map +1 -1
  288. package/dist/esm/FormSection.native.js.map +1 -1
  289. package/dist/esm/InputParts/PasswordReveal.native.js.map +1 -1
  290. package/dist/esm/InputParts/index.native.js.map +1 -1
  291. package/dist/esm/Label/index.native.js.map +1 -1
  292. package/dist/esm/MediaPicker/base64.native.js.map +1 -1
  293. package/dist/esm/MediaPicker/payload.native.js.map +1 -1
  294. package/dist/esm/MediaPicker/types.native.js.map +1 -1
  295. package/dist/esm/MediaPicker/useMediaPicker.native.js.map +1 -1
  296. package/dist/esm/Skeleton/index.native.js.map +1 -1
  297. package/dist/esm/Spinner/SpinnerGlyph.native.js.map +1 -1
  298. package/dist/esm/Spinner/spinnerSize.native.js.map +1 -1
  299. package/dist/esm/Table/index.native.js.map +1 -1
  300. package/dist/esm/Wheel/haptic.native.js.map +1 -1
  301. package/dist/esm/Wheel/index.native.js.map +1 -1
  302. package/dist/esm/Wheel/wheelShared.native.js.map +1 -1
  303. package/dist/esm/actionLabel.native.js.map +1 -1
  304. package/dist/esm/fieldDefaults.native.js.map +1 -1
  305. package/dist/esm/fieldLayout.native.js.map +1 -1
  306. package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
  307. package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
  308. package/dist/esm/fields/Barcode/index.native.js.map +1 -1
  309. package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
  310. package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
  311. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  312. package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  313. package/dist/esm/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  314. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  315. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  316. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  317. package/dist/esm/fields/Checkbox/index.native.js.map +1 -1
  318. package/dist/esm/fields/ColorPicker/SystemColorField.native.js.map +1 -1
  319. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  320. package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
  321. package/dist/esm/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
  322. package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
  323. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  324. package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
  325. package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  326. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  327. package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
  328. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  329. package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -1
  330. package/dist/esm/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  331. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  332. package/dist/esm/fields/DatePicker/utils.native.js.map +1 -1
  333. package/dist/esm/fields/Duration/durationMath.native.js.map +1 -1
  334. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  335. package/dist/esm/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  336. package/dist/esm/fields/FileUpload/index.mjs +8 -3
  337. package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
  338. package/dist/esm/fields/FileUpload/index.native.js +8 -3
  339. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  340. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  341. package/dist/esm/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  342. package/dist/esm/fields/Geolocation/geoValue.native.js.map +1 -1
  343. package/dist/esm/fields/Geolocation/geocoder.native.js.map +1 -1
  344. package/dist/esm/fields/Geolocation/geocoderContext.native.js.map +1 -1
  345. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  346. package/dist/esm/fields/Geolocation/mapMath.native.js.map +1 -1
  347. package/dist/esm/fields/Geolocation/mapTypes.native.js.map +1 -1
  348. package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  349. package/dist/esm/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  350. package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
  351. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  352. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  353. package/dist/esm/fields/Input/index.native.js.map +1 -1
  354. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  355. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  356. package/dist/esm/fields/OTPInput/otpCellCss.native.js.map +1 -1
  357. package/dist/esm/fields/PhoneInput/dialCodes.native.js.map +1 -1
  358. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  359. package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
  360. package/dist/esm/fields/PhoneInput/regionNames.native.js.map +1 -1
  361. package/dist/esm/fields/Progress/index.native.js.map +1 -1
  362. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  363. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  364. package/dist/esm/fields/Rating/ratingMath.native.js.map +1 -1
  365. package/dist/esm/fields/Rating/types.native.js.map +1 -1
  366. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  367. package/dist/esm/fields/Select/InlineChoices.native.js.map +1 -1
  368. package/dist/esm/fields/Select/SheetPickerRow.native.js.map +1 -1
  369. package/dist/esm/fields/Select/index.native.js.map +1 -1
  370. package/dist/esm/fields/Select/shouldInlineChoices.native.js.map +1 -1
  371. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  372. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  373. package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
  374. package/dist/esm/fields/Stepper/index.native.js.map +1 -1
  375. package/dist/esm/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  376. package/dist/esm/fields/Switch/footprint.native.js.map +1 -1
  377. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  378. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  379. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
  380. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  381. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  382. package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
  383. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  384. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  385. package/dist/esm/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  386. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  387. package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
  388. package/dist/esm/fields/nativeSelect.native.js.map +1 -1
  389. package/dist/esm/fields/selectedOrder.native.js.map +1 -1
  390. package/dist/esm/formSpacing.native.js.map +1 -1
  391. package/dist/esm/hooks/useFocusManagement.native.js.map +1 -1
  392. package/dist/esm/index.native.js.map +1 -1
  393. package/dist/esm/keyboard/chain.native.js.map +1 -1
  394. package/dist/esm/keyboard/index.native.js.map +1 -1
  395. package/dist/esm/keyboard/types.native.js.map +1 -1
  396. package/dist/esm/requiredMarking.native.js.map +1 -1
  397. package/dist/esm/shared/TimeColumn.native.js.map +1 -1
  398. package/dist/esm/shared/capabilityPreflight.native.js.map +1 -1
  399. package/dist/esm/shared/choiceRowPress.native.js.map +1 -1
  400. package/dist/esm/shared/colorRamps.native.js.map +1 -1
  401. package/dist/esm/shared/devWarn.native.js.map +1 -1
  402. package/dist/esm/shared/floatingList.native.js.map +1 -1
  403. package/dist/esm/shared/focusManagement.native.js.map +1 -1
  404. package/dist/esm/shared/groupContext.native.js.map +1 -1
  405. package/dist/esm/shared/i18n.native.js.map +1 -1
  406. package/dist/esm/shared/instantMotion.native.js.map +1 -1
  407. package/dist/esm/shared/nativeA11y.native.js.map +1 -1
  408. package/dist/esm/shared/nativeAutoFocus.native.js.map +1 -1
  409. package/dist/esm/shared/overlaySizeClass.native.js.map +1 -1
  410. package/dist/esm/shared/overlayStack.native.js.map +1 -1
  411. package/dist/esm/shared/panelPortal.native.js.map +1 -1
  412. package/dist/esm/shared/pickerTriggerContract.native.js.map +1 -1
  413. package/dist/esm/shared/pressSlopProps.native.js.map +1 -1
  414. package/dist/esm/shared/restoreRetries.native.js.map +1 -1
  415. package/dist/esm/shared/sheetNavigation.native.js.map +1 -1
  416. package/dist/esm/shared/systemControlModules.gnome.native.js.map +1 -1
  417. package/dist/esm/shared/systemControls.native.js.map +1 -1
  418. package/dist/esm/shared/t.native.js.map +1 -1
  419. package/dist/esm/shared/tableCellContext.native.js.map +1 -1
  420. package/dist/esm/shared/useDragScroll.native.js.map +1 -1
  421. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  422. package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
  423. package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
  424. package/dist/esm/shared/utils.native.js.map +1 -1
  425. package/dist/esm/shared/zIndex.native.js.map +1 -1
  426. package/dist/esm/standardActions.native.js.map +1 -1
  427. package/dist/esm/themedPrimitives.native.js.map +1 -1
  428. package/dist/esm/types.native.js.map +1 -1
  429. package/dist/esm/utils/LinkCell.native.js.map +1 -1
  430. package/dist/jsx/Button/IconButtonGroup.mjs +32 -0
  431. package/dist/jsx/Button/IconButtonGroup.mjs.map +1 -1
  432. package/dist/jsx/Button/IconButtonGroup.native.js +32 -0
  433. package/dist/jsx/Button/IconButtonGroup.native.js.map +1 -1
  434. package/dist/jsx/Button/glass.mjs +4 -2
  435. package/dist/jsx/Button/glass.mjs.map +1 -1
  436. package/dist/jsx/Button/iconButtonGroupContext.mjs.map +1 -1
  437. package/dist/jsx/Button/iconButtonGroupContext.native.js.map +1 -1
  438. package/dist/jsx/Button/index.mjs +43 -15
  439. package/dist/jsx/Button/index.mjs.map +1 -1
  440. package/dist/jsx/Button/index.native.js +50 -15
  441. package/dist/jsx/Button/index.native.js.map +1 -1
  442. package/dist/jsx/Button/webGlass.mjs +36 -0
  443. package/dist/jsx/Button/webGlass.mjs.map +1 -0
  444. package/dist/jsx/Button/webGlass.native.js +68 -0
  445. package/dist/jsx/Button/webGlass.native.js.map +1 -0
  446. package/dist/jsx/fields/FileUpload/index.mjs +8 -3
  447. package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
  448. package/dist/jsx/fields/FileUpload/index.native.js +8 -3
  449. package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
  450. package/package.json +8 -8
  451. package/src/Button/Button.accentInk.spec.tsx +39 -8
  452. package/src/Button/Button.iconButton.spec.tsx +143 -3
  453. package/src/Button/Button.stories.tsx +55 -38
  454. package/src/Button/IconButtonGroup.spec.tsx +26 -0
  455. package/src/Button/IconButtonGroup.tsx +39 -0
  456. package/src/Button/glass.spec.ts +73 -0
  457. package/src/Button/glass.ts +8 -3
  458. package/src/Button/iconButtonGroupContext.ts +2 -1
  459. package/src/Button/index.tsx +66 -11
  460. package/src/Button/webGlass.ts +42 -0
  461. package/src/fields/FileUpload/FileUpload.spec.tsx +8 -0
  462. package/src/fields/FileUpload/index.tsx +12 -4
  463. package/types/Button/IconButtonGroup.d.ts.map +1 -1
  464. package/types/Button/glass.d.ts +5 -2
  465. package/types/Button/glass.d.ts.map +1 -1
  466. package/types/Button/iconButtonGroupContext.d.ts +2 -1
  467. package/types/Button/iconButtonGroupContext.d.ts.map +1 -1
  468. package/types/Button/index.d.ts +7 -0
  469. package/types/Button/index.d.ts.map +1 -1
  470. package/types/Button/webGlass.d.ts +32 -0
  471. package/types/Button/webGlass.d.ts.map +1 -0
  472. package/types/fields/FileUpload/index.d.ts.map +1 -1
@@ -5,8 +5,11 @@ import {
5
5
  FOCUS_RING_CLIPPED_OFFSET,
6
6
  FOCUS_RING_MIN_CONTRAST,
7
7
  ensureFocusVisibleRing,
8
+ GlyphTintFallbackProvider,
8
9
  Paragraph,
9
10
  Surface,
11
+ glyphTintFallback,
12
+ type GlyphTintFallback,
10
13
  } from "@multiplatform.one/theme";
11
14
  import { Button as TamaguiButton, XStack, YStack, useTheme } from "tamagui";
12
15
  import {
@@ -539,25 +542,36 @@ export const IconButtons: Story = {
539
542
  // SHC's own code rather than this reproduction.
540
543
  const shcRoundGlyph = { circular: true, chromeless: true, accentInk: true } as const;
541
544
 
545
+ // FZ-8020 r4: the house theme has no hue, so `tint` renders each fallback
546
+ // (ink, the system tint, a house hue) from one build for Clay's compare.
547
+ type TintStory = StoryObj<{ tint: GlyphTintFallback }>;
548
+ const tintArgs: Pick<TintStory, "args" | "argTypes"> = {
549
+ args: { tint: glyphTintFallback },
550
+ argTypes: { tint: { control: "inline-radio", options: ["ink", "system", "accent"] } },
551
+ };
552
+
542
553
  /** Clay's SHC Nodes screen (IMG_1925 on FZ-8020): the add and the copy. */
543
- export const ShcNodesScreen: Story = {
544
- render: () => (
545
- <YStack gap="$4" padding="$4" backgroundColor="$background" data-testid="shc-nodes">
546
- <XStack alignItems="center" gap="$2">
547
- <Paragraph flex={1} size="$9" fontWeight="700">
548
- Nodes
549
- </Paragraph>
550
- <Button size="$3" {...shcRoundGlyph} icon={PlusIcon} aria-label="Add node" />
551
- </XStack>
552
- <XStack alignItems="center" gap="$2">
553
- <Paragraph fontFamily="$mono">shc node join</Paragraph>
554
- <Button size="$2" {...shcRoundGlyph} icon={CopyIcon} aria-label="Copy" />
555
- </XStack>
556
- <XStack alignItems="center">
557
- <Paragraph fontFamily="$mono">shc node join</Paragraph>
558
- <IconButton inline icon={CopyIcon} aria-label="Copy (inline)" />
559
- </XStack>
560
- </YStack>
554
+ export const ShcNodesScreen: TintStory = {
555
+ ...tintArgs,
556
+ render: ({ tint }) => (
557
+ <GlyphTintFallbackProvider value={tint}>
558
+ <YStack gap="$4" padding="$4" backgroundColor="$background" data-testid="shc-nodes">
559
+ <XStack alignItems="center" gap="$2">
560
+ <Paragraph flex={1} size="$9" fontWeight="700">
561
+ Nodes
562
+ </Paragraph>
563
+ <Button size="$3" {...shcRoundGlyph} icon={PlusIcon} aria-label="Add node" />
564
+ </XStack>
565
+ <XStack alignItems="center" gap="$2">
566
+ <Paragraph fontFamily="$mono">shc node join</Paragraph>
567
+ <Button size="$2" {...shcRoundGlyph} icon={CopyIcon} aria-label="Copy" />
568
+ </XStack>
569
+ <XStack alignItems="center">
570
+ <Paragraph fontFamily="$mono">shc node join</Paragraph>
571
+ <IconButton inline icon={CopyIcon} aria-label="Copy (inline)" />
572
+ </XStack>
573
+ </YStack>
574
+ </GlyphTintFallbackProvider>
561
575
  ),
562
576
  };
563
577
 
@@ -568,30 +582,33 @@ const shcUpdatePlate = { circular: true, outlined: true } as const;
568
582
  * Clay's SHC Updates rows (IMG_1926 on FZ-8020): the plate SHC asks for, its
569
583
  * glyph now at the circle ratio, above the bare tinted glyph LC-176 wants.
570
584
  */
571
- export const ShcUpdateRows: Story = {
572
- render: () => (
573
- <YStack gap="$2" padding="$4" backgroundColor="$background" data-testid="shc-update-rows">
574
- {(["$3", "$4"] as const).map((size) => (
575
- <XStack key={size} alignItems="center" gap="$3" minHeight="$5">
585
+ export const ShcUpdateRows: TintStory = {
586
+ ...tintArgs,
587
+ render: ({ tint }) => (
588
+ <GlyphTintFallbackProvider value={tint}>
589
+ <YStack gap="$2" padding="$4" backgroundColor="$background" data-testid="shc-update-rows">
590
+ {(["$3", "$4"] as const).map((size) => (
591
+ <XStack key={size} alignItems="center" gap="$3" minHeight="$5">
592
+ <YStack flex={1}>
593
+ <Paragraph fontWeight="600">pokemon</Paragraph>
594
+ <Paragraph color="$color11">1.2.0+34</Paragraph>
595
+ </YStack>
596
+ <Button
597
+ size={size}
598
+ {...shcUpdatePlate}
599
+ icon={ArrowCircleUpIcon}
600
+ aria-label={`Update pokemon (plate ${size})`}
601
+ />
602
+ </XStack>
603
+ ))}
604
+ <XStack alignItems="center" gap="$3" minHeight="$5">
576
605
  <YStack flex={1}>
577
606
  <Paragraph fontWeight="600">pokemon</Paragraph>
578
607
  <Paragraph color="$color11">1.2.0+34</Paragraph>
579
608
  </YStack>
580
- <Button
581
- size={size}
582
- {...shcUpdatePlate}
583
- icon={ArrowCircleUpIcon}
584
- aria-label={`Update pokemon (plate ${size})`}
585
- />
609
+ <IconButton accentInk icon={ArrowCircleUpIcon} aria-label="Update pokemon" />
586
610
  </XStack>
587
- ))}
588
- <XStack alignItems="center" gap="$3" minHeight="$5">
589
- <YStack flex={1}>
590
- <Paragraph fontWeight="600">pokemon</Paragraph>
591
- <Paragraph color="$color11">1.2.0+34</Paragraph>
592
- </YStack>
593
- <IconButton accentInk icon={ArrowCircleUpIcon} aria-label="Update pokemon" />
594
- </XStack>
595
- </YStack>
611
+ </YStack>
612
+ </GlyphTintFallbackProvider>
596
613
  ),
597
614
  };
@@ -29,10 +29,14 @@ vi.mock("./glass", () => ({
29
29
 
30
30
  afterEach(() => {
31
31
  cleanup();
32
+ vi.unstubAllGlobals();
32
33
  glass.available = false;
33
34
  glass.containerLoads = 0;
34
35
  });
35
36
 
37
+ const IPHONE =
38
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 26_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1";
39
+
36
40
  const houseConfig = createDefaultThemeConfig();
37
41
 
38
42
  function Glyph({ size, weight }: { size?: number; weight?: string }) {
@@ -48,6 +52,28 @@ function houseRender(ui: ReactElement) {
48
52
  }
49
53
 
50
54
  describe("LC-176: IconButtonGroup", () => {
55
+ it("on iOS Safari a bar group is one glass capsule, its buttons bare glyphs on it", () => {
56
+ vi.stubGlobal("navigator", { userAgent: IPHONE, platform: "iPhone", maxTouchPoints: 5 });
57
+ glass.available = true;
58
+ houseRender(
59
+ <Surface bar>
60
+ <IconButtonGroup data-testid="group">
61
+ <IconButton icon={Glyph} aria-label="Archive" />
62
+ <IconButton icon={Glyph} aria-label="Delete" />
63
+ </IconButtonGroup>
64
+ <IconButton icon={Glyph} aria-label="Back" />
65
+ </Surface>,
66
+ );
67
+ const group = screen.getByTestId("group");
68
+ expect(group.getAttribute("data-mp-icon-button-group")).toBe("glass");
69
+ expect(group.querySelectorAll('[data-mp-glass="web"]')).toHaveLength(1);
70
+ expect(group.querySelector("[data-glass]")).toBeNull();
71
+ for (const name of ["Archive", "Delete"])
72
+ expect(screen.getByLabelText(name).getAttribute("data-mp-icon-button")).not.toBe("glass");
73
+ // A lone bar button keeps its own circle.
74
+ expect(screen.getByLabelText("Back").querySelector("[data-glass]")).not.toBeNull();
75
+ });
76
+
51
77
  it("over media, the group is one capsule and its buttons draw their glyphs alone", () => {
52
78
  houseRender(
53
79
  <>
@@ -3,6 +3,7 @@ import { useCallback, useState, type ReactNode } from "react";
3
3
  import { isWeb, Theme, View, XStack, type XStackProps } from "tamagui";
4
4
  import { loadGlassView } from "./glass";
5
5
  import { MEDIA_PLATE_WEB_STYLE } from "./mediaPlate";
6
+ import { isAppleTouchWeb, WebGlassFace } from "./webGlass";
6
7
  import { IconButtonGroupContext, IconButtonGroupRegistry } from "./iconButtonGroupContext";
7
8
 
8
9
  /**
@@ -55,6 +56,44 @@ export function IconButtonGroup({ plate, children, ...rest }: IconButtonGroupPro
55
56
  </IconButtonGroupContext.Provider>
56
57
  );
57
58
  }
59
+ if (bar && isWeb && isAppleTouchWeb()) {
60
+ // The caller's layout props stay on the outer row; the capsule hugs the
61
+ // buttons inside it, so a stretched slot never draws a wide empty pill.
62
+ return (
63
+ <IconButtonGroupRegistry.Provider value={register}>
64
+ <IconButtonGroupContext.Provider value="glass">
65
+ <XStack
66
+ alignItems="center"
67
+ data-mp-icon-button-group={members > 0 ? "glass" : "bar"}
68
+ {...rest}
69
+ >
70
+ <XStack
71
+ alignItems="center"
72
+ position="relative"
73
+ zIndex={0}
74
+ paddingHorizontal="$2"
75
+ gap="$1"
76
+ data-mp-glass-capsule=""
77
+ >
78
+ {members > 0 ? (
79
+ <WebGlassFace
80
+ style={{
81
+ position: "absolute",
82
+ top: 0,
83
+ right: 0,
84
+ bottom: 0,
85
+ left: 0,
86
+ borderRadius: 100000,
87
+ }}
88
+ />
89
+ ) : null}
90
+ {children}
91
+ </XStack>
92
+ </XStack>
93
+ </IconButtonGroupContext.Provider>
94
+ </IconButtonGroupRegistry.Provider>
95
+ );
96
+ }
58
97
  const GlassView = bar ? loadGlassView() : null;
59
98
  const row = (
60
99
  <XStack
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ *
4
+ * LC-176 / LC-266: on the web only iOS Safari takes the glass face (Clay on
5
+ * rv_3bb3f1f65d6b981f).
6
+ */
7
+
8
+ import { createDefaultThemeConfig } from "@multiplatform.one/theme";
9
+ import { cleanup, render } from "@testing-library/react";
10
+ import { createElement } from "react";
11
+ import { TamaguiProvider } from "tamagui";
12
+ import { afterEach, describe, expect, it, vi } from "vitest";
13
+ import { isAppleTouchWeb, loadGlassView } from "./glass";
14
+
15
+ const IPHONE =
16
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 26_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1";
17
+ const MAC_SAFARI =
18
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15";
19
+ const houseConfig = createDefaultThemeConfig();
20
+ const PIXEL =
21
+ "Mozilla/5.0 (Linux; Android 15; Pixel 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Mobile Safari/537.36";
22
+
23
+ describe("isAppleTouchWeb", () => {
24
+ it("an iPhone's Safari takes the glass face", () => {
25
+ expect(isAppleTouchWeb({ userAgent: IPHONE, platform: "iPhone", maxTouchPoints: 5 })).toBe(
26
+ true,
27
+ );
28
+ });
29
+
30
+ it("iPadOS reports a Mac with touch, and is iOS", () => {
31
+ expect(
32
+ isAppleTouchWeb({ userAgent: MAC_SAFARI, platform: "MacIntel", maxTouchPoints: 5 }),
33
+ ).toBe(true);
34
+ });
35
+
36
+ it("a Mac, an Android phone and no navigator draw the bare glyph", () => {
37
+ expect(
38
+ isAppleTouchWeb({ userAgent: MAC_SAFARI, platform: "MacIntel", maxTouchPoints: 0 }),
39
+ ).toBe(false);
40
+ expect(isAppleTouchWeb({ userAgent: PIXEL, platform: "Linux armv8l", maxTouchPoints: 5 })).toBe(
41
+ false,
42
+ );
43
+ expect(isAppleTouchWeb(undefined)).toBe(false);
44
+ });
45
+ });
46
+
47
+ describe("loadGlassView on the web", () => {
48
+ afterEach(() => {
49
+ cleanup();
50
+ vi.unstubAllGlobals();
51
+ });
52
+
53
+ it("iOS Safari's glass circle sits under the glyph it backs", () => {
54
+ vi.stubGlobal("navigator", { userAgent: IPHONE, platform: "iPhone", maxTouchPoints: 5 });
55
+ const Glass = loadGlassView();
56
+ expect(Glass).not.toBeNull();
57
+ const { container } = render(
58
+ createElement(
59
+ TamaguiProvider,
60
+ { config: houseConfig.tamagui, defaultTheme: "light", disableInjectCSS: true },
61
+ createElement(Glass!, { style: { position: "absolute" } }),
62
+ ),
63
+ );
64
+ const face = container.querySelector('[data-mp-glass="web"]') as HTMLElement | null;
65
+ expect(face).not.toBeNull();
66
+ expect(face!.style.zIndex).toBe("-1");
67
+ });
68
+
69
+ it("every other browser draws the bare glyph", () => {
70
+ vi.stubGlobal("navigator", { userAgent: PIXEL, platform: "Linux armv8l", maxTouchPoints: 5 });
71
+ expect(loadGlassView()).toBeNull();
72
+ });
73
+ });
@@ -1,4 +1,5 @@
1
1
  import type { ComponentType, ReactNode } from "react";
2
+ import { isAppleTouchWeb, WebGlassFace } from "./webGlass";
2
3
 
3
4
  /** The slice of expo-glass-effect's `GlassView` an icon button draws. */
4
5
  export type GlassViewComponent = ComponentType<{
@@ -15,13 +16,17 @@ export type GlassContainerComponent = ComponentType<{
15
16
  children?: ReactNode;
16
17
  }>;
17
18
 
19
+ export { isAppleTouchWeb } from "./webGlass";
20
+
18
21
  /**
19
22
  * LC-176: the iOS 26 Liquid Glass material an icon button floats on in a bar.
20
- * Only iOS has it (`glass.native.ts`; the native module is Apple-only, so Android probes null); web, Android and GNOME draw the bare
21
- * tinted glyph.
23
+ * Native iOS draws it from expo-glass-effect (`glass.native.ts`; Android
24
+ * probes null). On the web only iOS Safari takes the glass face (Clay on
25
+ * rv_3bb3f1f65d6b981f: "Is there a way to have the buttons at the bottom be
26
+ * liquid glass if it's an iPhone"); every other browser draws the bare glyph.
22
27
  */
23
28
  export function loadGlassView(): GlassViewComponent | null {
24
- return null;
29
+ return isAppleTouchWeb() ? (WebGlassFace as GlassViewComponent) : null;
25
30
  }
26
31
 
27
32
  /**
@@ -4,7 +4,8 @@ const useIsomorphicLayoutEffect = typeof window === "undefined" ? useEffect : us
4
4
 
5
5
  /**
6
6
  * LC-176: the ground an `IconButtonGroup` paints under its buttons. `media`
7
- * is one shared material capsule and `glass` one shared Liquid Glass capsule,
7
+ * is one shared material capsule and `glass` one shared glass capsule (Liquid
8
+ * Glass on iOS 26, its web twin in iOS Safari),
8
9
  * so a button inside draws its bare glyph instead of its own circle.
9
10
  */
10
11
  export type IconButtonGroupGround = "media" | "glass" | null;
@@ -34,7 +34,7 @@ import {
34
34
  ensureKeyboardModalityTracking,
35
35
  useBarSurface,
36
36
  useElevatedSurface,
37
- useIdentityInkOnSurface,
37
+ useGlyphTintOnSurface,
38
38
  useResolvedKnobs,
39
39
  useTouchSurface,
40
40
  type ControlTier,
@@ -443,22 +443,45 @@ export function iconButtonGlyphPx(rowLinePx: number | undefined): number {
443
443
  /** LC-176: an inline glyph is the text's size; Phosphor's 256 grid pads ~12%. */
444
444
  const INLINE_GLYPH_RATIO = 1.2;
445
445
 
446
+ /**
447
+ * LC-176: Phosphor bold's stem is 0.12 of its ink, an SF Symbols bold plus's
448
+ * 0.18 (measured at 17 and 24pt). An outline stroke this wide, in the 256-unit
449
+ * grid, brings a bold glyph to SF semibold-bold (0.154); a wider one closes
450
+ * Phosphor bold's 16-unit counters (the trash lid, copy's overlap).
451
+ */
452
+ export const GLYPH_BOLD_STROKE_UNITS = 8;
453
+
454
+ function boldStroke(weight: "regular" | "bold", color = "currentColor") {
455
+ return weight === "bold"
456
+ ? {
457
+ stroke: color,
458
+ strokeWidth: GLYPH_BOLD_STROKE_UNITS,
459
+ strokeLinejoin: "round" as const,
460
+ }
461
+ : undefined;
462
+ }
463
+
446
464
  function withGlyphWeight(
447
465
  icon: IconLike | undefined,
448
466
  size: number,
449
467
  weight: "regular" | "bold",
468
+ floor = false,
450
469
  ): IconLike | undefined {
451
470
  if (icon == null || icon === false) return icon;
452
- if (isValidElement<{ size?: number; weight?: string }>(icon)) {
471
+ if (isValidElement<{ size?: number; weight?: string; color?: string }>(icon)) {
472
+ const resolved = (icon.props.weight ?? weight) as "regular" | "bold";
473
+ const own = icon.props.size;
453
474
  return cloneElement(icon, {
454
- ...(icon.props.size == null ? { size } : undefined),
475
+ ...(own == null || (floor && typeof own === "number" && own < size) ? { size } : undefined),
455
476
  ...(icon.props.weight == null ? { weight } : undefined),
477
+ ...boldStroke(resolved, icon.props.color),
456
478
  });
457
479
  }
458
480
  if (typeof icon === "function" || (typeof icon === "object" && "$$typeof" in icon)) {
459
481
  return createElement(icon as ComponentType<{ size?: number; weight?: string }>, {
460
482
  size,
461
483
  weight,
484
+ ...boldStroke(weight),
462
485
  });
463
486
  }
464
487
  return icon;
@@ -568,7 +591,7 @@ export function Button({
568
591
  const parentScopeTheme = useTheme();
569
592
  const pageOutlineColor = parentScopeTheme.outlineColor?.val as string | undefined;
570
593
  const hostAccentInk = useAccentOnSurface();
571
- const hostIdentityInk = useIdentityInkOnSurface();
594
+ const glyphTint = useGlyphTintOnSurface();
572
595
  const grouped = useControlGrouped();
573
596
  // LC-176 ICON-BUTTON: with no label, the button is its glyph. It paints no
574
597
  // plate at rest and takes the bar tint, unless the caller asked for a frame
@@ -693,7 +716,7 @@ export function Button({
693
716
  // Accent and intent buttons, chromeless, and grouped segments keep their
694
717
  // own contracts.
695
718
  const tier: ControlTier | undefined =
696
- activeThemeName || chromeless || grouped
719
+ activeThemeName || chromeless || grouped || mediaPlate
697
720
  ? undefined
698
721
  : barSurface
699
722
  ? "plain"
@@ -806,7 +829,13 @@ export function Button({
806
829
  // The media plate is its own state ground; a toggle over media shows its
807
830
  // state in the glyph.
808
831
  const selectedFill = Boolean(isSelected) && !unavailable && !mediaPlate;
809
- const barInk = accentInk && chromeless && !selectedFill && !unavailable ? hostIdentityInk : null;
832
+ // A glyph alone holds 3:1; beside a label both take the label's AA tint.
833
+ const barInk =
834
+ accentInk && chromeless && !selectedFill && !unavailable
835
+ ? labelled
836
+ ? glyphTint.label
837
+ : glyphTint.glyph
838
+ : null;
810
839
  const inlineGlyph = iconButton && inline === true && !nested;
811
840
  // LC-176: back's caret beside its label is a bar glyph too, and so is the
812
841
  // glyph on a plate (media, or the overlay's confirm).
@@ -824,6 +853,17 @@ export function Button({
824
853
  ? loadGlassView()
825
854
  : null;
826
855
  const framedCircle = iconOnly && Boolean(circular) && !nested && !mediaPlate && !confirmPlate;
856
+ // LC-176: a glyph on a plate takes the plate's on-colour at full strength,
857
+ // never the frame's quieter default: white on the media material, the text
858
+ // colour on a neutral circle.
859
+ const plateInk =
860
+ unavailable || barInk || outlinedInk
861
+ ? undefined
862
+ : mediaPlate || (iconButton && groupGround === "media")
863
+ ? "$color12"
864
+ : framedCircle && !activeThemeName
865
+ ? hostScoped({ color: "$color12" }).color
866
+ : undefined;
827
867
  const framedCirclePx =
828
868
  touch && typeof sizeProp !== "number"
829
869
  ? Math.max(sizeTokenPx(resolvedSize), MIN_PRESS_TARGET)
@@ -837,13 +877,22 @@ export function Button({
837
877
  : barGlyph
838
878
  ? touch
839
879
  ? Math.max(glyphFloor, resolveButtonSizeRecipe("$6", recipeFamily, touch).iconSize)
840
- : // A pointer toolbar keeps its token box (LC-54); the glyph fills it
841
- // up to the same floor.
842
- Math.max(recipe.iconSize, Math.min(glyphFloor, recipe.height - 8))
880
+ : iconButton
881
+ ? // A bare glyph has no plate to inset from, so it takes its box
882
+ // less a 2pt optical margin, up to the row's glyph: the SHC
883
+ // "+" at $3 reaches the bar's glyph, a $2 copy beside mono
884
+ // text stays in proportion.
885
+ Math.max(recipe.iconSize, Math.min(glyphFloor, recipe.height - 4))
886
+ : // A pointer toolbar keeps its token box (LC-54); the glyph fills
887
+ // it up to the same floor.
888
+ Math.max(recipe.iconSize, Math.min(glyphFloor, recipe.height - 8))
843
889
  : recipe.iconSize;
890
+ // LC-176: a bar glyph is never smaller than its row, whatever px the caller
891
+ // passed (the DataTable toolbar's 14pt token icons).
892
+ const barGlyphFloor = barGlyph && !framedCircle && !inlineGlyph && !nested;
844
893
  const glyph =
845
894
  barGlyph || inlineGlyph || framedCircle
846
- ? withGlyphWeight(icon, iconSize, resolvedGlyphWeight)
895
+ ? withGlyphWeight(icon, iconSize, resolvedGlyphWeight, barGlyphFloor)
847
896
  : icon;
848
897
 
849
898
  // LC-158: the frame keeps its recipe height under Dynamic Type, so the
@@ -908,6 +957,7 @@ export function Button({
908
957
  props.color ??
909
958
  (unavailable ? disabledText.color : undefined) ??
910
959
  barInk ??
960
+ plateInk ??
911
961
  (textColor
912
962
  ? outlinedOnHost
913
963
  ? hostScoped({ color: textColor }).color
@@ -929,7 +979,7 @@ export function Button({
929
979
  ) : null;
930
980
  const glyphAfter =
931
981
  iconAfter && (barGlyph || inlineGlyph || framedCircle)
932
- ? withGlyphWeight(iconAfter, iconSize, resolvedGlyphWeight)
982
+ ? withGlyphWeight(iconAfter, iconSize, resolvedGlyphWeight, barGlyphFloor)
933
983
  : iconAfter;
934
984
  const iconAfterElement = glyphAfter ? (
935
985
  <View flexShrink={0}>
@@ -1094,6 +1144,10 @@ export function Button({
1094
1144
  {...(inlineGlyph ? { marginInlineStart: "$2" as const } : undefined)}
1095
1145
  // The glass rounds itself, unclipped.
1096
1146
  {...(GlassView ? { borderRadius: 100000 } : undefined)}
1147
+ // On the web the absolute glass circle needs its button as the
1148
+ // containing block and stacking context, or it fills the page and
1149
+ // paints over the glyph.
1150
+ {...(GlassView && isWeb ? { position: "relative" as const, zIndex: 0 } : undefined)}
1097
1151
  {...(confirmPlate ? { borderRadius: 100000 } : undefined)}
1098
1152
  {...(mediaPlate
1099
1153
  ? {
@@ -1113,6 +1167,7 @@ export function Button({
1113
1167
  // text/icon color (currentColor) to the hue's readable text tier.
1114
1168
  {...(outlinedInk ? { color: outlinedInk } : undefined)}
1115
1169
  {...(barInk ? { color: barInk } : undefined)}
1170
+ {...(plateInk ? { color: plateInk } : undefined)}
1116
1171
  // LC-40 DISABLED-VISIBLE: keepLabel washes the chrome (muted fill/
1117
1172
  // border) while label/glyphs re-anchor to the lowest AA text tier
1118
1173
  // (`color` inherits into currentColor icons); dimWhole dims the
@@ -0,0 +1,42 @@
1
+ import { isDarkThemeName } from "@multiplatform.one/theme";
2
+ import { createElement } from "react";
3
+ import { useThemeName, YStack } from "tamagui";
4
+ import { MEDIA_PLATE_WEB_STYLE } from "./mediaPlate";
5
+
6
+ type GlassNavigator = { userAgent?: string; platform?: string; maxTouchPoints?: number };
7
+
8
+ /**
9
+ * LC-266: iOS Safari, iPadOS included (it reports itself as a Mac with a
10
+ * touch screen). The one place web asks which platform it is on, so an iPhone
11
+ * user gets the iPhone's bar buttons in the browser too.
12
+ */
13
+ export function isAppleTouchWeb(
14
+ nav: GlassNavigator | undefined = typeof navigator === "undefined" ? undefined : navigator,
15
+ ): boolean {
16
+ if (!nav) return false;
17
+ if (/iPhone|iPad|iPod/.test(nav.userAgent ?? "")) return true;
18
+ return /Mac/.test(nav.platform ?? nav.userAgent ?? "") && (nav.maxTouchPoints ?? 0) > 1;
19
+ }
20
+
21
+ const webGlassMarker = { "data-mp-glass": "web" };
22
+
23
+ /**
24
+ * LC-176: the Liquid Glass face iOS Safari draws under a bar's icon buttons,
25
+ * one circle for a lone button or one capsule for an `IconButtonGroup`. It is
26
+ * a layer under the glyphs (absolute, z -1 in the button's stacking context):
27
+ * a near-white material in light and a raised grey in dark, edged by a soft
28
+ * drop shadow alone, with the media plate's blur.
29
+ */
30
+ export function WebGlassFace({ style }: { style?: unknown }) {
31
+ const dark = isDarkThemeName(useThemeName());
32
+ return createElement(YStack, {
33
+ pointerEvents: "none",
34
+ backgroundColor: dark ? "$color4" : "$color1",
35
+ opacity: 0.92,
36
+ shadowColor: "$shadowColor",
37
+ shadowRadius: 10,
38
+ shadowOffset: { width: 0, height: 3 },
39
+ ...webGlassMarker,
40
+ style: { ...(style as object), zIndex: -1, ...MEDIA_PLATE_WEB_STYLE },
41
+ });
42
+ }
@@ -80,6 +80,14 @@ describe("FileUpload", () => {
80
80
  expect(result.container.textContent).not.toContain("Choose File");
81
81
  expect(result.container.textContent).not.toContain("Drag a file");
82
82
  expect(result.container.querySelector('[data-file-upload="preview"] img')).toBeTruthy();
83
+ // FZ-8020 r4: the capsule floats inside the visible tile's top-trailing
84
+ // corner, as Photos does, never over empty dropzone.
85
+ const tile = result.container.querySelector('[data-file-upload="preview-tile"]');
86
+ expect(tile?.querySelector("img")).toBeTruthy();
87
+ expect(tile?.contains(actions!)).toBe(true);
88
+ // Round 4's critique: a $color3 tile read 1.06:1 on the page in dark, so
89
+ // the corner the capsule anchors to was invisible.
90
+ expect(tile?.className).toMatch(/_bg-color5/);
83
91
  fireEvent.click(result.getButton("Remove sprite.png")!);
84
92
  expect(remove).toHaveBeenCalledTimes(1);
85
93
  });
@@ -1065,13 +1065,21 @@ export function FileUpload<
1065
1065
  width="100%"
1066
1066
  >
1067
1067
  {singlePreview ? (
1068
- <YStack position="relative" maxWidth="100%">
1068
+ <YStack
1069
+ data-file-upload="preview-tile"
1070
+ position="relative"
1071
+ width="$14"
1072
+ height="$14"
1073
+ maxWidth="100%"
1074
+ borderRadius={cappedRadius}
1075
+ overflow="hidden"
1076
+ backgroundColor="$color5"
1077
+ >
1069
1078
  <Image
1070
1079
  src={singlePreview}
1071
1080
  alt={singleFile?.name ?? existingName}
1072
- width="$14"
1073
- height="$14"
1074
- maxWidth="100%"
1081
+ width="100%"
1082
+ height="100%"
1075
1083
  objectFit="contain"
1076
1084
  onLoad={(event) => {
1077
1085
  if (!isWeb) return;
@@ -1 +1 @@
1
- {"version":3,"file":"IconButtonGroup.d.ts","sourceRoot":"","sources":["../../src/Button/IconButtonGroup.tsx"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,EAA8B,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAKvE;;;GAGG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IACvD,oEAAoE;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,oBAAoB,2CAoEjF"}
1
+ {"version":3,"file":"IconButtonGroup.d.ts","sourceRoot":"","sources":["../../src/Button/IconButtonGroup.tsx"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,EAA8B,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAMvE;;;GAGG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IACvD,oEAAoE;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,oBAAoB,2CA0GjF"}
@@ -12,10 +12,13 @@ export type GlassContainerComponent = ComponentType<{
12
12
  style?: unknown;
13
13
  children?: ReactNode;
14
14
  }>;
15
+ export { isAppleTouchWeb } from "./webGlass";
15
16
  /**
16
17
  * LC-176: the iOS 26 Liquid Glass material an icon button floats on in a bar.
17
- * Only iOS has it (`glass.native.ts`; the native module is Apple-only, so Android probes null); web, Android and GNOME draw the bare
18
- * tinted glyph.
18
+ * Native iOS draws it from expo-glass-effect (`glass.native.ts`; Android
19
+ * probes null). On the web only iOS Safari takes the glass face (Clay on
20
+ * rv_3bb3f1f65d6b981f: "Is there a way to have the buttons at the bottom be
21
+ * liquid glass if it's an iPhone"); every other browser draws the bare glyph.
19
22
  */
20
23
  export declare function loadGlassView(): GlassViewComponent | null;
21
24
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"glass.d.ts","sourceRoot":"","sources":["../../src/Button/glass.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,yEAAyE;AACzE,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;CAC3D,CAAC,CAAC;AAEH,oFAAoF;AACpF,MAAM,MAAM,uBAAuB,GAAG,aAAa,CAAC;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,kBAAkB,GAAG,IAAI,CAEzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,uBAAuB,GAAG,IAAI,CAEnE"}
1
+ {"version":3,"file":"glass.d.ts","sourceRoot":"","sources":["../../src/Button/glass.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGtD,yEAAyE;AACzE,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;CAC3D,CAAC,CAAC;AAEH,oFAAoF;AACpF,MAAM,MAAM,uBAAuB,GAAG,aAAa,CAAC;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,kBAAkB,GAAG,IAAI,CAEzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,uBAAuB,GAAG,IAAI,CAEnE"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * LC-176: the ground an `IconButtonGroup` paints under its buttons. `media`
3
- * is one shared material capsule and `glass` one shared Liquid Glass capsule,
3
+ * is one shared material capsule and `glass` one shared glass capsule (Liquid
4
+ * Glass on iOS 26, its web twin in iOS Safari),
4
5
  * so a button inside draws its bare glyph instead of its own circle.
5
6
  */
6
7
  export type IconButtonGroupGround = "media" | "glass" | null;
@@ -1 +1 @@
1
- {"version":3,"file":"iconButtonGroupContext.d.ts","sourceRoot":"","sources":["../../src/Button/iconButtonGroupContext.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;AAE7D,eAAO,MAAM,sBAAsB,gDAA6C,CAAC;AAEjF,wBAAgB,wBAAwB,IAAI,qBAAqB,CAEhE;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,iCAAwB,MAAM,IAAI,SAAe,CAAC;AAEtF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAMhE"}
1
+ {"version":3,"file":"iconButtonGroupContext.d.ts","sourceRoot":"","sources":["../../src/Button/iconButtonGroupContext.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;AAE7D,eAAO,MAAM,sBAAsB,gDAA6C,CAAC;AAEjF,wBAAgB,wBAAwB,IAAI,qBAAqB,CAEhE;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,iCAAwB,MAAM,IAAI,SAAe,CAAC;AAEtF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAMhE"}
@@ -173,6 +173,13 @@ export declare const ICON_BUTTON_NEUTRAL_GLYPH_PX = 24;
173
173
  * target.
174
174
  */
175
175
  export declare function iconButtonGlyphPx(rowLinePx: number | undefined): number;
176
+ /**
177
+ * LC-176: Phosphor bold's stem is 0.12 of its ink, an SF Symbols bold plus's
178
+ * 0.18 (measured at 17 and 24pt). An outline stroke this wide, in the 256-unit
179
+ * grid, brings a bold glyph to SF semibold-bold (0.154); a wider one closes
180
+ * Phosphor bold's 16-unit counters (the trash lid, copy's overlap).
181
+ */
182
+ export declare const GLYPH_BOLD_STROKE_UNITS = 8;
176
183
  export declare function Button({ children, action, form: formProp, loading, accent, error, warning, success, skeleton, outlined, disabled, theme, onPress, onKeyDown, tabIndex, icon, iconAfter, selected, nested, circular: circularProp, chromeless, edge, accentInk, plate, inline, glyphWeight, verb, noun, actionRole, disabledReason, disabledReasonPlacement, sizeRecipeEscape, recipeFamily, height: heightProp, paddingHorizontal: paddingHorizontalProp, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
177
184
  export declare namespace Button {
178
185
  var Icon: (props: {