@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/screens.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { TestOutcome } from './envelope.js';
2
2
  import { type ShotGroup } from './shots.js';
3
+ import { type ViewportBand } from './viewports.js';
3
4
  /**
4
5
  * The visual contact sheet: every capture a run produced, under the name of the
5
6
  * test that produced it, on one scrollable page.
@@ -30,7 +31,53 @@ export interface ScreenRow {
30
31
  status: TestOutcome['status'];
31
32
  retry: number;
32
33
  groups: ShotGroup[];
34
+ /**
35
+ * The viewport sizes the fixture saw this test's pages at, as `960×640`.
36
+ *
37
+ * NOT the size of any image on this page. Setsquare never opens a capture —
38
+ * that is the whole posture of `shots.ts` — so the pixel dimensions of the
39
+ * file are something only the browser rendering this sheet knows. What we
40
+ * have is what `page.viewportSize()` returned at teardown, which is the
41
+ * moment Playwright's own `screenshot: 'on'` fires, and the caption is worded
42
+ * as that rather than as a claim about the picture.
43
+ *
44
+ * A set rather than a value because a test may drive several pages, and a
45
+ * spec that opens a second context at a different size is exactly the case
46
+ * where one number would be a lie. Empty when the fixture recorded none — a
47
+ * test that never opened a page, or a run driving a real device where
48
+ * Playwright controls no viewport at all.
49
+ */
50
+ viewports: string[];
33
51
  }
52
+ /**
53
+ * The size a test is GROUPED under, which is the narrowest it saw.
54
+ *
55
+ * Almost every test has exactly one — a project sets a width and the test runs
56
+ * at it. A test that drives several pages at several widths has to go somewhere,
57
+ * and the narrowest is the right somewhere: a reader who scrolls to Mobile is
58
+ * asking what the run saw at a narrow width, and a test that reached 390 is part
59
+ * of that answer whatever else it also did. Its meta line still lists every
60
+ * width, so the choice hides nothing.
61
+ */
62
+ /**
63
+ * The bands the contact sheet renders, and what each one holds.
64
+ *
65
+ * Exported because the accessibility report links INTO this page's grouping —
66
+ * "open the mobile captures" is the question a reader arrives with — and the
67
+ * two documents have to agree on which bands exist, what they are called, how
68
+ * many captures are in each, and what the heading's fragment is. Deriving that
69
+ * twice is how a link ends up pointing at a heading that is not there.
70
+ */
71
+ export interface ScreenBand {
72
+ band: ViewportBand;
73
+ /** The heading's `id`, and therefore the report's `href` fragment. */
74
+ anchor: string;
75
+ /** Distinct sizes in this band, widest first. */
76
+ sizes: string[];
77
+ tests: number;
78
+ captures: number;
79
+ }
80
+ export declare function screenBands(rows: readonly ScreenRow[]): ScreenBand[];
34
81
  /**
35
82
  * Which tests appear, and in what order.
36
83
  *
@@ -76,13 +123,17 @@ export interface ScreensInput {
76
123
  * so both documents include this string instead of describing the same layout
77
124
  * twice.
78
125
  */
79
- export declare const SCREENS_CSS = "\n .shot-test { border: 1px solid var(--line); border-radius: 8px; padding: .75rem 1rem; margin: 1rem 0; }\n .shot-test > h3 { font-size: 1rem; margin: 0 0 .1rem; overflow-wrap: anywhere; }\n .shot-meta { color: var(--muted); font-size: .875rem; margin: 0 0 .75rem; }\n .shot-strip { display: flex; flex-wrap: wrap; gap: 1rem; margin: 0; padding: 0; }\n .shot-strip.compare { border: 1px dashed var(--line); border-radius: 8px; padding: .75rem; }\n .shot { margin: 0; flex: 1 1 22rem; min-width: 0; }\n .shot img {\n display: block; width: 100%; height: auto; border: 1px solid var(--line);\n border-radius: 4px; background: var(--code-bg);\n /*\n * Capped so one full-page capture of a long page cannot push every other\n * test off the screen. It scales rather than crops, because a visual\n * review tool that hides part of the picture is worse than none. The image\n * links to itself for a full-size look.\n */\n max-height: 28rem; object-fit: contain; object-position: top;\n }\n .shot figcaption { font-size: .8125rem; color: var(--muted); margin-top: .35rem; overflow-wrap: anywhere; }\n .shot figcaption .role { color: var(--fg); font-weight: 600; }\n .compare-label { font-size: .8125rem; font-weight: 600; margin: 0 0 .5rem; }\n";
126
+ export declare const SCREENS_CSS = "\n .shot-test {\n border: 1px solid var(--line); border-radius: var(--ss-radius-card);\n padding: var(--ss-block); margin: 0 0 var(--ss-block);\n }\n .shot-test > h4 {\n font-size: var(--ss-h3); line-height: 1.3; letter-spacing: -.012em;\n font-weight: 600; margin: 0 0 8px;\n overflow-wrap: anywhere;\n }\n /*\n * The band heading, and it is a REAL heading rather than a styled div.\n *\n * A reader navigating this page by headings is exactly the reader who wants\n * to jump to the narrow captures, so the grouping has to exist in the\n * outline: h2 for the section, h3 per band, h4 per test. The test heading\n * dropped a level when the bands arrived, which is why it is h4 \u2014 the\n * alternative, keeping tests at h3 and drawing the bands as decoration, gives\n * a sighted reader a structure a screen-reader user cannot reach.\n *\n * A single-band run renders flat, and the tests are still h4 rather than\n * jumping back to h3. A heading level that moves depending on how many\n * viewports a suite happens to have is a worse contract than one gap.\n */\n .band-heading {\n display: flex; flex-wrap: wrap; align-items: baseline; gap: 10px;\n margin: var(--ss-stack) 0 var(--ss-block);\n padding-bottom: 8px;\n border-bottom: 1px solid var(--line);\n font-family: var(--ss-mono); font-size: 13px; font-weight: 600;\n letter-spacing: .12em; text-transform: uppercase;\n }\n .band-heading .sizes {\n font-weight: 400; letter-spacing: .04em; text-transform: none;\n color: var(--muted);\n }\n /*\n * The per-test facts, in the mono treatment every machine string in these\n * documents gets: a status word, the viewport the fixture saw, the project,\n * and the test id. The id in particular is a string somebody copies into a\n * --grep, so it is set in the face that makes it copyable. (No backticks in\n * this block: it is inside a template literal and one would end the string.)\n */\n .shot-meta {\n color: var(--muted); font-size: 12px; letter-spacing: .04em;\n font-family: var(--ss-mono); margin: 0 0 var(--ss-block); max-width: none;\n }\n .shot-strip { display: flex; flex-wrap: wrap; gap: var(--ss-block); margin: 0; padding: 0; }\n /*\n * A comparison is boxed in a DASHED edge, which is the same distinction the\n * report draws between an observation and a claim: these three images are\n * Playwright's statement about its own baseline, not ours.\n */\n .shot-strip.compare {\n border: 1px dashed var(--line); border-radius: var(--ss-radius-block);\n padding: var(--ss-block);\n }\n .shot { margin: 0; flex: 1 1 22rem; min-width: 0; }\n .shot img {\n display: block; width: 100%; height: auto; border: 1px solid var(--line);\n border-radius: var(--ss-radius-control); background: var(--code-bg);\n /*\n * Capped so one full-page capture of a long page cannot push every other\n * test off the screen. It scales rather than crops, because a visual\n * review tool that hides part of the picture is worse than none. The image\n * links to itself for a full-size look.\n */\n max-height: 28rem; object-fit: contain; object-position: top;\n }\n .shot figcaption {\n font-size: 12px; color: var(--muted); margin-top: .45rem;\n font-family: var(--ss-mono); overflow-wrap: anywhere;\n }\n .shot figcaption .role {\n display: block; color: var(--fg); font-weight: 600;\n letter-spacing: .08em; text-transform: uppercase; font-size: 11px;\n }\n .compare-label { font-size: .875rem; font-weight: 600; margin: 0 0 .75rem; max-width: none; }\n";
80
127
  /**
81
128
  * The section, embeddable in any document that includes `SCREENS_CSS`.
82
129
  *
83
- * Takes its heading level as given: `h2` for the section, `h3` per test, which
84
- * is correct both standalone and inside the accessibility report. A section that
85
- * chose its own levels would break the heading order of one of its two homes.
130
+ * Takes its heading level as given: `h2` for the section, `h3` per viewport
131
+ * band, `h4` per test. A section that chose its own levels would break the
132
+ * heading order of whichever document embedded it.
133
+ *
134
+ * The tests sit at `h4` whether or not the bands are rendered. A heading level
135
+ * that moves depending on how many viewports a suite happens to have is a worse
136
+ * contract than one unused level in the outline of a single-viewport run.
86
137
  */
87
138
  export declare function renderScreensSection(input: ScreensInput): string;
88
139
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"screens.d.ts","sourceRoot":"","sources":["../src/screens.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,OAAO,EAAyB,KAAK,SAAS,EAAiB,MAAM,YAAY,CAAC;AAElF;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAwBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,EAAE,CA8BxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,uwCAqBvB,CAAC;AA2GF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAuChE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAwD7D"}
1
+ {"version":3,"file":"screens.d.ts","sourceRoot":"","sources":["../src/screens.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,OAAO,EAAyB,KAAK,SAAS,EAAiB,MAAM,YAAY,CAAC;AAClF,OAAO,EAKL,KAAK,YAAY,EAElB,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB;;;;;;;;;;;;;;;OAeG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAsBD;;;;;;;;;GASG;AACH;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,UAAU,EAAE,CAWpE;AAqCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,EAAE,CA+BxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,2iHA8EvB,CAAC;AAqLF;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CA2FhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAsC7D"}
package/dist/screens.js CHANGED
@@ -1,8 +1,52 @@
1
1
  import { relative, sep } from 'node:path';
2
- import { BRAND_CSS, MASTHEAD_CSS, masthead } from './brand.js';
2
+ import { BRAND_CSS, MASTHEAD_CSS, SYSTEM_CSS, masthead, viewportLegend } from './brand.js';
3
3
  import { esc } from './escape.js';
4
4
  import { humanInstant, shortCommit } from './human.js';
5
5
  import { groupShots } from './shots.js';
6
+ import { VIEWPORT_BAND_NOTE, groupByBand, viewportBandAnchor, viewportSize, } from './viewports.js';
7
+ /**
8
+ * Every viewport the fixture recorded for one test, sorted widest first.
9
+ *
10
+ * Widest first because that is the order a reader thinks about breakpoints in,
11
+ * and sorting by the STRING would put 1280 before 320 for a reason that is
12
+ * about ASCII rather than about anything.
13
+ */
14
+ function viewportsOf(outcome) {
15
+ const seen = new Map();
16
+ for (const record of outcome.records) {
17
+ if (record.kind !== 'observation')
18
+ continue;
19
+ const viewport = record.observed.viewport;
20
+ if (!viewport)
21
+ continue;
22
+ seen.set(viewportSize(viewport), viewport.width);
23
+ }
24
+ return [...seen].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])).map(([label]) => label);
25
+ }
26
+ export function screenBands(rows) {
27
+ return groupByBand(rows, groupingViewport).groups.map((group) => ({
28
+ band: group.band,
29
+ anchor: viewportBandAnchor(group.band),
30
+ sizes: group.sizes,
31
+ tests: group.items.length,
32
+ captures: group.items.reduce((total, row) => total + row.groups.reduce((n, g) => n + g.shots.length, 0), 0),
33
+ }));
34
+ }
35
+ function groupingViewport(row) {
36
+ let narrowest;
37
+ for (const label of row.viewports) {
38
+ const parts = label.split('\u00d7').map((part) => Number.parseInt(part, 10));
39
+ const width = parts[0];
40
+ const height = parts[1];
41
+ if (width === undefined || height === undefined)
42
+ continue;
43
+ if (!Number.isFinite(width) || !Number.isFinite(height))
44
+ continue;
45
+ if (!narrowest || width < narrowest.width)
46
+ narrowest = { width, height };
47
+ }
48
+ return narrowest;
49
+ }
6
50
  const ROLE_LABEL = {
7
51
  expected: 'Expected (committed baseline)',
8
52
  previous: 'Previous attempt',
@@ -49,6 +93,7 @@ export function screenRows(outcomes) {
49
93
  status: outcome.status,
50
94
  retry: outcome.retry,
51
95
  groups: groupShots(shots),
96
+ viewports: viewportsOf(outcome),
52
97
  });
53
98
  }
54
99
  const rank = (row) => {
@@ -90,15 +135,66 @@ export function shotSrc(runDir, path) {
90
135
  * twice.
91
136
  */
92
137
  export const SCREENS_CSS = `
93
- .shot-test { border: 1px solid var(--line); border-radius: 8px; padding: .75rem 1rem; margin: 1rem 0; }
94
- .shot-test > h3 { font-size: 1rem; margin: 0 0 .1rem; overflow-wrap: anywhere; }
95
- .shot-meta { color: var(--muted); font-size: .875rem; margin: 0 0 .75rem; }
96
- .shot-strip { display: flex; flex-wrap: wrap; gap: 1rem; margin: 0; padding: 0; }
97
- .shot-strip.compare { border: 1px dashed var(--line); border-radius: 8px; padding: .75rem; }
138
+ .shot-test {
139
+ border: 1px solid var(--line); border-radius: var(--ss-radius-card);
140
+ padding: var(--ss-block); margin: 0 0 var(--ss-block);
141
+ }
142
+ .shot-test > h4 {
143
+ font-size: var(--ss-h3); line-height: 1.3; letter-spacing: -.012em;
144
+ font-weight: 600; margin: 0 0 8px;
145
+ overflow-wrap: anywhere;
146
+ }
147
+ /*
148
+ * The band heading, and it is a REAL heading rather than a styled div.
149
+ *
150
+ * A reader navigating this page by headings is exactly the reader who wants
151
+ * to jump to the narrow captures, so the grouping has to exist in the
152
+ * outline: h2 for the section, h3 per band, h4 per test. The test heading
153
+ * dropped a level when the bands arrived, which is why it is h4 — the
154
+ * alternative, keeping tests at h3 and drawing the bands as decoration, gives
155
+ * a sighted reader a structure a screen-reader user cannot reach.
156
+ *
157
+ * A single-band run renders flat, and the tests are still h4 rather than
158
+ * jumping back to h3. A heading level that moves depending on how many
159
+ * viewports a suite happens to have is a worse contract than one gap.
160
+ */
161
+ .band-heading {
162
+ display: flex; flex-wrap: wrap; align-items: baseline; gap: 10px;
163
+ margin: var(--ss-stack) 0 var(--ss-block);
164
+ padding-bottom: 8px;
165
+ border-bottom: 1px solid var(--line);
166
+ font-family: var(--ss-mono); font-size: 13px; font-weight: 600;
167
+ letter-spacing: .12em; text-transform: uppercase;
168
+ }
169
+ .band-heading .sizes {
170
+ font-weight: 400; letter-spacing: .04em; text-transform: none;
171
+ color: var(--muted);
172
+ }
173
+ /*
174
+ * The per-test facts, in the mono treatment every machine string in these
175
+ * documents gets: a status word, the viewport the fixture saw, the project,
176
+ * and the test id. The id in particular is a string somebody copies into a
177
+ * --grep, so it is set in the face that makes it copyable. (No backticks in
178
+ * this block: it is inside a template literal and one would end the string.)
179
+ */
180
+ .shot-meta {
181
+ color: var(--muted); font-size: 12px; letter-spacing: .04em;
182
+ font-family: var(--ss-mono); margin: 0 0 var(--ss-block); max-width: none;
183
+ }
184
+ .shot-strip { display: flex; flex-wrap: wrap; gap: var(--ss-block); margin: 0; padding: 0; }
185
+ /*
186
+ * A comparison is boxed in a DASHED edge, which is the same distinction the
187
+ * report draws between an observation and a claim: these three images are
188
+ * Playwright's statement about its own baseline, not ours.
189
+ */
190
+ .shot-strip.compare {
191
+ border: 1px dashed var(--line); border-radius: var(--ss-radius-block);
192
+ padding: var(--ss-block);
193
+ }
98
194
  .shot { margin: 0; flex: 1 1 22rem; min-width: 0; }
99
195
  .shot img {
100
196
  display: block; width: 100%; height: auto; border: 1px solid var(--line);
101
- border-radius: 4px; background: var(--code-bg);
197
+ border-radius: var(--ss-radius-control); background: var(--code-bg);
102
198
  /*
103
199
  * Capped so one full-page capture of a long page cannot push every other
104
200
  * test off the screen. It scales rather than crops, because a visual
@@ -107,9 +203,15 @@ export const SCREENS_CSS = `
107
203
  */
108
204
  max-height: 28rem; object-fit: contain; object-position: top;
109
205
  }
110
- .shot figcaption { font-size: .8125rem; color: var(--muted); margin-top: .35rem; overflow-wrap: anywhere; }
111
- .shot figcaption .role { color: var(--fg); font-weight: 600; }
112
- .compare-label { font-size: .8125rem; font-weight: 600; margin: 0 0 .5rem; }
206
+ .shot figcaption {
207
+ font-size: 12px; color: var(--muted); margin-top: .45rem;
208
+ font-family: var(--ss-mono); overflow-wrap: anywhere;
209
+ }
210
+ .shot figcaption .role {
211
+ display: block; color: var(--fg); font-weight: 600;
212
+ letter-spacing: .08em; text-transform: uppercase; font-size: 11px;
213
+ }
214
+ .compare-label { font-size: .875rem; font-weight: 600; margin: 0 0 .75rem; max-width: none; }
113
215
  `;
114
216
  function shotFigure(runDir, shot, testTitle, labelled) {
115
217
  const src = shotSrc(runDir, shot.path);
@@ -162,6 +264,12 @@ function rowBlock(runDir, row) {
162
264
  `<span class="${STATUS_CLASS[row.status]}">${STATUS_WORD[row.status]}</span>`,
163
265
  ...(row.retry > 0 ? [`retry ${row.retry}`] : []),
164
266
  ...(row.project ? [esc(row.project)] : []),
267
+ /*
268
+ * The viewport sits beside the project rather than in the caption, because
269
+ * it is a fact about the TEST and the captions are facts about files. A
270
+ * suite with a project per breakpoint reads down this column.
271
+ */
272
+ ...(row.viewports.length > 0 ? [row.viewports.join(', ')] : []),
165
273
  ...(row.lane ? [`lane ${esc(row.lane)}`] : []),
166
274
  ].join(' · ');
167
275
  /*
@@ -187,13 +295,15 @@ function rowBlock(runDir, row) {
187
295
  }
188
296
  flush();
189
297
  return ` <article class="shot-test">
190
- <h3>${esc(row.title)}</h3>
298
+ <h4>${esc(row.title)}</h4>
191
299
  <p class="shot-meta">${meta}<br>${esc(row.testId)}</p>
192
300
  ${blocks.join('\n ')}
193
301
  </article>`;
194
302
  }
195
303
  /** How to get captures, for a run that produced none. Shown, never assumed known. */
196
- const HOW_TO_CAPTURE = `<p>Nothing to show: this run produced no screenshots. Setsquare never takes them —
304
+ const HOW_TO_CAPTURE = `<div class="absence">
305
+ <p class="absence__label">Nothing was captured</p>
306
+ <p>This run produced no screenshots. Setsquare never takes them —
197
307
  it indexes the ones Playwright already wrote. Three ways to give it something to index:</p>
198
308
  <ul>
199
309
  <li><code>use: { screenshot: 'on' }</code> in your Playwright config. One capture per test, and no
@@ -205,13 +315,79 @@ const HOW_TO_CAPTURE = `<p>Nothing to show: this run produced no screenshots. Se
205
315
  walkthrough of the flow. The README has the four-line helper.</li>
206
316
  </ul>
207
317
  <p class="muted">An attachment given a <code>body</code> rather than a <code>path</code> stays in
208
- Playwright's memory and never reaches disk, so this sheet cannot link to it.</p>`;
318
+ Playwright's memory and never reaches disk, so this sheet cannot link to it.</p>
319
+ </div>`;
320
+ /**
321
+ * What the sheet can say about viewports, which is less than a reader expects.
322
+ *
323
+ * THE HONEST SHAPE OF THIS FEATURE. "Show me the tablet and phone screens" is a
324
+ * reasonable thing to ask a visual review page, and the answer is that this one
325
+ * cannot produce them. Setsquare takes no screenshot and writes no image — that
326
+ * is `shots.ts`'s whole posture and the reason the free layer holds no pixels —
327
+ * so a capture at 768px exists on this page if and only if the suite already ran
328
+ * a page at 768px and Playwright already wrote the file. Adding a resize-and-
329
+ * capture helper would move responsibility for an unmasked capture from the
330
+ * customer's config into our code, which is the one thing that module exists to
331
+ * prevent.
332
+ *
333
+ * What the SDK CAN do is stop the reader inferring coverage that is not there.
334
+ * A sheet of desktop captures with nothing said about it reads as "the run
335
+ * looked at the site"; a sheet that names its one viewport reads as what it is.
336
+ * So: name the viewports when there are several, and say so plainly when there
337
+ * is one — with the four lines of config that would change it, because the
338
+ * fix is the customer's to make and they should not have to go looking for it.
339
+ *
340
+ * Absent entirely when the fixture recorded no viewport at all: a run driving a
341
+ * real device controls none, and "no narrow viewport" would be a claim about a
342
+ * measurement nobody took.
343
+ */
344
+ function viewportNote(rows) {
345
+ const widths = new Map();
346
+ for (const row of rows) {
347
+ for (const label of row.viewports) {
348
+ const width = Number.parseInt(label, 10);
349
+ if (Number.isFinite(width))
350
+ widths.set(label, width);
351
+ }
352
+ }
353
+ if (widths.size === 0)
354
+ return '';
355
+ const labels = [...widths]
356
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
357
+ .map(([label]) => label);
358
+ const measured = `The viewport beside each test is the one its page was at when the test ended,
359
+ which is the moment Playwright takes its capture — not the size of any image below, which
360
+ this page never opens.`;
361
+ if (labels.length > 1) {
362
+ // The bands are the headings below; this says what they mean, once.
363
+ const bands = new Map();
364
+ for (const group of groupByBand(rows, groupingViewport).groups) {
365
+ bands.set(group.band.id, group.band);
366
+ }
367
+ return `<p class="muted">Captures from ${labels.length} viewports, grouped below. ${measured}</p>
368
+ ${viewportLegend([...bands.values()], VIEWPORT_BAND_NOTE)}`;
369
+ }
370
+ const only = esc(labels[0]);
371
+ return `<div class="absence">
372
+ <p class="absence__label">One viewport only</p>
373
+ <p>Every test on this page ran at <strong>${only}</strong>, so nothing here is evidence about
374
+ a tablet or a phone. Setsquare takes no screenshots — it indexes the ones Playwright already
375
+ wrote — so it cannot produce a narrow capture your suite did not take. A Playwright project
376
+ per viewport is what does:</p>
377
+ <p><code>{ name: 'tablet', use: { ...devices['Desktop Chrome'], viewport: { width: 768, height: 1024 } } }</code></p>
378
+ <p class="muted">${measured}</p>
379
+ </div>`;
380
+ }
209
381
  /**
210
382
  * The section, embeddable in any document that includes `SCREENS_CSS`.
211
383
  *
212
- * Takes its heading level as given: `h2` for the section, `h3` per test, which
213
- * is correct both standalone and inside the accessibility report. A section that
214
- * chose its own levels would break the heading order of one of its two homes.
384
+ * Takes its heading level as given: `h2` for the section, `h3` per viewport
385
+ * band, `h4` per test. A section that chose its own levels would break the
386
+ * heading order of whichever document embedded it.
387
+ *
388
+ * The tests sit at `h4` whether or not the bands are rendered. A heading level
389
+ * that moves depending on how many viewports a suite happens to have is a worse
390
+ * contract than one unused level in the outline of a single-viewport run.
215
391
  */
216
392
  export function renderScreensSection(input) {
217
393
  const shots = input.rows.reduce((total, row) => total + row.groups.reduce((n, group) => n + group.shots.length, 0), 0);
@@ -226,13 +402,55 @@ export function renderScreensSection(input) {
226
402
  : 'None of them is a comparison — Playwright had no committed baseline to check against.'}</p>
227
403
  <p class="muted">Setsquare compares nothing and stores no baseline. This page shows you what the
228
404
  run saw so a person can spot what automation cannot: nothing here is a pass or a failure.</p>`;
405
+ /*
406
+ * The things this sheet could not show, in the absence device rather than as a
407
+ * muted list. A capture whose file has gone and a capture that never reached
408
+ * disk are gaps in what the reader is looking at, and the whole point of that
409
+ * device is that a gap does not get rendered as a fault or hidden as a
410
+ * footnote.
411
+ */
229
412
  const noteBlock = notes.length > 0
230
- ? `\n <ul class="muted">\n ${notes.map((note) => `<li>${esc(note)}</li>`).join('\n ')}\n </ul>`
413
+ ? `\n <div class="absence">
414
+ <p class="absence__label">Not everything could be shown</p>
415
+ <ul>
416
+ ${notes.map((note) => `<li>${esc(note)}</li>`).join('\n ')}
417
+ </ul>
418
+ </div>`
231
419
  : '';
420
+ /*
421
+ * GROUPED BY BAND, with the run's own order kept inside each one.
422
+ *
423
+ * `screenRows` already put comparisons first, then failures, then run order,
424
+ * and that ranking is about what a reader should see first once they are
425
+ * inside a band. Grouping on top of it answers the question they arrived
426
+ * with — "what did this look like on a phone" — which no amount of ordering
427
+ * could.
428
+ *
429
+ * A single-band run is rendered flat. One heading reading LAPTOP above every
430
+ * card is a label, not a grouping.
431
+ */
432
+ const banded = groupByBand(input.rows, groupingViewport);
433
+ const grouped = banded.groups.length > 1;
434
+ const cards = (rows) => rows.map((row) => rowBlock(input.runDir, row)).join('\n');
435
+ const body = grouped
436
+ ? [
437
+ ...banded.groups.map((group) => ` <h3 class="band-heading" id="${esc(viewportBandAnchor(group.band))}">${esc(group.band.label)}
438
+ <span class="sizes">${group.sizes.map(esc).join(', ')}</span></h3>
439
+ ${cards(group.items)}`),
440
+ ...(banded.unbanded.length > 0
441
+ ? [
442
+ ` <h3 class="band-heading">No viewport recorded</h3>
443
+ ${cards(banded.unbanded)}`,
444
+ ]
445
+ : []),
446
+ ].join('\n')
447
+ : cards(input.rows);
232
448
  return ` <section aria-labelledby="h-screens">
449
+ <p class="eyebrow">Captures</p>
233
450
  <h2 id="h-screens">Screens <span class="muted">(what the run saw)</span></h2>
234
- ${header}${noteBlock}
235
- ${input.rows.map((row) => rowBlock(input.runDir, row)).join('\n')}
451
+ ${header}
452
+ ${viewportNote(input.rows)}${noteBlock}
453
+ ${body}
236
454
  </section>`;
237
455
  }
238
456
  /**
@@ -254,32 +472,14 @@ export function renderScreensPage(input) {
254
472
  <title>Setsquare — screens, ${esc(humanInstant(input.generatedAt))}</title>
255
473
  <style>
256
474
  ${BRAND_CSS}
475
+ ${SYSTEM_CSS}
476
+ ${MASTHEAD_CSS}
257
477
  /*
258
- * The page's own names, mapped onto brand roles. Mapping rather than renaming
259
- * every rule below keeps the diff to this block, and keeps one place to look
260
- * when a role changes.
478
+ * Wider than the report, and deliberately: this page's unit of content is a
479
+ * 22rem image, and two of them side by side is the whole reason it exists.
480
+ * The prose measure from SYSTEM_CSS still caps the paragraphs.
261
481
  */
262
- :root {
263
- --bg: var(--ss-surface); --fg: var(--ss-ink); --muted: var(--ss-ink-muted);
264
- --line: var(--ss-border); --code-bg: var(--ss-surface-raised);
265
- --bad-fg: var(--ss-danger); --good-fg: var(--ss-success);
266
- }
267
- ${MASTHEAD_CSS}
268
- * { box-sizing: border-box; }
269
- body {
270
- margin: 0 auto; padding: 2rem 1.5rem 4rem; max-width: 78rem;
271
- background: var(--bg); color: var(--fg);
272
- font: 16px/1.5 system-ui, -apple-system, "Segoe UI", sans-serif;
273
- }
274
- h1 { font-size: 1.6rem; margin: 0 0 .25rem; }
275
- h2 { font-size: 1.2rem; margin: 2rem 0 .75rem; }
276
- a { color: inherit; }
277
- :focus-visible { outline: 3px solid var(--fg); outline-offset: 2px; }
278
- code { background: var(--code-bg); padding: .1em .35em; border-radius: 4px; font-size: .875em; overflow-wrap: anywhere; }
279
- .muted { color: var(--muted); }
280
- .ok { color: var(--good-fg); }
281
- .bad { color: var(--bad-fg); font-weight: 600; }
282
- footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid var(--line); color: var(--muted); font-size: .875rem; }
482
+ :root { --doc-width: 82rem; }
283
483
  ${SCREENS_CSS}
284
484
  </style>
285
485
  </head>
@@ -1 +1 @@
1
- {"version":3,"file":"screens.js","sourceRoot":"","sources":["../src/screens.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screens.js","sourceRoot":"","sources":["../src/screens.ts"],"names":[],"mappings":"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"}
package/dist/summary.d.ts CHANGED
@@ -157,6 +157,21 @@ export interface SurfaceRow {
157
157
  */
158
158
  incomplete: number;
159
159
  rules: string[];
160
+ /**
161
+ * The same coordinates WITHOUT the viewport.
162
+ *
163
+ * The HTML report groups these rows into a row group per band and prints the
164
+ * band's sizes on its heading, so repeating the size on all thirty-six rows
165
+ * underneath is noise the grouping was supposed to remove. It is only noise
166
+ * where the band holds ONE size, which the renderer knows and this does not —
167
+ * so both strings are carried and the renderer picks.
168
+ */
169
+ shortLabel: string;
170
+ /** The width this row was assessed at, when the run controlled one. */
171
+ viewport?: {
172
+ width: number;
173
+ height: number;
174
+ };
160
175
  }
161
176
  /**
162
177
  * One row per scanned context, worst first.
@@ -193,6 +208,13 @@ export interface EvidenceQuality {
193
208
  export declare function evidenceQuality(envelope: RunIngestRequest): EvidenceQuality;
194
209
  export interface PerfRow {
195
210
  label: string;
211
+ /** The same coordinates without the viewport — see `SurfaceRow.shortLabel`. */
212
+ shortLabel: string;
213
+ /** The width this page load happened at, when the run controlled one. */
214
+ viewport?: {
215
+ width: number;
216
+ height: number;
217
+ };
196
218
  lcpMs?: number;
197
219
  cls?: number;
198
220
  loadMs?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAoBtE,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IACxD;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;CAC9C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,EAAE,CA+CxD;AAID,UAAU,SAAS;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4EAA4E;IAC5E,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD;;;;;OAKG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAYD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EAAE,CAiErE;AASD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,UAAU,EAAE,CAiCpE;AAED,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,GAAG,eAAe,CA4B3E;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAeD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,EAAE,CAqB9D;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,gBAAgB,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,CA4C5F;AAED,wBAAgB,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,CA+B5D;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEjE;AAgCD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAubxE;AA4mBD,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CA6J1D;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;AAEzD,wBAAgB,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAsC3F"}
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"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"}