@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.
Files changed (137) hide show
  1. package/README.md +65 -9
  2. package/dist/a11y/baseline.d.ts +182 -0
  3. package/dist/a11y/baseline.d.ts.map +1 -0
  4. package/dist/a11y/baseline.js +434 -0
  5. package/dist/a11y/baseline.js.map +1 -0
  6. package/dist/audit/findings.d.ts +107 -1
  7. package/dist/audit/findings.d.ts.map +1 -1
  8. package/dist/audit/findings.js +113 -6
  9. package/dist/audit/findings.js.map +1 -1
  10. package/dist/audit/panel.d.ts +277 -0
  11. package/dist/audit/panel.d.ts.map +1 -0
  12. package/dist/audit/panel.js +462 -0
  13. package/dist/audit/panel.js.map +1 -0
  14. package/dist/audit/refused.d.ts +99 -0
  15. package/dist/audit/refused.d.ts.map +1 -0
  16. package/dist/audit/refused.js +276 -0
  17. package/dist/audit/refused.js.map +1 -0
  18. package/dist/audit/styles.d.ts +1 -1
  19. package/dist/audit/styles.d.ts.map +1 -1
  20. package/dist/audit/styles.js +429 -1
  21. package/dist/audit/styles.js.map +1 -1
  22. package/dist/audit/surface.d.ts +54 -12
  23. package/dist/audit/surface.d.ts.map +1 -1
  24. package/dist/audit/surface.js +53 -13
  25. package/dist/audit/surface.js.map +1 -1
  26. package/dist/create/draft.d.ts +36 -0
  27. package/dist/create/draft.d.ts.map +1 -1
  28. package/dist/create/draft.js +40 -0
  29. package/dist/create/draft.js.map +1 -1
  30. package/dist/create/keys.d.ts +134 -9
  31. package/dist/create/keys.d.ts.map +1 -1
  32. package/dist/create/keys.js +119 -20
  33. package/dist/create/keys.js.map +1 -1
  34. package/dist/firstpass/candidates.d.ts +17 -1
  35. package/dist/firstpass/candidates.d.ts.map +1 -1
  36. package/dist/index.d.ts +42 -17
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +45 -14
  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 +76 -20
  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 +78 -7
  51. package/dist/overlay/styles.js.map +1 -1
  52. package/dist/picker/render.d.ts +26 -16
  53. package/dist/picker/render.d.ts.map +1 -1
  54. package/dist/picker/render.js +25 -36
  55. package/dist/picker/render.js.map +1 -1
  56. package/dist/picker/styles.d.ts +7 -7
  57. package/dist/picker/styles.d.ts.map +1 -1
  58. package/dist/picker/styles.js +7 -36
  59. package/dist/picker/styles.js.map +1 -1
  60. package/dist/picker/view.d.ts +8 -4
  61. package/dist/picker/view.d.ts.map +1 -1
  62. package/dist/picker/view.js +4 -3
  63. package/dist/picker/view.js.map +1 -1
  64. package/dist/picker/words.d.ts +12 -10
  65. package/dist/picker/words.d.ts.map +1 -1
  66. package/dist/picker/words.js +12 -8
  67. package/dist/picker/words.js.map +1 -1
  68. package/dist/reevaluate/parts.d.ts +130 -0
  69. package/dist/reevaluate/parts.d.ts.map +1 -0
  70. package/dist/reevaluate/parts.js +260 -0
  71. package/dist/reevaluate/parts.js.map +1 -0
  72. package/dist/reevaluate/render.d.ts +18 -11
  73. package/dist/reevaluate/render.d.ts.map +1 -1
  74. package/dist/reevaluate/render.js +21 -135
  75. package/dist/reevaluate/render.js.map +1 -1
  76. package/dist/reevaluate/styles.d.ts +1 -1
  77. package/dist/reevaluate/styles.d.ts.map +1 -1
  78. package/dist/reevaluate/styles.js +26 -0
  79. package/dist/reevaluate/styles.js.map +1 -1
  80. package/dist/reevaluate/view.d.ts +16 -1
  81. package/dist/reevaluate/view.d.ts.map +1 -1
  82. package/dist/reevaluate/view.js +21 -1
  83. package/dist/reevaluate/view.js.map +1 -1
  84. package/dist/reevaluate/words.d.ts +7 -0
  85. package/dist/reevaluate/words.d.ts.map +1 -1
  86. package/dist/scale/ladder.d.ts +62 -6
  87. package/dist/scale/ladder.d.ts.map +1 -1
  88. package/dist/scale/ladder.js +129 -11
  89. package/dist/scale/ladder.js.map +1 -1
  90. package/dist/scale/render.d.ts +44 -0
  91. package/dist/scale/render.d.ts.map +1 -1
  92. package/dist/scale/render.js +206 -28
  93. package/dist/scale/render.js.map +1 -1
  94. package/dist/scale/styles.d.ts +11 -5
  95. package/dist/scale/styles.d.ts.map +1 -1
  96. package/dist/scale/styles.js +133 -4
  97. package/dist/scale/styles.js.map +1 -1
  98. package/dist/workspace/chrome.d.ts +1 -1
  99. package/dist/workspace/chrome.d.ts.map +1 -1
  100. package/dist/workspace/chrome.js +48 -0
  101. package/dist/workspace/chrome.js.map +1 -1
  102. package/dist/workspace/firstpass.d.ts +166 -0
  103. package/dist/workspace/firstpass.d.ts.map +1 -0
  104. package/dist/workspace/firstpass.js +151 -0
  105. package/dist/workspace/firstpass.js.map +1 -0
  106. package/dist/workspace/host.d.ts +283 -11
  107. package/dist/workspace/host.d.ts.map +1 -1
  108. package/dist/workspace/host.js +614 -43
  109. package/dist/workspace/host.js.map +1 -1
  110. package/dist/workspace/inspector.d.ts +72 -2
  111. package/dist/workspace/inspector.d.ts.map +1 -1
  112. package/dist/workspace/inspector.js +26 -0
  113. package/dist/workspace/inspector.js.map +1 -1
  114. package/dist/workspace/mount.d.ts +75 -6
  115. package/dist/workspace/mount.d.ts.map +1 -1
  116. package/dist/workspace/mount.js +1851 -60
  117. package/dist/workspace/mount.js.map +1 -1
  118. package/dist/workspace/rail.d.ts +5 -2
  119. package/dist/workspace/rail.d.ts.map +1 -1
  120. package/dist/workspace/rail.js.map +1 -1
  121. package/dist/workspace/recovery.d.ts +155 -0
  122. package/dist/workspace/recovery.d.ts.map +1 -0
  123. package/dist/workspace/recovery.js +156 -0
  124. package/dist/workspace/recovery.js.map +1 -0
  125. package/dist/workspace/render.d.ts +779 -2
  126. package/dist/workspace/render.d.ts.map +1 -1
  127. package/dist/workspace/render.js +1727 -61
  128. package/dist/workspace/render.js.map +1 -1
  129. package/dist/workspace/selection.d.ts +11 -0
  130. package/dist/workspace/selection.d.ts.map +1 -1
  131. package/dist/workspace/selection.js +10 -0
  132. package/dist/workspace/selection.js.map +1 -1
  133. package/dist/workspace/styles.d.ts +1 -1
  134. package/dist/workspace/styles.d.ts.map +1 -1
  135. package/dist/workspace/styles.js +1405 -42
  136. package/dist/workspace/styles.js.map +1 -1
  137. 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 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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAIL,aAAa,EACb,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,YAAY,GACb,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAA4D,cAAc,EAAE,MAAM,WAAW,CAAC;AACrG,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AA0BnD,SAAS,SAAS,CAAC,KAAa,EAAE,IAAY;IAC5C,OAAO;QACL,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAA6B,EAAE,KAAkB;IACpE,OAAO,OAAO,CACZ,KAAK,EACL;QACE,KAAK,EAAE,mBAAmB;QAC1B,qEAAqE;QACrE,wEAAwE;QACxE,oEAAoE;QACpE,mCAAmC;QACnC,gBAAgB,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;QACrF,SAAS,EAAE,OAAO,EAAE,EAAE;QACtB,eAAe,EAAE,OAAO,EAAE,UAAU;KACrC,EACD;QACE,wEAAwE;QACxE,sEAAsE;QACtE,qEAAqE;QACrE,mEAAmE;QACnE,uEAAuE;QACvE,qDAAqD;QACrD,EAAE;QACF,oEAAoE;QACpE,sEAAsE;QACtE,wEAAwE;QACxE,wEAAwE;QACxE,4CAA4C;QAC5C,EAAE;QACF,qEAAqE;QACrE,0DAA0D;QAC1D,OAAO,CACL,KAAK,EACL,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,EAC3C,OAAO,KAAK,IAAI;YACd,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,kEAAkE;gBAClE,+DAA+D;gBAC/D,gEAAgE;gBAChE,wBAAwB;gBACxB,OAAO,CAAC,SAAS;oBACf,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACnE,CAAC,CAAC,OAAO,CACL,IAAI,EACJ,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAC5B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE;wBACnE,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;qBACnD,CAAC,CACH,CACF;aACN,CACN;QACD,yEAAyE;QACzE,0EAA0E;QAC1E,0EAA0E;QAC1E,qEAAqE;QACrE,mEAAmE;QACnE,EAAE;QACF,0EAA0E;QAC1E,uEAAuE;QACvE,OAAO,KAAK,IAAI;YACd,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,OAAO,CACL,QAAQ,EACR,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,EACnF,CAAC,KAAK,CAAC,OAAO,CAAC,CAChB;KACN,CACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,UAAU,CAAC,KAAgB,EAAE,KAAkB,EAAE,KAAc;IACtE,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE;QAC1E,4EAA4E;QAC5E,4EAA4E;QAC5E,+DAA+D;QAC/D,2EAA2E;QAC3E,uEAAuE;QACvE,uDAAuD;QACvD,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QACtE,KAAK,CAAC,QAAQ,KAAK,SAAS;YAC1B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,OAAO,CACL,MAAM,EACN;gBACE,KAAK,EAAE,eAAe;gBACtB,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS;gBAC1C,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE;aAC7B,EACD,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAC7E;QACL,KAAK,CAAC,SAAS,KAAK,SAAS;YAC3B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE;gBAClF,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;aAC9B,CAAC;QACN,KAAK,CAAC,QAAQ,KAAK,SAAS;YAC1B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE;gBAC/E,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;aAC7B,CAAC;KACP,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,QAAQ,CAAC,IAAgB,EAAE,KAAkB;IACpD,8EAA8E;IAC9E,4EAA4E;IAC5E,yEAAyE;IACzE,6DAA6D;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;IACzE,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;QAC1E,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;KAC/D,CAAC,CAAC;AACL,CAAC;AAED,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,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAC3F,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;QACxC,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"}
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"}
@@ -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
- export function reevaluateView(change, scene, status) {
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":"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"}
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;;;OAGG;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"}
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"}
@@ -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 member a `focus` command should name to draw this component. It is the
50
- * component's first member in the viewer's own ordering, so two renders of
51
- * one document always offer the same handle.
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
- /** Components found beyond the capsules listed. */
124
- readonly capsulesOmitted: number;
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":"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"}
1
+ {"version":3,"file":"ladder.d.ts","sourceRoot":"","sources":["../../src/scale/ladder.ts"],"names":[],"mappings":"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"}