@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 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.9",
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": {