@issuegraph/editor 0.10.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -7
- package/dist/a11y/baseline.d.ts.map +1 -1
- package/dist/a11y/baseline.js +4 -0
- package/dist/a11y/baseline.js.map +1 -1
- package/dist/audit/findings.d.ts +107 -1
- package/dist/audit/findings.d.ts.map +1 -1
- package/dist/audit/findings.js +114 -7
- package/dist/audit/findings.js.map +1 -1
- package/dist/audit/panel.d.ts +277 -0
- package/dist/audit/panel.d.ts.map +1 -0
- package/dist/audit/panel.js +462 -0
- package/dist/audit/panel.js.map +1 -0
- package/dist/audit/refused.d.ts +99 -0
- package/dist/audit/refused.d.ts.map +1 -0
- package/dist/audit/refused.js +276 -0
- package/dist/audit/refused.js.map +1 -0
- package/dist/audit/styles.d.ts +1 -1
- package/dist/audit/styles.d.ts.map +1 -1
- package/dist/audit/styles.js +428 -0
- package/dist/audit/styles.js.map +1 -1
- package/dist/audit/surface.d.ts +54 -12
- package/dist/audit/surface.d.ts.map +1 -1
- package/dist/audit/surface.js +54 -14
- package/dist/audit/surface.js.map +1 -1
- package/dist/create/draft.d.ts +19 -0
- package/dist/create/draft.d.ts.map +1 -1
- package/dist/create/draft.js +21 -0
- package/dist/create/draft.js.map +1 -1
- package/dist/create/keys.d.ts +68 -8
- package/dist/create/keys.d.ts.map +1 -1
- package/dist/create/keys.js +43 -5
- package/dist/create/keys.js.map +1 -1
- package/dist/firstpass/render.d.ts.map +1 -1
- package/dist/firstpass/render.js +10 -9
- package/dist/firstpass/render.js.map +1 -1
- package/dist/index.d.ts +40 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -13
- package/dist/index.js.map +1 -1
- package/dist/overlay/render.d.ts +11 -3
- package/dist/overlay/render.d.ts.map +1 -1
- package/dist/overlay/render.js +24 -7
- package/dist/overlay/render.js.map +1 -1
- package/dist/overlay/request.d.ts +71 -0
- package/dist/overlay/request.d.ts.map +1 -0
- package/dist/overlay/request.js +129 -0
- package/dist/overlay/request.js.map +1 -0
- package/dist/overlay/styles.d.ts +1 -1
- package/dist/overlay/styles.d.ts.map +1 -1
- package/dist/overlay/styles.js +38 -7
- package/dist/overlay/styles.js.map +1 -1
- package/dist/reevaluate/parts.d.ts +130 -0
- package/dist/reevaluate/parts.d.ts.map +1 -0
- package/dist/reevaluate/parts.js +260 -0
- package/dist/reevaluate/parts.js.map +1 -0
- package/dist/reevaluate/render.d.ts +18 -11
- package/dist/reevaluate/render.d.ts.map +1 -1
- package/dist/reevaluate/render.js +21 -135
- package/dist/reevaluate/render.js.map +1 -1
- package/dist/reevaluate/styles.d.ts +1 -1
- package/dist/reevaluate/styles.d.ts.map +1 -1
- package/dist/reevaluate/styles.js +26 -0
- package/dist/reevaluate/styles.js.map +1 -1
- package/dist/reevaluate/view.d.ts +16 -1
- package/dist/reevaluate/view.d.ts.map +1 -1
- package/dist/reevaluate/view.js +21 -1
- package/dist/reevaluate/view.js.map +1 -1
- package/dist/reevaluate/words.d.ts +7 -0
- package/dist/reevaluate/words.d.ts.map +1 -1
- package/dist/scale/ladder.d.ts +62 -6
- package/dist/scale/ladder.d.ts.map +1 -1
- package/dist/scale/ladder.js +127 -16
- package/dist/scale/ladder.js.map +1 -1
- package/dist/scale/render.d.ts +44 -0
- package/dist/scale/render.d.ts.map +1 -1
- package/dist/scale/render.js +223 -30
- package/dist/scale/render.js.map +1 -1
- package/dist/scale/styles.d.ts +11 -5
- package/dist/scale/styles.d.ts.map +1 -1
- package/dist/scale/styles.js +185 -4
- package/dist/scale/styles.js.map +1 -1
- package/dist/workspace/host.d.ts +83 -1
- package/dist/workspace/host.d.ts.map +1 -1
- package/dist/workspace/host.js +197 -4
- package/dist/workspace/host.js.map +1 -1
- package/dist/workspace/inspector.d.ts +33 -7
- package/dist/workspace/inspector.d.ts.map +1 -1
- package/dist/workspace/inspector.js +15 -0
- package/dist/workspace/inspector.js.map +1 -1
- package/dist/workspace/mount.d.ts +23 -1
- package/dist/workspace/mount.d.ts.map +1 -1
- package/dist/workspace/mount.js +605 -20
- package/dist/workspace/mount.js.map +1 -1
- package/dist/workspace/rail.d.ts +5 -2
- package/dist/workspace/rail.d.ts.map +1 -1
- package/dist/workspace/rail.js.map +1 -1
- package/dist/workspace/render.d.ts +390 -3
- package/dist/workspace/render.d.ts.map +1 -1
- package/dist/workspace/render.js +924 -133
- package/dist/workspace/render.js.map +1 -1
- package/dist/workspace/selection.d.ts +11 -0
- package/dist/workspace/selection.d.ts.map +1 -1
- package/dist/workspace/selection.js +10 -0
- package/dist/workspace/selection.js.map +1 -1
- package/dist/workspace/skeleton.d.ts +33 -0
- package/dist/workspace/skeleton.d.ts.map +1 -0
- package/dist/workspace/skeleton.js +56 -0
- package/dist/workspace/skeleton.js.map +1 -0
- package/dist/workspace/styles.d.ts +1 -1
- package/dist/workspace/styles.d.ts.map +1 -1
- package/dist/workspace/styles.js +931 -19
- package/dist/workspace/styles.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* §17d's fourth class, drawn on its own rather than in the findings list.
|
|
3
|
+
*
|
|
4
|
+
* `./panel.ts` lists the three RELATIONSHIP findings — a cycle, a stale
|
|
5
|
+
* blocker, a dead duplicate ref. This module draws the fourth, and the
|
|
6
|
+
* separation is SPEC's rather than a layout preference: an encoding refusal is
|
|
7
|
+
* *"surfaced on the issue itself, because until it parses the issue has no
|
|
8
|
+
* edges at all and would otherwise look simply unencoded"*. The other three say
|
|
9
|
+
* something about a relationship that exists; this one says the relationships
|
|
10
|
+
* cannot be read, which is a statement about an ISSUE.
|
|
11
|
+
*
|
|
12
|
+
* ## It reads the host's refusals, not the audit's findings
|
|
13
|
+
*
|
|
14
|
+
* The two are the same set — `auditDocument` turns every refusal into a finding
|
|
15
|
+
* — but only the refusal carries `diagnostic` and `sourceLine`, and only the
|
|
16
|
+
* refusal is meant to. `AuditFinding` is one shape over four classes, so
|
|
17
|
+
* declaring two fields three of them can never hold would render an absence as
|
|
18
|
+
* a value in the module whose fourth class exists to refuse that; and
|
|
19
|
+
* `AuditFinding.detail` is "one sentence, never parsed, never a code", so
|
|
20
|
+
* recovering a source line out of it would make a sentence a wire format. See
|
|
21
|
+
* {@link EncodingRefusal}.
|
|
22
|
+
*
|
|
23
|
+
* THE COST IS ONE DUPLICATED RULE AND IT IS STATED RATHER THAN HIDDEN.
|
|
24
|
+
* `encodingRefusedFindings` deduplicates refusals by ref, first occurrence
|
|
25
|
+
* winning, and {@link refusalsToDraw} applies the same rule here — so a host
|
|
26
|
+
* that reports one issue twice gets one finding and one card rather than one
|
|
27
|
+
* and two. `findings.ts` warns against exactly this shape ("a renderer doing it
|
|
28
|
+
* would leave the HEADER COUNT wrong"), and the warning is answered rather than
|
|
29
|
+
* ignored: the count is not computed here, the rule is one line rather than a
|
|
30
|
+
* detector, and `./panel.test.ts` pins the arithmetic across both surfaces.
|
|
31
|
+
*
|
|
32
|
+
* The alternative was to drive this off `overlay.findings` filtered to the
|
|
33
|
+
* class, using the refusals only as a `ref -> fields` map. That makes the two
|
|
34
|
+
* surfaces a partition of one list and cannot drift by construction — a real
|
|
35
|
+
* advantage — but it makes the block read a finding whose only role at that
|
|
36
|
+
* point is to be a key, in order to learn a ref it was already handed.
|
|
37
|
+
*
|
|
38
|
+
* ## Nothing here decides that a refusal is worth drawing
|
|
39
|
+
*
|
|
40
|
+
* A refusal naming an issue the drawn page does not carry STILL DRAWS ITS CARD.
|
|
41
|
+
* `findings.ts` keeps such a refusal on purpose — filtering to the loaded set
|
|
42
|
+
* would drop findings on exactly the issues a paging boundary has not reached —
|
|
43
|
+
* and `./surface.ts` deliberately gives it no rail row. What it loses is the
|
|
44
|
+
* move that needs a row: see {@link revealControl}. It keeps the outward link,
|
|
45
|
+
* because leaving the application does not need a local row, and it keeps its
|
|
46
|
+
* prose, because the finding is true.
|
|
47
|
+
*
|
|
48
|
+
* ## The block is a tab stop for the same reason the panel is
|
|
49
|
+
*
|
|
50
|
+
* Every control here is conditional, so a block whose refusals all name
|
|
51
|
+
* unloaded issues, with no URL resolver supplied, has NO focusable descendant —
|
|
52
|
+
* and browsers disagree about putting a generic container in the tab order.
|
|
53
|
+
* `./panel.ts` met this and settled it; this is the same answer one leaf over.
|
|
54
|
+
*
|
|
55
|
+
* @see https://github.com/autnmy/issuegraph/blob/main/SPEC.md
|
|
56
|
+
*/
|
|
57
|
+
import { element, isLinkable } from '@issuegraph/viewer';
|
|
58
|
+
import { AUDIT_KIND_ATTRIBUTE } from "./panel.js";
|
|
59
|
+
/**
|
|
60
|
+
* The class every card here carries, as a value rather than a literal at four
|
|
61
|
+
* call sites.
|
|
62
|
+
*
|
|
63
|
+
* IT IS THE `AuditClass` MEMBER, NOT A SECOND NAME FOR IT. The chip's hue comes
|
|
64
|
+
* from `./styles.ts`'s `[data-ig-audit-kind='encoding-refused']` rule, which
|
|
65
|
+
* `./panel.ts` was drawing until this module took the class — so spelling it
|
|
66
|
+
* differently here would leave that rule dead and the chip unstyled.
|
|
67
|
+
*/
|
|
68
|
+
const REFUSED_KIND = 'encoding-refused';
|
|
69
|
+
/**
|
|
70
|
+
* The refusals this block draws: deduplicated by ref, first occurrence winning.
|
|
71
|
+
*
|
|
72
|
+
* THE RULE IS `encodingRefusedFindings`', repeated here on purpose and stated
|
|
73
|
+
* in the header. A host that reports one issue twice has one refusal, so it has
|
|
74
|
+
* one finding and must have one card — an arithmetic the count depends on.
|
|
75
|
+
*/
|
|
76
|
+
function refusalsToDraw(refusals) {
|
|
77
|
+
const seen = new Set();
|
|
78
|
+
const drawn = [];
|
|
79
|
+
for (const refusal of refusals) {
|
|
80
|
+
if (seen.has(refusal.ref))
|
|
81
|
+
continue;
|
|
82
|
+
seen.add(refusal.ref);
|
|
83
|
+
drawn.push(refusal);
|
|
84
|
+
}
|
|
85
|
+
return drawn;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* An accessible name that cannot collide, built the way this package builds
|
|
89
|
+
* every other one.
|
|
90
|
+
*
|
|
91
|
+
* THE REF IS APPENDED, NEVER INTERPOLATED — the `WorkspaceWords.whyRank` idiom,
|
|
92
|
+
* and the reason `./panel.ts` records is the one that binds here too: in a
|
|
93
|
+
* screen reader's BUTTON LIST the surrounding card is gone and the name is all
|
|
94
|
+
* a reader has, so two cards drawing one host word yield two controls a reader
|
|
95
|
+
* cannot tell apart. The ref is unique per card by {@link refusalsToDraw}, so
|
|
96
|
+
* this cannot collide by construction rather than by inspection.
|
|
97
|
+
*
|
|
98
|
+
* It adds no English: the ref is already the card's visible heading line.
|
|
99
|
+
*/
|
|
100
|
+
function controlName(word, ref) {
|
|
101
|
+
return `${word} ${ref}`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The outward link, or `null` when there is nowhere safe to send the reader.
|
|
105
|
+
*
|
|
106
|
+
* AN ANCHOR RATHER THAN A BUTTON, because it leaves the document — a control
|
|
107
|
+
* that navigates away and announces itself as a button tells a reader the wrong
|
|
108
|
+
* thing about what pressing it does. `rel` carries both `noreferrer` and
|
|
109
|
+
* `noopener`: the new context must not be handed a reference back to this one.
|
|
110
|
+
*
|
|
111
|
+
* IT CARRIES A `data-ig-command` PURELY SO THE BASELINE CAN SEE IT.
|
|
112
|
+
* `a11y/baseline.ts` records a control through the attribute channels it knows,
|
|
113
|
+
* and an anchor bearing nothing but `href` is invisible to it — a control this
|
|
114
|
+
* package ships and its own accessibility artifact cannot see is exactly what
|
|
115
|
+
* that artifact exists to make impossible.
|
|
116
|
+
*
|
|
117
|
+
* THE MOUNT REFUSES TO DISPATCH IT, and that refusal is the other half of this
|
|
118
|
+
* decision rather than an unrelated guard. Nothing handles the name, so the
|
|
119
|
+
* command would come back unclaimed — but the mount schedules a redraw anyway,
|
|
120
|
+
* which replaces the surface's markup and detaches this anchor mid-activation.
|
|
121
|
+
* An `<a>` is exempt from the "cannot navigate" connectedness check, so the
|
|
122
|
+
* navigation would still happen and the cost would have been invisible: a full
|
|
123
|
+
* re-render under the reader's own click, for a command nothing acts on. See
|
|
124
|
+
* `workspace/mount.ts`'s `isNavigating`, which reads this the way it already
|
|
125
|
+
* reads an `input` — a control whose activation the browser owns.
|
|
126
|
+
*/
|
|
127
|
+
function openControl(refusal, words, issueUrl) {
|
|
128
|
+
if (issueUrl === undefined)
|
|
129
|
+
return null;
|
|
130
|
+
const href = issueUrl(refusal.ref);
|
|
131
|
+
// TRIMMED BEFORE THE ALLOWLIST, WHICH WOULD OTHERWISE PASS IT. `isLinkable`
|
|
132
|
+
// canonicalizes the way a URL parser does — it strips tabs, newlines and
|
|
133
|
+
// leading controls — so a resolver answering whitespace leaves it with an
|
|
134
|
+
// empty string, no scheme to object to, and a `true`. The result resolves to
|
|
135
|
+
// the current document, so the control would open a second copy of the
|
|
136
|
+
// workspace: not unsafe, but a move that goes nowhere, which is the rule the
|
|
137
|
+
// reveal control beside it is built on.
|
|
138
|
+
if (href === null || href.trim() === '')
|
|
139
|
+
return null;
|
|
140
|
+
if (!isLinkable(href))
|
|
141
|
+
return null;
|
|
142
|
+
return element('a', {
|
|
143
|
+
class: 'ig-audit-refused-open',
|
|
144
|
+
href,
|
|
145
|
+
target: '_blank',
|
|
146
|
+
rel: 'noreferrer noopener',
|
|
147
|
+
'data-ig-command': 'open-issue-url',
|
|
148
|
+
'data-ig-target': refusal.ref,
|
|
149
|
+
'aria-label': controlName(words.refusedOpen, refusal.ref),
|
|
150
|
+
}, [
|
|
151
|
+
words.refusedOpen,
|
|
152
|
+
// THE GLYPH IS THE FRAME'S AND IT IS NOT A WORD. `aria-hidden` for the
|
|
153
|
+
// reason `./panel.ts`'s `◆` is: the anchor already announces that it
|
|
154
|
+
// opens elsewhere, so the arrow would be said twice.
|
|
155
|
+
element('span', { class: 'ig-audit-refused-away', 'aria-hidden': 'true' }, ['↗']),
|
|
156
|
+
]);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* The control that puts the reader on the issue, or `null` when it could not
|
|
160
|
+
* move them.
|
|
161
|
+
*
|
|
162
|
+
* IT PUBLISHES `reveal-issue`, NEVER `select-issue`, and the distinction is the
|
|
163
|
+
* whole of this control's safety — the same one `./panel.ts` records.
|
|
164
|
+
* `select-issue` is a POINTER: with a relationship draft awaiting its target,
|
|
165
|
+
* `workspace/host.ts` reads a pointer as CHOOSING that target and emits the
|
|
166
|
+
* create proposal. So a control labelled "go and rewrite this" would have
|
|
167
|
+
* declared a relationship, from the surface whose stated rule is that it never
|
|
168
|
+
* offers a remedy. `reveal-issue` moves the selection, abandons the draft, and
|
|
169
|
+
* can produce no edit at all.
|
|
170
|
+
*
|
|
171
|
+
* WITHHELD FOR A REF THE DRAWN DOCUMENT DOES NOT CARRY, on `navigableMember`'s
|
|
172
|
+
* rule: a control naming a row that is not there advertises a move it cannot
|
|
173
|
+
* make, and the mount reconciles the unknown selection straight back away.
|
|
174
|
+
*/
|
|
175
|
+
function revealControl(refusal, words, known) {
|
|
176
|
+
if (!known.has(refusal.ref))
|
|
177
|
+
return null;
|
|
178
|
+
return element('button', {
|
|
179
|
+
type: 'button',
|
|
180
|
+
class: 'ig-audit-refused-rewrite',
|
|
181
|
+
'data-ig-command': 'reveal-issue',
|
|
182
|
+
'data-ig-target': refusal.ref,
|
|
183
|
+
'aria-label': controlName(words.refusedRewrite, refusal.ref),
|
|
184
|
+
}, [words.refusedRewrite]);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* The reader's own words about this refusal, and the line it stopped on.
|
|
188
|
+
*
|
|
189
|
+
* ONE ELEMENT HOLDING BOTH, which is what the frame draws — the diagnostic,
|
|
190
|
+
* then the offending source line under it in a muted tone. Two sibling blocks
|
|
191
|
+
* would read as two facts; they are one fact and its evidence.
|
|
192
|
+
*
|
|
193
|
+
* `null` WHEN THE HOST SUPPLIED NEITHER. A refusal is still a refusal without
|
|
194
|
+
* them — `EncodingRefusal` makes both optional because "this package never
|
|
195
|
+
* produces one, because it never sees a body" — and an empty mono box under the
|
|
196
|
+
* ref would say a reader is missing something rather than that nobody recorded
|
|
197
|
+
* it.
|
|
198
|
+
*/
|
|
199
|
+
function reasonSpec(refusal) {
|
|
200
|
+
const lines = [];
|
|
201
|
+
if (refusal.diagnostic !== undefined && refusal.diagnostic !== '') {
|
|
202
|
+
lines.push(element('span', { class: 'ig-audit-refused-diagnostic' }, [refusal.diagnostic]));
|
|
203
|
+
}
|
|
204
|
+
if (refusal.sourceLine !== undefined && refusal.sourceLine !== '') {
|
|
205
|
+
// RAW BODY TEXT REACHES `element`, NEVER A TAG THIS MODULE WROTE. It can
|
|
206
|
+
// carry markup — a body is a body — and the escaping is `renderMarkup`'s,
|
|
207
|
+
// which is the rule every leaf in this package renders under.
|
|
208
|
+
lines.push(element('span', { class: 'ig-audit-refused-source' }, [refusal.sourceLine]));
|
|
209
|
+
}
|
|
210
|
+
if (lines.length === 0)
|
|
211
|
+
return null;
|
|
212
|
+
return element('div', { class: 'ig-audit-refused-reason' }, lines);
|
|
213
|
+
}
|
|
214
|
+
/** One refusal's card: the chip and ref, the reason, and what can be done. */
|
|
215
|
+
function refusalSpec(refusal, options) {
|
|
216
|
+
const { words, known, issueUrl } = options;
|
|
217
|
+
const controls = [
|
|
218
|
+
openControl(refusal, words, issueUrl),
|
|
219
|
+
revealControl(refusal, words, known),
|
|
220
|
+
].filter((control) => control !== null);
|
|
221
|
+
return element('li', {
|
|
222
|
+
class: 'ig-audit-refused-card',
|
|
223
|
+
// `data-ig-audit-kind`, NEVER `data-ig-audit`. `./styles.ts` ends with an
|
|
224
|
+
// UNQUALIFIED `[data-ig-audit]` rule, deliberately, because it lands on a
|
|
225
|
+
// row the viewer rendered and this layer may not rewrite that row's
|
|
226
|
+
// `class` — so an element out here carrying it picks up the rail's gold
|
|
227
|
+
// left-bar whatever hue it was given. `./panel.ts` records the same trap.
|
|
228
|
+
[AUDIT_KIND_ATTRIBUTE]: REFUSED_KIND,
|
|
229
|
+
}, [
|
|
230
|
+
element('div', { class: 'ig-audit-refused-head' }, [
|
|
231
|
+
element('span', { class: 'ig-audit-chip', [AUDIT_KIND_ATTRIBUTE]: REFUSED_KIND }, [
|
|
232
|
+
words.classes[REFUSED_KIND],
|
|
233
|
+
]),
|
|
234
|
+
element('span', { class: 'ig-audit-refused-ref' }, [refusal.ref]),
|
|
235
|
+
]),
|
|
236
|
+
reasonSpec(refusal),
|
|
237
|
+
// NO EMPTY CONTROL ROW. Both controls are conditional, and a card that
|
|
238
|
+
// can offer neither is inert rather than broken — see the header.
|
|
239
|
+
controls.length === 0
|
|
240
|
+
? null
|
|
241
|
+
: element('div', { class: 'ig-audit-refused-controls' }, controls),
|
|
242
|
+
]);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* The refused block, or `null` when the host reported no refusals.
|
|
246
|
+
*
|
|
247
|
+
* `null` RATHER THAN AN EMPTY BLOCK, the same call `renderAuditPanel` makes: a
|
|
248
|
+
* heading over an empty region is not a control, and this zone's space belongs
|
|
249
|
+
* to the selection.
|
|
250
|
+
*/
|
|
251
|
+
export function renderEncodingRefusedBlock(encodingRefused, options) {
|
|
252
|
+
const drawn = refusalsToDraw(encodingRefused);
|
|
253
|
+
if (drawn.length === 0)
|
|
254
|
+
return null;
|
|
255
|
+
const { words } = options;
|
|
256
|
+
return element('section', {
|
|
257
|
+
class: 'ig-audit-refused',
|
|
258
|
+
// A `section` WITH NO NAME IS NOT A LANDMARK — the implicit `region` role
|
|
259
|
+
// is conditional on an accessible name, so an unnamed one is exposed as
|
|
260
|
+
// nothing. `./panel.ts` states the same rule.
|
|
261
|
+
'aria-label': words.refusedHeading,
|
|
262
|
+
// A TAB STOP. Every control below is conditional, so this block can have
|
|
263
|
+
// no focusable descendant at all — see the header.
|
|
264
|
+
tabindex: '0',
|
|
265
|
+
}, [
|
|
266
|
+
// A REAL HEADING, AT THE PANEL'S LEVEL. `./panel.ts` records what a `span`
|
|
267
|
+
// cost it: the section went invisible to heading navigation and left a
|
|
268
|
+
// gap in the column's outline. This block is drawn ABOVE that `h2` as its
|
|
269
|
+
// sibling, so anything shallower here would reopen the gap the panel
|
|
270
|
+
// closed — and anything deeper would claim a nesting the markup does not
|
|
271
|
+
// have. Two peers, two `h2`s.
|
|
272
|
+
element('h2', { class: 'ig-audit-refused-heading' }, [words.refusedHeading]),
|
|
273
|
+
element('ul', { class: 'ig-audit-refused-list' }, drawn.map((refusal) => refusalSpec(refusal, options))),
|
|
274
|
+
]);
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=refused.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refused.js","sourceRoot":"","sources":["../../src/audit/refused.ts"],"names":[],"mappings":"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"}
|
package/dist/audit/styles.d.ts
CHANGED
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
* There is no transition, no animation and no `@keyframes` here, and there is a
|
|
34
34
|
* test that says so.
|
|
35
35
|
*/
|
|
36
|
-
export declare const auditStylesheet = "\n.ig-audit {\n align-items: center;\n display: inline-flex;\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size-small);\n gap: var(--ig-space-tight);\n}\n\n.ig-audit-toggle {\n align-items: center;\n background: none;\n border: 0;\n color: var(--ig-text-muted);\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n gap: var(--ig-space-tight);\n padding: 0;\n}\n\n.ig-audit-toggle[aria-pressed='true'] {\n color: var(--ig-text);\n}\n\n.ig-audit-count {\n color: var(--ig-text);\n font-family: var(--ig-font-mono);\n font-variant-numeric: tabular-nums;\n}\n\n[data-ig-audit] {\n box-shadow: inset var(--ig-stroke-audit) 0 0 0 var(--ig-edge-serialize-with);\n}\n";
|
|
36
|
+
export declare const auditStylesheet = "\n.ig-audit {\n align-items: center;\n display: inline-flex;\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size-small);\n gap: var(--ig-space-tight);\n}\n\n.ig-audit-toggle {\n align-items: center;\n background: none;\n border: 0;\n color: var(--ig-text-muted);\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n gap: var(--ig-space-tight);\n padding: 0;\n}\n\n.ig-audit-toggle[aria-pressed='true'] {\n color: var(--ig-text);\n}\n\n.ig-audit-count {\n color: var(--ig-text);\n font-family: var(--ig-font-mono);\n font-variant-numeric: tabular-nums;\n}\n\n[data-ig-audit] {\n box-shadow: inset var(--ig-stroke-audit) 0 0 0 var(--ig-edge-serialize-with);\n}\n\n/* \u00A717d'S PANEL. Note what it does NOT select on: data-ig-audit,\n whose rule immediately above is deliberately unqualified because it lands on a\n row the VIEWER rendered. A chip wearing that attribute would draw the rail's\n gold bar whatever hue the class table gave it, which is the four-hue mapping\n below defeated by one attribute. Chips carry data-ig-audit-kind. */\n/* IT IS THE SELECTION'S PEER, NOT ITS HEADING, so it carries its own padding:\n it is a sibling of .ig-inspector inside the zone rather than a child, and\n that column's padding does not reach it.\n\n IT DECLARES NO SIZE OF ITS OWN, AND THAT IS THE LAYERING. Issue 177 gave the\n audit half the inspector column, scrolling itself past that \u2014 and since the\n fourth class moved to ./refused.ts the half belongs to the REGION holding both\n surfaces rather than to this panel. Either way it is a fact about SHARING A\n COLUMN, not a fact about the panel, so it is declared by the composition that\n owns the zone. See workspace/styles.ts.\n\n The difference is reachable rather than theoretical: renderAuditPanel and\n this stylesheet are both public exports, so a consumer can draw the panel\n outside renderWorkspace. Capping it there would hide findings behind an inner\n scrollbar with half the container left empty and no selection detail to\n reserve the space for. A leaf that sized itself would be wrong in every\n composition but one. */\n.ig-audit-panel {\n border-bottom: var(--ig-stroke) solid var(--ig-line);\n display: flex;\n flex-direction: column;\n font-family: var(--ig-font-ui);\n gap: var(--ig-space-snug);\n min-height: 0;\n padding: var(--ig-space);\n}\n\n/* THE RING FOR THE PANEL'S OWN TAB STOP. Unscoped, unlike the sizing above,\n because the tabindex is in this leaf's MARKUP and is therefore carried into\n every composition: a focusable element that shows nothing on focus is a stop\n a keyboard reader lands on blind, wherever it is drawn.\n\n INSET, WHICH IS THE VIEWER'S OWN IDIOM for exactly this shape \u2014 its sheet\n draws every focus ring at a negative offset. Drawn outward it would sit on\n the panel's border box against the zone's edge and the column's own scroll,\n where the top and bottom of the ring are the first thing clipped. */\n.ig-audit-panel:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: calc(var(--ig-focus-ring) * -1);\n}\n\n.ig-audit-panel-head {\n align-items: center;\n display: flex;\n gap: var(--ig-space-tight);\n}\n\n/* THE GOLD IS THE AMBIENT MARK'S, not a fifth hue. \u00A717d names one attention\n colour and the rail bar already spends it; the panel head answering in the\n same gold is what makes the count and the list read as one thing. */\n.ig-audit-mark {\n color: var(--ig-edge-serialize-with);\n font-size: var(--ig-font-size-small);\n}\n\n.ig-audit-panel-count {\n color: var(--ig-edge-serialize-with);\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-small);\n font-variant-numeric: tabular-nums;\n}\n\n.ig-audit-panel-heading {\n color: var(--ig-edge-serialize-with);\n font-weight: inherit;\n margin: 0;\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-small);\n letter-spacing: var(--ig-tracking-group);\n text-transform: uppercase;\n}\n\n/* NO CAP ON THE LIST, AND THAT IS STILL RIGHT \u2014 the bound belongs to the PANEL\n above, not here. Three caps were tried on this element (a fixed length, a\n share of a flex column, that share measured on the right box) and each was\n correct about the previous one's defect while the column stayed the thing\n that could not be bounded from in here. It still cannot: the list has no\n padding, so a scroll container here computes overflow-x to auto and clips the\n focus ring on every card control. The panel carries the share and the\n scrolling; see the rule above. */\n.ig-audit-list {\n display: flex;\n flex-direction: column;\n gap: var(--ig-space-snug);\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.ig-audit-card {\n display: flex;\n flex-direction: column;\n gap: var(--ig-space-micro);\n}\n\n.ig-audit-chip {\n align-self: flex-start;\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius-small);\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-pill);\n padding: 0 var(--ig-space-tight);\n}\n\n.ig-audit-title {\n color: var(--ig-text);\n font-size: var(--ig-font-size);\n margin: 0;\n}\n\n/* SENTENCE-LENGTH COPY TAKES --ig-text-body, NEVER --ig-text-muted. SPEC's\n closing note measures muted at 4.65:1 on a plain surface and about 0.4 less\n inside a tint, which drops it under AA \u2014 so muted is reserved there for short\n mono labels, and a finding's detail is a sentence. */\n.ig-audit-detail {\n color: var(--ig-text-body);\n font-size: var(--ig-font-size-compact);\n line-height: var(--ig-line-height);\n margin: 0;\n}\n\n/* MUTED IS CORRECT HERE, ON THE SAME RULE .ig-audit-refused-source ends this\n file with: the note above reserves muted for SHORT MONO LABELS, and a cycle's\n walk is one \u2014 refs and separators, no prose. Length is not the test and could\n not be: a large ring draws a long line, which is what the wrap below is for.\n What muted is reserved AGAINST is sentence-length COPY. The detail rule one block up takes --ig-text-body because it IS a\n sentence, so it is the wrong neighbour to copy.\n\n break-word, NOT anywhere. A ref is a token worth keeping whole; the refused\n block accepts mid-token breaks because it quotes arbitrary body text, and a\n walk is a list of identifiers a reader has to be able to match against the\n rail. */\n.ig-audit-walk {\n color: var(--ig-text-muted);\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-compact);\n line-height: var(--ig-line-height);\n margin: 0;\n overflow-wrap: break-word;\n}\n\n.ig-audit-show {\n align-self: flex-start;\n background: none;\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius-small);\n color: var(--ig-text);\n cursor: pointer;\n font: inherit;\n font-size: var(--ig-font-size-meta);\n padding: var(--ig-space-micro) var(--ig-space-tight);\n}\n\n.ig-audit-show:hover {\n border-color: var(--ig-accent);\n}\n\n.ig-audit-show:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-space-micro);\n}\n\n/* 17d'S REMEDIES. A row of them under the card's sentence.\n\n THEY TAKE THE SAME CHROME AS .ig-audit-show DELIBERATELY. A remedy and the\n navigation control beside it do the same KIND of thing \u2014 both publish a\n selection and neither writes \u2014 so drawing the remedies louder would promise\n an action they do not perform. 3's whole point is that the judgment stays\n with the owner, and a button styled like a commit invites a click that is\n not one.\n\n WRAPS, because the stale card carries two of them inside a panel of fixed\n width whose cards also indent. A row that cannot wrap pushes its second\n control out of the panel, which is the shape the relationship row one sheet\n over already had to solve. (Worded around two particular verbs on purpose:\n acceptance scans this sheet's PROSE as well as its declarations for the\n vocabulary of a remedy that acts by itself, and it cannot tell a comment\n from a control. Both spellings of that idea are therefore unusable here,\n including in a note explaining why.)\n\n (The width itself is 3's number and lives in workspace/styles.ts, where the\n overlay is positioned. Naming it here would put a length in a sheet whose\n own guard reads comments as well as declarations - which is how this\n paragraph was first written, and caught.) */\n.ig-audit-remedies {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ig-space-tight);\n}\n\n.ig-audit-remedy {\n background: none;\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius-small);\n color: var(--ig-text);\n cursor: pointer;\n font: inherit;\n font-size: var(--ig-font-size-meta);\n padding: var(--ig-space-micro) var(--ig-space-tight);\n}\n\n.ig-audit-remedy:hover {\n border-color: var(--ig-accent);\n}\n\n.ig-audit-remedy:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-space-micro);\n}\n\n/* 17d'S OWN ENTRY POINT - 'filter the rail to these' - in the panel head.\n\n IT SITS AT THE END OF THE HEAD ROW, after the count and the heading, which is\n where the frame draws it. margin-inline-start: auto rather than a width on\n the heading, so the head stays one flex row whatever the host's word is.\n\n aria-pressed IS STYLED, NOT JUST PUBLISHED. 2's ruling is that a filter\n which is visibly on, states what it hides and clears in one click is not a\n refusal - so 'visibly on' is a requirement here rather than a nicety. */\n.ig-audit-filter {\n background: none;\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius-small);\n color: var(--ig-text-muted);\n cursor: pointer;\n font: inherit;\n font-size: var(--ig-font-size-meta);\n margin-inline-start: auto;\n padding: var(--ig-space-micro) var(--ig-space-tight);\n}\n\n.ig-audit-filter[aria-pressed='true'] {\n border-color: var(--ig-accent);\n color: var(--ig-accent);\n}\n\n.ig-audit-filter:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-space-micro);\n}\n\n/* ONE RULE PER CLASS, WRITTEN OUT, never through an intermediate property: the\n viewer's own badge sheet records why \u2014 a --ig-audit-hue set here and read\n here names something no theme and no layout declares, and the token scan\n exists to refuse exactly that.\n\n THE TINTS ARE THE VIEWER'S RECIPE, not new numbers. --ig-tint-fill and\n --ig-tint-border are what .ig-badge[data-edge] already mixes an edge hue\n with, and they are the frame's own chip wash to within a point.\n\n THE TEXT IS THE BASE HUE. The frame lightens each chip's label a step off the\n hue it tints with; those derivatives have no token, and a literal here is\n refused by the scan two files over, so the label takes the hue itself. */\n.ig-audit-chip[data-ig-audit-kind='cycle'] {\n background: color-mix(in srgb, var(--ig-edge-blocked-by) var(--ig-tint-fill), transparent);\n border-color: color-mix(in srgb, var(--ig-edge-blocked-by) var(--ig-tint-border), transparent);\n color: var(--ig-edge-blocked-by);\n}\n\n.ig-audit-chip[data-ig-audit-kind='stale-blocker'] {\n background: color-mix(in srgb, var(--ig-edge-serialize-with) var(--ig-tint-fill), transparent);\n border-color: color-mix(in srgb, var(--ig-edge-serialize-with) var(--ig-tint-border), transparent);\n color: var(--ig-edge-serialize-with);\n}\n\n.ig-audit-chip[data-ig-audit-kind='dead-duplicate-ref'] {\n background: color-mix(in srgb, var(--ig-edge-duplicate-of) var(--ig-tint-fill), transparent);\n border-color: color-mix(in srgb, var(--ig-edge-duplicate-of) var(--ig-tint-border), transparent);\n color: var(--ig-edge-duplicate-of);\n}\n\n.ig-audit-chip[data-ig-audit-kind='encoding-refused'] {\n background: color-mix(in srgb, var(--ig-edge-blocked-by) var(--ig-tint-fill), transparent);\n border-color: color-mix(in srgb, var(--ig-edge-blocked-by) var(--ig-tint-border), transparent);\n color: var(--ig-edge-blocked-by);\n}\n\n/* ---- \u00A717d's fourth class, drawn outside the panel (./refused.ts) ---- */\n\n/* NO SIZE OF ITS OWN, THE SAME ANSWER .ig-audit-panel GIVES ABOVE. This block\n and that panel are the two members of .ig-audit-overlay, which is what the\n inspector zone actually holds, and how much of the zone's single track that\n region may take is a fact about SHARING A COLUMN rather than a fact about\n either leaf. So the share is declared once by the composition that owns the\n zone \u2014 see workspace/styles.ts, which bounds the region alone. */\n.ig-audit-refused {\n display: flex;\n flex-direction: column;\n font-family: var(--ig-font-ui);\n gap: var(--ig-space-snug);\n min-height: 0;\n padding: var(--ig-space);\n}\n\n/* THE RING FOR THIS BLOCK'S TAB STOP, unscoped for the reason the panel's is:\n the tabindex is in this leaf's MARKUP, so it is carried into every\n composition, and a focusable element that shows nothing on focus is a stop a\n keyboard reader lands on blind. Inset, the viewer's idiom, so a ring at the\n zone's edge is not the first thing the column's scroll clips. */\n.ig-audit-refused:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: calc(var(--ig-focus-ring) * -1);\n}\n\n/* THE SAME HEADING TREATMENT AS THE PANEL'S, because they are peers in one\n column and \u00A717d draws them as one section. A second treatment would say they\n were two unrelated things. */\n.ig-audit-refused-heading {\n color: var(--ig-edge-blocked-by);\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-small);\n font-weight: inherit;\n letter-spacing: var(--ig-tracking-group);\n margin: 0;\n text-transform: uppercase;\n}\n\n.ig-audit-refused-list {\n display: flex;\n flex-direction: column;\n gap: var(--ig-space-snug);\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/* THE CARD IS DRAWN, UNLIKE THE PANEL'S. The frame gives this one a surface and\n a border because it sits alone rather than in a list of like items \u2014 it is\n the one finding that is about an ISSUE rather than a relationship, and the\n box is what says so. */\n.ig-audit-refused-card {\n background: var(--ig-surface-2);\n border: var(--ig-stroke) solid var(--ig-card-line);\n border-radius: var(--ig-radius);\n display: flex;\n flex-direction: column;\n gap: var(--ig-space-tight);\n padding: var(--ig-space-tight);\n}\n\n.ig-audit-refused-head {\n align-items: center;\n display: flex;\n gap: var(--ig-space-tight);\n}\n\n.ig-audit-refused-ref {\n color: var(--ig-text);\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-meta);\n}\n\n/* ONE BLOCK, TWO LINES \u2014 the diagnostic and, under it, the line the reader\n stopped on. pre-wrap because the source line is RAW BODY TEXT: it carries\n its own leading space and its own length, and collapsing either would show a\n reader something other than what is in their issue. overflow-wrap keeps a\n long unbroken line inside the column instead of widening the track. */\n.ig-audit-refused-reason {\n display: flex;\n flex-direction: column;\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-meta);\n gap: var(--ig-space-micro);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n\n.ig-audit-refused-diagnostic {\n color: var(--ig-text-body);\n}\n\n/* MUTED IS CORRECT HERE AND NOWHERE NEAR A SENTENCE. SPEC's closing note puts\n muted under AA for sentence-length copy, which is why .ig-audit-detail\n takes --ig-text-body \u2014 but this is a short mono quotation of the reader's own\n input, the exact shape muted is reserved for, and the frame draws it a step\n back from the diagnostic it belongs to. */\n.ig-audit-refused-source {\n color: var(--ig-text-muted);\n}\n\n.ig-audit-refused-controls {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ig-space-tight);\n}\n\n/* ONE TREATMENT FOR BOTH CONTROLS, THOUGH ONE IS AN ANCHOR AND ONE A BUTTON.\n The element differs because what they DO differs \u2014 the link leaves the\n document and must say so to assistive technology \u2014 but they sit side by side\n in the frame as one pair of moves, and drawing them differently would imply a\n difference in weight that \u00A717d does not make. */\n.ig-audit-refused-open,\n.ig-audit-refused-rewrite {\n align-items: center;\n background: none;\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius-small);\n color: var(--ig-text);\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n font-size: var(--ig-font-size-meta);\n gap: var(--ig-space-micro);\n padding: var(--ig-space-micro) var(--ig-space-tight);\n text-decoration: none;\n}\n\n.ig-audit-refused-open:hover,\n.ig-audit-refused-rewrite:hover {\n border-color: var(--ig-accent);\n}\n\n.ig-audit-refused-open:focus-visible,\n.ig-audit-refused-rewrite:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-space-micro);\n}\n\n.ig-audit-refused-away {\n color: var(--ig-text-muted);\n}\n";
|
|
37
37
|
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/audit/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/audit/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAKH,eAAO,MAAM,eAAe,24hBA6c3B,CAAC"}
|