@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.
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +12 -2
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +6 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +1 -1
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +4 -4
- package/dist/DateInput/NativeDateField.d.ts.map +1 -1
- package/dist/DateInput/NativeDateField.js +16 -16
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +2 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +4 -4
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +8 -8
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
- package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
- package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
- package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +1 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +7 -7
- package/dist/Kbd/Kbd.d.ts +5 -3
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +36 -42
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +6 -2
- package/dist/Markdown/Markdown.d.ts +8 -2
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
- package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
- package/dist/Markdown/Markdown.fr23.bench.js +150 -0
- package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
- package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
- package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
- package/dist/Markdown/Markdown.js +262 -109
- package/dist/Markdown/ast.d.ts +162 -0
- package/dist/Markdown/ast.d.ts.map +1 -0
- package/dist/Markdown/ast.js +74 -0
- package/dist/Markdown/index.d.ts +5 -3
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/index.js +3 -2
- package/dist/Markdown/parser/index.d.ts +10 -0
- package/dist/Markdown/parser/index.d.ts.map +1 -0
- package/dist/Markdown/parser/index.js +10 -0
- package/dist/Markdown/parser.d.ts +126 -58
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +716 -167
- package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
- package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
- package/dist/Markdown/plugins/frontmatter.js +132 -0
- package/dist/Markdown/plugins/index.d.ts +16 -0
- package/dist/Markdown/plugins/index.d.ts.map +1 -0
- package/dist/Markdown/plugins/index.js +13 -0
- package/dist/Markdown/plugins/protocol.d.ts +191 -0
- package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
- package/dist/Markdown/plugins/protocol.js +957 -0
- package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
- package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
- package/dist/Markdown/plugins/semanticFence.js +213 -0
- package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
- package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
- package/dist/Markdown/plugins/sourceDecoration.js +393 -0
- package/dist/Markdown/plugins/textTransform.d.ts +30 -0
- package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
- package/dist/Markdown/plugins/textTransform.js +374 -0
- package/dist/Markdown/remark.d.ts +196 -0
- package/dist/Markdown/remark.d.ts.map +1 -0
- package/dist/Markdown/remark.js +1062 -0
- package/dist/Markdown/url.d.ts +4 -0
- package/dist/Markdown/url.d.ts.map +1 -0
- package/dist/Markdown/url.js +25 -0
- package/dist/Markdown/utils.d.ts +4 -2
- package/dist/Markdown/utils.d.ts.map +1 -1
- package/dist/Markdown/utils.js +2 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +4 -4
- package/dist/Outline/index.d.ts +1 -0
- package/dist/Outline/index.d.ts.map +1 -1
- package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
- package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
- package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
- package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/useOutlineFromMarkdown.js +8 -3
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +36 -31
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +13 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +1 -1
- package/dist/SideNav/SideNav.d.ts +2 -1
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +9 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +14 -8
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +23 -7
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +11 -0
- package/dist/TabList/Tab.d.ts +1 -1
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +20 -7
- package/dist/Table/Table.d.ts +1 -0
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +29 -13
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +1 -1
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +2 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +4 -4
- package/dist/ToggleButton/ToggleButton.d.ts +2 -1
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +7 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +16 -7
- package/dist/astryx.css +14 -6
- package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +9 -0
- package/package.json +18 -3
- package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
- package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
- package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
- package/src/Button/__tests__/Button.a11y.states.ts +9 -0
- package/src/Chat/ChatComposerInput.doc.mjs +3 -3
- package/src/Chat/ChatComposerInput.tsx +10 -2
- package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
- package/src/CheckboxInput/CheckboxInput.tsx +21 -1
- package/src/ClickableCard/ClickableCard.test.tsx +102 -5
- package/src/Collapsible/Collapsible.doc.mjs +11 -0
- package/src/Collapsible/Collapsible.test.tsx +21 -0
- package/src/Collapsible/Collapsible.tsx +5 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
- package/src/ComplexSelector/ComplexSelector.tsx +6 -1
- package/src/DateInput/DateInput.tsx +6 -1
- package/src/DateInput/NativeDateField.tsx +24 -8
- package/src/DateInput/TouchDateField.tsx +6 -2
- package/src/DateRangeInput/DateRangeInput.tsx +6 -1
- package/src/DateTimeInput/DateTimeInput.tsx +6 -1
- package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
- package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
- package/src/Field/PanelSearchInput.tsx +5 -2
- package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
- package/src/FileInput/FileInput.tsx +11 -2
- package/src/Kbd/Kbd.doc.mjs +3 -3
- package/src/Kbd/Kbd.test.tsx +57 -1
- package/src/Kbd/Kbd.tsx +57 -37
- package/src/Layout/LayoutFooter.doc.mjs +17 -0
- package/src/Link/Link.doc.mjs +11 -0
- package/src/Link/Link.test.tsx +24 -0
- package/src/Link/Link.tsx +5 -0
- package/src/Markdown/Markdown.doc.mjs +272 -0
- package/src/Markdown/Markdown.fr23.bench.ts +174 -0
- package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
- package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
- package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
- package/src/Markdown/Markdown.public.test.ts +126 -3
- package/src/Markdown/Markdown.spec.md +197 -44
- package/src/Markdown/Markdown.test.tsx +11 -0
- package/src/Markdown/Markdown.tsx +414 -135
- package/src/Markdown/ast.test.ts +307 -0
- package/src/Markdown/ast.ts +337 -0
- package/src/Markdown/incremental.test.ts +12 -0
- package/src/Markdown/index.ts +37 -1
- package/src/Markdown/modules/remark.spec.md +269 -0
- package/src/Markdown/parser/index.ts +64 -0
- package/src/Markdown/parser.public.test.ts +103 -0
- package/src/Markdown/parser.ts +1180 -235
- package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
- package/src/Markdown/plugins/frontmatter.ts +198 -0
- package/src/Markdown/plugins/index.ts +53 -0
- package/src/Markdown/plugins/protocol.test.tsx +1022 -0
- package/src/Markdown/plugins/protocol.ts +1618 -0
- package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
- package/src/Markdown/plugins/semanticFence.ts +424 -0
- package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
- package/src/Markdown/plugins/sourceDecoration.ts +539 -0
- package/src/Markdown/plugins/textTransform.test.ts +467 -0
- package/src/Markdown/plugins/textTransform.ts +554 -0
- package/src/Markdown/remark.test.tsx +1877 -0
- package/src/Markdown/remark.ts +1574 -0
- package/src/Markdown/url.ts +30 -0
- package/src/Markdown/utils.ts +13 -1
- package/src/MultiSelector/MultiSelector.test.tsx +1 -35
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
- package/src/NumberInput/NumberInput.tsx +6 -1
- package/src/Outline/Outline.doc.mjs +7 -5
- package/src/Outline/Outline.spec.md +1 -1
- package/src/Outline/index.ts +1 -0
- package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
- package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
- package/src/Outline/useOutlineFromMarkdown.ts +15 -3
- package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
- package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
- package/src/ProgressBar/ProgressBar.test.tsx +29 -11
- package/src/ProgressBar/ProgressBar.tsx +59 -72
- package/src/RadioList/RadioList.doc.mjs +11 -0
- package/src/RadioList/RadioList.test.tsx +32 -0
- package/src/RadioList/RadioListItem.tsx +25 -1
- package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
- package/src/SegmentedControl/SegmentedControl.test.tsx +31 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
- package/src/Selector/Selector.spec.md +12 -9
- package/src/Selector/Selector.tsx +6 -1
- package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
- package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
- package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
- package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
- package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
- package/src/SideNav/SideNav.doc.mjs +1 -1
- package/src/SideNav/SideNav.test.tsx +10 -0
- package/src/SideNav/SideNav.tsx +14 -2
- package/src/Slider/Slider.doc.mjs +11 -0
- package/src/Slider/Slider.test.tsx +128 -0
- package/src/Slider/Slider.tsx +25 -7
- package/src/Spinner/Spinner.test.tsx +4 -0
- package/src/Spinner/Spinner.tsx +31 -18
- package/src/Switch/Switch.doc.mjs +11 -0
- package/src/Switch/Switch.test.tsx +16 -0
- package/src/Switch/Switch.tsx +28 -0
- package/src/TabList/Tab.tsx +35 -7
- package/src/TabList/TabList.doc.mjs +11 -0
- package/src/TabList/TabList.test.tsx +66 -0
- package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
- package/src/Table/Table.doc.mjs +1 -1
- package/src/Table/Table.spec.md +54 -40
- package/src/Table/Table.test.tsx +83 -10
- package/src/Table/Table.tsx +30 -22
- package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
- package/src/TextArea/TextArea.tsx +6 -1
- package/src/TextInput/TextInput.test.tsx +20 -1
- package/src/TextInput/TextInput.tsx +6 -1
- package/src/TimeInput/TimeInput.tsx +6 -1
- package/src/ToggleButton/ToggleButton.test.tsx +133 -0
- package/src/ToggleButton/ToggleButton.tsx +9 -2
- package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
- package/src/Tokenizer/Tokenizer.spec.md +142 -75
- package/src/TreeList/TreeList.spec.md +123 -75
- package/src/Typeahead/BaseTypeahead.spec.md +4 -3
- package/src/Typeahead/BaseTypeahead.tsx +21 -7
- package/src/Typeahead/Typeahead.test.tsx +53 -0
- package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
- package/src/__tests__/pressState.ts +93 -0
- package/src/inputFontFloor.test.ts +106 -0
- 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
|
});
|