@artymclabin/qa-review 0.3.9 → 0.3.10
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/CHANGELOG.md +24 -0
- package/dist/client/QAReviewOverlay.js +25 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.10 - 2026-09-19
|
|
4
|
+
|
|
5
|
+
- OUTSIDE TAP MINIMIZES THE PANEL, ON MOBILE: the only way to collapse the
|
|
6
|
+
card used to be the small minimize button in its header, and hitting a
|
|
7
|
+
small target on a phone is real friction. A pointerdown anywhere outside
|
|
8
|
+
the card now minimizes it too, scoped to mobile-width viewports (desktop
|
|
9
|
+
keeps the explicit button only, since a stray click outside a small
|
|
10
|
+
floating panel on a mouse is far more likely incidental than intentional).
|
|
11
|
+
Uses a capture-phase listener plus a contains() check against the card, so
|
|
12
|
+
dragging the card by its header (which also starts with a pointerdown,
|
|
13
|
+
from inside the card) is unaffected.
|
|
14
|
+
|
|
15
|
+
## 0.3.9 - 2026-09-13
|
|
16
|
+
|
|
17
|
+
- PICKED FORM CONTROLS ARE NAMED BY LABEL, NOT BY TAG: a form control has no
|
|
18
|
+
textContent, so the element picker fell through to `tagName.toLowerCase()`
|
|
19
|
+
for every input, textarea and select. Picking the seven link fields on the
|
|
20
|
+
GameReady pitch page produced seven identical `<input>` references, with
|
|
21
|
+
no way for the reviewer to say which row they meant. The picker now reads
|
|
22
|
+
the name a human would: own text, accessible name (aria-label /
|
|
23
|
+
aria-labelledby), the associated `<label>` (including a wrapping label),
|
|
24
|
+
placeholder, alt, title, current value, name attribute, and only then the
|
|
25
|
+
tag.
|
|
26
|
+
|
|
3
27
|
## 0.3.8 - 2026-08-09
|
|
4
28
|
|
|
5
29
|
- BACK TO REVIEW IS AN UNDO, NOT A RESTART: the finish panel's "Back to review"
|
|
@@ -291,6 +291,31 @@ export function QAReviewOverlay({ items, target, gateParam, stateUrl, submitUrl,
|
|
|
291
291
|
mq.addEventListener("change", onChange);
|
|
292
292
|
return () => mq.removeEventListener("change", onChange);
|
|
293
293
|
}, []);
|
|
294
|
+
// OUTSIDE TAP TO MINIMIZE (mobile only): pixel-hunting for the small
|
|
295
|
+
// minimize button is real friction on a phone, so a tap anywhere outside
|
|
296
|
+
// the card collapses it to the bubble - same result as the button, far
|
|
297
|
+
// cheaper to hit. Scoped to mobile width: on desktop a stray click outside
|
|
298
|
+
// a small floating panel is much more likely incidental than intentional.
|
|
299
|
+
// Capture phase + native listener so it fires ahead of (and regardless of)
|
|
300
|
+
// any stopPropagation on the underlying page, and a pointerdown that starts
|
|
301
|
+
// INSIDE the card (e.g. dragging the header) is excluded by the contains()
|
|
302
|
+
// check, so dragging is unaffected.
|
|
303
|
+
React.useEffect(() => {
|
|
304
|
+
if (typeof window.matchMedia !== "function")
|
|
305
|
+
return;
|
|
306
|
+
if (!active || finished || minimized || mobilePreview)
|
|
307
|
+
return;
|
|
308
|
+
const onPointerDown = (e) => {
|
|
309
|
+
if (!window.matchMedia(`(max-width: ${AUTO_BUBBLE_MAX_WIDTH_PX}px)`).matches)
|
|
310
|
+
return;
|
|
311
|
+
const target = e.target;
|
|
312
|
+
if (cardRef.current && target && !cardRef.current.contains(target)) {
|
|
313
|
+
setMinimized(true);
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
document.addEventListener("pointerdown", onPointerDown, true);
|
|
317
|
+
return () => document.removeEventListener("pointerdown", onPointerDown, true);
|
|
318
|
+
}, [active, finished, minimized, mobilePreview]);
|
|
294
319
|
// Hydrate verdicts and LAND on the first outstanding item. The DURABLE
|
|
295
320
|
// server ledger is the source of truth; localStorage is only a fast cache.
|
|
296
321
|
// 🚨 The store NEVER pre-approves (no seed). The round derives from
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@artymclabin/qa-review",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.10",
|
|
4
4
|
"description": "Interactive on-page QA review overlay (spotlight walkthrough, approve/reject verdict ledger) with a framework-agnostic server handler factory and a self-provisioning Postgres store.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|