@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
@@ -1 +1 @@
1
- {"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/picker/view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AAEH,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAML,QAAQ,GACT,MAAM,mBAAmB,CAAC;AA8D3B,iEAAiE;AACjE,SAAS,aAAa,CAAC,MAAc;IACnC,OAAO;QACL,MAAM;QACN,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,IAAI;QACV,0EAA0E;QAC1E,2EAA2E;QAC3E,2EAA2E;QAC3E,2EAA2E;QAC3E,0DAA0D;QAC1D,WAAW,EAAE,CAAC,GAAG,MAAM,oEAAoE,CAAC;KAC7F,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,QAAuB,EAAE,MAAc;IAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAc,EAAE;QACnD,MAAM,QAAQ,GAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC7E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC3E,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC3D,OAAO;QACL,MAAM;QACN,OAAO;QACP,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;QAC5D,IAAI,EAAE;YACJ,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE;YAC3D,QAAQ;SACT;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/picker/view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AAEH,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAML,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAiE3B,iEAAiE;AACjE,SAAS,aAAa,CAAC,MAAc;IACnC,OAAO;QACL,MAAM;QACN,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,IAAI;QACV,0EAA0E;QAC1E,2EAA2E;QAC3E,2EAA2E;QAC3E,2EAA2E;QAC3E,0DAA0D;QAC1D,WAAW,EAAE,CAAC,GAAG,MAAM,oEAAoE,CAAC;KAC7F,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,QAAuB,EAAE,MAAc;IAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAc,EAAE;QACnD,MAAM,QAAQ,GAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC7E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC3E,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC3D,OAAO;QACL,MAAM;QACN,OAAO;QACP,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;QAC5D,IAAI,EAAE;YACJ,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE;YAC3D,QAAQ;SACT;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC"}
@@ -13,16 +13,20 @@
13
13
  * default would be a second implementation of something this layer is not
14
14
  * entitled to decide.
15
15
  *
16
- * ## One vocabulary, read in two places
16
+ * ## One vocabulary, read in ONE place — and it used to be two
17
17
  *
18
- * {@link PickerWords.kinds} words both a picker OPTION ("is blocked by", chosen
19
- * from a list of five) and the DIRECTION STATEMENT it produces ("#530 is
20
- * blocked by #602"). One entry has to read in both positions, which is the same
21
- * constraint `ChangeWords.facets` carries for the summary and its chips.
18
+ * {@link PickerWords.kinds} words a picker OPTION: "is blocked by", chosen from
19
+ * a list of five. It also worded the DIRECTION STATEMENT this surface drew
20
+ * beneath that list, and one entry had to read in both positions.
22
21
  *
23
- * A host wanting two registers — a short label in the list, a full clause in
24
- * the statement — renders {@link ../picker/view.ts PickerView} itself. Nothing
25
- * in the default render is load-bearing for that.
22
+ * §17b's statement is `renderWorkspace`'s relationship row now, worded from
23
+ * layer 1's `EDGE_TREATMENTS` through `labelFrom` — the same register every
24
+ * other row in that panel already uses. So the two-position constraint is gone,
25
+ * and a host wanting a fuller clause than its list label writes it here without
26
+ * having to make one string read in a sentence as well.
27
+ *
28
+ * `flip` WENT WITH THE CONTROL, to `WorkspaceWords`. A host supplies it once,
29
+ * at the layer that draws it.
26
30
  */
27
31
  import type { EdgeKind } from '@issuegraph/store';
28
32
  export interface PickerWords {
@@ -39,8 +43,6 @@ export interface PickerWords {
39
43
  readonly kinds: Readonly<Record<EdgeKind, string>>;
40
44
  /** Names the picker for a screen reader and for a visible heading. */
41
45
  readonly heading: string;
42
- /** The control that reverses a directed relationship. */
43
- readonly flip: string;
44
46
  /**
45
47
  * Marks the option the edge already carries.
46
48
  *
@@ -1 +1 @@
1
- {"version":3,"file":"words.d.ts","sourceRoot":"","sources":["../../src/picker/words.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B"}
1
+ {"version":3,"file":"words.d.ts","sourceRoot":"","sources":["../../src/picker/words.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B"}
@@ -13,16 +13,20 @@
13
13
  * default would be a second implementation of something this layer is not
14
14
  * entitled to decide.
15
15
  *
16
- * ## One vocabulary, read in two places
16
+ * ## One vocabulary, read in ONE place — and it used to be two
17
17
  *
18
- * {@link PickerWords.kinds} words both a picker OPTION ("is blocked by", chosen
19
- * from a list of five) and the DIRECTION STATEMENT it produces ("#530 is
20
- * blocked by #602"). One entry has to read in both positions, which is the same
21
- * constraint `ChangeWords.facets` carries for the summary and its chips.
18
+ * {@link PickerWords.kinds} words a picker OPTION: "is blocked by", chosen from
19
+ * a list of five. It also worded the DIRECTION STATEMENT this surface drew
20
+ * beneath that list, and one entry had to read in both positions.
22
21
  *
23
- * A host wanting two registers — a short label in the list, a full clause in
24
- * the statement — renders {@link ../picker/view.ts PickerView} itself. Nothing
25
- * in the default render is load-bearing for that.
22
+ * §17b's statement is `renderWorkspace`'s relationship row now, worded from
23
+ * layer 1's `EDGE_TREATMENTS` through `labelFrom` — the same register every
24
+ * other row in that panel already uses. So the two-position constraint is gone,
25
+ * and a host wanting a fuller clause than its list label writes it here without
26
+ * having to make one string read in a sentence as well.
27
+ *
28
+ * `flip` WENT WITH THE CONTROL, to `WorkspaceWords`. A host supplies it once,
29
+ * at the layer that draws it.
26
30
  */
27
31
  export {};
28
32
  //# sourceMappingURL=words.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"words.js","sourceRoot":"","sources":["../../src/picker/words.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
1
+ {"version":3,"file":"words.js","sourceRoot":"","sources":["../../src/picker/words.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG"}
@@ -0,0 +1,130 @@
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 { type ElementSpec } from '@issuegraph/viewer';
38
+ import type { ChangeWords } from './words.ts';
39
+ import type { ChangeSummary, PlacedChip } from './view.ts';
40
+ /**
41
+ * The attribute a rail row carries while the last edit moved it.
42
+ *
43
+ * ITS VALUE IS THE ROW'S OWN DELTA KIND, not a severity: §17c tints a promoted
44
+ * row and a newly-held row differently, and a single boolean "changed" would
45
+ * make the reader read the chip to learn which. It is the same shape
46
+ * `AUDIT_SEVERITY_ATTRIBUTE` takes and for the same reason — the styling
47
+ * decision stays the host's, and this package only says which kind it is.
48
+ *
49
+ * THE VALUES ARE {@link deltaKind}'S, AND THEY COME FROM THE STORE'S OWN
50
+ * VOCABULARY: `promoted`, `newly-held`, `up`, `down`, `entered`, `left`. An
51
+ * earlier revision of this comment named `present` and `absent`, which no code
52
+ * path has ever produced — `RankDelta.presence` is `'entered' | 'left'` — and
53
+ * the stylesheet keyed a rule on `absent` accordingly. It matched nothing while
54
+ * reading as the neutral case, so a row the edit removed from the order took
55
+ * the READY tint instead. Read the union at its type rather than this list if
56
+ * the two ever disagree.
57
+ *
58
+ * ABSENT ON AN UNAFFECTED ROW, never `""` or `"none"`. §17c's rule is that
59
+ * unaffected rows are *left completely alone*, and an attribute stamped on
60
+ * every row with one value meaning "nothing" is not leaving it alone — it is
61
+ * marking it, and a host stylesheet would then have to know which value means
62
+ * absent.
63
+ */
64
+ export declare const DELTA_ATTRIBUTE = "data-ig-delta";
65
+ /**
66
+ * Which of a chip's facts decides the row's tint.
67
+ *
68
+ * ONE ROW, ONE TINT, and a `together-with` unit can carry several members whose
69
+ * deltas disagree — so this picks rather than concatenates. Readiness outranks
70
+ * movement because §17c's own summary orders it that way ("1 newly promoted · 1
71
+ * newly held · 1 pushed down"): becoming held is a change to whether the work
72
+ * can start, and moving five ranks is a change to when. A reader scanning for
73
+ * what broke is scanning for the first.
74
+ *
75
+ * `undefined` when no member carries either, which is the only way a chip with
76
+ * no drawable delta reaches a row. It leaves the row unmarked rather than
77
+ * inventing a kind for it.
78
+ */
79
+ export declare function deltaKind(chip: PlacedChip): string | undefined;
80
+ /**
81
+ * The words a spec renders, in order, as one string.
82
+ *
83
+ * DERIVED FROM THE SPEC RATHER THAN FROM THE CHIP, which is the whole point:
84
+ * the row's accessible name has to say exactly what the chip says, and a second
85
+ * walk over `chip.deltas` composing the same words again is two spellings of
86
+ * one sentence — the drift this module exists to prevent, arriving on the
87
+ * channel where nobody would see it drift, because the difference is only
88
+ * audible.
89
+ *
90
+ * Whitespace-joined because the spans are laid out with a gap and no
91
+ * punctuation between them; the separator is the layout's, so it is a space
92
+ * here rather than a glyph this package would have to choose.
93
+ */
94
+ export declare function textOf(spec: ElementSpec): string;
95
+ export declare function countWord(count: number, word: string): readonly ElementSpec[];
96
+ /**
97
+ * The summary, and the held-order label when the order is being re-evaluated.
98
+ *
99
+ * THE COMPUTING LABEL IS INSIDE THE LIVE REGION, and it was a sibling of it
100
+ * until a reader pointed out that this makes it silent. A pending write CLEARS
101
+ * `lastChange`, so the region is empty in exactly the state the label exists
102
+ * for — a sighted reader gets a greyed rail and a sentence saying why, and a
103
+ * screen-reader user is told nothing at all about the ranks having gone stale.
104
+ * Rendered inside, its appearance IS a change to the region, which is what
105
+ * announces.
106
+ *
107
+ * BOTH SURFACES DRAW IT FROM HERE for that reason. `renderReevaluate` had its
108
+ * own copy outside its own region and had the identical defect; one builder
109
+ * means the fix could not land on one surface and miss the other.
110
+ */
111
+ export declare function summarySpec(summary: ChangeSummary | null, words: ChangeWords, options?: {
112
+ readonly held: boolean;
113
+ }): ElementSpec;
114
+ /**
115
+ * One ROW's chip — which can speak for more than one issue.
116
+ *
117
+ * A `together-with` unit is one row and several refs, so its members are nested
118
+ * inside a single chip rather than given one each. Each keeps its own
119
+ * `data-ref`, so a host can still tell which member moved.
120
+ *
121
+ * THE TAG FOLLOWS THE PLACE. Unplaced it is an `li`, because the standalone
122
+ * surface draws a list of them and a list item outside a list is markup a
123
+ * reader's assistive technology reports wrongly. Placed it is a `span`, because
124
+ * the row it joins is not a list and an `li` there would be the same defect
125
+ * mirrored.
126
+ */
127
+ export declare function chipSpec(chip: PlacedChip, words: ChangeWords, options?: {
128
+ readonly placed: boolean;
129
+ }): ElementSpec;
130
+ //# sourceMappingURL=parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../src/reevaluate/parts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,KAAK,WAAW,EAA0C,MAAM,oBAAoB,CAAC;AAG9F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAE/C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAM9D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAWhD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,WAAW,EAAE,CAK7E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAoB,GACpD,WAAW,CA4Eb;AA8CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAsB,GACxD,WAAW,CAab"}
@@ -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"}