qapture2 0.7.0 → 0.7.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/README.md CHANGED
@@ -298,6 +298,23 @@ You can measure this yourself — `npm run capture-accuracy-test` captures a
298
298
  rectangle straddling a colour boundary and reports the error in pixels. It
299
299
  reads 0.0px on 0.4.0 and 20px (of a 40px capture) on 0.3.1.
300
300
 
301
+ **v0.7.1 fixed a second, much louder failure: no screenshot at all.**
302
+ html2canvas ships its own CSS colour parser, and it predates CSS Color 4.
303
+ Handed `oklch(...)` it throws, and the throw aborts the whole render — so the
304
+ tester saw "Screenshot failed" and a Retry that re-ran the identical render and
305
+ could never succeed. Tailwind v4 emits `oklch()` for its entire default
306
+ palette and shadcn/ui inherits it, so on those stacks screenshots never worked
307
+ at all, on any page. `lab()`, `lch()`, `oklab()`, `color()` and `color-mix()`
308
+ failed the same way.
309
+
310
+ Qapture now rewrites those colours to plain sRGB inside the clone html2canvas
311
+ renders — never in your page. The conversion paints each colour onto a 1×1
312
+ canvas and reads the pixel back rather than reading `fillStyle` as a string,
313
+ because Chrome round-trips `oklch(...)` unchanged. Gradients and shadows are
314
+ rewritten in place, and a render that still throws is retried once with
315
+ decoration stripped. `npm run modern-css-test` proves it, and proves itself:
316
+ it first asserts that raw html2canvas *still* dies on the same fixture.
317
+
301
318
  ### `exact` — opt-in, pixel-for-pixel
302
319
 
303
320
  Uses the Screen Capture API to photograph **this tab's real composited
@@ -359,9 +376,22 @@ Behaviour worth knowing:
359
376
  than having to find the folder again.
360
377
  - Export is unchanged and still works; this is a second, always-on copy.
361
378
 
362
- **Chromium desktop only.** The File System Access API has no equivalent in
363
- Firefox, Safari or any mobile browser there, Settings says so and points at
364
- Export.
379
+ **Everywhere, by one of two routes (v0.7.1).** Writing into a folder the
380
+ tester picked is the File System Access API, which is Chromium desktop only
381
+ Safari has never shipped `showDirectoryPicker`, and its only filesystem API is
382
+ a sandbox the tester cannot see.
383
+
384
+ So on Safari, Firefox and phones the same feature runs a second way: name the
385
+ project and campaign as usual, and Qapture assembles the identical tree and
386
+ hands it over as a **ZIP whose internal paths are `<Project>/<Campaign>/…`**.
387
+ Unzip it into your QA folder and you get the same layout, the same filenames
388
+ and the same sequence numbers Chromium writes live. It refreshes itself every
389
+ few points, and **Save folder now** grabs it on demand.
390
+
391
+ The engine is chosen by feature detection rather than by sniffing the browser,
392
+ so Safari upgrades itself to live writing the day WebKit ships the picker.
393
+ Stopping a campaign and restarting it keeps its numbering, so a later ZIP never
394
+ disagrees with one already in your folder.
365
395
 
366
396
  ---
367
397
 
@@ -412,7 +442,7 @@ All fields are optional. Passing an empty object (or no config at all) produces
412
442
  | `brand` | `{ label?: string }` | `{ label: 'Qapture' }` | Panel heading label. |
413
443
  | `loginField` | `{ en: string; ar?: string }` | `{ en: 'Username', ar: 'اسم المستخدم' }` | Display label for the login column in the Credentials tab. |
414
444
  | `credentials` | `QaCredential[]` | `[]` | DEV/TEST/SEED login rows shown in the Credentials tab. |
415
- | `journey` | `QaJourneyLane[]` | `[]` | Role-grouped testing journey shown in the Guide tab. |
445
+ | `journey` | `QaJourneyLane[]` | `[]` | Role-grouped testing journey shown in the Guide tab. **If you leave this empty, the Guide falls back to a built-in generic plan** (see below) rather than rendering an empty tab. |
416
446
  | `preamble` | `QaPreamble` | `null` | AI agent handoff context block embedded in the export. |
417
447
  | `rtl` | `boolean` | `false` | When `true`, the UI initialises in Arabic / RTL mode. |
418
448
  | `visible` | `boolean \| undefined` | `undefined` | `true` = always show; `false` = always hide; `undefined` = dev-only (hidden in production). |
@@ -492,6 +522,13 @@ Array fields also accept a plain newline-separated string; the export normalises
492
522
 
493
523
  ## Graded Risk Model
494
524
 
525
+ **If you define no journey at all (v0.7.1),** the Guide shows a built-in
526
+ generic plan instead of an empty page — first look, moving around, the main
527
+ task, when it goes wrong, on a phone. It is labelled in the UI as generic, with
528
+ a pointer to `qa.config`, so nobody mistakes it for coverage of *your* app; it
529
+ exists because an empty checklist taught the tester nothing and silently asked
530
+ them to invent one. Define `journey` and it disappears.
531
+
495
532
  Each journey step carries a `risk` value. The Guide tab shows a coloured dot beside every step; the export leads with a coverage report scored on RED steps.
496
533
 
497
534
  | Risk | When to use | Verification rule |
@@ -737,7 +774,8 @@ The **capture hotkey** (default: `Shift+Alt+C`, i.e. `Option+Shift+C` on macOS)
737
774
  | Capture, notes, export | ✅ | ✅ | ✅ |
738
775
  | `dom` screenshots (default) | ✅ | ✅ | ✅ |
739
776
  | Pixel-exact screenshots | ✅ opt-in | — | — |
740
- | Save to a folder | ✅ opt-in | — | — |
777
+ | Save to a folder, live | ✅ opt-in | — | — |
778
+ | Save to a folder, as a zip | ✅ | ✅ | ✅ |
741
779
  | Storage meter | ✅ | ✅ (Safari reports coarse numbers) | ✅ |
742
780
  | Persistent storage request | ✅ | Firefox prompts; Safari ignores | varies |
743
781