@issuegraph/viewer 0.5.0 → 0.9.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 (47) hide show
  1. package/dist/clusters.d.ts +116 -0
  2. package/dist/clusters.d.ts.map +1 -1
  3. package/dist/clusters.js +85 -2
  4. package/dist/clusters.js.map +1 -1
  5. package/dist/document.d.ts +76 -5
  6. package/dist/document.d.ts.map +1 -1
  7. package/dist/document.js +19 -1
  8. package/dist/document.js.map +1 -1
  9. package/dist/index.d.ts +14 -3
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +3 -2
  12. package/dist/index.js.map +1 -1
  13. package/dist/layout.d.ts +28 -0
  14. package/dist/layout.d.ts.map +1 -1
  15. package/dist/layout.js +7 -2
  16. package/dist/layout.js.map +1 -1
  17. package/dist/marks.d.ts +105 -0
  18. package/dist/marks.d.ts.map +1 -0
  19. package/dist/marks.js +430 -0
  20. package/dist/marks.js.map +1 -0
  21. package/dist/navigation.d.ts.map +1 -1
  22. package/dist/navigation.js +31 -0
  23. package/dist/navigation.js.map +1 -1
  24. package/dist/parts.d.ts +23 -0
  25. package/dist/parts.d.ts.map +1 -1
  26. package/dist/parts.js +64 -2
  27. package/dist/parts.js.map +1 -1
  28. package/dist/projections/graph.d.ts +15 -0
  29. package/dist/projections/graph.d.ts.map +1 -1
  30. package/dist/projections/graph.js +68 -14
  31. package/dist/projections/graph.js.map +1 -1
  32. package/dist/projections/linear.d.ts +45 -0
  33. package/dist/projections/linear.d.ts.map +1 -1
  34. package/dist/projections/linear.js +65 -12
  35. package/dist/projections/linear.js.map +1 -1
  36. package/dist/projections/tree.d.ts.map +1 -1
  37. package/dist/projections/tree.js +3 -0
  38. package/dist/projections/tree.js.map +1 -1
  39. package/dist/styles.d.ts +1 -1
  40. package/dist/styles.d.ts.map +1 -1
  41. package/dist/styles.js +472 -0
  42. package/dist/styles.js.map +1 -1
  43. package/dist/theme.d.ts +1 -1
  44. package/dist/theme.d.ts.map +1 -1
  45. package/dist/theme.js +47 -0
  46. package/dist/theme.js.map +1 -1
  47. package/package.json +1 -1
package/dist/marks.js ADDED
@@ -0,0 +1,430 @@
1
+ /**
2
+ * Marks a host asks to have drawn on an edge, in a vocabulary of POSITIONS.
3
+ *
4
+ * ## Why this lives in layer 1 at all
5
+ *
6
+ * An editor draws mutation states as overlays on these edges, and most of that
7
+ * needs no help: a halo is the path stroked wider, a ghost is the path dashed
8
+ * differently. Neither moves, so a layer that never interprets the geometry can
9
+ * clone a solved path and be right.
10
+ *
11
+ * The marks are the half that cannot work that way. A chip sits ON a node, a
12
+ * cross sits BESIDE a terminal, a reason sits BESIDE the line, and a conflict's
13
+ * second version sits on the line's PERPENDICULAR. Each needs a position that
14
+ * is not the path's own, and the only layer that has one is the layer that
15
+ * computed the layout.
16
+ *
17
+ * The kit says the same thing in the one crossing it declares: the together
18
+ * connector must live here "because a click target can't be added from outside
19
+ * without the viewer knowing where members are". The remedy there is to move the
20
+ * DRAWING in, not to publish the coordinates out — and the same answer applies
21
+ * for the same reason.
22
+ *
23
+ * ## What keeps this from making the viewer edit-aware
24
+ *
25
+ * The vocabulary is positional and nothing else. {@link EdgeMarkPlacement} says
26
+ * `terminal`, never `failed`; `companion`, never `conflict`. The host maps its
27
+ * own states onto these four, and the mapping never travels — so this module
28
+ * cannot name a mutation state, and a reader of it cannot learn that the
29
+ * package has an editor.
30
+ *
31
+ * That is the property to protect if this file grows. A placement named for
32
+ * what it MEANS rather than where it GOES is the point at which layer 1 has
33
+ * quietly learned layer 2's vocabulary.
34
+ *
35
+ * ## Content is opaque, and the tone is a token NAME
36
+ *
37
+ * A mark carries a glyph the host supplies verbatim, because "✕" and "writing…"
38
+ * belong to whoever knows what they mean. Colour travels as the NAME of a theme
39
+ * custom property rather than a value, which is the contract the edge vocabulary
40
+ * already uses for its own hues: a host that rethemes moves both at once, and
41
+ * nothing here holds a colour.
42
+ *
43
+ * ## The offset is derived, never chosen
44
+ *
45
+ * Every distance below is read from the theme, for the reason the layout module
46
+ * states about its own geometry: a literal stays put while a host scales the
47
+ * type around it. The companion in particular separates by the same stroke
48
+ * width the doubled edge treatment already uses, so the two versions read as a
49
+ * pair at any scale — the property that treatment's own comment exists to keep.
50
+ */
51
+ import { svg } from "./element.js";
52
+ /*
53
+ * THERE IS NO `label`, AND ITS ABSENCE IS DELIBERATE.
54
+ *
55
+ * An earlier draft took one and rendered `role="img"` with an `aria-label` when a
56
+ * host supplied it. That could never have worked: the canvas is an
57
+ * `<svg aria-hidden="true">`, and `aria-hidden` excludes the whole SUBTREE, so no
58
+ * descendant of it can carry an accessible name however it is marked up.
59
+ *
60
+ * It was a field that lied — a published option whose contract the renderer
61
+ * cannot honour — which is worse than not having one, because a host wiring it
62
+ * gets silence rather than an error. This package's own rule is that a control
63
+ * which cannot complete the act it advertises is not drawn; the same applies to
64
+ * an option that cannot deliver what it promises.
65
+ *
66
+ * Marks need no accessible name of their own. Every state is announced once, on
67
+ * the edge's own `aria-label`, and the rail beside the canvas carries every node,
68
+ * name and tab stop. A second, flattened description of the same fact is what the
69
+ * canvas is hidden to avoid. If a host ever does need one, it belongs in the
70
+ * RAIL, which is where accessible content already lives.
71
+ */
72
+ /** The class every mark carries, so a host can find them and a sheet can style them. */
73
+ export const EDGE_MARK_CLASS = 'ig-edge-mark';
74
+ /** The attribute a mark publishes its placement on. */
75
+ export const MARK_PLACEMENT_ATTRIBUTE = 'data-ig-mark';
76
+ /**
77
+ * The unit perpendicular to the edge, at its midpoint.
78
+ *
79
+ * THE TANGENT OF A QUADRATIC AT ITS MIDPOINT IS ITS CHORD, exactly: differentiate
80
+ * `(1-t)²P₀ + 2(1-t)tC + t²P₂` at `t = ½` and the control point cancels, leaving
81
+ * `P₂ - P₀`. So "beside the line" is decided by the two endpoints alone, and the
82
+ * channel the curve bows through cannot tilt it.
83
+ *
84
+ * That is what makes this safe on the case that has bitten before. Two boxes in
85
+ * one column share an x, so the chord is VERTICAL — and a companion offset by a
86
+ * fixed vertical step would slide ALONG such a line rather than beside it,
87
+ * drawing a second version on top of the first. Here a vertical chord yields a
88
+ * horizontal normal, by construction rather than by a special case.
89
+ *
90
+ * A zero-length chord cannot happen — `edgeGeometry` answers `null` when both
91
+ * ends resolve to one box — but it is guarded anyway, because the alternative to
92
+ * a guard is a `NaN` that reaches the markup as a silently undrawn mark.
93
+ */
94
+ function normalAt(start, end) {
95
+ const dx = end.x - start.x;
96
+ const dy = end.y - start.y;
97
+ const length = Math.hypot(dx, dy);
98
+ if (length === 0)
99
+ return { x: 0, y: 0 };
100
+ return { x: -dy / length, y: dx / length };
101
+ }
102
+ /**
103
+ * The edge's normal, turned to face the CHANNEL rather than the cards.
104
+ *
105
+ * A normal has two directions and `normalAt` picks one from the order the
106
+ * endpoints happen to be in — which is a fact about traversal, not about the
107
+ * drawing. Measured: for an upward `blocked-by` between two spine cards it
108
+ * points at +x, and both endpoints sit on the cards' LEFT bounds, so every mark
109
+ * offset that way landed INSIDE the card — where the rail, an opaque HTML layer
110
+ * painted after the canvas, hides it completely. Marks that render and cannot be
111
+ * seen, which is worse than marks that do not render.
112
+ *
113
+ * The control point is the answer, and it needs no new input: the layout routes
114
+ * every arc through a free vertical channel, so the side the curve bows toward
115
+ * is by construction the side with no card on it. Facing the normal that way
116
+ * puts every mark in the space the line already occupies.
117
+ *
118
+ * It also holds where the naive sign happened to be right, so there is one rule
119
+ * rather than a rule and an exception.
120
+ */
121
+ function outwardNormal(geometry) {
122
+ const normal = normalAt(geometry.start, geometry.end);
123
+ const chordMid = {
124
+ x: (geometry.start.x + geometry.end.x) / 2,
125
+ y: (geometry.start.y + geometry.end.y) / 2,
126
+ };
127
+ const toChannel = {
128
+ x: geometry.control.x - chordMid.x,
129
+ y: geometry.control.y - chordMid.y,
130
+ };
131
+ const facing = normal.x * toChannel.x + normal.y * toChannel.y;
132
+ return facing < 0 ? { x: -normal.x, y: -normal.y } : normal;
133
+ }
134
+ /**
135
+ * Which way is away from the CARD at one endpoint, as a unit x.
136
+ *
137
+ * THIS IS THE FACT EVERY EARLIER ATTEMPT WAS APPROXIMATING, and it is the reason
138
+ * three of them were wrong. A mark beside an endpoint has to clear that
139
+ * endpoint's own card, and nothing about the LINE says where that card is: the
140
+ * chord's direction, the arriving tangent and the routing channel each answer a
141
+ * different question, and each of them put marks inside a card for some edges.
142
+ *
143
+ * `edgeGeometry` knows, because it resolved the box — an anchor on a box's left
144
+ * bound is cleared by moving further left, and a right one by moving right — and
145
+ * it publishes the side per endpoint precisely because THE TWO CAN DIFFER. An
146
+ * arc between a gutter card and a spine card leaves one box's right face and
147
+ * arrives on the other's left, so one shared direction clears one end and drives
148
+ * the other mark straight into its card.
149
+ *
150
+ * The y component is zero: cards are laid out in columns and every anchor sits
151
+ * on a vertical bound, so "away" is horizontal by construction.
152
+ */
153
+ function awayFromCard(side) {
154
+ return { x: side === 'left' ? -1 : 1, y: 0 };
155
+ }
156
+ /** The point on the curve at `t = ½`. The control point is a quarter of it. */
157
+ function midpointOf(geometry) {
158
+ const { start, control, end } = geometry;
159
+ return {
160
+ x: 0.25 * start.x + 0.5 * control.x + 0.25 * end.x,
161
+ y: 0.25 * start.y + 0.5 * control.y + 0.25 * end.y,
162
+ };
163
+ }
164
+ function round(value) {
165
+ return (Math.round(value * 100) / 100).toFixed(2);
166
+ }
167
+ /**
168
+ * The colour a STROKE paints with.
169
+ *
170
+ * A stroke that declares no tone takes the RELATIONSHIP's, never `currentColor`.
171
+ * The two are not the same thing here: a mark is a sibling of the edge, so it
172
+ * inherits the viewer's body text rather than the hue `.ig-edge[data-edge=…]`
173
+ * gives the line — which would render a companion grey beside the red line it
174
+ * doubles, silently dropping the one channel that says which relationship is
175
+ * being written.
176
+ *
177
+ * "No tone" therefore means "the kind's", which is what a state with no hue of
178
+ * its own is asking for; a state that has one overrides it here.
179
+ *
180
+ * ONLY A STROKE. A glyph is TEXT and takes {@link GLYPH_FILL} instead — see the
181
+ * note there, and `theme.ts`, which guarantees these hues at a bar text may not
182
+ * be drawn at.
183
+ */
184
+ function strokeToneOf(mark, drawing) {
185
+ const token = mark.tone === undefined || mark.tone === null ? drawing.hueToken : mark.tone;
186
+ return `var(${token})`;
187
+ }
188
+ /**
189
+ * The colour every worded or glyphed mark is drawn in, and it is TEXT-GRADE.
190
+ *
191
+ * THE HUES ARE NOT AVAILABLE TO TEXT, and the palette says so in as many words:
192
+ * `theme.ts` guarantees text at WCAG AA's 4.5:1 and holds every edge hue AND
193
+ * every edit-state hue to the 3:1 bar that applies to a line or a badge outline
194
+ * instead. `theme.test.ts` states the reason for keeping the two apart —
195
+ * "stating the DIFFERENT bar explicitly is what stops the looser number leaking
196
+ * onto text later" — which is precisely what a glyph painted in a relationship
197
+ * hue does. Measured, a `writing…` chip in `--ig-edge-duplicate-of` lands at
198
+ * about 4.47:1, and a host's own theme may sit nearer 3:1 and still be valid.
199
+ *
200
+ * NOTHING IS LOST BY IT, because the mark was never the hue's carrier. The type
201
+ * identity rests on four redundant channels, and a mark's contribution is its
202
+ * SHAPE — a ✕ is not a `!` is not a word, without colour. The hue stays on the
203
+ * line, where the bar it is guaranteed at is the right one: the edge's own
204
+ * stroke, the dashed ghost, and the conflict's companion, which is a stroke and
205
+ * so keeps its tone.
206
+ */
207
+ const GLYPH_FILL = 'var(--ig-text-body)';
208
+ /**
209
+ * One glyph, placed.
210
+ *
211
+ * IT ANNOUNCES NOTHING, and cannot: the canvas is `aria-hidden`, so its whole
212
+ * subtree is out of the accessibility tree whatever this writes. That is also
213
+ * the right answer — every node, name and tab stop is carried by the HTML rail
214
+ * beside it, and the state is announced once on the edge's own `aria-label`, so
215
+ * a mark that spoke would be a second, flattened description of something
216
+ * already said properly.
217
+ *
218
+ * `aria-hidden` is still written rather than left implicit, so the intent is
219
+ * legible on the element rather than inherited from an ancestor a reader of this
220
+ * function cannot see.
221
+ */
222
+ function glyphMark(at, mark, placement, identity,
223
+ /**
224
+ * Which end of the glyph sits on `at`.
225
+ *
226
+ * `middle` centres it, which is right for a single symbol. A WORD needs
227
+ * `start` or `end` instead, because a centred box half as wide as the word
228
+ * reaches back over whatever the sideways offset was meant to clear — and this
229
+ * layer renders to a string, so it can never measure a word to compensate.
230
+ * Anchoring the near edge makes the glyph grow AWAY from the line, at any
231
+ * length and in any font.
232
+ */
233
+ anchor = 'middle') {
234
+ if (mark.glyph === undefined || mark.glyph === null || mark.glyph === '')
235
+ return null;
236
+ return svg('text', {
237
+ class: EDGE_MARK_CLASS,
238
+ [MARK_PLACEMENT_ATTRIBUTE]: placement,
239
+ // THE SAME POINTER IDENTITY THE STROKE CARRIES. A mark sitting on its own
240
+ // edge that resolved to nothing would read as the click having missed —
241
+ // the defect the terminal marker's own identity was added to fix.
242
+ 'data-ig-group': identity,
243
+ x: round(at.x),
244
+ y: round(at.y),
245
+ // Centred on the point it was given, so a caller reasons about ONE
246
+ // position rather than about a glyph's own box.
247
+ 'text-anchor': anchor,
248
+ 'dominant-baseline': 'middle',
249
+ fill: GLYPH_FILL,
250
+ 'aria-hidden': 'true',
251
+ }, [mark.glyph]);
252
+ }
253
+ /**
254
+ * The line again, offset onto its perpendicular.
255
+ *
256
+ * ONE PER STROKE THE KIND ALREADY DRAWS, and that is the correctness of it
257
+ * rather than a nicety. A doubled relationship is two paths separated by a
258
+ * stroke width; a single companion beside that pair is a third line, which is
259
+ * neither of the two things a reader is being asked to compare. The doubling is
260
+ * re-applied here from the same theme metric the edge treatment spends, so the
261
+ * companion is the same SHAPE as the thing it doubles.
262
+ *
263
+ * The offset is a translation of the whole path rather than a re-solved curve:
264
+ * a translated quadratic is congruent to its original, so the two versions are
265
+ * the same line twice, which is what "two versions" has to mean.
266
+ */
267
+ function companionPaths(geometry, mark, theme, identity, drawing) {
268
+ const normal = outwardNormal(geometry);
269
+ const stroke = theme.metrics['--ig-stroke'];
270
+ // Clear of the original by more than the original's own doubling, or the two
271
+ // versions merge into one thicker line at exactly the width the doubling uses.
272
+ const gap = stroke * (drawing.doubled ? 4 : 3);
273
+ const base = {
274
+ class: `${EDGE_MARK_CLASS} ig-edge-companion`,
275
+ [MARK_PLACEMENT_ATTRIBUTE]: 'companion',
276
+ 'data-ig-group': identity,
277
+ d: geometry.d,
278
+ fill: 'none',
279
+ stroke: strokeToneOf(mark, drawing),
280
+ // THE KIND'S OWN DASH, CARRIED. A companion drops `class` like every other
281
+ // mark, so `.ig-edge[data-edge=…]` no longer patterns it — and a SOLID
282
+ // second version beside a dotted `duplicate-of` is not the same line twice,
283
+ // it is a different relationship drawn beside the first. The dash is one of
284
+ // the four redundant channels the type identity rests on, and losing it on
285
+ // the companion loses it exactly where a reader is being asked to compare.
286
+ 'stroke-dasharray': drawing.dashArray,
287
+ // Decoration over a rail that already carries every name.
288
+ 'aria-hidden': 'true',
289
+ };
290
+ /** A shift of `distance` along the chord's normal, as a transform. */
291
+ const along = (distance) => `translate(${round(normal.x * distance)} ${round(normal.y * distance)})`;
292
+ if (!drawing.doubled)
293
+ return [svg('path', { ...base, transform: along(gap) })];
294
+ // THE DOUBLING RIDES THE NORMAL TOO, and the first version of this did not.
295
+ //
296
+ // It separated the pair with `translate(0 ±stroke)` — copied from the edge
297
+ // treatment, which doubles on the global y-axis. That is right for the shapes
298
+ // the viewer happens to draw and wrong here for the same reason the whole
299
+ // module exists: on a VERTICAL chord the y-axis runs ALONG the line, so the
300
+ // two companion strokes slid over each other and drew as one.
301
+ //
302
+ // A vertical chord is the ordinary same-column case, not a corner, so this was
303
+ // the recorded round-4 failure reintroduced inside the change that claims to
304
+ // retire it — and it survived a test asserting the pair's COUNT, because two
305
+ // strokes were emitted and they simply coincided.
306
+ return [
307
+ svg('path', { ...base, transform: along(gap - stroke) }),
308
+ svg('path', { ...base, transform: along(gap + stroke) }),
309
+ ];
310
+ }
311
+ /**
312
+ * Draw the marks a host asked for on one edge.
313
+ *
314
+ * Takes the geometry the projection already solved, so this adds no layout pass
315
+ * and cannot disagree with the line it decorates.
316
+ */
317
+ export function edgeMarkSpecs(marks, geometry, theme, identity, drawing) {
318
+ const specs = [];
319
+ for (const mark of marks) {
320
+ switch (mark.placement) {
321
+ case 'both-ends': {
322
+ // OFF THE LINE, at both ends, and the offset is not decoration.
323
+ //
324
+ // An endpoint is a point on a node's bound, which is also exactly where
325
+ // the terminal marker sits at the arriving end — so a chip drawn ON the
326
+ // endpoint lands on the arrowhead. Measured before this offset existed:
327
+ // five pixels between their centres, which is a collision, on the one
328
+ // channel that carries the relationship's type without colour.
329
+ //
330
+ // Pushed onto the chord's perpendicular, both chips clear the line and
331
+ // the marker at once, and the pair stays symmetric — the same sideways
332
+ // step at each end, so the two read as one state rather than as two
333
+ // marks that happen to share a colour.
334
+ const aside = theme.metrics['--ig-terminal-width'] + theme.metrics['--ig-stroke'] * 4;
335
+ // EACH END IS CLEARED AGAINST ITS OWN CARD. A single direction for the
336
+ // pair is only right when both anchors sit on the same face, which a
337
+ // same-column edge satisfies and a gutter-to-spine edge does not — there
338
+ // one box is left by its right face and the other entered by its left,
339
+ // so one shared direction drove the second chip into its card.
340
+ //
341
+ // The text anchor follows the same side, or a chip cleared leftward
342
+ // grows straight back across the line the offset just moved it off.
343
+ const chip = (point, side) => {
344
+ const away = awayFromCard(side);
345
+ return glyphMark({ x: point.x + away.x * aside, y: point.y + away.y * aside }, mark, 'both-ends', identity, side === 'left' ? 'end' : 'start');
346
+ };
347
+ const at = chip(geometry.start, geometry.startSide);
348
+ const to = chip(geometry.end, geometry.endSide);
349
+ if (at !== null)
350
+ specs.push(at);
351
+ if (to !== null)
352
+ specs.push(to);
353
+ break;
354
+ }
355
+ case 'terminal': {
356
+ // BESIDE THE TERMINAL, AND THE SIDEWAYS STEP IS THE PART THAT WORKS.
357
+ //
358
+ // The arrowhead is one of the four redundant channels the type identity
359
+ // rests on — the one that carries the type without colour — so a mark
360
+ // may sit next to it and must never sit on it.
361
+ //
362
+ // Stepping BACK along the tangent alone does not achieve that, and it
363
+ // measurably did not: a glyph is centred on the point it is given and
364
+ // has a width of its own, so backing off by the marker's own length put
365
+ // the glyph's box over the marker's tail. This layer renders to a string
366
+ // and can never measure a glyph, so any clearance derived from the
367
+ // glyph's size would be a guess.
368
+ //
369
+ // The perpendicular is what actually separates them: offset sideways by
370
+ // more than the marker's full width and the glyph clears it whatever its
371
+ // own width turns out to be, because the two no longer share a line. The
372
+ // step back stays, so the mark still reads as belonging to the arrowhead
373
+ // rather than floating past the tip.
374
+ //
375
+ // Both distances are theme data, and the perpendicular is the one at the
376
+ // END — the tangent there — rather than the chord's, because this mark
377
+ // is about the arrival and not about the line as a whole.
378
+ //
379
+ // THE STEP BACK IS THE TANGENT'S; THE STEP ASIDE IS THE CARD'S. Which
380
+ // way "sideways" points cannot be read off the tangent, and measured, an
381
+ // upward arrival between two spine cards sent the ✕ across the
382
+ // destination card's left bound where the opaque rail hides it.
383
+ //
384
+ // It is the ARRIVING endpoint's own side, not the routing channel's:
385
+ // those agree for a same-column arc and disagree for one that crosses
386
+ // between columns, which is the case a channel-derived sign gets wrong.
387
+ const stroke = theme.metrics['--ig-stroke'];
388
+ const back = theme.metrics['--ig-terminal-length'] + stroke;
389
+ const aside = theme.metrics['--ig-terminal-width'] + stroke * 4;
390
+ const cos = Math.cos(geometry.endAngle);
391
+ const sin = Math.sin(geometry.endAngle);
392
+ const away = awayFromCard(geometry.endSide);
393
+ const at = {
394
+ x: geometry.end.x - cos * back + away.x * aside,
395
+ y: geometry.end.y - sin * back + away.y * aside,
396
+ };
397
+ const spec = glyphMark(at, mark, 'terminal', identity);
398
+ if (spec !== null)
399
+ specs.push(spec);
400
+ break;
401
+ }
402
+ case 'beside': {
403
+ // IN THE CHANNEL, WHICH IS FREE OF CARDS BY DEFINITION — rather than
404
+ // beside the curve by an offset in some derived direction.
405
+ //
406
+ // That distinction is the whole fix. A routing channel is the gap the
407
+ // layout leaves BETWEEN columns precisely so an arc has somewhere to go,
408
+ // so a point at the channel's x is clear of every card without anything
409
+ // needing to know where the cards are. An offset from the curve's
410
+ // midpoint is not: measured, a long arc crossing between the gutters has
411
+ // its midpoint over a spine card, so the glyph landed under the opaque
412
+ // rail — the same invisible-mark failure the endpoint marks had, arrived
413
+ // at from the one placement that has no endpoint of its own to clear.
414
+ //
415
+ // The y is still the curve's, so the mark sits at the line's own height
416
+ // and reads as belonging to it. Only the x is taken from the channel.
417
+ const mid = midpointOf(geometry);
418
+ const spec = glyphMark({ x: geometry.control.x, y: mid.y }, mark, 'beside', identity);
419
+ if (spec !== null)
420
+ specs.push(spec);
421
+ break;
422
+ }
423
+ case 'companion':
424
+ specs.push(...companionPaths(geometry, mark, theme, identity, drawing));
425
+ break;
426
+ }
427
+ }
428
+ return specs;
429
+ }
430
+ //# sourceMappingURL=marks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marks.js","sourceRoot":"","sources":["../src/marks.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,KAAK,KAAK,EAAmB,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,8EAA8E;AAC9E,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AACnD;;;;;;;;;GASG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAED,eAAO,MAAM,sBAAsB,EAAE,eAGnC,CAAC;AAeH;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,GAAG,eAAe,CA6B/E;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CA+D5F"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,KAAK,KAAK,EAAmB,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,8EAA8E;AAC9E,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AACnD;;;;;;;;;GASG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAED,eAAO,MAAM,sBAAsB,EAAE,eAGnC,CAAC;AAeH;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,GAAG,eAAe,CA6B/E;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CA8F5F"}
@@ -118,6 +118,37 @@ export function navigate(scene, state, key) {
118
118
  case 'ArrowRight': {
119
119
  if (state.focused === null)
120
120
  return moveTo(state, first);
121
+ // §16f GIVES THESE TWO KEYS DIFFERENT JOBS IN THE TWO PROJECTIONS, and
122
+ // the shipped binding gave the graph's job to both.
123
+ //
124
+ // List: `↑↓` rows, `→` EXPANDS PROVENANCE, `⏎` opens detail, `g` toggles
125
+ // Graph: `Tab` walks stations in rank order, `↑↓` follows the spine,
126
+ // `←→` traverses to gutter neighbours
127
+ //
128
+ // A lateral move is a graph idea: it reaches a gutter node, something the
129
+ // spine has beside it. The list has no gutters — `scene.lateral` is empty
130
+ // for it — so `→` there did nothing at all, which is why this read as a
131
+ // missing feature rather than as a misrouted key.
132
+ //
133
+ // THE VIEWER CANNOT EXPAND ANYTHING ITSELF. It is a pure renderer, so the
134
+ // expansion is published as a command the host reduces and re-renders
135
+ // with, exactly as `g` publishes a projection change rather than
136
+ // switching one. The host owns which rows are open; this only says which
137
+ // row the reader asked about.
138
+ //
139
+ // `←` COLLAPSES, AND THAT PAIRING IS MINE RATHER THAN §16f's. The tile
140
+ // names `→` and is silent on `←` for the list. Collapse is the
141
+ // conventional partner and leaves the key doing nothing new elsewhere,
142
+ // but it is a choice and not a ruling.
143
+ if (scene.projection === 'linear') {
144
+ return {
145
+ state,
146
+ command: {
147
+ kind: 'command',
148
+ command: `${key === 'ArrowRight' ? 'expand' : 'collapse'}:${state.focused}`,
149
+ },
150
+ };
151
+ }
121
152
  const neighbours = scene.lateral.get(state.focused);
122
153
  const target = key === 'ArrowLeft' ? neighbours?.left : neighbours?.right;
123
154
  return target === undefined ? stay(state) : moveTo(state, target);
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"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"}
package/dist/parts.d.ts CHANGED
@@ -447,6 +447,29 @@ export declare function atStations<T extends {
447
447
  }>(options: T, stations: ReadonlyMap<string, string>): T;
448
448
  /** The title of a slot, naming every member — a together unit is one row. */
449
449
  export declare function slotTitle(document: NormalizedDocument, slot: ViewerSlot): string;
450
+ /**
451
+ * Where a slot sits and whether anything may start it, as one spoken phrase.
452
+ *
453
+ * TWO FACTS, READ FROM TWO FIELDS, and that is the whole point of this
454
+ * function existing. It used to be one expression — `rank === null ? 'held, no
455
+ * rank' : 'rank N'` — which inferred HELD from the ABSENCE OF A RANK. That
456
+ * inference was sound while `@issuegraph/derive` assigned `ready ? rank : null`
457
+ * and is wrong since `RULINGS.md` §1: a held slot whose blocker is inside the
458
+ * previewed order carries a number, so the old expression announced it as
459
+ * plain `rank 2` and DROPPED the word held. A sighted reader still saw the
460
+ * hatched row and the `⊘ blocked-by #488` chip; a screen-reader user lost the
461
+ * single most important fact about the row, silently, on the exact case the
462
+ * ruling exists to draw.
463
+ *
464
+ * So `ready` is read on its own, never through `rank`. §16a's row says both
465
+ * things at once — `⊘ blocked-by #488` beside `rank 2` — and the accessible
466
+ * name says both too.
467
+ *
468
+ * ONE FUNCTION FOR EVERY SURFACE. The linear row's `aria-label`, the graph
469
+ * node's and the graph station's all phrase this, and three copies of a
470
+ * two-field rule is three chances to reintroduce the one-field one.
471
+ */
472
+ export declare function slotPosition(slot: ViewerSlot): string;
450
473
  /** A slot's accessible name: what it is, where it sits, and whether it is held. */
451
474
  export declare function slotLabel(document: NormalizedDocument, slot: ViewerSlot): string;
452
475
  /** The empty state. A container with nothing in it reads as a bug. */
@@ -1 +1 @@
1
- {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../src/parts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../src/parts.ts"],"names":[],"mappings":"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"}