@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.
Files changed (113) hide show
  1. package/README.md +38 -7
  2. package/dist/a11y/baseline.d.ts.map +1 -1
  3. package/dist/a11y/baseline.js +4 -0
  4. package/dist/a11y/baseline.js.map +1 -1
  5. package/dist/audit/findings.d.ts +107 -1
  6. package/dist/audit/findings.d.ts.map +1 -1
  7. package/dist/audit/findings.js +114 -7
  8. package/dist/audit/findings.js.map +1 -1
  9. package/dist/audit/panel.d.ts +277 -0
  10. package/dist/audit/panel.d.ts.map +1 -0
  11. package/dist/audit/panel.js +462 -0
  12. package/dist/audit/panel.js.map +1 -0
  13. package/dist/audit/refused.d.ts +99 -0
  14. package/dist/audit/refused.d.ts.map +1 -0
  15. package/dist/audit/refused.js +276 -0
  16. package/dist/audit/refused.js.map +1 -0
  17. package/dist/audit/styles.d.ts +1 -1
  18. package/dist/audit/styles.d.ts.map +1 -1
  19. package/dist/audit/styles.js +428 -0
  20. package/dist/audit/styles.js.map +1 -1
  21. package/dist/audit/surface.d.ts +54 -12
  22. package/dist/audit/surface.d.ts.map +1 -1
  23. package/dist/audit/surface.js +54 -14
  24. package/dist/audit/surface.js.map +1 -1
  25. package/dist/create/draft.d.ts +19 -0
  26. package/dist/create/draft.d.ts.map +1 -1
  27. package/dist/create/draft.js +21 -0
  28. package/dist/create/draft.js.map +1 -1
  29. package/dist/create/keys.d.ts +68 -8
  30. package/dist/create/keys.d.ts.map +1 -1
  31. package/dist/create/keys.js +43 -5
  32. package/dist/create/keys.js.map +1 -1
  33. package/dist/firstpass/render.d.ts.map +1 -1
  34. package/dist/firstpass/render.js +10 -9
  35. package/dist/firstpass/render.js.map +1 -1
  36. package/dist/index.d.ts +40 -15
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +35 -13
  39. package/dist/index.js.map +1 -1
  40. package/dist/overlay/render.d.ts +11 -3
  41. package/dist/overlay/render.d.ts.map +1 -1
  42. package/dist/overlay/render.js +24 -7
  43. package/dist/overlay/render.js.map +1 -1
  44. package/dist/overlay/request.d.ts +71 -0
  45. package/dist/overlay/request.d.ts.map +1 -0
  46. package/dist/overlay/request.js +129 -0
  47. package/dist/overlay/request.js.map +1 -0
  48. package/dist/overlay/styles.d.ts +1 -1
  49. package/dist/overlay/styles.d.ts.map +1 -1
  50. package/dist/overlay/styles.js +38 -7
  51. package/dist/overlay/styles.js.map +1 -1
  52. package/dist/reevaluate/parts.d.ts +130 -0
  53. package/dist/reevaluate/parts.d.ts.map +1 -0
  54. package/dist/reevaluate/parts.js +260 -0
  55. package/dist/reevaluate/parts.js.map +1 -0
  56. package/dist/reevaluate/render.d.ts +18 -11
  57. package/dist/reevaluate/render.d.ts.map +1 -1
  58. package/dist/reevaluate/render.js +21 -135
  59. package/dist/reevaluate/render.js.map +1 -1
  60. package/dist/reevaluate/styles.d.ts +1 -1
  61. package/dist/reevaluate/styles.d.ts.map +1 -1
  62. package/dist/reevaluate/styles.js +26 -0
  63. package/dist/reevaluate/styles.js.map +1 -1
  64. package/dist/reevaluate/view.d.ts +16 -1
  65. package/dist/reevaluate/view.d.ts.map +1 -1
  66. package/dist/reevaluate/view.js +21 -1
  67. package/dist/reevaluate/view.js.map +1 -1
  68. package/dist/reevaluate/words.d.ts +7 -0
  69. package/dist/reevaluate/words.d.ts.map +1 -1
  70. package/dist/scale/ladder.d.ts +62 -6
  71. package/dist/scale/ladder.d.ts.map +1 -1
  72. package/dist/scale/ladder.js +127 -16
  73. package/dist/scale/ladder.js.map +1 -1
  74. package/dist/scale/render.d.ts +44 -0
  75. package/dist/scale/render.d.ts.map +1 -1
  76. package/dist/scale/render.js +223 -30
  77. package/dist/scale/render.js.map +1 -1
  78. package/dist/scale/styles.d.ts +11 -5
  79. package/dist/scale/styles.d.ts.map +1 -1
  80. package/dist/scale/styles.js +185 -4
  81. package/dist/scale/styles.js.map +1 -1
  82. package/dist/workspace/host.d.ts +83 -1
  83. package/dist/workspace/host.d.ts.map +1 -1
  84. package/dist/workspace/host.js +197 -4
  85. package/dist/workspace/host.js.map +1 -1
  86. package/dist/workspace/inspector.d.ts +33 -7
  87. package/dist/workspace/inspector.d.ts.map +1 -1
  88. package/dist/workspace/inspector.js +15 -0
  89. package/dist/workspace/inspector.js.map +1 -1
  90. package/dist/workspace/mount.d.ts +23 -1
  91. package/dist/workspace/mount.d.ts.map +1 -1
  92. package/dist/workspace/mount.js +605 -20
  93. package/dist/workspace/mount.js.map +1 -1
  94. package/dist/workspace/rail.d.ts +5 -2
  95. package/dist/workspace/rail.d.ts.map +1 -1
  96. package/dist/workspace/rail.js.map +1 -1
  97. package/dist/workspace/render.d.ts +390 -3
  98. package/dist/workspace/render.d.ts.map +1 -1
  99. package/dist/workspace/render.js +924 -133
  100. package/dist/workspace/render.js.map +1 -1
  101. package/dist/workspace/selection.d.ts +11 -0
  102. package/dist/workspace/selection.d.ts.map +1 -1
  103. package/dist/workspace/selection.js +10 -0
  104. package/dist/workspace/selection.js.map +1 -1
  105. package/dist/workspace/skeleton.d.ts +33 -0
  106. package/dist/workspace/skeleton.d.ts.map +1 -0
  107. package/dist/workspace/skeleton.js +56 -0
  108. package/dist/workspace/skeleton.js.map +1 -0
  109. package/dist/workspace/styles.d.ts +1 -1
  110. package/dist/workspace/styles.d.ts.map +1 -1
  111. package/dist/workspace/styles.js +931 -19
  112. package/dist/workspace/styles.js.map +1 -1
  113. package/package.json +4 -4
@@ -0,0 +1,260 @@
1
+ /**
2
+ * The pieces every §17c rendering draws the same way.
3
+ *
4
+ * ## Why this is its own module
5
+ *
6
+ * The loop is drawn twice: by `renderReevaluate`, standalone, with its chips in
7
+ * a list beside the rail; and by the workspace, with the summary in the header
8
+ * and each chip ON its row. Two spellings of one summary or one chip is the
9
+ * drift the package split exists to prevent, so both call these and neither
10
+ * builds spans of its own. Same reasoning as `@issuegraph/viewer`'s own
11
+ * `parts.ts`, one layer up.
12
+ *
13
+ * ## PLACED IS NOT A STYLING FLAG — it removes a fact the row already states
14
+ *
15
+ * `renderReevaluate`'s header records why the unpositioned chip names its row
16
+ * in text: *"a chip that carried its key only as an attribute said nothing a
17
+ * reader could see about WHICH row moved."* That reasoning is conditional on
18
+ * being unpositioned, and it inverts once the chip sits on the row: the row
19
+ * names the issue immediately to its left, so a `.ig-delta-key` there is the
20
+ * one span on the chip that says nothing new.
21
+ *
22
+ * So `placed: true` drops the key span, and it drops nothing else. The
23
+ * per-member `data-ref` stays in both, because a `together-with` unit is one
24
+ * row speaking for several issues and the row names only its lead.
25
+ *
26
+ * ## It builds a SPEC, so it is composed and never concatenated
27
+ *
28
+ * The words come from the host through {@link ChangeWords}, and host prose may
29
+ * not be joined into markup out here — `audit/surface.ts` states the rule and
30
+ * the reason: layer 1 owns the markup primitive, and a second escaper in this
31
+ * package is duplication with an injection shape. `element` is that primitive,
32
+ * reached through the viewer's public surface, so this is the one renderer used
33
+ * from a second call site rather than a second renderer.
34
+ *
35
+ * @see https://github.com/autnmy/issuegraph/blob/main/SPEC.md
36
+ */
37
+ import { KEY_ATTRIBUTE, element } from '@issuegraph/viewer';
38
+ /**
39
+ * The attribute a rail row carries while the last edit moved it.
40
+ *
41
+ * ITS VALUE IS THE ROW'S OWN DELTA KIND, not a severity: §17c tints a promoted
42
+ * row and a newly-held row differently, and a single boolean "changed" would
43
+ * make the reader read the chip to learn which. It is the same shape
44
+ * `AUDIT_SEVERITY_ATTRIBUTE` takes and for the same reason — the styling
45
+ * decision stays the host's, and this package only says which kind it is.
46
+ *
47
+ * THE VALUES ARE {@link deltaKind}'S, AND THEY COME FROM THE STORE'S OWN
48
+ * VOCABULARY: `promoted`, `newly-held`, `up`, `down`, `entered`, `left`. An
49
+ * earlier revision of this comment named `present` and `absent`, which no code
50
+ * path has ever produced — `RankDelta.presence` is `'entered' | 'left'` — and
51
+ * the stylesheet keyed a rule on `absent` accordingly. It matched nothing while
52
+ * reading as the neutral case, so a row the edit removed from the order took
53
+ * the READY tint instead. Read the union at its type rather than this list if
54
+ * the two ever disagree.
55
+ *
56
+ * ABSENT ON AN UNAFFECTED ROW, never `""` or `"none"`. §17c's rule is that
57
+ * unaffected rows are *left completely alone*, and an attribute stamped on
58
+ * every row with one value meaning "nothing" is not leaving it alone — it is
59
+ * marking it, and a host stylesheet would then have to know which value means
60
+ * absent.
61
+ */
62
+ export const DELTA_ATTRIBUTE = 'data-ig-delta';
63
+ /**
64
+ * Which of a chip's facts decides the row's tint.
65
+ *
66
+ * ONE ROW, ONE TINT, and a `together-with` unit can carry several members whose
67
+ * deltas disagree — so this picks rather than concatenates. Readiness outranks
68
+ * movement because §17c's own summary orders it that way ("1 newly promoted · 1
69
+ * newly held · 1 pushed down"): becoming held is a change to whether the work
70
+ * can start, and moving five ranks is a change to when. A reader scanning for
71
+ * what broke is scanning for the first.
72
+ *
73
+ * `undefined` when no member carries either, which is the only way a chip with
74
+ * no drawable delta reaches a row. It leaves the row unmarked rather than
75
+ * inventing a kind for it.
76
+ */
77
+ export function deltaKind(chip) {
78
+ const readiness = chip.deltas.find((delta) => delta.readiness !== undefined)?.readiness;
79
+ if (readiness !== undefined)
80
+ return readiness;
81
+ const movement = chip.deltas.find((delta) => delta.movement !== undefined)?.movement;
82
+ if (movement !== undefined)
83
+ return movement.direction;
84
+ return chip.deltas.find((delta) => delta.presence !== undefined)?.presence;
85
+ }
86
+ /**
87
+ * The words a spec renders, in order, as one string.
88
+ *
89
+ * DERIVED FROM THE SPEC RATHER THAN FROM THE CHIP, which is the whole point:
90
+ * the row's accessible name has to say exactly what the chip says, and a second
91
+ * walk over `chip.deltas` composing the same words again is two spellings of
92
+ * one sentence — the drift this module exists to prevent, arriving on the
93
+ * channel where nobody would see it drift, because the difference is only
94
+ * audible.
95
+ *
96
+ * Whitespace-joined because the spans are laid out with a gap and no
97
+ * punctuation between them; the separator is the layout's, so it is a space
98
+ * here rather than a glyph this package would have to choose.
99
+ */
100
+ export function textOf(spec) {
101
+ const parts = [];
102
+ const walk = (child) => {
103
+ if (typeof child === 'string') {
104
+ if (child !== '')
105
+ parts.push(child);
106
+ return;
107
+ }
108
+ for (const nested of child.children ?? [])
109
+ walk(nested);
110
+ };
111
+ walk(spec);
112
+ return parts.join(' ');
113
+ }
114
+ export function countWord(count, word) {
115
+ return [
116
+ element('span', { class: 'ig-change-count' }, [String(count)]),
117
+ element('span', { class: 'ig-change-word' }, [word]),
118
+ ];
119
+ }
120
+ /**
121
+ * The summary, and the held-order label when the order is being re-evaluated.
122
+ *
123
+ * THE COMPUTING LABEL IS INSIDE THE LIVE REGION, and it was a sibling of it
124
+ * until a reader pointed out that this makes it silent. A pending write CLEARS
125
+ * `lastChange`, so the region is empty in exactly the state the label exists
126
+ * for — a sighted reader gets a greyed rail and a sentence saying why, and a
127
+ * screen-reader user is told nothing at all about the ranks having gone stale.
128
+ * Rendered inside, its appearance IS a change to the region, which is what
129
+ * announces.
130
+ *
131
+ * BOTH SURFACES DRAW IT FROM HERE for that reason. `renderReevaluate` had its
132
+ * own copy outside its own region and had the identical defect; one builder
133
+ * means the fix could not land on one surface and miss the other.
134
+ */
135
+ export function summarySpec(summary, words, options = { held: false }) {
136
+ return element('div', {
137
+ class: 'ig-change-summary',
138
+ // Omitted rather than falsified while there is nothing to report: an
139
+ // element() attribute whose value is `undefined` is not written at all,
140
+ // and `data-unchanged="false"` would claim an edit landed and moved
141
+ // nothing when no edit has landed.
142
+ 'data-unchanged': summary === null ? undefined : summary.unchanged ? 'true' : 'false',
143
+ 'data-op': summary?.op,
144
+ 'data-mutation': summary?.mutationId,
145
+ }, [
146
+ // THE LIVE REGION IS ALWAYS MOUNTED, AND EMPTY UNTIL THERE IS SOMETHING
147
+ // TO SAY. A `role="status"` node that is CREATED already carrying its
148
+ // text is not reliably announced — the region has to exist first and
149
+ // then have its contents change — so rendering it only alongside a
150
+ // summary would silently lose the FIRST summary after a load, which is
151
+ // the one a reader is most likely to be waiting for.
152
+ //
153
+ // It is also why the region is this wrapper rather than the content
154
+ // inside it: an edit that moved something renders a list and one that
155
+ // moved nothing renders a paragraph, so a role on either would come and
156
+ // go with the shape. And the dismiss button stays OUTSIDE, or its label
157
+ // would be re-announced with every summary.
158
+ //
159
+ // It is a role, not a timer. Nothing about it expires and the region
160
+ // stays put until the next edit or an explicit dismissal.
161
+ element('div', { class: 'ig-change-line', role: 'status' }, [
162
+ // THE HELD LABEL FIRST, and it renders whether or not there is a
163
+ // summary beside it — a pending write clears `lastChange`, so "held
164
+ // with no summary" is the ordinary shape of this state rather than an
165
+ // edge of it.
166
+ options.held ? element('p', { class: 'ig-order-computing' }, [words.computing]) : null,
167
+ ...(summary === null
168
+ ? []
169
+ : [
170
+ // THE ZERO CASE RENDERS, in the summary's own place. An edit that
171
+ // landed and moved nothing is the finding an owner auditing an
172
+ // encoding most needs, and drawing nothing for it is the defect
173
+ // this branch prevents.
174
+ summary.unchanged
175
+ ? element('p', { class: 'ig-change-unchanged' }, [words.unchanged])
176
+ : element('ul', { class: 'ig-change-parts' }, summary.parts.map((part) => element('li', { class: 'ig-change-part', 'data-facet': part.facet }, [
177
+ ...countWord(part.count, words.facets[part.facet]),
178
+ ]))),
179
+ ]),
180
+ ]),
181
+ // ITS OWN CLASS, not the ladder's `.ig-chip`. That class is defined only
182
+ // in `scale/styles.ts`, so borrowing it would leave this control unstyled
183
+ // for a host that installs this surface and not that one. Folding the two
184
+ // chip looks into one rule is the assembling change's call, not this
185
+ // leaf's — it is the change that first has both on screen at once.
186
+ //
187
+ // Absent with no summary: a control that clears nothing is a control that
188
+ // does nothing, and the region above is what has to persist, not this.
189
+ summary === null
190
+ ? null
191
+ : element('button', { type: 'button', class: 'ig-change-dismiss', 'data-ig-command': 'dismiss-change' }, [words.dismiss]),
192
+ ]);
193
+ }
194
+ /**
195
+ * What one issue's delta says, as spans.
196
+ *
197
+ * IT NAMES A DIRECTION AND A DISTANCE, NEVER A RANK. `RankMovement.from` and
198
+ * `.to` are the deriver's 0-BASED positions, while the rail beside them renders
199
+ * the viewer's 1-BASED ranks — so printing either as a number would put two
200
+ * different bases side by side and read as an off-by-one. `by` is a distance,
201
+ * which is basis-independent and safe to print. A host that knows the basis and
202
+ * wants the endpoints reads them off `view.chips[].deltas`, which carries every
203
+ * `RankDelta` untouched.
204
+ */
205
+ function memberSpec(delta, words, named) {
206
+ return element('span', { class: 'ig-delta-member', 'data-ref': delta.ref }, [
207
+ // NAMED ONLY WHEN THE NAME ADDS SOMETHING. On a chip whose single member IS
208
+ // the row, the row key above has already said it and repeating it is noise.
209
+ // Everywhere else the ref is load-bearing: two members reading
210
+ // `lead 1 down 1 down` says the row moved twice rather than that a unit of
211
+ // two each moved down one, and a lone member that is NOT the lead is a
212
+ // change to an issue the row key does not name at all.
213
+ named ? element('span', { class: 'ig-delta-ref' }, [delta.ref]) : null,
214
+ delta.movement === undefined
215
+ ? null
216
+ : element('span', {
217
+ class: 'ig-delta-move',
218
+ 'data-direction': delta.movement.direction,
219
+ 'data-by': delta.movement.by,
220
+ }, [...countWord(delta.movement.by, words.direction[delta.movement.direction])]),
221
+ delta.readiness === undefined
222
+ ? null
223
+ : element('span', { class: 'ig-delta-readiness', 'data-readiness': delta.readiness }, [
224
+ words.facets[delta.readiness],
225
+ ]),
226
+ delta.presence === undefined
227
+ ? null
228
+ : element('span', { class: 'ig-delta-presence', 'data-presence': delta.presence }, [
229
+ words.facets[delta.presence],
230
+ ]),
231
+ ]);
232
+ }
233
+ /**
234
+ * One ROW's chip — which can speak for more than one issue.
235
+ *
236
+ * A `together-with` unit is one row and several refs, so its members are nested
237
+ * inside a single chip rather than given one each. Each keeps its own
238
+ * `data-ref`, so a host can still tell which member moved.
239
+ *
240
+ * THE TAG FOLLOWS THE PLACE. Unplaced it is an `li`, because the standalone
241
+ * surface draws a list of them and a list item outside a list is markup a
242
+ * reader's assistive technology reports wrongly. Placed it is a `span`, because
243
+ * the row it joins is not a list and an `li` there would be the same defect
244
+ * mirrored.
245
+ */
246
+ export function chipSpec(chip, words, options = { placed: false }) {
247
+ // One member whose ref IS the row: the key names it, so naming it again would
248
+ // be the only text on the chip that says nothing. Any other shape — several
249
+ // members, or a lone member the row is not named after — needs each fact
250
+ // attributed, or the chip reads as one row's facts repeated.
251
+ const named = chip.deltas.length > 1 || chip.deltas[0]?.ref !== chip.key;
252
+ const members = chip.deltas.map((delta) => memberSpec(delta, words, named));
253
+ return options.placed
254
+ ? element('span', { class: 'ig-delta-chip', 'data-placed': 'true' }, members)
255
+ : element('li', { class: 'ig-delta-chip', [KEY_ATTRIBUTE]: chip.key }, [
256
+ element('span', { class: 'ig-delta-key' }, [chip.key]),
257
+ ...members,
258
+ ]);
259
+ }
260
+ //# sourceMappingURL=parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.js","sourceRoot":"","sources":["../../src/reevaluate/parts.ts"],"names":[],"mappings":"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"}
@@ -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 this package does not position them
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. The chips render as a list beside the rail, and
23
- * putting one ON its row needs that row's geometry — which only a mount has,
24
- * and this package has no mount. Naming it an overlay while shipping a
25
- * normal-flow list claimed a positioning this markup cannot do.
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
- * So the list is built to stand on its own instead: every chip NAMES the row it
28
- * describes, which is what lets a reader account for the rows that got no chip.
29
- * The key is published for the mount that will position them, and that mount
30
- * lands with the change that assembles the workspace — the same boundary the
31
- * scale ladder already draws when it defers listener wiring and focus
32
- * restoration to whoever owns the mount.
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
  *
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/reevaluate/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,cAAc,EAMpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAa,MAAM,mBAAmB,CAAC;AAE7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAuC,KAAK,cAAc,EAAkB,MAAM,WAAW,CAAC;AAGrG,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC;IACjD,oEAAoE;IACpE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IACnC,mEAAmE;IACnE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAqJD,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,iBAAiB,GACzB,gBAAgB,CA8ClB"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/reevaluate/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,OAAO,EACL,KAAK,KAAK,EACV,KAAK,cAAc,EAKpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,WAAW,CAAC;AAGhE,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC;IACjD,oEAAoE;IACpE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IACnC,mEAAmE;IACnE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,iBAAiB,GACzB,gBAAgB,CA6ClB"}
@@ -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 this package does not position them
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. The chips render as a list beside the rail, and
23
- * putting one ON its row needs that row's geometry — which only a mount has,
24
- * and this package has no mount. Naming it an overlay while shipping a
25
- * normal-flow list claimed a positioning this markup cannot do.
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
- * So the list is built to stand on its own instead: every chip NAMES the row it
28
- * describes, which is what lets a reader account for the rows that got no chip.
29
- * The key is published for the mount that will position them, and that mount
30
- * lands with the change that assembles the workspace — the same boundary the
31
- * scale ladder already draws when it defers listener wiring and focus
32
- * restoration to whoever owns the mount.
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 { KEY_ATTRIBUTE, element, renderMarkup, renderViewer, resolveTheme, } from '@issuegraph/viewer';
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.held ? element('p', { class: 'ig-order-computing' }, [options.words.computing]) : null,
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":"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"}
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,2oIA8JhC,CAAC"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8JnC,CAAC"}
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
- export declare function reevaluateView(change: OrderChange | null | undefined, scene: Scene, status: OrderStatus): ReevaluateView;
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,GAClB,cAAc,CA4BhB"}
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"}