cursedbelt 5.68.0 → 5.69.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 (115) hide show
  1. package/dist/looks.css +41 -0
  2. package/dist/react/components/ActionBar.d.ts.map +1 -1
  3. package/dist/react/components/ActionBar.js +9 -1
  4. package/dist/react/components/ActionBar.js.map +1 -1
  5. package/dist/react/components/DataTable/DataTable.d.ts.map +1 -1
  6. package/dist/react/components/DataTable/DataTable.js +3 -3
  7. package/dist/react/components/DataTable/DataTable.js.map +1 -1
  8. package/dist/react/components/Grid.d.ts.map +1 -1
  9. package/dist/react/components/Grid.js +4 -2
  10. package/dist/react/components/Grid.js.map +1 -1
  11. package/dist/react/components/ScrollArea.d.ts +1 -1
  12. package/dist/react/components/ScrollArea.js +1 -1
  13. package/dist/react/components/SecretInput.d.ts.map +1 -1
  14. package/dist/react/components/SecretInput.js +8 -2
  15. package/dist/react/components/SecretInput.js.map +1 -1
  16. package/dist/react/components/SegmentedControl.d.ts.map +1 -1
  17. package/dist/react/components/SegmentedControl.js +5 -1
  18. package/dist/react/components/SegmentedControl.js.map +1 -1
  19. package/dist/react/hooks/useKeyboardOpen.d.ts +13 -0
  20. package/dist/react/hooks/useKeyboardOpen.d.ts.map +1 -0
  21. package/dist/react/hooks/useKeyboardOpen.js +30 -0
  22. package/dist/react/hooks/useKeyboardOpen.js.map +1 -0
  23. package/dist/react/index.d.ts +2 -0
  24. package/dist/react/index.d.ts.map +1 -1
  25. package/dist/react/index.js +2 -0
  26. package/dist/react/index.js.map +1 -1
  27. package/dist/react/look/AppearanceMenu.d.ts +29 -0
  28. package/dist/react/look/AppearanceMenu.d.ts.map +1 -0
  29. package/dist/react/look/AppearanceMenu.js +39 -0
  30. package/dist/react/look/AppearanceMenu.js.map +1 -0
  31. package/dist/react/look/AppearancePanel.d.ts +18 -0
  32. package/dist/react/look/AppearancePanel.d.ts.map +1 -0
  33. package/dist/react/look/AppearancePanel.js +20 -0
  34. package/dist/react/look/AppearancePanel.js.map +1 -0
  35. package/dist/react/look/LookPicker.d.ts +6 -1
  36. package/dist/react/look/LookPicker.d.ts.map +1 -1
  37. package/dist/react/look/LookPicker.js +2 -2
  38. package/dist/react/look/LookPicker.js.map +1 -1
  39. package/dist/react/media/denseGallery.css +2 -0
  40. package/dist/styles-areas/core.css +40 -39
  41. package/dist/styles-utilities.css +10 -8
  42. package/dist/testing/appleDevices.d.ts +68 -0
  43. package/dist/testing/appleDevices.d.ts.map +1 -0
  44. package/dist/testing/appleDevices.js +65 -0
  45. package/dist/testing/appleDevices.js.map +1 -0
  46. package/dist/testing/appleWalk.d.ts +72 -0
  47. package/dist/testing/appleWalk.d.ts.map +1 -0
  48. package/dist/testing/appleWalk.js +209 -0
  49. package/dist/testing/appleWalk.js.map +1 -0
  50. package/dist/testing/designAudit.d.ts +1 -1
  51. package/dist/testing/designAudit.d.ts.map +1 -1
  52. package/dist/testing/designAudit.js +12 -0
  53. package/dist/testing/designAudit.js.map +1 -1
  54. package/dist/testing/designBaseline.d.ts +14 -0
  55. package/dist/testing/designBaseline.d.ts.map +1 -1
  56. package/dist/testing/designBaseline.js +26 -28
  57. package/dist/testing/designBaseline.js.map +1 -1
  58. package/dist/testing/index.d.ts +6 -0
  59. package/dist/testing/index.d.ts.map +1 -1
  60. package/dist/testing/index.js +9 -0
  61. package/dist/testing/index.js.map +1 -1
  62. package/dist/testing/lookPrePaint.d.ts +19 -0
  63. package/dist/testing/lookPrePaint.d.ts.map +1 -0
  64. package/dist/testing/lookPrePaint.js +56 -0
  65. package/dist/testing/lookPrePaint.js.map +1 -0
  66. package/dist/testing/phoneRules.d.ts +98 -0
  67. package/dist/testing/phoneRules.d.ts.map +1 -0
  68. package/dist/testing/phoneRules.js +282 -0
  69. package/dist/testing/phoneRules.js.map +1 -0
  70. package/dist/testing/safariDriver.d.ts +103 -0
  71. package/dist/testing/safariDriver.d.ts.map +1 -0
  72. package/dist/testing/safariDriver.js +288 -0
  73. package/dist/testing/safariDriver.js.map +1 -0
  74. package/dist/testing/safariRules.d.ts +57 -0
  75. package/dist/testing/safariRules.d.ts.map +1 -0
  76. package/dist/testing/safariRules.js +191 -0
  77. package/dist/testing/safariRules.js.map +1 -0
  78. package/package.json +2 -1
  79. package/src/fonts/inter-OFL.txt +93 -0
  80. package/src/fonts/inter-latin-wght-normal.woff2 +0 -0
  81. package/src/looks.css +41 -0
  82. package/src/looks.spec.ts +59 -1
  83. package/src/react/components/ActionBar.spec.tsx +49 -1
  84. package/src/react/components/ActionBar.tsx +10 -2
  85. package/src/react/components/DataTable/DataTable.tsx +6 -1
  86. package/src/react/components/Grid.tsx +4 -2
  87. package/src/react/components/ScrollArea.tsx +1 -1
  88. package/src/react/components/SecretInput.spec.tsx +14 -0
  89. package/src/react/components/SecretInput.tsx +13 -1
  90. package/src/react/components/SegmentedControl.spec.tsx +1 -1
  91. package/src/react/components/SegmentedControl.tsx +5 -1
  92. package/src/react/components/tooltipWarm.spec.tsx +15 -0
  93. package/src/react/hooks/useKeyboardOpen.ts +29 -0
  94. package/src/react/index.ts +2 -0
  95. package/src/react/look/AppearanceMenu.spec.tsx +90 -0
  96. package/src/react/look/AppearanceMenu.tsx +64 -0
  97. package/src/react/look/AppearancePanel.tsx +54 -0
  98. package/src/react/look/LookPicker.tsx +14 -2
  99. package/src/react/media/denseGallery.css +2 -0
  100. package/src/styles-areas/core.css +40 -39
  101. package/src/styles-utilities.css +10 -8
  102. package/src/testing/appleDevices.spec.ts +36 -0
  103. package/src/testing/appleDevices.ts +97 -0
  104. package/src/testing/appleWalk.ts +232 -0
  105. package/src/testing/designAudit.ts +12 -0
  106. package/src/testing/designBaseline.spec.ts +9 -0
  107. package/src/testing/designBaseline.ts +26 -34
  108. package/src/testing/index.ts +18 -0
  109. package/src/testing/lookPrePaint.spec.ts +43 -0
  110. package/src/testing/lookPrePaint.ts +60 -0
  111. package/src/testing/phoneRules.spec.ts +75 -0
  112. package/src/testing/phoneRules.ts +332 -0
  113. package/src/testing/safariDriver.ts +331 -0
  114. package/src/testing/safariRules.spec.ts +92 -0
  115. package/src/testing/safariRules.ts +195 -0
@@ -0,0 +1,282 @@
1
+ /** iOS zooms the page into any field smaller than this when it takes focus (FRM-11). */
2
+ export const ZOOM_FLOOR = 16;
3
+ /** WCAG 2.2 2.5.8 (AA): a target smaller than this needs that much clear space around it. */
4
+ export const TARGET_FLOOR = 24;
5
+ /** Apple's guidance for anything a finger hits (LAY-13). */
6
+ export const THUMB = 44;
7
+ /** The rules only a touchscreen can be held to: a Mac's Safari has a mouse, no halo and no zoom. */
8
+ export const TOUCH_ONLY_RULES = ['LAY-13', 'FRM-11', 'LAY-14'];
9
+ /** The distance from a point to a box: 0 inside it. */
10
+ function reach(px, py, t) {
11
+ const dx = Math.max(t.x - px, 0, px - (t.x + t.w));
12
+ const dy = Math.max(t.y - py, 0, py - (t.y + t.h));
13
+ return Math.hypot(dx, dy);
14
+ }
15
+ /** WCAG's spacing test: a 24px circle on an undersized target's centre touches no other target, nor another small target's circle. */
16
+ export function crowded(target, others) {
17
+ const cx = target.x + target.w / 2;
18
+ const cy = target.y + target.h / 2;
19
+ const half = TARGET_FLOOR / 2;
20
+ for (const other of others) {
21
+ if (other === target || other.inline)
22
+ continue;
23
+ const small = Math.min(other.w, other.h) < TARGET_FLOOR;
24
+ const near = small ? Math.hypot(cx - (other.x + other.w / 2), cy - (other.y + other.h / 2)) < TARGET_FLOOR : reach(cx, cy, other) < half;
25
+ if (near)
26
+ return other.what;
27
+ }
28
+ return null;
29
+ }
30
+ /** The findings for one screen at rest. */
31
+ export function judgePhone(s, { touch }) {
32
+ const found = [];
33
+ const push = (rule, selector, detail) => found.push({ rule, selector, detail });
34
+ if (s.scrollWidth > s.width + 1)
35
+ push('LAY-10', '(document)', `the page scrolls sideways by ${s.scrollWidth - s.width}px`);
36
+ for (const o of s.offscreen)
37
+ push('LAY-10', o.what, `runs off the ${s.width}px screen by ${o.left < 0 ? `${Math.round(-o.left)}px on the left` : `${Math.round(o.right - s.width)}px on the right`}`);
38
+ const covered = s.targets.filter((t) => t.coveredBy && !t.canReveal);
39
+ for (const t of covered)
40
+ push('LAY-9', t.what, `under ${t.coveredBy}, and no scroll brings it out`);
41
+ if (!touch)
42
+ return found;
43
+ for (const f of s.fields.filter((f) => f.size < ZOOM_FLOOR))
44
+ push('FRM-11', f.what, `${f.size}px text: iOS zooms the page into a field under ${ZOOM_FLOOR}px`);
45
+ for (const t of s.targets.filter((t) => !t.inline && !t.cut && Math.min(t.w, t.h) < TARGET_FLOOR)) {
46
+ const neighbour = crowded(t, s.targets);
47
+ if (neighbour)
48
+ push('LAY-13', t.what, `${Math.round(t.w)}×${Math.round(t.h)}: under ${TARGET_FLOOR}px and too close to ${neighbour}`);
49
+ }
50
+ // The probe steps a pixel at a time from a centre that may sit on a half pixel, so a 44px halo can read 43.
51
+ const cramped = s.targets.filter((t) => !t.inline && !t.cut && Math.min(t.w, t.h) < THUMB - 1.5 && Math.min(t.w, t.h) >= TARGET_FLOOR - 0.5);
52
+ for (const t of cramped)
53
+ push('LAY-13', t.what, `${Math.round(t.w)}×${Math.round(t.h)} by what it answers to — under Apple's ${THUMB}pt`);
54
+ for (const t of s.targets.filter((t) => t.hoverOnly))
55
+ push('LAY-14', t.what, 'invisible until hovered, and a touchscreen has no hover');
56
+ return found;
57
+ }
58
+ /** With the keyboard up, the line being typed on must be in the strip above it, and nothing drawn over it (LAY-15). */
59
+ export function judgeKeyboard(k) {
60
+ const line = Math.min(k.bottom, k.top + THUMB);
61
+ if (k.top < k.stripTop - 1 || line > k.stripBottom + 1) {
62
+ return [{ rule: 'LAY-15', selector: k.field, detail: `outside the strip the keyboard leaves (${Math.round(k.top)}–${Math.round(line)} against ${Math.round(k.stripTop)}–${Math.round(k.stripBottom)})` }];
63
+ }
64
+ if (k.coveredBy)
65
+ return [{ rule: 'LAY-15', selector: k.field, detail: `under ${k.coveredBy} while the keyboard is up` }];
66
+ return [];
67
+ }
68
+ /** The findings a Mac's Safari is not held to (`TOUCH_ONLY_RULES`): kept for the touchscreens. */
69
+ export const forDesktop = (findings) => findings.filter((f) => !TOUCH_ONLY_RULES.includes(f.rule));
70
+ /* ── in the page ─────────────────────────────────────────────────────────────────────────── */
71
+ export const PHONE_TARGETS = 'a[href], button, [role=button], [role=tab], [role=checkbox], [role=switch], [role=menuitem], [role=option], [role=radio], input:not([type=hidden]), select, textarea, summary, [contenteditable=true]';
72
+ export const PHONE_FIELDS = 'input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=file]):not([type=hidden]):not([type=color]), textarea, select, [contenteditable=true]';
73
+ /**
74
+ * The in-page half. Self-contained — see the 🔴 in the header. Judges only what is ON SCREEN:
75
+ * a long page is read through a screen at a time by `appleWalk.ts`, so what arrives on scroll
76
+ * is judged when it is there, and what sits under a bar at the end is seen there.
77
+ */
78
+ export function measurePhone(selectors) {
79
+ const W = window.innerWidth;
80
+ const H = window.innerHeight;
81
+ const name = (el) => {
82
+ const label = el.getAttribute('aria-label') || el.getAttribute('title') || el.getAttribute('placeholder') || (el.textContent ?? '').trim().replace(/\s+/g, ' ').slice(0, 32);
83
+ // The region it sits in, by the first sentence of its label: a canvas's label is a paragraph of shortcuts.
84
+ const place = el.closest('[aria-label]:not(button):not(a):not(input):not(textarea)')?.getAttribute('aria-label')?.split(/\.\s/)[0]?.slice(0, 48);
85
+ return `${el.tagName.toLowerCase()}${label ? ` "${label}"` : ''}${place && place !== label ? ` in ${place}` : ''}`;
86
+ };
87
+ const shown = (el) => {
88
+ if (el.closest('[hidden], [aria-hidden=true], [inert]'))
89
+ return false;
90
+ // What a closed <details> holds is not drawn, though WebKit still gives it a box (family's
91
+ // birth-record fields read as covered by the heading below them, 2026-10-06); its summary is.
92
+ const closed = el.closest('details:not([open])');
93
+ if (closed && !closed.querySelector(':scope > summary')?.contains(el))
94
+ return false;
95
+ const r = el.getBoundingClientRect();
96
+ if (r.width < 1 || r.height < 1)
97
+ return false;
98
+ const style = getComputedStyle(el);
99
+ // A screen-reader-only element (clipped away) is not on screen for anyone with eyes, whatever its box.
100
+ if (style.clipPath === 'inset(50%)' || /rect\(0(px)?,? 0(px)?,? 0(px)?,? 0(px)?\)/.test(style.clip))
101
+ return false;
102
+ return style.visibility !== 'hidden' && style.display !== 'none';
103
+ };
104
+ const opacity = (el) => {
105
+ let o = 1;
106
+ for (let node = el; node; node = node.parentElement)
107
+ o *= Number.parseFloat(getComputedStyle(node).opacity || '1');
108
+ return o;
109
+ };
110
+ // The open dialog or menu, if any: what is behind it cannot be reached and is not judged.
111
+ const dialogs = [...document.querySelectorAll('[role=dialog], [role=alertdialog], [aria-modal=true], [role=menu], [role=listbox]')].filter(shown);
112
+ const scope = dialogs.at(-1) ?? document.body;
113
+ const clips = (el) => {
114
+ let box = new DOMRect(0, 0, W, H);
115
+ for (let node = el.parentElement; node && node !== document.body; node = node.parentElement) {
116
+ const s = getComputedStyle(node);
117
+ if (s.overflowX === 'visible' && s.overflowY === 'visible')
118
+ continue;
119
+ const r = node.getBoundingClientRect();
120
+ const left = Math.max(box.left, r.left);
121
+ const top = Math.max(box.top, r.top);
122
+ box = new DOMRect(left, top, Math.max(0, Math.min(box.right, r.right) - left), Math.max(0, Math.min(box.bottom, r.bottom) - top));
123
+ }
124
+ return box;
125
+ };
126
+ const scroller = (el) => {
127
+ for (let node = el.parentElement; node; node = node.parentElement) {
128
+ const s = getComputedStyle(node);
129
+ if (/(auto|scroll)/.test(s.overflowY) && node.scrollHeight > node.clientHeight + 1)
130
+ return node;
131
+ }
132
+ return document.scrollingElement ?? document.documentElement;
133
+ };
134
+ const pinned = (el) => {
135
+ for (let node = el; node; node = node.parentElement) {
136
+ const p = getComputedStyle(node).position;
137
+ if (p === 'fixed' || p === 'sticky')
138
+ return node;
139
+ }
140
+ return null;
141
+ };
142
+ const all = [...scope.querySelectorAll(selectors.targets)].filter((el) => shown(el) && getComputedStyle(el).pointerEvents !== 'none');
143
+ // A control nested in another (an icon button inside a link) is judged as the outer one.
144
+ const outer = all.filter((el) => !all.some((other) => other !== el && other.contains(el)));
145
+ const mine = (x, y, el) => {
146
+ if (x < 0 || y < 0 || x >= W || y >= H)
147
+ return false;
148
+ const hit = document.elementFromPoint(x, y);
149
+ if (!hit)
150
+ return false;
151
+ if (hit === el || el.contains(hit))
152
+ return true;
153
+ // A control's frame is its reach when a tap on the frame lands in the control: a `<label>`
154
+ // toggles what it labels (cb's Checkbox is a 16px box in a 44px label, `data-cb-tap-target`),
155
+ // and a composite field's frame (`data-cb-field-control`: a secret's eye and copy beside its
156
+ // input) hands a tap on its own border or padding to the field — unless the tap found
157
+ // another control inside the frame (the eye), which is that control's.
158
+ if (!el.matches('input, textarea, select, [role=checkbox], [role=radio], [role=switch]'))
159
+ return false;
160
+ const frame = el.closest('label, [data-cb-tap-target], [data-cb-field-control]');
161
+ return !!frame && frame.contains(hit) && (hit.closest(selectors.targets) ?? el) === el;
162
+ };
163
+ /*
164
+ * What a finger can actually hit: a control may answer beyond its box (a ::before halo on a
165
+ * touchscreen), so a small one is probed outward from its centre, one pixel at a time.
166
+ * `under`: the reach ran into a bar that stays put (a sticky heading, a fixed nav) while the
167
+ * control's pane scrolls — the edge case again, at a bar's edge instead of the pane's: a scroll
168
+ * moves the control out from under it, so its size is judged on a screen where it has room.
169
+ */
170
+ const reachOf = (el, r) => {
171
+ const cx = r.left + r.width / 2;
172
+ const cy = r.top + r.height / 2;
173
+ if (Math.min(r.width, r.height) >= 44)
174
+ return { w: r.width, h: r.height, under: false };
175
+ // A control in a frame that hands it every tap — a `<label>`, cb's tap-target label, a composite
176
+ // field's frame — reaches as far as the frame does, by construction: the frame's box is the
177
+ // footprint, and no pixel probe is needed (a 16px box in a 24×87 captioned label read 24 wide
178
+ // when the caption's text node was hit, 2026-10-06).
179
+ if (el.matches('input, textarea, select, [role=checkbox], [role=radio], [role=switch]')) {
180
+ const frame = el.closest('label, [data-cb-tap-target], [data-cb-field-control]');
181
+ if (frame && frame !== el) {
182
+ const f = frame.getBoundingClientRect();
183
+ return { w: Math.max(r.width, f.width), h: Math.max(r.height, f.height), under: false };
184
+ }
185
+ }
186
+ const pane = scroller(el);
187
+ const scrolls = !pinned(el) && pane.scrollHeight > pane.clientHeight + 1;
188
+ const barAt = (x, y) => {
189
+ const hit = scrolls ? document.elementFromPoint(x, y) : null;
190
+ const bar = hit ? pinned(hit) : null;
191
+ return !!bar && !bar.contains(el);
192
+ };
193
+ if (!mine(cx, cy, el))
194
+ return { w: r.width, h: r.height, under: barAt(cx, cy) };
195
+ let under = false;
196
+ // Up to 44px each way: a footprint may lie to one side of the glyph (cb's Checkbox is a 16px box
197
+ // at the left of a 44px label whose caption is tappable too), and a cap at 22 read that as 38.
198
+ const extent = (dx, dy, from) => {
199
+ let d = from;
200
+ while (d < 44 && mine(cx + dx * (d + 1), cy + dy * (d + 1), el))
201
+ d++;
202
+ if (d < 44 && barAt(cx + dx * (d + 1), cy + dy * (d + 1)))
203
+ under = true;
204
+ return d;
205
+ };
206
+ const w = Math.max(r.width, extent(-1, 0, 0) + extent(1, 0, 0));
207
+ const h = Math.max(r.height, extent(0, -1, 0) + extent(0, 1, 0));
208
+ return { w, h, under };
209
+ };
210
+ const targets = [];
211
+ for (const el of outer) {
212
+ const box = el.getBoundingClientRect();
213
+ // Only what is on screen can be hit, or hit-tested: the rest is judged when a scroll brings it here.
214
+ const view = clips(el);
215
+ const mx = box.left + box.width / 2;
216
+ const my = box.top + box.height / 2;
217
+ if (mx < Math.max(0, view.left) || mx > Math.min(W, view.right) || my < Math.max(0, view.top) || my > Math.min(H, view.bottom))
218
+ continue;
219
+ // At the edge of its pane its reach is cut by the edge: its size is judged on a screen where it has room.
220
+ const room = 12;
221
+ const got = reachOf(el, box);
222
+ const cut = got.under || box.top < Math.max(0, view.top) + room || box.bottom > Math.min(H, view.bottom) - room || box.left < Math.max(0, view.left) + room || box.right > Math.min(W, view.right) - room;
223
+ // Judged by what it answers to, centred where it is drawn.
224
+ const r = new DOMRect(mx - got.w / 2, my - got.h / 2, got.w, got.h);
225
+ const style = getComputedStyle(el);
226
+ const parentText = (el.parentElement?.textContent ?? '').trim().length;
227
+ const inline = style.display === 'inline' && parentText > (el.textContent ?? '').trim().length + 8;
228
+ const disabled = el.matches(':disabled, [aria-disabled=true]');
229
+ const hoverOnly = !disabled && el.getAttribute('type') !== 'file' && opacity(el) < 0.05;
230
+ let coveredBy = null;
231
+ let canReveal = true;
232
+ const hit = document.elementFromPoint(mx, my);
233
+ if (hit && hit !== el && !el.contains(hit) && !hit.contains(el)) {
234
+ coveredBy = name(hit);
235
+ const cover = pinned(hit);
236
+ const pane = scroller(el);
237
+ const max = pane.scrollHeight - pane.clientHeight;
238
+ // A collapsed disclosure over the end of what it holds brings it out with one tap.
239
+ if (hit.closest('[aria-expanded=false]'))
240
+ canReveal = true;
241
+ // A node on a pannable canvas (`role=application`: the tree, the 3D scene, a board) under the
242
+ // canvas's own HUD is brought out by a pan — a HUD floats over a canvas by design (CNV-3).
243
+ else if (el.closest('[role=application]') && !hit.closest('[role=dialog], [role=alertdialog], [role=menu]'))
244
+ canReveal = true;
245
+ else if (!cover || cover.contains(el))
246
+ canReveal = false;
247
+ else {
248
+ const c = cover.getBoundingClientRect();
249
+ const p = pane === document.scrollingElement ? new DOMRect(0, 0, W, H) : pane.getBoundingClientRect();
250
+ // A bar in the bottom half of the pane is escaped by scrolling on; one in the top half (a sticky heading), by scrolling back.
251
+ canReveal = c.top + c.height / 2 > p.top + p.height / 2 ? pane.scrollTop < max - 1 : pane.scrollTop > 1;
252
+ }
253
+ }
254
+ targets.push({ what: name(el), x: r.left, y: r.top, w: r.width, h: r.height, inline, hoverOnly, coveredBy, canReveal, cut });
255
+ }
256
+ const fields = [...scope.querySelectorAll(selectors.fields)].filter(shown).map((el) => ({ what: name(el), size: Number.parseFloat(getComputedStyle(el).fontSize) }));
257
+ const offscreen = [];
258
+ const reported = [];
259
+ for (const el of document.body.querySelectorAll('*')) {
260
+ if (!shown(el) || reported.some((r) => r.contains(el)))
261
+ continue;
262
+ const r = el.getBoundingClientRect();
263
+ if (r.right <= W + 1 && r.left >= -1)
264
+ continue;
265
+ // Inside something that clips or scrolls sideways, running past the screen is that pane's business.
266
+ let held = false;
267
+ for (let node = el.parentElement; node && node !== document.body; node = node.parentElement) {
268
+ if (getComputedStyle(node).overflowX !== 'visible') {
269
+ held = true;
270
+ break;
271
+ }
272
+ }
273
+ // A drawer parked off screen is a pinned layer's business, not the page's width.
274
+ if (held || pinned(el))
275
+ continue;
276
+ // The outermost offender only: what it holds runs off with it.
277
+ reported.push(el);
278
+ offscreen.push({ what: name(el), left: r.left, right: r.right });
279
+ }
280
+ return { width: W, height: H, scrollWidth: (document.scrollingElement ?? document.documentElement).scrollWidth, offscreen: offscreen.slice(0, 8), fields, targets };
281
+ }
282
+ //# sourceMappingURL=phoneRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phoneRules.js","sourceRoot":"","sources":["../../src/testing/phoneRules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import { type AppleDevice, type DeviceDescriptorLike } from './appleDevices.js';
2
+ import { type AuditAppleOptions } from './appleWalk.js';
3
+ import type { DesignViolation } from './designAudit.js';
4
+ declare const ELEMENT = "element-6066-11e4-a52e-4f735466cecf";
5
+ type Ref = {
6
+ [ELEMENT]: string;
7
+ };
8
+ export declare class SafariError extends Error {
9
+ }
10
+ /** One Safari window under WebDriver. `start` is the only way to get one. */
11
+ export declare class SafariSession {
12
+ private readonly driver;
13
+ private readonly api;
14
+ private readonly id;
15
+ /** `Safari 27.0.1` — what the report names. */
16
+ readonly engine: string;
17
+ private chrome;
18
+ private constructor();
19
+ /** Starts `safaridriver` on a free port and opens a session; the error names the remedy. */
20
+ static start(): Promise<SafariSession>;
21
+ private call;
22
+ /** A fresh document each time: a hash alone would keep a page whose account or place is stale. */
23
+ open(url: string): Promise<void>;
24
+ /** Runs a standalone function inside the page with one argument, awaiting a promise it returns. */
25
+ run<A, R>(fn: (arg: A) => R | Promise<R>, arg: A): Promise<R>;
26
+ /** Where the window is now. */
27
+ url(): Promise<string>;
28
+ evaluate<R>(script: string): Promise<R>;
29
+ screenshot(path: string): Promise<void>;
30
+ waitFor(css: string, ms?: number): Promise<void>;
31
+ /** The window is sized so that what the page sees is the device's viewport; Safari's own chrome sits above it. */
32
+ size(width: number, height: number): Promise<{
33
+ width: number;
34
+ height: number;
35
+ }>;
36
+ clearCookies(): Promise<void>;
37
+ /** Adds a cookie for the document's origin — navigate to the app first. */
38
+ addCookie(name: string, value: string): Promise<void>;
39
+ /**
40
+ * A click that is known to have arrived. Safari delivers a WebDriver click as a real mouse
41
+ * event, which reaches nothing while another app is in front: the page counts what lands, Safari
42
+ * is brought forward on a miss, and a second miss fails with the reason.
43
+ */
44
+ click(ref: Ref): Promise<void>;
45
+ /** The first element matching `css` (and holding `text`) that is drawn, as a WebDriver reference. */
46
+ find(css: string, text?: string, ms?: number): Promise<Ref>;
47
+ /** Arms the page: script errors collected from here on, and the stood-in keyboard. */
48
+ arm(): Promise<unknown>;
49
+ errorsSoFar(): Promise<string[]>;
50
+ /** Every style the app's sheets ask of this engine that it refuses, as findings. */
51
+ styleGaps(): Promise<DesignViolation[]>;
52
+ close(): Promise<void>;
53
+ }
54
+ /** A screen the Safari walk visits. */
55
+ export interface SafariScreen {
56
+ name: string;
57
+ /** A path under the base, or the control to tap from `at`. */
58
+ open: string | {
59
+ at: string;
60
+ css: string;
61
+ text?: string;
62
+ };
63
+ /** What must be drawn before the screen is judged. */
64
+ ready: string;
65
+ /** The walk's options for this screen: a long page, a field for the keyboard. */
66
+ audit?: Pick<AuditAppleOptions, 'long' | 'keyboard' | 'allowProse' | 'ignore'>;
67
+ /** Opened with the session cookie; the walk visits these after the signed-out screens. */
68
+ signedIn?: boolean;
69
+ }
70
+ export interface WalkSafariOptions {
71
+ /** The local instance: `http://127.0.0.1:<port>`. Safari cannot carry a stage's Access token. */
72
+ base: string;
73
+ /** The session cookie a signed-in screen is opened with. */
74
+ cookie?: {
75
+ name: string;
76
+ value: string;
77
+ } | null;
78
+ screens: readonly SafariScreen[];
79
+ devices: readonly AppleDevice[];
80
+ /** Playwright's `devices` registry, for each device's viewport. */
81
+ registry: Record<string, DeviceDescriptorLike>;
82
+ /** Where the report and screenshots land; emptied first. */
83
+ out: string;
84
+ /** Per-screen audit options every screen shares (e.g. `ignore`). */
85
+ audit?: Pick<AuditAppleOptions, 'allowProse' | 'ignore'>;
86
+ log?: (line: string) => void;
87
+ }
88
+ export interface SafariResult {
89
+ device: string;
90
+ screen: string;
91
+ shot: string;
92
+ findings: DesignViolation[];
93
+ /** Script errors and reasons a screen did not open — not design findings, still failures. */
94
+ errors: string[];
95
+ }
96
+ /** Walks every screen at every device's width in the shipped Safari; writes `<out>/report.md`; answers the results. */
97
+ export declare function walkSafari(options: WalkSafariOptions): Promise<{
98
+ engine: string;
99
+ results: SafariResult[];
100
+ failed: number;
101
+ }>;
102
+ export {};
103
+ //# sourceMappingURL=safariDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safariDriver.d.ts","sourceRoot":"","sources":["../../src/testing/safariDriver.ts"],"names":[],"mappings":"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"}