@issuegraph/editor 0.1.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 (143) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +238 -0
  3. package/dist/audit/findings.d.ts +225 -0
  4. package/dist/audit/findings.d.ts.map +1 -0
  5. package/dist/audit/findings.js +348 -0
  6. package/dist/audit/findings.js.map +1 -0
  7. package/dist/audit/styles.d.ts +37 -0
  8. package/dist/audit/styles.d.ts.map +1 -0
  9. package/dist/audit/styles.js +72 -0
  10. package/dist/audit/styles.js.map +1 -0
  11. package/dist/audit/surface.d.ts +155 -0
  12. package/dist/audit/surface.d.ts.map +1 -0
  13. package/dist/audit/surface.js +202 -0
  14. package/dist/audit/surface.js.map +1 -0
  15. package/dist/create/draft.d.ts +119 -0
  16. package/dist/create/draft.d.ts.map +1 -0
  17. package/dist/create/draft.js +114 -0
  18. package/dist/create/draft.js.map +1 -0
  19. package/dist/create/keys.d.ts +225 -0
  20. package/dist/create/keys.d.ts.map +1 -0
  21. package/dist/create/keys.js +228 -0
  22. package/dist/create/keys.js.map +1 -0
  23. package/dist/create/placement.d.ts +69 -0
  24. package/dist/create/placement.d.ts.map +1 -0
  25. package/dist/create/placement.js +76 -0
  26. package/dist/create/placement.js.map +1 -0
  27. package/dist/firstpass/batch.d.ts +190 -0
  28. package/dist/firstpass/batch.d.ts.map +1 -0
  29. package/dist/firstpass/batch.js +143 -0
  30. package/dist/firstpass/batch.js.map +1 -0
  31. package/dist/firstpass/candidates.d.ts +128 -0
  32. package/dist/firstpass/candidates.d.ts.map +1 -0
  33. package/dist/firstpass/candidates.js +39 -0
  34. package/dist/firstpass/candidates.js.map +1 -0
  35. package/dist/firstpass/keys.d.ts +90 -0
  36. package/dist/firstpass/keys.d.ts.map +1 -0
  37. package/dist/firstpass/keys.js +112 -0
  38. package/dist/firstpass/keys.js.map +1 -0
  39. package/dist/firstpass/queue.d.ts +183 -0
  40. package/dist/firstpass/queue.d.ts.map +1 -0
  41. package/dist/firstpass/queue.js +159 -0
  42. package/dist/firstpass/queue.js.map +1 -0
  43. package/dist/firstpass/render.d.ts +100 -0
  44. package/dist/firstpass/render.d.ts.map +1 -0
  45. package/dist/firstpass/render.js +216 -0
  46. package/dist/firstpass/render.js.map +1 -0
  47. package/dist/firstpass/styles.d.ts +36 -0
  48. package/dist/firstpass/styles.d.ts.map +1 -0
  49. package/dist/firstpass/styles.js +148 -0
  50. package/dist/firstpass/styles.js.map +1 -0
  51. package/dist/firstpass/view.d.ts +82 -0
  52. package/dist/firstpass/view.d.ts.map +1 -0
  53. package/dist/firstpass/view.js +60 -0
  54. package/dist/firstpass/view.js.map +1 -0
  55. package/dist/firstpass/words.d.ts +105 -0
  56. package/dist/firstpass/words.d.ts.map +1 -0
  57. package/dist/firstpass/words.js +28 -0
  58. package/dist/firstpass/words.js.map +1 -0
  59. package/dist/index.d.ts +150 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +147 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/overlay/grammar.d.ts +259 -0
  64. package/dist/overlay/grammar.d.ts.map +1 -0
  65. package/dist/overlay/grammar.js +223 -0
  66. package/dist/overlay/grammar.js.map +1 -0
  67. package/dist/overlay/render.d.ts +125 -0
  68. package/dist/overlay/render.d.ts.map +1 -0
  69. package/dist/overlay/render.js +439 -0
  70. package/dist/overlay/render.js.map +1 -0
  71. package/dist/overlay/styles.d.ts +41 -0
  72. package/dist/overlay/styles.d.ts.map +1 -0
  73. package/dist/overlay/styles.js +124 -0
  74. package/dist/overlay/styles.js.map +1 -0
  75. package/dist/picker/render.d.ts +80 -0
  76. package/dist/picker/render.d.ts.map +1 -0
  77. package/dist/picker/render.js +112 -0
  78. package/dist/picker/render.js.map +1 -0
  79. package/dist/picker/styles.d.ts +26 -0
  80. package/dist/picker/styles.d.ts.map +1 -0
  81. package/dist/picker/styles.js +116 -0
  82. package/dist/picker/styles.js.map +1 -0
  83. package/dist/picker/view.d.ts +135 -0
  84. package/dist/picker/view.d.ts.map +1 -0
  85. package/dist/picker/view.js +117 -0
  86. package/dist/picker/view.js.map +1 -0
  87. package/dist/picker/words.d.ts +53 -0
  88. package/dist/picker/words.d.ts.map +1 -0
  89. package/dist/picker/words.js +28 -0
  90. package/dist/picker/words.js.map +1 -0
  91. package/dist/reevaluate/render.d.ts +77 -0
  92. package/dist/reevaluate/render.d.ts.map +1 -0
  93. package/dist/reevaluate/render.js +211 -0
  94. package/dist/reevaluate/render.js.map +1 -0
  95. package/dist/reevaluate/styles.d.ts +24 -0
  96. package/dist/reevaluate/styles.d.ts.map +1 -0
  97. package/dist/reevaluate/styles.js +182 -0
  98. package/dist/reevaluate/styles.js.map +1 -0
  99. package/dist/reevaluate/view.d.ts +102 -0
  100. package/dist/reevaluate/view.d.ts.map +1 -0
  101. package/dist/reevaluate/view.js +111 -0
  102. package/dist/reevaluate/view.js.map +1 -0
  103. package/dist/reevaluate/words.d.ts +54 -0
  104. package/dist/reevaluate/words.d.ts.map +1 -0
  105. package/dist/reevaluate/words.js +29 -0
  106. package/dist/reevaluate/words.js.map +1 -0
  107. package/dist/scale/commands.d.ts +60 -0
  108. package/dist/scale/commands.d.ts.map +1 -0
  109. package/dist/scale/commands.js +49 -0
  110. package/dist/scale/commands.js.map +1 -0
  111. package/dist/scale/ladder.d.ts +141 -0
  112. package/dist/scale/ladder.d.ts.map +1 -0
  113. package/dist/scale/ladder.js +243 -0
  114. package/dist/scale/ladder.js.map +1 -0
  115. package/dist/scale/render.d.ts +85 -0
  116. package/dist/scale/render.d.ts.map +1 -0
  117. package/dist/scale/render.js +194 -0
  118. package/dist/scale/render.js.map +1 -0
  119. package/dist/scale/styles.d.ts +21 -0
  120. package/dist/scale/styles.d.ts.map +1 -0
  121. package/dist/scale/styles.js +105 -0
  122. package/dist/scale/styles.js.map +1 -0
  123. package/dist/workspace/inspector.d.ts +117 -0
  124. package/dist/workspace/inspector.d.ts.map +1 -0
  125. package/dist/workspace/inspector.js +140 -0
  126. package/dist/workspace/inspector.js.map +1 -0
  127. package/dist/workspace/rail.d.ts +122 -0
  128. package/dist/workspace/rail.d.ts.map +1 -0
  129. package/dist/workspace/rail.js +216 -0
  130. package/dist/workspace/rail.js.map +1 -0
  131. package/dist/workspace/render.d.ts +139 -0
  132. package/dist/workspace/render.d.ts.map +1 -0
  133. package/dist/workspace/render.js +366 -0
  134. package/dist/workspace/render.js.map +1 -0
  135. package/dist/workspace/selection.d.ts +92 -0
  136. package/dist/workspace/selection.d.ts.map +1 -0
  137. package/dist/workspace/selection.js +83 -0
  138. package/dist/workspace/selection.js.map +1 -0
  139. package/dist/workspace/styles.d.ts +39 -0
  140. package/dist/workspace/styles.d.ts.map +1 -0
  141. package/dist/workspace/styles.js +313 -0
  142. package/dist/workspace/styles.js.map +1 -0
  143. package/package.json +58 -0
@@ -0,0 +1,102 @@
1
+ /**
2
+ * What the last edit did to the order, as a view model.
3
+ *
4
+ * `@issuegraph/store` already computes the change — `diffOrder` ships
5
+ * {@link OrderChange}, and it deliberately stops at COUNTS rather than a
6
+ * sentence so a host writes "3 rows moved · 1 promoted" in its own words. This
7
+ * module keeps that property. It turns the counts into the parts a summary is
8
+ * built from, and it decides which rendered row each delta belongs to. It
9
+ * writes no sentence and holds no state.
10
+ *
11
+ * ## Placement, and why it is asked of the scene rather than of the document
12
+ *
13
+ * A {@link RankDelta} names an ISSUE. A row is keyed by its slot's LEAD, and a
14
+ * `together-with` unit is one row whose partners get none — so a delta about a
15
+ * partner has no row of its own to sit on. `Scene.stationOf` is exactly the
16
+ * "key -> the key that represents it in this projection" map, and
17
+ * `Scene.navigable` is every key the projection actually drew. Asking the scene
18
+ * means the answer comes from the render that just happened, rather than from a
19
+ * second walk over the document that could disagree with it.
20
+ *
21
+ * ## A delta that reaches no row is REPORTED, never dropped
22
+ *
23
+ * With one exception, and it is the interesting one: a delta whose `presence`
24
+ * is `left` describes a row that has gone from the order, so its absence from
25
+ * the rail is the fact it is reporting rather than a failure to place it. Its
26
+ * count still reaches the summary, which is where the reader learns it
27
+ * happened. Everything else that fails to place is a diagnostic — an absence
28
+ * rendered as a value licenses a false conclusion, and the false conclusion
29
+ * here would be "nothing happened to that issue".
30
+ */
31
+ import type { Mutation, MutationId, OrderChange, OrderStatus, RankDelta } from '@issuegraph/store';
32
+ import type { Scene } from '@issuegraph/viewer';
33
+ /**
34
+ * The facets a change can have, in the order a summary reads them.
35
+ *
36
+ * Declared as the tuple and narrowed from it, so the list and the type cannot
37
+ * drift: adding a facet here is what makes {@link COUNT_OF} and a host's
38
+ * {@link ./words.ts ChangeWords} fail to compile until both carry it.
39
+ */
40
+ export declare const CHANGE_FACETS: readonly ["moved", "promoted", "newly-held", "entered", "left"];
41
+ export type ChangeFacet = (typeof CHANGE_FACETS)[number];
42
+ /** One facet that actually happened. Never carries a zero. */
43
+ export interface SummaryPart {
44
+ readonly facet: ChangeFacet;
45
+ readonly count: number;
46
+ }
47
+ /** The blast radius of one landed edit, ready to be worded by a host. */
48
+ export interface ChangeSummary {
49
+ readonly mutationId: MutationId;
50
+ /** Which edit this was. The host names it; this only says which kind. */
51
+ readonly op: Mutation['op'];
52
+ /** Every facet with a non-zero count, in {@link CHANGE_FACETS} order. */
53
+ readonly parts: readonly SummaryPart[];
54
+ /**
55
+ * The edit landed and moved nothing.
56
+ *
57
+ * Named rather than left to `parts.length === 0`, because it is a FINDING —
58
+ * the one an owner auditing an encoding most needs — and a renderer that
59
+ * reads it as an empty list draws nothing at all. `change.ts` says the same
60
+ * thing from the other end: reporting it as the absence of a change would
61
+ * hide it.
62
+ */
63
+ readonly unchanged: boolean;
64
+ }
65
+ /**
66
+ * One rendered row, and everything that changed on it.
67
+ *
68
+ * `deltas` IS A LIST BECAUSE A ROW CAN BE MORE THAN ONE ISSUE. A `together-with`
69
+ * unit is a single row keyed by its lead, while the store's order carries a row
70
+ * per REF — so when a unit moves, every member produces its own delta and all of
71
+ * them resolve to that one key. One chip per delta would put two chips on one
72
+ * row, stacked on top of each other by any mount that positions them by key.
73
+ * Grouping here means the collision cannot be built rather than being left for a
74
+ * host to notice.
75
+ */
76
+ export interface PlacedChip {
77
+ /** The key the rail drew, which is a slot's lead — not always a delta's ref. */
78
+ readonly key: string;
79
+ /** In the order the change reported them. Never empty. */
80
+ readonly deltas: readonly RankDelta[];
81
+ }
82
+ export interface ReevaluateView {
83
+ /** `null` when no edit has landed since the last dismissal. */
84
+ readonly summary: ChangeSummary | null;
85
+ /** Only rows that changed, and only ones the rail actually drew. */
86
+ readonly chips: readonly PlacedChip[];
87
+ /** A write is in flight, so the order shown is the one from before it. */
88
+ readonly held: boolean;
89
+ readonly diagnostics: readonly string[];
90
+ }
91
+ /** The parts of a change, largest structure first: counts in, zeroes out. */
92
+ export declare function summaryOf(change: OrderChange): ChangeSummary;
93
+ /**
94
+ * The whole re-evaluate view for one render.
95
+ *
96
+ * `change` is the store's `lastChange`, which is absent until an edit lands and
97
+ * again once `dismissChange()` is called. Absent means there is nothing to
98
+ * report — NOT that nothing happened, which is what {@link ChangeSummary.unchanged}
99
+ * says.
100
+ */
101
+ export declare function reevaluateView(change: OrderChange | null | undefined, scene: Scene, status: OrderStatus): ReevaluateView;
102
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * What the last edit did to the order, as a view model.
3
+ *
4
+ * `@issuegraph/store` already computes the change — `diffOrder` ships
5
+ * {@link OrderChange}, and it deliberately stops at COUNTS rather than a
6
+ * sentence so a host writes "3 rows moved · 1 promoted" in its own words. This
7
+ * module keeps that property. It turns the counts into the parts a summary is
8
+ * built from, and it decides which rendered row each delta belongs to. It
9
+ * writes no sentence and holds no state.
10
+ *
11
+ * ## Placement, and why it is asked of the scene rather than of the document
12
+ *
13
+ * A {@link RankDelta} names an ISSUE. A row is keyed by its slot's LEAD, and a
14
+ * `together-with` unit is one row whose partners get none — so a delta about a
15
+ * partner has no row of its own to sit on. `Scene.stationOf` is exactly the
16
+ * "key -> the key that represents it in this projection" map, and
17
+ * `Scene.navigable` is every key the projection actually drew. Asking the scene
18
+ * means the answer comes from the render that just happened, rather than from a
19
+ * second walk over the document that could disagree with it.
20
+ *
21
+ * ## A delta that reaches no row is REPORTED, never dropped
22
+ *
23
+ * With one exception, and it is the interesting one: a delta whose `presence`
24
+ * is `left` describes a row that has gone from the order, so its absence from
25
+ * the rail is the fact it is reporting rather than a failure to place it. Its
26
+ * count still reaches the summary, which is where the reader learns it
27
+ * happened. Everything else that fails to place is a diagnostic — an absence
28
+ * rendered as a value licenses a false conclusion, and the false conclusion
29
+ * here would be "nothing happened to that issue".
30
+ */
31
+ /**
32
+ * The facets a change can have, in the order a summary reads them.
33
+ *
34
+ * Declared as the tuple and narrowed from it, so the list and the type cannot
35
+ * drift: adding a facet here is what makes {@link COUNT_OF} and a host's
36
+ * {@link ./words.ts ChangeWords} fail to compile until both carry it.
37
+ */
38
+ export const CHANGE_FACETS = Object.freeze([
39
+ 'moved',
40
+ 'promoted',
41
+ 'newly-held',
42
+ 'entered',
43
+ 'left',
44
+ ]);
45
+ /**
46
+ * Where each facet's number lives on {@link ChangeCounts}.
47
+ *
48
+ * A table rather than a switch, and rather than a name transform: `newly-held`
49
+ * and `newlyHeld` are the same fact spelled for two different readers — one a
50
+ * DOM attribute, one a TypeScript field — and deriving either from the other
51
+ * would put a string manipulation between the count and the thing it counts.
52
+ * `Record<ChangeFacet, …>` is what makes the table exhaustive at compile time.
53
+ */
54
+ const COUNT_OF = Object.freeze({
55
+ moved: (counts) => counts.moved,
56
+ promoted: (counts) => counts.promoted,
57
+ 'newly-held': (counts) => counts.newlyHeld,
58
+ entered: (counts) => counts.entered,
59
+ left: (counts) => counts.left,
60
+ });
61
+ /** The parts of a change, largest structure first: counts in, zeroes out. */
62
+ export function summaryOf(change) {
63
+ const parts = CHANGE_FACETS.map((facet) => ({
64
+ facet,
65
+ count: COUNT_OF[facet](change.counts),
66
+ })).filter((part) => part.count > 0);
67
+ return {
68
+ mutationId: change.mutation.mutationId,
69
+ op: change.mutation.op,
70
+ parts,
71
+ unchanged: parts.length === 0,
72
+ };
73
+ }
74
+ /**
75
+ * The whole re-evaluate view for one render.
76
+ *
77
+ * `change` is the store's `lastChange`, which is absent until an edit lands and
78
+ * again once `dismissChange()` is called. Absent means there is nothing to
79
+ * report — NOT that nothing happened, which is what {@link ChangeSummary.unchanged}
80
+ * says.
81
+ */
82
+ export function reevaluateView(change, scene, status) {
83
+ const held = status === 'held';
84
+ if (change === null || change === undefined) {
85
+ return { summary: null, chips: [], held, diagnostics: [] };
86
+ }
87
+ const drawn = new Set(scene.navigable);
88
+ // Insertion-ordered, so the chips come out in the order the change reported
89
+ // them and a row that changed twice still appears once, where it first did.
90
+ const byKey = new Map();
91
+ const diagnostics = [];
92
+ for (const delta of change.deltas) {
93
+ const key = scene.stationOf.get(delta.ref) ?? delta.ref;
94
+ if (drawn.has(key)) {
95
+ const group = byKey.get(key);
96
+ if (group === undefined)
97
+ byKey.set(key, [delta]);
98
+ else
99
+ group.push(delta);
100
+ continue;
101
+ }
102
+ // A row that LEFT the order is expected to be missing from the rail that
103
+ // renders the order it left. Its count still reaches the summary.
104
+ if (delta.presence === 'left')
105
+ continue;
106
+ diagnostics.push(`${delta.ref} changed, but no row draws it; its chip has nowhere to attach`);
107
+ }
108
+ const chips = [...byKey].map(([key, deltas]) => ({ key, deltas }));
109
+ return { summary: summaryOf(change), chips, held, diagnostics };
110
+ }
111
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/reevaluate/view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The words. Supplied by the host, never by this package.
3
+ *
4
+ * `@issuegraph/store` ships the change as COUNTS rather than as a sentence, so
5
+ * that a host writes "3 rows moved · 1 promoted · 1 newly held" in its own
6
+ * words, its own order and its own language. This package is the presentation
7
+ * over that data, and shipping a default sentence here would take the choice
8
+ * back one layer down — the host would have a summary it could not theme away
9
+ * and could not translate.
10
+ *
11
+ * SO IT IS REQUIRED, NOT DEFAULTED, on the same reasoning `StoreConfig.derive`
12
+ * is required: "a store cannot invent an order, and a default would be a second
13
+ * implementation of one." A default vocabulary here would be a language choice
14
+ * this package is not entitled to make.
15
+ *
16
+ * That is a narrow claim, and it is worth being exact about its edge. Layer 1
17
+ * does write fixed strings for the rail itself. This module does not re-open
18
+ * that decision; it only declines to add a SECOND fixed string exactly where
19
+ * the store deliberately refused to add the first.
20
+ *
21
+ * ## One vocabulary, read in two places
22
+ *
23
+ * {@link ChangeWords.facets} words both the summary line ("3 **rows moved**")
24
+ * and the per-row chips ("**promoted**"), so each entry has to read on its own
25
+ * as well as after a number. A host wanting two registers renders the view
26
+ * model itself; nothing here is load-bearing for that.
27
+ */
28
+ import type { ChangeFacet } from './view.ts';
29
+ export interface ChangeWords {
30
+ /**
31
+ * One word or phrase per facet.
32
+ *
33
+ * `Record<ChangeFacet, string>` rather than a partial map: a facet with no
34
+ * word would render a bare number, which reads as a different quantity rather
35
+ * than as a missing label. Adding a facet fails a host's build here, which is
36
+ * where it can be fixed.
37
+ */
38
+ readonly facets: Readonly<Record<ChangeFacet, string>>;
39
+ /**
40
+ * Shown, on its own and in the summary's own place, when the edit landed and
41
+ * moved nothing. Not an empty state — the finding.
42
+ */
43
+ readonly unchanged: string;
44
+ /**
45
+ * Labels the order while a write is in flight and the rows are the ones from
46
+ * before it. The rail is greyed a step; this says why.
47
+ */
48
+ readonly computing: string;
49
+ /** The dismiss control. The only thing besides the next edit that clears the summary. */
50
+ readonly dismiss: string;
51
+ /** How a movement chip names its direction. */
52
+ readonly direction: Readonly<Record<'up' | 'down', string>>;
53
+ }
54
+ //# sourceMappingURL=words.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The words. Supplied by the host, never by this package.
3
+ *
4
+ * `@issuegraph/store` ships the change as COUNTS rather than as a sentence, so
5
+ * that a host writes "3 rows moved · 1 promoted · 1 newly held" in its own
6
+ * words, its own order and its own language. This package is the presentation
7
+ * over that data, and shipping a default sentence here would take the choice
8
+ * back one layer down — the host would have a summary it could not theme away
9
+ * and could not translate.
10
+ *
11
+ * SO IT IS REQUIRED, NOT DEFAULTED, on the same reasoning `StoreConfig.derive`
12
+ * is required: "a store cannot invent an order, and a default would be a second
13
+ * implementation of one." A default vocabulary here would be a language choice
14
+ * this package is not entitled to make.
15
+ *
16
+ * That is a narrow claim, and it is worth being exact about its edge. Layer 1
17
+ * does write fixed strings for the rail itself. This module does not re-open
18
+ * that decision; it only declines to add a SECOND fixed string exactly where
19
+ * the store deliberately refused to add the first.
20
+ *
21
+ * ## One vocabulary, read in two places
22
+ *
23
+ * {@link ChangeWords.facets} words both the summary line ("3 **rows moved**")
24
+ * and the per-row chips ("**promoted**"), so each entry has to read on its own
25
+ * as well as after a number. A host wanting two registers renders the view
26
+ * model itself; nothing here is load-bearing for that.
27
+ */
28
+ export {};
29
+ //# sourceMappingURL=words.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"words.js","sourceRoot":"","sources":["../../src/reevaluate/words.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * The ladder's view state, and the only transitions that reach it.
3
+ *
4
+ * Focusing a component, searching for one, and opening the isolated list are
5
+ * NOT edits: nothing about the document changes, so none of them is a
6
+ * `Proposal` and none of them goes near the store. They are the reader's
7
+ * position in the ladder, which is why they live in their own tiny reducer
8
+ * rather than being threaded through the render as loose arguments.
9
+ *
10
+ * THE THREE FIELDS ARE ORTHOGONAL, and every transition touches exactly one of
11
+ * them. That is a decision rather than an omission: an earlier sketch had
12
+ * `focus` close the isolated list, which reads as tidy and is really a second
13
+ * rule a reader has to hold — the list is a list of issues that are in no
14
+ * component, so it says nothing about which component is drawn and has no
15
+ * reason to move when that changes.
16
+ */
17
+ /** Where the reader is standing in the ladder. */
18
+ export interface ScaleState {
19
+ /**
20
+ * A key inside the component the canvas is narrowed to, or `null` for every
21
+ * component at once.
22
+ *
23
+ * ANY MEMBER, NOT THE LEAD. Search-to-focus hands back the issue the reader
24
+ * searched for, and making that the lead's problem would mean the caller
25
+ * resolving a component before it can ask for one.
26
+ */
27
+ readonly focus: string | null;
28
+ /** The search box's contents, verbatim. Empty means the box is untouched. */
29
+ readonly query: string;
30
+ readonly isolatedOpen: boolean;
31
+ }
32
+ export declare const INITIAL_SCALE_STATE: ScaleState;
33
+ export type ScaleCommand = {
34
+ readonly kind: 'focus';
35
+ readonly key: string;
36
+ } | {
37
+ readonly kind: 'clear-focus';
38
+ } | {
39
+ readonly kind: 'search';
40
+ readonly query: string;
41
+ } | {
42
+ readonly kind: 'open-isolated';
43
+ } | {
44
+ readonly kind: 'close-isolated';
45
+ };
46
+ /**
47
+ * Apply one command. Total, pure, and never mutates what it is given.
48
+ *
49
+ * AN EXHAUSTIVE SWITCH OVER A DISCRIMINATED UNION, which is the one branching
50
+ * shape `AGENTS.md`'s boundary rule leaves open and the shape this repository
51
+ * already uses for the same job (`sceneFor`, in the viewer's `render.ts`). The
52
+ * table it would otherwise be — `kind` to handler — cannot be dispatched
53
+ * without a cast: the handlers' parameter types intersect rather than union at
54
+ * the call site, and a cast is exactly what the strict-TypeScript rule forbids.
55
+ * A compile-time-total switch buys the same guarantee honestly: adding a
56
+ * command without a case fails the build here rather than silently returning
57
+ * the state unchanged.
58
+ */
59
+ export declare function scaleReducer(state: ScaleState, command: ScaleCommand): ScaleState;
60
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/scale/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,eAAO,MAAM,mBAAmB,EAAE,UAIhC,CAAC;AAEH,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE,GAChC;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GAClC;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAExC;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,UAAU,CAajF"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The ladder's view state, and the only transitions that reach it.
3
+ *
4
+ * Focusing a component, searching for one, and opening the isolated list are
5
+ * NOT edits: nothing about the document changes, so none of them is a
6
+ * `Proposal` and none of them goes near the store. They are the reader's
7
+ * position in the ladder, which is why they live in their own tiny reducer
8
+ * rather than being threaded through the render as loose arguments.
9
+ *
10
+ * THE THREE FIELDS ARE ORTHOGONAL, and every transition touches exactly one of
11
+ * them. That is a decision rather than an omission: an earlier sketch had
12
+ * `focus` close the isolated list, which reads as tidy and is really a second
13
+ * rule a reader has to hold — the list is a list of issues that are in no
14
+ * component, so it says nothing about which component is drawn and has no
15
+ * reason to move when that changes.
16
+ */
17
+ export const INITIAL_SCALE_STATE = Object.freeze({
18
+ focus: null,
19
+ query: '',
20
+ isolatedOpen: false,
21
+ });
22
+ /**
23
+ * Apply one command. Total, pure, and never mutates what it is given.
24
+ *
25
+ * AN EXHAUSTIVE SWITCH OVER A DISCRIMINATED UNION, which is the one branching
26
+ * shape `AGENTS.md`'s boundary rule leaves open and the shape this repository
27
+ * already uses for the same job (`sceneFor`, in the viewer's `render.ts`). The
28
+ * table it would otherwise be — `kind` to handler — cannot be dispatched
29
+ * without a cast: the handlers' parameter types intersect rather than union at
30
+ * the call site, and a cast is exactly what the strict-TypeScript rule forbids.
31
+ * A compile-time-total switch buys the same guarantee honestly: adding a
32
+ * command without a case fails the build here rather than silently returning
33
+ * the state unchanged.
34
+ */
35
+ export function scaleReducer(state, command) {
36
+ switch (command.kind) {
37
+ case 'focus':
38
+ return { ...state, focus: command.key };
39
+ case 'clear-focus':
40
+ return { ...state, focus: null };
41
+ case 'search':
42
+ return { ...state, query: command.query };
43
+ case 'open-isolated':
44
+ return { ...state, isolatedOpen: true };
45
+ case 'close-isolated':
46
+ return { ...state, isolatedOpen: false };
47
+ }
48
+ }
49
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/scale/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAkBH,MAAM,CAAC,MAAM,mBAAmB,GAAe,MAAM,CAAC,MAAM,CAAC;IAC3D,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,EAAE;IACT,YAAY,EAAE,KAAK;CACpB,CAAC,CAAC;AASH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,KAAiB,EAAE,OAAqB;IACnE,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,OAAO;YACV,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1C,KAAK,aAAa;YAChB,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5C,KAAK,eAAe;YAClB,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QAC1C,KAAK,gBAAgB;YACnB,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAC7C,CAAC;AACH,CAAC"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * The scale ladder — which of the three canvas tiers applies, and the route out
3
+ * of the two that refuse.
4
+ *
5
+ * The list scales; the graph does not, and that is fine because they answer
6
+ * different questions. The order rail is complete at any size — "what gets
7
+ * worked next" is answerable for every issue in the document — while the canvas
8
+ * is a LOCAL instrument answering "what surrounds this issue". So past its
9
+ * budget the canvas refuses rather than thinning, and this module is what makes
10
+ * that refusal actionable.
11
+ *
12
+ * ## Why this is layer 2 rather than more of layer 1
13
+ *
14
+ * `@issuegraph/viewer` already decides the same three tiers and already draws a
15
+ * refusal — deliberately an INFORMATIONAL one. Its own source says why: that
16
+ * package does not narrow, it renders exactly what it is given, so a control it
17
+ * published could never complete the action it advertised. Narrowing is the
18
+ * host's, and the editor is the host. What lands here is only the half layer 1
19
+ * refused to own: a component the reader can actually choose, a search that
20
+ * reaches one, and a chip that opens the issues the canvas leaves out.
21
+ *
22
+ * ## What this module deliberately does not compute
23
+ *
24
+ * Components, blocking counts, cycle flags and chain depth all come from
25
+ * `clustersOf` in the viewer. A second pass out here would be a mirror whose
26
+ * input space drifts from the canvas it is describing — the exact failure the
27
+ * package split exists to prevent — and the two would eventually disagree about
28
+ * whether a component contains a cycle while both were rendered on one screen.
29
+ */
30
+ import { type ViewerDocument, type ViewerIssue } from '@issuegraph/viewer';
31
+ import { type ScaleState } from './commands.ts';
32
+ /** Which of the design's three scale states the canvas is in. */
33
+ export type ScaleTier =
34
+ /** At or under the node budget: the neighbourhood is drawn. */
35
+ 'direct'
36
+ /** Past the node budget: component capsules instead of a hairball. */
37
+ | 'capsules'
38
+ /** Past the cluster-only budget: capsules are truncated and search leads. */
39
+ | 'clusters';
40
+ /** One connected component, as the refusal presents it. */
41
+ export interface ScaleCapsule {
42
+ /**
43
+ * The member a `focus` command should name to draw this component. It is the
44
+ * component's first member in the viewer's own ordering, so two renders of
45
+ * one document always offer the same handle.
46
+ */
47
+ readonly lead: string;
48
+ readonly size: number;
49
+ readonly blockedByEdges: number;
50
+ readonly chainDepth: number;
51
+ readonly hasCycle: boolean;
52
+ readonly members: readonly string[];
53
+ }
54
+ /**
55
+ * A move the reader can make from a refusal.
56
+ *
57
+ * KINDS, NOT INSTANCES. An earlier shape emitted one route per capsule, which
58
+ * made `routes` a second copy of `capsules` that could disagree with it. The
59
+ * capsules carry the identities; this says what can be done with them.
60
+ */
61
+ export type ScaleRouteKind = 'focus-cluster' | 'search' | 'clear-focus' | 'order-rail';
62
+ export interface ScaleRoute {
63
+ readonly kind: ScaleRouteKind;
64
+ readonly label: string;
65
+ }
66
+ /** Why the canvas declined, and where to go instead. Never routeless. */
67
+ export interface ScaleRefusal {
68
+ readonly reason: string;
69
+ readonly nodeCount: number;
70
+ /** The drawing budget the count is past. */
71
+ readonly budget: number;
72
+ readonly routes: readonly ScaleRoute[];
73
+ }
74
+ /**
75
+ * The issues carrying no relationship at all, collapsed to a count.
76
+ *
77
+ * THIS IS NOT `NormalizedDocument.isolated`, and the difference is the whole
78
+ * reason the field is defined here. That one means "in no slot AND on no edge",
79
+ * which in a grooming view — where every issue holds an order position — is
80
+ * empty however many relationship-free issues the backlog has. The design's
81
+ * chip counts issues with no RELATIONSHIP, because in a relationship graph they
82
+ * are dots carrying no information. Two different questions; reusing one name
83
+ * for both would report an absence as a value.
84
+ */
85
+ export interface IsolatedChip {
86
+ readonly count: number;
87
+ /** The chip's own text — the count is the information these issues carry. */
88
+ readonly label: string;
89
+ readonly open: boolean;
90
+ /** The issues themselves, and only once the chip has been opened. */
91
+ readonly issues: readonly ViewerIssue[];
92
+ }
93
+ export interface ScaleMatch {
94
+ readonly key: string;
95
+ readonly title: string;
96
+ /** The `focus` handle for the component this match sits in. */
97
+ readonly lead: string;
98
+ }
99
+ export interface ScaleSearch {
100
+ readonly query: string;
101
+ readonly matches: readonly ScaleMatch[];
102
+ /** Matches found beyond the ones listed. */
103
+ readonly omitted: number;
104
+ }
105
+ export interface ScaleLadder {
106
+ readonly tier: ScaleTier;
107
+ /** The nodes the canvas would draw: the focused component, or all of them. */
108
+ readonly nodeCount: number;
109
+ readonly budgets: {
110
+ readonly node: number;
111
+ readonly clusterOnly: number;
112
+ };
113
+ /** The focused member, once resolved against a real component. */
114
+ readonly focus: string | null;
115
+ readonly refusal: ScaleRefusal | null;
116
+ readonly capsules: readonly ScaleCapsule[];
117
+ /** Components found beyond the capsules listed. */
118
+ readonly capsulesOmitted: number;
119
+ readonly isolated: IsolatedChip;
120
+ /** The affordance, present exactly when the canvas refuses. */
121
+ readonly search: ScaleSearch | null;
122
+ /**
123
+ * The document for the CANVAS ZONE — never for the order rail.
124
+ *
125
+ * Narrowing the canvas is not narrowing the order, and the two must not be
126
+ * confused: the rail is rendered from the whole document by the workspace
127
+ * that assembles the zones. Handing this to a rail would silently shorten the
128
+ * one surface the design guarantees is complete at any size.
129
+ */
130
+ readonly canvas: ViewerDocument;
131
+ readonly diagnostics: readonly string[];
132
+ }
133
+ /**
134
+ * Resolve one document and one reader position into a ladder.
135
+ *
136
+ * Pure and total: no global is read, nothing is fetched, and a `focus` naming a
137
+ * key this document does not place in any component produces a diagnostic and
138
+ * every component, rather than a silently unnarrowed canvas that looks focused.
139
+ */
140
+ export declare function scaleLadder(input: ViewerDocument, state?: ScaleState): ScaleLadder;
141
+ //# sourceMappingURL=ladder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ladder.d.ts","sourceRoot":"","sources":["../../src/scale/ladder.ts"],"names":[],"mappings":"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"}