@astryxdesign/core 0.6.2-canary.bfee8a4 → 0.6.2-canary.c8d5849

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 (261) hide show
  1. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  2. package/dist/Chat/ChatComposerInput.js +2 -2
  3. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  4. package/dist/CheckboxInput/CheckboxInput.js +12 -2
  5. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  6. package/dist/Collapsible/Collapsible.js +6 -1
  7. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  8. package/dist/CommandPalette/CommandPaletteInput.js +1 -1
  9. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  10. package/dist/ComplexSelector/ComplexSelector.js +1 -1
  11. package/dist/DateInput/DateInput.d.ts.map +1 -1
  12. package/dist/DateInput/DateInput.js +4 -4
  13. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  14. package/dist/DateInput/NativeDateField.js +16 -16
  15. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  16. package/dist/DateInput/TouchDateField.js +2 -2
  17. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  18. package/dist/DateRangeInput/DateRangeInput.js +4 -4
  19. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  20. package/dist/DateTimeInput/DateTimeInput.js +8 -8
  21. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  22. package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
  23. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
  24. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
  25. package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
  26. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  27. package/dist/Field/PanelSearchInput.js +1 -1
  28. package/dist/FileInput/FileInput.d.ts.map +1 -1
  29. package/dist/FileInput/FileInput.js +7 -7
  30. package/dist/Kbd/Kbd.d.ts +5 -3
  31. package/dist/Kbd/Kbd.d.ts.map +1 -1
  32. package/dist/Kbd/Kbd.js +36 -42
  33. package/dist/Link/Link.d.ts.map +1 -1
  34. package/dist/Link/Link.js +6 -2
  35. package/dist/Markdown/Markdown.d.ts +8 -2
  36. package/dist/Markdown/Markdown.d.ts.map +1 -1
  37. package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
  38. package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
  39. package/dist/Markdown/Markdown.fr23.bench.js +150 -0
  40. package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
  41. package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
  42. package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
  43. package/dist/Markdown/Markdown.js +262 -109
  44. package/dist/Markdown/ast.d.ts +162 -0
  45. package/dist/Markdown/ast.d.ts.map +1 -0
  46. package/dist/Markdown/ast.js +74 -0
  47. package/dist/Markdown/index.d.ts +5 -3
  48. package/dist/Markdown/index.d.ts.map +1 -1
  49. package/dist/Markdown/index.js +3 -2
  50. package/dist/Markdown/parser/index.d.ts +10 -0
  51. package/dist/Markdown/parser/index.d.ts.map +1 -0
  52. package/dist/Markdown/parser/index.js +10 -0
  53. package/dist/Markdown/parser.d.ts +126 -58
  54. package/dist/Markdown/parser.d.ts.map +1 -1
  55. package/dist/Markdown/parser.js +716 -167
  56. package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
  57. package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
  58. package/dist/Markdown/plugins/frontmatter.js +132 -0
  59. package/dist/Markdown/plugins/index.d.ts +16 -0
  60. package/dist/Markdown/plugins/index.d.ts.map +1 -0
  61. package/dist/Markdown/plugins/index.js +13 -0
  62. package/dist/Markdown/plugins/protocol.d.ts +191 -0
  63. package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
  64. package/dist/Markdown/plugins/protocol.js +957 -0
  65. package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
  66. package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
  67. package/dist/Markdown/plugins/semanticFence.js +213 -0
  68. package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
  69. package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
  70. package/dist/Markdown/plugins/sourceDecoration.js +393 -0
  71. package/dist/Markdown/plugins/textTransform.d.ts +30 -0
  72. package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
  73. package/dist/Markdown/plugins/textTransform.js +374 -0
  74. package/dist/Markdown/remark.d.ts +196 -0
  75. package/dist/Markdown/remark.d.ts.map +1 -0
  76. package/dist/Markdown/remark.js +1062 -0
  77. package/dist/Markdown/url.d.ts +4 -0
  78. package/dist/Markdown/url.d.ts.map +1 -0
  79. package/dist/Markdown/url.js +25 -0
  80. package/dist/Markdown/utils.d.ts +4 -2
  81. package/dist/Markdown/utils.d.ts.map +1 -1
  82. package/dist/Markdown/utils.js +2 -1
  83. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  84. package/dist/NumberInput/NumberInput.js +4 -4
  85. package/dist/Outline/index.d.ts +1 -0
  86. package/dist/Outline/index.d.ts.map +1 -1
  87. package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
  88. package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
  89. package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
  90. package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
  91. package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
  92. package/dist/Outline/useOutlineFromMarkdown.js +8 -3
  93. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  94. package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
  95. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  96. package/dist/ProgressBar/ProgressBar.js +36 -31
  97. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  98. package/dist/RadioList/RadioListItem.js +13 -1
  99. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  100. package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
  101. package/dist/Selector/Selector.d.ts.map +1 -1
  102. package/dist/Selector/Selector.js +1 -1
  103. package/dist/SideNav/SideNav.d.ts +2 -1
  104. package/dist/SideNav/SideNav.d.ts.map +1 -1
  105. package/dist/SideNav/SideNav.js +9 -3
  106. package/dist/Slider/Slider.d.ts.map +1 -1
  107. package/dist/Slider/Slider.js +14 -8
  108. package/dist/Spinner/Spinner.d.ts.map +1 -1
  109. package/dist/Spinner/Spinner.js +23 -7
  110. package/dist/Switch/Switch.d.ts.map +1 -1
  111. package/dist/Switch/Switch.js +11 -0
  112. package/dist/TabList/Tab.d.ts +1 -1
  113. package/dist/TabList/Tab.d.ts.map +1 -1
  114. package/dist/TabList/Tab.js +20 -7
  115. package/dist/Table/Table.d.ts +1 -0
  116. package/dist/Table/Table.d.ts.map +1 -1
  117. package/dist/Table/Table.js +29 -13
  118. package/dist/TextArea/TextArea.d.ts.map +1 -1
  119. package/dist/TextArea/TextArea.js +1 -1
  120. package/dist/TextInput/TextInput.d.ts.map +1 -1
  121. package/dist/TextInput/TextInput.js +2 -2
  122. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  123. package/dist/TimeInput/TimeInput.js +4 -4
  124. package/dist/ToggleButton/ToggleButton.d.ts +2 -1
  125. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  126. package/dist/ToggleButton/ToggleButton.js +7 -1
  127. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  128. package/dist/Typeahead/BaseTypeahead.js +16 -7
  129. package/dist/astryx.css +14 -6
  130. package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
  131. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  132. package/dist/utils/interactionOverlay.stylex.js +9 -0
  133. package/package.json +18 -3
  134. package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
  135. package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
  136. package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
  137. package/src/Button/__tests__/Button.a11y.states.ts +9 -0
  138. package/src/Chat/ChatComposerInput.doc.mjs +3 -3
  139. package/src/Chat/ChatComposerInput.tsx +10 -2
  140. package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
  141. package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
  142. package/src/CheckboxInput/CheckboxInput.tsx +21 -1
  143. package/src/ClickableCard/ClickableCard.test.tsx +102 -5
  144. package/src/Collapsible/Collapsible.doc.mjs +11 -0
  145. package/src/Collapsible/Collapsible.test.tsx +21 -0
  146. package/src/Collapsible/Collapsible.tsx +5 -0
  147. package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
  148. package/src/ComplexSelector/ComplexSelector.tsx +6 -1
  149. package/src/DateInput/DateInput.tsx +6 -1
  150. package/src/DateInput/NativeDateField.tsx +24 -8
  151. package/src/DateInput/TouchDateField.tsx +6 -2
  152. package/src/DateRangeInput/DateRangeInput.tsx +6 -1
  153. package/src/DateTimeInput/DateTimeInput.tsx +6 -1
  154. package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
  155. package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
  156. package/src/Field/PanelSearchInput.tsx +5 -2
  157. package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
  158. package/src/FileInput/FileInput.tsx +11 -2
  159. package/src/Kbd/Kbd.doc.mjs +3 -3
  160. package/src/Kbd/Kbd.test.tsx +57 -1
  161. package/src/Kbd/Kbd.tsx +57 -37
  162. package/src/Layout/LayoutFooter.doc.mjs +17 -0
  163. package/src/Link/Link.doc.mjs +11 -0
  164. package/src/Link/Link.test.tsx +24 -0
  165. package/src/Link/Link.tsx +5 -0
  166. package/src/Markdown/Markdown.doc.mjs +272 -0
  167. package/src/Markdown/Markdown.fr23.bench.ts +174 -0
  168. package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
  169. package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
  170. package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
  171. package/src/Markdown/Markdown.public.test.ts +126 -3
  172. package/src/Markdown/Markdown.spec.md +197 -44
  173. package/src/Markdown/Markdown.test.tsx +11 -0
  174. package/src/Markdown/Markdown.tsx +414 -135
  175. package/src/Markdown/ast.test.ts +307 -0
  176. package/src/Markdown/ast.ts +337 -0
  177. package/src/Markdown/incremental.test.ts +12 -0
  178. package/src/Markdown/index.ts +37 -1
  179. package/src/Markdown/modules/remark.spec.md +269 -0
  180. package/src/Markdown/parser/index.ts +64 -0
  181. package/src/Markdown/parser.public.test.ts +103 -0
  182. package/src/Markdown/parser.ts +1180 -235
  183. package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
  184. package/src/Markdown/plugins/frontmatter.ts +198 -0
  185. package/src/Markdown/plugins/index.ts +53 -0
  186. package/src/Markdown/plugins/protocol.test.tsx +1022 -0
  187. package/src/Markdown/plugins/protocol.ts +1618 -0
  188. package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
  189. package/src/Markdown/plugins/semanticFence.ts +424 -0
  190. package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
  191. package/src/Markdown/plugins/sourceDecoration.ts +539 -0
  192. package/src/Markdown/plugins/textTransform.test.ts +467 -0
  193. package/src/Markdown/plugins/textTransform.ts +554 -0
  194. package/src/Markdown/remark.test.tsx +1877 -0
  195. package/src/Markdown/remark.ts +1574 -0
  196. package/src/Markdown/url.ts +30 -0
  197. package/src/Markdown/utils.ts +13 -1
  198. package/src/MultiSelector/MultiSelector.test.tsx +1 -35
  199. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
  200. package/src/NumberInput/NumberInput.tsx +6 -1
  201. package/src/Outline/Outline.doc.mjs +7 -5
  202. package/src/Outline/Outline.spec.md +1 -1
  203. package/src/Outline/index.ts +1 -0
  204. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
  205. package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
  206. package/src/Outline/useOutlineFromMarkdown.ts +15 -3
  207. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  208. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
  209. package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
  210. package/src/ProgressBar/ProgressBar.test.tsx +29 -11
  211. package/src/ProgressBar/ProgressBar.tsx +59 -72
  212. package/src/RadioList/RadioList.doc.mjs +11 -0
  213. package/src/RadioList/RadioList.test.tsx +32 -0
  214. package/src/RadioList/RadioListItem.tsx +25 -1
  215. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  216. package/src/SegmentedControl/SegmentedControl.test.tsx +31 -0
  217. package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
  218. package/src/Selector/Selector.spec.md +12 -9
  219. package/src/Selector/Selector.tsx +6 -1
  220. package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
  221. package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
  222. package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
  223. package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
  224. package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
  225. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
  226. package/src/SideNav/SideNav.doc.mjs +1 -1
  227. package/src/SideNav/SideNav.test.tsx +10 -0
  228. package/src/SideNav/SideNav.tsx +14 -2
  229. package/src/Slider/Slider.doc.mjs +11 -0
  230. package/src/Slider/Slider.test.tsx +128 -0
  231. package/src/Slider/Slider.tsx +25 -7
  232. package/src/Spinner/Spinner.test.tsx +4 -0
  233. package/src/Spinner/Spinner.tsx +31 -18
  234. package/src/Switch/Switch.doc.mjs +11 -0
  235. package/src/Switch/Switch.test.tsx +16 -0
  236. package/src/Switch/Switch.tsx +28 -0
  237. package/src/TabList/Tab.tsx +35 -7
  238. package/src/TabList/TabList.doc.mjs +11 -0
  239. package/src/TabList/TabList.test.tsx +66 -0
  240. package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
  241. package/src/Table/Table.doc.mjs +1 -1
  242. package/src/Table/Table.spec.md +54 -40
  243. package/src/Table/Table.test.tsx +83 -10
  244. package/src/Table/Table.tsx +30 -22
  245. package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
  246. package/src/TextArea/TextArea.tsx +6 -1
  247. package/src/TextInput/TextInput.test.tsx +20 -1
  248. package/src/TextInput/TextInput.tsx +6 -1
  249. package/src/TimeInput/TimeInput.tsx +6 -1
  250. package/src/ToggleButton/ToggleButton.test.tsx +133 -0
  251. package/src/ToggleButton/ToggleButton.tsx +9 -2
  252. package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
  253. package/src/Tokenizer/Tokenizer.spec.md +142 -75
  254. package/src/TreeList/TreeList.spec.md +123 -75
  255. package/src/Typeahead/BaseTypeahead.spec.md +4 -3
  256. package/src/Typeahead/BaseTypeahead.tsx +21 -7
  257. package/src/Typeahead/Typeahead.test.tsx +53 -0
  258. package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
  259. package/src/__tests__/pressState.ts +93 -0
  260. package/src/inputFontFloor.test.ts +106 -0
  261. package/src/utils/interactionOverlay.stylex.ts +20 -0
@@ -0,0 +1,93 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file pressState.ts
5
+ * @input Uses document.styleSheets (populated by StyleX runtime injection)
6
+ * @output Exports rulesDeclaredFor and expectPressedArm test helpers
7
+ * @position Shared test helper for asserting a control paints a pressed state
8
+ *
9
+ * jsdom does not compute `:active` (there is no real pointer), so a component
10
+ * test asserts the next-best thing: that the StyleX dev runtime injected a
11
+ * rule, keyed to the element's own classes, that paints the design system's
12
+ * pressed overlay token while the control is pressed. The selector shape is
13
+ * deliberately not pinned — a press may be read off the element itself
14
+ * (`.x:active`) or off an ancestor scope marker (`.x:where(.marker:active *)`).
15
+ *
16
+ * SYNC: When modified, update this header.
17
+ */
18
+
19
+ const PRESSED_TOKEN = '--color-overlay-pressed';
20
+
21
+ function walk(list: CSSRuleList, visit: (rule: CSSRule) => void): void {
22
+ for (const rule of Array.from(list)) {
23
+ visit(rule);
24
+ const nested = (rule as CSSGroupingRule).cssRules;
25
+ if (nested != null) {
26
+ walk(nested, visit);
27
+ }
28
+ }
29
+ }
30
+
31
+ /**
32
+ * Every injected style rule (rules nested in `@media` included) whose selector
33
+ * names one of the element's classes, as `selector {declarations}` text.
34
+ */
35
+ export function rulesDeclaredFor(el: Element): string[] {
36
+ const classes = el.className
37
+ .split(/\s+/)
38
+ .filter(Boolean)
39
+ .map(name => `.${name}`);
40
+ const out: string[] = [];
41
+ for (const sheet of Array.from(document.styleSheets)) {
42
+ let rules: CSSRuleList;
43
+ try {
44
+ rules = sheet.cssRules;
45
+ } catch {
46
+ continue;
47
+ }
48
+ walk(rules, rule => {
49
+ if (!(rule instanceof CSSStyleRule)) {
50
+ return;
51
+ }
52
+ const selector = rule.selectorText;
53
+ if (classes.some(cls => selector.startsWith(cls))) {
54
+ out.push(`${selector} {${rule.style.cssText}}`);
55
+ }
56
+ });
57
+ }
58
+ return out;
59
+ }
60
+
61
+ /** The rules on `el` whose selector matches `pseudo` (e.g. `:active`). */
62
+ export function rulesWithSelector(el: Element, pseudo: string): string[] {
63
+ return rulesDeclaredFor(el).filter(rule => {
64
+ const selector = rule.slice(0, rule.indexOf('{'));
65
+ return selector.includes(pseudo);
66
+ });
67
+ }
68
+
69
+ /**
70
+ * Does one of the element's own rules paint the pressed overlay token while
71
+ * `pseudo` matches? `pseudo` defaults to `:active`, the arm a mouse press
72
+ * takes.
73
+ */
74
+ export function hasPressedArm(el: Element, pseudo = ':active'): boolean {
75
+ return rulesWithSelector(el, pseudo).some(rule =>
76
+ rule.includes(PRESSED_TOKEN),
77
+ );
78
+ }
79
+
80
+ /**
81
+ * Does one of the element's own classes paint the pressed overlay token
82
+ * unconditionally — no pseudo-class, no ancestor scope — because the component
83
+ * applies the class while it holds the press itself (a dragged slider thumb)?
84
+ * StyleX's specificity padding (`:not(#\#)`) is not a condition.
85
+ */
86
+ export function declaresPressedOverlay(el: Element): boolean {
87
+ return rulesDeclaredFor(el).some(rule => {
88
+ const selector = rule
89
+ .slice(0, rule.indexOf('{'))
90
+ .replaceAll(':not(#\\#)', '');
91
+ return !selector.includes(':') && rule.includes(PRESSED_TOKEN);
92
+ });
93
+ }
@@ -0,0 +1,106 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file inputFontFloor.test.ts
5
+ * @input Uses node:fs and node:path to read the text-control sources
6
+ * @output Invariants for the 16px input floor shared by every text control
7
+ * @position Family-wide source test, in the source-reading style of
8
+ * reset.test.ts. jsdom's CSSOM drops declarations nested inside @supports,
9
+ * so the iOS branch cannot be asserted against injected rules — the
10
+ * runtime half (no bare coarse-pointer floor) lives in TextInput.test.tsx.
11
+ */
12
+
13
+ import {readFileSync, readdirSync} from 'node:fs';
14
+ import path from 'node:path';
15
+
16
+ import {describe, expect, it} from 'vitest';
17
+
18
+ /**
19
+ * Every control that floors its text to 16px. iOS Safari zooms the page when
20
+ * a focused control renders under 16px; no other coarse-pointer browser does.
21
+ * `-webkit-touch-callout` is implemented by iOS WebKit alone, so each floor
22
+ * nests `@supports (-webkit-touch-callout: none)` inside the coarse-pointer
23
+ * query: iPhones and iPads keep the zoom guard, while Android and touch
24
+ * laptops keep the theme's own type scale instead of an inflated 16px.
25
+ */
26
+ const FLOORED_CONTROLS = [
27
+ 'Chat/ChatComposerInput.tsx',
28
+ 'CommandPalette/CommandPaletteInput.tsx',
29
+ 'ComplexSelector/ComplexSelector.tsx',
30
+ 'DateInput/DateInput.tsx',
31
+ 'DateInput/NativeDateField.tsx',
32
+ 'DateInput/TouchDateField.tsx',
33
+ 'DateRangeInput/DateRangeInput.tsx',
34
+ 'DateTimeInput/DateTimeInput.tsx',
35
+ 'DateTimeInput/TouchDateTimeField.tsx',
36
+ 'DateTimeInput/nativePickerSegmentStyles.ts',
37
+ 'Field/PanelSearchInput.tsx',
38
+ 'FileInput/FileInput.tsx',
39
+ 'NumberInput/NumberInput.tsx',
40
+ 'Selector/Selector.tsx',
41
+ 'TextArea/TextArea.tsx',
42
+ 'TextInput/TextInput.tsx',
43
+ 'TimeInput/TimeInput.tsx',
44
+ 'Typeahead/BaseTypeahead.tsx',
45
+ // The rich-text package carries the same floor; its path is relative to
46
+ // packages/core/src.
47
+ '../../richtext/src/RichTextEditor.tsx',
48
+ ];
49
+
50
+ /** A font floor applied to every coarse pointer, iOS or not. */
51
+ const BARE_COARSE_FLOOR = `'@media (pointer: coarse)': \`max(1rem`;
52
+
53
+ /** The same floor, gated to iOS WebKit inside the coarse-pointer query. */
54
+ const IOS_GATED_FLOOR =
55
+ /'@media \(pointer: coarse\)': \{\s*'@supports \(-webkit-touch-callout: none\)': `max\(1rem, \$\{typeScaleVars\['--text-(?:body|label)-size'\]\}\)`/;
56
+
57
+ /** Collect every non-test component source under `dir`, recursively. */
58
+ function componentSources(dir: string): string[] {
59
+ const SOURCE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'];
60
+ const out: string[] = [];
61
+ for (const entry of readdirSync(dir, {withFileTypes: true})) {
62
+ const full = path.join(dir, entry.name);
63
+ if (entry.isDirectory()) {
64
+ out.push(...componentSources(full));
65
+ } else if (
66
+ SOURCE_EXTENSIONS.some(ext => entry.name.endsWith(ext)) &&
67
+ !entry.name.endsWith('.test.ts') &&
68
+ !entry.name.endsWith('.test.tsx') &&
69
+ !entry.name.endsWith('.doc.mjs')
70
+ ) {
71
+ out.push(full);
72
+ }
73
+ }
74
+ return out;
75
+ }
76
+
77
+ describe('the 16px input floor', () => {
78
+ it('gates every floored text control to iOS alone', () => {
79
+ // Guards the loop below against the list silently emptying out.
80
+ expect(FLOORED_CONTROLS.length).toBeGreaterThanOrEqual(18);
81
+ for (const file of FLOORED_CONTROLS) {
82
+ const source = readFileSync(path.resolve(__dirname, file), 'utf8');
83
+ expect(source, file).toMatch(IOS_GATED_FLOOR);
84
+ expect(source, file).not.toContain(BARE_COARSE_FLOOR);
85
+ }
86
+ });
87
+
88
+ it('leaves no bare coarse-pointer font floor anywhere in core or richtext', () => {
89
+ // Catches a new (or renamed) control reintroducing the ungated floor,
90
+ // wherever it lands — the list above only knows the current family. The
91
+ // rich-text package carries the same floor, so it is scanned too.
92
+ const scanRoots = [
93
+ __dirname,
94
+ path.resolve(__dirname, '../../richtext/src'),
95
+ ];
96
+ const offenders = scanRoots
97
+ .flatMap(root => componentSources(root))
98
+ .map(file => ({
99
+ file,
100
+ source: readFileSync(file, 'utf8'),
101
+ }))
102
+ .filter(({source}) => source.includes(BARE_COARSE_FLOOR))
103
+ .map(({file}) => path.relative(__dirname, file));
104
+ expect(offenders).toEqual([]);
105
+ });
106
+ });
@@ -10,6 +10,11 @@
10
10
  * @output Exports reusable background-color and background-image state styles
11
11
  * @position Internal styling utility for interactive core surfaces
12
12
  *
13
+ * Every surface that paints a press composes one of these (or carries its own
14
+ * `:active` rule), so a change to how the system answers a press is made here
15
+ * once. `pressedBackgroundColor` is the press without the hover, for controls
16
+ * whose hover is a colour or nothing.
17
+ *
13
18
  * Keep the enabled guard outside the individual states. StyleX assigns an
14
19
  * extra priority bucket (and generated selector specificity) to media-nested
15
20
  * rules. Repeating `:active` inside the hover-capable branch gives hover and
@@ -71,4 +76,19 @@ export const interactionOverlayStyles = stylex.create({
71
76
  },
72
77
  },
73
78
  },
79
+ /**
80
+ * The pressed arm alone, for a control whose hover answer is its own — a
81
+ * text link changes colour, a disclosure row has none — so a press paints
82
+ * the system's pressed overlay without adding a hover surface the control
83
+ * never had. Same enabled guard as the paired states above.
84
+ */
85
+ pressedBackgroundColor: {
86
+ backgroundColor: {
87
+ default: null,
88
+ [ENABLED]: {
89
+ default: null,
90
+ ':active': colorVars['--color-overlay-pressed'],
91
+ },
92
+ },
93
+ },
74
94
  });