@plitzi/sdk-dev-tools 0.37.9 → 0.38.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.
Files changed (190) hide show
  1. package/CHANGELOG.md +621 -0
  2. package/dist/DevToolsContainer.d.ts +7 -1
  3. package/dist/DevToolsContainer.mjs +66 -60
  4. package/dist/agentInspector/flowRuns.d.ts +22 -0
  5. package/dist/agentInspector/flowRuns.mjs +26 -0
  6. package/dist/agentInspector/inspector.d.ts +27 -0
  7. package/dist/agentInspector/inspector.mjs +20 -0
  8. package/dist/agentInspector/report.d.ts +36 -0
  9. package/dist/agentInspector/report.mjs +53 -0
  10. package/dist/agentInspector/useAgentInspector.d.ts +15 -0
  11. package/dist/agentInspector/useAgentInspector.mjs +36 -0
  12. package/dist/components/DevToolsOverlay/DevToolsOverlay.d.ts +6 -1
  13. package/dist/components/DevToolsOverlay/DevToolsOverlay.mjs +25 -15
  14. package/dist/components/DevToolsPanel/DevToolsBody.d.ts +3 -1
  15. package/dist/components/DevToolsPanel/DevToolsBody.mjs +35 -31
  16. package/dist/components/DevToolsPanel/DevToolsHeader.d.ts +3 -1
  17. package/dist/components/DevToolsPanel/DevToolsHeader.mjs +20 -10
  18. package/dist/components/DevToolsPanel/DevToolsPanel.d.ts +3 -1
  19. package/dist/components/DevToolsPanel/DevToolsPanel.mjs +25 -23
  20. package/dist/components/DevToolsPanel/DevToolsSubHeader.mjs +41 -45
  21. package/dist/components/DevToolsPanel/tabs/ActionsViewer/ActionsViewer.mjs +10 -10
  22. package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementsViewer.d.ts +4 -0
  23. package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementsViewer.mjs +33 -18
  24. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsAttributes/DetailsAttributes.mjs +16 -0
  25. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsAttributes/index.d.ts +3 -0
  26. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsAttributes/index.mjs +5 -0
  27. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsDefinition/DetailsDefinition.mjs +18 -0
  28. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsDefinition/index.d.ts +3 -0
  29. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsDefinition/index.mjs +5 -0
  30. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRow/DetailsRow.d.ts +8 -0
  31. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRow/DetailsRow.mjs +14 -0
  32. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRow/index.d.ts +3 -0
  33. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRow/index.mjs +5 -0
  34. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRuntime/DetailsRuntime.d.ts +9 -0
  35. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRuntime/DetailsRuntime.mjs +54 -0
  36. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRuntime/index.d.ts +3 -0
  37. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRuntime/index.mjs +5 -0
  38. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsValue/DetailsValue.d.ts +9 -0
  39. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsValue/DetailsValue.mjs +15 -0
  40. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsValue/index.d.ts +3 -0
  41. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsValue/index.mjs +5 -0
  42. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementDetails/ElementDetails.d.ts +7 -0
  43. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementDetails/ElementDetails.mjs +46 -0
  44. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementDetails/index.d.ts +3 -0
  45. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementDetails/index.mjs +5 -0
  46. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementLink/ElementLink.d.ts +7 -0
  47. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementLink/ElementLink.mjs +14 -0
  48. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementLink/index.d.ts +3 -0
  49. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementLink/index.mjs +5 -0
  50. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementsTree/ElementsTree.d.ts +12 -0
  51. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementsTree/ElementsTree.mjs +39 -0
  52. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementsTree/index.d.ts +3 -0
  53. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementsTree/index.mjs +5 -0
  54. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeRow/TreeRow.d.ts +10 -0
  55. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeRow/TreeRow.mjs +36 -0
  56. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeRow/index.d.ts +3 -0
  57. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeRow/index.mjs +5 -0
  58. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeSection/TreeSection.d.ts +13 -0
  59. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeSection/TreeSection.mjs +39 -0
  60. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeSection/index.d.ts +3 -0
  61. package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeSection/index.mjs +5 -0
  62. package/dist/components/DevToolsPanel/tabs/ElementsViewer/helpers/renderTree.d.ts +31 -0
  63. package/dist/components/DevToolsPanel/tabs/ElementsViewer/helpers/renderTree.mjs +61 -0
  64. package/dist/components/DevToolsPanel/tabs/FlagsViewer/FlagSource.d.ts +7 -0
  65. package/dist/components/DevToolsPanel/tabs/FlagsViewer/FlagSource.mjs +23 -0
  66. package/dist/components/DevToolsPanel/tabs/FlagsViewer/FlagsListItem.d.ts +11 -0
  67. package/dist/components/DevToolsPanel/tabs/FlagsViewer/FlagsListItem.mjs +66 -0
  68. package/dist/components/DevToolsPanel/tabs/FlagsViewer/FlagsViewer.d.ts +10 -0
  69. package/dist/components/DevToolsPanel/tabs/FlagsViewer/FlagsViewer.mjs +43 -0
  70. package/dist/components/DevToolsPanel/tabs/FlagsViewer/index.d.ts +3 -0
  71. package/dist/components/DevToolsPanel/tabs/FlagsViewer/index.mjs +5 -0
  72. package/dist/components/DevToolsPanel/tabs/Logs/Log.d.ts +3 -8
  73. package/dist/components/DevToolsPanel/tabs/Logs/Log.mjs +42 -31
  74. package/dist/components/DevToolsPanel/tabs/Logs/Logs.mjs +1 -6
  75. package/dist/components/DevToolsPanel/tabs/Logs/categories/LogInteraction/BodyHeader.mjs +53 -54
  76. package/dist/components/DevToolsPanel/tabs/Logs/categories/LogInteraction/LogInteraction.mjs +17 -17
  77. package/dist/components/DevToolsPanel/tabs/Logs/categories/LogNavigation/LogNavigationBody.mjs +26 -26
  78. package/dist/components/DevToolsPanel/tabs/Logs/categories/LogRealtime/LogRealtime.d.ts +10 -0
  79. package/dist/components/DevToolsPanel/tabs/Logs/categories/LogRealtime/LogRealtime.mjs +58 -0
  80. package/dist/components/DevToolsPanel/tabs/Logs/categories/LogRealtime/index.d.ts +3 -0
  81. package/dist/components/DevToolsPanel/tabs/Logs/categories/LogRealtime/index.mjs +5 -0
  82. package/dist/components/DevToolsPanel/tabs/QaViewer/QaAllChecksButton.d.ts +3 -0
  83. package/dist/components/DevToolsPanel/tabs/QaViewer/QaAllChecksButton.mjs +16 -0
  84. package/dist/components/DevToolsPanel/tabs/QaViewer/QaCheckRow.d.ts +7 -0
  85. package/dist/components/DevToolsPanel/tabs/QaViewer/QaCheckRow.mjs +47 -0
  86. package/dist/components/DevToolsPanel/tabs/QaViewer/QaChecks.d.ts +3 -0
  87. package/dist/components/DevToolsPanel/tabs/QaViewer/QaChecks.mjs +24 -0
  88. package/dist/components/DevToolsPanel/tabs/QaViewer/QaDivider.d.ts +3 -0
  89. package/dist/components/DevToolsPanel/tabs/QaViewer/QaDivider.mjs +5 -0
  90. package/dist/components/DevToolsPanel/tabs/QaViewer/QaFindingItem.d.ts +7 -0
  91. package/dist/components/DevToolsPanel/tabs/QaViewer/QaFindingItem.mjs +32 -0
  92. package/dist/components/DevToolsPanel/tabs/QaViewer/QaInspectorDetails.d.ts +9 -0
  93. package/dist/components/DevToolsPanel/tabs/QaViewer/QaInspectorDetails.mjs +135 -0
  94. package/dist/components/DevToolsPanel/tabs/QaViewer/QaInspectorEmpty.d.ts +3 -0
  95. package/dist/components/DevToolsPanel/tabs/QaViewer/QaInspectorEmpty.mjs +17 -0
  96. package/dist/components/DevToolsPanel/tabs/QaViewer/QaInspectorPanel.d.ts +3 -0
  97. package/dist/components/DevToolsPanel/tabs/QaViewer/QaInspectorPanel.mjs +22 -0
  98. package/dist/components/DevToolsPanel/tabs/QaViewer/QaProperty.d.ts +8 -0
  99. package/dist/components/DevToolsPanel/tabs/QaViewer/QaProperty.mjs +14 -0
  100. package/dist/components/DevToolsPanel/tabs/QaViewer/QaRescanButton.d.ts +3 -0
  101. package/dist/components/DevToolsPanel/tabs/QaViewer/QaRescanButton.mjs +15 -0
  102. package/dist/components/DevToolsPanel/tabs/QaViewer/QaRuleItem.d.ts +7 -0
  103. package/dist/components/DevToolsPanel/tabs/QaViewer/QaRuleItem.mjs +38 -0
  104. package/dist/components/DevToolsPanel/tabs/QaViewer/QaToolChip.d.ts +13 -0
  105. package/dist/components/DevToolsPanel/tabs/QaViewer/QaToolChip.mjs +27 -0
  106. package/dist/components/DevToolsPanel/tabs/QaViewer/QaToolbar.d.ts +3 -0
  107. package/dist/components/DevToolsPanel/tabs/QaViewer/QaToolbar.mjs +58 -0
  108. package/dist/components/DevToolsPanel/tabs/QaViewer/QaViewer.d.ts +8 -0
  109. package/dist/components/DevToolsPanel/tabs/QaViewer/QaViewer.mjs +14 -0
  110. package/dist/components/DevToolsPanel/tabs/QaViewer/QaVisionSelect.d.ts +3 -0
  111. package/dist/components/DevToolsPanel/tabs/QaViewer/QaVisionSelect.mjs +50 -0
  112. package/dist/components/DevToolsPanel/tabs/QaViewer/index.d.ts +3 -0
  113. package/dist/components/DevToolsPanel/tabs/QaViewer/index.mjs +5 -0
  114. package/dist/components/DevToolsPanel/tabs/TracingViewer/TracingViewer.mjs +31 -31
  115. package/dist/components/DevToolsPanel/tabs/VariablesViewer/VariablesStyleList.mjs +7 -10
  116. package/dist/components/DevToolsPanel/tabs/VariablesViewer/VariablesViewer.mjs +12 -12
  117. package/dist/highlight/index.d.ts +2 -0
  118. package/dist/highlight/index.mjs +5 -0
  119. package/dist/highlight/useHighlightElement.d.ts +6 -0
  120. package/dist/{components/DevToolsPanel/tabs/TracingViewer → highlight}/useHighlightElement.mjs +1 -1
  121. package/dist/qa/QaContext.d.ts +29 -0
  122. package/dist/qa/QaContext.mjs +73 -0
  123. package/dist/qa/QaLayer.d.ts +9 -0
  124. package/dist/qa/QaLayer.mjs +69 -0
  125. package/dist/qa/checks/contrast.d.ts +6 -0
  126. package/dist/qa/checks/contrast.mjs +23 -0
  127. package/dist/qa/checks/dom.d.ts +15 -0
  128. package/dist/qa/checks/dom.mjs +4 -0
  129. package/dist/qa/checks/headings.d.ts +6 -0
  130. package/dist/qa/checks/headings.mjs +28 -0
  131. package/dist/qa/checks/images.d.ts +6 -0
  132. package/dist/qa/checks/images.mjs +20 -0
  133. package/dist/qa/checks/index.d.ts +15 -0
  134. package/dist/qa/checks/index.mjs +47 -0
  135. package/dist/qa/checks/names.d.ts +9 -0
  136. package/dist/qa/checks/names.mjs +27 -0
  137. package/dist/qa/checks/overflow.d.ts +3 -0
  138. package/dist/qa/checks/overflow.mjs +24 -0
  139. package/dist/qa/checks/targets.d.ts +8 -0
  140. package/dist/qa/checks/targets.mjs +17 -0
  141. package/dist/qa/findings.d.ts +5 -0
  142. package/dist/qa/findings.mjs +11 -0
  143. package/dist/qa/inspect/colour.d.ts +33 -0
  144. package/dist/qa/inspect/colour.mjs +111 -0
  145. package/dist/qa/inspect/describe.d.ts +32 -0
  146. package/dist/qa/inspect/describe.mjs +42 -0
  147. package/dist/qa/inspect/measure.d.ts +20 -0
  148. package/dist/qa/inspect/measure.mjs +23 -0
  149. package/dist/qa/inspect/rules.d.ts +12 -0
  150. package/dist/qa/inspect/rules.mjs +29 -0
  151. package/dist/qa/overlays/QaBoxModel.d.ts +9 -0
  152. package/dist/qa/overlays/QaBoxModel.mjs +49 -0
  153. package/dist/qa/overlays/QaContrastBadge.d.ts +7 -0
  154. package/dist/qa/overlays/QaContrastBadge.mjs +13 -0
  155. package/dist/qa/overlays/QaGrid.d.ts +10 -0
  156. package/dist/qa/overlays/QaGrid.mjs +24 -0
  157. package/dist/qa/overlays/QaInspector.d.ts +7 -0
  158. package/dist/qa/overlays/QaInspector.mjs +50 -0
  159. package/dist/qa/overlays/QaMeasure.d.ts +7 -0
  160. package/dist/qa/overlays/QaMeasure.mjs +39 -0
  161. package/dist/qa/overlays/QaSwatch.d.ts +6 -0
  162. package/dist/qa/overlays/QaSwatch.mjs +11 -0
  163. package/dist/qa/overlays/QaTabOrder.d.ts +6 -0
  164. package/dist/qa/overlays/QaTabOrder.mjs +39 -0
  165. package/dist/qa/overlays/QaTooltip.d.ts +6 -0
  166. package/dist/qa/overlays/QaTooltip.mjs +65 -0
  167. package/dist/qa/overlays/QaViewport.d.ts +10 -0
  168. package/dist/qa/overlays/QaViewport.mjs +27 -0
  169. package/dist/qa/qaCss.d.ts +12 -0
  170. package/dist/qa/qaCss.mjs +45 -0
  171. package/dist/qa/qaSettings.d.ts +38 -0
  172. package/dist/qa/qaSettings.mjs +28 -0
  173. package/dist/qa/tabOrder.d.ts +2 -0
  174. package/dist/qa/tabOrder.mjs +8 -0
  175. package/dist/qa/usePageBox.d.ts +13 -0
  176. package/dist/qa/usePageBox.mjs +23 -0
  177. package/package.json +373 -33
  178. package/dist/components/DevToolsPanel/tabs/ElementsViewer/DetailsAttributes.mjs +0 -19
  179. package/dist/components/DevToolsPanel/tabs/ElementsViewer/DetailsDefinition.mjs +0 -20
  180. package/dist/components/DevToolsPanel/tabs/ElementsViewer/DetailsValue.d.ts +0 -10
  181. package/dist/components/DevToolsPanel/tabs/ElementsViewer/DetailsValue.mjs +0 -31
  182. package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementDetails.d.ts +0 -8
  183. package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementDetails.mjs +0 -21
  184. package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementsList.d.ts +0 -8
  185. package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementsList.mjs +0 -42
  186. package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementsListItem.d.ts +0 -9
  187. package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementsListItem.mjs +0 -24
  188. package/dist/components/DevToolsPanel/tabs/TracingViewer/useHighlightElement.d.ts +0 -2
  189. /package/dist/components/DevToolsPanel/tabs/ElementsViewer/{DetailsAttributes.d.ts → components/DetailsAttributes/DetailsAttributes.d.ts} +0 -0
  190. /package/dist/components/DevToolsPanel/tabs/ElementsViewer/{DetailsDefinition.d.ts → components/DetailsDefinition/DetailsDefinition.d.ts} +0 -0
@@ -3,16 +3,13 @@ import { useMemo as t } from "react";
3
3
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
4
  //#region src/components/DevToolsPanel/tabs/VariablesViewer/VariablesStyleList.tsx
5
5
  var i = ({ variables: i }) => {
6
- let a = t(() => Object.keys(i ?? {}).reduce((e, t) => {
7
- let n = i?.[t];
8
- return n && Object.keys(n).forEach((r) => {
9
- e.push({
10
- name: r,
11
- type: t === "color" ? "color" : "text",
12
- value: n[r]
13
- });
14
- }), e;
15
- }, []), [i]);
6
+ let a = t(() => Object.entries(i ?? {}).reduce((e, [t, n]) => (Object.keys(n).forEach((r) => {
7
+ e.push({
8
+ name: r,
9
+ type: t === "color" ? "color" : "text",
10
+ value: n[r]
11
+ });
12
+ }), e), []), [i]);
16
13
  return a.length === 0 ? /* @__PURE__ */ n("div", {
17
14
  className: "py-4 text-center text-xs text-zinc-400 italic dark:text-zinc-600",
18
15
  children: "No style variables defined"
@@ -1,31 +1,31 @@
1
1
  import e from "./VariablesList.mjs";
2
2
  import t from "./VariablesStyleList.mjs";
3
- import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
- import { useCommonStore as i } from "@plitzi/sdk-shared/store";
3
+ import { useCommonStore as n } from "@plitzi/sdk-shared/store";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
5
  //#region src/components/DevToolsPanel/tabs/VariablesViewer/VariablesViewer.tsx
6
6
  var a = () => {
7
- let [[a, o, s]] = i([
7
+ let [[a, o, s]] = n([
8
8
  "schema.variables",
9
9
  "style.variables",
10
10
  "runtime.sources.variables"
11
11
  ]);
12
- return /* @__PURE__ */ r("div", {
12
+ return /* @__PURE__ */ i("div", {
13
13
  className: "flex w-full flex-col gap-4 overflow-y-auto p-3",
14
- children: [/* @__PURE__ */ r("section", {
14
+ children: [/* @__PURE__ */ i("section", {
15
15
  className: "flex flex-col gap-1.5",
16
- children: [/* @__PURE__ */ r("div", {
16
+ children: [/* @__PURE__ */ i("div", {
17
17
  className: "flex items-center gap-2 text-[10px] font-semibold tracking-wider text-zinc-400 uppercase dark:text-zinc-500",
18
- children: [/* @__PURE__ */ n("i", { className: "fa-solid fa-code" }), "Schema Variables"]
19
- }), /* @__PURE__ */ n(e, {
18
+ children: [/* @__PURE__ */ r("i", { className: "fa-solid fa-code" }), "Schema Variables"]
19
+ }), /* @__PURE__ */ r(e, {
20
20
  variables: a,
21
21
  variablesParsed: s
22
22
  })]
23
- }), /* @__PURE__ */ r("section", {
23
+ }), /* @__PURE__ */ i("section", {
24
24
  className: "flex flex-col gap-1.5",
25
- children: [/* @__PURE__ */ r("div", {
25
+ children: [/* @__PURE__ */ i("div", {
26
26
  className: "flex items-center gap-2 text-[10px] font-semibold tracking-wider text-zinc-400 uppercase dark:text-zinc-500",
27
- children: [/* @__PURE__ */ n("i", { className: "fa-solid fa-palette" }), "Style Variables"]
28
- }), /* @__PURE__ */ n(t, { variables: o })]
27
+ children: [/* @__PURE__ */ r("i", { className: "fa-solid fa-palette" }), "Style Variables"]
28
+ }), /* @__PURE__ */ r(t, { variables: o })]
29
29
  })]
30
30
  });
31
31
  };
@@ -0,0 +1,2 @@
1
+ import { default as useHighlightElement } from './useHighlightElement';
2
+ export default useHighlightElement;
@@ -0,0 +1,5 @@
1
+ import e from "./useHighlightElement.mjs";
2
+ //#region src/highlight/index.ts
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Outlines an element on the page — every copy of it, a list row's elements being one per row — while `id` is set:
3
+ * the one way every tab points at what it is talking about.
4
+ */
5
+ declare const useHighlightElement: (id: string | undefined) => void;
6
+ export default useHighlightElement;
@@ -1,5 +1,5 @@
1
1
  import { useEffect as e } from "react";
2
- //#region src/components/DevToolsPanel/tabs/TracingViewer/useHighlightElement.ts
2
+ //#region src/highlight/useHighlightElement.ts
3
3
  var t = (t) => {
4
4
  e(() => {
5
5
  if (typeof document > "u" || !t) return;
@@ -0,0 +1,29 @@
1
+ import { QaFindings } from './findings';
2
+ import { QaCheck, QaSettings } from './qaSettings';
3
+ import { ReactNode, RefObject } from 'react';
4
+ export interface QaContextValue {
5
+ settings: QaSettings;
6
+ setSetting: <K extends Exclude<keyof QaSettings, 'checks'>>(key: K, value: QaSettings[K]) => void;
7
+ setCheck: (check: QaCheck, on: boolean) => void;
8
+ /** What the checks that are on found, the last time they looked. */
9
+ findings: QaFindings;
10
+ setFindings: (findings: QaFindings) => void;
11
+ /** Bumped to make the checks look again. */
12
+ round: number;
13
+ rescan: () => void;
14
+ /** The page's own box: what the tools draw over and what the checks look in — never the panel. */
15
+ pageRef: RefObject<HTMLElement | null>;
16
+ /** The element the inspector was clicked on, kept in the tab until another is. */
17
+ pinned: Element | undefined;
18
+ setPinned: (element: Element | undefined) => void;
19
+ }
20
+ declare const QaContext: import('react').Context<QaContextValue>;
21
+ export type QaProviderProps = {
22
+ children?: ReactNode;
23
+ pageRef: RefObject<HTMLElement | null>;
24
+ /** The panel is folded away: what works on the page's own clicks and marks its elements stops with it. */
25
+ collapsed: boolean;
26
+ };
27
+ /** The QA tab's settings, kept in this browser, and what its checks found — shared by the tab and the layer. */
28
+ export declare const QaProvider: ({ children, pageRef, collapsed }: QaProviderProps) => import('react').JSX.Element;
29
+ export default QaContext;
@@ -0,0 +1,73 @@
1
+ import { NO_FINDINGS as e } from "./findings.mjs";
2
+ import { QA_DEFAULTS as t } from "./qaSettings.mjs";
3
+ import n from "@plitzi/plitzi-ui/hooks/useStorage";
4
+ import { createContext as r, useCallback as i, useEffect as a, useMemo as o, useState as s } from "react";
5
+ import { jsx as c } from "react/jsx-runtime";
6
+ //#region src/qa/QaContext.tsx
7
+ var l = r({
8
+ settings: t,
9
+ setSetting: () => void 0,
10
+ setCheck: () => void 0,
11
+ findings: e,
12
+ setFindings: () => void 0,
13
+ round: 0,
14
+ rescan: () => void 0,
15
+ pageRef: { current: null },
16
+ pinned: void 0,
17
+ setPinned: () => void 0
18
+ });
19
+ l.displayName = "QaContext";
20
+ var u = ({ children: r, pageRef: u, collapsed: d }) => {
21
+ let [f, p] = n("plitzi-sdk-dev-tools-qa", t), [m, h] = s(e), [g, _] = s(0), [v, y] = s(), b = o(() => ({
22
+ ...t,
23
+ ...f,
24
+ checks: {
25
+ ...t.checks,
26
+ ...f.checks
27
+ }
28
+ }), [f]), x = i((e, t) => p((n) => ({
29
+ ...n,
30
+ [e]: t
31
+ })), [p]), S = i((e, n) => p((r) => ({
32
+ ...r,
33
+ checks: {
34
+ ...t.checks,
35
+ ...r.checks,
36
+ [e]: n
37
+ }
38
+ })), [p]), C = i(() => _((e) => e + 1), []);
39
+ a(() => {
40
+ d && (p((e) => ({
41
+ ...e,
42
+ inspect: !1,
43
+ checks: t.checks
44
+ })), y(void 0));
45
+ }, [d, p]);
46
+ let w = o(() => ({
47
+ settings: b,
48
+ setSetting: x,
49
+ setCheck: S,
50
+ findings: m,
51
+ setFindings: h,
52
+ round: g,
53
+ rescan: C,
54
+ pageRef: u,
55
+ pinned: v,
56
+ setPinned: y
57
+ }), [
58
+ b,
59
+ x,
60
+ S,
61
+ m,
62
+ g,
63
+ C,
64
+ u,
65
+ v
66
+ ]);
67
+ return /* @__PURE__ */ c(l, {
68
+ value: w,
69
+ children: r
70
+ });
71
+ };
72
+ //#endregion
73
+ export { u as QaProvider, l as default };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * What the QA tab has on, applied to the page — mounted with the dev tools whether the panel is open or not, so a
3
+ * tester can fold the panel away and keep the grid.
4
+ *
5
+ * Its rules go in the document's head and its marks on the page's elements, which is where the page is; the grid and
6
+ * the size badge are drawn by React, beside the panel.
7
+ */
8
+ declare const QaLayer: () => import('react').JSX.Element;
9
+ export default QaLayer;
@@ -0,0 +1,69 @@
1
+ import { NO_FINDINGS as e } from "./findings.mjs";
2
+ import { QA_CHECKS as t, QA_FINDING_ATTRIBUTE as n, QA_PAGE_ATTRIBUTE as r, REDUCED_MOTION_CLASS as i, isQaActive as a } from "./qaSettings.mjs";
3
+ import o from "./QaContext.mjs";
4
+ import { CHECKS as s } from "./checks/index.mjs";
5
+ import c from "./overlays/QaGrid.mjs";
6
+ import l from "./overlays/QaInspector.mjs";
7
+ import u from "./overlays/QaTabOrder.mjs";
8
+ import d from "./overlays/QaViewport.mjs";
9
+ import { VISION_MATRIX as f, qaCss as p, visionFilterId as m } from "./qaCss.mjs";
10
+ import h from "./usePageBox.mjs";
11
+ import { use as g, useEffect as _, useMemo as v } from "react";
12
+ import { useCommonStore as y } from "@plitzi/sdk-shared/store";
13
+ import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
14
+ //#region src/qa/QaLayer.tsx
15
+ var C = "http://www.w3.org/2000/svg", w = 250, T = 1e3, E = () => {
16
+ let { settings: E, pageRef: D, round: O, setFindings: k } = g(o), [A] = y("navigation.currentPageId"), j = h(D), M = a(E), N = v(() => p(E), [E]), P = v(() => t.filter((e) => E.checks[e]).join(" "), [E.checks]);
17
+ return _(() => {
18
+ let e = D.current;
19
+ if (e && M) return e.setAttribute(r, ""), () => e.removeAttribute(r);
20
+ }, [M, D]), _(() => {
21
+ if (!N) return;
22
+ let e = document.createElement("style");
23
+ return e.setAttribute("data-plitzi-qa", ""), e.textContent = N, document.head.append(e), () => e.remove();
24
+ }, [N]), _(() => {
25
+ if (E.reducedMotion) return document.documentElement.classList.add(i), () => document.documentElement.classList.remove(i);
26
+ }, [E.reducedMotion]), _(() => {
27
+ let e = E.vision;
28
+ if (e !== "protanopia" && e !== "deuteranopia" && e !== "tritanopia") return;
29
+ let t = document.createElementNS(C, "svg");
30
+ t.setAttribute("aria-hidden", "true"), t.setAttribute("style", "position: absolute; width: 0; height: 0");
31
+ let n = document.createElementNS(C, "filter");
32
+ n.setAttribute("id", m(e));
33
+ let r = document.createElementNS(C, "feColorMatrix");
34
+ return r.setAttribute("type", "matrix"), r.setAttribute("values", f[e]), n.append(r), t.append(n), document.body.append(t), () => t.remove();
35
+ }, [E.vision]), _(() => {
36
+ let r = D.current, i = t.filter((e) => P.split(" ").includes(e));
37
+ if (!r || i.length === 0) {
38
+ k(e);
39
+ return;
40
+ }
41
+ let a = [], o = () => {
42
+ a.forEach((e) => e.removeAttribute(n));
43
+ let t = { ...e };
44
+ for (let e of i) t[e] = s[e].run(r);
45
+ let o = /* @__PURE__ */ new Map();
46
+ i.forEach((e) => t[e].forEach(({ element: t }) => o.set(t, [...o.get(t) ?? [], e]))), o.forEach((e, t) => t.setAttribute(n, e.join(" "))), a = [...o.keys()], k(t);
47
+ }, c, l, u = () => {
48
+ typeof requestIdleCallback == "function" ? l = requestIdleCallback(o, { timeout: T }) : o();
49
+ }, d = () => {
50
+ clearTimeout(c), l !== void 0 && typeof cancelIdleCallback == "function" && cancelIdleCallback(l), c = setTimeout(u, w);
51
+ };
52
+ return d(), window.addEventListener("resize", d), () => {
53
+ clearTimeout(c), l !== void 0 && typeof cancelIdleCallback == "function" && cancelIdleCallback(l), window.removeEventListener("resize", d), a.forEach((e) => e.removeAttribute(n));
54
+ };
55
+ }, [
56
+ P,
57
+ D,
58
+ O,
59
+ A,
60
+ k
61
+ ]), /* @__PURE__ */ S(b, { children: [
62
+ E.grid && /* @__PURE__ */ x(c, { box: j }),
63
+ E.tabOrder && /* @__PURE__ */ x(u, {}),
64
+ E.inspect && /* @__PURE__ */ x(l, {}),
65
+ E.viewport && /* @__PURE__ */ x(d, { box: j })
66
+ ] });
67
+ };
68
+ //#endregion
69
+ export { E as default };
@@ -0,0 +1,6 @@
1
+ import { QaFinding } from './dom';
2
+ /**
3
+ * Lines of text below WCAG AA against what is actually behind them: 4.5:1, or 3:1 for large text. Text over a picture
4
+ * or a gradient is left out — its backdrop is pixels this cannot read — and so is text nobody can see.
5
+ */
6
+ export declare const findLowContrast: (page: Element) => QaFinding[];
@@ -0,0 +1,23 @@
1
+ import { isDrawn as e, ownTextOf as t } from "./dom.mjs";
2
+ import { colourReader as n, contrastRatio as r, isLargeText as i, over as a } from "../inspect/colour.mjs";
3
+ //#region src/qa/checks/contrast.ts
4
+ var o = (o) => {
5
+ let s = o.ownerDocument.defaultView;
6
+ if (!s) return [];
7
+ let c = n();
8
+ return [...o.querySelectorAll("*")].flatMap((n) => {
9
+ if (!t(n) || !e(n)) return [];
10
+ let o = s.getComputedStyle(n);
11
+ if (o.visibility === "hidden" || Number(o.opacity) === 0) return [];
12
+ let l = c.colour(o.color), u = c.backdrop(n);
13
+ if (!l || !u) return [];
14
+ let d = r(a(l, u), u), f = i(parseFloat(o.fontSize), Number(o.fontWeight) || 400) ? 3 : 4.5;
15
+ return d >= f ? [] : [{
16
+ check: "contrast",
17
+ element: n,
18
+ note: `${d.toFixed(2)}:1, needs ${String(f)}:1`
19
+ }];
20
+ });
21
+ };
22
+ //#endregion
23
+ export { o as findLowContrast };
@@ -0,0 +1,15 @@
1
+ import { QaCheck } from '../qaSettings';
2
+ export interface QaFinding {
3
+ check: QaCheck;
4
+ element: Element;
5
+ /** What is wrong with it, in a few words. */
6
+ note: string;
7
+ }
8
+ /** What can be clicked, typed into or followed. */
9
+ export declare const INTERACTIVE = "a[href], button, [role=\"button\"], [role=\"link\"], [role=\"tab\"], input:not([type=\"hidden\"]), select, textarea";
10
+ /** Whether the element takes any room on the screen at all. */
11
+ export declare const isDrawn: (element: Element) => boolean;
12
+ /** Text as it reads: every run of white space one space. */
13
+ export declare const textOf: (node: Node) => string;
14
+ /** The words the element itself holds, not its children's — the line of text that is this element's own. */
15
+ export declare const ownTextOf: (element: Element) => string;
@@ -0,0 +1,4 @@
1
+ //#region src/qa/checks/dom.ts
2
+ var e = "a[href], button, [role=\"button\"], [role=\"link\"], [role=\"tab\"], input:not([type=\"hidden\"]), select, textarea", t = (e) => e.getClientRects().length > 0, n = (e) => (e.textContent ?? "").replace(/\s+/g, " ").trim(), r = (e) => [...e.childNodes].filter((e) => e.nodeType === Node.TEXT_NODE).map(n).join(" ").trim();
3
+ //#endregion
4
+ export { e as INTERACTIVE, t as isDrawn, r as ownTextOf, n as textOf };
@@ -0,0 +1,6 @@
1
+ import { QaFinding } from './dom';
2
+ /**
3
+ * The page's headings as a reader of an outline meets them: one first-level heading, and no level skipped on the way
4
+ * down — a screen reader and a browser agent find their way by it.
5
+ */
6
+ export declare const findHeadingGaps: (page: Element) => QaFinding[];
@@ -0,0 +1,28 @@
1
+ import { isDrawn as e } from "./dom.mjs";
2
+ //#region src/qa/checks/headings.ts
3
+ var t = (e) => {
4
+ let t = /^h([1-6])$/i.exec(e.tagName)?.[1];
5
+ return t ? Number(t) : Number(e.getAttribute("aria-level")) || 2;
6
+ }, n = (n) => {
7
+ let r = [...n.querySelectorAll("h1, h2, h3, h4, h5, h6, [role=\"heading\"]")].filter(e);
8
+ if (r.length === 0) return [];
9
+ let i = [], a = r.filter((e) => t(e) === 1);
10
+ return a.length === 0 && i.push({
11
+ check: "headings",
12
+ element: r[0],
13
+ note: "the page has no h1"
14
+ }), a.slice(1).forEach((e) => i.push({
15
+ check: "headings",
16
+ element: e,
17
+ note: "another h1"
18
+ })), r.forEach((e, n) => {
19
+ let a = t(e), o = n === 0 ? 1 : t(r[n - 1]);
20
+ a > o + 1 && i.push({
21
+ check: "headings",
22
+ element: e,
23
+ note: `h${String(a)} right after h${String(o)}`
24
+ });
25
+ }), i;
26
+ };
27
+ //#endregion
28
+ export { n as findHeadingGaps };
@@ -0,0 +1,6 @@
1
+ import { QaFinding } from './dom';
2
+ /**
3
+ * Pictures whose file does not fit the box they are drawn in, at this screen's density: stretched past their pixels,
4
+ * or several times larger than they are shown.
5
+ */
6
+ export declare const findImageScale: (page: Element) => QaFinding[];
@@ -0,0 +1,20 @@
1
+ import { isDrawn as e } from "./dom.mjs";
2
+ //#region src/qa/checks/images.ts
3
+ var t = 1.25, n = 2.5, r = 800, i = (i) => {
4
+ let a = i.ownerDocument.defaultView?.devicePixelRatio ?? 1;
5
+ return [...i.querySelectorAll("img")].flatMap((i) => {
6
+ if (!i.complete || i.naturalWidth === 0 || !e(i)) return [];
7
+ let o = i.getBoundingClientRect().width * a;
8
+ return o === 0 ? [] : i.naturalWidth * t < o ? [{
9
+ check: "images",
10
+ element: i,
11
+ note: `${String(i.naturalWidth)} px file drawn at ${String(Math.round(o))} px — soft`
12
+ }] : i.naturalWidth > o * n && i.naturalWidth >= r ? [{
13
+ check: "images",
14
+ element: i,
15
+ note: `${String(i.naturalWidth)} px file for ${String(Math.round(o))} px`
16
+ }] : [];
17
+ });
18
+ };
19
+ //#endregion
20
+ export { i as findImageScale };
@@ -0,0 +1,15 @@
1
+ import { QaFinding } from './dom';
2
+ import { QaCheck } from '../qaSettings';
3
+ export type { QaFinding } from './dom';
4
+ /**
5
+ * The QA tab's checks: what a tester looks for by hand on every build, looked for at once on the page as it is drawn.
6
+ * Each is a heuristic over the live DOM, not an audit: it points at what to look at.
7
+ */
8
+ export interface CheckSpec {
9
+ label: string;
10
+ description: string;
11
+ /** Its outline on the page, so two findings on one element can still be told apart. */
12
+ colour: string;
13
+ run: (page: Element) => QaFinding[];
14
+ }
15
+ export declare const CHECKS: Record<QaCheck, CheckSpec>;
@@ -0,0 +1,47 @@
1
+ import { findLowContrast as e } from "./contrast.mjs";
2
+ import { findHeadingGaps as t } from "./headings.mjs";
3
+ import { findImageScale as n } from "./images.mjs";
4
+ import { findUnnamed as r } from "./names.mjs";
5
+ import { findOverflow as i } from "./overflow.mjs";
6
+ import { findSmallTargets as a } from "./targets.mjs";
7
+ //#region src/qa/checks/index.ts
8
+ var o = {
9
+ overflow: {
10
+ label: "Sticks out sideways",
11
+ description: "Whatever reaches past the page’s sides — what makes a phone scroll sideways",
12
+ colour: "#f97316",
13
+ run: i
14
+ },
15
+ names: {
16
+ label: "No accessible name",
17
+ description: "Buttons, links and fields with no words for a screen reader or an agent; pictures with no alt",
18
+ colour: "#e11d48",
19
+ run: r
20
+ },
21
+ targets: {
22
+ label: "Small touch targets",
23
+ description: "Under 24 × 24 px with another control within reach (WCAG 2.2)",
24
+ colour: "#d97706",
25
+ run: a
26
+ },
27
+ contrast: {
28
+ label: "Low contrast",
29
+ description: "Text under 4.5:1 against what is behind it, 3:1 when large (WCAG AA)",
30
+ colour: "#db2777",
31
+ run: e
32
+ },
33
+ images: {
34
+ label: "Image sizes",
35
+ description: "Pictures stretched past their pixels, or files several times bigger than they are shown",
36
+ colour: "#0891b2",
37
+ run: n
38
+ },
39
+ headings: {
40
+ label: "Heading outline",
41
+ description: "No h1, a second one, or a level skipped on the way down",
42
+ colour: "#7c3aed",
43
+ run: t
44
+ }
45
+ };
46
+ //#endregion
47
+ export { o as CHECKS };
@@ -0,0 +1,9 @@
1
+ import { QaFinding } from './dom';
2
+ /**
3
+ * The words assistive technology finds for an element, by the usual order: what `aria-labelledby` points at, its
4
+ * `aria-label`, a field's `<label>`, the text and the `alt` of the pictures inside it, its `title` — and, last, a
5
+ * field's `placeholder`.
6
+ */
7
+ export declare const accessibleName: (element: Element) => string;
8
+ /** A control or a picture a screen reader or a browser agent has no words for. */
9
+ export declare const findUnnamed: (page: Element) => QaFinding[];
@@ -0,0 +1,27 @@
1
+ import { INTERACTIVE as e, isDrawn as t, textOf as n } from "./dom.mjs";
2
+ //#region src/qa/checks/names.ts
3
+ var r = (e) => {
4
+ let t = e.getAttribute("aria-labelledby");
5
+ if (t) {
6
+ let r = t.split(/\s+/).map((t) => e.ownerDocument.getElementById(t)).map((e) => e ? n(e) : "").join(" ").trim();
7
+ if (r) return r;
8
+ }
9
+ let r = e.getAttribute("aria-label")?.trim();
10
+ if (r) return r;
11
+ if ("labels" in e && e.labels instanceof NodeList) {
12
+ let t = [...e.labels].map(n).join(" ").trim();
13
+ if (t) return t;
14
+ }
15
+ let i = [...e.querySelectorAll("img[alt]")].map((e) => e.getAttribute("alt") ?? "").join(" ");
16
+ return `${n(e)} ${i}`.trim() || (e.getAttribute("title")?.trim() ?? e.getAttribute("placeholder")?.trim() ?? "");
17
+ }, i = (n) => [...[...n.querySelectorAll(e)].filter((e) => t(e) && !r(e)).map((e) => ({
18
+ check: "names",
19
+ element: e,
20
+ note: `a ${e.tagName.toLowerCase()} with no name`
21
+ })), ...[...n.querySelectorAll("img:not([alt])")].filter(t).map((e) => ({
22
+ check: "names",
23
+ element: e,
24
+ note: "a picture with no alt"
25
+ }))];
26
+ //#endregion
27
+ export { r as accessibleName, i as findUnnamed };
@@ -0,0 +1,3 @@
1
+ import { QaFinding } from './dom';
2
+ /** Everything sticking out past the page's sides — the outermost of each, not all it holds. */
3
+ export declare const findOverflow: (page: Element) => QaFinding[];
@@ -0,0 +1,24 @@
1
+ import { isDrawn as e } from "./dom.mjs";
2
+ //#region src/qa/checks/overflow.ts
3
+ var t = (e, t) => {
4
+ let n = e.ownerDocument.defaultView;
5
+ for (let r = e.parentElement; r && r !== t; r = r.parentElement) {
6
+ let e = n?.getComputedStyle(r).overflowX;
7
+ if (e && e !== "visible") return !0;
8
+ }
9
+ return !1;
10
+ }, n = (n) => {
11
+ let r = n.getBoundingClientRect(), i = [];
12
+ for (let a of n.querySelectorAll("*")) {
13
+ if (i.some((e) => e.element.contains(a)) || !e(a)) continue;
14
+ let { left: o, right: s, width: c } = a.getBoundingClientRect(), l = Math.max(r.left - o, s - r.right);
15
+ c > 0 && l > 1 && !t(a, n) && i.push({
16
+ check: "overflow",
17
+ element: a,
18
+ note: `${String(Math.round(l))} px past the page`
19
+ });
20
+ }
21
+ return i;
22
+ };
23
+ //#endregion
24
+ export { n as findOverflow };
@@ -0,0 +1,8 @@
1
+ import { QaFinding } from './dom';
2
+ /** The smallest a target may be in both directions (WCAG 2.2 Target Size, Minimum). */
3
+ export declare const MIN_TARGET = 24;
4
+ /**
5
+ * Controls smaller than 24 × 24 px that also fail the rule's spacing exception: a small target passes when a 24 px
6
+ * circle centred on it touches no other target, which is what keeps a column of footer links apart.
7
+ */
8
+ export declare const findSmallTargets: (page: Element) => QaFinding[];
@@ -0,0 +1,17 @@
1
+ import { INTERACTIVE as e, isDrawn as t } from "./dom.mjs";
2
+ //#region src/qa/checks/targets.ts
3
+ var n = 24, r = (e, t, n) => Math.hypot(Math.max(n.left - e, 0, e - n.right), Math.max(n.top - t, 0, t - n.bottom)), i = (n) => {
4
+ let i = n.ownerDocument.defaultView, a = [...n.querySelectorAll(e)].filter((e) => t(e) && i?.getComputedStyle(e).display !== "inline"), o = a.map((e) => e.getBoundingClientRect());
5
+ return a.flatMap((e, t) => {
6
+ let n = o[t];
7
+ if (n.width >= 24 && n.height >= 24) return [];
8
+ let i = n.left + n.width / 2, s = n.top + n.height / 2;
9
+ return o.some((n, o) => o !== t && !e.contains(a[o]) && r(i, s, n) < 12) ? [{
10
+ check: "targets",
11
+ element: e,
12
+ note: `${String(Math.round(n.width))} × ${String(Math.round(n.height))} px, crowded`
13
+ }] : [];
14
+ });
15
+ };
16
+ //#endregion
17
+ export { n as MIN_TARGET, i as findSmallTargets };
@@ -0,0 +1,5 @@
1
+ import { QaFinding } from './checks';
2
+ import { QaCheck } from './qaSettings';
3
+ /** What each check found, the last time it looked. */
4
+ export type QaFindings = Record<QaCheck, QaFinding[]>;
5
+ export declare const NO_FINDINGS: QaFindings;
@@ -0,0 +1,11 @@
1
+ //#region src/qa/findings.ts
2
+ var e = {
3
+ overflow: [],
4
+ names: [],
5
+ targets: [],
6
+ contrast: [],
7
+ images: [],
8
+ headings: []
9
+ };
10
+ //#endregion
11
+ export { e as NO_FINDINGS };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Colours as the page draws them: any CSS colour resolved to RGBA, laid over what is behind it, and the contrast
3
+ * between two of them (WCAG 2).
4
+ */
5
+ export type Rgba = [number, number, number, number];
6
+ /**
7
+ * Any colour the browser accepts — `oklch()`, `color-mix()`, a keyword — as RGBA, by painting one pixel with it: a
8
+ * computed colour is not always `rgb()` any more.
9
+ */
10
+ export declare const toRgba: (css: string) => Rgba | undefined;
11
+ /** One colour laid over another. */
12
+ export declare const over: (top: Rgba, bottom: Rgba) => Rgba;
13
+ /** WCAG 2's contrast ratio, from 1 to 21. */
14
+ export declare const contrastRatio: (first: Rgba, second: Rgba) => number;
15
+ export declare const toHex: ([red, green, blue, alpha]: Rgba) => string;
16
+ export interface ColourReader {
17
+ /** A CSS colour as RGBA — each value painted once. */
18
+ colour: (css: string) => Rgba | undefined;
19
+ /**
20
+ * The colour behind an element: its own background over what is behind its parent, down to the first opaque one or
21
+ * the canvas. Undefined where an image or a gradient is in the way — that backdrop is pixels this cannot read.
22
+ */
23
+ backdrop: (element: Element) => Rgba | undefined;
24
+ }
25
+ /**
26
+ * Colours read for one look at a page. Each colour is painted once and each element's backdrop is worked out once, on
27
+ * its parent's: a check over every line of text would otherwise read the same ancestors thousands of times.
28
+ */
29
+ export declare const colourReader: () => ColourReader;
30
+ /** One element's backdrop, read on its own. */
31
+ export declare const backdropOf: (element: Element) => Rgba | undefined;
32
+ /** Text the size WCAG calls large: 24 px, or 18.66 px in bold — it may get by on 3:1 instead of 4.5:1. */
33
+ export declare const isLargeText: (fontSize: number, fontWeight: number) => boolean;