zz-meridian 0.19.0 → 0.19.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zz-meridian",
3
- "version": "0.19.0",
3
+ "version": "0.19.1",
4
4
  "description": "Bring ZZ Meridian, a dashboard design system, into a Next.js project, or start a new dashboard on it. Copies the files in; nothing depends on this package at runtime.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -2,6 +2,12 @@
2
2
 
3
3
  Every release of ZZ Meridian, newest first. Versions follow semver: a removed or renamed token, prop or card is major; a new card, token or variant is minor; a corrected value is a patch. Each entry says what breaks and what to do instead.
4
4
 
5
+ ## [0.19.1] · 2026-10-19
6
+
7
+ ### Fixed
8
+
9
+ - **The presses suite no longer crashes when a press replaces the document late** ([#64](https://github.com/zhixuan312/zz-meridian/issues/64)). A control whose answer reloads the page once a request is accepted, a team switch that has the server draw the new team's chrome, could replace the document after `scripts/interactions.ts` had looked for an answer; its next read of the page then found no helper and stopped the whole suite with `ReferenceError: deepQuery is not defined`. A document replaced after the look is a press that moved the page: the suite opens the route again and presses the next control, and the press is not reported as doing nothing.
10
+
5
11
  ## [0.19.0] · 2026-10-19
6
12
 
7
13
  ### Breaking
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zz-meridian-template",
3
- "version": "0.19.0",
3
+ "version": "0.19.1",
4
4
  "private": true,
5
5
  "license": "MIT",
6
6
  "description": "ZZ Meridian: a dashboard design system and starter. Six layers, from DTCG tokens through four layers of React components to product workspaces, and a Design Atlas, in a light and a dark theme.",
@@ -125,7 +125,8 @@ for (const width of WIDTHS) {
125
125
  if (status >= 400) failures.push(`${route}: link ${href}${path === href ? '' : ` (${path})`} answers ${status}`);
126
126
  }
127
127
  for (let i = 0; i < controls.length; i++) {
128
- let armed = await page.eval<{ x: number; y: number; covered?: string } | null>(ARM(i));
128
+ // A document replaced since the last read has no helper: that is a page to open again, never a crash (#64).
129
+ let armed = await page.eval<{ x: number; y: number; covered?: string } | null>(ARM(i)).catch(() => null);
129
130
  // Something left open or a toast in the way: start the page again and try once more.
130
131
  if (!armed || armed.covered) { await fresh(); armed = await page.eval(ARM(i)); }
131
132
  // Tagged by this suite a moment ago and gone after a fresh load: say so, never skip it.
@@ -150,14 +151,15 @@ for (const width of WIDTHS) {
150
151
  if (!chosen) r = await look().catch(() => ({ changes: 0, moved: true }));
151
152
  }
152
153
  if (chosen) continue;
153
- if (!r.changes && !r.moved) failures.push(`${route} @${width}: "${controls[i]}" does nothing when ${touch ? 'tapped' : 'pressed'}`);
154
- if (r.moved) await fresh();
155
- else {
156
- await page.send('Input.dispatchKeyEvent', { type: 'keyDown', key: 'Escape', code: 'Escape', windowsVirtualKeyCode: 27 });
157
- await page.send('Input.dispatchKeyEvent', { type: 'keyUp', key: 'Escape', code: 'Escape', windowsVirtualKeyCode: 27 });
158
- await sleep(200);
159
- if (await page.eval<boolean>(`!!deepQuery('[role="dialog"],[role="alertdialog"],[role="menu"],[role="listbox"]', document.body)`)) await fresh();
160
- }
154
+ if (r.moved) { await fresh(); continue; }
155
+ await page.send('Input.dispatchKeyEvent', { type: 'keyDown', key: 'Escape', code: 'Escape', windowsVirtualKeyCode: 27 });
156
+ await page.send('Input.dispatchKeyEvent', { type: 'keyUp', key: 'Escape', code: 'Escape', windowsVirtualKeyCode: 27 });
157
+ await sleep(200);
158
+ // A document replaced after the look closed (a team switch that reloads once its request is accepted) has lost the
159
+ // helper and the counters: the press moved the page, late, and the route is opened again (#64).
160
+ const after = await page.eval<{ replaced: boolean; open: boolean }>(`typeof deepQuery !== 'function' ? { replaced: true, open: false } : { replaced: location.href !== window.__href, open: !!deepQuery('[role="dialog"],[role="alertdialog"],[role="menu"],[role="listbox"]', document.body) }`).catch(() => ({ replaced: true, open: false }));
161
+ if (!r.changes && !after.replaced) failures.push(`${route} @${width}: "${controls[i]}" does nothing when ${touch ? 'tapped' : 'pressed'}`);
162
+ if (after.replaced || after.open) await fresh();
161
163
  }
162
164
  if (page.errors.length) failures.push(`${route} @${width}: ${page.errors[0]}`);
163
165
  }