@multiplatform.one/forms 7.88.6 → 7.88.7

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 (252) hide show
  1. package/dist/cjs/AdaptivePopup/index.native.js +2 -2
  2. package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
  3. package/dist/cjs/Button/IconButtonGroup.native.js.map +1 -1
  4. package/dist/cjs/Button/circleGlyph.native.js.map +1 -1
  5. package/dist/cjs/Button/iconButtonGroupContext.native.js.map +1 -1
  6. package/dist/cjs/Button/index.cjs +10 -4
  7. package/dist/cjs/Button/index.native.js +12 -6
  8. package/dist/cjs/Button/index.native.js.map +1 -1
  9. package/dist/cjs/Button/webGlass.native.js.map +1 -1
  10. package/dist/cjs/Chip/index.native.js.map +1 -1
  11. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
  12. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  13. package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  14. package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  15. package/dist/cjs/ContextualSaveBar/index.native.js +3 -3
  16. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  17. package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  18. package/dist/cjs/ControlGroup/index.native.js +1 -1
  19. package/dist/cjs/ControlGroup/index.native.js.map +1 -1
  20. package/dist/cjs/DescriptionList/index.native.js +2 -2
  21. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  22. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  23. package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
  24. package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
  25. package/dist/cjs/FieldDisplay/index.native.js +1 -1
  26. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  27. package/dist/cjs/FieldGroup.native.js.map +1 -1
  28. package/dist/cjs/FloatingPanel/PanelHeader.native.js.map +1 -1
  29. package/dist/cjs/FloatingPanel/RegularPanel.native.js.map +1 -1
  30. package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -1
  31. package/dist/cjs/FloatingPanel/containingBlock.native.js.map +1 -1
  32. package/dist/cjs/FloatingPanel/coverRect.native.js.map +1 -1
  33. package/dist/cjs/FloatingPanel/echoContext.native.js.map +1 -1
  34. package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -1
  35. package/dist/cjs/FloatingPanel/paintedBox.native.js.map +1 -1
  36. package/dist/cjs/FloatingPanel/panelWidth.native.js.map +1 -1
  37. package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
  38. package/dist/cjs/FloatingPanel/regularPlacement.native.js.map +1 -1
  39. package/dist/cjs/FloatingPanel/trailingAction.native.js +1 -1
  40. package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -1
  41. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  42. package/dist/cjs/Form/index.native.js +1 -1
  43. package/dist/cjs/Form/index.native.js.map +1 -1
  44. package/dist/cjs/Form/submissionController.native.js.map +1 -1
  45. package/dist/cjs/Form/validateOn.native.js.map +1 -1
  46. package/dist/cjs/FormGrid.native.js.map +1 -1
  47. package/dist/cjs/FormSection.native.js.map +1 -1
  48. package/dist/cjs/InputParts/PasswordReveal.native.js.map +1 -1
  49. package/dist/cjs/InputParts/index.native.js.map +1 -1
  50. package/dist/cjs/InputParts/keyboardAppearance.native.js.map +1 -1
  51. package/dist/cjs/Label/index.native.js.map +1 -1
  52. package/dist/cjs/MediaPicker/base64.native.js.map +1 -1
  53. package/dist/cjs/MediaPicker/payload.native.js.map +1 -1
  54. package/dist/cjs/MediaPicker/types.native.js.map +1 -1
  55. package/dist/cjs/MediaPicker/useMediaPicker.native.js.map +1 -1
  56. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  57. package/dist/cjs/Spinner/SpinnerGlyph.native.js.map +1 -1
  58. package/dist/cjs/Spinner/spinnerSize.native.js.map +1 -1
  59. package/dist/cjs/Table/index.native.js.map +1 -1
  60. package/dist/cjs/Wheel/haptic.native.js.map +1 -1
  61. package/dist/cjs/Wheel/index.native.js.map +1 -1
  62. package/dist/cjs/Wheel/wheelShared.native.js.map +1 -1
  63. package/dist/cjs/actionLabel.native.js.map +1 -1
  64. package/dist/cjs/fieldDefaults.native.js.map +1 -1
  65. package/dist/cjs/fieldLayout.native.js +1 -1
  66. package/dist/cjs/fieldLayout.native.js.map +1 -1
  67. package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
  68. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +1 -1
  69. package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
  70. package/dist/cjs/fields/Barcode/index.native.js +2 -2
  71. package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
  72. package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
  73. package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
  74. package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -1
  75. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  76. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  77. package/dist/cjs/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  78. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  79. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +1 -1
  80. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  81. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  82. package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
  83. package/dist/cjs/fields/ColorPicker/SystemColorField.native.js.map +1 -1
  84. package/dist/cjs/fields/ColorPicker/index.native.js +2 -2
  85. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  86. package/dist/cjs/fields/ColorPicker/parts.native.js +2 -2
  87. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  88. package/dist/cjs/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
  89. package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
  90. package/dist/cjs/fields/Combobox/index.native.js +5 -5
  91. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  92. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  93. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  94. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  95. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +3 -3
  96. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  97. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +2 -2
  98. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
  99. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  100. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  101. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  102. package/dist/cjs/fields/DatePicker/catalog.native.js +2 -2
  103. package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
  104. package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  105. package/dist/cjs/fields/DatePicker/index.native.js +2 -2
  106. package/dist/cjs/fields/DatePicker/parts.native.js +2 -2
  107. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  108. package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
  109. package/dist/cjs/fields/Duration/DurationWheel.native.js +1 -1
  110. package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
  111. package/dist/cjs/fields/Duration/durationWheelTypes.native.js.map +1 -1
  112. package/dist/cjs/fields/Duration/index.native.js +3 -3
  113. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  114. package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  115. package/dist/cjs/fields/FileUpload/index.native.js +2 -2
  116. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  117. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  118. package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  119. package/dist/cjs/fields/Geolocation/geoValue.native.js.map +1 -1
  120. package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -1
  121. package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -1
  122. package/dist/cjs/fields/Geolocation/index.native.js +5 -5
  123. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  124. package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
  125. package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
  126. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  127. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  128. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  129. package/dist/cjs/fields/Icon/index.native.js +3 -3
  130. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  131. package/dist/cjs/fields/ImageField/index.native.js +2 -2
  132. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  133. package/dist/cjs/fields/Input/index.native.js +3 -3
  134. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  135. package/dist/cjs/fields/MentionInput/index.native.js +3 -3
  136. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  137. package/dist/cjs/fields/OTPInput/index.native.js +3 -3
  138. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  139. package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
  140. package/dist/cjs/fields/OTPInput/otpCellEdge.native.js.map +1 -1
  141. package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
  142. package/dist/cjs/fields/PhoneInput/index.native.js +3 -3
  143. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  144. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  145. package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -1
  146. package/dist/cjs/fields/Progress/index.native.js +1 -1
  147. package/dist/cjs/fields/Progress/index.native.js.map +1 -1
  148. package/dist/cjs/fields/RadioGroup/index.native.js +1 -1
  149. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  150. package/dist/cjs/fields/Rating/index.native.js +1 -1
  151. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  152. package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
  153. package/dist/cjs/fields/Rating/types.native.js.map +1 -1
  154. package/dist/cjs/fields/SearchInput/index.native.js +2 -2
  155. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  156. package/dist/cjs/fields/Select/InlineChoices.native.js.map +1 -1
  157. package/dist/cjs/fields/Select/SheetPickerRow.native.js.map +1 -1
  158. package/dist/cjs/fields/Select/index.native.js +4 -4
  159. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  160. package/dist/cjs/fields/Select/shouldInlineChoices.native.js.map +1 -1
  161. package/dist/cjs/fields/Signature/index.native.js +2 -2
  162. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  163. package/dist/cjs/fields/Slider/index.native.js +1 -1
  164. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  165. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  166. package/dist/cjs/fields/Stepper/index.native.js +2 -2
  167. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  168. package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  169. package/dist/cjs/fields/Switch/footprint.native.js.map +1 -1
  170. package/dist/cjs/fields/Switch/index.native.js +2 -2
  171. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  172. package/dist/cjs/fields/TextArea/index.native.js +2 -2
  173. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  174. package/dist/cjs/fields/TimePicker/catalog.native.js +3 -3
  175. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
  176. package/dist/cjs/fields/TimePicker/index.native.js +2 -2
  177. package/dist/cjs/fields/TimePicker/parts.native.js +1 -1
  178. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  179. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  180. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +2 -2
  181. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  182. package/dist/cjs/fields/ToggleGroup/index.native.js +1 -1
  183. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  184. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +1 -1
  185. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  186. package/dist/cjs/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  187. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  188. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
  189. package/dist/cjs/fields/nativeSelect.native.js.map +1 -1
  190. package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
  191. package/dist/cjs/formSpacing.native.js.map +1 -1
  192. package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
  193. package/dist/cjs/index.native.js +45 -45
  194. package/dist/cjs/index.native.js.map +1 -1
  195. package/dist/cjs/keyboard/KeyboardDoneBar.native.js +1 -1
  196. package/dist/cjs/keyboard/chain.native.js.map +1 -1
  197. package/dist/cjs/keyboard/index.native.js.map +1 -1
  198. package/dist/cjs/keyboard/types.native.js.map +1 -1
  199. package/dist/cjs/requiredMarking.native.js.map +1 -1
  200. package/dist/cjs/shared/CheckGlyph.native.js.map +1 -1
  201. package/dist/cjs/shared/TimeColumn.native.js +1 -1
  202. package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
  203. package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
  204. package/dist/cjs/shared/checkedOnField.native.js.map +1 -1
  205. package/dist/cjs/shared/choiceRowPress.native.js.map +1 -1
  206. package/dist/cjs/shared/colorRamps.native.js.map +1 -1
  207. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  208. package/dist/cjs/shared/fieldRowContext.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/Button/index.mjs +10 -4
  240. package/dist/esm/Button/index.mjs.map +1 -1
  241. package/dist/esm/Button/index.native.js +10 -4
  242. package/dist/esm/Button/index.native.js.map +1 -1
  243. package/dist/jsx/Button/index.mjs +10 -4
  244. package/dist/jsx/Button/index.mjs.map +1 -1
  245. package/dist/jsx/Button/index.native.js +10 -4
  246. package/dist/jsx/Button/index.native.js.map +1 -1
  247. package/package.json +8 -8
  248. package/src/Button/Button.accentInk.spec.tsx +4 -2
  249. package/src/Button/Button.outlinedAccentInk.spec.tsx +13 -1
  250. package/src/Button/Button.outlinedInkFlip.spec.tsx +305 -0
  251. package/src/Button/index.tsx +13 -4
  252. package/types/Button/index.d.ts.map +1 -1
@@ -0,0 +1,305 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ *
4
+ * FZ-9608: an outlined solid-palette Button (the `accent` prop or
5
+ * `theme="accent"`) inks its label on the host (MPO-447). That ink was a
6
+ * literal from the scheme current at render: `useAccentOnSurface()` under the
7
+ * default textAccent, `hostScoped()` of `$color11` under low and medium. A
8
+ * flip that moves only the root's t_light/t_dark class, which never
9
+ * re-renders the Button, left the old scheme's ink on the new page.
10
+ *
11
+ * jsdom cascades no Tamagui CSS, so this reads what each node asks for: the
12
+ * atomic class, the injected rule behind it, a `--mp-host-*` alias on the
13
+ * ancestor that declares it, and for a `var(--token)` rule the house theme
14
+ * table of the scope that paints it.
15
+ */
16
+
17
+ import { act, cleanup, render, screen } from "@testing-library/react";
18
+ import {
19
+ createDefaultThemeConfig,
20
+ createThemesBuilder,
21
+ defaultAccentTheme,
22
+ defaultBaseTheme,
23
+ defaultBuilderOptions,
24
+ type Knobs,
25
+ Preset,
26
+ } from "@multiplatform.one/theme";
27
+ import { type ReactElement, type ReactNode, useState } from "react";
28
+ import { TamaguiProvider, YStack } from "tamagui";
29
+ import { afterEach, describe, expect, it } from "vitest";
30
+ import { Button, type ButtonProps } from "./index";
31
+
32
+ afterEach(cleanup);
33
+
34
+ const houseConfig = createDefaultThemeConfig();
35
+ const houseThemes = createThemesBuilder(
36
+ defaultBaseTheme,
37
+ defaultAccentTheme,
38
+ defaultBuilderOptions,
39
+ ).themes() as Record<string, Record<string, string>>;
40
+
41
+ const FLIPS = [
42
+ ["light", "dark"],
43
+ ["dark", "light"],
44
+ ] as const;
45
+ type Scheme = (typeof FLIPS)[number][number];
46
+
47
+ const VARIANTS: { name: string; props: Partial<ButtonProps> }[] = [
48
+ { name: 'theme="accent" outlined', props: { theme: "accent", outlined: true } },
49
+ { name: "accent outlined", props: { accent: true, outlined: true } },
50
+ ];
51
+ const TEXT_ACCENTS = ["low", "medium", "high"] as const;
52
+ const STATES = [
53
+ { name: "enabled", disabled: false },
54
+ { name: "dimWhole disabled", disabled: true },
55
+ ] as const;
56
+
57
+ function injectedRuleValue(className: string, property: string): string {
58
+ for (const sheet of Array.from(document.styleSheets)) {
59
+ for (const rule of Array.from(sheet.cssRules)) {
60
+ if (!(rule instanceof CSSStyleRule)) continue;
61
+ if (!rule.selectorText.endsWith(`.${className}`)) continue;
62
+ const value = rule.style.getPropertyValue(property);
63
+ if (value) return value.trim();
64
+ }
65
+ }
66
+ throw new Error(`no injected ${property} rule for .${className}`);
67
+ }
68
+
69
+ function scopeOf(el: Element): string | null {
70
+ for (let node = el.parentElement; node; node = node.parentElement) {
71
+ const names = Array.from(node.classList)
72
+ .filter((c) => c.startsWith("t_") && c !== "t_sub_theme")
73
+ .map((c) => c.slice(2))
74
+ .filter((c) => c !== "light" && c !== "dark");
75
+ if (names.length) return names.sort((a, b) => b.length - a.length)[0];
76
+ }
77
+ return null;
78
+ }
79
+
80
+ function resolveInScope(value: string, scheme: Scheme, scope: string | null): string {
81
+ const token = value.match(/^var\(--([\w-]+)\)$/)?.[1];
82
+ if (!token) return value;
83
+ const chain: string[] = [];
84
+ if (scope) {
85
+ const parts = scope.split("_");
86
+ for (let i = parts.length; i > 0; i--) chain.push(`${scheme}_${parts.slice(0, i).join("_")}`);
87
+ }
88
+ chain.push(scheme);
89
+ for (const name of chain) {
90
+ const hit = houseThemes[name]?.[token];
91
+ if (hit) return hit;
92
+ }
93
+ throw new Error(`--${token} resolves in none of ${chain.join(", ")}`);
94
+ }
95
+
96
+ function declaredOn(el: Element, property: string): HTMLElement | null {
97
+ for (let node = el.parentElement; node; node = node.parentElement) {
98
+ if (node.style.getPropertyValue(property)) return node;
99
+ }
100
+ return null;
101
+ }
102
+
103
+ /** What `el` paints for one atomic property, or null when it asks for none. */
104
+ function painted(el: Element, prefix: string, property: string, scheme: Scheme): string | null {
105
+ const cls = Array.from(el.classList).find(
106
+ (c) => c.startsWith(prefix) && !/^_[a-z]+-0(hover|active|focus|press)/.test(c),
107
+ );
108
+ if (!cls) return null;
109
+ const value = injectedRuleValue(cls, property);
110
+ const alias = value.match(/^var\((--[\w-]+)\)$/)?.[1];
111
+ const declarer = alias ? declaredOn(el, alias) : null;
112
+ return alias && declarer
113
+ ? resolveInScope(declarer.style.getPropertyValue(alias).trim(), scheme, scopeOf(declarer))
114
+ : resolveInScope(value, scheme, scopeOf(el));
115
+ }
116
+
117
+ function schemeOf(el: Element): Scheme | null {
118
+ for (let node = el.parentElement; node; node = node.parentElement) {
119
+ if (node.classList.contains("t_dark")) return "dark";
120
+ if (node.classList.contains("t_light")) return "light";
121
+ }
122
+ return null;
123
+ }
124
+
125
+ function paintOf(text: string, scheme: Scheme) {
126
+ const label = screen.getByText(text);
127
+ const frame = label.closest("[role=button]") as Element;
128
+ return {
129
+ scheme: schemeOf(frame),
130
+ ink: painted(label, "_col-", "color", scheme),
131
+ frameInk: painted(frame, "_col-", "color", scheme),
132
+ fill: painted(frame, "_bg-", "background-color", scheme),
133
+ border: painted(frame, "_btc-", "border-top-color", scheme),
134
+ };
135
+ }
136
+
137
+ let flipScheme: (scheme: Scheme) => void = () => {};
138
+
139
+ function SchemeRoot({ initial, children }: { initial: Scheme; children: ReactNode }) {
140
+ const [scheme, setScheme] = useState<Scheme>(initial);
141
+ flipScheme = setScheme;
142
+ return (
143
+ <TamaguiProvider config={houseConfig.tamagui} defaultTheme={scheme} disableInjectCSS>
144
+ {children}
145
+ </TamaguiProvider>
146
+ );
147
+ }
148
+
149
+ function swapSchemeClass(from: Scheme, to: Scheme) {
150
+ for (const el of Array.from(document.querySelectorAll(`.t_${from}`))) {
151
+ el.classList.replace(`t_${from}`, `t_${to}`);
152
+ }
153
+ }
154
+
155
+ function onHost(knobs: Partial<Knobs>, button: ReactElement) {
156
+ return (
157
+ <Preset overrides={knobs}>
158
+ <YStack backgroundColor="$background">{button}</YStack>
159
+ </Preset>
160
+ );
161
+ }
162
+
163
+ function expectFlipFollows(from: Scheme, to: Scheme, tree: ReactElement, text: string) {
164
+ render(<SchemeRoot initial={to}>{tree}</SchemeRoot>);
165
+ const fresh = paintOf(text, to);
166
+ cleanup();
167
+ render(<SchemeRoot initial={from}>{tree}</SchemeRoot>);
168
+ swapSchemeClass(from, to);
169
+ try {
170
+ expect(paintOf(text, to)).toEqual(fresh);
171
+ } finally {
172
+ swapSchemeClass(to, from);
173
+ }
174
+ }
175
+
176
+ function expectProviderFlipFollows(from: Scheme, to: Scheme, tree: ReactElement, text: string) {
177
+ render(<SchemeRoot initial={to}>{tree}</SchemeRoot>);
178
+ const fresh = paintOf(text, to);
179
+ cleanup();
180
+ render(<SchemeRoot initial={from}>{tree}</SchemeRoot>);
181
+ act(() => flipScheme(to));
182
+ expect(paintOf(text, to)).toEqual(fresh);
183
+ }
184
+
185
+ describe("FZ-9608 MPO-447: an outlined solid-palette Button's ink follows a scheme flip", () => {
186
+ for (const [from, to] of FLIPS) {
187
+ for (const variant of VARIANTS) {
188
+ for (const textAccent of TEXT_ACCENTS) {
189
+ for (const state of STATES) {
190
+ const tree = onHost(
191
+ { textAccent, disabledStyle: "dimWhole" },
192
+ <Button {...variant.props} disabled={state.disabled}>
193
+ Sign in
194
+ </Button>,
195
+ );
196
+ const label = `${from} -> ${to} ${variant.name} textAccent ${textAccent} ${state.name}`;
197
+
198
+ it(`${label}: a flip that never re-renders it paints what a fresh ${to} mount paints`, () => {
199
+ expectFlipFollows(from, to, tree, "Sign in");
200
+ });
201
+
202
+ it(`${label}: a provider flip paints what a fresh ${to} mount paints`, () => {
203
+ expectProviderFlipFollows(from, to, tree, "Sign in");
204
+ });
205
+ }
206
+ }
207
+ }
208
+ }
209
+ });
210
+
211
+ describe("FZ-9608 MPO-447: the default textAccent inks the label with the host's accentOnSurface", () => {
212
+ for (const [scheme] of FLIPS) {
213
+ for (const variant of VARIANTS) {
214
+ it(`${scheme} ${variant.name}`, () => {
215
+ render(
216
+ <SchemeRoot initial={scheme}>
217
+ {onHost({ textAccent: "high" }, <Button {...variant.props}>Sign in</Button>)}
218
+ </SchemeRoot>,
219
+ );
220
+ const host = houseThemes[scheme]?.accentOnSurface;
221
+ expect(host).toMatch(/^#|^rgb|^hsl/);
222
+ const paint = paintOf("Sign in", scheme);
223
+ expect(paint.ink).toBe(host);
224
+ expect(paint.frameInk).toBe(host);
225
+ });
226
+ }
227
+ }
228
+ });
229
+
230
+ const KNOB_SPACE = {
231
+ fillStyle: ["filled", "outlined"],
232
+ borderRadius: ["none", "small", "medium", "large", "full"],
233
+ borderWidth: ["none", "small", "medium", "large"],
234
+ elevation: ["none", "small", "medium", "large"],
235
+ textAccent: ["low", "medium", "high"],
236
+ disabledStyle: ["keepLabel", "dimWhole"],
237
+ } as const;
238
+
239
+ function knobFuzz(seed: number, count: number): Partial<Knobs>[] {
240
+ let state = seed;
241
+ const next = () => {
242
+ state = (state + 0x6d2b79f5) | 0;
243
+ let t = Math.imul(state ^ (state >>> 15), 1 | state);
244
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
245
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
246
+ };
247
+ return Array.from(
248
+ { length: count },
249
+ () =>
250
+ Object.fromEntries(
251
+ Object.entries(KNOB_SPACE).map(([knob, values]) => [
252
+ knob,
253
+ values[Math.floor(next() * values.length)],
254
+ ]),
255
+ ) as Partial<Knobs>,
256
+ );
257
+ }
258
+
259
+ describe('FZ-9608: seeded knob draws of a theme="accent" Button follow a flip with no re-render', () => {
260
+ for (const knobs of knobFuzz(9608, 3)) {
261
+ for (const [from, to] of FLIPS) {
262
+ for (const state of STATES) {
263
+ it(`${from} -> ${to} ${state.name.split(" ").pop()} ${JSON.stringify(knobs)}`, () => {
264
+ expectFlipFollows(
265
+ from,
266
+ to,
267
+ onHost(
268
+ knobs,
269
+ <Button theme="accent" disabled={state.disabled}>
270
+ Sign in
271
+ </Button>,
272
+ ),
273
+ "Sign in",
274
+ );
275
+ });
276
+ }
277
+ }
278
+ }
279
+ });
280
+
281
+ describe("FZ-9608: a focused outlined solid-palette Button keeps its node and focus", () => {
282
+ for (const variant of VARIANTS) {
283
+ it(`${variant.name}: across a scheme flip and when it turns disabled`, () => {
284
+ const view = (disabled: boolean) => (
285
+ <SchemeRoot initial="light">
286
+ {onHost(
287
+ { disabledStyle: "dimWhole" },
288
+ <Button {...variant.props} disabled={disabled}>
289
+ Go
290
+ </Button>,
291
+ )}
292
+ </SchemeRoot>
293
+ );
294
+ const { rerender } = render(view(false));
295
+ const frame = screen.getByText("Go").closest("[role=button]") as HTMLElement;
296
+ frame.focus();
297
+ act(() => flipScheme("dark"));
298
+ expect(screen.getByText("Go").closest("[role=button]")).toBe(frame);
299
+ expect(document.activeElement).toBe(frame);
300
+ rerender(view(true));
301
+ expect(screen.getByText("Go").closest("[role=button]")).toBe(frame);
302
+ expect(document.activeElement).toBe(frame);
303
+ });
304
+ }
305
+ });
@@ -881,7 +881,11 @@ export function Button({
881
881
  const outlinedOnHost = Boolean(
882
882
  onPage && activeThemeName && solidPaletteThemes.has(activeThemeName),
883
883
  );
884
- const outlinedInk = outlinedOnHost ? hostAccentInk : outlinedIntentInk ? "$color11" : undefined;
884
+ const outlinedInk = outlinedOnHost
885
+ ? hostWash({ color: hostAccentInk }).color
886
+ : outlinedIntentInk
887
+ ? "$color11"
888
+ : undefined;
885
889
 
886
890
  const resolvedRole: ButtonActionRole | undefined =
887
891
  actionRole ?? (accent || confirmPlate ? "primary" : undefined);
@@ -1013,7 +1017,7 @@ export function Button({
1013
1017
  {...(nested ? knobProps.label : { fontSize: recipe.fontSize })}
1014
1018
  {...(textColor
1015
1019
  ? outlinedOnHost
1016
- ? hostScoped({ color: textColor })
1020
+ ? hostWash({ color: textColor })
1017
1021
  : { color: textColor }
1018
1022
  : outlinedInk
1019
1023
  ? { color: outlinedInk }
@@ -1052,7 +1056,7 @@ export function Button({
1052
1056
  plateInk ??
1053
1057
  (textColor
1054
1058
  ? outlinedOnHost
1055
- ? hostScoped({ color: textColor }).color
1059
+ ? hostWash({ color: textColor }).color
1056
1060
  : textColor
1057
1061
  : outlinedInk) ??
1058
1062
  "$color";
@@ -1461,7 +1465,12 @@ export function Button({
1461
1465
  buttonElement
1462
1466
  );
1463
1467
  const hostWashScope = Object.fromEntries(
1464
- [disabledState.surfaceKnobProps, disabledState.textKnobProps]
1468
+ [
1469
+ disabledState.surfaceKnobProps,
1470
+ disabledState.textKnobProps,
1471
+ { color: hostAccentInk },
1472
+ { color: textColor },
1473
+ ]
1465
1474
  .flatMap((fragment) => Object.values(fragment))
1466
1475
  .filter((value): value is string => typeof value === "string" && value.startsWith("$"))
1467
1476
  .map((value) => [hostWashVar(value.slice(1)), `var(--${value.slice(1)})`]),
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Button/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Button/index.tsx"],"names":[],"mappings":"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"}