@issuegraph/editor 0.4.0 → 0.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -9
- package/dist/a11y/baseline.d.ts +182 -0
- package/dist/a11y/baseline.d.ts.map +1 -0
- package/dist/a11y/baseline.js +434 -0
- package/dist/a11y/baseline.js.map +1 -0
- package/dist/audit/findings.d.ts +107 -1
- package/dist/audit/findings.d.ts.map +1 -1
- package/dist/audit/findings.js +113 -6
- 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 +429 -1
- 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 +53 -13
- package/dist/audit/surface.js.map +1 -1
- package/dist/create/draft.d.ts +36 -0
- package/dist/create/draft.d.ts.map +1 -1
- package/dist/create/draft.js +40 -0
- package/dist/create/draft.js.map +1 -1
- package/dist/create/keys.d.ts +134 -9
- package/dist/create/keys.d.ts.map +1 -1
- package/dist/create/keys.js +119 -20
- package/dist/create/keys.js.map +1 -1
- package/dist/firstpass/candidates.d.ts +17 -1
- package/dist/firstpass/candidates.d.ts.map +1 -1
- package/dist/index.d.ts +42 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -14
- 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 +76 -20
- 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 +78 -7
- package/dist/overlay/styles.js.map +1 -1
- package/dist/picker/render.d.ts +26 -16
- package/dist/picker/render.d.ts.map +1 -1
- package/dist/picker/render.js +25 -36
- package/dist/picker/render.js.map +1 -1
- package/dist/picker/styles.d.ts +7 -7
- package/dist/picker/styles.d.ts.map +1 -1
- package/dist/picker/styles.js +7 -36
- package/dist/picker/styles.js.map +1 -1
- package/dist/picker/view.d.ts +8 -4
- package/dist/picker/view.d.ts.map +1 -1
- package/dist/picker/view.js +4 -3
- package/dist/picker/view.js.map +1 -1
- package/dist/picker/words.d.ts +12 -10
- package/dist/picker/words.d.ts.map +1 -1
- package/dist/picker/words.js +12 -8
- package/dist/picker/words.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 +129 -11
- 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 +206 -28
- 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 +133 -4
- package/dist/scale/styles.js.map +1 -1
- package/dist/workspace/chrome.d.ts +1 -1
- package/dist/workspace/chrome.d.ts.map +1 -1
- package/dist/workspace/chrome.js +48 -0
- package/dist/workspace/chrome.js.map +1 -1
- package/dist/workspace/firstpass.d.ts +166 -0
- package/dist/workspace/firstpass.d.ts.map +1 -0
- package/dist/workspace/firstpass.js +151 -0
- package/dist/workspace/firstpass.js.map +1 -0
- package/dist/workspace/host.d.ts +283 -11
- package/dist/workspace/host.d.ts.map +1 -1
- package/dist/workspace/host.js +614 -43
- package/dist/workspace/host.js.map +1 -1
- package/dist/workspace/inspector.d.ts +72 -2
- package/dist/workspace/inspector.d.ts.map +1 -1
- package/dist/workspace/inspector.js +26 -0
- package/dist/workspace/inspector.js.map +1 -1
- package/dist/workspace/mount.d.ts +75 -6
- package/dist/workspace/mount.d.ts.map +1 -1
- package/dist/workspace/mount.js +1851 -60
- 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/recovery.d.ts +155 -0
- package/dist/workspace/recovery.d.ts.map +1 -0
- package/dist/workspace/recovery.js +156 -0
- package/dist/workspace/recovery.js.map +1 -0
- package/dist/workspace/render.d.ts +779 -2
- package/dist/workspace/render.d.ts.map +1 -1
- package/dist/workspace/render.js +1727 -61
- 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/styles.d.ts +1 -1
- package/dist/workspace/styles.d.ts.map +1 -1
- package/dist/workspace/styles.js +1405 -42
- package/dist/workspace/styles.js.map +1 -1
- package/package.json +4 -4
|
@@ -16,20 +16,27 @@
|
|
|
16
16
|
* string — would have re-introduced exactly the hand-built escaping surface the
|
|
17
17
|
* spec grammar exists to remove.
|
|
18
18
|
*
|
|
19
|
-
* ## The chips are a KEYED LIST, and
|
|
19
|
+
* ## The chips are a KEYED LIST here, and the WORKSPACE draws them on the row
|
|
20
20
|
*
|
|
21
21
|
* Said plainly because the earlier wording did not: `data-ig-key` has no
|
|
22
|
-
* browser behaviour of its own.
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
22
|
+
* browser behaviour of its own. In THIS surface the chips render as a list
|
|
23
|
+
* beside the rail, and the list is built to stand on its own: every chip NAMES
|
|
24
|
+
* the row it describes, which is what lets a reader account for the rows that
|
|
25
|
+
* got no chip.
|
|
26
26
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
27
|
+
* THE DEFERRAL THIS COMMENT USED TO CARRY IS DISCHARGED, and its premise was
|
|
28
|
+
* wrong rather than merely stale. It said placing a chip on its row "needs that
|
|
29
|
+
* row's geometry — which only a mount has". It does not: a row is a keyed SPEC
|
|
30
|
+
* before it is an element, and `workspace/render.ts`'s `markRail` was already
|
|
31
|
+
* walking that tree to compose the audit's mark onto it. So the workspace
|
|
32
|
+
* composes the chip the same way — no geometry, no mount, no positioning — and
|
|
33
|
+
* `parts.ts` holds the one builder both call.
|
|
34
|
+
*
|
|
35
|
+
* This surface keeps the list because it is the honest answer for a host that
|
|
36
|
+
* renders WITHOUT the workspace's rail: there is no row to sit on, so naming
|
|
37
|
+
* the row in text is the only thing that accounts for the ones that did not
|
|
38
|
+
* move. `chipSpec`'s `placed` arm is the other half, and it drops that name
|
|
39
|
+
* because there the row already carries it.
|
|
33
40
|
*
|
|
34
41
|
* ## Two rejected alternatives from the design, recorded so they stay rejected
|
|
35
42
|
*
|
|
@@ -46,130 +53,10 @@
|
|
|
46
53
|
* store stay the single source of truth. A second copy of "has this been
|
|
47
54
|
* dismissed" held out here is the drift the command grammar exists to avoid.
|
|
48
55
|
*/
|
|
49
|
-
import {
|
|
56
|
+
import { element, renderMarkup, renderViewer, resolveTheme, } from '@issuegraph/viewer';
|
|
57
|
+
import { chipSpec, summarySpec } from "./parts.js";
|
|
50
58
|
import { reevaluateView } from "./view.js";
|
|
51
59
|
import { reevaluateStylesheet } from "./styles.js";
|
|
52
|
-
function countWord(count, word) {
|
|
53
|
-
return [
|
|
54
|
-
element('span', { class: 'ig-change-count' }, [String(count)]),
|
|
55
|
-
element('span', { class: 'ig-change-word' }, [word]),
|
|
56
|
-
];
|
|
57
|
-
}
|
|
58
|
-
function summarySpec(summary, words) {
|
|
59
|
-
return element('div', {
|
|
60
|
-
class: 'ig-change-summary',
|
|
61
|
-
// Omitted rather than falsified while there is nothing to report: an
|
|
62
|
-
// element() attribute whose value is `undefined` is not written at all,
|
|
63
|
-
// and `data-unchanged="false"` would claim an edit landed and moved
|
|
64
|
-
// nothing when no edit has landed.
|
|
65
|
-
'data-unchanged': summary === null ? undefined : summary.unchanged ? 'true' : 'false',
|
|
66
|
-
'data-op': summary?.op,
|
|
67
|
-
'data-mutation': summary?.mutationId,
|
|
68
|
-
}, [
|
|
69
|
-
// THE LIVE REGION IS ALWAYS MOUNTED, AND EMPTY UNTIL THERE IS SOMETHING
|
|
70
|
-
// TO SAY. A `role="status"` node that is CREATED already carrying its
|
|
71
|
-
// text is not reliably announced — the region has to exist first and
|
|
72
|
-
// then have its contents change — so rendering it only alongside a
|
|
73
|
-
// summary would silently lose the FIRST summary after a load, which is
|
|
74
|
-
// the one a reader is most likely to be waiting for.
|
|
75
|
-
//
|
|
76
|
-
// It is also why the region is this wrapper rather than the content
|
|
77
|
-
// inside it: an edit that moved something renders a list and one that
|
|
78
|
-
// moved nothing renders a paragraph, so a role on either would come and
|
|
79
|
-
// go with the shape. And the dismiss button stays OUTSIDE, or its label
|
|
80
|
-
// would be re-announced with every summary.
|
|
81
|
-
//
|
|
82
|
-
// It is a role, not a timer. Nothing about it expires and the region
|
|
83
|
-
// stays put until the next edit or an explicit dismissal.
|
|
84
|
-
element('div', { class: 'ig-change-line', role: 'status' }, summary === null
|
|
85
|
-
? []
|
|
86
|
-
: [
|
|
87
|
-
// THE ZERO CASE RENDERS, in the summary's own place. An edit that
|
|
88
|
-
// landed and moved nothing is the finding an owner auditing an
|
|
89
|
-
// encoding most needs, and drawing nothing for it is the defect
|
|
90
|
-
// this branch prevents.
|
|
91
|
-
summary.unchanged
|
|
92
|
-
? element('p', { class: 'ig-change-unchanged' }, [words.unchanged])
|
|
93
|
-
: element('ul', { class: 'ig-change-parts' }, summary.parts.map((part) => element('li', { class: 'ig-change-part', 'data-facet': part.facet }, [
|
|
94
|
-
...countWord(part.count, words.facets[part.facet]),
|
|
95
|
-
]))),
|
|
96
|
-
]),
|
|
97
|
-
// ITS OWN CLASS, not the ladder's `.ig-chip`. That class is defined only
|
|
98
|
-
// in `scale/styles.ts`, so borrowing it would leave this control unstyled
|
|
99
|
-
// for a host that installs this surface and not that one. Folding the two
|
|
100
|
-
// chip looks into one rule is the assembling change's call, not this
|
|
101
|
-
// leaf's — it is the change that first has both on screen at once.
|
|
102
|
-
//
|
|
103
|
-
// Absent with no summary: a control that clears nothing is a control that
|
|
104
|
-
// does nothing, and the region above is what has to persist, not this.
|
|
105
|
-
summary === null
|
|
106
|
-
? null
|
|
107
|
-
: element('button', { type: 'button', class: 'ig-change-dismiss', 'data-ig-command': 'dismiss-change' }, [words.dismiss]),
|
|
108
|
-
]);
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* What one issue's delta says, as spans.
|
|
112
|
-
*
|
|
113
|
-
* IT NAMES A DIRECTION AND A DISTANCE, NEVER A RANK. `RankMovement.from` and
|
|
114
|
-
* `.to` are the deriver's 0-BASED positions, while the rail beside them renders
|
|
115
|
-
* the viewer's 1-BASED ranks — so printing either as a number would put two
|
|
116
|
-
* different bases side by side and read as an off-by-one. `by` is a distance,
|
|
117
|
-
* which is basis-independent and safe to print. A host that knows the basis and
|
|
118
|
-
* wants the endpoints reads them off `view.chips[].deltas`, which carries every
|
|
119
|
-
* `RankDelta` untouched.
|
|
120
|
-
*/
|
|
121
|
-
function memberSpec(delta, words, named) {
|
|
122
|
-
return element('span', { class: 'ig-delta-member', 'data-ref': delta.ref }, [
|
|
123
|
-
// NAMED ONLY WHEN THE NAME ADDS SOMETHING. On a chip whose single member IS
|
|
124
|
-
// the row, the row key above has already said it and repeating it is noise.
|
|
125
|
-
// Everywhere else the ref is load-bearing: two members reading
|
|
126
|
-
// `lead 1 down 1 down` says the row moved twice rather than that a unit of
|
|
127
|
-
// two each moved down one, and a lone member that is NOT the lead is a
|
|
128
|
-
// change to an issue the row key does not name at all.
|
|
129
|
-
named ? element('span', { class: 'ig-delta-ref' }, [delta.ref]) : null,
|
|
130
|
-
delta.movement === undefined
|
|
131
|
-
? null
|
|
132
|
-
: element('span', {
|
|
133
|
-
class: 'ig-delta-move',
|
|
134
|
-
'data-direction': delta.movement.direction,
|
|
135
|
-
'data-by': delta.movement.by,
|
|
136
|
-
}, [...countWord(delta.movement.by, words.direction[delta.movement.direction])]),
|
|
137
|
-
delta.readiness === undefined
|
|
138
|
-
? null
|
|
139
|
-
: element('span', { class: 'ig-delta-readiness', 'data-readiness': delta.readiness }, [
|
|
140
|
-
words.facets[delta.readiness],
|
|
141
|
-
]),
|
|
142
|
-
delta.presence === undefined
|
|
143
|
-
? null
|
|
144
|
-
: element('span', { class: 'ig-delta-presence', 'data-presence': delta.presence }, [
|
|
145
|
-
words.facets[delta.presence],
|
|
146
|
-
]),
|
|
147
|
-
]);
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* One ROW's chip — which can speak for more than one issue.
|
|
151
|
-
*
|
|
152
|
-
* A `together-with` unit is one row and several refs, so its members are nested
|
|
153
|
-
* inside a single chip rather than given one each. Each keeps its own
|
|
154
|
-
* `data-ref`, so a host can still tell which member moved.
|
|
155
|
-
*
|
|
156
|
-
* IT NAMES ITS ROW IN TEXT, not only in `KEY_ATTRIBUTE`. Unpositioned, a chip
|
|
157
|
-
* that carried its key only as an attribute said nothing a reader could see
|
|
158
|
-
* about WHICH row moved — and the rows that did not move are accounted for
|
|
159
|
-
* precisely by not being named here. The key is data, not language, so naming
|
|
160
|
-
* it costs the host no word.
|
|
161
|
-
*/
|
|
162
|
-
function chipSpec(chip, words) {
|
|
163
|
-
// One member whose ref IS the row: the key names it, so naming it again would
|
|
164
|
-
// be the only text on the chip that says nothing. Any other shape — several
|
|
165
|
-
// members, or a lone member the row is not named after — needs each fact
|
|
166
|
-
// attributed, or the chip reads as one row's facts repeated.
|
|
167
|
-
const named = chip.deltas.length > 1 || chip.deltas[0]?.ref !== chip.key;
|
|
168
|
-
return element('li', { class: 'ig-delta-chip', [KEY_ATTRIBUTE]: chip.key }, [
|
|
169
|
-
element('span', { class: 'ig-delta-key' }, [chip.key]),
|
|
170
|
-
...chip.deltas.map((delta) => memberSpec(delta, words, named)),
|
|
171
|
-
]);
|
|
172
|
-
}
|
|
173
60
|
/** Render the order, and what the last edit did to it. */
|
|
174
61
|
export function renderReevaluate(input, options) {
|
|
175
62
|
const status = options.status ?? 'settled';
|
|
@@ -193,8 +80,7 @@ export function renderReevaluate(input, options) {
|
|
|
193
80
|
// sure of — which is why nothing here re-ranks anything: the ranks drawn
|
|
194
81
|
// are the ones the caller vouched for, and a chip's movement is drawn as
|
|
195
82
|
// a chip rather than as a rank.
|
|
196
|
-
view.
|
|
197
|
-
summarySpec(view.summary, options.words),
|
|
83
|
+
summarySpec(view.summary, options.words, { held: view.held }),
|
|
198
84
|
view.chips.length === 0
|
|
199
85
|
? null
|
|
200
86
|
: element('ul', { class: 'ig-delta-list' }, view.chips.map((chip) => chipSpec(chip, options.words))),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/reevaluate/render.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/reevaluate/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,OAAO,EAGL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,YAAY,GACb,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAuB,cAAc,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AA0BnD,0DAA0D;AAC1D,MAAM,UAAU,gBAAgB,CAC9B,KAAqB,EACrB,OAA0B;IAE1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;IAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE;QAC/B,UAAU,EAAE,QAAQ;QACpB,KAAK;QACL,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;KACzF,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEhE,MAAM,IAAI,GAAG,OAAO,CAClB,SAAS,EACT;QACE,KAAK,EAAE,eAAe;QACtB,uEAAuE;QACvE,0EAA0E;QAC1E,sCAAsC;QACtC,YAAY,EAAE,MAAM;KACrB,EACD;QACE,wEAAwE;QACxE,sEAAsE;QACtE,uEAAuE;QACvE,yEAAyE;QACzE,yEAAyE;QACzE,gCAAgC;QAChC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7D,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YACrB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,OAAO,CACL,IAAI,EACJ,EAAE,KAAK,EAAE,eAAe,EAAE,EAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CACxD;QACL,0DAA0D;QAC1D,IAAI,CAAC,KAAK,CAAC,IAAI;KAChB,CACF,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,KAAK,oBAAoB,EAAE;QACjD,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;KACxD,CAAC;AACJ,CAAC"}
|
|
@@ -20,5 +20,5 @@
|
|
|
20
20
|
* evidence the edit worked disappears before it is read. A stylesheet is a
|
|
21
21
|
* place both could creep back in.
|
|
22
22
|
*/
|
|
23
|
-
export declare const reevaluateStylesheet = "\n.ig-reevaluate {\n display: flex;\n flex-direction: column;\n gap: var(--ig-space);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size);\n line-height: var(--ig-line-height);\n color: var(--ig-text-body);\n}\n\n/* Greyed one step, and never hidden: a stale order that is labelled is still\n the most useful thing on the screen.\n\n A FILTER, NOT A COLOUR, and that is the whole point of this rule. color on\n the rail greys almost nothing: the viewer's own stylesheet sets color\n directly on .ig-title, .ig-id and .ig-hold, and carries the stations\n and badges in background and border-color, none of which inherit at all.\n A specified value beats an inherited one, so the stale order would have kept\n its normal palette while this rule looked like it was doing something.\n\n The enumeration is the trap here, not the oversight: listing the descendants\n to override is the \"a static rule names one spelling of a capability\"\n class this repository has already paid for several times over, and it would\n go stale the first time layer 1 colours something new. filter applies to\n an element AND its whole subtree whatever properties that subtree sets, so\n a descendant added later is covered by construction. styles.test.ts pins\n both halves: that layer 1 really does colour its own descendants, and that\n this rule is not a bare color. */\n.ig-reevaluate[data-order='held'] .ig-viewer {\n filter: grayscale(1);\n}\n\n.ig-order-computing {\n margin: 0;\n color: var(--ig-text-muted);\n font-size: var(--ig-font-size-small);\n}\n\n.ig-change-summary {\n display: flex;\n gap: var(--ig-space);\n align-items: baseline;\n flex-wrap: wrap;\n}\n\n.ig-change-line {\n display: flex;\n align-items: baseline;\n}\n\n.ig-change-parts {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-wrap: wrap;\n /* The blast radius reads as ONE line. The gap is the separator, so no\n punctuation glyph is baked into the markup \u2014 that would be a second\n language choice on top of the words themselves. */\n gap: var(--ig-space);\n}\n\n.ig-change-part {\n display: flex;\n gap: var(--ig-space-tight);\n align-items: baseline;\n}\n\n.ig-change-count {\n font-family: var(--ig-font-mono);\n color: var(--ig-text);\n}\n\n.ig-change-word {\n color: var(--ig-text-body);\n}\n\n.ig-change-unchanged {\n margin: 0;\n color: var(--ig-text-body);\n}\n\n.ig-change-dismiss {\n align-self: flex-start;\n background: var(--ig-surface-2);\n color: var(--ig-text-body);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight) var(--ig-space);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size-small);\n cursor: pointer;\n}\n\n.ig-change-dismiss:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-space-tight);\n}\n\n.ig-delta-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--ig-space-tight);\n}\n\n.ig-delta-chip {\n display: flex;\n gap: var(--ig-space-tight);\n align-items: baseline;\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight);\n background: var(--ig-surface-2);\n}\n\n.ig-delta-member {\n display: flex;\n gap: var(--ig-space-tight);\n align-items: baseline;\n}\n\n.ig-delta-key,\n.ig-delta-ref {\n font-family: var(--ig-font-mono);\n color: var(--ig-text-muted);\n}\n\n/* The count and its word are adjacent spans with no text between them, so\n without this they render as 2up. Same reason .ig-change-part has one. */\n.ig-delta-move {\n display: flex;\n gap: var(--ig-space-tight);\n align-items: baseline;\n}\n\n.ig-delta-move[data-direction='up'] .ig-change-count {\n color: var(--ig-station-ready);\n}\n\n.ig-delta-move[data-direction='down'] .ig-change-count {\n color: var(--ig-text-muted);\n}\n\n.ig-delta-readiness[data-readiness='promoted'] {\n color: var(--ig-station-ready);\n}\n\n.ig-delta-readiness[data-readiness='newly-held'] {\n color: var(--ig-station-held);\n}\n\n.ig-delta-presence {\n color: var(--ig-text-muted);\n}\n";
|
|
23
|
+
export declare const reevaluateStylesheet = "\n.ig-reevaluate {\n display: flex;\n flex-direction: column;\n gap: var(--ig-space);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size);\n line-height: var(--ig-line-height);\n color: var(--ig-text-body);\n}\n\n/* Greyed one step, and never hidden: a stale order that is labelled is still\n the most useful thing on the screen.\n\n A FILTER, NOT A COLOUR, and that is the whole point of this rule. color on\n the rail greys almost nothing: the viewer's own stylesheet sets color\n directly on .ig-title, .ig-id and .ig-hold, and carries the stations\n and badges in background and border-color, none of which inherit at all.\n A specified value beats an inherited one, so the stale order would have kept\n its normal palette while this rule looked like it was doing something.\n\n The enumeration is the trap here, not the oversight: listing the descendants\n to override is the \"a static rule names one spelling of a capability\"\n class this repository has already paid for several times over, and it would\n go stale the first time layer 1 colours something new. filter applies to\n an element AND its whole subtree whatever properties that subtree sets, so\n a descendant added later is covered by construction. styles.test.ts pins\n both halves: that layer 1 really does colour its own descendants, and that\n this rule is not a bare color. */\n.ig-reevaluate[data-order='held'] .ig-viewer {\n filter: grayscale(1);\n}\n\n.ig-order-computing {\n margin: 0;\n color: var(--ig-text-muted);\n font-size: var(--ig-font-size-small);\n}\n\n.ig-change-summary {\n display: flex;\n gap: var(--ig-space);\n align-items: baseline;\n flex-wrap: wrap;\n}\n\n.ig-change-line {\n display: flex;\n align-items: baseline;\n}\n\n.ig-change-parts {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-wrap: wrap;\n /* The blast radius reads as ONE line. The gap is the separator, so no\n punctuation glyph is baked into the markup \u2014 that would be a second\n language choice on top of the words themselves. */\n gap: var(--ig-space);\n}\n\n.ig-change-part {\n display: flex;\n gap: var(--ig-space-tight);\n align-items: baseline;\n}\n\n.ig-change-count {\n font-family: var(--ig-font-mono);\n color: var(--ig-text);\n}\n\n.ig-change-word {\n color: var(--ig-text-body);\n}\n\n.ig-change-unchanged {\n margin: 0;\n color: var(--ig-text-body);\n}\n\n.ig-change-dismiss {\n align-self: flex-start;\n background: var(--ig-surface-2);\n color: var(--ig-text-body);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight) var(--ig-space);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size-small);\n cursor: pointer;\n}\n\n.ig-change-dismiss:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-space-tight);\n}\n\n.ig-delta-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--ig-space-tight);\n}\n\n.ig-delta-chip {\n display: flex;\n gap: var(--ig-space-tight);\n align-items: baseline;\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight);\n background: var(--ig-surface-2);\n}\n\n.ig-delta-member {\n display: flex;\n gap: var(--ig-space-tight);\n align-items: baseline;\n}\n\n.ig-delta-key,\n.ig-delta-ref {\n font-family: var(--ig-font-mono);\n color: var(--ig-text-muted);\n}\n\n/* The count and its word are adjacent spans with no text between them, so\n without this they render as 2up. Same reason .ig-change-part has one. */\n.ig-delta-move {\n display: flex;\n gap: var(--ig-space-tight);\n align-items: baseline;\n}\n\n.ig-delta-move[data-direction='up'] .ig-change-count {\n color: var(--ig-station-ready);\n}\n\n.ig-delta-move[data-direction='down'] .ig-change-count {\n color: var(--ig-text-muted);\n}\n\n.ig-delta-readiness[data-readiness='promoted'] {\n color: var(--ig-station-ready);\n}\n\n.ig-delta-readiness[data-readiness='newly-held'] {\n color: var(--ig-station-held);\n}\n\n.ig-delta-presence {\n color: var(--ig-text-muted);\n}\n\n/* THE PLACED CHIP IS NOT A LIST ITEM and does not lay out like one: it sits at\n the end of its row, after whatever the row already drew, and it never grows\n the row's height on its own.\n\n WHAT PUTS IT AT THE TRAILING EDGE IS NOT HERE, and this comment claimed it\n was. It named margin-inline-start: auto, which an earlier revision of this\n rule did set and this one does not \u2014 the ranked row reaches the edge by\n being given a third grid column in workspace/styles.ts instead, and the\n footer row, which is a flex box rather than that grid, is pushed there by a\n rule of its own beside it. Both live with the row shapes they are about;\n what is left here is only what a placed chip looks like whatever it sits in.\n The claim survived the change that falsified it, which is this codebase's\n named failure mode and not a new one. */\n.ig-delta-chip[data-placed] {\n display: inline-flex;\n gap: var(--ig-space-tight);\n align-items: baseline;\n align-self: center;\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: 0 var(--ig-space-tight);\n background: var(--ig-surface-2);\n font-size: var(--ig-font-size-small);\n}\n\n";
|
|
24
24
|
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/reevaluate/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/reevaluate/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,eAAO,MAAM,oBAAoB,00KAwLhC,CAAC"}
|
|
@@ -178,5 +178,31 @@ export const reevaluateStylesheet = `
|
|
|
178
178
|
.ig-delta-presence {
|
|
179
179
|
color: var(--ig-text-muted);
|
|
180
180
|
}
|
|
181
|
+
|
|
182
|
+
/* THE PLACED CHIP IS NOT A LIST ITEM and does not lay out like one: it sits at
|
|
183
|
+
the end of its row, after whatever the row already drew, and it never grows
|
|
184
|
+
the row's height on its own.
|
|
185
|
+
|
|
186
|
+
WHAT PUTS IT AT THE TRAILING EDGE IS NOT HERE, and this comment claimed it
|
|
187
|
+
was. It named margin-inline-start: auto, which an earlier revision of this
|
|
188
|
+
rule did set and this one does not — the ranked row reaches the edge by
|
|
189
|
+
being given a third grid column in workspace/styles.ts instead, and the
|
|
190
|
+
footer row, which is a flex box rather than that grid, is pushed there by a
|
|
191
|
+
rule of its own beside it. Both live with the row shapes they are about;
|
|
192
|
+
what is left here is only what a placed chip looks like whatever it sits in.
|
|
193
|
+
The claim survived the change that falsified it, which is this codebase's
|
|
194
|
+
named failure mode and not a new one. */
|
|
195
|
+
.ig-delta-chip[data-placed] {
|
|
196
|
+
display: inline-flex;
|
|
197
|
+
gap: var(--ig-space-tight);
|
|
198
|
+
align-items: baseline;
|
|
199
|
+
align-self: center;
|
|
200
|
+
border: var(--ig-stroke) solid var(--ig-line);
|
|
201
|
+
border-radius: var(--ig-radius);
|
|
202
|
+
padding: 0 var(--ig-space-tight);
|
|
203
|
+
background: var(--ig-surface-2);
|
|
204
|
+
font-size: var(--ig-font-size-small);
|
|
205
|
+
}
|
|
206
|
+
|
|
181
207
|
`;
|
|
182
208
|
//# sourceMappingURL=styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/reevaluate/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/reevaluate/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwLnC,CAAC"}
|
|
@@ -98,5 +98,20 @@ export declare function summaryOf(change: OrderChange): ChangeSummary;
|
|
|
98
98
|
* report — NOT that nothing happened, which is what {@link ChangeSummary.unchanged}
|
|
99
99
|
* says.
|
|
100
100
|
*/
|
|
101
|
-
|
|
101
|
+
/**
|
|
102
|
+
* Refs the CALLER knows are in the order but not in this scene.
|
|
103
|
+
*
|
|
104
|
+
* WITHOUT IT A DIAGNOSTIC CANNOT TELL TWO THINGS APART, and they are opposite
|
|
105
|
+
* facts: a projection that disagrees with the change — the defect worth
|
|
106
|
+
* reporting — and a surface that deliberately drew fewer rows than the order
|
|
107
|
+
* has. The workspace does the second on every render: its rail is windowed, and
|
|
108
|
+
* its audit filter narrows it further. Both are ordinary, and a diagnostic for
|
|
109
|
+
* either is noise that trains a host to ignore the ones that matter.
|
|
110
|
+
*
|
|
111
|
+
* A SET OF REFS RATHER THAN A BOOLEAN, because "this surface windows" is not
|
|
112
|
+
* the question. A ref in the order but off-window is expected; a ref in NO row
|
|
113
|
+
* of the order at all is the inconsistency, and only the caller holding the
|
|
114
|
+
* unwindowed order can tell which one it has.
|
|
115
|
+
*/
|
|
116
|
+
export declare function reevaluateView(change: OrderChange | null | undefined, scene: Scene, status: OrderStatus, expected?: ReadonlySet<string>): ReevaluateView;
|
|
102
117
|
//# sourceMappingURL=view.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/reevaluate/view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAgB,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACjH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,iEAMf,CAAC;AAEZ,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAmBzD,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,yEAAyE;IACzE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC;;;;;;;;OAQG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,UAAU;IACzB,gFAAgF;IAChF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACvC,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CAY5D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EACtC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/reevaluate/view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAgB,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACjH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,iEAMf,CAAC;AAEZ,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAmBzD,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,yEAAyE;IACzE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC;;;;;;;;OAQG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,UAAU;IACzB,gFAAgF;IAChF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACvC,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CAY5D;AAED;;;;;;;GAOG;AACH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EACtC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,WAAW,EACnB,QAAQ,GAAE,WAAW,CAAC,MAAM,CAAa,GACxC,cAAc,CAgChB"}
|
package/dist/reevaluate/view.js
CHANGED
|
@@ -79,7 +79,22 @@ export function summaryOf(change) {
|
|
|
79
79
|
* report — NOT that nothing happened, which is what {@link ChangeSummary.unchanged}
|
|
80
80
|
* says.
|
|
81
81
|
*/
|
|
82
|
-
|
|
82
|
+
/**
|
|
83
|
+
* Refs the CALLER knows are in the order but not in this scene.
|
|
84
|
+
*
|
|
85
|
+
* WITHOUT IT A DIAGNOSTIC CANNOT TELL TWO THINGS APART, and they are opposite
|
|
86
|
+
* facts: a projection that disagrees with the change — the defect worth
|
|
87
|
+
* reporting — and a surface that deliberately drew fewer rows than the order
|
|
88
|
+
* has. The workspace does the second on every render: its rail is windowed, and
|
|
89
|
+
* its audit filter narrows it further. Both are ordinary, and a diagnostic for
|
|
90
|
+
* either is noise that trains a host to ignore the ones that matter.
|
|
91
|
+
*
|
|
92
|
+
* A SET OF REFS RATHER THAN A BOOLEAN, because "this surface windows" is not
|
|
93
|
+
* the question. A ref in the order but off-window is expected; a ref in NO row
|
|
94
|
+
* of the order at all is the inconsistency, and only the caller holding the
|
|
95
|
+
* unwindowed order can tell which one it has.
|
|
96
|
+
*/
|
|
97
|
+
export function reevaluateView(change, scene, status, expected = new Set()) {
|
|
83
98
|
const held = status === 'held';
|
|
84
99
|
if (change === null || change === undefined) {
|
|
85
100
|
return { summary: null, chips: [], held, diagnostics: [] };
|
|
@@ -103,6 +118,11 @@ export function reevaluateView(change, scene, status) {
|
|
|
103
118
|
// renders the order it left. Its count still reaches the summary.
|
|
104
119
|
if (delta.presence === 'left')
|
|
105
120
|
continue;
|
|
121
|
+
// The caller narrowed its own rail and said so. Its chip has nowhere to
|
|
122
|
+
// attach here, which is a fact about the window rather than about the
|
|
123
|
+
// change, and the summary still counts the row.
|
|
124
|
+
if (expected.has(delta.ref) || expected.has(key))
|
|
125
|
+
continue;
|
|
106
126
|
diagnostics.push(`${delta.ref} changed, but no row draws it; its chip has nowhere to attach`);
|
|
107
127
|
}
|
|
108
128
|
const chips = [...byKey].map(([key, deltas]) => ({ key, deltas }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/reevaluate/view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAKH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,OAAO;IACP,UAAU;IACV,YAAY;IACZ,SAAS;IACT,MAAM;CACE,CAAC,CAAC;AAIZ;;;;;;;;GAQG;AACH,MAAM,QAAQ,GAAoE,MAAM,CAAC,MAAM,CAAC;IAC9F,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK;IAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ;IACrC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS;IAC1C,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO;IACnC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI;CAC9B,CAAC,CAAC;AAuDH,6EAA6E;AAC7E,MAAM,UAAU,SAAS,CAAC,MAAmB;IAC3C,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,KAAK;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;KACtC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAErC,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;QACtC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE;QACtB,KAAK;QACL,SAAS,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAsC,EACtC,KAAY,EACZ,MAAmB;
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/reevaluate/view.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,6 +44,13 @@ export interface ChangeWords {
|
|
|
44
44
|
/**
|
|
45
45
|
* Labels the order while a write is in flight and the rows are the ones from
|
|
46
46
|
* before it. The rail is greyed a step; this says why.
|
|
47
|
+
*
|
|
48
|
+
* IN FLIGHT MEANS PENDING, NOT LANDED, and a host wording this should know
|
|
49
|
+
* which. `OrderStatus` is `held` while `anyPending(records)`, and the store
|
|
50
|
+
* reserves a record as `pending` and publishes before it drains — so this
|
|
51
|
+
* word is on screen while the write can still be rejected, throw, or come
|
|
52
|
+
* back as a conflict. A host promising the edit is saved here would be
|
|
53
|
+
* followed by a §17b failure card contradicting it.
|
|
47
54
|
*/
|
|
48
55
|
readonly computing: string;
|
|
49
56
|
/** The dismiss control. The only thing besides the next edit that clears the summary. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"words.d.ts","sourceRoot":"","sources":["../../src/reevaluate/words.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B
|
|
1
|
+
{"version":3,"file":"words.d.ts","sourceRoot":"","sources":["../../src/reevaluate/words.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,yFAAyF;IACzF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7D"}
|
package/dist/scale/ladder.d.ts
CHANGED
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
* overlay on this screen reads — so a capsule's `cycle` badge and an audit's
|
|
34
34
|
* `cycle` finding are one answer rendered twice, not two answers.
|
|
35
35
|
*/
|
|
36
|
-
import { type ViewerDocument, type ViewerIssue } from '@issuegraph/viewer';
|
|
36
|
+
import { type ClusterReach, type ViewerDocument, type ViewerIssue } from '@issuegraph/viewer';
|
|
37
37
|
import { type ScaleState } from './commands.ts';
|
|
38
38
|
/** Which of the design's three scale states the canvas is in. */
|
|
39
39
|
export type ScaleTier =
|
|
@@ -46,15 +46,45 @@ export type ScaleTier =
|
|
|
46
46
|
/** One connected component, as the refusal presents it. */
|
|
47
47
|
export interface ScaleCapsule {
|
|
48
48
|
/**
|
|
49
|
-
* The
|
|
50
|
-
*
|
|
51
|
-
*
|
|
49
|
+
* The ANCHOR: the highest-ranked member, which is the member a `focus`
|
|
50
|
+
* command names to draw this component.
|
|
51
|
+
*
|
|
52
|
+
* `RULINGS.md` §4 settles what this is. It was the component's first member
|
|
53
|
+
* in key order, which is deterministic and means nothing — a seventy-two
|
|
54
|
+
* issue component was fronted by whichever key sorted first. The anchor is
|
|
55
|
+
* the member a reader would reach the component THROUGH, so a component with
|
|
56
|
+
* any ready work is entered at that work.
|
|
52
57
|
*/
|
|
53
58
|
readonly lead: string;
|
|
59
|
+
/**
|
|
60
|
+
* The anchor's title. Rendered as `around #488 · Extract session store
|
|
61
|
+
* adapter` — never alone.
|
|
62
|
+
*
|
|
63
|
+
* FRAME `17f` NAMES EVERY CAPSULE — "auth & session", "replay guards" — and
|
|
64
|
+
* the shipped one listed raw keys. This package's earlier reading was right
|
|
65
|
+
* that a component has no name of its own to read anywhere, and Design
|
|
66
|
+
* confirmed it: *"A connected component has no name and one must not be
|
|
67
|
+
* invented. `auth & session` is placeholder copy, not a field."*
|
|
68
|
+
*
|
|
69
|
+
* WHAT CHANGED IS THE FORM, AND IT IS THE HALF THAT WAS WRONG. A bare title
|
|
70
|
+
* reads as the component's NAME — as though that issue were the group — and
|
|
71
|
+
* the anchor wording says what it actually is: the issue this component is
|
|
72
|
+
* entered around. Same string, a claim it can support.
|
|
73
|
+
*/
|
|
74
|
+
readonly name: string;
|
|
54
75
|
readonly size: number;
|
|
55
76
|
readonly blockedByEdges: number;
|
|
56
77
|
readonly chainDepth: number;
|
|
57
78
|
readonly hasCycle: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* The one fact printed under the name, resolved by layer 1.
|
|
81
|
+
*
|
|
82
|
+
* IT IS NOT A THIRD COPY of the two fields above; it is what stops a capsule
|
|
83
|
+
* printing both of them at once. See `clusterReach`: a stuck component has no
|
|
84
|
+
* depth to print, because a depth beside a cycle reads as a work estimate for
|
|
85
|
+
* work that can never start.
|
|
86
|
+
*/
|
|
87
|
+
readonly reach: ClusterReach;
|
|
58
88
|
readonly members: readonly string[];
|
|
59
89
|
}
|
|
60
90
|
/**
|
|
@@ -108,6 +138,24 @@ export interface ScaleSearch {
|
|
|
108
138
|
/** Matches found beyond the ones listed. */
|
|
109
139
|
readonly omitted: number;
|
|
110
140
|
}
|
|
141
|
+
/** The size range of a set of components. Both bounds are at least one. */
|
|
142
|
+
export interface SizeRange {
|
|
143
|
+
readonly smallest: number;
|
|
144
|
+
readonly largest: number;
|
|
145
|
+
}
|
|
146
|
+
/** What the capsule list left out, and the size range it spans. */
|
|
147
|
+
export interface OmittedComponents {
|
|
148
|
+
readonly count: number;
|
|
149
|
+
/**
|
|
150
|
+
* The range, or `null` when nothing omitted has a member to measure.
|
|
151
|
+
*
|
|
152
|
+
* NULLABLE RATHER THAN ZEROED, for the reason `capsulesOmitted` is itself
|
|
153
|
+
* nullable: `0` here would report a component of no issues, and the count is
|
|
154
|
+
* still true when the range is not. Unreachable while `clustersOf` emits no
|
|
155
|
+
* memberless component; it is the shape that keeps it unreachable.
|
|
156
|
+
*/
|
|
157
|
+
readonly range: SizeRange | null;
|
|
158
|
+
}
|
|
111
159
|
export interface ScaleLadder {
|
|
112
160
|
readonly tier: ScaleTier;
|
|
113
161
|
/** The nodes the canvas would draw: the focused component, or all of them. */
|
|
@@ -120,8 +168,16 @@ export interface ScaleLadder {
|
|
|
120
168
|
readonly focus: string | null;
|
|
121
169
|
readonly refusal: ScaleRefusal | null;
|
|
122
170
|
readonly capsules: readonly ScaleCapsule[];
|
|
123
|
-
/**
|
|
124
|
-
|
|
171
|
+
/**
|
|
172
|
+
* The components beyond the capsules listed, and how big they are.
|
|
173
|
+
*
|
|
174
|
+
* A BARE COUNT DOES NOT SAY WHETHER THE TAIL MATTERS. Frame `17f` draws
|
|
175
|
+
* "+ 5 more" over "2-7 issues each" for exactly that reason: five components
|
|
176
|
+
* of two to seven is noise a reader can leave alone, and five of forty to
|
|
177
|
+
* ninety is most of the backlog. `null` when nothing was omitted, so the
|
|
178
|
+
* absent case has no zeroed sizes to misread.
|
|
179
|
+
*/
|
|
180
|
+
readonly capsulesOmitted: OmittedComponents | null;
|
|
125
181
|
readonly isolated: IsolatedChip;
|
|
126
182
|
/** The affordance, present exactly when the canvas refuses. */
|
|
127
183
|
readonly search: ScaleSearch | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ladder.d.ts","sourceRoot":"","sources":["../../src/scale/ladder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"ladder.d.ts","sourceRoot":"","sources":["../../src/scale/ladder.ts"],"names":[],"mappings":"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"}
|