@plitzi/sdk-dev-tools 0.37.8 → 0.37.10
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/CHANGELOG.md +829 -0
- package/dist/DevToolsContainer.d.ts +7 -1
- package/dist/DevToolsContainer.mjs +66 -60
- package/dist/agentInspector/flowRuns.d.ts +22 -0
- package/dist/agentInspector/flowRuns.mjs +26 -0
- package/dist/agentInspector/inspector.d.ts +27 -0
- package/dist/agentInspector/inspector.mjs +20 -0
- package/dist/agentInspector/report.d.ts +36 -0
- package/dist/agentInspector/report.mjs +53 -0
- package/dist/agentInspector/useAgentInspector.d.ts +15 -0
- package/dist/agentInspector/useAgentInspector.mjs +36 -0
- package/dist/components/DevToolsOverlay/DevToolsOverlay.d.ts +6 -1
- package/dist/components/DevToolsOverlay/DevToolsOverlay.mjs +25 -15
- package/dist/components/DevToolsPanel/DevToolsBody.d.ts +3 -1
- package/dist/components/DevToolsPanel/DevToolsBody.mjs +35 -31
- package/dist/components/DevToolsPanel/DevToolsHeader.d.ts +3 -1
- package/dist/components/DevToolsPanel/DevToolsHeader.mjs +20 -10
- package/dist/components/DevToolsPanel/DevToolsPanel.d.ts +3 -1
- package/dist/components/DevToolsPanel/DevToolsPanel.mjs +25 -23
- package/dist/components/DevToolsPanel/DevToolsSubHeader.mjs +41 -45
- package/dist/components/DevToolsPanel/tabs/ActionsViewer/ActionsViewer.mjs +10 -10
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementsViewer.d.ts +4 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementsViewer.mjs +33 -18
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsAttributes/DetailsAttributes.mjs +16 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsAttributes/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsAttributes/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsDefinition/DetailsDefinition.mjs +18 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsDefinition/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsDefinition/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRow/DetailsRow.d.ts +8 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRow/DetailsRow.mjs +14 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRow/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRow/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRuntime/DetailsRuntime.d.ts +9 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRuntime/DetailsRuntime.mjs +54 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRuntime/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsRuntime/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsValue/DetailsValue.d.ts +9 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsValue/DetailsValue.mjs +15 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsValue/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/DetailsValue/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementDetails/ElementDetails.d.ts +7 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementDetails/ElementDetails.mjs +46 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementDetails/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementDetails/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementLink/ElementLink.d.ts +7 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementLink/ElementLink.mjs +14 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementLink/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementLink/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementsTree/ElementsTree.d.ts +12 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementsTree/ElementsTree.mjs +39 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementsTree/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/ElementsTree/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeRow/TreeRow.d.ts +10 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeRow/TreeRow.mjs +36 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeRow/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeRow/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeSection/TreeSection.d.ts +13 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeSection/TreeSection.mjs +39 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeSection/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/components/TreeSection/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/helpers/renderTree.d.ts +31 -0
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/helpers/renderTree.mjs +61 -0
- package/dist/components/DevToolsPanel/tabs/FlagsViewer/FlagSource.d.ts +7 -0
- package/dist/components/DevToolsPanel/tabs/FlagsViewer/FlagSource.mjs +23 -0
- package/dist/components/DevToolsPanel/tabs/FlagsViewer/FlagsListItem.d.ts +11 -0
- package/dist/components/DevToolsPanel/tabs/FlagsViewer/FlagsListItem.mjs +66 -0
- package/dist/components/DevToolsPanel/tabs/FlagsViewer/FlagsViewer.d.ts +10 -0
- package/dist/components/DevToolsPanel/tabs/FlagsViewer/FlagsViewer.mjs +43 -0
- package/dist/components/DevToolsPanel/tabs/FlagsViewer/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/FlagsViewer/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/Logs/Log.d.ts +3 -8
- package/dist/components/DevToolsPanel/tabs/Logs/Log.mjs +42 -31
- package/dist/components/DevToolsPanel/tabs/Logs/Logs.mjs +1 -6
- package/dist/components/DevToolsPanel/tabs/Logs/categories/LogInteraction/BodyHeader.mjs +53 -54
- package/dist/components/DevToolsPanel/tabs/Logs/categories/LogInteraction/LogInteraction.mjs +17 -17
- package/dist/components/DevToolsPanel/tabs/Logs/categories/LogNavigation/LogNavigationBody.mjs +26 -26
- package/dist/components/DevToolsPanel/tabs/Logs/categories/LogRealtime/LogRealtime.d.ts +10 -0
- package/dist/components/DevToolsPanel/tabs/Logs/categories/LogRealtime/LogRealtime.mjs +58 -0
- package/dist/components/DevToolsPanel/tabs/Logs/categories/LogRealtime/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/Logs/categories/LogRealtime/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaAllChecksButton.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaAllChecksButton.mjs +16 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaCheckRow.d.ts +7 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaCheckRow.mjs +47 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaChecks.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaChecks.mjs +24 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaDivider.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaDivider.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaFindingItem.d.ts +7 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaFindingItem.mjs +32 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaInspectorDetails.d.ts +9 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaInspectorDetails.mjs +135 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaInspectorEmpty.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaInspectorEmpty.mjs +17 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaInspectorPanel.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaInspectorPanel.mjs +22 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaProperty.d.ts +8 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaProperty.mjs +14 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaRescanButton.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaRescanButton.mjs +15 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaRuleItem.d.ts +7 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaRuleItem.mjs +38 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaToolChip.d.ts +13 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaToolChip.mjs +27 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaToolbar.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaToolbar.mjs +58 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaViewer.d.ts +8 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaViewer.mjs +14 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaVisionSelect.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/QaVisionSelect.mjs +50 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/index.d.ts +3 -0
- package/dist/components/DevToolsPanel/tabs/QaViewer/index.mjs +5 -0
- package/dist/components/DevToolsPanel/tabs/TracingViewer/TracingViewer.mjs +31 -31
- package/dist/components/DevToolsPanel/tabs/VariablesViewer/VariablesViewer.mjs +12 -12
- package/dist/highlight/index.d.ts +2 -0
- package/dist/highlight/index.mjs +5 -0
- package/dist/highlight/useHighlightElement.d.ts +6 -0
- package/dist/{components/DevToolsPanel/tabs/TracingViewer → highlight}/useHighlightElement.mjs +1 -1
- package/dist/qa/QaContext.d.ts +29 -0
- package/dist/qa/QaContext.mjs +73 -0
- package/dist/qa/QaLayer.d.ts +9 -0
- package/dist/qa/QaLayer.mjs +69 -0
- package/dist/qa/checks/contrast.d.ts +6 -0
- package/dist/qa/checks/contrast.mjs +23 -0
- package/dist/qa/checks/dom.d.ts +15 -0
- package/dist/qa/checks/dom.mjs +4 -0
- package/dist/qa/checks/headings.d.ts +6 -0
- package/dist/qa/checks/headings.mjs +28 -0
- package/dist/qa/checks/images.d.ts +6 -0
- package/dist/qa/checks/images.mjs +20 -0
- package/dist/qa/checks/index.d.ts +15 -0
- package/dist/qa/checks/index.mjs +47 -0
- package/dist/qa/checks/names.d.ts +9 -0
- package/dist/qa/checks/names.mjs +27 -0
- package/dist/qa/checks/overflow.d.ts +3 -0
- package/dist/qa/checks/overflow.mjs +24 -0
- package/dist/qa/checks/targets.d.ts +8 -0
- package/dist/qa/checks/targets.mjs +17 -0
- package/dist/qa/findings.d.ts +5 -0
- package/dist/qa/findings.mjs +11 -0
- package/dist/qa/inspect/colour.d.ts +33 -0
- package/dist/qa/inspect/colour.mjs +111 -0
- package/dist/qa/inspect/describe.d.ts +32 -0
- package/dist/qa/inspect/describe.mjs +42 -0
- package/dist/qa/inspect/measure.d.ts +20 -0
- package/dist/qa/inspect/measure.mjs +23 -0
- package/dist/qa/inspect/rules.d.ts +12 -0
- package/dist/qa/inspect/rules.mjs +29 -0
- package/dist/qa/overlays/QaBoxModel.d.ts +9 -0
- package/dist/qa/overlays/QaBoxModel.mjs +49 -0
- package/dist/qa/overlays/QaContrastBadge.d.ts +7 -0
- package/dist/qa/overlays/QaContrastBadge.mjs +13 -0
- package/dist/qa/overlays/QaGrid.d.ts +10 -0
- package/dist/qa/overlays/QaGrid.mjs +24 -0
- package/dist/qa/overlays/QaInspector.d.ts +7 -0
- package/dist/qa/overlays/QaInspector.mjs +50 -0
- package/dist/qa/overlays/QaMeasure.d.ts +7 -0
- package/dist/qa/overlays/QaMeasure.mjs +39 -0
- package/dist/qa/overlays/QaSwatch.d.ts +6 -0
- package/dist/qa/overlays/QaSwatch.mjs +11 -0
- package/dist/qa/overlays/QaTabOrder.d.ts +6 -0
- package/dist/qa/overlays/QaTabOrder.mjs +39 -0
- package/dist/qa/overlays/QaTooltip.d.ts +6 -0
- package/dist/qa/overlays/QaTooltip.mjs +65 -0
- package/dist/qa/overlays/QaViewport.d.ts +10 -0
- package/dist/qa/overlays/QaViewport.mjs +27 -0
- package/dist/qa/qaCss.d.ts +12 -0
- package/dist/qa/qaCss.mjs +45 -0
- package/dist/qa/qaSettings.d.ts +38 -0
- package/dist/qa/qaSettings.mjs +28 -0
- package/dist/qa/tabOrder.d.ts +2 -0
- package/dist/qa/tabOrder.mjs +8 -0
- package/dist/qa/usePageBox.d.ts +13 -0
- package/dist/qa/usePageBox.mjs +23 -0
- package/package.json +372 -32
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/DetailsAttributes.mjs +0 -19
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/DetailsDefinition.mjs +0 -20
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/DetailsValue.d.ts +0 -10
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/DetailsValue.mjs +0 -31
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementDetails.d.ts +0 -8
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementDetails.mjs +0 -21
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementsList.d.ts +0 -8
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementsList.mjs +0 -42
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementsListItem.d.ts +0 -9
- package/dist/components/DevToolsPanel/tabs/ElementsViewer/ElementsListItem.mjs +0 -24
- package/dist/components/DevToolsPanel/tabs/TracingViewer/useHighlightElement.d.ts +0 -2
- /package/dist/components/DevToolsPanel/tabs/ElementsViewer/{DetailsAttributes.d.ts → components/DetailsAttributes/DetailsAttributes.d.ts} +0 -0
- /package/dist/components/DevToolsPanel/tabs/ElementsViewer/{DetailsDefinition.d.ts → components/DetailsDefinition/DetailsDefinition.d.ts} +0 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
//#region src/qa/inspect/colour.ts
|
|
2
|
+
var e, t = () => {
|
|
3
|
+
if (e === void 0) try {
|
|
4
|
+
let t = document.createElement("canvas");
|
|
5
|
+
t.width = 1, t.height = 1, e = t.getContext("2d", { willReadFrequently: !0 });
|
|
6
|
+
} catch {
|
|
7
|
+
e = null;
|
|
8
|
+
}
|
|
9
|
+
return e;
|
|
10
|
+
}, n = /^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)(?:[\s,/]+([\d.]+%?))?\s*\)$/i, r = (e) => e === void 0 ? 1 : e.endsWith("%") ? parseFloat(e) / 100 : parseFloat(e), i = (e) => {
|
|
11
|
+
let t = e.trim(), i = n.exec(t);
|
|
12
|
+
if (i) return [
|
|
13
|
+
Number(i[1]),
|
|
14
|
+
Number(i[2]),
|
|
15
|
+
Number(i[3]),
|
|
16
|
+
r(i.at(4))
|
|
17
|
+
];
|
|
18
|
+
let a = /^#([\da-f]{3}|[\da-f]{6})$/i.exec(t)?.[1];
|
|
19
|
+
if (!a) return t === "transparent" ? [
|
|
20
|
+
0,
|
|
21
|
+
0,
|
|
22
|
+
0,
|
|
23
|
+
0
|
|
24
|
+
] : void 0;
|
|
25
|
+
let o = a.length === 3 ? a.replace(/./g, (e) => e + e) : a, [s, c, l] = [
|
|
26
|
+
0,
|
|
27
|
+
2,
|
|
28
|
+
4
|
|
29
|
+
].map((e) => parseInt(o.slice(e, e + 2), 16));
|
|
30
|
+
return [
|
|
31
|
+
s,
|
|
32
|
+
c,
|
|
33
|
+
l,
|
|
34
|
+
1
|
|
35
|
+
];
|
|
36
|
+
}, a = (e) => {
|
|
37
|
+
let n = t();
|
|
38
|
+
if (!n) return i(e);
|
|
39
|
+
n.clearRect(0, 0, 1, 1), n.fillStyle = "#000", n.fillStyle = e, n.fillRect(0, 0, 1, 1);
|
|
40
|
+
let [r, a, o, s] = n.getImageData(0, 0, 1, 1).data;
|
|
41
|
+
return [
|
|
42
|
+
r,
|
|
43
|
+
a,
|
|
44
|
+
o,
|
|
45
|
+
s / 255
|
|
46
|
+
];
|
|
47
|
+
}, o = (e, t) => {
|
|
48
|
+
let n = e[3] + t[3] * (1 - e[3]);
|
|
49
|
+
if (n === 0) return [
|
|
50
|
+
0,
|
|
51
|
+
0,
|
|
52
|
+
0,
|
|
53
|
+
0
|
|
54
|
+
];
|
|
55
|
+
let r = (r) => (e[r] * e[3] + t[r] * t[3] * (1 - e[3])) / n;
|
|
56
|
+
return [
|
|
57
|
+
r(0),
|
|
58
|
+
r(1),
|
|
59
|
+
r(2),
|
|
60
|
+
n
|
|
61
|
+
];
|
|
62
|
+
}, s = ([e, t, n]) => {
|
|
63
|
+
let [r, i, a] = [
|
|
64
|
+
e,
|
|
65
|
+
t,
|
|
66
|
+
n
|
|
67
|
+
].map((e) => {
|
|
68
|
+
let t = e / 255;
|
|
69
|
+
return t <= .03928 ? t / 12.92 : ((t + .055) / 1.055) ** 2.4;
|
|
70
|
+
});
|
|
71
|
+
return .2126 * r + .7152 * i + .0722 * a;
|
|
72
|
+
}, c = (e, t) => {
|
|
73
|
+
let [n, r] = [s(e), s(t)].sort((e, t) => t - e);
|
|
74
|
+
return (n + .05) / (r + .05);
|
|
75
|
+
}, l = ([e, t, n, r]) => {
|
|
76
|
+
let i = `#${[
|
|
77
|
+
e,
|
|
78
|
+
t,
|
|
79
|
+
n
|
|
80
|
+
].map((e) => Math.round(e).toString(16).padStart(2, "0")).join("")}`;
|
|
81
|
+
return r < 1 ? `${i} · ${String(Math.round(r * 100))}%` : i;
|
|
82
|
+
}, u = () => {
|
|
83
|
+
let e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map(), n = (t) => (e.has(t) || e.set(t, a(t)), e.get(t)), r = (e) => {
|
|
84
|
+
let t = e.ownerDocument.documentElement;
|
|
85
|
+
return e.ownerDocument.defaultView?.getComputedStyle(t).colorScheme.includes("dark") ?? !1 ? [
|
|
86
|
+
18,
|
|
87
|
+
18,
|
|
88
|
+
18,
|
|
89
|
+
1
|
|
90
|
+
] : [
|
|
91
|
+
255,
|
|
92
|
+
255,
|
|
93
|
+
255,
|
|
94
|
+
1
|
|
95
|
+
];
|
|
96
|
+
}, i = (e) => {
|
|
97
|
+
if (t.has(e)) return t.get(e);
|
|
98
|
+
let a = e.ownerDocument.defaultView?.getComputedStyle(e), s;
|
|
99
|
+
if (a && (!a.backgroundImage || a.backgroundImage === "none")) {
|
|
100
|
+
let t = n(a.backgroundColor), c = e.parentElement, l = c ? i(c) : r(e);
|
|
101
|
+
t && t[3] >= 1 ? s = t : l && (s = t && t[3] > 0 ? o(t, l) : l);
|
|
102
|
+
}
|
|
103
|
+
return t.set(e, s), s;
|
|
104
|
+
};
|
|
105
|
+
return {
|
|
106
|
+
colour: n,
|
|
107
|
+
backdrop: i
|
|
108
|
+
};
|
|
109
|
+
}, d = (e) => u().backdrop(e), f = (e, t) => e >= 24 || e >= 18.66 && t >= 700;
|
|
110
|
+
//#endregion
|
|
111
|
+
export { d as backdropOf, u as colourReader, c as contrastRatio, f as isLargeText, o as over, l as toHex, a as toRgba };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** What a designer asks of an element on the page: what it is, how big, how it is spaced, set and coloured. */
|
|
2
|
+
export interface ElementSummary {
|
|
3
|
+
/** `heading · lp-hero-title`, or the tag where the element is not one of the space's. */
|
|
4
|
+
name: string;
|
|
5
|
+
tag: string;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
display: string;
|
|
9
|
+
position: string;
|
|
10
|
+
padding: string;
|
|
11
|
+
margin: string;
|
|
12
|
+
border: string;
|
|
13
|
+
radius: string;
|
|
14
|
+
gap: string;
|
|
15
|
+
font: string;
|
|
16
|
+
lineHeight: string;
|
|
17
|
+
letterSpacing: string;
|
|
18
|
+
colour: string;
|
|
19
|
+
background: string | undefined;
|
|
20
|
+
/** The text against what is behind it, when that can be read — and what it needs to pass AA. */
|
|
21
|
+
contrast: {
|
|
22
|
+
ratio: number;
|
|
23
|
+
needs: number;
|
|
24
|
+
} | undefined;
|
|
25
|
+
opacity: string;
|
|
26
|
+
zIndex: string;
|
|
27
|
+
/** The space's own classes: the SDK's wrappers left out. */
|
|
28
|
+
classes: string[];
|
|
29
|
+
}
|
|
30
|
+
/** Four sides the way a shorthand writes them: one value when all agree, two when opposite sides do. */
|
|
31
|
+
export declare const sidesOf: (style: CSSStyleDeclaration, property: "padding" | "margin") => string;
|
|
32
|
+
export declare const summarize: (element: Element) => ElementSummary | undefined;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { backdropOf as e, contrastRatio as t, isLargeText as n, over as r, toHex as i, toRgba as a } from "./colour.mjs";
|
|
2
|
+
//#region src/qa/inspect/describe.ts
|
|
3
|
+
var o = [
|
|
4
|
+
"top",
|
|
5
|
+
"right",
|
|
6
|
+
"bottom",
|
|
7
|
+
"left"
|
|
8
|
+
], s = (e, t) => {
|
|
9
|
+
let [n, r, i, a] = o.map((n) => e.getPropertyValue(`${t}-${n}`) || "0px");
|
|
10
|
+
return n === r && r === i && i === a ? n : n === i && r === a ? `${n} ${r}` : `${n} ${r} ${i} ${a}`;
|
|
11
|
+
}, c = (e) => !e.startsWith("plitzi-component") && !e.startsWith("plitzi__") && !e.startsWith("devtools-"), l = (e) => e.split(",")[0]?.replace(/["']/g, "").trim() ?? e, u = (o) => {
|
|
12
|
+
let u = o.ownerDocument.defaultView;
|
|
13
|
+
if (!u) return;
|
|
14
|
+
let d = u.getComputedStyle(o), f = o.getBoundingClientRect(), p = o.getAttribute("data-type"), m = o.getAttribute("data-plitzi-el"), h = o.tagName.toLowerCase(), g = a(d.color), _ = a(d.backgroundColor), v = e(o), y = parseFloat(d.fontSize), b = Number(d.fontWeight) || 400, x = g && v ? {
|
|
15
|
+
ratio: t(r(g, v), v),
|
|
16
|
+
needs: n(y, b) ? 3 : 4.5
|
|
17
|
+
} : void 0;
|
|
18
|
+
return {
|
|
19
|
+
name: p && m ? `${p} · ${m}` : h,
|
|
20
|
+
tag: h,
|
|
21
|
+
width: Math.round(f.width),
|
|
22
|
+
height: Math.round(f.height),
|
|
23
|
+
display: d.display,
|
|
24
|
+
position: d.position,
|
|
25
|
+
padding: s(d, "padding"),
|
|
26
|
+
margin: s(d, "margin"),
|
|
27
|
+
border: `${d.borderTopWidth} ${d.borderTopStyle}`,
|
|
28
|
+
radius: d.borderTopLeftRadius,
|
|
29
|
+
gap: d.gap === "normal" ? "" : d.gap,
|
|
30
|
+
font: `${l(d.fontFamily)} ${d.fontSize} · ${d.fontWeight}`,
|
|
31
|
+
lineHeight: d.lineHeight,
|
|
32
|
+
letterSpacing: d.letterSpacing,
|
|
33
|
+
colour: g ? i(g) : d.color,
|
|
34
|
+
background: _ && _[3] > 0 ? i(_) : void 0,
|
|
35
|
+
contrast: x,
|
|
36
|
+
opacity: d.opacity,
|
|
37
|
+
zIndex: d.zIndex,
|
|
38
|
+
classes: [...o.classList].filter(c)
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
//#endregion
|
|
42
|
+
export { s as sidesOf, u as summarize };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** A box on the screen, as `getBoundingClientRect` gives it. */
|
|
2
|
+
export interface Box {
|
|
3
|
+
left: number;
|
|
4
|
+
top: number;
|
|
5
|
+
right: number;
|
|
6
|
+
bottom: number;
|
|
7
|
+
}
|
|
8
|
+
/** A distance to draw: a line from one point to another and its length in px. */
|
|
9
|
+
export interface Distance {
|
|
10
|
+
x1: number;
|
|
11
|
+
y1: number;
|
|
12
|
+
x2: number;
|
|
13
|
+
y2: number;
|
|
14
|
+
length: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The distances between two boxes, as a design tool draws them: the gap between them on each axis they are apart on,
|
|
18
|
+
* or, when one holds the other, from each of its sides to the outer box's.
|
|
19
|
+
*/
|
|
20
|
+
export declare const distancesBetween: (from: Box, to: Box) => Distance[];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/qa/inspect/measure.ts
|
|
2
|
+
var e = (e, t, n, r) => ({
|
|
3
|
+
x1: e,
|
|
4
|
+
y1: t,
|
|
5
|
+
x2: n,
|
|
6
|
+
y2: r,
|
|
7
|
+
length: Math.round(Math.hypot(n - e, r - t))
|
|
8
|
+
}), t = (e, t) => (e + t) / 2, n = (n, r) => {
|
|
9
|
+
let i = n.left >= r.left && n.right <= r.right && n.top >= r.top && n.bottom <= r.bottom, a = r.left >= n.left && r.right <= n.right && r.top >= n.top && r.bottom <= n.bottom;
|
|
10
|
+
if (i || a) {
|
|
11
|
+
let [a, o] = i ? [n, r] : [r, n], s = t(a.left, a.right), c = t(a.top, a.bottom);
|
|
12
|
+
return [
|
|
13
|
+
e(s, o.top, s, a.top),
|
|
14
|
+
e(a.right, c, o.right, c),
|
|
15
|
+
e(s, a.bottom, s, o.bottom),
|
|
16
|
+
e(o.left, c, a.left, c)
|
|
17
|
+
].filter((e) => e.length > 0);
|
|
18
|
+
}
|
|
19
|
+
let o = [], s = t(Math.max(n.top, r.top), Math.min(n.bottom, r.bottom)), c = t(Math.max(n.left, r.left), Math.min(n.right, r.right)), l = n.bottom > r.top && r.bottom > n.top ? s : t(n.top, n.bottom), u = n.right > r.left && r.right > n.left ? c : t(n.left, n.right);
|
|
20
|
+
return r.left >= n.right ? o.push(e(n.right, l, r.left, l)) : n.left >= r.right && o.push(e(r.right, l, n.left, l)), r.top >= n.bottom ? o.push(e(u, n.bottom, u, r.top)) : n.top >= r.bottom && o.push(e(u, r.bottom, u, n.top)), o;
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
23
|
+
export { n as distancesBetween };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CSS rules that reach an element, as written — the class it wears, its variant, an ancestor's condition, a rule
|
|
3
|
+
* of the space's own CSS — rather than the values they resolved to.
|
|
4
|
+
*/
|
|
5
|
+
export interface MatchedRule {
|
|
6
|
+
selector: string;
|
|
7
|
+
/** `color: red; padding: 8px`. */
|
|
8
|
+
declarations: string;
|
|
9
|
+
/** The media query it sits under, when there is one. */
|
|
10
|
+
media?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const matchedRules: (element: Element) => MatchedRule[];
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/qa/inspect/rules.ts
|
|
2
|
+
var e = /^(\*|:root|:host|html|body|::?before|::?after|::backdrop|::?marker)$/, t = (t) => t.split(",").every((t) => e.test(t.trim())), n = (e) => e.includes("[data-plitzi-qa") || e.includes("devtools-element-"), r = (e) => [...e].every((e) => e.startsWith("--tw-")), i = 60, a = (e, t) => t ? e.includes("&") ? e.replaceAll("&", `:is(${t})`) : `:is(${t}) ${e}` : e, o = (e, t) => {
|
|
3
|
+
try {
|
|
4
|
+
return e.matches(t);
|
|
5
|
+
} catch {
|
|
6
|
+
return !1;
|
|
7
|
+
}
|
|
8
|
+
}, s = (e, c, l, u, d) => {
|
|
9
|
+
let f = e.ownerDocument.defaultView;
|
|
10
|
+
for (let p of c) {
|
|
11
|
+
if (l.length >= i) return;
|
|
12
|
+
if (p instanceof CSSStyleRule) {
|
|
13
|
+
let i = a(p.selectorText, u);
|
|
14
|
+
p.style.length > 0 && !t(p.selectorText) && !n(p.selectorText) && !r(p.style) && o(e, i) && l.push({
|
|
15
|
+
selector: p.selectorText,
|
|
16
|
+
declarations: p.style.cssText,
|
|
17
|
+
...d ? { media: d } : {}
|
|
18
|
+
}), p.cssRules.length > 0 && s(e, p.cssRules, l, i, d);
|
|
19
|
+
} else p instanceof CSSMediaRule ? (typeof f?.matchMedia != "function" || f.matchMedia(p.media.mediaText).matches) && s(e, p.cssRules, l, u, p.media.mediaText) : p instanceof CSSGroupingRule && s(e, p.cssRules, l, u, d);
|
|
20
|
+
}
|
|
21
|
+
}, c = (e) => {
|
|
22
|
+
let t = [];
|
|
23
|
+
for (let n of e.ownerDocument.styleSheets) try {
|
|
24
|
+
s(e, n.cssRules, t, void 0, void 0);
|
|
25
|
+
} catch {}
|
|
26
|
+
return t;
|
|
27
|
+
};
|
|
28
|
+
//#endregion
|
|
29
|
+
export { c as matchedRules };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type QaBoxModelProps = {
|
|
2
|
+
element: Element;
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* The element's box as a browser's inspector draws it: its margin in orange outside it, its padding in green inside
|
|
6
|
+
* its border, its content in blue.
|
|
7
|
+
*/
|
|
8
|
+
declare const QaBoxModel: ({ element }: QaBoxModelProps) => import('react').JSX.Element | null;
|
|
9
|
+
export default QaBoxModel;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Fragment as e, jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
2
|
+
//#region src/qa/overlays/QaBoxModel.tsx
|
|
3
|
+
var r = (e) => parseFloat(e) || 0, i = (e, t, n, r, i) => ({
|
|
4
|
+
borderStyle: "solid",
|
|
5
|
+
borderColor: e,
|
|
6
|
+
borderWidth: `${String(t)}px ${String(n)}px ${String(r)}px ${String(i)}px`
|
|
7
|
+
}), a = ({ element: a }) => {
|
|
8
|
+
let o = a.ownerDocument.defaultView;
|
|
9
|
+
if (!o) return null;
|
|
10
|
+
let s = o.getComputedStyle(a), c = a.getBoundingClientRect(), l = [
|
|
11
|
+
s.marginTop,
|
|
12
|
+
s.marginRight,
|
|
13
|
+
s.marginBottom,
|
|
14
|
+
s.marginLeft
|
|
15
|
+
].map(r), u = [
|
|
16
|
+
s.borderTopWidth,
|
|
17
|
+
s.borderRightWidth,
|
|
18
|
+
s.borderBottomWidth,
|
|
19
|
+
s.borderLeftWidth
|
|
20
|
+
].map(r), d = [
|
|
21
|
+
s.paddingTop,
|
|
22
|
+
s.paddingRight,
|
|
23
|
+
s.paddingBottom,
|
|
24
|
+
s.paddingLeft
|
|
25
|
+
].map(r), [f, p, m, h] = l.map((e) => Math.max(e, 0)), [g, _, v, y] = u, [b, x, S, C] = d;
|
|
26
|
+
return /* @__PURE__ */ n(e, { children: [/* @__PURE__ */ t("div", {
|
|
27
|
+
className: "pointer-events-none fixed z-[999997] box-border",
|
|
28
|
+
style: {
|
|
29
|
+
left: c.left - h,
|
|
30
|
+
top: c.top - f,
|
|
31
|
+
width: c.width + h + p,
|
|
32
|
+
height: c.height + f + m,
|
|
33
|
+
...i("rgba(249, 115, 22, 0.32)", f, p, m, h)
|
|
34
|
+
}
|
|
35
|
+
}), /* @__PURE__ */ t("div", {
|
|
36
|
+
className: "pointer-events-none fixed z-[999997] box-border",
|
|
37
|
+
style: {
|
|
38
|
+
left: c.left + y,
|
|
39
|
+
top: c.top + g,
|
|
40
|
+
width: Math.max(c.width - y - _, 0),
|
|
41
|
+
height: Math.max(c.height - g - v, 0),
|
|
42
|
+
backgroundColor: "rgba(59, 130, 246, 0.24)",
|
|
43
|
+
backgroundClip: "padding-box",
|
|
44
|
+
...i("rgba(34, 197, 94, 0.32)", b, x, S, C)
|
|
45
|
+
}
|
|
46
|
+
})] });
|
|
47
|
+
};
|
|
48
|
+
//#endregion
|
|
49
|
+
export { a as default };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type QaContrastBadgeProps = {
|
|
2
|
+
ratio: number;
|
|
3
|
+
needs: number;
|
|
4
|
+
};
|
|
5
|
+
/** The text's contrast against what is behind it, and whether it passes AA for its size. */
|
|
6
|
+
declare const QaContrastBadge: ({ ratio, needs }: QaContrastBadgeProps) => import('react').JSX.Element;
|
|
7
|
+
export default QaContrastBadge;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import e from "clsx";
|
|
2
|
+
import { jsxs as t } from "react/jsx-runtime";
|
|
3
|
+
//#region src/qa/overlays/QaContrastBadge.tsx
|
|
4
|
+
var n = ({ ratio: n, needs: r }) => /* @__PURE__ */ t("span", {
|
|
5
|
+
className: e("rounded px-1 font-semibold", {
|
|
6
|
+
"bg-emerald-500/20 text-emerald-300": n >= r,
|
|
7
|
+
"bg-rose-500/25 text-rose-300": n < r
|
|
8
|
+
}),
|
|
9
|
+
title: `AA needs ${String(r)}:1 for this size`,
|
|
10
|
+
children: [n.toFixed(2), ":1"]
|
|
11
|
+
});
|
|
12
|
+
//#endregion
|
|
13
|
+
export { n as default };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PageBox } from '../usePageBox';
|
|
2
|
+
export type QaGridProps = {
|
|
3
|
+
box: PageBox;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* The layout grid over the page — the builder's, from the same definition — held to the viewport like a design tool's,
|
|
7
|
+
* across the page's box rather than the window's when the panel is docked beside it.
|
|
8
|
+
*/
|
|
9
|
+
declare const QaGrid: ({ box }: QaGridProps) => import('react').JSX.Element;
|
|
10
|
+
export default QaGrid;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { LAYOUT_GRIDS as t, displayModeAt as n, layoutGridLook as r } from "@plitzi/sdk-shared/style";
|
|
3
|
+
//#region src/qa/overlays/QaGrid.tsx
|
|
4
|
+
var i = ({ box: i }) => {
|
|
5
|
+
let a = r(t[n(i.viewportWidth)]);
|
|
6
|
+
return /* @__PURE__ */ e("div", {
|
|
7
|
+
"aria-hidden": "true",
|
|
8
|
+
className: "pointer-events-none fixed top-0 bottom-0 z-[999998]",
|
|
9
|
+
style: {
|
|
10
|
+
left: i.left,
|
|
11
|
+
width: i.width
|
|
12
|
+
},
|
|
13
|
+
children: /* @__PURE__ */ e("div", {
|
|
14
|
+
className: "absolute top-0 bottom-0 left-1/2 -translate-x-1/2",
|
|
15
|
+
style: {
|
|
16
|
+
width: a.width,
|
|
17
|
+
backgroundImage: a.backgroundImage,
|
|
18
|
+
boxShadow: a.boxShadow
|
|
19
|
+
}
|
|
20
|
+
})
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { i as default };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The inspector over the page: point at an element for its box and how it is set; click to keep it in the QA tab —
|
|
3
|
+
* the page's own click does not happen, so a link can be inspected without leaving; hold Alt over another for the
|
|
4
|
+
* distances between them. Escape puts it away.
|
|
5
|
+
*/
|
|
6
|
+
declare const QaInspector: () => import('react').JSX.Element;
|
|
7
|
+
export default QaInspector;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import e from "../QaContext.mjs";
|
|
2
|
+
import t from "./QaBoxModel.mjs";
|
|
3
|
+
import n from "./QaMeasure.mjs";
|
|
4
|
+
import r from "./QaTooltip.mjs";
|
|
5
|
+
import { use as i, useEffect as a, useState as o } from "react";
|
|
6
|
+
import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
7
|
+
//#region src/qa/overlays/QaInspector.tsx
|
|
8
|
+
var u = () => {
|
|
9
|
+
let { pageRef: u, pinned: d, setPinned: f, setSetting: p } = i(e), [m, h] = o(), [g, _] = o(!1), [, v] = o(0);
|
|
10
|
+
a(() => {
|
|
11
|
+
let e = u.current;
|
|
12
|
+
if (!e) return;
|
|
13
|
+
let t = (t) => t instanceof Element && e.contains(t), n = 0, r = () => {
|
|
14
|
+
cancelAnimationFrame(n), n = requestAnimationFrame(() => v((e) => e + 1));
|
|
15
|
+
}, i = (e) => {
|
|
16
|
+
_(e.altKey), h(t(e.target) ? e.target : void 0);
|
|
17
|
+
}, a = (e) => {
|
|
18
|
+
t(e.target) && (e.preventDefault(), e.stopPropagation(), f(e.target));
|
|
19
|
+
}, o = (e) => {
|
|
20
|
+
_(e.altKey), e.type === "keydown" && e.key === "Escape" && p("inspect", !1);
|
|
21
|
+
};
|
|
22
|
+
return document.addEventListener("pointermove", i, !0), document.addEventListener("click", a, !0), document.addEventListener("keydown", o, !0), document.addEventListener("keyup", o, !0), document.addEventListener("scroll", r, !0), window.addEventListener("resize", r), () => {
|
|
23
|
+
cancelAnimationFrame(n), document.removeEventListener("pointermove", i, !0), document.removeEventListener("click", a, !0), document.removeEventListener("keydown", o, !0), document.removeEventListener("keyup", o, !0), document.removeEventListener("scroll", r, !0), window.removeEventListener("resize", r);
|
|
24
|
+
};
|
|
25
|
+
}, [
|
|
26
|
+
u,
|
|
27
|
+
f,
|
|
28
|
+
p
|
|
29
|
+
]);
|
|
30
|
+
let y = d?.isConnected ? d : void 0, b = y?.getBoundingClientRect();
|
|
31
|
+
return /* @__PURE__ */ l(s, { children: [
|
|
32
|
+
b && /* @__PURE__ */ c("div", {
|
|
33
|
+
className: "pointer-events-none fixed z-[999998] box-border outline-2 outline-violet-500",
|
|
34
|
+
style: {
|
|
35
|
+
left: b.left,
|
|
36
|
+
top: b.top,
|
|
37
|
+
width: b.width,
|
|
38
|
+
height: b.height
|
|
39
|
+
}
|
|
40
|
+
}),
|
|
41
|
+
m && m !== y && /* @__PURE__ */ c(t, { element: m }),
|
|
42
|
+
y && m && m !== y && g && /* @__PURE__ */ c(n, {
|
|
43
|
+
from: y,
|
|
44
|
+
to: m
|
|
45
|
+
}),
|
|
46
|
+
m && !g && /* @__PURE__ */ c(r, { element: m })
|
|
47
|
+
] });
|
|
48
|
+
};
|
|
49
|
+
//#endregion
|
|
50
|
+
export { u as default };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type QaMeasureProps = {
|
|
2
|
+
from: Element;
|
|
3
|
+
to: Element;
|
|
4
|
+
};
|
|
5
|
+
/** The distances between two elements, drawn and labelled — what a designer measures spacing with. */
|
|
6
|
+
declare const QaMeasure: ({ from, to }: QaMeasureProps) => import('react').JSX.Element;
|
|
7
|
+
export default QaMeasure;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { distancesBetween as e } from "../inspect/measure.mjs";
|
|
2
|
+
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
|
+
//#region src/qa/overlays/QaMeasure.tsx
|
|
4
|
+
var r = ({ from: r, to: i }) => {
|
|
5
|
+
let a = e(r.getBoundingClientRect(), i.getBoundingClientRect());
|
|
6
|
+
return /* @__PURE__ */ t("svg", {
|
|
7
|
+
className: "pointer-events-none fixed inset-0 z-[999998] h-full w-full overflow-visible",
|
|
8
|
+
"aria-hidden": "true",
|
|
9
|
+
children: a.map(({ x1: e, y1: r, x2: i, y2: a, length: o }) => /* @__PURE__ */ n("g", { children: [
|
|
10
|
+
/* @__PURE__ */ t("line", {
|
|
11
|
+
x1: e,
|
|
12
|
+
y1: r,
|
|
13
|
+
x2: i,
|
|
14
|
+
y2: a,
|
|
15
|
+
stroke: "#f43f5e",
|
|
16
|
+
strokeWidth: 1
|
|
17
|
+
}),
|
|
18
|
+
/* @__PURE__ */ t("rect", {
|
|
19
|
+
x: (e + i) / 2 - 16,
|
|
20
|
+
y: (r + a) / 2 - 9,
|
|
21
|
+
width: 32,
|
|
22
|
+
height: 18,
|
|
23
|
+
rx: 4,
|
|
24
|
+
fill: "#f43f5e"
|
|
25
|
+
}),
|
|
26
|
+
/* @__PURE__ */ t("text", {
|
|
27
|
+
x: (e + i) / 2,
|
|
28
|
+
y: (r + a) / 2 + 4,
|
|
29
|
+
textAnchor: "middle",
|
|
30
|
+
fill: "#ffffff",
|
|
31
|
+
fontSize: 11,
|
|
32
|
+
fontFamily: "ui-monospace, monospace",
|
|
33
|
+
children: o
|
|
34
|
+
})
|
|
35
|
+
] }, `${String(e)}-${String(r)}-${String(i)}-${String(a)}`))
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
//#endregion
|
|
39
|
+
export { r as default };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as e, jsxs as t } from "react/jsx-runtime";
|
|
2
|
+
//#region src/qa/overlays/QaSwatch.tsx
|
|
3
|
+
var n = ({ colour: n }) => /* @__PURE__ */ t("span", {
|
|
4
|
+
className: "inline-flex items-center gap-1",
|
|
5
|
+
children: [/* @__PURE__ */ e("span", {
|
|
6
|
+
className: "h-2.5 w-2.5 shrink-0 rounded-sm ring-1 ring-white/30",
|
|
7
|
+
style: { backgroundColor: n.split(" ")[0] }
|
|
8
|
+
}), n]
|
|
9
|
+
});
|
|
10
|
+
//#endregion
|
|
11
|
+
export { n as default };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import e from "../QaContext.mjs";
|
|
2
|
+
import { tabOrderOf as t } from "../tabOrder.mjs";
|
|
3
|
+
import { use as n, useEffect as r, useState as i } from "react";
|
|
4
|
+
import { Fragment as a, jsx as o } from "react/jsx-runtime";
|
|
5
|
+
//#region src/qa/overlays/QaTabOrder.tsx
|
|
6
|
+
var s = 200, c = () => {
|
|
7
|
+
let { pageRef: c } = n(e), [l, u] = i([]), [, d] = i(0);
|
|
8
|
+
return r(() => {
|
|
9
|
+
let e = c.current;
|
|
10
|
+
if (!e) return;
|
|
11
|
+
let n = 0, r, i = () => {
|
|
12
|
+
clearTimeout(r), r = setTimeout(() => u(t(e)), s);
|
|
13
|
+
}, a = () => {
|
|
14
|
+
cancelAnimationFrame(n), n = requestAnimationFrame(() => d((e) => e + 1));
|
|
15
|
+
};
|
|
16
|
+
i();
|
|
17
|
+
let o = new MutationObserver(i);
|
|
18
|
+
return o.observe(e, {
|
|
19
|
+
childList: !0,
|
|
20
|
+
subtree: !0,
|
|
21
|
+
attributes: !0,
|
|
22
|
+
attributeFilter: ["tabindex", "disabled"]
|
|
23
|
+
}), document.addEventListener("scroll", a, !0), window.addEventListener("resize", i), () => {
|
|
24
|
+
clearTimeout(r), cancelAnimationFrame(n), o.disconnect(), document.removeEventListener("scroll", a, !0), window.removeEventListener("resize", i);
|
|
25
|
+
};
|
|
26
|
+
}, [c]), /* @__PURE__ */ o(a, { children: l.map((e, t) => {
|
|
27
|
+
let n = e.getBoundingClientRect();
|
|
28
|
+
return n.bottom < 0 || n.top > window.innerHeight ? null : /* @__PURE__ */ o("span", {
|
|
29
|
+
className: "pointer-events-none fixed z-[999998] flex h-[18px] min-w-[18px] -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full bg-sky-600 px-1 font-mono text-[10px] font-semibold text-white shadow ring-2 ring-white/80",
|
|
30
|
+
style: {
|
|
31
|
+
left: n.left,
|
|
32
|
+
top: n.top
|
|
33
|
+
},
|
|
34
|
+
children: t + 1
|
|
35
|
+
}, t);
|
|
36
|
+
}) });
|
|
37
|
+
};
|
|
38
|
+
//#endregion
|
|
39
|
+
export { c as default };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type QaTooltipProps = {
|
|
2
|
+
element: Element;
|
|
3
|
+
};
|
|
4
|
+
/** What the element is and how it is set, by the pointer: a browser inspector's label, for a designer. */
|
|
5
|
+
declare const QaTooltip: ({ element }: QaTooltipProps) => import('react').JSX.Element | null;
|
|
6
|
+
export default QaTooltip;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import e from "./QaContrastBadge.mjs";
|
|
2
|
+
import t from "./QaSwatch.mjs";
|
|
3
|
+
import { summarize as n } from "../inspect/describe.mjs";
|
|
4
|
+
import { useMemo as r } from "react";
|
|
5
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
6
|
+
//#region src/qa/overlays/QaTooltip.tsx
|
|
7
|
+
var o = 8, s = ({ element: s }) => {
|
|
8
|
+
let c = r(() => n(s), [s]);
|
|
9
|
+
if (!c) return null;
|
|
10
|
+
let l = s.getBoundingClientRect(), u = l.top < 120;
|
|
11
|
+
return /* @__PURE__ */ a("div", {
|
|
12
|
+
className: "pointer-events-none fixed z-[999999] flex max-w-[360px] flex-col gap-1 rounded-lg bg-zinc-900/95 px-2.5 py-2 font-mono text-[11px] leading-snug text-zinc-100 shadow-xl ring-1 ring-white/10",
|
|
13
|
+
style: {
|
|
14
|
+
left: Math.max(o, l.left),
|
|
15
|
+
...u ? { top: l.bottom + o } : { bottom: window.innerHeight - l.top + o }
|
|
16
|
+
},
|
|
17
|
+
children: [
|
|
18
|
+
/* @__PURE__ */ a("span", {
|
|
19
|
+
className: "flex items-center gap-2",
|
|
20
|
+
children: [/* @__PURE__ */ i("span", {
|
|
21
|
+
className: "truncate font-semibold text-violet-300",
|
|
22
|
+
children: c.name
|
|
23
|
+
}), /* @__PURE__ */ a("span", {
|
|
24
|
+
className: "text-zinc-400",
|
|
25
|
+
children: [
|
|
26
|
+
c.width,
|
|
27
|
+
" × ",
|
|
28
|
+
c.height
|
|
29
|
+
]
|
|
30
|
+
})]
|
|
31
|
+
}),
|
|
32
|
+
/* @__PURE__ */ a("span", {
|
|
33
|
+
className: "text-zinc-300",
|
|
34
|
+
children: [
|
|
35
|
+
c.font,
|
|
36
|
+
" / ",
|
|
37
|
+
c.lineHeight
|
|
38
|
+
]
|
|
39
|
+
}),
|
|
40
|
+
/* @__PURE__ */ a("span", {
|
|
41
|
+
className: "flex flex-wrap items-center gap-x-3 gap-y-1",
|
|
42
|
+
children: [
|
|
43
|
+
/* @__PURE__ */ i(t, { colour: c.colour }),
|
|
44
|
+
c.background && /* @__PURE__ */ i(t, { colour: c.background }),
|
|
45
|
+
c.contrast && /* @__PURE__ */ i(e, {
|
|
46
|
+
ratio: c.contrast.ratio,
|
|
47
|
+
needs: c.contrast.needs
|
|
48
|
+
})
|
|
49
|
+
]
|
|
50
|
+
}),
|
|
51
|
+
/* @__PURE__ */ a("span", {
|
|
52
|
+
className: "text-zinc-400",
|
|
53
|
+
children: [
|
|
54
|
+
"padding ",
|
|
55
|
+
c.padding,
|
|
56
|
+
" · margin ",
|
|
57
|
+
c.margin,
|
|
58
|
+
c.gap && ` · gap ${c.gap}`
|
|
59
|
+
]
|
|
60
|
+
})
|
|
61
|
+
]
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
//#endregion
|
|
65
|
+
export { s as default };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PageBox } from '../usePageBox';
|
|
2
|
+
export type QaViewportProps = {
|
|
3
|
+
box: PageBox;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* The window's size and the breakpoint whose rules the page shows at it — and the page's own width when the panel
|
|
7
|
+
* docked beside it makes the two differ, which is when a layout looks wrong for a reason that is not the layout.
|
|
8
|
+
*/
|
|
9
|
+
declare const QaViewport: ({ box }: QaViewportProps) => import('react').JSX.Element;
|
|
10
|
+
export default QaViewport;
|