@setsquare/review-sdk 0.0.1 → 0.1.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 (105) hide show
  1. package/NOTICE +3 -2
  2. package/README.md +220 -0
  3. package/dist/autoscan.d.ts +15 -1
  4. package/dist/autoscan.d.ts.map +1 -1
  5. package/dist/autoscan.js +168 -13
  6. package/dist/autoscan.js.map +1 -1
  7. package/dist/brand.d.ts +51 -2
  8. package/dist/brand.d.ts.map +1 -1
  9. package/dist/brand.js +560 -5
  10. package/dist/brand.js.map +1 -1
  11. package/dist/checks/context-change.d.ts +96 -0
  12. package/dist/checks/context-change.d.ts.map +1 -0
  13. package/dist/checks/context-change.js +655 -0
  14. package/dist/checks/context-change.js.map +1 -0
  15. package/dist/checks/focus.d.ts +154 -0
  16. package/dist/checks/focus.d.ts.map +1 -0
  17. package/dist/checks/focus.js +1123 -0
  18. package/dist/checks/focus.js.map +1 -0
  19. package/dist/checks/heuristics.d.ts +116 -0
  20. package/dist/checks/heuristics.d.ts.map +1 -0
  21. package/dist/checks/heuristics.js +931 -0
  22. package/dist/checks/heuristics.js.map +1 -0
  23. package/dist/checks/keyboard.d.ts +106 -0
  24. package/dist/checks/keyboard.d.ts.map +1 -0
  25. package/dist/checks/keyboard.js +452 -0
  26. package/dist/checks/keyboard.js.map +1 -0
  27. package/dist/checks/reflow.d.ts +75 -0
  28. package/dist/checks/reflow.d.ts.map +1 -0
  29. package/dist/checks/reflow.js +285 -0
  30. package/dist/checks/reflow.js.map +1 -0
  31. package/dist/checks/rule-pack.d.ts +1 -1
  32. package/dist/checks/rule-pack.d.ts.map +1 -1
  33. package/dist/checks/rule-pack.js +350 -45
  34. package/dist/checks/rule-pack.js.map +1 -1
  35. package/dist/checks/shortcuts.d.ts +71 -0
  36. package/dist/checks/shortcuts.d.ts.map +1 -0
  37. package/dist/checks/shortcuts.js +196 -0
  38. package/dist/checks/shortcuts.js.map +1 -0
  39. package/dist/checks/versions.d.ts.map +1 -1
  40. package/dist/checks/versions.js +33 -1
  41. package/dist/checks/versions.js.map +1 -1
  42. package/dist/contract.d.ts +18 -0
  43. package/dist/contract.d.ts.map +1 -1
  44. package/dist/covers.d.ts +56 -0
  45. package/dist/covers.d.ts.map +1 -0
  46. package/dist/covers.js +135 -0
  47. package/dist/covers.js.map +1 -0
  48. package/dist/dedupe.d.ts +23 -0
  49. package/dist/dedupe.d.ts.map +1 -1
  50. package/dist/dedupe.js +96 -2
  51. package/dist/dedupe.js.map +1 -1
  52. package/dist/document.d.ts.map +1 -1
  53. package/dist/document.js +144 -0
  54. package/dist/document.js.map +1 -1
  55. package/dist/envelope.d.ts +8 -0
  56. package/dist/envelope.d.ts.map +1 -1
  57. package/dist/envelope.js +28 -0
  58. package/dist/envelope.js.map +1 -1
  59. package/dist/fixture.d.ts.map +1 -1
  60. package/dist/fixture.js +12 -0
  61. package/dist/fixture.js.map +1 -1
  62. package/dist/html-report.d.ts +24 -7
  63. package/dist/html-report.d.ts.map +1 -1
  64. package/dist/html-report.js +608 -136
  65. package/dist/html-report.js.map +1 -1
  66. package/dist/index.d.ts +13 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +13 -0
  69. package/dist/index.js.map +1 -1
  70. package/dist/links.d.ts +43 -0
  71. package/dist/links.d.ts.map +1 -1
  72. package/dist/links.js +43 -0
  73. package/dist/links.js.map +1 -1
  74. package/dist/observe.d.ts +8 -0
  75. package/dist/observe.d.ts.map +1 -1
  76. package/dist/observe.js +45 -1
  77. package/dist/observe.js.map +1 -1
  78. package/dist/options.d.ts +53 -0
  79. package/dist/options.d.ts.map +1 -1
  80. package/dist/options.js +3 -0
  81. package/dist/options.js.map +1 -1
  82. package/dist/reading-level.d.ts +22 -1
  83. package/dist/reading-level.d.ts.map +1 -1
  84. package/dist/reading-level.js +122 -19
  85. package/dist/reading-level.js.map +1 -1
  86. package/dist/reporter.d.ts.map +1 -1
  87. package/dist/reporter.js +31 -15
  88. package/dist/reporter.js.map +1 -1
  89. package/dist/scan.d.ts +36 -1
  90. package/dist/scan.d.ts.map +1 -1
  91. package/dist/scan.js +16 -2
  92. package/dist/scan.js.map +1 -1
  93. package/dist/screens.d.ts +55 -4
  94. package/dist/screens.d.ts.map +1 -1
  95. package/dist/screens.js +243 -43
  96. package/dist/screens.js.map +1 -1
  97. package/dist/summary.d.ts +22 -0
  98. package/dist/summary.d.ts.map +1 -1
  99. package/dist/summary.js +197 -22
  100. package/dist/summary.js.map +1 -1
  101. package/dist/viewports.d.ts +105 -0
  102. package/dist/viewports.d.ts.map +1 -0
  103. package/dist/viewports.js +134 -0
  104. package/dist/viewports.js.map +1 -0
  105. package/package.json +5 -4
package/dist/brand.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { esc } from './escape.js';
1
2
  /**
2
3
  * The Setsquare mark and palette, for the artifacts the SDK writes.
3
4
  *
@@ -270,6 +271,20 @@ export const BRAND_CSS = `
270
271
  --ss-warning: #704a00; /* 7.03:1 raised, 7.87:1 surface */
271
272
  --ss-warning-ink: #ffffff;/* on warning — 7.87:1 */
272
273
 
274
+ /*
275
+ The conformance-level ramp. Two tokens per level: the wash is the ground
276
+ the letters sit on and the thing you see at a glance, the other is the
277
+ indicator — a border, non-text, held to 4.5:1 where 1.4.11 asks 3:1.
278
+ The letters are never coloured; on a light ground a colour dark enough
279
+ to carry text is dark, and a dark yellow is olive.
280
+ */
281
+ --ss-level-a: #db0024; /* 4.65:1 raised, 5.20:1 surface */
282
+ --ss-level-a-wash: #ffdfdc; /* ink on this — 16.84:1 */
283
+ --ss-level-aa: #a15c02; /* 4.63:1 raised, 5.19:1 surface */
284
+ --ss-level-aa-wash: #fee2cb; /* ink on this — 16.96:1 */
285
+ --ss-level-aaa: #816b05; /* 4.64:1 raised, 5.20:1 surface */
286
+ --ss-level-aaa-wash: #ffe88f; /* ink on this — 17.19:1 */
287
+
273
288
  --ss-code-bg: #f2f2f2;
274
289
  --ss-mark: url('${MARK_LIGHT}');
275
290
  }
@@ -298,6 +313,14 @@ export const BRAND_CSS = `
298
313
  --ss-warning: #e9a228; /* 8.01:1 raised, 9.11:1 surface */
299
314
  --ss-warning-ink: #0b0e11;/* on warning — 8.91:1 */
300
315
 
316
+ /* The level ramp, dark: same hues, the wash deep and the indicator light. */
317
+ --ss-level-a: #ff1d32; /* 4.54:1 raised, 5.16:1 surface */
318
+ --ss-level-a-wash: #5c0109; /* ink on this — 14.35:1 */
319
+ --ss-level-aa: #c1700c; /* 4.63:1 raised, 5.27:1 surface */
320
+ --ss-level-aa-wash: #452501; /* ink on this — 13.83:1 */
321
+ --ss-level-aaa: #9b8207; /* 4.63:1 raised, 5.27:1 surface */
322
+ --ss-level-aaa-wash: #372d02; /* ink on this — 13.65:1 */
323
+
301
324
  --ss-code-bg: #1a1a1a;
302
325
  --ss-mark: url('${MARK_DARK}');
303
326
  }
@@ -318,18 +341,550 @@ export const masthead = (title, subtitle) => `
318
341
  <div class="mark" role="img" aria-label="Setsquare"></div>
319
342
  <div>
320
343
  <h1>${title}</h1>
321
- <p class="muted">${subtitle}</p>
344
+ <p class="provenance">${subtitle}</p>
322
345
  </div>
323
346
  </header>`;
324
347
  /** Masthead styling, kept beside the markup that needs it. */
325
348
  export const MASTHEAD_CSS = `
326
- .masthead { display: flex; align-items: center; gap: 1rem; margin: 0 0 1.5rem; }
349
+ /*
350
+ * The mark sits on the TOP of the title block rather than its centre, because
351
+ * the subtitle is a two-line mono string at narrow widths and centring against
352
+ * it drags the mark off the h1's cap line — the one alignment a reader notices.
353
+ */
354
+ .masthead {
355
+ display: flex; align-items: flex-start; gap: 16px;
356
+ margin: 0 0 var(--ss-stack);
357
+ padding-bottom: var(--ss-block);
358
+ border-bottom: 1px solid var(--ss-border);
359
+ }
327
360
  .masthead h1 { margin: 0; }
328
- .masthead p { margin: .25rem 0 0; }
361
+ /*
362
+ * The provenance line is mono, like every other machine fact in these
363
+ * documents — a timestamp, a branch and a commit are strings a person copies,
364
+ * and the site gives those the same treatment (.ss-citation, .ss-evidence dt).
365
+ */
366
+ .masthead .provenance {
367
+ margin: 10px 0 0;
368
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
369
+ font-size: 12px; letter-spacing: .04em;
370
+ /* Not measured: this is one unbreakable machine string, not a line of prose. */
371
+ max-width: none;
372
+ color: var(--ss-ink-muted);
373
+ }
329
374
  .mark {
330
- flex: 0 0 auto; width: 44px; height: 44px;
375
+ flex: 0 0 auto; width: 44px; height: 44px; margin-top: 4px;
331
376
  background: var(--ss-mark) center / contain no-repeat;
332
377
  }
333
- @media (max-width: 30rem) { .mark { width: 32px; height: 32px; } }
378
+ @media (max-width: 30rem) { .mark { width: 32px; height: 32px; margin-top: 2px; } }
379
+ `;
380
+ /**
381
+ * The band legend, rendered once per document that groups by viewport.
382
+ *
383
+ * Here beside its styles, and beside `masthead()`, because it is the other
384
+ * shared piece of markup both artifacts print. It takes the bands it was
385
+ * actually given rather than all three — a run that never went below 1024 has
386
+ * no business defining "mobile" for a reader, and a legend listing bands that
387
+ * are not on the page reads as a list of things we looked at.
388
+ */
389
+ export const viewportLegend = (bands, note) => {
390
+ if (bands.length === 0)
391
+ return '';
392
+ const rows = bands
393
+ .map((band) => ` <div><dt>${esc(band.label)}</dt><dd>${esc(band.range)}</dd></div>`)
394
+ .join('\n');
395
+ return ` <div class="legend">
396
+ <dl>
397
+ ${rows}
398
+ </dl>
399
+ <p>${esc(note)}</p>
400
+ </div>`;
401
+ };
402
+ /**
403
+ * The design system the two artifacts share with the public site.
404
+ *
405
+ * ## Why this exists at all
406
+ *
407
+ * `BRAND_CSS` made the report and the contact sheet use the product's COLOURS.
408
+ * They still did not look like the product: 16px/1.5 system-ui, two bold
409
+ * headings, 8px corners on everything and a table with a border round every
410
+ * cell is what any document looks like when nobody decided. The site has a
411
+ * pattern language — a type ladder, a mono ordinal spine, a radius ladder, one
412
+ * device for "we could not check" and one for a data table — and a customer who
413
+ * meets us through a report should meet the same one.
414
+ *
415
+ * The values are copied from `apps/marketing/app/site.css` for the reason the
416
+ * palette above is copied from `tokens.css`: that app is not a dependency of a
417
+ * published package. Unlike the palette there is no test diffing them, and that
418
+ * is a deliberate difference rather than an oversight — `brand.test.ts` guards
419
+ * the palette because a drifted COLOUR is a silent accessibility failure, and
420
+ * nothing here can fail: a radius that drifts by a pixel is untidy, not wrong.
421
+ *
422
+ * ## What is NOT copied, and why
423
+ *
424
+ * The hero rhythm, the mark keyframes, the price table and the docs rail — none
425
+ * of them has a counterpart in a report. The section spine, the type ladder, the
426
+ * radius ladder, the absence device and the data-table treatment do, and they
427
+ * are the ones that make a page recognisable.
428
+ *
429
+ * NO COLOUR IS NAMED HERE. Every rule below reaches for a `--ss-*` role, so the
430
+ * palette stays the single place a colour is decided and `brand.test.ts` stays
431
+ * the single place it is checked.
432
+ *
433
+ * (No backticks anywhere in this string or the comments inside it. It is a
434
+ * template literal, and one would end it with the parse error landing pages
435
+ * away.)
436
+ */
437
+ export const SYSTEM_CSS = `
438
+ :root {
439
+ /*
440
+ * THE TYPE LADDER, at the site's docs altitude rather than its marketing
441
+ * one. A report is a document you read, not a page that has to hold an eye
442
+ * before the argument starts, so the display and hero steps are omitted and
443
+ * h1 is the site's --ss-h1-docs.
444
+ */
445
+ --ss-h1: clamp(28px, 3.6vw, 44px);
446
+ --ss-h2: clamp(24px, 2.8vw, 34px);
447
+ --ss-h3: clamp(18px, 1.6vw, 21px);
448
+
449
+ /* The spacing ladder, verbatim. */
450
+ --ss-section-gap: clamp(46px, 5.6vw, 96px);
451
+ --ss-lead-gap: clamp(30px, 3.4vw, 48px);
452
+ --ss-stack: clamp(24px, 2.8vw, 36px);
453
+ --ss-block: clamp(18px, 2.2vw, 26px);
454
+
455
+ /* Radius ladder: cards, inner blocks, controls, small mono, pills. */
456
+ --ss-radius-card: 9px;
457
+ --ss-radius-inner: 8px;
458
+ --ss-radius-block: 7px;
459
+ --ss-radius-control: 5px;
460
+ --ss-radius-mono: 4px;
461
+ --ss-radius-pill: 3px;
462
+
463
+ /*
464
+ * WCAG 1.4.8 asks for 1.5 line spacing within a paragraph, and these
465
+ * documents are held to AAA because of what they are. It is a property
466
+ * rather than a literal so the floor has one definition.
467
+ */
468
+ --ss-line-prose: 1.55;
469
+
470
+ /* The measure 1.4.8 caps. Overridden per document for the body width. */
471
+ --ss-measure: 68ch;
472
+
473
+ --ss-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
474
+
475
+ /*
476
+ * The document's own names for brand roles. Both artifacts used to declare
477
+ * this block themselves, in two copies that had already diverged (the sheet
478
+ * never mapped a warning colour). One place, one vocabulary.
479
+ */
480
+ --bg: var(--ss-surface);
481
+ --fg: var(--ss-ink);
482
+ --muted: var(--ss-ink-muted);
483
+ --line: var(--ss-border);
484
+ --code-bg: var(--ss-surface-raised);
485
+ --bad-fg: var(--ss-danger);
486
+ --warn-fg: var(--ss-warning);
487
+ --good-fg: var(--ss-success);
488
+ /*
489
+ * The faint grey a "nothing here" glyph would want does not exist: the
490
+ * palette has no second grey that clears 7:1, and the untested glyph is
491
+ * already distinct by content.
492
+ */
493
+ --none-fg: var(--ss-ink-muted);
494
+ }
495
+
496
+ * { box-sizing: border-box; }
497
+
498
+ body {
499
+ margin: 0 auto;
500
+ padding: var(--ss-stack) var(--ss-block) calc(var(--ss-section-gap) * 1.2);
501
+ max-width: var(--doc-width, 72rem);
502
+ background: var(--bg); color: var(--fg);
503
+ font: 16px/var(--ss-line-prose) system-ui, -apple-system, "Segoe UI", sans-serif;
504
+ text-wrap: pretty;
505
+ }
506
+
507
+ /* ------------------------------------------------------------- headings */
508
+
509
+ /*
510
+ * A default gap per heading role, scaled with the type. One value for a 34px
511
+ * h2 and a 21px h3 is what makes a page feel squashed.
512
+ */
513
+ h1, h2, h3 { font-weight: 600; }
514
+ h1 { font-size: var(--ss-h1); line-height: 1.08; letter-spacing: -.03em; margin: 0; }
515
+ h2 {
516
+ font-size: var(--ss-h2); line-height: 1.12; letter-spacing: -.026em;
517
+ margin: 0 0 clamp(14px, 1.5vw, 18px);
518
+ }
519
+ h3 { font-size: var(--ss-h3); line-height: 1.3; letter-spacing: -.012em; margin: 0 0 8px; }
520
+
521
+ /* --------------------------------------------------------------- spine */
522
+
523
+ /*
524
+ * THE SECTION SPINE: a 22px rule, a mono ordinal, and an uppercase category.
525
+ * This is the site's structural device and the single thing that makes these
526
+ * documents read as ours rather than as any tool's output.
527
+ *
528
+ * THE ORDINAL IS A CSS COUNTER, NOT A NUMBER WE RENDER. Half of this report's
529
+ * sections are conditional — no performance table without timings, no run
530
+ * group unless the run was merged, no captures unless Playwright wrote some —
531
+ * so a hand-numbered spine would have gaps in it on most real runs, and
532
+ * numbering correctly in the renderer would mean threading a counter through
533
+ * a dozen independently-built strings. The browser already counts the
534
+ * sections that exist. It stays deterministic: two renders of one run emit
535
+ * identical markup, and the counter is a function of that markup.
536
+ *
537
+ * R, because these are Review artifacts. The site numbers per module for the
538
+ * same reason: R on Review surfaces, C on Consent.
539
+ *
540
+ * The rule is an absolutely positioned ::after rather than an inline ::before,
541
+ * so a category that wraps at 320px wraps under itself instead of leaving the
542
+ * rule alone on the first line looking like a stray dash.
543
+ */
544
+ main { counter-reset: ss-section; }
545
+ section { counter-increment: ss-section; }
546
+
547
+ .eyebrow {
548
+ position: relative;
549
+ max-width: 64ch;
550
+ margin: 0 0 18px;
551
+ padding-left: 32px;
552
+ font-family: var(--ss-mono);
553
+ font-size: 12px;
554
+ letter-spacing: .1em;
555
+ text-transform: uppercase;
556
+ color: var(--muted);
557
+ }
558
+ .eyebrow::before { content: 'R' counter(ss-section, decimal-leading-zero) ' / '; }
559
+ .eyebrow::after {
560
+ content: ''; position: absolute; left: 0; top: .62em;
561
+ width: 22px; height: 1px; background: var(--line);
562
+ }
563
+
564
+ main > section { margin-top: var(--ss-section-gap); }
565
+ main > section:first-child { margin-top: 0; }
566
+
567
+ /* ---------------------------------------------------------------- prose */
568
+
569
+ /*
570
+ * 1.4.8 caps the line a reader tracks, and an unbounded block is unbounded
571
+ * whatever happens to be in it today. Scoped to prose: a table cell and a
572
+ * figure caption set their own width from their content.
573
+ */
574
+ p, ul, ol { max-width: var(--ss-measure); }
575
+ p { margin: 0 0 .75rem; }
576
+
577
+ a { color: inherit; }
578
+ :focus-visible { outline: 3px solid var(--fg); outline-offset: 2px; }
579
+
580
+ code {
581
+ background: var(--code-bg); padding: .1em .35em;
582
+ border-radius: var(--ss-radius-mono);
583
+ font-family: var(--ss-mono); font-size: .875em; overflow-wrap: anywhere;
584
+ }
585
+
586
+ .muted { color: var(--muted); }
587
+ .good, .ok { color: var(--good-fg); }
588
+ .bad { color: var(--bad-fg); font-weight: 600; }
589
+ .check { color: var(--warn-fg); font-weight: 600; }
590
+
591
+ .sr-only {
592
+ position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
593
+ overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0;
594
+ }
595
+
596
+ footer {
597
+ margin-top: var(--ss-section-gap); padding-top: var(--ss-block);
598
+ border-top: 1px solid var(--line); color: var(--muted); font-size: .875rem;
599
+ }
600
+ footer code { font-size: .8rem; }
601
+
602
+ /* ------------------------------------------------------------ the level tag */
603
+
604
+ /*
605
+ * A, AA, AAA — one treatment, and the SAME one the site uses. Ink on a wash
606
+ * with an indicator border: the hue makes a level findable across a grid
607
+ * without reading every chip, and the letters are what say which one, because
608
+ * red, orange and yellow are inseparable under deuteranopia and no contrast
609
+ * ratio changes that.
610
+ *
611
+ * A LEVEL IS ALWAYS THIS SHAPE AND A STATUS IS NEVER ONE. That is what stops
612
+ * the A tag reading as a failure next to a danger-coloured word.
613
+ *
614
+ * One width for all three, so A does not read as a smaller thing than AAA.
615
+ * The padding is asymmetric by a pixel because uppercase mono has no
616
+ * descenders and a symmetric box sits the ink high. The radius is the pill
617
+ * step, 3px — it used to be 999px here, which is a different design language
618
+ * from the one the site ships.
619
+ */
620
+ .level {
621
+ display: inline-flex; align-items: center; justify-content: center;
622
+ flex: none; min-width: 40px;
623
+ padding: 5px 9px 4px;
624
+ border: 1px solid var(--ss-border);
625
+ border-radius: var(--ss-radius-pill);
626
+ background: var(--ss-surface-raised);
627
+ color: var(--ss-ink);
628
+ font-family: var(--ss-mono); font-size: 10.5px; line-height: 1;
629
+ /* Trailing space trimmed, so the letters sit centred rather than pushed left. */
630
+ letter-spacing: .09em; text-indent: .09em;
631
+ white-space: nowrap;
632
+ }
633
+ .level-a { border-color: var(--ss-level-a); background: var(--ss-level-a-wash); }
634
+ .level-aa { border-color: var(--ss-level-aa); background: var(--ss-level-aa-wash); }
635
+ .level-aaa { border-color: var(--ss-level-aaa); background: var(--ss-level-aaa-wash); }
636
+ /*
637
+ * Under forced colours the wash and the border are the user's, so the hue is
638
+ * gone — which is fine, because it never carried the meaning. The border is
639
+ * kept so the tag stays a tag.
640
+ */
641
+ @media (forced-colors: active) {
642
+ .level { border-color: CanvasText; background: Canvas; color: CanvasText; }
643
+ }
644
+
645
+ /* --------------------------------------------------------------- absence */
646
+
647
+ /*
648
+ * "WE COULD NOT CHECK" IS ITS OWN STATE, and most products render it as a
649
+ * failure. One visual language for it: a broken 4px rule rather than a solid
650
+ * one, and a sentence saying what would resolve it. Never the danger colour,
651
+ * never a pass — which is this repository's honesty vocabulary drawn rather
652
+ * than written.
653
+ *
654
+ * The same device covers every absence these documents carry, and they are
655
+ * the same KIND of thing rather than four coincidences: a criterion the
656
+ * engine could not decide, a run that scanned nothing, a capture whose file
657
+ * has gone, and a viewport nothing was measured at. Every one is a gap in
658
+ * knowledge rather than a fault.
659
+ */
660
+ .absence {
661
+ display: flex; flex-direction: column; gap: 8px;
662
+ max-width: var(--ss-measure);
663
+ margin: 0 0 var(--ss-block);
664
+ padding: 16px 18px;
665
+ background: var(--ss-surface-raised);
666
+ border: 1px solid var(--line);
667
+ border-left: 4px dotted var(--line);
668
+ border-radius: 0 var(--ss-radius-inner) var(--ss-radius-inner) 0;
669
+ }
670
+ .absence p { margin: 0; max-width: none; }
671
+ .absence ul { margin: 0; max-width: none; }
672
+ /*
673
+ * A code chip inside an absence takes the FLAT ground, because the box it is
674
+ * in has already used the raised one and a chip the same colour as the box it
675
+ * sits in is not a chip. The same inversion the site does for an absence
676
+ * inside a raised section.
677
+ */
678
+ .absence code { background: var(--ss-surface); }
679
+ .absence__label {
680
+ margin: 0;
681
+ font-family: var(--ss-mono); font-size: 11px;
682
+ letter-spacing: .1em; text-transform: uppercase;
683
+ color: var(--ss-ink);
684
+ }
685
+
686
+ /* ------------------------------------------------------------ data tables */
687
+
688
+ /*
689
+ * A REGION THAT SCROLLS WITH A MOUSE MUST BE REACHABLE WITH A KEYBOARD.
690
+ *
691
+ * That is WCAG 2.1.1, and axe enforces it as scrollable-region-focusable. The
692
+ * conformance grid is nineteen columns wide inside this scroller, so on any
693
+ * ordinary window it scrolls — and for the whole of this document's life that
694
+ * was a level A failure nothing caught, because no suite scans the report.
695
+ * Found by pointing axe at it by hand, which is worth doing again.
696
+ *
697
+ * The markup carries the tabindex and a name: a bare tab stop announces
698
+ * nothing, and a reader who lands in a nineteen-column grid deserves to be
699
+ * told which one they are in.
700
+ */
701
+ .tablewrap { overflow-x: auto; }
702
+ .tablewrap:focus-visible { outline: 3px solid var(--fg); outline-offset: 2px; }
703
+ table { border-collapse: collapse; width: 100%; margin: .75rem 0 var(--ss-block); }
704
+ caption { text-align: left; margin-bottom: .5rem; }
705
+ th, td {
706
+ border: 1px solid var(--line); padding: .5rem .7rem;
707
+ text-align: left; vertical-align: top;
708
+ }
709
+ td.num { text-align: right; font-variant-numeric: tabular-nums; }
710
+
711
+ /*
712
+ * THE EVIDENCE TABLES: a filled header and a zebra stripe, which is the
713
+ * site's treatment and arrived there with both halves measured first.
714
+ *
715
+ * The header is ink with the ground reversed out of it — 21.00:1 in light and
716
+ * 19.80:1 in dark, the strongest pairing the palette has.
717
+ *
718
+ * The stripe is grid-line, the decorative token, at 1.48:1 against the flat
719
+ * ground in light and 1.57:1 in dark. The raised surface was the obvious
720
+ * choice and measures 1.12:1 and 1.14:1, which is a stripe nobody can see.
721
+ *
722
+ * THE CELLS ARE INK, AND THAT IS WHAT MAKES THE STRIPE POSSIBLE. On grid-line
723
+ * the palette's muted grey measures 5.53:1 in light and 5.31:1 in dark, and
724
+ * every status colour lands within a hundredth of the same place — all of
725
+ * them under 1.4.6's 7:1. So a cell in one of these tables carries no colour
726
+ * at all: where a state has to appear, it appears as a pill, whose fill is a
727
+ * role under its own -ink and is therefore a pair that was measured.
728
+ *
729
+ * That constraint is also why the conformance grid is NOT one of these tables
730
+ * — see the note beside it in html-report.ts.
731
+ *
732
+ * There is no hover state. One was built for the site and removed for being
733
+ * too heavy, and a static evidence document has even less use for it.
734
+ */
735
+ .data-table thead th {
736
+ background: var(--ss-ink); color: var(--ss-surface); border-bottom: none;
737
+ }
738
+ .data-table thead th:not(:first-child) { border-left-color: var(--ss-surface); }
739
+ .data-table tbody th, .data-table tbody td { color: var(--ss-ink); }
740
+ /*
741
+ * A code chip in a striped cell gets the mono face and no ground at all. Its
742
+ * usual raised background lands lighter than the flat row and darker than the
743
+ * stripe, so it reads as two different chips down one column — and the thing
744
+ * that makes a rule id look like a rule id is the typeface, not the box.
745
+ */
746
+ .data-table code { background: none; padding: 0; }
747
+ .data-table tbody tr:nth-child(even) th,
748
+ .data-table tbody tr:nth-child(even) td { background: var(--ss-grid-line); }
749
+ /*
750
+ * Under forced colours the grounds are the user's, so the stripe goes. The
751
+ * borders survive, which is the right thing to keep: the stripe was always an
752
+ * aid to tracking a row and never the structure.
753
+ */
754
+ @media (forced-colors: active) {
755
+ .data-table thead th {
756
+ background: Canvas; color: CanvasText; border-bottom: 2px solid CanvasText;
757
+ }
758
+ .data-table tbody tr:nth-child(even) th,
759
+ .data-table tbody tr:nth-child(even) td { background: Canvas; }
760
+ }
761
+
762
+ /*
763
+ * The straight-to-a-band links out of the report's captures section. Mono and
764
+ * uppercase because they are the same vocabulary as the band headings they
765
+ * land on, and a reader should recognise where they are going to arrive.
766
+ */
767
+ .band-links {
768
+ list-style: none; padding: 0; margin: 0 0 .75rem; max-width: none;
769
+ display: flex; flex-direction: column; gap: 6px;
770
+ }
771
+ .band-links a {
772
+ font-family: var(--ss-mono); font-size: 12px;
773
+ letter-spacing: .12em; text-transform: uppercase; font-weight: 600;
774
+ }
775
+ .band-links .muted {
776
+ font-family: var(--ss-mono); font-size: 12px; letter-spacing: .04em;
777
+ }
778
+
779
+ /* ----------------------------------------------------- viewport bands */
780
+
781
+ /*
782
+ * A ROW THAT IS A HEADING, inside its own tbody.
783
+ *
784
+ * The grouping is real table structure rather than a visual break: each band
785
+ * is its own row group, and this is that group's header cell scoped to it, so
786
+ * a screen reader announces which band a cell belongs to the same way it
787
+ * announces which column. A styled row with no header semantics would group
788
+ * the rows for sighted readers only, which on an accessibility report is a
789
+ * poor joke. (No backticks in this block — it is inside a template literal.)
790
+ *
791
+ * Reversed out of ink, like the column header above it, because it is a
792
+ * header — 21.00:1 light and 19.80:1 dark, the same measured pairing. The
793
+ * size sits beside the name at a lighter weight and never replaces it: the
794
+ * band is shorthand and the pixels are the fact.
795
+ */
796
+ /*
797
+ * THE TABLE CLASS IS IN THE SELECTOR, and it has to be. The cell-colour rule
798
+ * above is scoped to a data table's body header cells, which out-specifies a
799
+ * bare band-row rule — so the heading took the body's ink on its own ink
800
+ * ground and rendered as a black bar with nothing in it. Caught by looking at
801
+ * the page; no test asserts a colour, and a contrast checker would have
802
+ * called 1:1 a pass for text nobody can see. (No backticks: template literal.)
803
+ */
804
+ .data-table .band-row th,
805
+ .data-table .band-row td {
806
+ background: var(--ss-ink); color: var(--ss-surface);
807
+ font-family: var(--ss-mono); font-size: 11px;
808
+ letter-spacing: .12em; text-transform: uppercase;
809
+ padding: .45rem .7rem;
810
+ }
811
+ /*
812
+ * No border between the two cells, so the header and the sizes read as one
813
+ * bar. They are two cells because axe cannot resolve a header that spans
814
+ * every column — see the note beside bandHeader in html-report.ts.
815
+ */
816
+ .data-table .band-row th { border-right: 0; }
817
+ .data-table .band-row td { border-left: 0; }
818
+ .data-table .band-row .sizes {
819
+ letter-spacing: .04em; text-transform: none; opacity: .78;
820
+ }
821
+ @media (forced-colors: active) {
822
+ .data-table .band-row th,
823
+ .data-table .band-row td {
824
+ background: Canvas; color: CanvasText; border-bottom: 2px solid CanvasText;
825
+ }
826
+ }
827
+
828
+ /*
829
+ * The legend, and it is not decoration.
830
+ *
831
+ * "Mobile" is a claim about a device and these documents cannot make one — a
832
+ * viewport is a number of CSS pixels and the machine behind it is unknowable.
833
+ * The band names are kept because they are what a reader is actually asking
834
+ * about, and the legend is the price: every artifact that prints a band name
835
+ * prints this beside it, with the ranges, once.
836
+ */
837
+ .legend {
838
+ margin: 0 0 var(--ss-block);
839
+ padding: 14px 16px;
840
+ max-width: var(--ss-measure);
841
+ background: var(--ss-surface-raised);
842
+ border: 1px solid var(--line);
843
+ border-radius: var(--ss-radius-block);
844
+ }
845
+ .legend dl {
846
+ display: flex; flex-wrap: wrap; gap: 6px 20px;
847
+ margin: 0 0 8px;
848
+ font-family: var(--ss-mono); font-size: 12px;
849
+ }
850
+ .legend div { display: flex; align-items: baseline; gap: 8px; }
851
+ .legend dt {
852
+ letter-spacing: .12em; text-transform: uppercase; font-weight: 600;
853
+ }
854
+ .legend dd { margin: 0; color: var(--muted); }
855
+ .legend p { margin: 0; max-width: none; font-size: .875rem; color: var(--muted); }
856
+
857
+ /* ------------------------------------------------------------------ pills */
858
+
859
+ /*
860
+ * The one solid fill in either document: a role under its own -ink is a pair
861
+ * the palette measured, and nothing here invents a tint.
862
+ */
863
+ .pill {
864
+ display: inline-block; min-width: 4.5ch; text-align: center;
865
+ padding: .1em .5em; border-radius: var(--ss-radius-mono);
866
+ font-family: var(--ss-mono); font-size: .8125em; letter-spacing: .04em;
867
+ }
868
+ .pill.s-failed { background: var(--ss-danger); color: var(--ss-danger-ink); font-weight: 700; }
869
+ .pill.s-cantTell { background: var(--ss-warning); color: var(--ss-warning-ink); font-weight: 600; }
870
+ .pill.s-rulesPassed { background: var(--ss-success); color: var(--ss-success-ink); }
871
+ .pill.s-inapplicable {
872
+ background: var(--ss-surface); color: var(--ss-ink); border: 1px solid var(--line);
873
+ }
874
+ /*
875
+ * The two declared states are HOLLOW, never filled.
876
+ *
877
+ * Every solid pill is something a rule observed. A declaration is the
878
+ * customer's claim about their own test, and a dashed outline reads as
879
+ * provisional next to a solid fill — and survives forced colours, where a
880
+ * background fill does not. The word inside carries the meaning regardless.
881
+ */
882
+ .pill.s-assertedFailing {
883
+ background: none; color: var(--bad-fg);
884
+ border: 1px dashed var(--bad-fg); font-weight: 700;
885
+ }
886
+ .pill.s-assertedBySuite {
887
+ background: none; color: var(--fg); border: 1px dashed var(--line);
888
+ }
334
889
  `;
335
890
  //# sourceMappingURL=brand.js.map
package/dist/brand.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"brand.js","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brand.js","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,UAAU,GACrB,wBAAwB;IACxB,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,sEAAsE,CAAC;AAEzE,sFAAsF;AACtF,MAAM,CAAC,MAAM,SAAS,GACpB,wBAAwB;IACxB,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,kGAAkG;IAClG,0CAA0C,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAwCH,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAoCR,SAAS;;;CAGhC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAU,EAAE,CAAC;;;;YAIzD,KAAK;8BACa,QAAQ;;YAE1B,CAAC;AAEb,8DAA8D;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B3B,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAAkD,EAClD,IAAY,EACJ,EAAE;IACV,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;SACxF,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO;;EAEP,IAAI;;SAEG,GAAG,CAAC,IAAI,CAAC;SACT,CAAC;AACV,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoczB,CAAC"}