@issuegraph/viewer 0.12.0 → 0.13.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 (43) hide show
  1. package/README.md +13 -0
  2. package/dist/index.d.ts +5 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/mount.d.ts +20 -1
  7. package/dist/mount.d.ts.map +1 -1
  8. package/dist/mount.js +228 -18
  9. package/dist/mount.js.map +1 -1
  10. package/dist/navigation.d.ts +26 -3
  11. package/dist/navigation.d.ts.map +1 -1
  12. package/dist/navigation.js +34 -2
  13. package/dist/navigation.js.map +1 -1
  14. package/dist/parts.d.ts +15 -1
  15. package/dist/parts.d.ts.map +1 -1
  16. package/dist/parts.js +35 -1
  17. package/dist/parts.js.map +1 -1
  18. package/dist/projections/graph.d.ts.map +1 -1
  19. package/dist/projections/graph.js +42 -17
  20. package/dist/projections/graph.js.map +1 -1
  21. package/dist/projections/linear.d.ts +25 -2
  22. package/dist/projections/linear.d.ts.map +1 -1
  23. package/dist/projections/linear.js +16 -8
  24. package/dist/projections/linear.js.map +1 -1
  25. package/dist/projections/tree.d.ts.map +1 -1
  26. package/dist/projections/tree.js +2 -1
  27. package/dist/projections/tree.js.map +1 -1
  28. package/dist/recede.d.ts +40 -0
  29. package/dist/recede.d.ts.map +1 -0
  30. package/dist/recede.js +67 -0
  31. package/dist/recede.js.map +1 -0
  32. package/dist/scene.d.ts +1 -1
  33. package/dist/scene.d.ts.map +1 -1
  34. package/dist/scene.js +5 -3
  35. package/dist/scene.js.map +1 -1
  36. package/dist/selection.d.ts +65 -0
  37. package/dist/selection.d.ts.map +1 -0
  38. package/dist/selection.js +127 -0
  39. package/dist/selection.js.map +1 -0
  40. package/dist/styles.d.ts.map +1 -1
  41. package/dist/styles.js +142 -13
  42. package/dist/styles.js.map +1 -1
  43. package/package.json +1 -1
package/README.md CHANGED
@@ -99,6 +99,8 @@ Roughly half of what the design draws is not derivable from the graph. The forma
99
99
 
100
100
  **The rail sits on the canvas, not above it.** Ranks and readiness stations are HTML — SVG text is not selectable, not reflowable and announces poorly — but they are the labels *for* the spine nodes, so each row is positioned at the coordinates the layout computed for its own node. One stage carries both at the layout's own size, so one SVG unit is one CSS pixel and the two cannot drift; it scrolls rather than shrinking, because shrinking would silently break that alignment.
101
101
 
102
+ **A selection recedes the rest of the graph, so its neighbours read first.** With `selected` set to an issue key, that issue, every issue it shares an edge with, and those edges stay at full strength; everything else in the graph recedes. With `selectedEdge` set to a relationship's `edgeIdentity`, that edge and its two ends stay. `recedingOf(document, { key, edge })` returns what recedes, and `key` may also be a set of issue keys. **Issues win:** when any selected key names an issue in the document, `selectedEdge` is ignored. The graph and the list recede; the tree draws a selection as before. `mountViewer` works out `selectedEdge` from its own selection, so a clicked relationship recedes the rest and clearing it restores everything, and a `selectedEdge` or a `receding` passed in its options is ignored. It also recedes by the selection as it was made: selecting one member of a together unit keeps that member's neighbours, not its partners', even though the handle and `onSelect` report the unit's lead for a single selected member.
103
+
102
104
  **The graph refuses rather than degrades.** Past 60 nodes it stops drawing and shows connected components as capsules — size, blocking count, cycle flag, chain depth — and past 300 it shows clusters only. Each refusal names the next move. A refusal with a route forward reads as competence; a hairball reads as a bug.
103
105
 
104
106
  **A row's badges are budgeted; the order is not.** The linear and tree projections draw every row at any size — that is the promise the refusal routes a reader to — so what they bound is the relationships *per row*: past `ROW_BADGE_BUDGET` (12) a row draws the first twelve in the format's field order, `blocked-by` first, and one `+N more relationships` chip carrying `data-omitted`, its name in its visible text because ARIA prohibits naming a generic span. Nothing is cut silently, and the chip carries no edge identity because it names no single edge; an omitted edge is still selectable, since the drawn-check answers from the document before it consults the markup.
@@ -121,6 +123,12 @@ The `together-with` **connector** lives in this layer, declared deliberately: a
121
123
 
122
124
  **They name different subjects, and a host must not assume an issue key.** The enclosure names its **slot** — its `data-ig-group` is the slot's lead, so clicking it selects the unit. Every **edge** mark names the edge itself, with the identity `edgeIdentity` derives, which is exactly the `id` `@issuegraph/store` gives the matching `StoredEdge` — so `findEdge(document, key)` resolves it. That covers all five relationships: the four drawn as arcs, on both the stroke and the arrowhead that caps it, and `together-with` on its connector. One connector is drawn per declared `together-with` edge rather than per adjacent member, because a group is joined by pointing at any existing member (§4.3.7) and a star would otherwise publish a pair the document never declared.
123
125
 
126
+ **A selection can be a set of issues.** In the mounted viewer a plain click replaces the selection, a Cmd-click or Ctrl-click adds or drops one issue, a Shift-click adds a range in rank order from the most recently added issue, with the clicked issue last, and Shift with an arrow key extends the range to the issue focus moves to. Esc clears the selection; with nothing selected, Esc is left to the host. A relationship stays single-select: a click on one, with or without a modifier, replaces any set of issues, and a modifier click on blank graph space keeps the set. A host can pass a set as `selected` (an array of keys in the order they were added) to `renderViewer` or `mountViewer`.
127
+
128
+ **`onSelectionChange(selection)` reports the whole selection** as a `ViewerSelection` — `{ kind: 'none' }`, `{ kind: 'edge', edgeId }`, or `{ kind: 'issues', keys }` with the keys as the reader added them, a fresh frozen array each time. It fires once per change, including an `update` that drops a selected member, and never for a redraw, a projection switch, an unchanged `update`, or a repeated selection of what is already selected. It fires before `onSelect`. `nextSelection`, `viewerSelectionOf`, `storedSelectionOf` and `sameSelection` are exported, so a host building a set from its own input follows the same rules.
129
+
130
+ **`onSelect(key)` still reports one key.** It receives `null` for none and the identity for a relationship. For one selected issue it receives the key the handle holds, which is a together unit's lead when a member was selected. For a set of two or more issues it receives the most recently added key exactly as given, never its unit's lead. It also keeps firing on every click, `Enter` or `select()`, even when the selection does not change, as it always has; `onSelectionChange` stays silent then.
131
+
124
132
  So `onSelect` reports **either** an issue key or an edge identity. Distinguish them the way you already hold your data — an issue key is a key in the document you passed in — rather than by parsing the string. Selecting an edge deliberately does **not** move the keyboard tab stop: `navigable` lists issues, and focus is left where the reader put it.
125
133
 
126
134
  ## Theming
@@ -158,6 +166,11 @@ const paper = extendTheme(defaultTheme, {
158
166
  '--ig-edge-together-with': '#0A5B8A',
159
167
  '--ig-edge-duplicate-of': '#6B2E9E',
160
168
  '--ig-edge-decomposed-from': '#A31257',
169
+ // Dark, because a state hue is drawn faded and the blend that lands on a
170
+ // light surface must still clear 3:1; the default theme's pale hues do not.
171
+ '--ig-state-invalid': '#5A0000',
172
+ '--ig-state-failed': '#3D0F00',
173
+ '--ig-state-conflict': '#5C4300',
161
174
  },
162
175
  });
163
176
 
package/dist/index.d.ts CHANGED
@@ -42,7 +42,7 @@ export type { SkeletonOptions, SkeletonResult } from './skeleton.ts';
42
42
  export { renderViewerSkeleton, skeletonSpec } from './skeleton.ts';
43
43
  export type { MountElement, MountEvent, MountOptions, ViewerHandle, } from './mount.ts';
44
44
  export { mountViewer } from './mount.ts';
45
- export type { NavigationCommand, NavigationResult, NavigationState } from './navigation.ts';
45
+ export type { NavigationCommand, NavigationModifiers, NavigationResult, NavigationState } from './navigation.ts';
46
46
  export { initialNavigationState, navigate, reconcile } from './navigation.ts';
47
47
  export type { ColorToken, EffectToken, MetricToken, Theme, ThemeOverride, TypeToken, } from './theme.ts';
48
48
  export { resolveTheme, COLOR_TOKENS, EFFECT_TOKENS, METRIC_TOKENS, THEME_TOKENS, TYPE_TOKENS, defaultTheme, extendTheme, themeCss, } from './theme.ts';
@@ -50,6 +50,10 @@ export { viewerStylesheet } from './styles.ts';
50
50
  export type { EdgeDash, EdgeTerminal, EdgeTreatment, OrderingEffect } from './vocabulary.ts';
51
51
  export { EDGE_TREATMENTS, dashArrayFor, labelFrom, treatmentFor } from './vocabulary.ts';
52
52
  export { CLUSTER_ONLY_BUDGET, GRAPH_NODE_BUDGET, relatedKeys } from './projections/graph.ts';
53
+ export type { RecedeSelection, Receding } from './recede.ts';
54
+ export { RECEDE_ALPHA, recedingOf } from './recede.ts';
55
+ export type { SelectionGesture, StoredSelection, ViewerSelection } from './selection.ts';
56
+ export { isNarrowBox, nextSelection, sameSelection, storedSelectionOf, viewerSelectionOf, } from './selection.ts';
53
57
  export { isFooterSlot } from './projections/linear.ts';
54
58
  /**
55
59
  * The mark vocabulary, and it is deliberately the ONLY thing `marks.ts` puts on
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,YAAY,EACV,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,cAAc,EACd,UAAU,EACV,WAAW,EACX,eAAe,EACf,WAAW,EACX,cAAc,EACd,UAAU,EACV,eAAe,EACf,UAAU,EACV,WAAW,EACX,WAAW,EACX,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE9D,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEnE,YAAY,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE9E,YAAY,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,KAAK,EACL,aAAa,EACb,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EACnB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,QAAQ,GACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAW7F,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKzF,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAO7F,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD;;;;;;;;GAQG;AACH,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAiBvE,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,QAAQ,EACR,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE5E,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -55,6 +55,8 @@ export { EDGE_TREATMENTS, dashArrayFor, labelFrom, treatmentFor } from "./vocabu
55
55
  // editor's scale ladder decides the same tiers against the same constants, so it
56
56
  // reads the canvas's own count rather than spelling "related" a second time.
57
57
  export { CLUSTER_ONLY_BUDGET, GRAPH_NODE_BUDGET, relatedKeys } from "./projections/graph.js";
58
+ export { RECEDE_ALPHA, recedingOf } from "./recede.js";
59
+ export { isNarrowBox, nextSelection, sameSelection, storedSelectionOf, viewerSelectionOf, } from "./selection.js";
58
60
  // `isFooterSlot` IS ON THE SURFACE FOR THE EDITOR'S RAIL, which windows the
59
61
  // sequence and carries the footer's slots whole. Which slots belong to the
60
62
  // footer is this package's rule — any tracker-family hold — and a rail that
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AA4BH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQnE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU9E,OAAO,EAAE,YAAY,EACnB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,QAAQ,GACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,0EAA0E;AAC1E,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEzF,+EAA+E;AAC/E,iFAAiF;AACjF,6EAA6E;AAC7E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE7F,4EAA4E;AAC5E,2EAA2E;AAC3E,4EAA4E;AAC5E,8EAA8E;AAC9E,uEAAuE;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAYvD,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACvE,iFAAiF;AACjF,8EAA8E;AAC9E,qDAAqD;AACrD,+EAA+E;AAC/E,yEAAyE;AACzE,6DAA6D;AAC7D,6EAA6E;AAC7E,2EAA2E;AAC3E,qEAAqE;AACrE,2EAA2E;AAC3E,qBAAqB;AACrB,0EAA0E;AAC1E,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,0EAA0E;AAC1E,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,QAAQ,EACR,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG5E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AA4BH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQnE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU9E,OAAO,EAAE,YAAY,EACnB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,QAAQ,GACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,0EAA0E;AAC1E,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEzF,+EAA+E;AAC/E,iFAAiF;AACjF,6EAA6E;AAC7E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAO7F,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOvD,OAAO,EACL,WAAW,EACX,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,4EAA4E;AAC5E,2EAA2E;AAC3E,4EAA4E;AAC5E,8EAA8E;AAC9E,uEAAuE;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAYvD,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACvE,iFAAiF;AACjF,8EAA8E;AAC9E,qDAAqD;AACrD,+EAA+E;AAC/E,yEAAyE;AACzE,6DAA6D;AAC7D,6EAA6E;AAC7E,2EAA2E;AAC3E,qEAAqE;AACrE,2EAA2E;AAC3E,qBAAqB;AACrB,0EAA0E;AAC1E,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,0EAA0E;AAC1E,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,QAAQ,EACR,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG5E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
package/dist/mount.d.ts CHANGED
@@ -18,6 +18,7 @@ import { type SpecDocument, type SpecElement, type SpecNode } from './element.ts
18
18
  import { type NavigationState } from './navigation.ts';
19
19
  import { type RenderOptions } from './render.ts';
20
20
  import { type Projection } from './scene.ts';
21
+ import { type ViewerSelection } from './selection.ts';
21
22
  /** The slice of an element `mount` needs beyond building. */
22
23
  export interface MountElement extends SpecElement {
23
24
  readonly ownerDocument: SpecDocument;
@@ -35,11 +36,29 @@ export interface MountEvent {
35
36
  readonly target?: MountElement | null;
36
37
  /** Present on a keyboard event. */
37
38
  readonly key?: string;
39
+ /** Shift-click ranges; Shift with an arrow extends. */
40
+ readonly shiftKey?: boolean;
41
+ /** Cmd-click adds or drops one issue. */
42
+ readonly metaKey?: boolean;
43
+ /** Ctrl-click adds or drops one issue, as Cmd-click does. */
44
+ readonly ctrlKey?: boolean;
38
45
  preventDefault?(): void;
39
46
  }
40
47
  export interface MountOptions extends RenderOptions {
41
- /** Called when a key is selected — by click, `Enter`, or `select()`. */
48
+ /**
49
+ * Called when a key is selected — by click, `Enter`, or `select()`. Reports
50
+ * `null` for none, the identity for a relationship, a single issue as the
51
+ * station it is drawn on, and for a set of two or more issues the most
52
+ * recently added key exactly as given.
53
+ */
42
54
  readonly onSelect?: ((key: string | null) => void) | undefined;
55
+ /**
56
+ * Called once per change of the selection, with the whole selection as the
57
+ * reader made it: never for a redraw, a projection switch, or a repeated
58
+ * selection of what is already selected. Fires before `onSelect`. The keys
59
+ * are a fresh frozen array each time.
60
+ */
61
+ readonly onSelectionChange?: ((selection: ViewerSelection) => void) | undefined;
43
62
  /** Called with the hovered key, and with `null` when nothing is hovered. */
44
63
  readonly onHover?: ((key: string | null) => void) | undefined;
45
64
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAA2B,KAAK,cAAc,EAAqB,MAAM,eAAe,CAAC;AAChG,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAe,MAAM,cAAc,CAAC;AAC/F,OAAO,EACL,KAAK,eAAe,EAIrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,aAAa,EAAY,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAkC,KAAK,UAAU,EAAc,MAAM,YAAY,CAAC;AAGzF,6DAA6D;AAC7D,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC;IACrC,oFAAoF;IACpF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3E,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9E,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED,2CAA2C;AAC3C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACtC,mCAAmC;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,IAAI,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/D,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9D;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC9D;AAED,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5D,+EAA+E;IAC/E,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5C,+EAA+E;IAC/E,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,uEAAuE;IACvE,OAAO,IAAI,IAAI,CAAC;CACjB;AAoFD;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,YAAY,EACvB,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE,YAAiB,GACzB,YAAY,CAmed"}
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"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"}
package/dist/mount.js CHANGED
@@ -17,9 +17,10 @@ import { edgeIdentity } from '@issuegraph/core';
17
17
  import { normalizeDocument } from "./document.js";
18
18
  import { materialize } from "./element.js";
19
19
  import { initialNavigationState, navigate, reconcile, } from "./navigation.js";
20
- import { COMMAND_ATTRIBUTE } from "./parts.js";
20
+ import { COMMAND_ATTRIBUTE, stationsOf } from "./parts.js";
21
21
  import { sceneFor } from "./render.js";
22
22
  import { GROUP_ATTRIBUTE, KEY_ATTRIBUTE } from "./scene.js";
23
+ import { nextSelection, sameSelection, selectedKeysOf, storedSelectionOf, viewerSelectionOf, } from "./selection.js";
23
24
  import { resolveTheme } from "./theme.js";
24
25
  /**
25
26
  * Elements that own their own keyboard activation.
@@ -113,6 +114,18 @@ export function mountViewer(container, input, options = {}) {
113
114
  focused: options.focused ?? initialNavigationState.focused,
114
115
  selected: options.selected ?? initialNavigationState.selected,
115
116
  };
117
+ /**
118
+ * The selection exactly as the reader or host made it, which the graph and
119
+ * the list recede by.
120
+ *
121
+ * `state.selected` cannot serve, because each draw moves a selected unit
122
+ * member to its unit's lead, and a member keeps only its own neighbours and
123
+ * lines, not its partners'. Every other reader — the tree, the handle and
124
+ * `onSelect` — still sees `state.selected`. Written wherever
125
+ * `state.selected` is chosen or dropped, and re-checked on every draw by
126
+ * `asGivenSelection`.
127
+ */
128
+ let selectedAsGiven = state.selected;
116
129
  let root = null;
117
130
  let keyed = new Map();
118
131
  // EVERY IDENTITY THE LAST DRAW PUT UNDER THE POINTER — issues AND decoration.
@@ -181,6 +194,118 @@ export function mountViewer(container, input, options = {}) {
181
194
  * and an `update` that removes an edge still drops it.
182
195
  */
183
196
  const stillDrawn = (key) => normalized.byKey.has(key) || isDocumentEdge(key) || pointable.has(key);
197
+ /**
198
+ * A selection with every member that no longer names something dropped.
199
+ * A single key is kept or dropped whole, as before; a set loses only the
200
+ * members that went, and collapses to one key or none as they go.
201
+ */
202
+ const keepDrawn = (selected) => typeof selected === 'string' || selected === null
203
+ ? selected !== null && stillDrawn(selected) ? selected : null
204
+ : storedSelectionOf({ kind: 'issues', keys: selected.filter((key) => stillDrawn(key) && !isDocumentEdge(key)) });
205
+ /**
206
+ * The remembered selection, while it still names what `state.selected`
207
+ * names; otherwise `state.selected` itself.
208
+ *
209
+ * It must name something this document carries and stand on the same
210
+ * station as `state.selected`. An update that removes a selected member, or
211
+ * a later selection of another subject, therefore falls back to the issue
212
+ * the graph and the list mark and the handle reports, so they never disagree.
213
+ */
214
+ const asGivenSelection = () => {
215
+ const selected = state.selected;
216
+ const given = selectedAsGiven;
217
+ if (selected === null || given === null)
218
+ return selected;
219
+ const stations = stationsOf(normalized);
220
+ // Each station once, where its member was last added: the order `reconcile`
221
+ // names a set's stations in, so a set and its stations compare by value.
222
+ const stationsIn = (keys) => {
223
+ const named = keys.map((key) => stations.get(key) ?? key);
224
+ return JSON.stringify(named.filter((key, index) => named.lastIndexOf(key) === index));
225
+ };
226
+ const stillNamed = selectedKeysOf(given).filter((key) => normalized.byKey.has(key) || isDocumentEdge(key));
227
+ return stillNamed.length > 0 && stationsIn(stillNamed) === stationsIn(selectedKeysOf(selected))
228
+ ? storedSelectionOf(viewerSelectionOf(normalized, stillNamed.length === 1 ? (stillNamed[0] ?? null) : stillNamed))
229
+ : selected;
230
+ };
231
+ /**
232
+ * A SET IS ITS MEMBERS AS GIVEN, ON EVERY DRAW. The members this document
233
+ * still carries are the selection, and their stations are derived from them
234
+ * afresh; nothing else is. Falling back to the stations the handle held
235
+ * selected a removed member's lead, an issue the reader never picked, and
236
+ * keeping old stations after an update moved a lead silently dropped a
237
+ * member that was still there. An edge identity is never a member. A single
238
+ * selection keeps today's rule — a removed member falls back to its lead —
239
+ * which `asGivenSelection` applies. `undefined` when the selection is not a
240
+ * set.
241
+ */
242
+ const survivingSet = () => {
243
+ const given = selectedAsGiven;
244
+ if (given === null || typeof given === 'string')
245
+ return undefined;
246
+ return storedSelectionOf({ kind: 'issues', keys: given.filter((key) => normalized.byKey.has(key)) });
247
+ };
248
+ /** The selection as the reader made it, which `onSelectionChange` reports. */
249
+ const selectionAsGiven = () => viewerSelectionOf(normalized, selectedAsGiven);
250
+ /**
251
+ * What `onSelect` reports: for a set of two or more issues, the most recently
252
+ * added key exactly as given; otherwise the one key the handle holds, a unit
253
+ * member as its lead.
254
+ */
255
+ const reportedKey = () => {
256
+ const given = selectionAsGiven();
257
+ if (given.kind === 'issues' && given.keys.length > 1)
258
+ return given.keys.at(-1) ?? null;
259
+ return selectedKeysOf(state.selected).at(-1) ?? null;
260
+ };
261
+ // WHAT THE HOST WAS LAST TOLD, compared by value, never by array identity.
262
+ // Seeded from the options, so mounting a selection is not a change.
263
+ let announced = selectionAsGiven();
264
+ let lastReported = reportedKey();
265
+ // ONE QUEUE FOR EVERY NOTICE, so a host that changes the selection from
266
+ // inside a callback is told about it after the notices already due, in
267
+ // order, and none is skipped or reported out of turn.
268
+ const notices = [];
269
+ let draining = false;
270
+ const deliver = (notice) => {
271
+ notices.push(notice);
272
+ if (draining)
273
+ return;
274
+ draining = true;
275
+ try {
276
+ for (let next = notices.shift(); next !== undefined; next = notices.shift())
277
+ next();
278
+ }
279
+ finally {
280
+ draining = false;
281
+ }
282
+ };
283
+ /**
284
+ * Tell the host about the selection, from ONE place. `onSelectionChange`
285
+ * fires when the selection as given changed by value; `onSelect` fires with
286
+ * it, and also when the key it reports changed (a projection switch that
287
+ * renames a unit member to its lead), and — `force` — on every click,
288
+ * `Enter` or `select()`, even of what is already selected, as it always has.
289
+ */
290
+ const announce = (force) => {
291
+ const selection = selectionAsGiven();
292
+ const key = reportedKey();
293
+ const changed = !sameSelection(announced, selection);
294
+ const reported = changed || force || key !== lastReported;
295
+ announced = selection;
296
+ lastReported = key;
297
+ // A FRESH FROZEN COPY per notice, so a host that mutates what it was
298
+ // handed changes nothing here.
299
+ const handed = selection.kind === 'issues'
300
+ ? Object.freeze({ kind: 'issues', keys: Object.freeze([...selection.keys]) })
301
+ : Object.freeze({ ...selection });
302
+ deliver(() => {
303
+ if (changed)
304
+ currentOptions.onSelectionChange?.(handed);
305
+ if (reported)
306
+ currentOptions.onSelect?.(key);
307
+ });
308
+ };
184
309
  let hovered = null;
185
310
  let destroyed = false;
186
311
  // Set by the first `draw()` below, which runs before any listener can fire.
@@ -224,7 +349,6 @@ export function mountViewer(container, input, options = {}) {
224
349
  // host has to hear about BOTH. Keying the notice on a single `dropped` flag
225
350
  // covered only the first, so `setProjection` renamed the selection and told
226
351
  // nobody: the handle read the station while the host still held the member.
227
- const selectedBefore = state.selected;
228
352
  // A DECORATION SELECTION IS NOT AN ISSUE AND MUST SURVIVE THIS TEST. The
229
353
  // subject can be a `together-with` connector, whose identity is an edge and
230
354
  // is therefore absent from `byKey` by construction — dropping on document
@@ -240,13 +364,32 @@ export function mountViewer(container, input, options = {}) {
240
364
  // The post-materialize check settles it a few lines down, against a scene
241
365
  // that exists; deferring costs one frame in which nothing renders an edge
242
366
  // selection anyway.
243
- if (currentScene !== null && state.selected !== null && !stillDrawn(state.selected)) {
244
- state = { ...state, selected: null };
367
+ const surviving = survivingSet();
368
+ if (surviving !== undefined) {
369
+ selectedAsGiven = surviving;
370
+ state = { ...state, selected: surviving };
245
371
  }
372
+ else if (currentScene !== null) {
373
+ state = { ...state, selected: keepDrawn(state.selected) };
374
+ }
375
+ selectedAsGiven = asGivenSelection();
246
376
  if (root !== null)
247
377
  container.removeChild(root);
248
378
  const scene = sceneFor(normalized, projection, {
249
379
  ...currentOptions,
380
+ // THE GRAPH AND THE LIST ARE HANDED THE SELECTION AS GIVEN, because they
381
+ // are the projections that recede. Each still marks the unit's lead,
382
+ // since it moves a member to its lead before it marks anything. The tree
383
+ // does not recede and keeps the lead the handle reports.
384
+ selected: projection === 'tree' ? state.selected : selectedAsGiven,
385
+ // DERIVED FROM THE SELECTION, never taken from the host's options, so a
386
+ // relationship recedes only while it is the selection and a clear
387
+ // always restores everything.
388
+ selectedEdge: typeof state.selected === 'string' && isDocumentEdge(state.selected) ? state.selected : null,
389
+ // NEVER TAKEN FROM THE HOST'S OPTIONS either, for the same reason: the
390
+ // mount draws its whole document, so the list works out what recedes
391
+ // from the live selection above.
392
+ receding: undefined,
250
393
  // NEVER DETACHED HERE. The mount draws every row it is handed, so it is
251
394
  // its own extent and the inline footer is already after the last of
252
395
  // them. It also materializes `scene.root` and nothing else — a detached
@@ -254,7 +397,6 @@ export function mountViewer(container, input, options = {}) {
254
397
  // walking into keys the page does not have. See `SceneOptions.detachFooter`.
255
398
  detachFooter: false,
256
399
  theme: currentOptions.theme ?? theme,
257
- selected: state.selected,
258
400
  focused: state.focused,
259
401
  });
260
402
  state = reconcile(scene, state);
@@ -342,19 +484,54 @@ export function mountViewer(container, input, options = {}) {
342
484
  // by `byKey` and by `reconcile`; this covers the decoration case those two
343
485
  // cannot see. It runs BEFORE the notice below, so a subject that went away
344
486
  // is reported exactly once, through the same channel as every other change.
345
- if (state.selected !== null && !stillDrawn(state.selected)) {
346
- state = { ...state, selected: null };
347
- }
487
+ state = { ...state, selected: keepDrawn(state.selected) };
488
+ selectedAsGiven = state.selected === null ? null : asGivenSelection();
348
489
  // TOLD, NOT JUST DROPPED. The host was told a selection began, so leaving it
349
490
  // to infer the ending from a document it happens to have replaced is the
350
491
  // same divergence `clearHover` exists to prevent one line up. Fired AFTER
351
492
  // the DOM is in place, exactly as the hover clear is, so a host that redraws
352
493
  // from this callback finds the viewer already consistent.
353
- if (announceSelection && state.selected !== selectedBefore) {
354
- currentOptions.onSelect?.(state.selected);
355
- }
494
+ if (announceSelection)
495
+ announce(false);
496
+ };
497
+ /**
498
+ * The rank order a Shift range walks: every member of every ranked slot, in
499
+ * the order the document ranks them, so a range across a unit adds each of
500
+ * its members as given.
501
+ */
502
+ const rankOrder = () => normalized.order.slots.filter((slot) => slot.rank !== null).flatMap((slot) => slot.members);
503
+ /**
504
+ * The selection after `gesture`, with everything this document cannot name
505
+ * dropped BEFORE it is written, so no notice ever names it: an issue key the
506
+ * scene cannot point at, or an edge identity inside a set of issues.
507
+ */
508
+ const selectionAfter = (gesture) => {
509
+ const next = nextSelection(selectionAsGiven(), gesture, rankOrder());
510
+ if (next.kind === 'edge')
511
+ return stillDrawn(next.edgeId) ? next.edgeId : null;
512
+ if (next.kind === 'none')
513
+ return null;
514
+ return storedSelectionOf({
515
+ kind: 'issues',
516
+ keys: next.keys.filter((key) => stillDrawn(key) && !isDocumentEdge(key)),
517
+ });
518
+ };
519
+ /** What a pointer or key press on `key` asks for, given the modifiers held. */
520
+ const gestureFor = (key, event) => {
521
+ // A RELATIONSHIP UNDER ANY MODIFIER IS A PLAIN RELATIONSHIP CLICK: a set
522
+ // holds issues only, so it replaces any set.
523
+ if (isDocumentEdge(key))
524
+ return { kind: 'edge', edgeId: key };
525
+ if (event.metaKey === true || event.ctrlKey === true)
526
+ return { kind: 'toggle', key };
527
+ if (event.shiftKey === true)
528
+ return { kind: 'range', key };
529
+ return { kind: 'replace', key };
356
530
  };
357
531
  const emitSelect = (key) => {
532
+ applyGesture(key === null ? { kind: 'clear' } : isDocumentEdge(key) ? { kind: 'edge', edgeId: key } : { kind: 'replace', key }, key);
533
+ };
534
+ const applyGesture = (gesture, key) => {
358
535
  // A KEY THIS DOCUMENT DOES NOT CARRY IS A SELECTION OF NOTHING, and it has
359
536
  // to be resolved HERE, before the state is written. `select()` is documented
360
537
  // to fire `onSelect` exactly as a click does — and a click can only ever
@@ -374,6 +551,7 @@ export function mountViewer(container, input, options = {}) {
374
551
  // arm a connector click resolved to `null`, so the host was told a
375
552
  // selection ENDED by the one gesture that was starting one.
376
553
  const resolved = key !== null && stillDrawn(key) ? key : null;
554
+ const selected = selectionAfter(gesture);
377
555
  // FOCUS FOLLOWS AN ISSUE, NEVER A DECORATION IDENTITY. `navigable` lists
378
556
  // issues, and `navigate` resolves a key it cannot find to -1 and throws the
379
557
  // reader back to the top of the order — which is why `onKeyDown` already
@@ -397,7 +575,8 @@ export function mountViewer(container, input, options = {}) {
397
575
  (currentScene?.navigable.includes(station) ?? false)
398
576
  ? resolved
399
577
  : null;
400
- state = { ...state, selected: resolved, focused: focusable ?? state.focused };
578
+ state = { ...state, selected, focused: focusable ?? state.focused };
579
+ selectedAsGiven = selected;
401
580
  // SILENCED, because this function reports the result itself once the draw
402
581
  // has settled it. Letting the draw announce too would fire `onSelect` twice
403
582
  // for one selection whenever reconciliation renamed it — and a caller
@@ -434,7 +613,10 @@ export function mountViewer(container, input, options = {}) {
434
613
  // would tell the host a key the handle does not hold, which is the very
435
614
  // disagreement between the two notifications this function was written to
436
615
  // end. `select()` stays equivalent to the click it documents itself as.
437
- currentOptions.onSelect?.(state.selected);
616
+ // FORCED, because `onSelect` has always reported every click, `Enter` and
617
+ // `select()`, even of what is already selected; `onSelectionChange` still
618
+ // fires only on a change.
619
+ announce(true);
438
620
  };
439
621
  const onClick = (event) => {
440
622
  // AN ACTIVATION ON A CONTROL THAT ACTIVATES ITSELF IS THAT CONTROL'S — the
@@ -458,10 +640,22 @@ export function mountViewer(container, input, options = {}) {
458
640
  }
459
641
  if (ownsItsOwnActivation(event.target, container))
460
642
  return;
643
+ // A CLICK ON NOTHING KEYED CLEARS A SELECTION ON THE GRAPH ONLY, exactly as
644
+ // `select(null)` does, so a reader can restore a receded graph by clicking
645
+ // blank space. The list and the tree ignore such a click as they always
646
+ // did. With nothing selected there is nothing to clear, so it neither
647
+ // redraws nor tells the host.
648
+ // A MODIFIER CLICK ON BLANK SPACE KEEPS THE SET: the reader was building
649
+ // one and missed, which is not a request to throw it away.
461
650
  const key = keyAt(event.target, container);
462
- if (key === null)
651
+ const modified = event.shiftKey === true || event.metaKey === true || event.ctrlKey === true;
652
+ const clearsSelection = projection === 'graph' && state.selected !== null && !modified;
653
+ if (key === null) {
654
+ if (clearsSelection)
655
+ emitSelect(null);
463
656
  return;
464
- emitSelect(key);
657
+ }
658
+ applyGesture(gestureFor(key, event), key);
465
659
  };
466
660
  const onPointerOver = (event) => {
467
661
  const key = keyAt(event.target, container);
@@ -499,7 +693,7 @@ export function mountViewer(container, input, options = {}) {
499
693
  if (standingOn !== null && standingOn !== state.focused && currentScene.navigable.includes(standingOn)) {
500
694
  state = { ...state, focused: standingOn };
501
695
  }
502
- const result = navigate(currentScene, state, event.key);
696
+ const result = navigate(currentScene, state, event.key, { shift: event.shiftKey === true });
503
697
  if (result.command.kind === 'none')
504
698
  return;
505
699
  event.preventDefault?.();
@@ -507,6 +701,21 @@ export function mountViewer(container, input, options = {}) {
507
701
  emitSelect(result.command.key);
508
702
  return;
509
703
  }
704
+ // SHIFT WITH AN ARROW IS A SHIFT-CLICK ON THE NEWLY FOCUSED ISSUE.
705
+ if (result.command.kind === 'extend') {
706
+ state = result.state;
707
+ applyGesture({ kind: 'range', key: result.command.key }, result.command.key);
708
+ return;
709
+ }
710
+ if (result.command.kind === 'clear') {
711
+ applyGesture({ kind: 'clear' }, null);
712
+ // THE REDRAW DESTROYED THE ROW HOLDING FOCUS, and a clear names no subject
713
+ // for `applyGesture` to refocus, so the tab stop the reader kept is
714
+ // focused again — this is the viewer's own key press, not a host update.
715
+ if (state.focused !== null)
716
+ keyed.get(state.focused)?.focus?.();
717
+ return;
718
+ }
510
719
  // A COMMAND IS THE HOST'S TO COMPLETE, exactly like the header's own
511
720
  // buttons: this package cannot switch its own projection or resize its own
512
721
  // column. It travels on the same channel a click on those buttons does, so
@@ -553,8 +762,9 @@ export function mountViewer(container, input, options = {}) {
553
762
  // or a NOW row, and neither carries a focus key — so `keyed` missed them
554
763
  // and the scroll this promises never happened for the subjects the two
555
764
  // views place furthest apart.
556
- if (state.selected !== null) {
557
- drawn.get(state.selected)?.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });
765
+ const subject = selectedKeysOf(state.selected).at(-1);
766
+ if (subject !== undefined) {
767
+ drawn.get(subject)?.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });
558
768
  }
559
769
  },
560
770
  select(key) {
package/dist/mount.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mount.js","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAgD,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,EAAsD,WAAW,EAAE,MAAM,cAAc,CAAC;AAC/F,OAAO,EAEL,sBAAsB,EACtB,QAAQ,EACR,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAsB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,aAAa,EAA+B,MAAM,YAAY,CAAC;AACzF,OAAO,EAAc,YAAY,EAAE,MAAM,YAAY,CAAC;AAuDtD;;;;;;;GAOG;AACH,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IACxD,GAAG;IACH,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,UAAU;CACX,CAAC,CAAC;AAEH,SAAS,oBAAoB,CAC3B,MAAuC,EACvC,SAAuB;IAEvB,IAAI,MAAM,GAAwB,MAAM,IAAI,IAAI,CAAC;IACjD,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,IAAI,GAAG,KAAK,SAAS,IAAI,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAClF,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH;;;;;;;;GAQG;AACH,SAAS,SAAS,CAChB,MAAuC,EACvC,SAAuB;IAEvB,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,KAAK,CACZ,MAAuC,EACvC,SAAuB;AACvB,yEAAyE;AACzE,6EAA6E;AAC7E,8EAA8E;AAC9E,kCAAkC;AAClC,aAAgC,CAAC,aAAa,EAAE,eAAe,CAAC;IAEhE,IAAI,MAAM,GAAwB,MAAM,IAAI,IAAI,CAAC;IACjD,OAAO,MAAM,KAAK,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE;gBAAE,OAAO,GAAG,CAAC;QAC7C,CAAC;QACD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACtC,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,SAAuB,EACvB,KAAqB,EACrB,UAAwB,EAAE;IAE1B,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC;IACpC,IAAI,cAAc,GAAiB,OAAO,CAAC;IAC3C,IAAI,UAAU,GAAe,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC;IAC5D,IAAI,UAAU,GAAuB,iBAAiB,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;IACvE,oEAAoE;IACpE,8EAA8E;IAC9E,2EAA2E;IAC3E,2EAA2E;IAC3E,gDAAgD;IAChD,IAAI,KAAK,GAAoB;QAC3B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,sBAAsB,CAAC,OAAO;QAC1D,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,sBAAsB,CAAC,QAAQ;KAC9D,CAAC;IACF,IAAI,IAAI,GAAuB,IAAI,CAAC;IACpC,IAAI,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC3C,8EAA8E;IAC9E,4EAA4E;IAC5E,4EAA4E;IAC5E,8EAA8E;IAC9E,4EAA4E;IAC5E,2CAA2C;IAC3C,IAAI,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC;;;;;;;;;;;;OAYG;IACH,IAAI,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC3C;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,cAAc,GAAG,CAAC,GAAW,EAAW,EAAE,CAC9C,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;IACxF;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,MAAM,UAAU,GAAG,CAAC,GAAW,EAAW,EAAE,CAC1C,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzE,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,4EAA4E;IAC5E,IAAI,YAAY,GAAiB,IAAI,CAAC;IAEtC,MAAM,KAAK,GAAU,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEjD,+EAA+E;IAC/E,4EAA4E;IAC5E,6EAA6E;IAC7E,yEAAyE;IACzE,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAC7B,OAAO,GAAG,IAAI,CAAC;QACf,cAAc,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,4EAA4E;IAC5E,6EAA6E;IAC7E,6EAA6E;IAC7E,iCAAiC;IACjC,MAAM,IAAI,GAAG,CAAC,iBAAiB,GAAG,IAAI,EAAQ,EAAE;QAC9C,2EAA2E;QAC3E,0EAA0E;QAC1E,yEAAyE;QACzE,yEAAyE;QACzE,wEAAwE;QACxE,uEAAuE;QACvE,8DAA8D;QAC9D,wEAAwE;QACxE,4EAA4E;QAC5E,wEAAwE;QACxE,2EAA2E;QAC3E,qEAAqE;QACrE,2EAA2E;QAC3E,4EAA4E;QAC5E,6DAA6D;QAC7D,0EAA0E;QAC1E,mCAAmC;QACnC,0EAA0E;QAC1E,kEAAkE;QAClE,2EAA2E;QAC3E,4EAA4E;QAC5E,4EAA4E;QAC5E,4EAA4E;QAC5E,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC;QACtC,yEAAyE;QACzE,4EAA4E;QAC5E,0EAA0E;QAC1E,0EAA0E;QAC1E,0EAA0E;QAC1E,+DAA+D;QAC/D,EAAE;QACF,4EAA4E;QAC5E,wEAAwE;QACxE,2EAA2E;QAC3E,yEAAyE;QACzE,wEAAwE;QACxE,0EAA0E;QAC1E,0EAA0E;QAC1E,oBAAoB;QACpB,IAAI,YAAY,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpF,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;QACD,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE;YAC7C,GAAG,cAAc;YACjB,wEAAwE;YACxE,oEAAoE;YACpE,wEAAwE;YACxE,wEAAwE;YACxE,6EAA6E;YAC7E,YAAY,EAAE,KAAK;YACnB,KAAK,EAAE,cAAc,CAAC,KAAK,IAAI,KAAK;YACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QACH,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;QACvC,6EAA6E;QAC7E,oEAAoE;QACpE,6EAA6E;QAC7E,4EAA4E;QAC5E,2EAA2E;QAC3E,0EAA0E;QAC1E,qDAAqD;QACrD,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9B,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;QACvC,4EAA4E;QAC5E,2EAA2E;QAC3E,kEAAkE;QAClE,yEAAyE;QACzE,wEAAwE;QACxE,2EAA2E;QAC3E,2EAA2E;QAC3E,4EAA4E;QAC5E,0EAA0E;QAC1E,yEAAyE;QACzE,2EAA2E;QAC3E,6EAA6E;QAC7E,0EAA0E;QAC1E,yEAAyE;QACzE,2EAA2E;QAC3E,6EAA6E;QAC7E,0BAA0B;QAC1B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QACxC,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE;YAClC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;gBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,CAAC;gBACxC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;oBAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC;oBACtC,MAAM,QAAQ,GACZ,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC;oBAC7F,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;wBAC7D,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;wBACrB,IAAI,QAAQ;4BAAE,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACvC,CAAC;oBACD,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;wBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC5C,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,CAAC;gBAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;oBAC9C,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;wBAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QACH,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,YAAY,GAAG,KAAK,CAAC;QACrB,0EAA0E;QAC1E,qEAAqE;QACrE,2EAA2E;QAC3E,qEAAqE;QACrE,gEAAgE;QAChE,2DAA2D;QAC3D,2EAA2E;QAC3E,yEAAyE;QACzE,gDAAgD;QAChD,6EAA6E;QAC7E,4EAA4E;QAC5E,wEAAwE;QACxE,yEAAyE;QACzE,6EAA6E;QAC7E,wDAAwD;QACxD,8EAA8E;QAC9E,2EAA2E;QAC3E,wEAAwE;QACxE,yEAAyE;QACzE,2EAA2E;QAC3E,gEAAgE;QAChE,4EAA4E;QAC5E,yEAAyE;QACzE,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,UAAU,EAAE,CAAC;QAC9D,0EAA0E;QAC1E,2EAA2E;QAC3E,2EAA2E;QAC3E,2EAA2E;QAC3E,2EAA2E;QAC3E,4EAA4E;QAC5E,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;QACD,6EAA6E;QAC7E,yEAAyE;QACzE,0EAA0E;QAC1E,6EAA6E;QAC7E,0DAA0D;QAC1D,IAAI,iBAAiB,IAAI,KAAK,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;YAC3D,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,GAAkB,EAAQ,EAAE;QAC9C,2EAA2E;QAC3E,6EAA6E;QAC7E,yEAAyE;QACzE,sEAAsE;QACtE,qEAAqE;QACrE,4BAA4B;QAC5B,yEAAyE;QACzE,wEAAwE;QACxE,6EAA6E;QAC7E,uEAAuE;QACvE,0EAA0E;QAC1E,2EAA2E;QAC3E,wBAAwB;QACxB,4EAA4E;QAC5E,wEAAwE;QACxE,2EAA2E;QAC3E,mEAAmE;QACnE,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9D,yEAAyE;QACzE,4EAA4E;QAC5E,yEAAyE;QACzE,0EAA0E;QAC1E,yEAAyE;QACzE,2CAA2C;QAC3C,yEAAyE;QACzE,2EAA2E;QAC3E,uEAAuE;QACvE,yEAAyE;QACzE,wEAAwE;QACxE,2EAA2E;QAC3E,2EAA2E;QAC3E,yEAAyE;QACzE,yEAAyE;QACzE,uEAAuE;QACvE,MAAM,OAAO,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC;QAC/F,MAAM,SAAS,GACb,QAAQ,KAAK,IAAI;YACjB,OAAO,KAAK,IAAI;YAChB,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC9B,CAAC,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;YAClD,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,IAAI,CAAC;QACX,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC9E,0EAA0E;QAC1E,4EAA4E;QAC5E,sEAAsE;QACtE,wDAAwD;QACxD,IAAI,CAAC,KAAK,CAAC,CAAC;QACZ,yEAAyE;QACzE,2EAA2E;QAC3E,0EAA0E;QAC1E,0EAA0E;QAC1E,oEAAoE;QACpE,yEAAyE;QACzE,4EAA4E;QAC5E,yEAAyE;QACzE,4EAA4E;QAC5E,4EAA4E;QAC5E,yEAAyE;QACzE,0CAA0C;QAC1C,yEAAyE;QACzE,uEAAuE;QACvE,2EAA2E;QAC3E,8CAA8C;QAC9C,0EAA0E;QAC1E,wEAAwE;QACxE,0EAA0E;QAC1E,qEAAqE;QACrE,yEAAyE;QACzE,wEAAwE;QACxE,mDAAmD;QACnD,IAAI,SAAS,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACtF,6EAA6E;QAC7E,yEAAyE;QACzE,2EAA2E;QAC3E,wEAAwE;QACxE,0EAA0E;QAC1E,wEAAwE;QACxE,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,KAAiB,EAAQ,EAAE;QAC1C,2EAA2E;QAC3E,2EAA2E;QAC3E,4EAA4E;QAC5E,4EAA4E;QAC5E,6EAA6E;QAC7E,+BAA+B;QAC/B,2EAA2E;QAC3E,yEAAyE;QACzE,uDAAuD;QACvD,yEAAyE;QACzE,0EAA0E;QAC1E,2EAA2E;QAC3E,0EAA0E;QAC1E,0EAA0E;QAC1E,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACnD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,cAAc,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;YAAE,OAAO;QAC1D,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO;QACzB,UAAU,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,KAAiB,EAAQ,EAAE;QAChD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,OAAO;YAAE,OAAO;QAC5B,OAAO,GAAG,GAAG,CAAC;QACd,cAAc,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAS,EAAE;QAChC,UAAU,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAQ,EAAE;QAC5C,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI;YAAE,OAAO;QAC7D,0EAA0E;QAC1E,4EAA4E;QAC5E,sBAAsB;QACtB,IACE,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;YAC5C,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,EAC7C,CAAC;YACD,OAAO;QACT,CAAC;QACD,6EAA6E;QAC7E,2EAA2E;QAC3E,2EAA2E;QAC3E,2EAA2E;QAC3E,2DAA2D;QAC3D,4EAA4E;QAC5E,6EAA6E;QAC7E,2EAA2E;QAC3E,6EAA6E;QAC7E,4CAA4C;QAC5C,4EAA4E;QAC5E,yEAAyE;QACzE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;QACnE,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,KAAK,CAAC,OAAO,IAAI,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACvG,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QAC5C,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO;QAC3C,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,qEAAqE;QACrE,2EAA2E;QAC3E,2EAA2E;QAC3E,2CAA2C;QAC3C,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,cAAc,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QACD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACrB,IAAI,EAAE,CAAC;QACP,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;IAC3C,CAAC,CAAC;IAEF,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,SAAS,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACzD,SAAS,CAAC,gBAAgB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAC3D,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEjD,IAAI,EAAE,CAAC;IAEP,OAAO;QACL,MAAM,CAAC,IAAoB,EAAE,WAA0B;YACrD,IAAI,SAAS;gBAAE,OAAO;YACtB,IAAI,WAAW,KAAK,SAAS;gBAAE,cAAc,GAAG,WAAW,CAAC;YAC5D,IAAI,WAAW,EAAE,UAAU,KAAK,SAAS;gBAAE,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;YAC/E,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;YAC9C,IAAI,EAAE,CAAC;QACT,CAAC;QACD,aAAa,CAAC,IAAgB;YAC5B,IAAI,SAAS;gBAAE,OAAO;YACtB,IAAI,IAAI,KAAK,UAAU;gBAAE,OAAO;YAChC,UAAU,GAAG,IAAI,CAAC;YAClB,IAAI,EAAE,CAAC;YACP,sEAAsE;YACtE,sEAAsE;YACtE,uEAAuE;YACvE,0EAA0E;YAC1E,qEAAqE;YACrE,uEAAuE;YACvE,0EAA0E;YAC1E,wEAAwE;YACxE,yEAAyE;YACzE,uEAAuE;YACvE,8BAA8B;YAC9B,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC5B,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;QACD,MAAM,CAAC,GAAkB;YACvB,IAAI,SAAS;gBAAE,OAAO;YACtB,UAAU,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,KAAK;YACP,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO;YACL,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,0EAA0E;YAC1E,qEAAqE;YACrE,uEAAuE;YACvE,qEAAqE;YACrE,UAAU,EAAE,CAAC;YACb,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChD,SAAS,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAC5D,SAAS,CAAC,mBAAmB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;YAC9D,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACpD,IAAI,IAAI,KAAK,IAAI;gBAAE,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,GAAG,IAAI,CAAC;YACZ,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;YACvC,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mount.js","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"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"}
@@ -14,11 +14,20 @@
14
14
  * a coordinate.
15
15
  */
16
16
  import { type Scene } from './scene.ts';
17
+ import type { StoredSelection } from './selection.ts';
17
18
  export interface NavigationState {
18
19
  /** The roving tab stop. `null` before anything has been focused. */
19
20
  readonly focused: string | null;
20
- /** The selected key, which survives a projection change. */
21
- readonly selected: string | null;
21
+ /**
22
+ * The selection, which survives a projection change: one issue or one
23
+ * relationship as a string, or a set of issues in the order they were added
24
+ * — see `StoredSelection`.
25
+ */
26
+ readonly selected: StoredSelection;
27
+ }
28
+ /** The modifier keys `navigate` reads. */
29
+ export interface NavigationModifiers {
30
+ readonly shift?: boolean | undefined;
22
31
  }
23
32
  /** What the shell should do. `none` means the host keeps its own shortcut. */
24
33
  export type NavigationCommand = {
@@ -30,6 +39,20 @@ export type NavigationCommand = {
30
39
  readonly kind: 'select';
31
40
  readonly key: string;
32
41
  }
42
+ /**
43
+ * Shift with an arrow: focus moved to `key`, and the shell extends the
44
+ * selection to it as a Shift-click on it would — a range in rank order.
45
+ * `navigate` cannot build the set itself: the range rule needs the set as
46
+ * the reader made it, which only the shell holds.
47
+ */
48
+ | {
49
+ readonly kind: 'extend';
50
+ readonly key: string;
51
+ }
52
+ /** Escape with something selected: the shell clears the selection. */
53
+ | {
54
+ readonly kind: 'clear';
55
+ }
33
56
  /**
34
57
  * A command the SHELL cannot complete on its own.
35
58
  *
@@ -66,5 +89,5 @@ export declare function reconcile(scene: Scene, state: NavigationState): Navigat
66
89
  * boundary. An unhandled key returns the state untouched and `none`, so a host
67
90
  * keeps every shortcut this package does not claim.
68
91
  */
69
- export declare function navigate(scene: Scene, state: NavigationState, key: string): NavigationResult;
92
+ export declare function navigate(scene: Scene, state: NavigationState, key: string, modifiers?: NavigationModifiers): NavigationResult;
70
93
  //# sourceMappingURL=navigation.d.ts.map