@setsquare/review-sdk 0.0.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/LICENSE +202 -0
- package/NOTICE +57 -0
- package/README.md +338 -0
- package/THIRD-PARTY-NOTICES.md +61 -0
- package/dist/autoscan.d.ts +25 -0
- package/dist/autoscan.d.ts.map +1 -0
- package/dist/autoscan.js +332 -0
- package/dist/autoscan.js.map +1 -0
- package/dist/axe.d.ts +96 -0
- package/dist/axe.d.ts.map +1 -0
- package/dist/axe.js +210 -0
- package/dist/axe.js.map +1 -0
- package/dist/bin/setsquare.d.ts +3 -0
- package/dist/bin/setsquare.d.ts.map +1 -0
- package/dist/bin/setsquare.js +21 -0
- package/dist/bin/setsquare.js.map +1 -0
- package/dist/brand.d.ts +84 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +335 -0
- package/dist/brand.js.map +1 -0
- package/dist/checks/dynamic.d.ts +57 -0
- package/dist/checks/dynamic.d.ts.map +1 -0
- package/dist/checks/dynamic.js +184 -0
- package/dist/checks/dynamic.js.map +1 -0
- package/dist/checks/rule-pack.d.ts +34 -0
- package/dist/checks/rule-pack.d.ts.map +1 -0
- package/dist/checks/rule-pack.js +270 -0
- package/dist/checks/rule-pack.js.map +1 -0
- package/dist/checks/versions.d.ts +28 -0
- package/dist/checks/versions.d.ts.map +1 -0
- package/dist/checks/versions.js +45 -0
- package/dist/checks/versions.js.map +1 -0
- package/dist/ci.d.ts +37 -0
- package/dist/ci.d.ts.map +1 -0
- package/dist/ci.js +199 -0
- package/dist/ci.js.map +1 -0
- package/dist/contract.d.ts +334 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +35 -0
- package/dist/contract.js.map +1 -0
- package/dist/dedupe.d.ts +79 -0
- package/dist/dedupe.d.ts.map +1 -0
- package/dist/dedupe.js +102 -0
- package/dist/dedupe.js.map +1 -0
- package/dist/document.d.ts +29 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +94 -0
- package/dist/document.js.map +1 -0
- package/dist/envelope.d.ts +124 -0
- package/dist/envelope.d.ts.map +1 -0
- package/dist/envelope.js +337 -0
- package/dist/envelope.js.map +1 -0
- package/dist/escape.d.ts +14 -0
- package/dist/escape.d.ts.map +1 -0
- package/dist/escape.js +20 -0
- package/dist/escape.js.map +1 -0
- package/dist/findings.d.ts +47 -0
- package/dist/findings.d.ts.map +1 -0
- package/dist/findings.js +229 -0
- package/dist/findings.js.map +1 -0
- package/dist/fixture.d.ts +7 -0
- package/dist/fixture.d.ts.map +1 -0
- package/dist/fixture.js +237 -0
- package/dist/fixture.js.map +1 -0
- package/dist/group.d.ts +214 -0
- package/dist/group.d.ts.map +1 -0
- package/dist/group.js +709 -0
- package/dist/group.js.map +1 -0
- package/dist/html-report.d.ts +68 -0
- package/dist/html-report.d.ts.map +1 -0
- package/dist/html-report.js +649 -0
- package/dist/html-report.js.map +1 -0
- package/dist/human.d.ts +65 -0
- package/dist/human.d.ts.map +1 -0
- package/dist/human.js +111 -0
- package/dist/human.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/infer.d.ts +65 -0
- package/dist/infer.d.ts.map +1 -0
- package/dist/infer.js +67 -0
- package/dist/infer.js.map +1 -0
- package/dist/insights.d.ts +140 -0
- package/dist/insights.d.ts.map +1 -0
- package/dist/insights.js +483 -0
- package/dist/insights.js.map +1 -0
- package/dist/install.d.ts +8 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +114 -0
- package/dist/install.js.map +1 -0
- package/dist/links.d.ts +45 -0
- package/dist/links.d.ts.map +1 -0
- package/dist/links.js +45 -0
- package/dist/links.js.map +1 -0
- package/dist/mask.d.ts +85 -0
- package/dist/mask.d.ts.map +1 -0
- package/dist/mask.js +98 -0
- package/dist/mask.js.map +1 -0
- package/dist/observe.d.ts +51 -0
- package/dist/observe.d.ts.map +1 -0
- package/dist/observe.js +233 -0
- package/dist/observe.js.map +1 -0
- package/dist/options.d.ts +249 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +185 -0
- package/dist/options.js.map +1 -0
- package/dist/output.d.ts +113 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +231 -0
- package/dist/output.js.map +1 -0
- package/dist/perf.d.ts +11 -0
- package/dist/perf.d.ts.map +1 -0
- package/dist/perf.js +150 -0
- package/dist/perf.js.map +1 -0
- package/dist/reading-level.d.ts +73 -0
- package/dist/reading-level.d.ts.map +1 -0
- package/dist/reading-level.js +189 -0
- package/dist/reading-level.js.map +1 -0
- package/dist/reporter.d.ts +94 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +709 -0
- package/dist/reporter.js.map +1 -0
- package/dist/rules.d.ts +55 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.js +77 -0
- package/dist/rules.js.map +1 -0
- package/dist/runtime.d.ts +32 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +67 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sanitise.d.ts +116 -0
- package/dist/sanitise.d.ts.map +1 -0
- package/dist/sanitise.js +247 -0
- package/dist/sanitise.js.map +1 -0
- package/dist/scan.d.ts +60 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +246 -0
- package/dist/scan.js.map +1 -0
- package/dist/screens.d.ts +98 -0
- package/dist/screens.d.ts.map +1 -0
- package/dist/screens.js +301 -0
- package/dist/screens.js.map +1 -0
- package/dist/settle.d.ts +65 -0
- package/dist/settle.d.ts.map +1 -0
- package/dist/settle.js +162 -0
- package/dist/settle.js.map +1 -0
- package/dist/shots.d.ts +109 -0
- package/dist/shots.d.ts.map +1 -0
- package/dist/shots.js +113 -0
- package/dist/shots.js.map +1 -0
- package/dist/style.d.ts +47 -0
- package/dist/style.d.ts.map +1 -0
- package/dist/style.js +154 -0
- package/dist/style.js.map +1 -0
- package/dist/suite.d.ts +218 -0
- package/dist/suite.d.ts.map +1 -0
- package/dist/suite.js +219 -0
- package/dist/suite.js.map +1 -0
- package/dist/summary.d.ts +268 -0
- package/dist/summary.d.ts.map +1 -0
- package/dist/summary.js +1308 -0
- package/dist/summary.js.map +1 -0
- package/dist/unscannable.d.ts +75 -0
- package/dist/unscannable.d.ts.map +1 -0
- package/dist/unscannable.js +111 -0
- package/dist/unscannable.js.map +1 -0
- package/dist/versions.d.ts +13 -0
- package/dist/versions.d.ts.map +1 -0
- package/dist/versions.js +39 -0
- package/dist/versions.js.map +1 -0
- package/dist/wcag-map.d.ts +19 -0
- package/dist/wcag-map.d.ts.map +1 -0
- package/dist/wcag-map.js +52 -0
- package/dist/wcag-map.js.map +1 -0
- package/dist/with-setsquare.d.ts +26 -0
- package/dist/with-setsquare.d.ts.map +1 -0
- package/dist/with-setsquare.js +70 -0
- package/dist/with-setsquare.js.map +1 -0
- package/package.json +81 -0
package/dist/brand.js
ADDED
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Setsquare mark and palette, for the artifacts the SDK writes.
|
|
3
|
+
*
|
|
4
|
+
* The report and the contact sheet are the only Setsquare surfaces most
|
|
5
|
+
* customers see before they see the platform, and until now they looked like
|
|
6
|
+
* neither it nor each other: an ad-hoc grey palette invented in
|
|
7
|
+
* `html-report.ts` and a second one in `screens.ts`. This module is the one
|
|
8
|
+
* place either of them gets a colour or a logo from.
|
|
9
|
+
*
|
|
10
|
+
* ## Why the values are copied rather than imported
|
|
11
|
+
*
|
|
12
|
+
* The palette below is a copy of `apps/portal/app/tokens.css`. It has to be: that
|
|
13
|
+
* app is proprietary, is not published, and is not a dependency of this package,
|
|
14
|
+
* so importing it would break the build for every consumer. It was also a licence
|
|
15
|
+
* problem while the published packages were ELv2 and could not take a
|
|
16
|
+
* proprietary dependency; D3 moved everything published to Apache-2.0, so that
|
|
17
|
+
* half of the argument is gone and the build half is the whole reason. A copy nobody
|
|
18
|
+
* checks is a copy that drifts, and drift here is invisible — the report would
|
|
19
|
+
* simply stop matching the product. `brand.test.ts` reads `tokens.css` and
|
|
20
|
+
* fails when the two disagree, which is the same guard `style.ts` uses for its
|
|
21
|
+
* CLI twin.
|
|
22
|
+
*
|
|
23
|
+
* ## Why only verified pairs are used
|
|
24
|
+
*
|
|
25
|
+
* Every value here carries the contrast ratio `tokens.css` measured for it.
|
|
26
|
+
* Nothing in this file invents a tint: a status colour is used either as text
|
|
27
|
+
* on a surface or as a background under its own `-ink`, because those are the
|
|
28
|
+
* pairs that were checked. The moment a new pair is needed it needs measuring,
|
|
29
|
+
* not estimating — this file is consumed by an accessibility report, and a
|
|
30
|
+
* report that fails its own bar is worth nothing.
|
|
31
|
+
*
|
|
32
|
+
* ## The marks are raster, deliberately for now
|
|
33
|
+
*
|
|
34
|
+
* PNG rather than SVG because these are the settled artwork and redrawing the
|
|
35
|
+
* geometry by hand is not this module's job — see
|
|
36
|
+
* `apps/portal/public/brand/README.md`, which records the provenance and the
|
|
37
|
+
* outstanding vector work. They are inlined as data URIs because the report is
|
|
38
|
+
* a single file a customer moves, mails and attaches; a file reference would
|
|
39
|
+
* break the first time it left its directory.
|
|
40
|
+
*
|
|
41
|
+
* Two marks, not one, for the reason the brand README gives: no single colour
|
|
42
|
+
* is 7:1 against both a light and a dark surface, so each theme has its own.
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* Fill `#005698` — 7.54:1 on `#ffffff`, 6.74:1 on `#f2f2f2`.
|
|
46
|
+
*
|
|
47
|
+
* DRIFTED, and knowingly. This raster fill was the light accent until the
|
|
48
|
+
* monochrome sheet re-derived it to `#005392`; the PNG still carries the old
|
|
49
|
+
* value, so the mark is no longer the accent and measures below 7:1 on the raised
|
|
50
|
+
* surface. It is used at 44px as a masthead logo — non-text, so 1.4.11's 3:1 is
|
|
51
|
+
* the applicable floor and it clears that comfortably — which is why this is
|
|
52
|
+
* recorded rather than treated as a release blocker.
|
|
53
|
+
*
|
|
54
|
+
* The fix is the vector redraw, not a recolour: `currentColor` removes the copy
|
|
55
|
+
* that can drift at all. Until then, note that `public/brand/README.md`'s claim
|
|
56
|
+
* that the fill is "checked, not assumed" is not true — nothing asserts it, which
|
|
57
|
+
* is precisely why this went unnoticed.
|
|
58
|
+
*/
|
|
59
|
+
export const MARK_LIGHT = 'data:image/png;base64,' +
|
|
60
|
+
'iVBORw0KGgoAAAANSUhEUgAAAdMAAAHTCAYAAAB8/vKtAAAUgElEQVR42u3da6xlVWHA8fWZYXiMPBQNcr2DJn1EG780sQxz' +
|
|
61
|
+
'O4M0bWOaJl3RapGHFWEKKqDyGmZghtKCdYYZ0YUjEAgQKI/hqWhbFa1trTXatDZpNU1TJfdh7cvMZ8tpz7W7u+ece85de93z' +
|
|
62
|
+
'2L8PvzDjzL33zN5r779rn73XCSGmAABksBEAQEwBQEwBQEwBQEwBADEFADEFADEFADEFAMQUAMQUAMQUAMQUABBTABBTABBT' +
|
|
63
|
+
'ABBTAEBMAUBMAUBMAUBMAQAxBQAxBQAxBQAxBQDEFADEFADEFADEFAAQUwAQUwAQUwAQUwBATAFATAFATAFATAEAMQUAMQUA' +
|
|
64
|
+
'MQUAMQUAxBQAxBQAxHR0Pxti2m7nASCm63dBiOnfQ0zRDgRATNfn10NMP+662E4EQExH92uVmHZcYUcCIKajeVstph1X2ZkA' +
|
|
65
|
+
'iOnwfrVHTDs+bIcCIKbD+eU+Me3YbacCIKZrO39ATDv22bEAiOlg560R0469di4AYtrfziFi2vG7djAAYpoX047b7GQAxPT/' +
|
|
66
|
+
'2zFCTDs+akcDIKZ5Me04ZGcDIKb/a2EdMe240w4HQEzXPzNddbudDoCY/s/M9JigAiCmeTH9UUZM3ZQEQOtjur2BmHoPFQAx' +
|
|
67
|
+
'bSCmHXcZBAC0MabbGoxpx90GAgBimu/TIabjDAgA2hTTYw3HtOMRAwIAM9N8D4eYNhkYAIhpnkcNDADEtJlLvicYIADMckz/' +
|
|
68
|
+
's3BMOx43QAAQ03wPeg8VADF1UxIAYjr2mK7elHS8AQOAmOZf8jVgABDTTEcMGgBmIabbN+DRmEHuMXAAENN891nLFwAxzXe/' +
|
|
69
|
+
'AQTAtMZ0odBC9+vxkMdmABBTa/kC0NKY/njCPBZiOtGAAhDTabFjwmamq561OD6AmE6LnRMY0lVPh5hONrAAxFRM8zxnhgog' +
|
|
70
|
+
'pmKa7ylBBRBTMc131GMzAGIqps08NmOGCiCmYtrAYzM+vg1ATMXUc6gAiKmVkgAQ059465TG1Me3AYipmWlDPmXgAYipmJqh' +
|
|
71
|
+
'AiCmE+EBAxBATMW0mc9D9dgMgJiKaaYnQkybDUYAMRVTnzYDIKYejRm750NMJxmUAGK6Ec6f0ZiufnzbKQYmgJiameb5vKUH' +
|
|
72
|
+
'AcRUTL2HCiCmYjoxQfXxbQBi6m7eTI+HmLYYqABiKqZ5jrrLF0BMxTTfZ0JMpxmwAGLalB0tjGnHs1ZKAhBTM9NmPmBcUAHE' +
|
|
73
|
+
'VEwbCKqBCyCmYprpETNUADH1nmkzd/kKKoCYiqnHZgDEVEwnY3F8QQUQUzFt4OPbfNoMgJiKaQOfNmNxfAAxFdNML1gpCUBM' +
|
|
74
|
+
'xTTfH1scH0BMxbSZS76nG+AAYiqmeb7gpiQAMRXTZt5DdckXQEzFVFABxFRMJ+M51FMNeAAxFdP8oJ5o0AOIqZjmr+UrqABi' +
|
|
75
|
+
'KqaZnjDwAcRUTH0eKoCYiulEeMwBACCm5HvUDBVATGnmPVRBBRBTMj3pA8YBxJR8z4aYTnBQALQjpjuFr5inzFABxJRmZqje' +
|
|
76
|
+
'QwUQUzI9bqUkADGlmcdmHCAAYornUAHEVEwnY+lBBwqAmOI9VAAxFVNr+QKIaYPOF7axeTDEdJwDB2D6Y3qeqI09qA4cADGl' +
|
|
77
|
+
'gaC6yxdATPEcKoCY4jlUADF1N+/MfHyboAJiKqY08GkznkMFxFRMyfSMz0MFxNR7ppihApiZMhGeDjFtcnABYjrZdgjWVCw9' +
|
|
78
|
+
'aIYKiKmZKQ0E1dKDgJiamZLpYTclAWI6mRZEaupmqIIKiKmY0sBdvic74AAxFVOs5QsgpozdPQ46QEwnw/YQ0zFhElQAMRXT' +
|
|
79
|
+
'NrvPwg6AmIop+R5wAAJiOj7bQkw/EqOZcL8ZKiCm44upmenseMiBCIipmJLvwRDT8Q5IQEzFlPygOiABMd3AmIqPm5IAxNTM' +
|
|
80
|
+
'FDNUQEzFlLILO7jLFxDTgs4RUyslAYipmDKcuxykgJi6zEu+TzpQATEVU/J92sEKiKlHY8iXHLCAmIop+Q45aAExFVMEFRBT' +
|
|
81
|
+
'75kyEQ47eAExFVPc5QuIqZgyET7hIAbE1Hum5LvbgQyIqZiS74i1fAExHc128aCH+xzQgJgOb0E4sDg+IKZiSjn3OrABMRVT' +
|
|
82
|
+
'LD0IiKmY4jlUQEzFFJ+HCiCmYGEHQEzFFEEFxFRM8WkzgJhOrh3CwDrtd9ADYiqm5LvRgQ+IqZgiqICYiikTYY8TACCmkO9W' +
|
|
83
|
+
'JwFATCHf7U4EQBtjulMAaNhBJwNATMHCDoCYiumIlmwDa/kCYiqmee4OMe22HcxQATEV0/W7r7stPmlbFHGnkwMgprPvgcr2' +
|
|
84
|
+
'OGJ7FPExJwjAozHtmJkKall3OEkAYjq77u+xXQ7ZLmaogJiK6fDu7bNtDtg2RaSXZ6mbnDAAMZ0t9wzYPnfYPkUccMIAZimm' +
|
|
85
|
+
'v+jE/t/vkQ7aRp+wjYq42UkDENPZ8akhttNB28mnzQBi6jJv/sICbkoSVEBMxbSPj4+wvW61vYrY5wQCTHNMF5zIR4qpoJaz' +
|
|
86
|
+
'30kEENPpdXgd2+0W283noQJiKqZ5MfXYTDl/4GQCYiqm7Ylpx+/bfhO3TwAxFdMpPHEftg0FFRBTJ+387Xi37ejzUAExFdN8' +
|
|
87
|
+
'99uWZqiAmLbVXQ1uz3ttTzNUQEzNfPI9YpuaoQJi6iQtqIIKiKmYjv0EvTnE9LhtO/GX5QExFdOGHCq4fR+0fYu40wkHxFRM' +
|
|
88
|
+
'23Ni3hRiOmobWxwfEFMxzQ/qo7azDxgHZjem252QN+SS4fFuSirmNicfEFMxHb8DG7Stj/MeajEfdQICMRXTdsR01QO2eREf' +
|
|
89
|
+
'cxICMRXTdp2E77Hd3eULuAFJTK3la2EHQEzFdCIuDx6x/QUVEFPvmZqhTqqDTkogpmLanph27vJ92H5wUxIgpmKa/xzqk/ZF' +
|
|
90
|
+
'Eb/n5ARiKqbtiOnqSkkWx7ewAyCmHqdoYIb6nH1SxK1OUiCmYtqeZxNPDDE9b78IKoipmIppni0hps/aN95DBTEVUzHNc0KI' +
|
|
91
|
+
'6Rn7p4jbnbBATC0n2J4l6E7yHqpLviCmYupuXkEVVEBMzUwnwsneQ/XYDIipmIppM3f5eg/VTUkgpmLqMm8DQX3UPnPJF8RU' +
|
|
92
|
+
'TMU0nw8YL2O/ExmIqZi2J6adlZIesu8EFcRUTMft2BTHdJWPbytjnxMaiKmYzv7MtOoR+7CIm5zUQEzFtD0x3Rxiesx+LGK3' +
|
|
93
|
+
'ExuIqZgO5+AMDL7OXb5P2ZdFXO/kBmK6lnOdLGcipqsz1D+0P13yBTEV03E4NEODsDNDfdo+dckXxHRjbXOSnJoVkEaZoR61' +
|
|
94
|
+
'XwUVxFRMxTR/hvqkfVvEHic7EFMxbUdMOza5y7eYG53wQEzFtB0xdZdvWVc56YGYimk7YtpxQojpCfu5iA848YGYdpzjhDjz' +
|
|
95
|
+
'MQ3dz0N93r4u4honPxBTMW1HTFdnqC75lnGtEyCIqZi2Z5BudsnXSkkgpmIqpvmOs1KSlZJATN2AJKZmqJ5DBTEVUzGdCMd7' +
|
|
96
|
+
'DtUHjIOYNsOnxszW2rzruSnJWr4+YBzEVEzFNNNJIaZnjQNBBTEVUzHNs8VzqBbHBzEVUzFtZulBl3zLuMH4AjF1A1J7vCLE' +
|
|
97
|
+
'9IIxYXF8EFMxFdP8S76fNS5c8gUxFVMxzXNKiOlzxkYRtxhfIKZi2h4nu8vXDBXEVEyHddDgHXjJ13uoPg8VxFRMxbSBGar3' +
|
|
98
|
+
'UMvYZXyBmIppu95D/YyxIqggpmIqppYenFRXGl8gpmLaHpvdlFTM+40vEFMxbdcM9Rnjxk1JIKZiKqb5QTVDLeMa4wsxnb4X' +
|
|
99
|
+
'fa6Tl5hmBPWo8VPEtcYXYmpmKqbtemzmOWPI4vjQ9pguOGlZAclKSRNrr/GFmIrptDhs8DYSVM+h+rQZEFMxJdNJPmDcDBXE' +
|
|
100
|
+
'VEzJ1/k81D8yporYY3whpmIqpu1xaojpi8aVGSq4m9cNSAjqpLrN+EJMxVRMXfIl337jCzEV00lzyOAt5rQQ04vGWBEfMb4Q' +
|
|
101
|
+
'UzEV03Zd8v0T48xaviCmbkAiz+neQy3mg8YXYiqm43RMTDfUlhDT58TPDBXE1MyU/JuSBLWMq40vxFRMxbRdKyW9YNyZoYKY' +
|
|
102
|
+
'ejSG/JuSPDZjhgpiKqZ4DnVifdj4QkzFVEzb45SXx+CXjMEiPmR8IaZiKqbtemzmK8ahoIKYWrSBPK8JMX3NWPQeKoipmJI/' +
|
|
103
|
+
'Q/2y8VjENcYXYiqmYtoeZ4SY/sKYFFTEVEzFlDyvCjF91bj0HCpiKqZuQCLPq0NMf2psCipiKqbT46DBa3F8i+ODmIqpmM7y' +
|
|
104
|
+
'JV8z1DJ2GV+IqZi6zNuuGeoXjNMifsf4QkzFVEzNUMl3hfGFmIqpmLbHaSGmF43XIq40vhBTMRXT9nilS76eQ0VMxdQNSDSz' +
|
|
105
|
+
'OP7njdsiPmJ8IaZiKqbt8QpBLeZa4wsxFVOXedvjxBDT88ZvETcYX4jpaBacONIBg3eqZ6g+YNwMFTEVUzNTvIfqPVQQUzFl' +
|
|
106
|
+
'/E41Q7X0IGIqpm5AIt+WENMLxrOFHRBTMRVT8meoPmC8jMuNL8RUTMW0XSslCaqgIqZi6j1TGljL98+Mbe+hIqZiKqbkOV1Q' +
|
|
107
|
+
'reWLmIrpxjlk8M6sM0JMXzXGi7jE+EJMxVRMXfIl38XGF2JqOUExbY9XC2ox7zG+EFMx9Z5pu+7y9QHjZVxkfCGmTgRiKqi4' +
|
|
108
|
+
'5IuYiqmYMuLCDi8a90VcanwhpmJKe7zSXb7F7DK+EFMxpV3PoX7F+BdUxFRMxZT8u3y/5hiwOD5iKqZiSn5Q/8pxYKUkxFRM' +
|
|
109
|
+
'xZQ8Z4WY/tqxYHF8xFRMxZQ8rw0xfdPx4C5fxFRMxZQ8W0NMf+eYKOIy44tZjum5DnIx5f84O8T0bceFm5IQUzEVU/K8IcT0' +
|
|
110
|
+
'N46NIq4zvhBTC93TrvdQPTZTxtXGF2JqZkq77vJ1U1IZ7za+cAOSmNIer/EcajFvN74QUzGlPc4MMX3dsVLEO4wvxFRMaY9X' +
|
|
111
|
+
'eQ+1mHcaX4ipmNKupQf/3DFTxIXGF2IqprTHGYIqqIhp3TYHsJiyrrt8vYdaxnuML8RUTGnXJd+/dPxYyxcxdZlXTMkzF2L6' +
|
|
112
|
+
'lmOoiPcaX2IqplZAol2L4/+t40hQEVMxNXjJ89Mhpr93LBVxkfElpt4zFVPa42wzVHf5IqZiCvl+JsT0D44pQUVM3YAE+Zd8' +
|
|
113
|
+
'/9FxVcQlxpeYiqmY0h5vDjF9x7FVxOXGl5iKqcu8tMdPuSmpmF3Gl5hOmnMcmOmAwUshbwoxfdcxVsTFxpeYiqnLvJihku8C' +
|
|
114
|
+
'40tMxVRMaY83mqG6yxcxnXWHDV426DlUM1R3+SKmYgoNXPI1Q/VpM8zo3bzHxNTgZcO8PsT0bfEr4n3Gl5h6NGZ87jJ4GcNK' +
|
|
115
|
+
'SS75lnGF8SWmYiqmtOs9VDPUMt5vfImpmG68jxu8jPE9VGv5CipiKqbQwCVfa/mW8UHjS0zFVExpj58LMX3PsWiGiphOszsM' +
|
|
116
|
+
'XiZkhvpNx2MRVxpfYiqm5X0jxHRDiOnG7n+vDzFdV3F9V+fPdoeYbnp52+3tujnEdMsIRvn7qz+j+vP21n52/fvt7/Mz+319' +
|
|
117
|
+
'r593S+V7781wUx+9/g2jWP137hvw3321f/vNtX/XzT1+/urvO69xT+W/u7tu7NpT+fNR7Km5qfJ9O7+/OsR0xPEoqIgpgPdQ' +
|
|
118
|
+
'EVOAGXedWImpmALku0GwxNTavAD5rhItMRVTgHxXC5eYiilAvg+Il5iKKYDHZsRUTAF82gxiCjArLhcyMRVTgHyXiZmYiilA' +
|
|
119
|
+
'vksFTUzFFCDfJaImpmIKkO+9wiamlhMEyHeRuImpmALk+22BE1MxBXDJV0zFFMBjM2LqBiQAa/kipgD8xC7BE9O6X3BgAIzs' +
|
|
120
|
+
'QtETUzEFyPdO4RNTMQXI95viJ6ZiCpDvHQIopmIK4JKvmIopgKCKqZgCuMsXMQVAUC3aAICgiqmYAgiqmIopwOx5lziKKQDu' +
|
|
121
|
+
'8hVTMQUwQxVTMQWYFb8llGIKQL5LxVJMAch3mWBatAGAfBeI5mzF9C0GNcBY+LQZM1MABFVMvWcKMBneLqBmpgCYoYqpQQxg' +
|
|
122
|
+
'pSQxFVOAWfFuMRVTAPJdIqZiCoCgtvJu3mMGLoCgiqmZKcAsukhMxRSAfBeLqUUbABBUMQVgIlwgpi7zApDvQjEVUwDyvUtM' +
|
|
123
|
+
'xRSAfL8hpmIKQL63ienk2GZAAkylfwsx/YqYiikAef4jxPRLYjp+2w1GgKn2LyGmt4qpmAKQ54chpgUxFVMA8nx/ZoI6hS/6' +
|
|
124
|
+
'XAMQYGYsz0RQzUwBmIAZ6k4xFVMA8qyEmM4T042zYNABzKR/ntpLvlP4on8+xPRPIaalrsWK5e7/u1np/nrVYu3v1r/2pdr3' +
|
|
125
|
+
'Wcvqz6j+3OXaa/hB5e+t1F7XDyq/Xurxeuq/r37tSo/fr/X1yz0s9fh9/evrliuvv9/3W+nzNfXXu1z772KP/bnY43stVfZX' +
|
|
126
|
+
'9c9Werze6vdYHrAdlmqvYS2LPV7Dcp/Xv9hjW1THy+KA/dbr61f6jPHqdl6sbef69l+uff1Sn22y2GcM9dq+9e+3MuDnLg34' +
|
|
127
|
+
'ty6uMQ6H+fv9/myxx/daHrB/lnr8m5dHeE0vdS0NeZxVv2axzzgbdlssdi+dfn/AsbXY5xz4UsX3hvz6XpYrY7F+PvxhV+d/' +
|
|
128
|
+
'/9fur1e6v/56iOkNYroxXldx1pA6f3eu++u52teu/v7M7u/PrPz9ucqfz3dt7er1+7nuf6tf3+/vz1X+/nztZ/X7+q019e83' +
|
|
129
|
+
'X3vdc2u83l6vv/qaVv/87MrfO7vH188P+f239vj39/vZ9dcx3+PfXv/51X3a799Sfw311zM34Ot7/fuqr7f68+f77N9ev99a' +
|
|
130
|
+
'G59zPf58mP0/Vxvv1fE4P+Bre73+Yb2ux9dXj6v6tui3fes/e619WX8NZ63xNfVtWX8dw/z8uXV8fb/x3O/r53uMo/k+P/+s' +
|
|
131
|
+
'Aftu0Ndv7XMs1LfnXI9jbJjje37A8dPr3NKJ5+u7v+7YLKYA0DY2AgCIKQCIKQCIKQCIKQAgpgAgpgAgpgAgpgCAmAKAmAKA' +
|
|
132
|
+
'mAKAmAIAYgoAYgoAYgoAYgoAiCkAiCkAiCkAiCkAIKYAIKYAIKYAIKYAgJgCgJgCgJgCgJgCAGIKAGIKAGIKAGIKAIgpAIgp' +
|
|
133
|
+
'AIgpAIgpACCmACCmACCmACCmAICYAoCYAsC4/RfP75k2PTnS1AAAAABJRU5ErkJggg==';
|
|
134
|
+
/** Fill `#6bb5fe` — 8.04:1 on the dark surface, 7.02:1 on the dark raised surface. */
|
|
135
|
+
export const MARK_DARK = 'data:image/png;base64,' +
|
|
136
|
+
'iVBORw0KGgoAAAANSUhEUgAAAdUAAAHVCAYAAACnuWH3AAAc3UlEQVR42u3d65NmVX0v8LyeKwRiZK4gKghEFFFBJSRaBpIo' +
|
|
137
|
+
'IgGjgjAzDMxliYqlx0uAAEYEAc9JTupcqs6p809kJZWqXMoYFeXOzDC3HghggnKd69tl2HXWjiub7mGme+3u53n258Wnnqef' +
|
|
138
|
+
'6X766b1/a31n7b322r8WYvo1AGDubAQAEKoAIFQBQKgCAEIVAIQqAAhVABCqAIBQBQChCgBCFQAQqgAgVAFAqAKAUAUAhCoA' +
|
|
139
|
+
'CFUAEKoAIFQBAKEKAEIVAIQqACBUAUCoAoBQBQChCgAIVQAQqgAgVAFAqAIAQhUAhCoACFUAQKgCgFAFAKEKAEIVABCqACBU' +
|
|
140
|
+
'AUCoAgBCFQCEKgAIVQAQqgDApIbqH4SYzrATARCqc3dfiOkfQkwn2ZEACNW5uSXEdCTE9DchplPsTACE6txCdX+I6Zchph+G' +
|
|
141
|
+
'mE61QwEQqrPzlRyobbD+c4jpNDsVAKF6/G7KYVraFmI6x44FQKgen835nGo3WB8MMb3NzgVAqB67TdMEausJl9sAIFTrhGrj' +
|
|
142
|
+
'pyGm0+1kAITqG9v6BqHaeDzEdKYdDYBQPbovHUOoNh4KMb3VzgZAqL7e4vz45WMM1cYO51gBEKqvtyg/3nwcodp40uU2AAjV' +
|
|
143
|
+
'/2zZLEaqrX3OsQIgVH/lhPz4lVmEauMnIaZVdj4AQvVXofrVWYZqex3r2QoAAKE691BtR6wrFQEAQw7VkyqFartAhEX4ARhs' +
|
|
144
|
+
'qC6f4znVrh86xwqAiUp1QrUdsa5WEAAM9ZKamqHa+JFzrAAMLVSX9hCq7S3kHnXbOACGFKrtMoVfqDxSLc+xGrECMIhQbW3p' +
|
|
145
|
+
'KVTby23WKhAAhhKqm3oM1caPQ0xrFAkAQwjVG3oO1XblJedYAZj4UL22M8moL486FAzApIfqdfMUqo3HHAoGYJJD9ep5CNPS' +
|
|
146
|
+
'4yGmdykaACYxVK+Z51BtPBNiep/CAWBSz6nOtx1uGweAUK1nb4jpfAUEwKRNVFoou0NMZykiACYhVNcvcKg2pkJM5ykkAIRq' +
|
|
147
|
+
'HdtCTOcoJgCEar3rWN2PFUCoju2HXzdCodrej3WVogIQqkaqdTwUYnqrwgIQquNm4wiGauMHIaYVigtAqI6TG0cwUA/nxwcs' +
|
|
148
|
+
'wg8gVMfJ5hEM1GZx/4P5638KMa1UZABC1Ui1jodDTKcrNAChOuo2jUGoNn7qUDCAUB11W8ckVBsPClYAoeqcar3JS82I9UxF' +
|
|
149
|
+
'ByBUherc7M+PT4SY3q3wAITqqNkyRqF6OM8KPpyXNBSsAEJ1pIQxC9X9xdf7QkyXKEAAoToqbhqjUJ3uHOueENP7FSGAUB0F' +
|
|
150
|
+
'nx/TUC39W4jpdxQigFA1Uq3j2RDTRxQjgFBdCEvz4xcnJFQbL4SYLlSQAEJ1vi0Zw4lKx+JfQkwfUpQAQtUlNXW8GGL6sMIE' +
|
|
151
|
+
'EKrzZdGEjlRbUyGm8xQngFCdT1snNFTbQ8EXKVAAoTpfI9XNExyqjWdCTO9TpABCdT5Meqi251gvVqgAQrVvNw4gVBs/c7kN' +
|
|
152
|
+
'gFDt28aBhGrj+RDTbytYAKHalxsGFKrtkobNykvLimt1ARCqVWwYWKg2/tU5VgCh6vBv3XOsv6d4AYSqkWodzb1ZP6WAAYRq' +
|
|
153
|
+
'LdcPOFQbL4WYPq6IAYSqiUp1HAoxXaaQAYSqUK03eekDihlAqDr8W8dzIaYPKmgAoSpU69jp7jYAQlWo1l15yYgVQKget/VC' +
|
|
154
|
+
'dFp7QkzvUtwAQtVItV6wvleBAwhVoVrHEyGmMxU5gFAVqnO/frV53O1QMIBQFar1PBliOkuxAwhVoeocK4BQnQcbheVxeSrE' +
|
|
155
|
+
'9FFFDyBUjVTn5kh+/EWI6RKFDyBUjVTreDrEdJHiBxCqpRsF5HE7WKy8dI0GACBUW5uE5HE7XFxu82KI6WMaAYBQFaqzv3a1' +
|
|
156
|
+
'e6PzKzQEAKEqVOv4hRErgFB1TrWeAyGmyzUIgOGG6mZhWNWrIaaPaxQADv9Sj1nBAEKVihOaHAoGcPiXij6rgQAIVeq5UiMB' +
|
|
157
|
+
'GEao3iD0BCuAUHVOddxWYbpMYwEQqtS7jtUCEQATHKruUjO/9ufJS4s1HIDJC1X3U10Y6zQcAId/qbfykkPBABMWqlsE3ILa' +
|
|
158
|
+
'pAEBGKlS74bnZgUDWPyBSl4JMX1SQwIY/1B167fR8HyI6VKNCcDhX+r4eYjp9zUoQKg6/Esdz4WYPqRRAULV7F/m5khezvAX' +
|
|
159
|
+
'IaY/0LAAoeqcKnU8HWL6gMYFCFWhSh3PhJgu0sAAoWqiEnXubDMVYrpAIwOE6nhwP9XRDtXm8d9CTB/W0AChaqRKvUPBF2ps' +
|
|
160
|
+
'gFA1UqWOn4WYfkeDA4Tq6HLrt9G/zKY9FHw4B6slDQGhKlSZo0P5sbmO9Y80PECoOvzL3AL1l8XkJXe3AYTqiNkosMb6tnHr' +
|
|
161
|
+
'NEBAqBqpUs+nNUJAqI4Ga/9Ohhvz/lysQQJC1TKF1BmxClVAqApVKrky79dFGiYgVIUqc1/a8IoQ01INExCqQpU6rtYwAaFq' +
|
|
162
|
+
'9i/1XBViWqKBAkJ1/lhQfxizggGEqlCl4qFgk5cAoeqcKhVs1VABoWqZQuq5VmMFhKqRKvVYKxgQqmb/UsmBENPlGi0gVIUq' +
|
|
163
|
+
'dbwUYvqUhgsIVaHK7B0pVl16IcT0GY0XEKouqaHOzc73h5hu1oABoVrPZkEz2DWCf5lHrFdpxIBQNfuXOiPXg2YFA0JVqFLP' +
|
|
164
|
+
'8/nuNho0IFSFKpVmBf++Bg0IVbN/qXOe9bkQ06UaNSBUjVSpc8mN61gBoWr2LxX9PMT0hxo3IFRdp0odzXWs12jggFB1+Jd6' +
|
|
165
|
+
'awX/sUYOCFUjVerZqKEDQtU5VeotEvFpjR0Qqkd3vcDgOHxOgweEqlCl3oj1Oo0eEKpClXqLRFyp4QNC9fU2CglmOWJtamep' +
|
|
166
|
+
'DgAQqpYppI7bO/UkZAEjVZiDL+YwXZRrarFOATBShdn7po4AEKpGqtSzKY9YlxWjVgAjVZilLToEwCU1UMfBENNndQqAw79Q' +
|
|
167
|
+
'91CwzgEQqlBpxOruNsDgQnW9AEh/G2J6wnbo5bZxDgUDgwrVDTr/9F9fC9YLQ0zbbYvqXgwxfUwnATj8Oxz/M2+LC0JMT9ke' +
|
|
168
|
+
'DgUDQnW2btTpp/9RbI+LjVh78WqI6XKdBWCkOpyRaqs5FDxlu1S33zlWwHWqk+9/T7NdPmTE2pvNOg1AqE6u/zvDtjnXiNV1' +
|
|
169
|
+
'rIBQFarH5/8dZfv83mvb6DnbqBef13kAQnU4odrewuySENO/2k69+JYOBJikULWgfkz/5xi20wdDTI/ZVkasgFA1+/fo/tcx' +
|
|
170
|
+
'bqvzQ0x78s8cst2q+oKOBLCi0uTO/p3JOSGmH+XrLoVhXRt0JoBzqsMK1cbpIabHbTezggGhaqQ6+8O/pfeHmLbZdr34nE4F' +
|
|
171
|
+
'hKqR6uSsqHSs3hti2mv79WKrjgWEqolKwwrVdsS60zbsxdU6FxCq42azzjv95Ry3YbOk4dO2Yy9u1sGAUB0n7lLz/++nOtft' +
|
|
172
|
+
'eEG+jvWw7elyG2C4obpJp53ur7QtrRXcn1tnWO0KEKpGqiPmvorb8xKTl3rz5byNl+h0QKhapnB03VN5mzaL8D9ruzrHCpj9' +
|
|
173
|
+
'O0T39rBdLzN5qdcR6yIdDwhVI9XRdHflbbo0P17s7ja92aLjAaHqnOowQrV0aYjp57ZxdQesvARC1Uh1NH2n4vYsD0ueWExe' +
|
|
174
|
+
'etF2dts4wDKFQnX2TihmqjbB+pxtXV1zC74rdEIgVIXq5B/+bQJ1eXFNZROsL9je1b3sUDAIVYd/J/eSmqO52FrBvXgpxPQJ' +
|
|
175
|
+
'nREIVaG68O6ah+28rLMIv8tt6nslxPRpHRIIVYd/J/Oc6hstEPEz276XQ8GX6pRAqFr8YbIWfzia9hzrR/JhS2FYV3NTg8/q' +
|
|
176
|
+
'mECoOvw73gvqz0YTrHvsg+r2h5gu1zmBUJ1vG3TA6XsLMFJd3DnHKlj74RwrCFUj1TG8n+pcvTvE9LB90cuhYMEKQtUyhfPo' +
|
|
177
|
+
'L0ZkX7wjxPSE/dGL63RUIFRNVJof/22E9kc7Yj1gv1R3pc4KhKrDv8MK1ca5Iabd+bMdtH+qLmloxApC1XWqPfvzEdwvF4aY' +
|
|
178
|
+
'HjFi7SVY1+m0QKgK1ck/pzrdiHWH/dNLsG7QcYFQFar9+MsR3j+/FWJ6yGHgXmYFb9Z5gVA1Uam+/z7i+6iZFfxocY71iH1W' +
|
|
179
|
+
'zZd1YCBUjVQn/5xq11khpgftq+qa/6RcoxMDoWqkOqxQbbz3tQCYsr96sUVHBkLV4g+Ts6LSsbogX8d62H6r7mqdGQhVoTq5' +
|
|
180
|
+
's39ncmqI6QH7zcpLIFRHzyYd6diFauOMENOP7Du3jQOhOlq26EjHMlStFdyvG3RsIFSF6mQsU3g8mtvGbbMPexmxWisYhKrD' +
|
|
181
|
+
'v2NwP9Va2nuyfsCs4N6s18GBUD0eW3WcYxuqS7Lm+UWWNOxFs/byFTo5EKoO/05+qE53Hes++7OXtYJdbgNC1SU1AwvVdsS6' +
|
|
182
|
+
'1z6t7mUjVhCqQvXY3D9hBdmcY33Gfu0lWD+jwwOhejSbdZYTF6qNjwrWXrxkxApC1ezf4YVq45LX9u/z9m91r1ogAoSqw7/D' +
|
|
183
|
+
'CdXlIaZlRbA+bR9Xtz/EtE7nB0LV4d/Xu3cCi3Jp8fy3Xcfam6/rAEGouqRmcmf/zuR9rmPtzWadIAhVh3+HFartdazP2t+9' +
|
|
184
|
+
'+KqOEISqkepwQrVd0vAjrmPtdRH+xTpEcE5VqA6jUNslDc8PMe2233txow4RXFIz9I7wuwMs2vNCTI/a973YoFMEI1Wzf4en' +
|
|
185
|
+
'uR/rdvu/F1/SMYJQFarD824j1t5cq3MEE5Uc/h2e94SYdqmDXgQdJDinKlSH54IQ02NqobdZwTpKcJ2qUB2Ys0NM29RDL76g' +
|
|
186
|
+
'vmAYobpRh5fuUcT/4awQ00NqorojRqwwjFC9XocnVDvOtKRhb25WXyBUheowr2M1ecmhYBCqx2mDTk6ozuAiawVbhB+EqpGq' +
|
|
187
|
+
'UK2nWSv4cTXSi5vUF5ioNIm+o4iP6u0hph+rk17crb5AqLqkZnjeFmL6oVrpxX9RX+Dwr1AdntNCTI+ol158XX2BiUrW/h3m' +
|
|
188
|
+
'5TYPqBlLGoJQnd4NOjOh6jpWSxqCUDVSdfh34TR3t3lC7VR3MMT0OfWFUDVRyUh1mEsa7lQ/Vl4Coerwr1Ct4z0W4Xc/VhCq' +
|
|
189
|
+
'v7Je5yVUKxwKflIdWdIQhGpM1+m4hGqlYHV3m35s6WzrReoNoTq61um0TFSq5B0OBffmNvWFUDX710h1eM4PMT2mpnrxtddq' +
|
|
190
|
+
'dXGIaYk6Q6haUUmoDsd5zrH25tvqC6EqVEfdfYq4ugsEa2++F2I62blVhKpLaoTqsLwzxLRHffXiT9QXQtUlNaPqfkXcmw+G' +
|
|
191
|
+
'mJ5SY73YpL4Qqg7/GqkOz0UhpqfVmXOsIFRNVKKOd5kV3Jsvqy+EqnOqRqrDc3aIaZd6cz9WsKC+UKWO5rZxP1ZzvdisvhCq' +
|
|
192
|
+
'C+9GnZGJSvPs1BDTw+quFzepL4TqwtqiIzJSXQDnhJgeUXvzslYwCNV5tFknJFQXcK3g7eqvF99QXwjVhbFJByRUF9C5IaYH' +
|
|
193
|
+
'1WAvgvpCqBqpuqRmmCNW51itvAQTEapbdTxGqiNyuc0/q0XXsYJQNVKljjcXwXpYXRqxIlQd/h1P9yjikbrc5u9DTEfUZRWH' +
|
|
194
|
+
's0NmBSNUXVIjVIdpVYjpR0asvQTszeoLoWr2r1AdnreEmP4xj7AEYj37Q0zfVF8IVSsq9ekuRTyy51i/rz6rjlTb57eoL4Sq' +
|
|
195
|
+
'BfXdPmt41oaYfmjEWt2BfIcqNYZQdfi3ursV8Ug7LcT0E3VaPVSbxy+pL4Sqw79CdbgjVoFYx8Hi+Qb1hVAVqkJ1mAtE7FSv' +
|
|
196
|
+
'FohAqApVs3+x8tKocygYoeqcqpHqAK1xjtVt4xCqQlWoUs+ZIaYfq91eNKusLQ8xLQ0xLc7UHELVMoXH7DuKeCydEWLapn57' +
|
|
197
|
+
'0V7HukSdIVQtU2ikOqxzrA+o4V7clEesi9QZQvXYuUuNFZXGUXlYsjkU/Ig67sVX1RpC1UhVqA5DOYI6V7AKVoSqUBWqzH3E' +
|
|
198
|
+
'2p73e2eIaYd67sXtM2xzEKpm/zqnOmGWdIL1UTXdi2/kbbxUzSFUZ7ZRZ2H274RpDgXvUde9uMOsYITq0V2vo7Ci0gS6MMS0' +
|
|
199
|
+
'XW334k9DTCeqMYSqUJ3JdxXxxB0Obh7fY63g3tyqzhCq1v41Uh1GoJ4UYlqWJ9Scb/KSRfgRqlZUck6VuU9cWlZMXnpMnfc+' +
|
|
200
|
+
'KxiEqtm/Zv8OxDlWXurFoRDTZ9UXQtXhXyPVYS5p6Bxr/ZudH8pLGqoxhKqRqpHqwLzHiLUXB0JM16kvhKpQNVIdnjeHmP4u' +
|
|
201
|
+
'7/vD6r/qqPUq9YVQ1Rl8WxEPzgkhpr8SqlW9GmJ60TlWhKrOwNq/w9Qst/cP6r+a9j8oR/JVBWoMC+q7TpWBOSXE9Lc5CARj' +
|
|
202
|
+
'PS85FMxQQ9X9VJ1THbpVIabvO8daxZE8G7g9HHy9+sLiD0KV4VmbR6wHBWtVL4eYPqO+cE7VRCWG58RiVvAh7aLKwhCH8uU2' +
|
|
203
|
+
'69UXFn8QqgzPr4eY/jofuhSMcz8UXF7Huk594fCvUGV4mgX5/1676MXn1ReTHqpBQ3dJDa+zOsT0A+dXe/GlfDmTOsPsXyNV' +
|
|
204
|
+
'BuStIaaHtY9efF194Zyq2b8Mz1khpge1kd6C9WQ1xqSF6kaNO31XEXMUZ4SYHtdOevG9aWZgqzlMVBpz9yti3sDZRqy9uSVP' +
|
|
205
|
+
'DmvOsy5WawjV8XevIuYYDwU/qb304k71hXOqQpXhOc/kpd58Md89aLk6w+xfocpkag9HLsua52eGmB7Tbnpxm5rDMoXj7z5F' +
|
|
206
|
+
'zDFoQnVJcSj4IW2nF5tdx4rDvyYqMZyR66L8/O1mBffma2pNqBqpjq+7FTFzOMe6XRvqxRb1JVTHkZuUu06V2R8Obh7fFWLa' +
|
|
207
|
+
'pR314qvqTKg6/GuiEsM5FNyeY/1giGmbttTbrGD1JlTHxg0arYlKzNqSfBlI8/y9IaYp7akXt6o1oWqkKlQZTrC2h4LfGWJ6' +
|
|
208
|
+
'VJty2zisqOTwL8w+VJcU17Sea+Uls4IxUclEJainmby0U9vq7X6sakyouqTG4V8GuAj/Du2rF0F9CVXnVN1PleF5f54VfFg7' +
|
|
209
|
+
'q26r+hKqzqmOpnsUMT06NcT0A+2suuY/Kt9WX0LV4d/Rc5cipmenhZj+UVszKxih6vAv1LHWjc578xX1JVSFqlBleE4PMX0/' +
|
|
210
|
+
'xHRIuzNiZTJD1f1UnZdhfq0KMf1Eu+vttnFqTKiaqLTA7lDELMDlNj81Yu3FNepLqBqpLqw7FTEL4C3Fjc6PaIcut8E51Unx' +
|
|
211
|
+
'p4qYBfKOENMDIaYD2qERK5YpdPgX5u6sENMj2mEvNqovoTrf3PotptsV8dguZL+o+Hpxsah9+bz8/sUj+rc0i/A/oS324lpt' +
|
|
212
|
+
'RagaqZr9y/CcKVh7s0V9CVWhOn8eyLd/a5Yr/LM8cr0l3xi5Od96W37ePt5a/Hvzvd/KwXxXvua1fby7cE9+rfy+P8s/e2c+' +
|
|
213
|
+
'BH1Hfu2Owrfy453F17fnz3Jb/nztZ7w9P28/3y359VuK1xvfLHwjK7/uPt6Sn/9JfryleK38XbcW2+m24nO2n/GO4rF9/q2s' +
|
|
214
|
+
'3HZ35e3wnbzd7s775+58R6F7800Qvpcf782+m91XfN/9xfd0f6b9/vb3fjtv5/Kzl/ug1P27bs+Pbc3c3tketxd/823F335n' +
|
|
215
|
+
'/re2Fv5ae+zNBmElVE1Ugvl1sFhX9mjfdyh/z+H8M6/myUbN4/7874dcMjNybhJYQtVdauZ/ke5J/LsOzXE7TNp2OVI8tsF4' +
|
|
216
|
+
'oPN4eJrvL8O3DNFX8tet/fl7Dk7zXiz8JXTLBZdQFaoAJicKVbN/AawVzDBC9XqNCzDzH6EqVAFqTF5aLMiEqlAFqONmQSZU' +
|
|
217
|
+
'a9moQQGkdZ2+0ehVqApVAPdjFaoLaYOGBPAf1uc1pZcarQpVoQowd18rbsIg5ISqw78A1goWqmb/AoyOrQJOqApVgHquE3JC' +
|
|
218
|
+
'1TlVgHo2Cjqh6pwqQB3NXZ6uEnZCVagC1NHc0u9TAk+ovpH1GgvAMXk53y5T8AnVGV2noQAcF8EqVGe0TgMBOO4R6yeFn1B1' +
|
|
219
|
+
'+BegXrB+RgAKVaEKMDcH8+MrIaZLhaBQdU4VoI4XQkxXC0Kh6pwqQL1gdR2rULVMIUDFQ8JXCEShKlQB6o1YPyYUhx2q12oI' +
|
|
220
|
+
'AFVdKxiFKgB1vOocq4lKANS1WUAaqQJQj/uxuk4VgIq+0Ol3lwlOI1UAZm9T7nOXF/3v4vy4SJA6pwrA8bmpM1IVpkaqAMzB' +
|
|
221
|
+
'+hyqJwhPoQrA3BzOi+4ITxOVAKjkehOWnFMFoJ5vClAjVQDqcaPzCR2pHlHcAAtinSCdnFBdr6ABFtSLIaZPCFOHfwGo45UQ' +
|
|
222
|
+
'04cFqpEqAHX8LMT0UaFqpApAvUPBlwvV8f3wn1PEACPl2RDTxULVSBWAua+41Dz+YsgjVssUAlDb8yGmPxSqRqoA1PFyiOkq' +
|
|
223
|
+
'oWr2LwB1vBBiukyoGqkCUMeBIY1YjVQB6NurIaY/CjEtKW5wvkSojpbrFSrAWI1Yr5zkQB33UN2gSAHGbsT6x5N8P1YjVQDm' +
|
|
224
|
+
'2yahKlQBqLdQxDWTeBh4nD/8jQoTYKzdIFSNVAGo5yqhOho2KkaAsXcorzsgVBfYDYoRYGIut/m4UHVOFYA6XgoxfVqoLvx1' +
|
|
225
|
+
'qocVI8DEBOtlQnVhb1J+UCECzMqR4rzmqHymF3P/LlTn2TV5lHpAwwCYmOtXf5nvx/pJoTq/PhFi2hFieijE9PBrXz8aYnos' +
|
|
226
|
+
'xLQ9xLQtxPRkiGnna//j2fdaAE+FmPbm53uzXdm2/DNPZI/n19rnjxf/tiP/2478+o78szuK37mj+HpXfm13/iy7p7ErPzaf' +
|
|
227
|
+
'aU/x9Z6s/bxT+T3K1/YW77NnGu17dn/nnuI9p4rts2ea72k/057Ov+8q7Clem+7v3dn5ub3TfObptkf5s9P9TU9O83d1n5c/' +
|
|
228
|
+
'137d1sS+zjaYKn73vuJ7G08VP7Ov89mnOj+zt7NNp/LP7+vUY/m9TxWenub3lT/7VOfzPlW8tneGWmi3x1TnPfYW7zNTrbR/' +
|
|
229
|
+
'w55panfnNNu8rNny9+6eZl/smaGWpzrbcbq/a1fRxvdOU7e7O+1pb+fv2d3ZD2X7m66dtK/v63ymbjua6uyrp4ptUf7eqU5b' +
|
|
230
|
+
'nur8vnKbtP3Zk8Xn3NVpYzs6fdD24uvtuX98PD+2fdq2oo/bVvR/TxbvP93f1v5d/5I9E2J6LmueP9t5nCq2wZ7i827v9KE7' +
|
|
231
|
+
'i8cHQky/K1Tn18khpl8PMZ0UYjqxeN68/hshpt8MMZ0SYnpzft54U/66/feTi/dpnJDfo32fk/L3tu/5pvxYvt6+7ynZihDT' +
|
|
232
|
+
'ymxV1jxf3XksX19TPJ4WYlqbn6/NX5+arSleX1V8vTr/++r8b2uL92u/d3XxO8vfv6qwunhcXfyO9jO323NFfv6m/HxF8dop' +
|
|
233
|
+
'nW2xotgmK/J7lq+Xv7/8vKcWf0u7HdZ0PtvKzuduXyu336nFe63u/Pyqzs+t6GyLtZ3fubLz7yuLf+v+rnbfNF+/pfi3U4uf' +
|
|
234
|
+
'X9H5/Gvy43Sff01n/68uvndtZ7+V9VS+T7k918ywHVZ1/uaZ/v5Vne3V7s8109TPmmlqb7rtuXqaz7a2835lLa3s/P41nX28' +
|
|
235
|
+
'eoZ9vrrzN62c5rOt7Wy3NdO8/6rONi639WnF89Wd/VburzUz7K+yDa8q2t/Kom2dUrTJsp9bUbzWPj+56LNOLvqysv9a0ekD' +
|
|
236
|
+
'mr/h9BDT20NMZxbeEWI6K8R0Tojp7M7X7WuNM/K/vS2/V7t9Tyn6zjcXv3tV0Ze9NfezQhWAsba4eL40f708OzE7IX99QvFv' +
|
|
237
|
+
'y/Ni+ScUPzeobad4AECoAoBQBQChCgAIVQAQqgAgVAFAqAIAQhUAhCoACFUAQKgCgFAFAKEKAEIVABCqACBUAUCoAoBQBQCE' +
|
|
238
|
+
'KgAIVQAQqgCAUAUAoQoAQhUAhCoAIFQBQKgCgFAFAKEKAAhVABCqACBUAQChCgBCFQCEKgAIVQBAqAKAUAUAoQoACFUAEKoA' +
|
|
239
|
+
'IFQBQKgCAEfz78Yu1/zasF5UAAAAAElFTkSuQmCC';
|
|
240
|
+
/**
|
|
241
|
+
* The palette, as custom properties, light with a dark override.
|
|
242
|
+
*
|
|
243
|
+
* Role names, never colour names — `--ss-danger`, not `--ss-red` — so the day
|
|
244
|
+
* danger becomes amber there is one line to change. The `ss-` prefix is short
|
|
245
|
+
* for the CSS custom-property namespace only; everything a customer types is
|
|
246
|
+
* still `setsquare` in full.
|
|
247
|
+
*/
|
|
248
|
+
export const BRAND_CSS = `
|
|
249
|
+
:root {
|
|
250
|
+
/* Surfaces. The base is now the LIGHTER of the two, inverted from the
|
|
251
|
+
previous palette, so the raised step is the worse ground here. */
|
|
252
|
+
--ss-surface: #ffffff;
|
|
253
|
+
--ss-surface-raised: #f2f2f2;
|
|
254
|
+
|
|
255
|
+
/* Text, measured against --ss-surface-raised (the worse case in this theme) */
|
|
256
|
+
--ss-ink: #000000; /* 18.76:1 raised, 21.00:1 surface */
|
|
257
|
+
--ss-ink-muted: #4f4f4f; /* 7.32:1 raised, 8.19:1 surface */
|
|
258
|
+
|
|
259
|
+
--ss-border: #8c8c8c; /* 3.00:1 raised — non-text, meets 1.4.11 */
|
|
260
|
+
--ss-grid-line: #d4d4d4; /* 1.32:1 raised — decorative only */
|
|
261
|
+
|
|
262
|
+
--ss-accent: #005392; /* 7.07:1 raised, 7.92:1 surface */
|
|
263
|
+
--ss-accent-ink: #ffffff; /* on accent — 7.92:1 */
|
|
264
|
+
|
|
265
|
+
/* Status roles. Used as text on a surface, or as a fill under their -ink. */
|
|
266
|
+
--ss-danger: #a70019; /* 7.06:1 raised, 7.90:1 surface */
|
|
267
|
+
--ss-danger-ink: #ffffff; /* on danger — 7.90:1 */
|
|
268
|
+
--ss-success: #005f29; /* 7.03:1 raised, 7.87:1 surface */
|
|
269
|
+
--ss-success-ink: #ffffff;/* on success — 7.87:1 */
|
|
270
|
+
--ss-warning: #704a00; /* 7.03:1 raised, 7.87:1 surface */
|
|
271
|
+
--ss-warning-ink: #ffffff;/* on warning — 7.87:1 */
|
|
272
|
+
|
|
273
|
+
--ss-code-bg: #f2f2f2;
|
|
274
|
+
--ss-mark: url('${MARK_LIGHT}');
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
@media (prefers-color-scheme: dark) {
|
|
278
|
+
:root {
|
|
279
|
+
--ss-surface: #0a0a0a;
|
|
280
|
+
--ss-surface-raised: #1a1a1a;
|
|
281
|
+
|
|
282
|
+
/* Measured against --ss-surface-raised, the worse case here. The chromatic
|
|
283
|
+
values are unchanged; the grounds got darker, so every one of them GAINED
|
|
284
|
+
headroom (7.0x -> 8.0x) rather than needing re-derivation. */
|
|
285
|
+
--ss-ink: #ffffff; /* 17.40:1 raised, 19.80:1 surface */
|
|
286
|
+
--ss-ink-muted: #a8a8a8; /* 7.32:1 raised, 8.33:1 surface */
|
|
287
|
+
|
|
288
|
+
--ss-border: #676767; /* 3.08:1 raised */
|
|
289
|
+
--ss-grid-line: #333333; /* 1.38:1 raised — decorative only */
|
|
290
|
+
|
|
291
|
+
--ss-accent: #6bb5fe; /* 8.01:1 raised, 9.11:1 surface */
|
|
292
|
+
--ss-accent-ink: #0b0e11; /* on accent — 8.91:1 */
|
|
293
|
+
|
|
294
|
+
--ss-danger: #fe928a; /* 8.03:1 raised, 9.14:1 surface */
|
|
295
|
+
--ss-danger-ink: #0b0e11; /* on danger — 8.93:1 */
|
|
296
|
+
--ss-success: #62c47b; /* 8.04:1 raised, 9.15:1 surface */
|
|
297
|
+
--ss-success-ink: #0b0e11;/* on success — 8.94:1 */
|
|
298
|
+
--ss-warning: #e9a228; /* 8.01:1 raised, 9.11:1 surface */
|
|
299
|
+
--ss-warning-ink: #0b0e11;/* on warning — 8.91:1 */
|
|
300
|
+
|
|
301
|
+
--ss-code-bg: #1a1a1a;
|
|
302
|
+
--ss-mark: url('${MARK_DARK}');
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
`;
|
|
306
|
+
/**
|
|
307
|
+
* The masthead: mark plus wordmark, shared by both artifacts.
|
|
308
|
+
*
|
|
309
|
+
* The mark is a background image on an empty element with an accessible name
|
|
310
|
+
* rather than an `<img>`, because the two themes need two files and CSS is the
|
|
311
|
+
* only place that choice can be made without shipping both into the DOM.
|
|
312
|
+
* `role="img"` plus `aria-label` keeps it announced; a decorative logo beside a
|
|
313
|
+
* visible product name would be the other defensible call, but the report is
|
|
314
|
+
* often read alone and the name matters.
|
|
315
|
+
*/
|
|
316
|
+
export const masthead = (title, subtitle) => `
|
|
317
|
+
<header class="masthead">
|
|
318
|
+
<div class="mark" role="img" aria-label="Setsquare"></div>
|
|
319
|
+
<div>
|
|
320
|
+
<h1>${title}</h1>
|
|
321
|
+
<p class="muted">${subtitle}</p>
|
|
322
|
+
</div>
|
|
323
|
+
</header>`;
|
|
324
|
+
/** Masthead styling, kept beside the markup that needs it. */
|
|
325
|
+
export const MASTHEAD_CSS = `
|
|
326
|
+
.masthead { display: flex; align-items: center; gap: 1rem; margin: 0 0 1.5rem; }
|
|
327
|
+
.masthead h1 { margin: 0; }
|
|
328
|
+
.masthead p { margin: .25rem 0 0; }
|
|
329
|
+
.mark {
|
|
330
|
+
flex: 0 0 auto; width: 44px; height: 44px;
|
|
331
|
+
background: var(--ss-mark) center / contain no-repeat;
|
|
332
|
+
}
|
|
333
|
+
@media (max-width: 30rem) { .mark { width: 32px; height: 32px; } }
|
|
334
|
+
`;
|
|
335
|
+
//# sourceMappingURL=brand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Page } from '@playwright/test';
|
|
2
|
+
import type { AxeFinding, RuleInapplicable, RulePass } from '@setsquare/schema';
|
|
3
|
+
/**
|
|
4
|
+
* Dynamic checks: the ones that need a browser being driven, not a DOM being
|
|
5
|
+
* read. These do not fit axe's per-node model — one changes the page and
|
|
6
|
+
* watches what breaks, the other reasons about a state the test put the page
|
|
7
|
+
* into — so they run fixture-side and emit findings through the same channel
|
|
8
|
+
* as everything else.
|
|
9
|
+
*
|
|
10
|
+
* Both run only at moments that cannot race the customer's own code: inside
|
|
11
|
+
* an awaited explicit `setsquare.scan()` (the page is single-threaded and the
|
|
12
|
+
* customer's test is awaiting us) and in teardown scans (the test is over).
|
|
13
|
+
* Auto-scans mid-test never run them — injecting styles into a page a test is
|
|
14
|
+
* still asserting against would make us the flake.
|
|
15
|
+
*/
|
|
16
|
+
export declare const SETSQUARE_DYNAMIC_CHECKS_VERSION = "setsquare-dynamic@3";
|
|
17
|
+
export declare const TEXT_SPACING_RULE_ID = "setsquare-text-spacing";
|
|
18
|
+
export declare const STATUS_MESSAGES_RULE_ID = "setsquare-status-messages";
|
|
19
|
+
/**
|
|
20
|
+
* WCAG 1.4.12 Text Spacing (AA), tested the only way it can be: by doing it.
|
|
21
|
+
*
|
|
22
|
+
* The SC's four metrics are normative numbers, applied here from the SC
|
|
23
|
+
* itself (line height 1.5×, spacing after paragraphs 2em, letter spacing
|
|
24
|
+
* 0.12em, word spacing 0.16em — Understanding doc linked as helpUrl): inject
|
|
25
|
+
* a stylesheet applying all four, measure what clips, remove it. A static
|
|
26
|
+
* scanner cannot do this; a browser-driving one can, which is the point.
|
|
27
|
+
*
|
|
28
|
+
* Violation semantics, deliberately: text that becomes unreadable under the
|
|
29
|
+
* normative overrides is a deterministic failure of the SC, not a judgment
|
|
30
|
+
* call. The two-pixel tolerance keeps sub-pixel rounding from manufacturing
|
|
31
|
+
* findings.
|
|
32
|
+
*/
|
|
33
|
+
export interface DynamicCheckEvidence {
|
|
34
|
+
finding?: AxeFinding;
|
|
35
|
+
pass?: RulePass;
|
|
36
|
+
inapplicable?: RuleInapplicable;
|
|
37
|
+
}
|
|
38
|
+
export declare function runTextSpacing(page: Page): Promise<DynamicCheckEvidence>;
|
|
39
|
+
/**
|
|
40
|
+
* WCAG 4.1.3 Status Messages / 3.3.1 Error Identification, the static layer:
|
|
41
|
+
* when the page is IN an error state (the test put it there — this is exactly
|
|
42
|
+
* what `setsquare.scan(page, surface, { state: 'validation-errors' })` exists
|
|
43
|
+
* for), is the error programmatically discoverable?
|
|
44
|
+
*
|
|
45
|
+
* Reads `aria-invalid="true"` fields and checks each is associated with real
|
|
46
|
+
* error text via `aria-describedby` / `aria-errormessage`. All associated →
|
|
47
|
+
* pass evidence for the criterion pair; any orphaned → needs-review, because
|
|
48
|
+
* "the error is only visible, never announced" is precisely the failure a
|
|
49
|
+
* sighted tester cannot see. No error state on the page → nothing, honestly:
|
|
50
|
+
* a page not showing errors is not evidence about how it shows errors.
|
|
51
|
+
*
|
|
52
|
+
* The transition half of 4.1.3 — did content injected after an interaction
|
|
53
|
+
* land in a live region that already existed? — needs interaction-correlated
|
|
54
|
+
* mutation classification and is deliberately not in this version.
|
|
55
|
+
*/
|
|
56
|
+
export declare function runStatusMessages(page: Page): Promise<DynamicCheckEvidence>;
|
|
57
|
+
//# sourceMappingURL=dynamic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic.d.ts","sourceRoot":"","sources":["../../src/checks/dynamic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAKhF;;;;;;;;;;;;GAYG;AAMH,eAAO,MAAM,gCAAgC,wBAAwB,CAAC;AAEtE,eAAO,MAAM,oBAAoB,2BAA2B,CAAC;AAC7D,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AAEnE;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACjC;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoF9E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAqEjF"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { STATUS_MESSAGES_HELP_URL, TEXT_SPACING_HELP_URL } from '../links.js';
|
|
2
|
+
import { sanitiseSelectors } from '../sanitise.js';
|
|
3
|
+
/**
|
|
4
|
+
* Dynamic checks: the ones that need a browser being driven, not a DOM being
|
|
5
|
+
* read. These do not fit axe's per-node model — one changes the page and
|
|
6
|
+
* watches what breaks, the other reasons about a state the test put the page
|
|
7
|
+
* into — so they run fixture-side and emit findings through the same channel
|
|
8
|
+
* as everything else.
|
|
9
|
+
*
|
|
10
|
+
* Both run only at moments that cannot race the customer's own code: inside
|
|
11
|
+
* an awaited explicit `setsquare.scan()` (the page is single-threaded and the
|
|
12
|
+
* customer's test is awaiting us) and in teardown scans (the test is over).
|
|
13
|
+
* Auto-scans mid-test never run them — injecting styles into a page a test is
|
|
14
|
+
* still asserting against would make us the flake.
|
|
15
|
+
*/
|
|
16
|
+
// @3: text-spacing skips visually-hidden elements — the sr-only pattern clips
|
|
17
|
+
// by DESIGN (1px boxes serving screen readers), and flagging it produced a
|
|
18
|
+
// false-positive storm on the first real run: 146 "violations", mostly
|
|
19
|
+
// p.sr-only. @2 added pass evidence and EARL-inapplicable rows.
|
|
20
|
+
export const SETSQUARE_DYNAMIC_CHECKS_VERSION = 'setsquare-dynamic@3';
|
|
21
|
+
export const TEXT_SPACING_RULE_ID = 'setsquare-text-spacing';
|
|
22
|
+
export const STATUS_MESSAGES_RULE_ID = 'setsquare-status-messages';
|
|
23
|
+
export async function runTextSpacing(page) {
|
|
24
|
+
try {
|
|
25
|
+
const probe = await page.evaluate(() => {
|
|
26
|
+
const STYLE_ID = '__setsquare-text-spacing-probe';
|
|
27
|
+
const style = document.createElement('style');
|
|
28
|
+
style.id = STYLE_ID;
|
|
29
|
+
style.textContent =
|
|
30
|
+
'* { line-height: 1.5 !important; letter-spacing: 0.12em !important; ' +
|
|
31
|
+
'word-spacing: 0.16em !important; } ' +
|
|
32
|
+
'p { margin-bottom: 2em !important; }';
|
|
33
|
+
document.head.appendChild(style);
|
|
34
|
+
// Force a synchronous reflow so measurements see the overrides.
|
|
35
|
+
void document.body.offsetHeight;
|
|
36
|
+
const selectors = [];
|
|
37
|
+
let checked = 0;
|
|
38
|
+
const all = document.body.querySelectorAll('*');
|
|
39
|
+
for (let i = 0; i < all.length && selectors.length < 25; i += 1) {
|
|
40
|
+
const el = all[i];
|
|
41
|
+
if (!el.innerText || !el.innerText.trim())
|
|
42
|
+
continue;
|
|
43
|
+
checked += 1;
|
|
44
|
+
const cs = window.getComputedStyle(el);
|
|
45
|
+
// The visually-hidden pattern (sr-only): a ~1px box, absolutely
|
|
46
|
+
// positioned, clipped on purpose so its text reaches screen readers
|
|
47
|
+
// without reaching the screen. Clipping is the mechanism, not a
|
|
48
|
+
// failure — spacing overrides cost its reader nothing.
|
|
49
|
+
const rect = el.getBoundingClientRect();
|
|
50
|
+
if (rect.width <= 2 || rect.height <= 2)
|
|
51
|
+
continue;
|
|
52
|
+
if (cs.clipPath !== 'none' || (cs.clip && cs.clip !== 'auto'))
|
|
53
|
+
continue;
|
|
54
|
+
const clipsX = el.scrollWidth > el.clientWidth + 2;
|
|
55
|
+
const clipsY = el.scrollHeight > el.clientHeight + 2;
|
|
56
|
+
const hides = cs.overflowX === 'hidden' || cs.overflowY === 'hidden' || cs.textOverflow === 'ellipsis';
|
|
57
|
+
if (!hides || !(clipsX || clipsY))
|
|
58
|
+
continue;
|
|
59
|
+
// Leaf-ish elements only: a clipped container flags once, not per child.
|
|
60
|
+
if (el.querySelector('*') && el.children.length > 3)
|
|
61
|
+
continue;
|
|
62
|
+
const id = el.id ? `#${el.id}` : '';
|
|
63
|
+
const cls = el.classList.length > 0 ? `.${el.classList[0]}` : '';
|
|
64
|
+
selectors.push(`${el.tagName.toLowerCase()}${id}${cls}`);
|
|
65
|
+
}
|
|
66
|
+
document.getElementById(STYLE_ID)?.remove();
|
|
67
|
+
return { selectors, checked };
|
|
68
|
+
});
|
|
69
|
+
const wcag = { criteria: ['1.4.12'], level: 'AA', versionTags: [] };
|
|
70
|
+
// A page with no text at all is the inapplicable case; a page whose text
|
|
71
|
+
// survived the overrides is pass evidence. Both are claims worth carrying.
|
|
72
|
+
if (probe.checked === 0) {
|
|
73
|
+
return { inapplicable: { ruleId: TEXT_SPACING_RULE_ID, wcag } };
|
|
74
|
+
}
|
|
75
|
+
if (probe.selectors.length === 0) {
|
|
76
|
+
return { pass: { ruleId: TEXT_SPACING_RULE_ID, nodeCount: probe.checked, wcag } };
|
|
77
|
+
}
|
|
78
|
+
const targets = sanitiseSelectors(probe.selectors);
|
|
79
|
+
return {
|
|
80
|
+
finding: {
|
|
81
|
+
ruleId: TEXT_SPACING_RULE_ID,
|
|
82
|
+
status: 'violation',
|
|
83
|
+
impact: 'serious',
|
|
84
|
+
wcag,
|
|
85
|
+
helpUrl: TEXT_SPACING_HELP_URL,
|
|
86
|
+
evidence: {
|
|
87
|
+
failureSummary: 'Text is clipped when the four WCAG 1.4.12 spacing metrics are applied ' +
|
|
88
|
+
'(line height 1.5, paragraph spacing 2em, letter spacing 0.12em, word spacing 0.16em). ' +
|
|
89
|
+
'Fix: let these containers grow — replace fixed heights and overflow:hidden ' +
|
|
90
|
+
'on text with min-height and wrapping, so spacing overrides reflow instead of clip.',
|
|
91
|
+
},
|
|
92
|
+
targets: { nodeCount: probe.selectors.length, ...targets },
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return {};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* WCAG 4.1.3 Status Messages / 3.3.1 Error Identification, the static layer:
|
|
102
|
+
* when the page is IN an error state (the test put it there — this is exactly
|
|
103
|
+
* what `setsquare.scan(page, surface, { state: 'validation-errors' })` exists
|
|
104
|
+
* for), is the error programmatically discoverable?
|
|
105
|
+
*
|
|
106
|
+
* Reads `aria-invalid="true"` fields and checks each is associated with real
|
|
107
|
+
* error text via `aria-describedby` / `aria-errormessage`. All associated →
|
|
108
|
+
* pass evidence for the criterion pair; any orphaned → needs-review, because
|
|
109
|
+
* "the error is only visible, never announced" is precisely the failure a
|
|
110
|
+
* sighted tester cannot see. No error state on the page → nothing, honestly:
|
|
111
|
+
* a page not showing errors is not evidence about how it shows errors.
|
|
112
|
+
*
|
|
113
|
+
* The transition half of 4.1.3 — did content injected after an interaction
|
|
114
|
+
* land in a live region that already existed? — needs interaction-correlated
|
|
115
|
+
* mutation classification and is deliberately not in this version.
|
|
116
|
+
*/
|
|
117
|
+
export async function runStatusMessages(page) {
|
|
118
|
+
try {
|
|
119
|
+
const state = await page.evaluate(() => {
|
|
120
|
+
const invalid = document.querySelectorAll('[aria-invalid="true"]');
|
|
121
|
+
if (invalid.length === 0)
|
|
122
|
+
return { applicable: false };
|
|
123
|
+
const resolves = (el, attribute) => {
|
|
124
|
+
const ids = (el.getAttribute(attribute) ?? '').split(/\s+/).filter(Boolean);
|
|
125
|
+
return ids.some((id) => {
|
|
126
|
+
const target = document.getElementById(id);
|
|
127
|
+
return Boolean(target && target.textContent && target.textContent.trim());
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
const orphans = [];
|
|
131
|
+
for (let i = 0; i < invalid.length; i += 1) {
|
|
132
|
+
const el = invalid[i];
|
|
133
|
+
if (resolves(el, 'aria-describedby') || resolves(el, 'aria-errormessage'))
|
|
134
|
+
continue;
|
|
135
|
+
const id = el.id ? `#${el.id}` : '';
|
|
136
|
+
const name = el.getAttribute('name');
|
|
137
|
+
orphans.push(`${el.tagName.toLowerCase()}${id}${name ? `[name=${name}]` : ''}`);
|
|
138
|
+
if (orphans.length >= 25)
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
return { applicable: true, total: invalid.length, orphans };
|
|
142
|
+
});
|
|
143
|
+
if (!state.applicable) {
|
|
144
|
+
// No error state on the page: honestly inapplicable, not silently absent.
|
|
145
|
+
// The scanned state contains nothing this check regulates.
|
|
146
|
+
return {
|
|
147
|
+
inapplicable: {
|
|
148
|
+
ruleId: STATUS_MESSAGES_RULE_ID,
|
|
149
|
+
wcag: { criteria: ['3.3.1', '4.1.3'], level: 'A', versionTags: [] },
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
if (state.orphans.length === 0) {
|
|
154
|
+
return {
|
|
155
|
+
pass: {
|
|
156
|
+
ruleId: STATUS_MESSAGES_RULE_ID,
|
|
157
|
+
nodeCount: state.total,
|
|
158
|
+
wcag: { criteria: ['3.3.1', '4.1.3'], level: 'A', versionTags: [] },
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const targets = sanitiseSelectors(state.orphans);
|
|
163
|
+
return {
|
|
164
|
+
finding: {
|
|
165
|
+
ruleId: STATUS_MESSAGES_RULE_ID,
|
|
166
|
+
status: 'incomplete',
|
|
167
|
+
impact: 'serious',
|
|
168
|
+
wcag: { criteria: ['3.3.1', '4.1.3'], level: 'A', versionTags: [] },
|
|
169
|
+
helpUrl: STATUS_MESSAGES_HELP_URL,
|
|
170
|
+
evidence: {
|
|
171
|
+
failureSummary: 'Fields are marked aria-invalid but their error text is not programmatically ' +
|
|
172
|
+
'associated, so the error may be visible without ever being announced. ' +
|
|
173
|
+
'Fix: point aria-describedby (or aria-errormessage) on each field at the id ' +
|
|
174
|
+
'of its error text — then a person confirms it is announced.',
|
|
175
|
+
},
|
|
176
|
+
targets: { nodeCount: state.orphans.length, ...targets },
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return {};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=dynamic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic.js","sourceRoot":"","sources":["../../src/checks/dynamic.ts"],"names":[],"mappings":"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"}
|